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

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.
Files changed (53) hide show
  1. package/assets/lang/cs.json +169 -25
  2. package/assets/lang/de.json +169 -25
  3. package/assets/method/core.md +24 -0
  4. package/assets/method/locate.md +3 -2
  5. package/assets/method/reading.md +8 -0
  6. package/assets/method/request.md +12 -3
  7. package/assets/method/waiting.md +66 -0
  8. package/dist/agents/files.js +55 -8
  9. package/dist/brief/brief.js +26 -3
  10. package/dist/brief/sheet.js +3 -1
  11. package/dist/cli/format.js +4 -0
  12. package/dist/cli/human.js +28 -3
  13. package/dist/cli/menu-archives.js +93 -82
  14. package/dist/cli/menu-links.js +90 -1
  15. package/dist/cli/menu-research.js +1 -1
  16. package/dist/cli/menu-settings.js +4 -2
  17. package/dist/cli/menu-waiting.js +487 -112
  18. package/dist/cli/menu.js +6 -8
  19. package/dist/cli/ui.js +158 -21
  20. package/dist/commands/archives.js +80 -18
  21. package/dist/commands/connectors.js +140 -19
  22. package/dist/commands/guide.js +8 -2
  23. package/dist/commands/intake.js +45 -11
  24. package/dist/commands/links.js +11 -0
  25. package/dist/commands/media.js +20 -3
  26. package/dist/commands/meta.js +15 -1
  27. package/dist/commands/read.js +6 -3
  28. package/dist/commands/readings.js +25 -5
  29. package/dist/commands/session.js +18 -1
  30. package/dist/commands/setup.js +2 -2
  31. package/dist/commands/start.js +37 -5
  32. package/dist/commands/tasks.js +199 -13
  33. package/dist/core/archivewait.js +9 -4
  34. package/dist/core/changelog.js +7 -0
  35. package/dist/core/config.js +3 -3
  36. package/dist/core/conflicts.js +1 -1
  37. package/dist/core/impersonal.js +69 -0
  38. package/dist/core/links.js +6 -2
  39. package/dist/core/live.js +191 -146
  40. package/dist/core/media.js +2 -0
  41. package/dist/core/model.js +2 -0
  42. package/dist/core/net.js +6 -9
  43. package/dist/core/originals.js +5 -5
  44. package/dist/core/phrases.js +9 -2
  45. package/dist/core/reader.js +19 -2
  46. package/dist/core/schema.js +4 -1
  47. package/dist/core/stromapp.js +2 -1
  48. package/dist/core/taskfiles.js +64 -0
  49. package/dist/core/terms.js +57 -9
  50. package/dist/core/tree.js +1 -1
  51. package/dist/core/waiting.js +350 -0
  52. package/dist/core/waitkind.js +276 -0
  53. package/package.json +1 -1
@@ -111,6 +111,8 @@
111
111
  "ui.chat.open": "Das Gespräch mit dem Agenten ({agent}) wird geöffnet. Zum Beenden {exit} tippen.",
112
112
  "ui.chat.first": "Hallo, ich möchte meine Vorfahren erforschen. Starte `strom`, erkläre mir in ein paar Sätzen, wie wir zusammenarbeiten, und frag mich, wen wir suchen und was wir schon wissen.",
113
113
  "ui.chat.continue": "Lass uns die Forschung fortsetzen. Starte `strom`, sag mir kurz, wo die Forschung steht und was auf mich wartet, und schlag vor, wie es weitergeht.",
114
+ "ui.chat.task.say": "Nehmen wir uns die Aufgabe {task} vor: {what} Sie wartet auf: {on} ({group}). Führe `strom task show {task}` und `strom guide waiting` aus und führe mich Schritt für Schritt hindurch.",
115
+ "ui.chat.task.more.say": "Dazu noch die anderen Aufgaben, die an derselben Stelle warten: {tasks} – führe `strom task show` auch für jede davon aus.",
114
116
  "ui.setup.welcome": "Willkommen bei Strom Ahnenforschung. Ein paar Dinge werden eingerichtet – passt die vorgeschlagene Antwort, genügt Enter.",
115
117
  "ui.setup.again": "Einstellungen – Enter behält den aktuellen Wert.",
116
118
  "ui.setup.lang": "Sprache (de, en, cs, pl, …)",
@@ -219,7 +221,6 @@
219
221
  "ui.tune.q.c.keep": "Behalten",
220
222
  "ui.o.tune": "Fragen zum Lesen warten auf die Entscheidung eines Menschen ({n}): strom media calibrate --questions",
221
223
  "ui.waiting.tune": "Eine Frage zum Lesen der Scans: {text}",
222
- "ui.waiting.tune.read": "{k} entscheiden: Lesen der Scans",
223
224
  "ui.tune.title": "Lesen der Scans · {agent} · {days} Tage seit {since} — aus den eigenen Aufzeichnungen der Forschung, kostenlos",
224
225
  "ui.tune.none": "Lesen der Scans · {agent}: noch nichts gemessen — die Zahlen kommen aus den Sitzungen von strom run und den Lesern von strom read.",
225
226
  "ui.tune.noscans": "Lesen der Scans · {agent}: hier noch keine Scans gelesen (Sitzungen {sessions}).",
@@ -433,6 +434,85 @@
433
434
  "ui.wait.save": "in {dir} speichern",
434
435
  "ui.wait.how1": "Scans kommen in den Eingang (inbox), ein Ordner pro Buch, jeder benannt nach der Bildnummer, wie der Viewer sie zählt",
435
436
  "ui.wait.how2": "(9.jpg; ein vergrößerter Ausschnitt: 9a.jpg) – der nächste Lauf registriert sie und die Aufgabe kehrt von selbst zurück",
