Přeskočit na obsah

Tato stránka byla automaticky přeložena z angličtiny, jediného jazyka, ve kterém se tento web píše. Číst originál.

HTTP API: recover

Zatoulané soubory, které po sobě v úložištích záznamů nechá zabitá publikace, přerušené přejmenování nebo nedokončený build webu, klasifikované podle hodin a obsahu a uklizené právě jednou. Toto je schopnost, na které stojí `majordomus recover` (ADR 0040): příkaz už sám nerozhoduje, co je zatoulaný soubor, ale ptá se.

Vykresleno z docs/generated/openapi.json, který spustitelný soubor generuje ze svého registru schopností a CI jej odmítne, je-li zastaralý. Surový dokument je na /openapi.json; běžící server servíruje stejný dokument na vlastní /openapi.json a Swagger UI na /swagger.

recover

Zatoulané soubory, které po sobě v úložištích záznamů nechá zabitá publikace, přerušené přejmenování nebo nedokončený build webu, klasifikované podle hodin a obsahu a uklizené právě jednou. Toto je schopnost, na které stojí `majordomus recover` (ADR 0040): příkaz už sám nerozhoduje, co je zatoulaný soubor, ale ptá se.

POST /api/v1/recover/orphans recover.orphans

Klasifikovat každý zbloudilý soubor úložišť záznamů a uklidit ty, které nejsou ničí

Projde publikační temp soubory každého úložiště záznamů, rename temp soubory pod lokální polovinou vrstvy a sledovanou sekcí relací a stagingové adresáře generátoru webu v kořeni repozitáře; každému dá verdikt podle jeho stáří a pak obsahu; a pokud volání není kontrola, odstraní ty, o nichž verdikt říká, že je nic nedrží. Nic se nemaže jen proto, že to nebylo rozpoznáno: temp, který drží jedinou kopii záznamu, se hlásí jako `incomplete` a nechává se volajícímu k publikaci, obsah, který tato verze neumí klasifikovat, je `foreign` a zůstává přesně tam, kde je, kandidát, jehož stáří tato platforma neumí přečíst, je `unmeasurable` a nikdy kandidát, a žádný adresář se nikdy neodstraňuje. Práh je povinný a nemá výchozí hodnotu, protože úklid měřený proti chybějícímu prahu by shledal zastaralým každý soubor.

  • command
  • behaviorally_verified
  • vyžaduje se měření výkonu
  • cache vypnuta
  • nástroj MCP majordomus_recover_orphans

Tělo požadavku — RecoverOrphansInput, JSON

příklad check-one-second

{"older_than_seconds":1,"check":true}

příklad check-twelve-hours

{"older_than_seconds":43200,"check":true}

Vyzkoušejte

Port je ten, který server zalogoval; 8741 je ten, o který žádá jako první. Hodnoty jsou první příklad operace.

curl -s -X POST "http://127.0.0.1:8741/api/v1/recover/orphans" -H "content-type: application/json" -d '{"older_than_seconds":1,"check":true}'

Testováno v apps/majordomus-cli/tests/http_serve.rs, který přehrává routu s těmito hodnotami proti serveru na skutečném socketu.

Odpovědi

statustělovýznam
200 RecoverOrphansResult Klasifikovat každý zbloudilý soubor úložišť záznamů a uklidit ty, které nikomu nepatří: výsledek.
400 ErrorBody invalid_input: Vstup neodpovídá schématu: parametr špatného typu, neznámý parametr nebo hodnota, kterou schopnost odmítne.
404 ErrorBody not_found: Vstup pojmenovává něco, co repozitář nemá.
422 ErrorBody refused: Příkaz byl srozumitelný a byl odmítnut z důvodu, který uvádí zpráva.
500 ErrorBody internal: Schopnost selhala z vlastního důvodu; zpráva ho pojmenovává.
výchozí ErrorBody Jakékoli jiné selhání, které transport hlásí: 405 method_not_allowed pro jinou metodu na této cestě, 400 invalid_input pro tělo, které není objektem JSON.

Schémata

Komponenty, které používají jen operace tohoto tagu. Každý řádek je pole daného typu, jeho doc komentář je popis; typ vlastněný jinou stránkou na ni odkazuje.

RecoverOrphansInput

object
Vstup recover.orphans: jak starý musí být zatoulaný soubor a zda jednat.

use majordomus_cli::capability::builtin::recover::RecoverOrphansInput;

