strom-research 1.13.2-beta.7 → 1.13.2-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/assets/lang/cs.json +52 -7
- package/assets/lang/de.json +52 -7
- package/assets/method/locate.md +1 -1
- package/assets/method/reading.md +14 -15
- package/dist/agents/effort.js +32 -0
- package/dist/agents/files.js +32 -3
- package/dist/agents/profiles.js +17 -5
- package/dist/agents/scanreader.js +4 -1
- package/dist/brief/brief.js +14 -4
- package/dist/brief/sheet.js +4 -1
- package/dist/cli/context.js +7 -1
- package/dist/cli/format.js +9 -0
- package/dist/cli/main.js +8 -3
- package/dist/cli/menu-parts.js +6 -3
- package/dist/cli/menu-settings.js +91 -80
- package/dist/cli/menu.js +2 -2
- package/dist/cli/tunereset.js +73 -3
- package/dist/cli/ui.js +49 -7
- package/dist/cli/wizard.js +24 -0
- package/dist/commands/calibrate.js +33 -22
- package/dist/commands/connectors.js +110 -41
- package/dist/commands/delegate.js +37 -0
- package/dist/commands/grep.js +104 -0
- package/dist/commands/guide.js +7 -2
- package/dist/commands/index.js +3 -0
- package/dist/commands/media.js +2 -2
- package/dist/commands/meta.js +2 -2
- package/dist/commands/read.js +4 -4
- package/dist/commands/readers.js +3 -3
- package/dist/commands/session.js +18 -11
- package/dist/commands/setup.js +117 -28
- package/dist/commands/web.js +88 -0
- package/dist/core/changelog.js +24 -8
- package/dist/core/config.js +17 -5
- package/dist/core/delegate.js +155 -0
- package/dist/core/errors.js +6 -3
- package/dist/core/grep.js +234 -0
- package/dist/core/lock.js +5 -2
- package/dist/core/media.js +73 -8
- package/dist/core/metrics.js +270 -1
- package/dist/core/modelkey.js +278 -0
- package/dist/core/net.js +147 -2
- package/dist/core/phrases.js +4 -0
- package/dist/core/readstats.js +194 -43
- package/dist/core/self.js +28 -0
- package/dist/core/tree.js +1 -1
- package/dist/core/tune.js +226 -44
- package/dist/core/tuneask.js +29 -14
- package/dist/core/tunereset.js +54 -34
- package/dist/core/viewsizes.js +43 -21
- package/dist/core/web.js +583 -0
- package/dist/core/which.js +3 -2
- package/dist/runners/antigravity.js +25 -5
- package/dist/runners/claude.js +33 -9
- package/dist/runners/codex.js +22 -1
- package/dist/runners/grok.js +43 -9
- package/dist/runners/jsonl.js +19 -0
- package/dist/runners/opencode.js +16 -3
- package/dist/runners/runner.js +19 -0
- package/package.json +1 -1
package/assets/lang/cs.json
CHANGED
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
"ui.menu.start": "Začít výzkum s agentem",
|
|
89
89
|
"ui.menu.run": "Nechat agenta pracovat samotného",
|
|
90
90
|
"ui.menu.waitlist": "Co čeká",
|
|
91
|
-
"ui.menu.settings": "Nastavení: agent, samostatná práce, zprávy, archivy,
|
|
91
|
+
"ui.menu.settings": "Nastavení: agent, samostatná práce, zprávy, archivy, údržba",
|
|
92
92
|
"ui.menu.doctor": "Kontrola instalace",
|
|
93
93
|
"ui.settings.help": "Nápověda: příkazy pro člověka",
|
|
94
94
|
"ui.menu.trees": "Jiný rodokmen · poslat nebo přijmout",
|
|
@@ -150,7 +150,7 @@
|
|
|
150
150
|
"ui.effort.default": "výchozí nastavení agenta {agent}",
|
|
151
151
|
"ui.doc.codex": "Codex",
|
|
152
152
|
"ui.chat.app.model.chosen": "V aplikaci {app} zvolit pro výzkum model {model} (zvolený v nastavení).",
|
|
153
|
-
"ui.settings.model": "
|
|
153
|
+
"ui.settings.model": "Jen model výzkumu ({agent}): {model}",
|
|
154
154
|
"ui.settings.model.own": "vlastní model agenta",
|
|
155
155
|
"ui.views.title": "Ladění čtení snímků · {agent}: snímků {n}, knih {books}, velikosti {sizes} px",
|
|
156
156
|
"ui.views.find": "Nalezení zápisu na celém snímku:",
|
|
@@ -250,6 +250,10 @@
|
|
|
250
250
|
"ui.tune.book.unread": "staženo a nepřečteno {n} z {of}",
|
|
251
251
|
"ui.tune.hosts": "Archivy:",
|
|
252
252
|
"ui.tune.host": " {host}: sezení {sessions} · požadavky {requests} ({perSession} na sezení, {perImage} na snímek) · čekání {wait} min · limit vyčerpán {later}×",
|
|
253
|
+
"ui.tune.web": "Webové nástroje agenta:",
|
|
254
|
+
"ui.tune.web.host": " {host}: webové požadavky {n} · sezení {sessions} · nejvíc {most} v jednom",
|
|
255
|
+
"ui.tune.web.searches": " hledání na webu: {n}",
|
|
256
|
+
"ui.tune.web.many": " víc než {limit} stránek jednoho webu v jednom sezení: šetrnější cestou je konektor (strom connector new)",
|
|
253
257
|
"ui.tune.signals": "Nad obvyklou mírou téhož agenta a modelu:",
|
|
254
258
|
"ui.tune.signals.none": "Nic nad obvyklou mírou téhož agenta a modelu.",
|
|
255
259
|
"ui.tune.sig.M1": " {scope}: cena za sken {value}, {ratio}× obvyklé ({base})",
|
|
@@ -265,6 +269,7 @@
|
|
|
265
269
|
"ui.tune.sig.M9": " {scope}: {value} z {n} záporů na slabých skenech (pohledy převážně zvětšené)",
|
|
266
270
|
"ui.tune.sig.M10": " čtenáři bez výsledku: {n} z posledních {of}",
|
|
267
271
|
"ui.tune.sig.M11": " {scope}: staženo a nepřečteno {value} ({n} z {of} snímků)",
|
|
272
|
+
"ui.tune.sig.M12": " dlouhé úseky bez vyčištění: {n} z posledních {of} sezení přes {ctx} tokenů (zhruba {views} pohledů, {peak} tokenů)",
|
|
268
273
|
"ui.tune.short": "Zatím málo pro srovnání: {list} — přibude s dalšími sezeními.",
|
|
269
274
|
"ui.tune.m.M1": "cena za sken",
|
|
270
275
|
"ui.tune.m.M2": "pohledy na sken",
|
|
@@ -275,6 +280,7 @@
|
|
|
275
280
|
"ui.tune.m.M8": "čekání na archiv",
|
|
276
281
|
"ui.tune.m.M10": "čtenáři bez výsledku",
|
|
277
282
|
"ui.tune.m.M11": "nepřečtené snímky",
|
|
283
|
+
"ui.tune.m.M12": "dlouhé úseky",
|
|
278
284
|
"ui.tune.recommend": "Doporučení, která strom sám nenastavil (rozhoduje člověk, nebo je tune.auto vypnuté):",
|
|
279
285
|
"ui.tune.rec.A1": " {scope}: celý snímek ve velikosti čtení, dvoustrana v půlkách, výřez aspoň 1:1 — ze skenů, které už tu jsou, žádný požadavek navíc",
|
|
280
286
|
"ui.tune.rec.A2": " menší dávky: skeny na čtenáře asi {to} místo {from} — víc volání, menší kontext",
|
|
@@ -315,6 +321,26 @@
|
|
|
315
321
|
"ui.tune.reset.scope.all": "všechny modely",
|
|
316
322
|
"ui.tune.what.calibration": "kalibrované velikosti",
|
|
317
323
|
"ui.tune.what.answer": "odpověď na {kind}",
|
|
324
|
+
"ui.tune.why.calibrated": "změřeno na {n} známých záznamech",
|
|
325
|
+
"ui.tune.why.answered": "zodpovězeno",
|
|
326
|
+
"ui.tune.why.answered.terminal": "zodpovězeno v terminálu",
|
|
327
|
+
"ui.tune.why.answered.window": "zodpovězeno v okně systému",
|
|
328
|
+
"ui.tune.why.answered.app": "zodpovězeno v aplikaci Strom",
|
|
329
|
+
"ui.tune.why.measured": "z naměřených čtení",
|
|
330
|
+
"ui.tune.why.last": "{n} z posledních {of}",
|
|
331
|
+
"ui.tune.why.of": "{n} z {of}",
|
|
332
|
+
"ui.tune.why.M5": "nejisté {value} proti {base} u ostatních knih (n={n})",
|
|
333
|
+
"ui.tune.why.M6": "zvětšené pohledy {value} proti {base} (n={n})",
|
|
334
|
+
"ui.tune.why.M7": "portál ostřejší výřez nedal {n}×",
|
|
335
|
+
"ui.tune.why.M8": "sezení s čekáním na limit archivu: {count}",
|
|
336
|
+
"ui.tune.why.M8.wait": "sezení s čekáním na limit archivu: {count} ({wait} min, vyčerpán {later}×)",
|
|
337
|
+
"ui.tune.why.M11": "staženo a nepřečteno {value} ({count} snímků)",
|
|
338
|
+
"ui.tune.why.M3": "pohledy znovu otevřené po vyčištění kontextu: {count} čtenářů",
|
|
339
|
+
"ui.tune.why.M4": "kontext se vyčistil: {count} čtenářů",
|
|
340
|
+
"ui.tune.why.M4.ctx": "kontext se vyčistil: {count} čtenářů, poprvé zhruba při {ctx} tokenech",
|
|
341
|
+
"ui.tune.why.M10": "čtenáři bez výsledku: {count}",
|
|
342
|
+
"ui.tune.why.A3": "kontext se vyčistil: {count} čtenářů, poprvé zhruba při {ctx} tokenech, pohled čtenáře zhruba {view} tokenů",
|
|
343
|
+
"ui.tune.why.A3.long": "kontext se nevyčistil, a přesto přerostl {ctx} tokenů: {count} sezení, pohled čtenáře zhruba {view} tokenů",
|
|
318
344
|
"ui.tune.unknownKey": "agent a model nezaznamenány (starší záznamy)",
|
|
319
345
|
"ui.o.views": "snímky",
|
|
320
346
|
"ui.settings.views": "Vyladit čtení snímků ({state})",
|
|
@@ -327,6 +353,8 @@
|
|
|
327
353
|
"ui.doc.tuneworse": "po samoladění",
|
|
328
354
|
"ui.doc.tuneworse.a": "{scope}: čte se hůř od změny stromu z {at} ({what}) — {metric} {before} → {after} ({nb} skenů před, {na} po); doporučeno ji vrátit",
|
|
329
355
|
"ui.doc.tuneworse.b": "{scope}: dražší od změny stromu z {at} ({what}) — {before} → {after} na sken ({nb} skenů před, {na} po), čtení o nic jistější; doporučeno ji ponechat (šla k přesnosti), vrátit ji jde",
|
|
356
|
+
"ui.doc.web": "agenti na webu",
|
|
357
|
+
"ui.doc.web.many": "mnoho stránek jednoho webu v jednom sezení přes vlastní webové nástroje agenta: {list} — konektor je k webu šetrnější",
|
|
330
358
|
"ui.setup.level": "Co smí agent dělat bez ptaní?",
|
|
331
359
|
"ui.setup.level.ask": "Ptát se mě na všechno mimo výzkum",
|
|
332
360
|
"ui.setup.level.auto": "Pracovat samostatně – ptát se jen u riskantních kroků (doporučeno)",
|
|
@@ -418,6 +446,7 @@
|
|
|
418
446
|
"ui.run.start.session": "▶ {session} · {task} {what}",
|
|
419
447
|
"ui.run.parked": " · {task} odložen: {n} sezení za sebou nic nezapsalo",
|
|
420
448
|
"ui.run.denied": " · oprávnění odmítla {n}×: {what}",
|
|
449
|
+
"ui.run.refused": " · strom odmítl {n}× (limit {per} webových požadavků na jeden server v sezení nebo limit serveru): {what}",
|
|
421
450
|
"session.user": "zastaveno uživatelem",
|
|
422
451
|
"session.run": "běh se zastavil dřív, než sezení skončilo (přerušení, nebo vypnutý počítač)",
|
|
423
452
|
"session.chat": "rozhovor skončil dřív, než se sezení zavřelo",
|
|
@@ -434,7 +463,7 @@
|
|
|
434
463
|
"ui.doc.disk": "místo vedle výzkumů",
|
|
435
464
|
"ui.doc.disk.ok": "vedle výzkumů {size}, v mezích",
|
|
436
465
|
"ui.doc.disk.tree": "{name}: jde uvolnit {size} (v něm: strom tidy)",
|
|
437
|
-
"ui.doc.disk.fix": "strom tidy v rodokmenu (v menu Nastavení → Místo na disku) – nejdřív se zeptá",
|
|
466
|
+
"ui.doc.disk.fix": "strom tidy v rodokmenu (v menu Nastavení → Údržba → Místo na disku) – nejdřív se zeptá",
|
|
438
467
|
"ui.compact.done": "Historie rodokmenu zabalená: .git {before} → {after}. Ve výzkumu se nic nezměnilo.",
|
|
439
468
|
"ui.compact.small": "Historie rodokmenu je malá ({size}): není co balit.",
|
|
440
469
|
"ui.compact.busy": "Na rodokmenu se pracuje: historie se zabalí, až práce skončí.",
|
|
@@ -682,6 +711,8 @@
|
|
|
682
711
|
"ui.run.follow": "Sledovat mezitím práci živě v aplikaci Strom?",
|
|
683
712
|
"ui.run.follow.later": "Aplikace Strom se otevře, až agent začne první sezení.",
|
|
684
713
|
"ui.consent.host.pace": "Vlastní tempo pro {host}: nejméně {seconds} s mezi dvěma požadavky, {cap}. Příliš rychlé stahování zpomalí archiv všem a může vést k zablokování IP adresy tohoto počítače – nastavit?",
|
|
714
|
+
"ui.web.ask": "Už {n} požadavků na {host} v tomto sezení. Šetrnější cesta k dalším stránkám nebo položkám tohoto serveru: postavit pro něj hned konektor (strom connector new {name} --url {url}), který dodrží tempo serveru, robots.txt a jeho podmínky. Přesto povolit další?",
|
|
715
|
+
"ui.web.ask.have": "Už {n} požadavků na {host} v tomto sezení. Více stránek nebo položek tohoto serveru je šetrnější stahovat přes jeho konektor {connector}, který tu už je a dodrží tempo serveru, robots.txt a jeho podmínky. Přesto povolit další?",
|
|
685
716
|
"ui.pace.cap": "nejvýš {n} za hodinu",
|
|
686
717
|
"ui.pace.nocap": "bez hodinového limitu",
|
|
687
718
|
"ui.o.results.offered": "{file} – pro aplikaci Strom, tady nenainstalovanou; uživatel o ní už ví – zmiň ji znovu, jen když chce vidět výsledky (strom app install, pak strom app)",
|
|
@@ -904,7 +935,7 @@
|
|
|
904
935
|
"ui.tidy.done": "✓ Uvolněno {size}. Odteď to strom po každém sezení udržuje v pořádku sám.",
|
|
905
936
|
"ui.tidy.no": "Nic se nesmazalo.",
|
|
906
937
|
"ui.consent.tidy": "Uvolnit asi {size} vedle výzkumu {name} (staré záznamy sezení, náhledy skenů, dávno zapsaná poslání)? Výzkum i jeho skeny zůstanou.",
|
|
907
|
-
"ui.tidy.hint": "Vedle výzkumu si strom drží {strom}, z toho jde uvolnit {size}: strom tidy (v menu Nastavení → Místo na disku)",
|
|
938
|
+
"ui.tidy.hint": "Vedle výzkumu si strom drží {strom}, z toho jde uvolnit {size}: strom tidy (v menu Nastavení → Údržba → Místo na disku)",
|
|
908
939
|
"ui.error.consent": "tady je potřeba souhlas – {question}",
|
|
909
940
|
"ui.error.consent.hint": "spustit ve vlastním terminálu: {set}",
|
|
910
941
|
"ui.status.disk": "Na disku: výzkum {research} · vedle něj si strom drží {strom}",
|
|
@@ -1087,7 +1118,7 @@
|
|
|
1087
1118
|
"ui.setup.app.archive": "✓ Na počítači je aplikace Strom – menu v ní otevře výzkum.",
|
|
1088
1119
|
"ui.setup.stromapp.archive": "Aplikace Strom (zdarma, v prohlížeči) ukáže výzkum jako rodokmen – u každého zápisu jeho obrázek vyříznutý ze skenu, příběhy předků. Používat ji?",
|
|
1089
1120
|
"ui.settings.wizard.archive": "Jazyk, složka, zástupce, aplikace Strom… (průvodce nastavením)",
|
|
1090
|
-
"ui.menu.settings.archive": "Nastavení: jazyk, zprávy, archiv nebo výzkum,
|
|
1121
|
+
"ui.menu.settings.archive": "Nastavení: jazyk, zprávy, archiv nebo výzkum, údržba",
|
|
1091
1122
|
"ui.menu.more.archive.noapp": "Přidat do archivu: podklady, jiný rodokmen",
|
|
1092
1123
|
"ui.menu.more.archive": "Přidat do archivu: podklady, úpravy z aplikace Strom",
|
|
1093
1124
|
"ui.menu.app.tip.archive": "Tip: výzkum jde prohlédnout jako rodokmen v aplikaci Strom – volba {key}.",
|
|
@@ -1212,6 +1243,9 @@
|
|
|
1212
1243
|
"ui.archives.agentbrowser.off": "Vrátit prohlížeč jen pro archivy přes prohlížeč?",
|
|
1213
1244
|
"ui.consent.remote": "Spouštět sezení Claude Code, která strom otevírá, se vzdáleným ovládáním (Remote Control), aby je šlo sledovat a řídit z claude.ai nebo z aplikace Claude v telefonu?",
|
|
1214
1245
|
"ui.consent.addons": "Dovolit agentovi při samostatné práci načíst osobní doplňky z jeho nastavení (skilly, pluginy, MCP servery – třeba i poštu nebo dokumenty) jako v chatu? Pracuje přitom bez dozoru.",
|
|
1246
|
+
"ui.consent.effort": "Nastavit sezením {agent}, která spouští strom, hloubku uvažování {effort}? Vyšší hloubka uvažování (high, xhigh) rychleji spotřebuje limity předplatného.",
|
|
1247
|
+
"ui.consent.webPerHost": "Dovolit vlastnímu webovému nástroji agenta až {n} požadavků na jeden web (jeho servery a zrcadla dohromady) v sezení (nyní {now})? Více požadavků víc zatěžuje web; více stránek jednoho webu je šetrnější stahovat přes konektor.",
|
|
1248
|
+
"ui.consent.effort.run": "Spustit samostatnou práci {agent} pro tento běh s hloubkou uvažování {effort}, vyšší než v nastavení ({now})? Vyšší hloubka uvažování (high, xhigh) rychleji spotřebuje limity předplatného.",
|
|
1215
1249
|
"ui.consent.edits.user": "Mají mít úpravy v aplikaci Strom přednost před tím, co říká záznam? Údaj ze záznamu se pak stáhne s důvodem (synchronizace jde vrátit).",
|
|
1216
1250
|
"ui.consent.review.off": "Zapisovat, co pošle aplikace Strom, hned, bez ptaní u každého poslání? Přidané se zapíše, vodítka se opraví, změna údaje doloženého záznamem bude rozpor k rozhodnutí; strom sync undo poslání vrátí.",
|
|
1217
1251
|
"ui.consent.mode.archive": "Udělat z výzkumu „{name}“ archiv? Data přicházejí z aplikace Strom a zapisují se, jak přijdou; žádný agent na něm nepracuje, jeho úkoly počkají odložené. Práci s agentem jde zase zapnout.",
|
|
@@ -1402,11 +1436,18 @@
|
|
|
1402
1436
|
"ui.settings.hooks": "Zprávy o tom, co se uloží (hooky): {state}",
|
|
1403
1437
|
"ui.settings.on": "zapnuto",
|
|
1404
1438
|
"ui.settings.off": "vypnuto",
|
|
1405
|
-
"ui.settings.remote": "
|
|
1439
|
+
"ui.settings.remote": "Remote Control v aplikaci Claude (rozhovor s agentem i z mobilu): {state}",
|
|
1406
1440
|
"ui.settings.remote.about": "Když je zapnuté, jde sezení Claude Code, která strom spustí – rozhovory i samostatnou práci – sledovat a řídit z claude.ai nebo z aplikace Claude v telefonu.",
|
|
1407
1441
|
"ui.settings.remote.on": "Zapnout?",
|
|
1408
1442
|
"ui.settings.remote.off": "Vypnout?",
|
|
1409
1443
|
"ui.settings.archives": "Archivy: přihlášení, souhlas se stahováním",
|
|
1444
|
+
"ui.settings.wizard.what": "Co nastavit?",
|
|
1445
|
+
"ui.settings.wizard.all": "Všechno, krok za krokem (průvodce nastavením)",
|
|
1446
|
+
"ui.settings.maintenance": "Údržba: kontrola instalace, místo na disku",
|
|
1447
|
+
"ui.settings.maintenance.tidy": "Údržba: kontrola instalace, místo na disku (jde uvolnit {size})",
|
|
1448
|
+
"ui.settings.maintenance.update": "Údržba: kontrola instalace, místo na disku, aktualizace na {version}",
|
|
1449
|
+
"ui.maintenance.title": "Údržba",
|
|
1450
|
+
"ui.maintenance.tidy": "Místo na disku: strom si vedle výzkumu drží {size}",
|
|
1410
1451
|
"ui.alone.title": "Samostatná práce agenta",
|
|
1411
1452
|
"ui.alone.minutes": "Čas na jeden úkol: {minutes} min",
|
|
1412
1453
|
"ui.alone.minutes.ask": "Kolik minut smí trvat jeden úkol? (5–600; 0 vrátí zpět)",
|
|
@@ -1437,7 +1478,7 @@
|
|
|
1437
1478
|
"ui.hooks.nothing": "žádné",
|
|
1438
1479
|
"ui.menu.noagent": "Na počítači zatím není žádný AI agent – výzkum dělá on. Volba 1 ho nainstaluje.",
|
|
1439
1480
|
"ui.menu.getagent": "Nainstalovat nebo vybrat AI agenta",
|
|
1440
|
-
"ui.menu.update.where": "Vyšla nová verze stromu: {version} – aktualizovat ji jde v Nastavení (volba {key}).",
|
|
1481
|
+
"ui.menu.update.where": "Vyšla nová verze stromu: {version} – aktualizovat ji jde v Nastavení (volba {key}) → Údržba.",
|
|
1441
1482
|
"ui.more.noagent": "Agent se do toho pustí, až bude na počítači (volba 1 v menu).",
|
|
1442
1483
|
"ui.menu.noagent.chosen": "AI agent, kterého výzkum používá, na počítači není – volba 1 vybere jiného.",
|
|
1443
1484
|
"task.answer": "Odpověď uživatele (na: {asked}): {answer}",
|
|
@@ -1473,6 +1514,10 @@
|
|
|
1473
1514
|
"log.media": "Nové snímky: {name} (obr. {images})",
|
|
1474
1515
|
"log.media.one": "Nový snímek: {name} (obr. {image})",
|
|
1475
1516
|
"log.media.loose": "Nové snímky: {n}",
|
|
1517
|
+
"log.media.part.one": "Výřez snímku ve větším rozlišení: {name} (obr. {image})",
|
|
1518
|
+
"log.media.part": "Výřezy snímků ve větším rozlišení: {name} (obr. {images})",
|
|
1519
|
+
"log.media.part.loose": "Výřezy snímků ve větším rozlišení: {n}",
|
|
1520
|
+
"log.net.cap": "Archiv {host} je blízko hodinového limitu: využito {used} z {cap} požadavků za hodinu, další volný v {time}; mezitím výzkum pokračuje s tím, co už je k dispozici",
|
|
1476
1521
|
"log.reading": "Pročteno: {name} (obr. {images})",
|
|
1477
1522
|
"log.task.add": "Nový úkol: {name}",
|
|
1478
1523
|
"log.task.done": "Hotovo: {name}",
|
package/assets/lang/de.json
CHANGED
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
"ui.menu.start": "Die Forschung mit dem Agenten beginnen",
|
|
89
89
|
"ui.menu.run": "Den Agenten allein arbeiten lassen",
|
|
90
90
|
"ui.menu.waitlist": "Was wartet",
|
|
91
|
-
"ui.menu.settings": "Einstellungen: Agent, allein arbeiten, Nachrichten, Archive,
|
|
91
|
+
"ui.menu.settings": "Einstellungen: Agent, allein arbeiten, Nachrichten, Archive, Wartung",
|
|
92
92
|
"ui.menu.doctor": "Installation prüfen",
|
|
93
93
|
"ui.settings.help": "Hilfe: die Befehle für Menschen",
|
|
94
94
|
"ui.menu.trees": "Anderer Stammbaum · einen schicken oder empfangen",
|
|
@@ -150,7 +150,7 @@
|
|
|
150
150
|
"ui.effort.default": "Voreinstellung von {agent}",
|
|
151
151
|
"ui.doc.codex": "Codex",
|
|
152
152
|
"ui.chat.app.model.chosen": "In {app} für die Forschung das Modell {model} wählen (das in den Einstellungen gewählte).",
|
|
153
|
-
"ui.settings.model": "Modell der Forschung ({agent}): {model}",
|
|
153
|
+
"ui.settings.model": "Nur das Modell der Forschung ({agent}): {model}",
|
|
154
154
|
"ui.settings.model.own": "das eigene des Agenten",
|
|
155
155
|
"ui.views.title": "Abstimmung des Lesens der Scans · {agent}: {n} Bilder aus {books} Büchern, Größen {sizes} px",
|
|
156
156
|
"ui.views.find": "Finden eines Eintrags auf dem ganzen Bild:",
|
|
@@ -250,6 +250,10 @@
|
|
|
250
250
|
"ui.tune.book.unread": "geladen und nie gelesen {n} von {of}",
|
|
251
251
|
"ui.tune.hosts": "Archive:",
|
|
252
252
|
"ui.tune.host": " {host}: Sitzungen {sessions} · Anfragen {requests} ({perSession} pro Sitzung, {perImage} pro Bild) · gewartet {wait} min · Limit erschöpft {later}×",
|
|
253
|
+
"ui.tune.web": "Eigene Webwerkzeuge des Agenten:",
|
|
254
|
+
"ui.tune.web.host": " {host}: Webanfragen {n} · Sitzungen {sessions} · höchstens {most} in einer",
|
|
255
|
+
"ui.tune.web.searches": " Websuchen: {n}",
|
|
256
|
+
"ui.tune.web.many": " mehr als {limit} Seiten einer Website in einer Sitzung: ein Konnektor ist der schonende Weg (strom connector new)",
|
|
253
257
|
"ui.tune.signals": "Über dem Üblichen desselben Agenten und Modells:",
|
|
254
258
|
"ui.tune.signals.none": "Nichts über dem Üblichen desselben Agenten und Modells.",
|
|
255
259
|
"ui.tune.sig.M1": " {scope}: Kosten pro Scan {value}, {ratio}× das Übliche ({base})",
|
|
@@ -265,6 +269,7 @@
|
|
|
265
269
|
"ui.tune.sig.M9": " {scope}: {value} von {n} Negativbefunden auf schwachen Scans (Ansichten meist vergrößert)",
|
|
266
270
|
"ui.tune.sig.M10": " Leser ohne Ergebnis: {n} der letzten {of}",
|
|
267
271
|
"ui.tune.sig.M11": " {scope}: geladen und nie gelesen {value} ({n} von {of} Bildern)",
|
|
272
|
+
"ui.tune.sig.M12": " lange Strecken ohne Leeren: {n} der letzten {of} Sitzungen über {ctx} Tokens (etwa {views} Ansichten, {peak} Tokens)",
|
|
268
273
|
"ui.tune.short": "Noch zu wenig zum Vergleich: {list} — weitere Sitzungen bringen es.",
|
|
269
274
|
"ui.tune.m.M1": "Kosten pro Scan",
|
|
270
275
|
"ui.tune.m.M2": "Ansichten pro Scan",
|
|
@@ -275,6 +280,7 @@
|
|
|
275
280
|
"ui.tune.m.M8": "Warten auf ein Archiv",
|
|
276
281
|
"ui.tune.m.M10": "Leser ohne Ergebnis",
|
|
277
282
|
"ui.tune.m.M11": "nie gelesene Bilder",
|
|
283
|
+
"ui.tune.m.M12": "lange Strecken",
|
|
278
284
|
"ui.tune.recommend": "Empfohlen, nicht von strom selbst gesetzt (ein Mensch entscheidet, oder tune.auto ist aus):",
|
|
279
285
|
"ui.tune.rec.A1": " {scope}: das ganze Bild in Lesegröße, eine Doppelseite in Hälften, ein Ausschnitt mindestens 1:1 — aus den Scans, die schon hier sind, keine Anfrage mehr",
|
|
280
286
|
"ui.tune.rec.A2": " kleinere Stapel: Scans pro Leser etwa {to} statt {from} — mehr Aufrufe, kleinerer Kontext",
|
|
@@ -315,6 +321,26 @@
|
|
|
315
321
|
"ui.tune.reset.scope.all": "alle Modelle",
|
|
316
322
|
"ui.tune.what.calibration": "die kalibrierten Größen",
|
|
317
323
|
"ui.tune.what.answer": "die Antwort auf {kind}",
|
|
324
|
+
"ui.tune.why.calibrated": "gemessen an {n} bekannten Einträgen",
|
|
325
|
+
"ui.tune.why.answered": "beantwortet",
|
|
326
|
+
"ui.tune.why.answered.terminal": "im Terminal beantwortet",
|
|
327
|
+
"ui.tune.why.answered.window": "in einem Fenster des Systems beantwortet",
|
|
328
|
+
"ui.tune.why.answered.app": "in der Strom-App beantwortet",
|
|
329
|
+
"ui.tune.why.measured": "aus den gemessenen Lesungen",
|
|
330
|
+
"ui.tune.why.last": "{n} der letzten {of}",
|
|
331
|
+
"ui.tune.why.of": "{n} von {of}",
|
|
332
|
+
"ui.tune.why.M5": "unsicher {value} gegenüber {base} der anderen Bücher (n={n})",
|
|
333
|
+
"ui.tune.why.M6": "vergrößerte Ansichten {value} gegenüber {base} (n={n})",
|
|
334
|
+
"ui.tune.why.M7": "das Portal gab {n}× keinen schärferen Ausschnitt",
|
|
335
|
+
"ui.tune.why.M8": "Sitzungen mit Warten auf das Limit des Archivs: {count}",
|
|
336
|
+
"ui.tune.why.M8.wait": "Sitzungen mit Warten auf das Limit des Archivs: {count} ({wait} min, erschöpft {later}×)",
|
|
337
|
+
"ui.tune.why.M11": "geladen und nie gelesen {value} ({count} Bilder)",
|
|
338
|
+
"ui.tune.why.M3": "Ansichten nach dem Leeren des Kontexts erneut geöffnet: {count} Leser",
|
|
339
|
+
"ui.tune.why.M4": "der Kontext wurde geleert: {count} Leser",
|
|
340
|
+
"ui.tune.why.M4.ctx": "der Kontext wurde geleert: {count} Leser, das erste Mal bei etwa {ctx} Tokens",
|
|
341
|
+
"ui.tune.why.M10": "Leser ohne Ergebnis: {count}",
|
|
342
|
+
"ui.tune.why.A3": "der Kontext wurde geleert: {count} Leser, das erste Mal bei etwa {ctx} Tokens, eine Ansicht eines Lesers etwa {view} Tokens",
|
|
343
|
+
"ui.tune.why.A3.long": "der Kontext wurde nie geleert und wuchs doch über {ctx} Tokens: {count} Sitzungen, eine Ansicht eines Lesers etwa {view} Tokens",
|
|
318
344
|
"ui.tune.unknownKey": "Agent und Modell nicht aufgezeichnet (ältere Aufzeichnungen)",
|
|
319
345
|
"ui.o.views": "Scans",
|
|
320
346
|
"ui.settings.views": "Das Lesen der Scans abstimmen ({state})",
|
|
@@ -327,6 +353,8 @@
|
|
|
327
353
|
"ui.doc.tuneworse": "nach der Selbstabstimmung",
|
|
328
354
|
"ui.doc.tuneworse.a": "{scope}: seit der Änderung von strom am {at} ({what}) schlechter gelesen — {metric} {before} → {after} ({nb} Scans davor, {na} danach); Zurücksetzen empfohlen",
|
|
329
355
|
"ui.doc.tuneworse.b": "{scope}: seit der Änderung von strom am {at} ({what}) teurer — {before} → {after} je Scan ({nb} Scans davor, {na} danach), die Lesungen nicht sicherer; Behalten empfohlen (sie diente der Genauigkeit), Zurücksetzen bleibt möglich",
|
|
356
|
+
"ui.doc.web": "Agenten im Web",
|
|
357
|
+
"ui.doc.web.many": "viele Seiten einer Website in einer Sitzung über die eigenen Webwerkzeuge eines Agenten: {list} — ein Konnektor schont die Website mehr",
|
|
330
358
|
"ui.setup.level": "Was darf der Agent tun, ohne nachzufragen?",
|
|
331
359
|
"ui.setup.level.ask": "Mich bei allem außerhalb der Forschung fragen",
|
|
332
360
|
"ui.setup.level.auto": "Selbstständig arbeiten – nur bei riskanten Schritten fragen (empfohlen)",
|
|
@@ -418,6 +446,7 @@
|
|
|
418
446
|
"ui.run.start.session": "▶ {session} · {task} {what}",
|
|
419
447
|
"ui.run.parked": " · {task} zurückgestellt: {n} Sitzungen hintereinander haben nichts erfasst",
|
|
420
448
|
"ui.run.denied": " · Berechtigungen verweigert {n}×: {what}",
|
|
449
|
+
"ui.run.refused": " · strom hat {n}× abgelehnt (die Grenze von {per} Webanfragen an einen Server in einer Sitzung oder die des Servers): {what}",
|
|
421
450
|
"session.user": "vom Benutzer angehalten",
|
|
422
451
|
"session.run": "der Lauf brach ab, bevor die Sitzung endete (unterbrochen, oder der Computer wurde ausgeschaltet)",
|
|
423
452
|
"session.chat": "das Gespräch endete, bevor die Sitzung geschlossen wurde",
|
|
@@ -434,7 +463,7 @@
|
|
|
434
463
|
"ui.doc.disk": "Platz neben den Forschungen",
|
|
435
464
|
"ui.doc.disk.ok": "{size} neben den Forschungen, in den Grenzen",
|
|
436
465
|
"ui.doc.disk.tree": "{name}: {size} lassen sich freigeben (darin: strom tidy)",
|
|
437
|
-
"ui.doc.disk.fix": "strom tidy im Stammbaum (im Menü Einstellungen → Speicherplatz) – fragt zuerst",
|
|
466
|
+
"ui.doc.disk.fix": "strom tidy im Stammbaum (im Menü Einstellungen → Wartung → Speicherplatz) – fragt zuerst",
|
|
438
467
|
"ui.compact.done": "Die Geschichte des Stammbaums gepackt: .git {before} → {after}. An der Forschung hat sich nichts geändert.",
|
|
439
468
|
"ui.compact.small": "Die Geschichte des Stammbaums ist klein ({size}): nichts zu packen.",
|
|
440
469
|
"ui.compact.busy": "Am Stammbaum wird gearbeitet: seine Geschichte wird gepackt, wenn die Arbeit endet.",
|
|
@@ -682,6 +711,8 @@
|
|
|
682
711
|
"ui.run.follow": "Die Arbeit währenddessen live in der Strom-App verfolgen?",
|
|
683
712
|
"ui.run.follow.later": "Die Strom-App öffnet sich, wenn der Agent seine erste Sitzung beginnt.",
|
|
684
713
|
"ui.consent.host.pace": "Eigenes Tempo für {host}: mindestens {seconds} s zwischen zwei Anfragen, {cap}. Zu schnelles Laden bremst das Archiv für alle und kann zur Sperre der eigenen IP-Adresse führen – so einstellen?",
|
|
714
|
+
"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?",
|
|
715
|
+
"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?",
|
|
685
716
|
"ui.pace.cap": "höchstens {n} pro Stunde",
|
|
686
717
|
"ui.pace.nocap": "ohne Stundenlimit",
|
|
687
718
|
"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)",
|
|
@@ -904,7 +935,7 @@
|
|
|
904
935
|
"ui.tidy.done": "✓ {size} freigegeben. Ab jetzt hält strom es nach jeder Sitzung selbst in Ordnung.",
|
|
905
936
|
"ui.tidy.no": "Nichts wurde gelöscht.",
|
|
906
937
|
"ui.consent.tidy": "Etwa {size} neben der Forschung {name} freigeben (alte Sitzungsprotokolle, Ansichten von Scans, längst geschriebene Sendungen)? Die Forschung und ihre Scans bleiben.",
|
|
907
|
-
"ui.tidy.hint": "Neben der Forschung hält strom {strom}, davon lassen sich {size} freigeben: strom tidy (im Menü Einstellungen → Speicherplatz)",
|
|
938
|
+
"ui.tidy.hint": "Neben der Forschung hält strom {strom}, davon lassen sich {size} freigeben: strom tidy (im Menü Einstellungen → Wartung → Speicherplatz)",
|
|
908
939
|
"ui.error.consent": "dafür braucht es eine Zustimmung – {question}",
|
|
909
940
|
"ui.error.consent.hint": "im eigenen Terminal ausführen: {set}",
|
|
910
941
|
"ui.status.disk": "Auf der Festplatte: die Forschung {research} · daneben hält strom {strom}",
|
|
@@ -1087,7 +1118,7 @@
|
|
|
1087
1118
|
"ui.setup.app.archive": "✓ Die Strom-App ist auf diesem Computer – das Menü öffnet die Forschung darin.",
|
|
1088
1119
|
"ui.setup.stromapp.archive": "Die Strom-App (kostenlos, im Browser) zeigt die Forschung als Stammbaum – jeder Eintrag mit seinem aus dem Scan geschnittenen Bild, die Geschichten der Vorfahren. Soll sie genutzt werden?",
|
|
1089
1120
|
"ui.settings.wizard.archive": "Sprache, Ordner, Verknüpfung, Strom-App… (Einrichtung)",
|
|
1090
|
-
"ui.menu.settings.archive": "Einstellungen: Sprache, Meldungen, Archiv oder Forschung,
|
|
1121
|
+
"ui.menu.settings.archive": "Einstellungen: Sprache, Meldungen, Archiv oder Forschung, Wartung",
|
|
1091
1122
|
"ui.menu.more.archive.noapp": "Zum Archiv hinzufügen: Unterlagen, ein anderer Stammbaum",
|
|
1092
1123
|
"ui.menu.more.archive": "Zum Archiv hinzufügen: Unterlagen, Änderungen aus der Strom-App",
|
|
1093
1124
|
"ui.menu.app.tip.archive": "Tipp: die Forschung als Stammbaum in der Strom-App – Wahl {key}.",
|
|
@@ -1212,6 +1243,9 @@
|
|
|
1212
1243
|
"ui.archives.agentbrowser.off": "Zurück zum Browser nur für Archive über den Browser?",
|
|
1213
1244
|
"ui.consent.remote": "Die Claude-Code-Sitzungen, die strom öffnet, mit Remote Control starten, damit sie sich auf claude.ai oder in der Claude-App auf dem Telefon verfolgen und steuern lassen?",
|
|
1214
1245
|
"ui.consent.addons": "Dem allein arbeitenden Agenten erlauben, die persönlichen Erweiterungen aus seinen Einstellungen zu laden (Skills, Plugins, MCP-Server – auch E-Mail oder Dokumente), wie im Chat? Er arbeitet dabei unbeaufsichtigt.",
|
|
1246
|
+
"ui.consent.effort": "Den Sitzungen von {agent}, die strom startet, den Denkaufwand {effort} geben? Ein höherer Denkaufwand (high, xhigh) verbraucht die Limits des Abonnements schneller.",
|
|
1247
|
+
"ui.consent.webPerHost": "Dem eigenen Webabruf des Agenten bis zu {n} Anfragen an eine Website (ihre Server und Spiegel zusammen) in einer Sitzung erlauben (jetzt {now})? Mehr Anfragen belasten die Website stärker; mehr Seiten einer Website gehen schonender über einen Connector.",
|
|
1248
|
+
"ui.consent.effort.run": "{agent} für diesen Lauf mit dem Denkaufwand {effort} allein arbeiten lassen, höher als in der Einstellung ({now})? Ein höherer Denkaufwand (high, xhigh) verbraucht die Limits des Abonnements schneller.",
|
|
1215
1249
|
"ui.consent.edits.user": "Sollen eigene Änderungen in der Strom-App vor dem gelten, was ein Eintrag sagt? Die Angabe aus dem Eintrag wird dann mit Begründung zurückgezogen (ein Abgleich lässt sich zurücknehmen).",
|
|
1216
1250
|
"ui.consent.review.off": "Was die Strom-App sendet, gleich übernehmen, ohne bei jeder Sendung zu fragen? Hinzugefügtes wird übernommen, Hinweise korrigiert, eine Änderung einer durch einen Eintrag belegten Angabe wird ein Widerspruch zur Entscheidung; strom sync undo nimmt eine Sendung zurück.",
|
|
1217
1251
|
"ui.consent.mode.archive": "Die Forschung „{name}“ zu einem Archiv machen? Die Daten kommen aus der Strom-App und werden übernommen, wie sie gesendet werden; kein Agent arbeitet daran, ihre Aufgaben warten zurückgestellt. Die Arbeit mit einem Agenten lässt sich wieder einschalten.",
|
|
@@ -1402,11 +1436,18 @@
|
|
|
1402
1436
|
"ui.settings.hooks": "Nachrichten über das Gespeicherte (Hooks): {state}",
|
|
1403
1437
|
"ui.settings.on": "an",
|
|
1404
1438
|
"ui.settings.off": "aus",
|
|
1405
|
-
"ui.settings.remote": "
|
|
1439
|
+
"ui.settings.remote": "Remote Control in der Claude-App (das Gespräch mit dem Agenten auch vom Handy): {state}",
|
|
1406
1440
|
"ui.settings.remote.about": "Eingeschaltet lassen sich die Claude-Code-Sitzungen, die strom startet – Gespräche und allein arbeiten –, auf claude.ai oder in der Claude-App auf dem Telefon verfolgen und steuern.",
|
|
1407
1441
|
"ui.settings.remote.on": "Einschalten?",
|
|
1408
1442
|
"ui.settings.remote.off": "Ausschalten?",
|
|
1409
1443
|
"ui.settings.archives": "Archive: Anmeldungen, Zustimmung zum Herunterladen",
|
|
1444
|
+
"ui.settings.wizard.what": "Was einstellen?",
|
|
1445
|
+
"ui.settings.wizard.all": "Alles, Schritt für Schritt (die Einrichtung)",
|
|
1446
|
+
"ui.settings.maintenance": "Wartung: Prüfung der Installation, Speicherplatz",
|
|
1447
|
+
"ui.settings.maintenance.tidy": "Wartung: Prüfung der Installation, Speicherplatz ({size} lassen sich freigeben)",
|
|
1448
|
+
"ui.settings.maintenance.update": "Wartung: Prüfung der Installation, Speicherplatz, Aktualisierung auf {version}",
|
|
1449
|
+
"ui.maintenance.title": "Wartung",
|
|
1450
|
+
"ui.maintenance.tidy": "Speicherplatz: strom hält {size} neben der Forschung",
|
|
1410
1451
|
"ui.alone.title": "Der Agent allein",
|
|
1411
1452
|
"ui.alone.minutes": "Zeit für eine Aufgabe: {minutes} Min.",
|
|
1412
1453
|
"ui.alone.minutes.ask": "Wie viele Minuten darf eine Aufgabe dauern? (5–600; 0 geht zurück)",
|
|
@@ -1437,7 +1478,7 @@
|
|
|
1437
1478
|
"ui.hooks.nothing": "keine",
|
|
1438
1479
|
"ui.menu.noagent": "Auf dem Computer ist noch kein KI-Agent – die Forschung ist seine Arbeit. Punkt 1 installiert einen.",
|
|
1439
1480
|
"ui.menu.getagent": "Den KI-Agenten installieren oder wählen",
|
|
1440
|
-
"ui.menu.update.where": "Eine neue Version von strom ist da: {version} – zu aktualisieren in den Einstellungen (Punkt {key}).",
|
|
1481
|
+
"ui.menu.update.where": "Eine neue Version von strom ist da: {version} – zu aktualisieren in den Einstellungen (Punkt {key}) → Wartung.",
|
|
1441
1482
|
"ui.more.noagent": "Der Agent nimmt es auf, sobald er auf dem Computer ist (Punkt 1 im Menü).",
|
|
1442
1483
|
"ui.menu.noagent.chosen": "Der KI-Agent dieser Forschung ist nicht auf dem Computer – Punkt 1 wählt einen anderen.",
|
|
1443
1484
|
"task.answer": "Antwort des Nutzers (auf: {asked}): {answer}",
|
|
@@ -1473,6 +1514,10 @@
|
|
|
1473
1514
|
"log.media": "Neue Bilder: {name} (Bilder {images})",
|
|
1474
1515
|
"log.media.one": "Neues Bild: {name} (Bild {image})",
|
|
1475
1516
|
"log.media.loose": "Neue Bilder: {n}",
|
|
1517
|
+
"log.media.part.one": "Bildausschnitt in höherer Auflösung: {name} (Bild {image})",
|
|
1518
|
+
"log.media.part": "Bildausschnitte in höherer Auflösung: {name} (Bilder {images})",
|
|
1519
|
+
"log.media.part.loose": "Bildausschnitte in höherer Auflösung: {n}",
|
|
1520
|
+
"log.net.cap": "Archiv {host} nahe an seiner Grenze pro die Stunde: {used} von {cap} Anfragen pro Stunde verbraucht, die nächste frei um {time}; inzwischen geht die Forschung mit dem weiter, was vorliegt",
|
|
1476
1521
|
"log.reading": "Durchgelesen: {name} (Bilder {images})",
|
|
1477
1522
|
"log.task.add": "Neue Aufgabe: {name}",
|
|
1478
1523
|
"log.task.done": "Erledigt: {name}",
|
package/assets/method/locate.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Method: locating records
|
|
2
2
|
|
|
3
|
-
Before anything can be proven
|
|
3
|
+
Before anything can be proven, know where the records are.
|
|
4
4
|
|
|
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`.
|
package/assets/method/reading.md
CHANGED
|
@@ -40,21 +40,20 @@ never open again a view cleared from your context — your notes hold it.
|
|
|
40
40
|
again comes from it. Whole images first, a part only where entries need
|
|
41
41
|
it: an archive's hourly cap stops the rest.
|
|
42
42
|
<!-- end -->
|
|
43
|
-
- **Browsing a book is a reader's job**: `strom read B0001
|
|
44
|
-
--question "…"`
|
|
45
|
-
|
|
46
|
-
found, compact: the found and
|
|
47
|
-
where nothing was found (a
|
|
48
|
-
|
|
49
|
-
(`--match <surname
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
question.) **A reader is told exactly what to write down** — page numbers
|
|
43
|
+
- **Browsing a book or a range is a reader's job**: `strom read B0001
|
|
44
|
+
--images 40-69 --question "…"` (small script: `--half both`) — readers in
|
|
45
|
+
batches of ten, each with the full question, their reports in
|
|
46
|
+
notes/readings/. It ends with what they found, compact: the found and
|
|
47
|
+
unclear entries whole, what was illegible where nothing was found (a
|
|
48
|
+
possible match often hides there — look at it), the gaps in the book.
|
|
49
|
+
Later: `strom readings` (`--match <surname>`, `--list`; one image's block:
|
|
50
|
+
`strom readings B0001 --image 57`) — never the reports whole. Images read
|
|
51
|
+
before are said first: another question or a blind check is fine, the same
|
|
52
|
+
one is not. Run it in the foreground and let it finish (often ten minutes or
|
|
53
|
+
more): what is left in the background ends with your turn.
|
|
54
|
+
A subagent (strom-scan-reader, called without `model`) reads only crops of the
|
|
55
|
+
entries found, about six scans each with the whole question — never a range
|
|
56
|
+
`strom read` can browse. **A reader is told exactly what to write down** — page numbers
|
|
58
57
|
and headings only, one surname's entries, one entry whole — and transcribes
|
|
59
58
|
nothing else. Record each report as it comes back, before the next readers.
|
|
60
59
|
Only the entries that will be cited need your own eyes, at full resolution.
|
package/dist/agents/effort.js
CHANGED
|
@@ -27,6 +27,38 @@ export function offeredEfforts(agent) {
|
|
|
27
27
|
export function hasEffort(agent) {
|
|
28
28
|
return !!EFFORTS[agent];
|
|
29
29
|
}
|
|
30
|
+
/** The levels from the least thinking to the most: a higher one uses up a plan's limits sooner. */
|
|
31
|
+
const EFFORT_ORDER = ["none", "minimal", "low", "medium", "high", "xhigh", "max", "ultra"];
|
|
32
|
+
/** What a session runs with where neither strom nor the agent's own settings say a level: the agents' usual default. */
|
|
33
|
+
const USUAL_EFFORT = "medium";
|
|
34
|
+
/**
|
|
35
|
+
* Whether `next` makes the sessions think more than `now` (each undefined: the agent's own setting, `own` when strom
|
|
36
|
+
* knows it, else the agents' usual default) — raising it is the person's decision alone, lowering it anyone's.
|
|
37
|
+
*/
|
|
38
|
+
export function raisesEffort(next, now, own) {
|
|
39
|
+
const rank = (e) => EFFORT_ORDER.indexOf((e ?? own ?? USUAL_EFFORT).toLowerCase());
|
|
40
|
+
return rank(next) > rank(now);
|
|
41
|
+
}
|
|
42
|
+
/** The level a session's own extra arguments set (Codex `-c model_reasoning_effort=…`, `--effort`, `--reasoning-effort`). */
|
|
43
|
+
export function effortInArgs(agent, extra) {
|
|
44
|
+
if (agent === "codex")
|
|
45
|
+
return codexEffortArg(extra);
|
|
46
|
+
const flag = agent === "grok" ? "--reasoning-effort" : agent === "claude" || agent === "antigravity" ? "--effort" : undefined;
|
|
47
|
+
if (!flag || !extra)
|
|
48
|
+
return undefined;
|
|
49
|
+
let found;
|
|
50
|
+
for (let i = 0; i < extra.length; i++) {
|
|
51
|
+
if (extra[i] === flag && extra[i + 1])
|
|
52
|
+
found = extra[i + 1];
|
|
53
|
+
else if (extra[i].startsWith(`${flag}=`))
|
|
54
|
+
found = extra[i].slice(flag.length + 1);
|
|
55
|
+
}
|
|
56
|
+
return found?.trim() || undefined;
|
|
57
|
+
}
|
|
58
|
+
/** The agent's own setting for its effort where strom knows it (Codex's config.toml; read only). */
|
|
59
|
+
export function ownEffort(env, agent) {
|
|
60
|
+
return agent === "codex" ? readCodexConfig(env).effort : undefined;
|
|
61
|
+
}
|
|
30
62
|
/** The agent's own switch for a session's effort (none: the agent's own settings hold). */
|
|
31
63
|
export function effortArgs(agent, effort) {
|
|
32
64
|
if (!effort || !EFFORTS[agent]?.includes(effort))
|
package/dist/agents/files.js
CHANGED
|
@@ -16,7 +16,10 @@ import { agentAppUrl, appSite } from "../core/stromapp.js";
|
|
|
16
16
|
import { configDir } from "../core/paths.js";
|
|
17
17
|
import { agentBrowser } from "../core/connector.js";
|
|
18
18
|
import { CHROME_ALLOW, CHROME_DENY, chromeDomain } from "../core/browser.js";
|
|
19
|
-
import { claudeScanReader, opencodeScanReader, SCAN_READER, treeReading } from "./scanreader.js";
|
|
19
|
+
import { claudeScanReader, opencodeScanReader, SCAN_READER, scanReaderModel, treeReading } from "./scanreader.js";
|
|
20
|
+
import { claudeWebHooks, grokWebHooks, webRuleLines } from "../core/web.js";
|
|
21
|
+
import { claudeDelegateHooks } from "../core/delegate.js";
|
|
22
|
+
import { writeShim } from "../core/self.js";
|
|
20
23
|
export const MARKER = "<!-- strom: generated above this line (strom agents sync); your own notes below are kept -->";
|
|
21
24
|
function agentsMd(tree) {
|
|
22
25
|
const lang = langName(tree.config.lang);
|
|
@@ -49,12 +52,15 @@ the researcher; \`strom\` is your only way to read and change the research.
|
|
|
49
52
|
your own working notes in \`notes/\`. Scans are looked at through views:
|
|
50
53
|
\`strom media view B0001:57 --half left\` writes one to \`.strom/views/\`;
|
|
51
54
|
the views of a scan or a batch come in one call (\`B0001:57-60 --half both\`).
|
|
55
|
+
A text in those files: \`strom grep "<text>"\` (each line with its file and
|
|
56
|
+
number) — never read a big file in pieces.
|
|
52
57
|
7. Run strom commands on their own — no pipes (\`| head\`, \`| grep\`): output is
|
|
53
58
|
already short, listings take \`--limit\` and \`--page\`, and piped commands may
|
|
54
59
|
be refused by your permissions.
|
|
55
60
|
8. Other agents may work on this tree too (Claude Code, Codex, Antigravity,
|
|
56
61
|
OpenCode, Grok — the user's choice). \`strom\` shows who is working now; never take a task
|
|
57
62
|
another one has started.
|
|
63
|
+
9. ${webRuleLines(new Settings(tree.env, {}).webPerHost(tree.config), "`")}
|
|
58
64
|
|
|
59
65
|
## Working with the user
|
|
60
66
|
|
|
@@ -141,7 +147,7 @@ Claude Code: use Bash for \`strom\` commands only; read images and documents
|
|
|
141
147
|
with the Read tool. You can choose a model for a subagent: delegate reading as
|
|
142
148
|
below, not the way "Reading scans" in AGENTS.md says for other agents.
|
|
143
149
|
|
|
144
|
-
${PROFILES.claude.instructions(models, treeReading(tree, "claude"))}
|
|
150
|
+
${PROFILES.claude.instructions({ ...models, vision: scanReaderModel(tree, "claude") }, treeReading(tree, "claude"))}
|
|
145
151
|
${MARKER}
|
|
146
152
|
`;
|
|
147
153
|
}
|
|
@@ -215,6 +221,11 @@ function treeRules(tree, agent) {
|
|
|
215
221
|
],
|
|
216
222
|
};
|
|
217
223
|
}
|
|
224
|
+
/** Claude Code's hooks of the tree: strom's web hook and its delegate hook. */
|
|
225
|
+
function claudeHooks(root) {
|
|
226
|
+
const web = claudeWebHooks(root);
|
|
227
|
+
return { ...web, PreToolUse: [...(web.PreToolUse ?? []), ...claudeDelegateHooks(root).PreToolUse] };
|
|
228
|
+
}
|
|
218
229
|
/** Permissions for Claude Code in this tree (paths of this computer). */
|
|
219
230
|
export function claudeSettings(tree) {
|
|
220
231
|
const lead = new Settings(tree.env, {}).models("claude", tree.config).lead;
|
|
@@ -222,6 +233,9 @@ export function claudeSettings(tree) {
|
|
|
222
233
|
permissions: treeRules(tree, "claude"),
|
|
223
234
|
// The user's model: the desktop app cannot be given one when it opens (the CLI is, with --model).
|
|
224
235
|
...(lead ? { model: lead } : {}),
|
|
236
|
+
// Before each web fetch and search: recorded, counted and paced like strom's own requests (core/web.ts); before
|
|
237
|
+
// each call of a subagent: strom's delegates on the model strom set for them (core/delegate.ts).
|
|
238
|
+
hooks: claudeHooks(tree.root),
|
|
225
239
|
};
|
|
226
240
|
}
|
|
227
241
|
/**
|
|
@@ -286,6 +300,8 @@ export function opencodeConfig(tree) {
|
|
|
286
300
|
// its own rules and instructions
|
|
287
301
|
"opencode.json": "deny",
|
|
288
302
|
...Object.fromEntries(["AGENTS.md", "CLAUDE.md", ".claude/*"].map((f) => [f, "deny"])),
|
|
303
|
+
// a connector it builds for an archive the research needs (strom connector new), in a run too (ask → deny there)
|
|
304
|
+
...(shared ? { [`${abs(path.join(shared, "plugins", "connectors"))}/*`]: "allow" } : {}),
|
|
289
305
|
},
|
|
290
306
|
external_directory: {
|
|
291
307
|
"*": "ask",
|
|
@@ -354,6 +370,7 @@ function dropAgentFiles(tree) {
|
|
|
354
370
|
["opencode.json", JSON.stringify(opencodeConfig(tree), null, 2) + "\n"],
|
|
355
371
|
[path.join(".grok", "config.toml"), grokConfig(tree)],
|
|
356
372
|
[path.join(".grok", "rules", "strom.md"), GROK_RULES],
|
|
373
|
+
[GROK_HOOKS, JSON.stringify(grokWebHooks(tree.root), null, 2) + "\n"],
|
|
357
374
|
];
|
|
358
375
|
for (const [rel, content] of generated) {
|
|
359
376
|
const file = path.join(tree.root, rel);
|
|
@@ -378,9 +395,11 @@ function dropAgentFiles(tree) {
|
|
|
378
395
|
}
|
|
379
396
|
return gone;
|
|
380
397
|
}
|
|
398
|
+
/** Grok Build's own hooks of the tree: strom's before each web fetch and search (core/web.ts). */
|
|
399
|
+
export const GROK_HOOKS = path.join(".grok", "hooks", "strom.json");
|
|
381
400
|
/** Claude Code's subagent for reading scans, in the tree. */
|
|
382
401
|
export const CLAUDE_SCAN_READER = path.join(".claude", "agents", `${SCAN_READER}.md`);
|
|
383
|
-
export const AGENT_FILES = ["AGENTS.md", "CLAUDE.md", path.join(".claude", "settings.json"), CLAUDE_SCAN_READER, "opencode.json", path.join(".grok", "config.toml"), path.join(".grok", "rules", "strom.md")];
|
|
402
|
+
export const AGENT_FILES = ["AGENTS.md", "CLAUDE.md", path.join(".claude", "settings.json"), CLAUDE_SCAN_READER, "opencode.json", path.join(".grok", "config.toml"), path.join(".grok", "rules", "strom.md"), GROK_HOOKS];
|
|
384
403
|
export function syncAgentFiles(tree) {
|
|
385
404
|
// an archive: no agent works on it, and nothing of one shows in its folder (Milan's decision, 2026-10-03) — strom's own
|
|
386
405
|
// files of the agents go (what a person wrote in them stays); research switched on writes them again
|
|
@@ -410,6 +429,16 @@ export function syncAgentFiles(tree) {
|
|
|
410
429
|
write("opencode.json", JSON.stringify(opencodeConfig(tree), null, 2) + "\n");
|
|
411
430
|
write(path.join(".grok", "config.toml"), grokConfig(tree));
|
|
412
431
|
write(path.join(".grok", "rules", "strom.md"), GROK_RULES);
|
|
432
|
+
write(GROK_HOOKS, JSON.stringify(grokWebHooks(tree.root), null, 2) + "\n");
|
|
433
|
+
// the strom the agent hooks name (the tree's .strom/bin, never committed) — there also for a conversation strom did not start
|
|
434
|
+
if (!tree.dryRun) {
|
|
435
|
+
try {
|
|
436
|
+
writeShim(tree.root);
|
|
437
|
+
}
|
|
438
|
+
catch {
|
|
439
|
+
// a hook that finds no strom lets the call go
|
|
440
|
+
}
|
|
441
|
+
}
|
|
413
442
|
for (const [rel, ours] of OBSOLETE) {
|
|
414
443
|
const file = path.join(tree.root, rel);
|
|
415
444
|
let text;
|
package/dist/agents/profiles.js
CHANGED
|
@@ -16,12 +16,22 @@ const WORDS = ["no", "one", "two", "three", "four", "five", "six", "seven", "eig
|
|
|
16
16
|
export function inWords(n) {
|
|
17
17
|
return WORDS[n] ?? String(n);
|
|
18
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* What a delegate of the agent's general kind (Claude Code's general-purpose, Explore) is told first: it gets no brief
|
|
21
|
+
* and knows nothing of strom, and in a run nobody watches whatever it tries beyond strom is refused (found in a live
|
|
22
|
+
* run: 5 of 6 refused commands were delegates' — grep with awk, $(…), a variable — and one read three big inputs in
|
|
23
|
+
* 110 pieces).
|
|
24
|
+
*/
|
|
25
|
+
export const DELEGATE_SHEET = 'A family research kept with strom: you read and report, you never write to it. Run each `strom …` command on its own — no pipes, `;`, `&&`, `$(…)`, variables, awk or any other program: they are refused. Read opens inputs/, notes/, output/ and .strom/views/ only, never data/. A text in those files: `strom grep "<text>" [--in inputs|notes|I…] [--context 2]` — never Read a big file in pieces.';
|
|
19
26
|
/** The scans a call gives at four views each (halves and crops). */
|
|
20
27
|
const perCall = (n) => Math.max(1, Math.floor(n.viewsPerCall / 4));
|
|
21
28
|
function delegationRules(n) {
|
|
22
29
|
const first = inWords(n.batch);
|
|
23
30
|
return `- Browsing a book, an index or a range of images ("is our surname on this page?")
|
|
24
|
-
|
|
31
|
+
goes to \`strom read\` (by halves: \`--half both\`); a delegate reads only crops
|
|
32
|
+
of the entries found. Anything self-contained that returns little is delegated.
|
|
33
|
+
- A delegate other than strom-scan-reader (text, print, a search) gets no brief:
|
|
34
|
+
begin its prompt with this, word for word — "${DELEGATE_SHEET}"
|
|
25
35
|
- About ${first} scans (images B…:n) per delegate, four views each (halves and
|
|
26
36
|
crops); tell it to write down what each call gave before the next, to stop
|
|
27
37
|
at about ${n.viewsStop} views and return what it has, and never to open again a view
|
|
@@ -93,13 +103,15 @@ comes back to you. Choose the model by the kind of work:
|
|
|
93
103
|
|
|
94
104
|
| work | model |
|
|
95
105
|
|---|---|
|
|
96
|
-
| handwriting: registers, indexes, land books, any scan read closely | \`${m.vision
|
|
97
|
-
| print and type: documents of the 20th century, catalogues, web pages, big text files | \`${m.text ?? "sonnet"}\` |
|
|
98
|
-
| mechanical: downloads, renaming, counting
|
|
106
|
+
| handwriting: registers, indexes, land books, any scan read closely | \`strom-scan-reader\`, ${m.vision ? `on \`${m.vision}\`` : "on your own model"} — never cheaper |
|
|
107
|
+
| print and type: documents of the 20th century, catalogues, web pages, big text files (the lines \`strom grep\` found) | \`${m.text ?? "sonnet"}\` |
|
|
108
|
+
| mechanical: downloads, renaming, counting | \`${m.cheap ?? "haiku"}\` |
|
|
109
|
+
| a text in inputs/ or notes/ | nobody — \`strom grep\`, one call |
|
|
99
110
|
| judgement: identity, conflicts, which task next, writing to strom | nobody — you |
|
|
100
111
|
|
|
101
112
|
Scans are read by this tree's subagent type \`strom-scan-reader\` (strom and the
|
|
102
|
-
file reader only, so it starts small)
|
|
113
|
+
file reader only, so it starts small). Call it without \`model\`: strom set its
|
|
114
|
+
model (the user's choice for handwriting), and a call naming another is refused.
|
|
103
115
|
|
|
104
116
|
${delegationRules(n)}
|
|
105
117
|
- Send independent batches in ONE message so they run in parallel.
|
|
@@ -28,6 +28,9 @@ from your context to make room, your notes stay. Never open a view again because
|
|
|
28
28
|
notes hold what it gave. After about ${n.viewsStop} views, stop and report what you have. \`strom read …\` hands
|
|
29
29
|
a range to strom's own readers: only when the question asks for it (in the foreground; let it finish).
|
|
30
30
|
|
|
31
|
+
Commands: \`strom …\` only, each on its own (no pipes, \`;\`, \`$(…)\` or other programs: refused). A text in
|
|
32
|
+
the research's files (inputs/, notes/): \`strom grep "<text>"\` — never Read a big file in pieces.
|
|
33
|
+
|
|
31
34
|
Images: you never fetch them (no \`strom fetch\`) and never wait or sleep for an archive. An image not
|
|
32
35
|
here, or too small to read: say which in your report — the agent who sent you fetches them.
|
|
33
36
|
|
|
@@ -57,7 +60,7 @@ export function scanReaderTools(platform = process.platform) {
|
|
|
57
60
|
}
|
|
58
61
|
/** The numbers of an agent's reading in this tree (what strom tuned for its agent and model; a session: as at its start). */
|
|
59
62
|
export function treeReading(tree, agent, since) {
|
|
60
|
-
return readingFor(new Settings(tree.env, {}), agent, tree.config, { since });
|
|
63
|
+
return readingFor(new Settings(tree.env, {}), agent, tree.config, { since, root: tree.root });
|
|
61
64
|
}
|
|
62
65
|
/** .claude/agents/strom-scan-reader.md: a conversation (the terminal, the desktop app) finds it in the tree. */
|
|
63
66
|
export function claudeScanReader(tree) {
|