437
+ "ui.wait.todo.n": "zu erledigen {n}",
438
+ "ui.wait.sent.n": "wartet auf Antwort {n}",
439
+ "ui.wait.sent.title": "Wartet auf Antwort",
440
+ "ui.wait.filter": "Filter: {section}",
441
+ "ui.wait.none.todo": "Jetzt ist nichts zu erledigen.",
442
+ "ui.wait.sec.decide": "Entscheidungen",
443
+ "ui.wait.sec.images": "Bilder",
444
+ "ui.wait.sec.letter": "Archive und Ämter",
445
+ "ui.wait.sec.family": "Familie",
446
+ "ui.wait.sec.web": "Web",
447
+ "ui.wait.sec.other": "Sonstiges",
448
+ "ui.wait.key.decide": "e",
449
+ "ui.wait.key.images": "b",
450
+ "ui.wait.key.letter": "m",
451
+ "ui.wait.key.family": "f",
452
+ "ui.wait.key.web": "w",
453
+ "ui.wait.key.other": "s",
454
+ "ui.wait.key.next": "n",
455
+ "ui.wait.key.prev": "v",
456
+ "ui.wait.key.all": "a",
457
+ "ui.wait.kind.images": "Bilder",
458
+ "ui.wait.kind.letter": "Brief",
459
+ "ui.wait.kind.family": "Familie",
460
+ "ui.wait.kind.web": "Web",
461
+ "ui.wait.kind.check": "Seite prüfen",
462
+ "ui.wait.kind.permission": "Erlaubnis eines Archivs",
463
+ "ui.wait.kind.takeover": "Downloader bestätigen",
464
+ "ui.wait.kind.milder": "mildere Bedingungen",
465
+ "ui.wait.kind.story": "Erzählung",
466
+ "ui.wait.kind.send": "aus der Strom-App",
467
+ "ui.wait.kind.tune": "Lesen der Scans",
468
+ "ui.wait.kind.other": "Sonstiges",
469
+ "ui.wait.letter.todo": "ein Brief zu senden",
470
+ "ui.wait.family.todo": "eine Nachricht zu senden",
471
+ "ui.wait.ago.today": "heute",
472
+ "ui.wait.ago.one": "vor 1 Tag",
473
+ "ui.wait.ago": "vor {n} Tagen",
474
+ "ui.wait.sentline": "gesendet {day} · {ago}",
475
+ "ui.wait.noreply": "seit über {days} Tagen keine Antwort",
476
+ "ui.wait.c.page": "Seite {page}/{pages}",
477
+ "ui.wait.c.shown": "{from}–{to} von {n}",
478
+ "ui.wait.c.number": "Nummer = Gruppe",
479
+ "ui.wait.c.next": "{key} nächste",
480
+ "ui.wait.c.prev": "{key} vorige",
481
+ "ui.wait.c.all": "{key} alle",
482
+ "ui.wait.c.filter": "{keys} Filter",
483
+ "ui.wait.c.sent": "? wartet auf Antwort",
484
+ "ui.wait.c.todo": "? zu erledigen",
485
+ "ui.wait.c.back": "0 zurück",
486
+ "ui.wait.c.unfilter": "0 Filter aufheben",
487
+ "ui.wait.group.text": "Der Text aller Anfragen auf einmal",
488
+ "ui.wait.group.sent": "Für die ganze Gruppe gesendet",
489
+ "ui.wait.group.sent.list": "Anfragen, die als gesendet eingetragen werden ({place}):",
490
+ "ui.wait.group.sent.sure": "Als gesendet eintragen? Die Aufgaben warten weiter auf die Antwort.",
491
+ "ui.wait.group.sent.done": "✓ Als gesendet eingetragen: {ids} – die Aufgaben warten weiter auf die Antwort.",
492
+ "ui.wait.group.chat": "Ein Gespräch mit dem Agenten über die ganze Gruppe",
493
+ "ui.wait.prio": "Priorität {n}",
494
+ "ui.wait.since": "seit {day}",
495
+ "ui.wait.text.none": "Hier ist kein Text einer Anfrage gespeichert.",
496
+ "ui.wait.text.head": "Der Text der Anfrage zum Kopieren ({files}):",
497
+ "ui.wait.d.on": "Wartet auf: {on}",
498
+ "ui.wait.d.to": "An: {to}",
499
+ "ui.wait.d.place": "Wo: {place}",
500
+ "ui.wait.d.since": "Wartet seit {day}",
501
+ "ui.wait.url": "Der Link: {url}",
502
+ "ui.wait.a.answer": "Mit Text antworten",
503
+ "ui.wait.a.file": "Eine Datei hinzufügen",
504
+ "ui.wait.a.archive": "Das Archiv öffnen",
505
+ "ui.wait.a.folder": "Den Ordner öffnen ({have}/{want} gespeichert)",
506
+ "ui.wait.a.cannot": "Es geht nicht – schreiben, warum",
507
+ "ui.wait.cannot.write": "Was nicht geht, kurz (Enter oder 0 geht zurück)",
508
+ "ui.wait.a.unsent": "Zurück zu dem, was zu erledigen ist",
509
+ "ui.wait.unsent.done": "✓ Wieder bei dem, was zu erledigen ist.",
510
+ "ui.wait.a.note": "Der Text der Anfrage",
511
+ "ui.wait.a.sent": "Gesendet",
512
+ "ui.wait.a.web": "Die Seite öffnen",
513
+ "ui.wait.a.link": "Den Link öffnen",
514
+ "ui.wait.a.chat": "Ein Gespräch mit dem Agenten",
515
+ "ui.wait.sent.sure": "Die Anfrage als gesendet eintragen{to}? Die Aufgabe wartet weiter auf die Antwort.",
436
516
  "ui.run.summary": "Sitzungen: {n} · Ende: {reason}",
437
517
  "ui.run.stop.done": "fertig",
438
518
  "ui.run.stop.user": "von Hand angehalten",
@@ -584,8 +664,6 @@
584
664
  "sync.verify.done": "jeder Eintrag gefunden und unabhängig gelesen (Bild registriert, strom read M… --blind): die Lesungen stimmen überein → Notiz an der Quelle, die Angaben bleiben; sie weichen ab → ein Widerspruch mit beiden Lesungen",
585
665
  "sync.reading.note": "Der Benutzer hat diesen Eintrag in der Strom-App anders gelesen ({source}); die Lesung der Forschung gilt, bis er erneut gelesen ist:",
586
666
  "sync.reading.page": "Seite",
587
- "conflict.app.decided": "Entscheidung des Nutzers in der Strom-App",
588
- "conflict.app.noted": "{decided}: {note}",
589
667
  "sync.reading.text": "Abschrift",
590
668
  "archive.held": "zurückgestellt: die Forschung ist ein Archiv (die Daten kommen aus der Strom-App); zurück in der Warteschlange, wenn die Arbeit mit einem Agenten eingeschaltet wird",
591
669
  "archive.removed": "in der Strom-App entfernt",
@@ -723,7 +801,7 @@
723
801
  "ui.web.ask": "Bereits {n} Anfragen an {host} in dieser Sitzung. Schonender für weitere Seiten oder Einträge dieses Servers: gleich einen Connector dafür bauen (strom connector new {name} --url {url}), der Tempo, robots.txt und Bedingungen des Servers einhält. Trotzdem noch eine zulassen?",
724
802
  "ui.web.ask.have": "Bereits {n} Anfragen an {host} in dieser Sitzung. Mehr Seiten oder Einträge dieses Servers gehen schonender über seinen Connector {connector}, der schon da ist und Tempo, robots.txt und Bedingungen des Servers einhält. Trotzdem noch eine zulassen?",
725
803
  "ui.pace.cap": "höchstens {n} pro Stunde",
726
- "ui.pace.nocap": "ohne Stundenlimit",
804
+ "ui.pace.nocap": "ohne Stundenobergrenze",
727
805
  "ui.o.results.offered": "{file} – für die Strom-App, hier nicht installiert; der Nutzer kennt sie schon – erwähne sie erst wieder, wenn er die Ergebnisse sehen will (strom app install, dann strom app)",
728
806
  "ui.o.ask": "Fragen",
729
807
  "ui.o.ask.tell": "sag dem Nutzer einmal, in einem Satz, dass er dich hier nach jedem im Stammbaum fragen kann – strom sagt das nur einmal",
@@ -1322,6 +1400,19 @@
1322
1400
  "ui.link.task.park.done": "✓ Die Aufgabe ist zurückgestellt.",