// The wire form the shell tool, an MCP client or an HTTP POST sends.
let act: RecoverOrphansInput =
    serde_json::from_str(r#"{"older_than_seconds":43200,"check":false}"#).unwrap();
assert_eq!(act.older_than_seconds, 43_200);
assert!(!act.check);

// `check` defaults to true, and that direction is deliberate: this capability deletes
// files, and a caller that forgets the field gets a plan rather than a sweep.
let forgot: RecoverOrphansInput =
    serde_json::from_str(r#"{"older_than_seconds":43200}"#).unwrap();
assert!(forgot.check, "the safe value is the default one");

// The threshold has no default at all. `session.stranded_after` is a policy value, and
// a reader that carried its own copy would be a second place the number lives.
assert!(serde_json::from_str::<RecoverOrphansInput>(r#"{"check":true}"#).is_err());

// Unknown fields are refused rather than ignored: a caller that misspells `check` is
// told so instead of having a sweep silently run.
assert!(serde_json::from_str::<RecoverOrphansInput>(
    r#"{"older_than_seconds":1,"chek":true}"#).is_err());
vlastnosttyppovinnépopis
older_than_seconds integer (uint64) ano Jak dlouho musel zbloudilý soubor zůstat nedotčen, aby se vůbec stal kandidátem, v sekundách. Povinné a na nule odmítnuté: shellový nástroj je řeší z session.stranded_after pomocí mj_pol_req, což selhává uzavřeně, a nic zde žádný nevymýšlí.
check boolean ne Klasifikovat a hlásit, nic nezapisovat. Výchozí, protože alternativa maže soubory.

Používá recover.orphans

RecoverOrphansResult

object
Co jeden průchod našel a co s tím udělal.

Počty se odvozují z strays, a ne akumulují vedle něj, takže čtenář může zprávu zkontrolovat sama proti sobě a povrch, který vykresluje seznam, se nemůže rozejít s povrchem, který vykresluje součet.

use majordomus_cli::capability::builtin::recover::RecoverOrphansResult;

let plan: RecoverOrphansResult = serde_json::from_str(r#"{
    "older_than_seconds": 43200, "check": true, "strays": [],
    "removable": 0, "removed": 0, "unmeasurable": 0
}"#).unwrap();
// a check never removes anything, whatever it found
assert_eq!(plan.removed, 0);
assert!(plan.check);
vlastnosttyppovinnépopis
older_than_seconds integer (uint64) ano Práh, proti kterému toto čištění měřilo, vrácený zpět, aby odmítnutí nebo verdikt pojmenovaly hodnotu, kterou volající skutečně dostal, ne tu, o které věří, že ji poslal.
check boolean ano Zda šlo o kontrolu. true znamená, že se nic nezapsalo.
zbloudilé pole Stray → Stray ano Každý nalezený zbloudilý soubor v pořadí podle cesty.
odstranitelné integer (uint) ano Kolik z nich by toto volání odstranilo, nebo odstranilo.
odstraněno integer (uint) ano Kolik jich skutečně odstranil. Při kontrole vždy 0.
neměřitelné integer (uint) ano Kolik kandidátů nešlo změřit, a proto zůstali beze změny.

Používá recover.orphans

Zbloudilé

object
Jeden zatoulaný soubor, jeho verdikt a důkazy, které jej vytvořily.

Nese se každé pole, které něco rozhodlo, protože pravidlo, podle kterého je tento příkaz tvarován, vyžaduje, aby hodnota, která rozhodla o verdiktu, byla viditelná dříve, než verdikt jedná: povrch, který by vytiskl „orphan“ bez stáří, epizody a souboru, který ji už drží, by žádal o důvěru, místo aby byl čten.

use majordomus_cli::capability::builtin::recover::{Stray, StrayKind, StrayVerdict};
use serde_json::json;

let s: Stray = serde_json::from_value(json!({
    "path": ".ai/repo/sessions/.tmp.a1b2c3",
    "kind": "publish_temp",
    "verdict": "orphan",
    "age_seconds": 90_000,
    "session_id": "s-0007",
    "published_at": ".ai/repo/sessions/2026-09-11--s-0007.md",
    "removable": true,
    "removed": false,
})).unwrap();
assert_eq!(s.verdict, StrayVerdict::Orphan);
assert_eq!(s.kind, StrayKind::PublishTemp);
// removable and removed are different facts: a check run reports the first and never
// the second, which is what makes `--check` readable as a plan rather than a report.
assert!(s.removable && !s.removed);

// and an unmeasurable one carries no age at all, rather than a zero that would read as
// "brand new" to anything that compared it with a threshold
let u: Stray = serde_json::from_value(json!({
    "path": ".mj-stage.xyz", "kind": "staging_dir", "verdict": "unmeasurable",
    "removable": false, "removed": false,
})).unwrap();
assert!(u.age_seconds.is_none());
vlastnosttyppovinnépopis
path string ano Cesta relativní k repozitáři. Nikdy absolutní: nález, který jmenuje disk, je nález, na který nikdo jiný nemůže reagovat (project.no-machine-paths).
druh StrayKind → StrayKind ano Který ze tří tvarů to je.
verdikt StrayVerdict → StrayVerdict ano O čem rozhodlo jeho čtení.
age_seconds integer | null ne Jak je starý, v sekundách. Chybí, když to platforma nedokázala říct, což je verdikt Unmeasurable a nikdy nula.
session_id string ne Epizoda, kterou tento publikační temp nese, pokud nějakou nese.
published_at string ne Záznam, který tu epizodu už drží, pokud nějaký existuje. Jeho přítomnost mění dočasný soubor publikace Incomplete na Orphan.
cíl string ne Soubor, kterým se měl stát dočasný soubor přejmenování. Jeho přítomnost činí z dočasného souboru Incomplete přejmenování Orphan.
odstranitelné boolean ano Zda by to volání odstranilo. Rozhoduje verdikt a vlastní vzorový guard remove_stray, nikdy volající.
odstraněno boolean ano Zda toto volání odstranilo. Při kontrole vždy false.

Používá RecoverOrphansResult

StrayKind

"publish_temp" | "rename_temp" | "staging_dir"
Jaký druh zbloudilého souboru cesta je, rozhodnuto podle toho, kde je a jak se jmenuje, ne podle obsahu. Obsah rozhoduje o verdiktu; toto rozhoduje, jakou otázku položit.

Slovo, pod kterým se druh hlásí, je také slovo, z něhož se čte zpět, a slovo, které tato verze nezná, se odmítne, místo aby se četlo jako nejbližší druh:

use majordomus_cli::capability::builtin::recover::StrayKind;
for kind in [StrayKind::PublishTemp, StrayKind::RenameTemp, StrayKind::StagingDir] {
    let word = serde_json::to_value(kind).unwrap();
    assert_eq!(serde_json::from_value::<StrayKind>(word).unwrap(), kind);
}
assert!(serde_json::from_value::<StrayKind>(serde_json::json!("temp")).is_err());
  • publish_temp.tmp.XXXXXX v úložišti záznamů: vytváří je mj_publish_record a jen proces, který zanikl mezi mktemp a rm, jeden zanechá.
  • rename_temp<target>.mj-tmp: zapsán a přejmenován v jednom &&, takže pokud existuje, zápis selhal nebo proces zemřel uprostřed zápisu.
  • staging_dir.mj-stage.XXXXXX v kořeni repozitáře: scripts/generate-site-data do něj stagingem ukládá. Vždy adresář, a proto se zde nikdy neodstraňuje.

Používá Stray

StrayVerdict

"live" | "orphan" | "incomplete" | "foreign" | "unmeasurable"
Čím je tento zbloudilý soubor, rozhodnuto jeho přečtením.

Těch pět slov je záměrně z lib/recover.sh: kdo si přečetl výstup příkazu, se nemá učit týchž pět faktů dvakrát jen proto, že druhý povrch zvolil vlastní slovník.

Tento slovník je uzavřený. Každý verdikt se čte zpět jako sám sebe a šesté slovo neexistuje: povrch, který nějaké vymyslí, dostane chybu místo verdiktu, který nikdo nemyslel.

use majordomus_cli::capability::builtin::recover::StrayVerdict::{self, *};
let all = [Live, Orphan, Incomplete, Foreign, Unmeasurable];
let words: Vec<&str> = all.iter().map(|v| v.as_str()).collect();
assert_eq!(words, ["live", "orphan", "incomplete", "foreign", "unmeasurable"]);
for v in all {
    let word = serde_json::json!(v.as_str());
    assert_eq!(serde_json::from_value::<StrayVerdict>(word).unwrap(), v);
}
assert!(serde_json::from_value::<StrayVerdict>(serde_json::json!("stale")).is_err());
  • liveMladší než práh: vlastní ho session close nebo scripts/derive, který právě běží. Měří se, hlásí se, nikdy se nesahá.
  • orphanJeho práce skončila, nebo v něm nikdy nic nebylo. Odstranitelné — pokud to není adresář, který tento runtime nikdy neodstraňuje.
  • incompleteDrží něco, co nedrží žádný jiný soubor: záznam, který nikdo nepublikoval, nebo zápis, jehož cíl nikdy nedorazil. Zde se nikdy neodstraňuje; rozhoduje volající.
  • foreignVůbec nezapsáno tímto nástrojem, nebo zapsáno verzí, která mu dala jiný tvar. Nikdy se nedotkne; hlásí se, čím je.
  • unmeasurableJeho stáří nebylo možné na této platformě přečíst, takže se zde nepovažuje za zastaralé. Ochrana, kterou project.destructive-sweeps-fail-closed požaduje: predikát, který nedokáže změřit svůj vstup, je nepravdivý, nikdy ne nejextrémnější hodnota v množině.

Používá Stray

Prohledává názvy a popisy všech stránek, které tento web publikuje.