1323
1401
  "ui.link.task.drop.done": "✓ Die Aufgabe ist aufgegeben (bleibt mit dem Grund erhalten).",
1324
1402
  "ui.link.task.wake.done": "✓ Die Aufgabe ist zurück in der Warteschlange des Agenten.",
1403
+ "ui.link.task.sent.done": "✓ Als gesendet vermerkt – die Aufgabe wartet weiter auf die Antwort.",
1404
+ "ui.link.what.task.chat": "ein Gespräch mit dem Agenten ({agent}) über die Aufgabe: {what}",
1405
+ "ui.link.what.task.chat.more": " – mit {n} weiteren Aufgabe(n), die an derselben Stelle warten",
1406
+ "ui.link.what.task.sent": "die Anfrage einer Aufgabe als gesendet vermerken{to} – die Aufgabe wartet weiter auf die Antwort: {what}",
1407
+ "ui.link.sent.cannot": "Die Aufgabe {task} wartet auf keine Anfrage zum Senden (Brief, Familie, Sonstiges). Es ist nichts geschehen.",
1408
+ "ui.link.sent.already": "Die Aufgabe {task} ist schon als gesendet vermerkt ({day}). Es ist nichts geschehen.",
1409
+ "ui.link.note.none": "Zur Aufgabe {task} ist kein Text der Anfrage gespeichert. Es ist nichts geschehen.",
1410
+ "ui.link.note.opened": "Der Text der Anfrage: {file}",
1411
+ "ui.link.folder.none": "Die Aufgabe {task} wartet auf keine von Hand gespeicherten Bilder. Es ist nichts geschehen.",
1412
+ "ui.link.what.task.file": "eine Datei zur Aufgabe – die Aufgabe geht zurück in die Warteschlange des Agenten: {what}",
1413
+ "ui.link.file.cannot": "Die Aufgabe {task} nimmt jetzt keine Datei (sie wartet auf eine Prüfung einer Website oder eine Entscheidung über ein Archiv). Es ist nichts geschehen.",
1414
+ "ui.link.file.note": "Eine kurze Notiz zur Datei (Enter: keine, 0: zurück)",
1415
+ "ui.link.task.file.done": "✓ Die Datei ist bei der Aufgabe – die Aufgabe ist zurück in der Warteschlange des Agenten.",
1325
1416
  "ui.link.sessions.title": "Sitzungen des Agenten – {name}",
1326
1417
  "ui.link.sessions.none": "Der Agent hat an dieser Forschung noch nicht gearbeitet.",
1327
1418
  "ui.link.sessions.month": "Diesen Monat: {n} Sitzungen, {cost}",
@@ -1540,6 +1631,15 @@
1540
1631
  "log.task.wait": "Wartet: {name}",
1541
1632
  "log.task.wake": "Zurück an den Agenten: {name}",
1542
1633
  "log.task.edit": "Aufgabe geändert: {name}",
1634
+ "log.task.sent": "Anfrage gesendet: {name}",
1635
+ "log.task.unsent": "Anfrage doch nicht gesendet: {name}",
1636
+ "log.task.file": "Datei {inputs} zur Aufgabe eingegangen, zurück an den Agenten: {name}",
1637
+ "wait.group.family": "Familie",
1638
+ "wait.group.other": "Sonstiges",
1639
+ "wait.group.stories": "Geschichten",
1640
+ "wait.group.connectors": "Downloader",
1641
+ "wait.group.app": "Die Strom-App",
1642
+ "wait.group.tune": "Das Lesen der Scans",
1543
1643
  "log.session.start": "Der Agent beginnt: {name}",
1544
1644
  "log.session.close": "Der Agent ist fertig: {name}",
1545
1645
  "log.lesson.add": "Gelernt: {name}",
@@ -1600,16 +1700,12 @@
1600
1700
  "ui.gate.timeout": "keine Antwort innerhalb von {s} s",
1601
1701
  "ui.gate.signal": "durch {signal} beendet",
1602
1702
  "ui.gate.status": "mit Exit-Status {status} beendet",
1603
- "ui.waiting.title": "Der Agent braucht eine Antwort ({n}):",
1604
1703
  "ui.waiting.do": "Was zu tun ist: {what}",
1605
1704
  "ui.waiting.ask": "der Agent sagt es im Gespräch",
1606
1705
  "ui.waiting.images": "Von Hand speichern: Bilder {images} aus {book}",
1607
- "ui.waiting.more": "…und {n} weitere – der Agent geht sie im Gespräch durch.",
1608
- "ui.waiting.pick": "Gefunden? Die Nummer wählen und schreiben, was gefunden wurde:",
1609
- "ui.waiting.answer": "Antwort zu {k}: {what}",
1610
- "ui.waiting.folder": "Den Ordner für die Bilder zu {k} öffnen",
1611
1706
  "ui.waiting.opened": "Der Ordner: {dir} – sobald die Bilder dort sind, übernimmt der Agent sie bei der nächsten Arbeit von selbst.",
1612
1707
  "ui.waiting.write": "Die Antwort – ein Link, die Nummer eines Buchs, was herausgefunden wurde (Enter oder 0 geht zurück)",
1708
+ "ui.waiting.later": "Die Antwort wird bei der Aufgabe gespeichert; der Agent nimmt sie bei der nächsten Arbeit auf.",
1613
1709
  "ui.waiting.check": "Unter dem Link zu prüfen: {ask}",
1614
1710
  "ui.waiting.check.why": "Die Website lässt keine automatischen Werkzeuge zu – nur ein Mensch sieht sie.",
1615
1711
  "ui.waiting.check.pick": "Was ist dort?",
@@ -1619,9 +1715,6 @@
1619
1715
  "ui.waiting.check.note": "Eine Notiz für die Forschung (Enter: keine)",
1620
1716
  "ui.waiting.check.open": "Den Link im Browser öffnen?",
1621
1717
  "ui.task.answer.window": "Zu Aufgabe {task} die Antwort eintragen: „{answer}“?",
1622
- "ui.waiting.back": "✓ Die Aufgabe geht mit der Antwort an den Agenten zurück.",
1623
- "ui.waiting.chat": "Jetzt mit dem Agenten weitermachen?",
1624
- "ui.waiting.say": "Ich habe beantwortet, was du von mir brauchtest: {what} – machen wir weiter.",
1625
1718
  "ui.intake.empty": "Darin ist nichts, was sich hinzufügen ließe.",
1626
1719
  "ui.intake.ours": "{path} ist ein Ordner von strom selbst (der Forschung), keine Unterlagen der Familie.",
1627
1720
  "ui.research.exists": "Diese Forschung gibt es schon: „{name}“ – der Agent arbeitet daran weiter.",
@@ -1700,15 +1793,11 @@
1700
1793
  "ui.story.new.taken": "✓ Die neue Fassung ist jetzt die Erzählung, freigegeben. Wird die Forschung in der Strom-App erneut geöffnet, ist sie da.",
1701
1794
  "ui.story.new.kept": "✓ Die freigegebene Erzählung bleibt; die neue Fassung ist weg (die Geschichte der Forschung bewahrt sie).",
1702
1795
  "ui.waiting.story": "Eine neue Fassung der Erzählung über {who} – die freigegebene bleibt bis zur Entscheidung",
1703
- "ui.waiting.story.read": "Die neue Erzählung über {who} lesen und entscheiden",
1704
- "ui.waiting.title.sent": "Wartet ({n}):",
1705
1796
  "ui.waiting.sent": "Die Strom-App hat den Stammbaum gesendet ({day}, {time}): {n} Änderung(en) zum Übernehmen oder Verwerfen",
1706
- "ui.waiting.sent.read": "Ansehen, was der Stammbaum aus der Strom-App ({k}) bringt, und entscheiden",
1707
1797
  "ui.sent.discard": "Verwerfen: nichts davon wird übernommen",
1708
1798
  "ui.sent.later": "Warten lassen",
1709
1799
  "ui.sent.why": "Warum? Die Strom-App zeigt es an (Enter: ohne Grund, 0: zurück):",
1710
1800
  "ui.sent.discarded.app": "Die Strom-App zeigt die Sendung als verworfen an; die Änderungen bleiben dort und können erneut gesendet werden.",
1711
- "ui.waiting.pick.story": "Nummer wählen:",
1712
1801
  "ui.trees.pack": "„{name}“ einpacken und jemandem schicken (eine ZIP-Datei)",
1713
1802
  "ui.trees.unpack": "ein zugeschickter Stammbaum (eine ZIP-Datei)",
1714
1803
  "ui.pack.which": "Welche Bilder kommen mit?",
@@ -1982,15 +2071,15 @@
1982
2071
  "ui.arg.what-the-family-knows": "was die Familie weiß",
1983
2072
  "ui.error.story.no-source": "{id} gibt es im Stammbaum nicht",
1984
2073
  "ui.error.story.no-source.hint": "der Hintergrund von Ort und Zeit wird zuerst als Quelle erfasst: strom source add … --kind book|newspaper|web",
1985
- "ui.consent.archive.pace": "Tempo für Bilder aus Archiven, deren Bedingungen die Automatisierung einschränken, nach der Erlaubnis „langsam“: mindestens {seconds} s zwischen zwei Bildern, höchstens {n} pro Stunde. So einstellen?",
2074
+ "ui.consent.archive.pace": "Tempo für Bilder aus Archiven, deren Bedingungen die Automatisierung einschränken, nach der Erlaubnis „langsam“: mindestens {seconds} s zwischen zwei Bildern, höchstens {n} Anfragen an das Archiv pro Stunde, den Katalog mitgezählt. So einstellen?",
1986
2075
  "ui.archive.terms.known": "Bedingungen: „{quote}“ ({terms})",
1987
2076
  "ui.archive.terms.connector": "Bedingungen laut Downloader: {quote} ({terms})",
1988
2077
  "ui.archive.terms.none": "Die Bedingungen des Archivs sind noch nicht bekannt (der Downloader ist noch nicht bestätigt).",
1989
2078
  "ui.archive.terms.robots": "Seine robots.txt: „{quote}“ ({terms}) – kein automatischer Zugriff außer über den Browser eines Menschen.",
1990
2079
  "ui.archive.terms.robots.none": "Seine robots.txt erlaubt keinen automatischen Zugriff ({terms}) – nur über den Browser eines Menschen.",
1991
2080
  "ui.archive.name": "{title} ({host})",
1992
- "ui.archive.ask.slow": "Langsames Herunterladen der Bilder erlauben? Höchstens ein Bild alle {seconds} s und höchstens {n} pro Stunde, nur die Bilder, die eine Aufgabe braucht, nichts im Voraus. Ohne Erlaubnis werden die Bilder von Hand in einen vorbereiteten Ordner gespeichert.",
1993
- "ui.archive.ask.browser": "Herunterladen der Bilder über den Browser auf diesem Computer erlauben? Chrome mit der Claude-Erweiterung, das Tempo plant strom (höchstens ein Bild alle {seconds} s, höchstens {n} pro Stunde); eine Prüfung, ob ein Mensch da ist, besteht der Mensch selbst. Ohne Erlaubnis werden die Bilder von Hand gespeichert.",
2081
+ "ui.archive.ask.slow": "Langsames Herunterladen der Bilder erlauben? Höchstens ein Bild alle {seconds} s und {cap}, nur die Bilder, die eine Aufgabe braucht, nichts im Voraus. Ohne Erlaubnis werden die Bilder von Hand in einen vorbereiteten Ordner gespeichert.",
2082
+ "ui.archive.ask.browser": "Herunterladen der Bilder über den Browser auf diesem Computer erlauben? Chrome mit der Claude-Erweiterung, das Tempo plant strom (höchstens ein Bild alle {seconds} s, {cap}); eine Prüfung, ob ein Mensch da ist, besteht der Mensch selbst. Ohne Erlaubnis werden die Bilder von Hand gespeichert.",
1994
2083
  "ui.archive.ask.change": "Gilt für dieses Archiv auf diesem Computer; jederzeit zu ändern: strom allow archive {host}.",
1995
2084
  "ui.archive.btn.slow": "Langsam erlauben",
1996
2085
  "ui.archive.btn.browser": "Über den Browser erlauben",
@@ -2006,7 +2095,9 @@
2006
2095
  "ui.archive.window.browser": "Über den Browser herunterladen, ein Bild alle {seconds} s, nur was eine Aufgabe braucht?",
2007
2096
  "ui.archive.window.change": "Ändern: Einstellungen → Archive.",
2008
2097
  "ui.archive.choose": "{title} – wie sollen die Bilder kommen?",
2009
- "ui.archive.way.slow": "Langsam, im Tempo eines Menschen (höchstens ein Bild alle {seconds} s, höchstens {n} pro Stunde, nur was eine Aufgabe braucht)",
2098
+ "ui.archive.way.slow": "Langsam, im Tempo eines Menschen (höchstens ein Bild alle {seconds} s, {cap}, nur was eine Aufgabe braucht)",
2099
+ "ui.archive.cap": "höchstens {n} Anfragen an das Archiv pro Stunde, den Katalog mitgezählt",
2100
+ "ui.archive.cap.short": "höchstens {n} Anfragen pro Stunde, den Katalog mitgezählt",
2010
2101
  "ui.archive.way.browser": "Über den Browser auf diesem Computer (Chrome mit der Claude-Erweiterung; das Tempo plant strom)",
2011
2102
  "ui.archive.way.manual": "Nur von Hand – die Bilder werden in einen vorbereiteten Ordner gespeichert",
2012
2103
  "ui.archive.way.later": "Später – nichts ändert sich",
@@ -2021,9 +2112,7 @@
2021
2112
  "ui.archive.item": "Bilder aus dem Archiv {title} ({host}) herunterladen",
2022
2113
  "ui.archive.item.tasks": "Darauf warten die Aufgaben: {ids}",
2023
2114
  "ui.archive.item.since": "Wartet seit {date} · Download-Versuche: {tries}",
2024
- "ui.archive.item.read": "Entscheiden {k}: Bilder aus {title}",
2025
2115
  "ui.archive.takeover.item": "Die Stufen der aus der früheren Version übernommenen Downloader bestätigen ({n}): {names}",
2026
- "ui.archive.takeover.read": "Bestätigen oder durchgehen {k}: die übernommenen Downloader",
2027
2116
  "ui.archive.takeover.about": "Bis zur Bestätigung laden sie wie bisher. Jeder so, wie sein Downloader die Bedingungen des Archivs liest:",
2028
2117
  "ui.archive.takeover.line": "{title} ({hosts}): {level}",
2029
2118
  "ui.archive.takeover.all": "Alle bestätigen",
@@ -2035,7 +2124,6 @@
2035
2124
  "ui.archive.takeover.manual": "Strenger: Bilder nur von Hand",
2036
2125
  "ui.archive.takeover.stop": "Zurück – die übrigen bleiben, wie sie sind",
2037
2126
  "ui.archive.milder.item": "{title} ({host}) gibt jetzt an, dass das Archiv mehr erlaubt: {to} (es gilt: {from})",
2038
- "ui.archive.milder.read": "Entscheiden {k}: {title} gibt an, dass das Archiv mehr erlaubt",
2039
2127
  "ui.archive.milder.accept": "Die neue Lesart annehmen",
2040
2128
  "ui.archive.milder.keep": "Beibehalten, was jetzt gilt",
2041
2129
  "ui.archive.milder.accepted": "✓ {title}: Die neue Lesart gilt.",
@@ -2048,11 +2136,12 @@
2048
2136
  "ui.archive.woken": "Die Aufgaben {ids} kehren in die Warteschlange zurück.",
2049
2137
  "ui.archive.inbox": "{id}: Im Ordner liegen schon Bilder ({n}) – die Forschung erfasst sie, und die Aufgabe kommt von selbst zurück.",
2050
2138
  "ui.archive.manual.tasks": "Die Aufgaben {ids} warten weiter auf die von Hand gespeicherten Bilder.",
2051
- "ui.archive.pace": "höchstens ein Bild alle {seconds} s, höchstens {n} pro Stunde",
2139
+ "ui.archive.pace": "höchstens ein Bild alle {seconds} s, {cap}",
2052
2140
  "ui.archive.pace.line": "Tempo der Bilder, langsam: {pace} – nur per Befehl zu ändern: strom allow host {host} --pace <s> --per-hour <n>, für alle Archive strom config set archive.pace \"<s> <n>\"",
2053
2141
  "ui.archive.allowed.line": "Es gilt: {level} – hier nur strenger: die Bilder nur von Hand.",
2054
2142
  "ui.archive.pace.service": "Tempo der Bilder: {pace} – nur per Befehl zu ändern: strom allow host {host} --pace <s> --per-hour <n>",
2055
2143
  "ui.archive.closed": "{title}: {level}. Eine Erlaubnis ändert daran nichts; die Stufe hebt nur ein Befehl: strom allow archive {host} --level restricted",
2144
+ "ui.archive.closed.hand": "{title}: {level}. Die Bilder gehen nur von Hand: im Browser in den Ordner der Aufgabe im Eingang (inbox) speichern.",
2056
2145
  "ui.archive.gone": "Zu diesem Archiv führt hier kein Downloader mehr – es gibt nichts zu entscheiden.",
2057
2146
  "ui.archive.level.allowed": "nach den Bedingungen erlaubt",
2058
2147
  "ui.archive.level.restricted": "die Bedingungen schränken das automatische Herunterladen ein – Bilder nur mit Erlaubnis",
@@ -2075,5 +2164,60 @@
2075
2164
  "ui.link.archive.none": "Über dieses Archiv gibt es hier nichts zu entscheiden. Es ist nichts geschehen.",
2076
2165
  "ui.error.archive.permission": "das Herunterladen von Bildern aus dem Archiv {title} ({hosts}) wartet auf eine Entscheidung – seine Bedingungen schränken das automatische Herunterladen ein; beim Archiv wurde nichts angefragt",
2077
2166
  "ui.error.archive.permission.new": "das Herunterladen von Bildern aus dem Archiv {title} ({hosts}) wartet auf eine Entscheidung – die Lesart der Bedingungen durch den Downloader hat noch niemand bestätigt; beim Archiv wurde nichts angefragt",
2078
- "ui.error.archive.permission.hint": "im Menü von strom entscheiden (Was wartet) oder im Terminal: strom allow archive {host} --way {ways}"
2167
+ "ui.error.archive.permission.hint": "im Menü von strom entscheiden (Was wartet) oder im Terminal: strom allow archive {host} --way {ways}",
2168
+ "ui.error.archive.rerouted": "{title}: ab jetzt {way} – dieser Befehl ging diesen Weg noch nicht",
2169
+ "ui.error.archive.rerouted.hint": "denselben Befehl noch einmal starten",
2170
+ "ui.archive.level.robots.manual": "die robots.txt erlaubt keinen automatischen Zugriff, und der Downloader kann nicht über den Browser gehen – Bilder nur von Hand",
2171
+ "ui.archive.level.browserOnly": "das Archiv lässt automatische Werkzeuge nur über den Browser eines Menschen zu – Bilder nur über den Browser, mit Erlaubnis",
2172
+ "ui.archive.level.browserOnly.manual": "das Archiv lässt automatische Werkzeuge nur über den Browser eines Menschen zu, und der Downloader kann das nicht – Bilder nur von Hand",
2173
+ "ui.pace.text": "mindestens {seconds} s zwischen zwei Anfragen, {cap}",
2174
+ "ui.host.pace.own": "{host}: {pace} – eigenes Tempo",
2175
+ "ui.host.pace.service": "{host}: {pace} – wieder das Tempo des Dienstes",
2176
+ "ui.host.revoked": "{host}: Zustimmung zurückgenommen – kein Downloader erreicht ihn jetzt",
2177
+ "ui.host.allowed": "{host}: automatischer Zugriff erlaubt (strom consents)",
2178
+ "ui.host.notallowed": "Nicht erlaubt – nichts geändert.",
2179
+ "ui.consents.on": "Zustimmungen: an – ein Downloader läuft erst, wenn ein Mensch ihn erlaubt, und ebenso jeder Server eines Archivs, den er erreicht",
2180
+ "ui.consents.off": "Zustimmungen: aus – Downloader laufen ohne Nachfrage (im Tempo von strom, nur zu ihren Servern); Code, der an strom vorbeigeht, braucht das Ja eines Menschen · um vorher gefragt zu werden: strom config set connectors.consent on",
2181
+ "ui.consents.connectors": "Downloader",
2182
+ "ui.consents.connector": "{name} {dir} seit {date} Server {hosts}",
2183
+ "ui.consents.none": "(keine)",
2184
+ "ui.consents.hosts": "Server (automatischer Zugriff)",
2185
+ "ui.consents.host.refused": "⛔ {reason} – strom versucht es erst wieder ab {when}",
2186
+ "ui.consents.host.refused.lifted": "⛔ {reason} – strom versucht es nicht wieder, bis ein Mensch es aufhebt: strom allow host {host} --unblock",
2187
+ "ui.consents.host.recent": "Anfragen in der letzten Stunde: {n}",
2188
+ "ui.consents.host.slowed": "verlangsamt ×{factor}",
2189
+ "ui.consents.host.limit": "sein Limit aufgebraucht bis {when}",
2190
+ "ui.consents.host.since": "erlaubt seit {date}",
2191
+ "ui.consents.pace": "mindestens {seconds} s zwischen zwei Anfragen, {cap}",
2192
+ "ui.consents.pace.own": "{pace} (eigenes Tempo)",
2193
+ "ui.consents.archives": "Archive (was ihre Bedingungen strom erlauben: erlaubt · eingeschränkt · nur von Hand · verboten; unbekannt wie eingeschränkt)",
2194
+ "ui.consents.level.allowed": "erlaubt",
2195
+ "ui.consents.level.restricted": "eingeschränkt",
2196
+ "ui.consents.level.manual": "nur von Hand",
2197
+ "ui.consents.level.forbidden": "verboten",
2198
+ "ui.consents.level.unknown": "unbekannt",
2199
+ "ui.consents.archive.refused": "sein Server hat den automatischen Zugriff von strom abgelehnt (die Antwort des Servers, nicht die Bedingungen des Archivs) – nur ein Mensch hebt das auf: strom allow host {host} --unblock",
2200
+ "ui.consents.archive.browser": "nur über den Browser eines Menschen",
2201
+ "ui.consents.archive.browser.robots": "nur über den Browser eines Menschen (seine robots.txt)",
2202
+ "ui.consents.archive.way": "Erlaubnis des Menschen: {way}",
2203
+ "ui.consents.way.slow": "langsam",
2204
+ "ui.consents.way.browser": "über den Browser",
2205
+ "ui.consents.way.manual": "von Hand",
2206
+ "ui.consents.archive.ask": "Bilder nur mit Erlaubnis des Menschen",
2207
+ "ui.consents.archive.pace.service": "Tempo des Dienstes: {pace}",
2208
+ "ui.consents.archive.pace.images": "Bilder: {pace}",
2209
+ "ui.consents.pending": "wartet auf die Entscheidung des Menschen: {items}",
2210
+ "ui.consents.pending.permission": "{title} (Bilder)",
2211
+ "ui.consents.pending.takeover": "die Stufen der Archive von {names} (strom allow archive --accept)",
2212
+ "ui.consents.pending.milder": "{connector} gibt für {host} eine mildere Stufe an: {to}",
2213
+ "ui.consents.pace.about": "Tempo: je Server eine Anfrage nach der anderen – das Tempo des Dienstes (sein Downloader nennt es), sonst mindestens {seconds} s Abstand; ein Stundenlimit nur, wo der Dienst oder ein Mensch eines setzt; langsamer, solange ein Server langsam antwortet, eine Pause, wenn er sein Limit für aufgebraucht erklärt; seine robots.txt einmal am Tag gelesen (die Pfade, die er Werkzeugen verwehrt, nicht angefragt, sein Crawl-delay das langsamste Tempo); eine Ablehnung hält einen Tag an – eine des Clients von strom, bis ein Mensch sie aufhebt (strom allow host <host> --unblock) · eigenes Tempo für einen Server: strom allow host <host> --pace <seconds> --per-hour <n>",
2214
+ "ui.consents.logins": "gespeicherte Anmeldungen (strom login): {names}",
2215
+ "ui.consents.revoke": "zurücknehmen: strom allow connector <name> --revoke · strom allow host <host> --revoke · strom allow archive <host> --revoke",
2216
+ "ui.consents.reason.client": "hat den automatischen Zugriff von strom abgelehnt ({details})",
2217
+ "ui.consents.reason.refused": "hat den automatischen Zugriff abgelehnt ({details})",
2218
+ "ui.consents.reason.login": "hat die Anmeldung abgelehnt ({details})",
2219
+ "ui.consents.reason.slow": "hat zweimal um ein langsameres Tempo gebeten ({details})",
2220
+ "ui.consents.reason.silent": "keine Antwort ({details}; der Server ist nicht erreichbar oder sperrt die IP-Adresse dieses Computers)",
2221
+ "ui.consents.reason.browser.slow": "hat den Browser um ein langsameres Tempo gebeten ({details})",
2222
+ "ui.consents.reason.browser": "hat den Browser abgelehnt ({details})"
2079
2223
  }
@@ -91,8 +91,32 @@ conclusion so the next researcher can follow it.
91
91
  the records decide it. You read no records here: what would
92
92
  decide a hypothesis is a task (`strom task add … --about H…`), not a search now.
93
93
  <!-- end -->
94
+ <!-- for link verify enrich locate connector -->
95
+ - **Fetch only what you read**, as the archive allows (the brief's `archive`
96
+ line). An image known exactly from another source (an online reference, a
97
+ published edition): start with it. An archive that restricts automation (its
98
+ images slowly or through the browser, by the person's permission): sparing
99
+ and targeted — an index searched by halving (its middle image first, then the
100
+ half the name falls in; never batches from one end), only the images of the
101
+ name's letter fetched; a page number from the index turned into an image
102
+ number by one or two images, never a batch of ten; an entry: its image ±1
103
+ (it may run over a page). An archive that allows automation: batches as
104
+ usual (about ±5 around the target, an index in batches) — fewer turns.
105
+ <!-- end -->
106
+ - **What strom or the tree denies stays denied.** Never offer the user to
107
+ change your permissions or settings, strom's or the tree's, to get round it:
108
+ another way, or say what was refused.
94
109
  - **Stay within the task.** New questions become new tasks (`strom task add`,
95
110
  with where and done-when), not detours.
111
+ <!-- for locate request -->
112
+ - **What waits for the user is a sentence they read** (`strom task wait T…
113
+ --on "…"`: strom's menu, the Strom app): impersonal, in the research
114
+ language, what is needed and from whom — never addressed to them, never in
115
+ your voice. Say its kind (`--kind letter|family|web|other`) and, when known,
116
+ whom it waits on (`--to`), the request's text saved in notes/ (`--request
117
+ notes/<file>.md`), the site (`--url`); `strom task sent T…` only once the
118
+ user says the request went out.
119
+ <!-- end -->
96
120
  <!-- for link verify enrich intake locate -->
97
121
  A new task whose images are not here
98
122
  gets them now: through the archive's connector (built first when it has
@@ -5,7 +5,8 @@ Before anything can be proven, know where the records are.
5
5
  1. Place and time decide the jurisdiction. Record it: `strom place add …` and
6
6
  `strom place jurisdiction L… --kind parish|civil|manor|district --from --to`.
7
7
  Borders, parishes and names changed; a village may belong to different
8
- parishes in different centuries.
8
+ parishes in different centuries. A place only read uncertainly (readers
9
+ disagree, `[?]`) gives no parish or book until it is settled.
9
10
  2. Find the holding archive or portal and the concrete book or collection:
10
11
  `strom repo add …` (record its terms of use and whether automated download
11
12
  is allowed), `strom recordset add … --places --years --kinds --access --url`.
@@ -23,7 +24,7 @@ Before anything can be proven, know where the records are.
23
24
  the page of one book — never walk its record numbers one after another
24
25
  (archives block that). A catalogue you cannot read (an app, a login): ask
25
26
  the user — the archive, the village, the years, the kind of book — with
26
- `strom task wait T… --on "…"`.
27
+ `strom task wait T… --on "…" --kind web --url <the catalogue>`.
27
28
  5. Record where you looked, also what gave nothing: `strom search add "<what>"
28
29
  --method web|catalog --result found|negative --task T…` — the next session
29
30
  must not search the same catalogues again.
@@ -6,6 +6,14 @@ name sends the research to the wrong village. **A name or place the next
6
6
  search depends on** (a surname, a birthplace, a parish) is read again on a
7
7
  crop at full resolution before it is recorded; what stays unsure is recorded
8
8
  as unsure and said so. "Illegible" beats a guess.
9
+ <!-- for link verify enrich -->
10
+ **A place read uncertainly is a lead, not a place** (readers differ, a `[?]`,
11
+ nothing else confirms it): no parish, book or task follows from it until it
12
+ is settled — your own look at the crop, the book's index, a gazetteer or
13
+ cadastre (a village's parish from them, never from today's municipality).
14
+ Still unsure: `strom hypothesis add` with the readings as variants, and a
15
+ task that tests it (`--about H…`), never one naming the place as settled.
16
+ <!-- end -->
9
17
 
10
18
  Look at as few pixels as the question needs and write down what you saw at
11
19
  once: after about 30 views write down what you found before you open more, and
@@ -5,6 +5,15 @@ When records are not online, ask the holding archive.
5
5
  - Write the request in the archive's language, short and precise: whose record,
6
6
  which type, parish or office, years, what you already know (call number if
7
7
  known). Offer to pay the research fee if the archive charges one.
8
- - Save the text in `notes/` and tell the user — the user sends it, not you.
9
- - Put the task on `strom task wait T… --on "reply from …"`. When the answer
10
- comes, it becomes an input (`strom intake …`).
8
+ - Save the text in `notes/` (`notes/request-<what>.md`) and tell the user —
9
+ the user sends it, not you.
10
+ - Put the task on `strom task wait T… --on "reply of <the office> to the
11
+ request of <date>" --kind letter --to "<the addressee>" --request
12
+ notes/<file>.md`. `--on` is a sentence the user reads in strom's menu and
13
+ the Strom app: impersonal, in the research language, what is awaited and
14
+ from whom — never addressed to them, never in your voice ("please send",
15
+ "I will then…"). A question to the family: `--kind family`; a request made
16
+ through a site: `--url <its address>`.
17
+ - Once the user says it was sent (never before): `strom task sent T…` — the
18
+ task still waits for the reply. When the answer comes, it becomes an input
19
+ (`strom intake …`).
@@ -0,0 +1,66 @@
1
+ # Method: a conversation about what waits for the user
2
+
3
+ The user picked a task that waits for them (strom's menu, What waits; the Strom
4
+ app) and the conversation begins with it: its ID, what it waits for, where it is
5
+ dealt with, and the other tasks waiting at the same place. The user is here to
6
+ get it done with your help — lead them through it, one step at a time, in the
7
+ research language.
8
+
9
+ - First `strom task show T…` for the task and for each of the others named
10
+ with it: what it waits for, the book and its images, the folder for images
11
+ saved by hand, whom a request goes to, its text in `notes/`.
12
+ - Take the tasks of one place one after another, in the order given; say which
13
+ one you are on.
14
+ - The user's answer is theirs to give in strom's menu or the Strom app — never
15
+ record it with `strom task wake T… --answer`. What you find together you
16
+ record with the usual commands (a source with its transcript, the facts
17
+ citing it; what the user tells you: `strom intake --text "…"`).
18
+
19
+ ## Images saved by hand
20
+
21
+ An archive that allows no automation (or whose connector cannot fetch images):
22
+ the user saves the images, you guide them. You open nothing and download
23
+ nothing yourself — not through a browser either.
24
+
25
+ 1. The book: its title and its address on the archive's site (the task shows
26
+ them). An archive that needs an account: the user logs in with their own.
27
+ 2. Which images: the numbers the task names, as the archive's viewer counts
28
+ them (the viewer's own image number, not a folio or a page printed in the
29
+ book).
30
+ 3. How: the viewer's download or export, as JPEG; where the viewer offers
31
+ none, the browser's save of the image itself.
32
+ 4. The name of each file: its image number (`9.jpg`; a zoomed-in part of it
33
+ `9a.jpg`).
34
+ 5. Where: the exact folder of the shared inbox the task shows — say it whole.
35
+
36
+ When the user says the images are saved:
37
+ `strom media add --inbox "<the folder>" --recordset B…` registers them and the
38
+ task comes back to the queue (it says which images are still missing — ask for
39
+ those). Then `strom session start T…`: its brief says how to read and record.
40
+ Read them, record what they say, tell the user what was found
41
+ (`strom person card P…`) and what is needed next — all in this conversation.
42
+
43
+ ## A letter or the family
44
+
45
+ 1. Help write the request: short, in the language of whoever reads it; for an
46
+ office or an archive whose record, which type, the place, the years and what
47
+ is known already (method of requests). Save the text in `notes/` and name it
48
+ on the task (the family: `--kind family`):
49
+ `strom task edit T… --kind letter --to "<the addressee>" --request notes/<file>.md`
50
+ 2. Say to whom it goes and how — e-mail, a form on the office's site, the post,
51
+ a call to a relative — and what to attach.
52
+ 3. Once the user says it went out (never before):
53
+ `strom task sent T…` — the task still waits for the reply.
54
+ 4. A reply that came as a file: `strom intake <file> --answers T…` — the file
55
+ becomes material of the task's people, the task comes back to the queue
56
+ with it (no intake task of its own). A reply the user tells you:
57
+ `strom intake --text "…"`, then `strom task wake T…`. The work goes on in a
58
+ session.
59
+
60
+ ## A site
61
+
62
+ Say which site, where on it and what to look for there; the user looks. What
63
+ they find is recorded (an online record read with them is a source; a hint is a
64
+ lead: `strom intake --text "…"`), then `strom task wake T…`. A check of a site
65
+ that keeps automated tools off (`strom task wait --check`) is the user's alone
66
+ to answer, in strom's menu or the Strom app: say what to look at, nothing more.
@@ -14,6 +14,7 @@ import { isArchive } from "../core/mode.js";
14
14
  import { Settings } from "../core/config.js";
15
15
  import { agentAppUrl, appSite } from "../core/stromapp.js";
16
16
  import { configDir } from "../core/paths.js";
17
+ import { within } from "../core/relocate.js";
17
18
  import { agentBrowser } from "../core/connector.js";
18
19
  import { CHROME_ALLOW, CHROME_DENY, chromeDomain } from "../core/browser.js";
19
20
  import { claudeScanReader, opencodeScanReader, SCAN_READER, scanReaderModel, treeReading } from "./scanreader.js";
@@ -68,6 +69,14 @@ the researcher; \`strom\` is your only way to read and change the research.
68
69
  either — check with \`strom net web --check <url>\`. Another way to the
69
70
  same records first; a task for the user (\`strom task wait T… --check
70
71
  <url> --on "…"\`) only if the source stays necessary.
72
+ What a task waits for (\`--on\`) is a sentence the user reads in strom's
73
+ menu: impersonal, what is needed and from whom, never addressed to them;
74
+ say its kind (\`--kind letter|family|web|other\`) and, when known,
75
+ \`--to\`, \`--request notes/<file>.md\`, \`--url\`.
76
+ 11. What strom or this tree denies you (a command, a site, a file) stays
77
+ denied: never offer the user to change your permissions or settings,
78
+ strom's or the tree's, to get round it — go another way, or say what was
79
+ refused.
71
80
 
72
81
  ## Working with the user
73
82
 
@@ -93,7 +102,7 @@ says how it ends.)
93
102
  there, strom says how the user clears your context (Claude Code: /clear)
94
103
  — nothing is lost, strom keeps it all; suggest it in a sentence, go on
95
104
  here if they prefer. Working alone (strom run) each task starts fresh by
96
- itself and nobody reads a closing message: no such advice there;
105
+ itself and its closing message gives no such advice;
97
106
  - what only they can do: when strom needs their consent it opens a window
98
107
  on their screen — tell them to answer it, you cannot; images a portal gives
99
108
  only by hand — strom says which ones and where to save them.
@@ -120,7 +129,9 @@ says how it ends.)
120
129
  would take — tell them, write it on their yes (\`--apply\`); a sync is
121
130
  undone with \`strom sync undo I…\`. Straight from the app: \`strom sync --app\`.
122
131
  - **What waits for them** (\`strom\` shows it): tell them plainly what to do
123
- and where, one thing at a time.
132
+ and where, one thing at a time. A conversation that begins with a task that
133
+ waits for them (they picked it in the menu or the Strom app): \`strom guide
134
+ waiting\` says how to lead it.
124
135
  - **Results and the Strom app**: \`output/tree-strom.ged\` is the family tree
125
136
  for the Strom app (${appSite(app)}) — strom's companion: a free family
126
137
  tree app, no account, their data stay on their computer; it shows the tree,
@@ -164,6 +175,43 @@ export function permissionPath(abs) {
164
175
  const win = /^([A-Za-z]):\/(.*)$/.exec(p);
165
176
  return win ? `//${win[1].toLowerCase()}/${win[2]}` : `/${p}`;
166
177
  }
178
+ /** What strom keeps in its settings folder that no agent reads or edits: the seal keys, the person's settings,
179
+ * consents, permissions, logins. */
180
+ const SETTINGS_KEPT = ["keys", "config.json", "consents.json", "archives.json", "logins.json", "agents-taught.json", "shortcut"];
181
+ /**
182
+ * The parts of strom's settings folder kept from the agents, each with whether it is a folder. The whole folder —
183
+ * unless the research is in it (an isolated installation's home is "Strom research" inside it: a deny of the whole
184
+ * folder outweighs every allow and cuts the agent off its connectors, its inbox and the research itself). Then what
185
+ * strom keeps there always, and every other entry that holds none of the research's folders.
186
+ */
187
+ export function settingsKeptFrom(dir, research, platform = process.platform) {
188
+ const keep = research.map((p) => path.resolve(p));
189
+ if (!keep.some((p) => within(p, dir, platform)))
190
+ return [{ path: dir, folder: true }];
191
+ let entries = [];
192
+ try {
193
+ entries = fs.readdirSync(dir);
194
+ }
195
+ catch {
196
+ // no settings folder yet: what strom will keep there
197
+ }
198
+ const names = [...new Set([...SETTINGS_KEPT, ...entries])].filter((n) => !keep.some((p) => within(p, path.join(dir, n), platform)));
199
+ return names.sort().map((n) => {
200
+ const p = path.join(dir, n);
201
+ let folder = n === "keys";
202
+ try {
203
+ folder = fs.statSync(p).isDirectory();
204
+ }
205
+ catch {
206
+ // not there yet: as strom makes it
207
+ }
208
+ return { path: p, folder };
209
+ });
210
+ }
211
+ /** The folders of the research the agent works in: its home, the shared folder, the tree. */
212
+ function researchFolders(tree, settings) {
213
+ return [settings.home()?.value, settings.shared()?.value, tree.root].filter((p) => !!p);
214
+ }
167
215
  /**
168
216
  * The tree's rules for Claude Code or Grok Build. Grok reads Claude Code's rules too, but an absolute
169
217
  * path in Claude Code's words ("//Users/x") is plain text to it: its own file gets the path as it is.
@@ -175,7 +223,7 @@ function treeRules(tree, agent) {
175
223
  const shared = settings.shared()?.value;
176
224
  const claude = agent === "claude";
177
225
  const at = (abs) => (claude ? permissionPath(abs) : abs.replace(/\\/g, "/"));
178
- const keys = at(configDir(tree.env));
226
+ const kept = settingsKeptFrom(configDir(tree.env), researchFolders(tree, settings)).map((k) => (k.folder ? `${at(k.path)}/**` : at(k.path)));
179
227
  // Browser tools (Claude in Chrome): for the sites of the connectors fetching through the browser — or, agent.browser
180
228
  // always, of every archive of the research (anything else is asked in a conversation, not used in a run).
181
229
  const web = claude ? agentBrowser(tree, shared) : { on: false, hosts: [] };
@@ -217,9 +265,8 @@ function treeRules(tree, agent) {
217
265
  ...(shared ? [`Edit(${at(path.join(shared, "net"))}/**)`] : []),
218
266
  // A session ends with its turn: nothing wakes it up later (a live run waited for a wake-up that never came).
219
267
  ...(claude ? ["ScheduleWakeup", "CronCreate"] : []),
220
- // The seal keys: an agent that could read them could forge the seal.
221
- `Read(${keys}/**)`,
222
- `Edit(${keys}/**)`,
268
+ // The seal keys: an agent that could read them could forge the seal; the person's settings, consents and logins.
269
+ ...kept.flatMap((k) => [`Read(${k})`, `Edit(${k})`]),
223
270
  // What the browser downloads is strom's to take over; the rest of the folder is the user's.
224
271
  `Read(${downloads}/**)`,
225
272
  ...(claude ? CHROME_DENY : []),
@@ -321,8 +368,8 @@ export function opencodeConfig(tree) {
321
368
  [`${abs(path.join(shared, "net"))}/*`]: "deny",
322
369
  }
323
370
  : {}),
324
- // the seal keys, and what the browser downloads (strom's to take over)
325
- [`${abs(configDir(tree.env))}/*`]: "deny",
371
+ // the seal keys and the person's settings, and what the browser downloads (strom's to take over)
372
+ ...Object.fromEntries(settingsKeptFrom(configDir(tree.env), researchFolders(tree, settings)).map((k) => [k.folder ? `${abs(k.path)}/*` : abs(k.path), "deny"])),
326
373
  [`${abs(settings.downloads())}/*`]: "deny",
327
374
  },
328
375
  webfetch: "allow",