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: server

Sdílený server tohoto checkoutu i každého dalšího checkoutu téhož git repozitáře: co říká každý lease, zda server, který pojmenovává, odpovídá, zda to, co odpovídá, je kód na disku ve verzi tohoto spustitelného souboru, a kolik peerů každý drží.

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.

server

Sdílený server tohoto checkoutu i každého dalšího checkoutu téhož git repozitáře: co říká každý lease, zda server, který pojmenovává, odpovídá, zda to, co odpovídá, je kód na disku ve verzi tohoto spustitelného souboru, a kolik peerů každý drží.

GET /api/v1/server server.status

Sdílený server a každý server repozitáře

Kde stojí server tohoto checkoutu — absent, starting, ready, outdated nebo stale — měřeno proti tomu, co by poskytoval tento spustitelný soubor; jak daleko je strom, který poskytuje, od vzdáleného trunku (`trunk`: current, lagging, stale, unjudged nebo unmeasured proti `checkout.trunk_distance` politiky, k poslednímu fetchi); lease, který tento proces drží, když je serverem; a, pokud `checkouts` nezúží výběr jen na tento, každý checkout, který git pro repozitář eviduje, primární první, každý se svým lease, postavením a důvodem a s peery, které hlásí jeho server. `checkouts: this` přečte jeden lease, otestuje jeden server a nevyjmenuje žádný jiný checkout, což je cena, kterou má platit volající, který se ptá jen na checkout, ve kterém je. Čte se z lease souborů a ze serverů při každém volání; nic se necachuje, protože lease zapisují jiné procesy.

  • query
  • behaviorally_verified
  • vyžaduje se měření výkonu
  • cache vypnuta
  • nástroj MCP majordomus_server
  • Zdroj MCP {"name": "server", "uri": "majordomus://server"}
  • $ serve status

Parametry dotazu

názevtyppovinnépopispříklady
checkouty Checkouty ne Které checkouty odpověď pokrývá. Bez hodnoty znamená `repository`. repository: "repository"this-checkout: "this"

Vyzkoušejte

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

curl -s "http://127.0.0.1:8741/api/v1/server?checkouts=repository"

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 ServerStatus Sdílený server a každý server repozitáře: 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á.
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.

ConnectionCounts

object
Co HTTP server tohoto procesu udělal klientům, kteří drželi spojení bez jeho použití: uplatněný deadline a co ten deadline stál od startu procesu. Chybí, dokud tento proces neservíruje HTTP.

use majordomus_cli::http::deadline::{counts, ConnectionCounts};
// a process that has started no server reports nothing, rather than zeroes that would
// read as "no slow client was seen"
assert_eq!(counts(), None);
let c = ConnectionCounts { read_deadline_seconds: 30, closed_by_deadline: 4, refused_busy: 0 };
let text = serde_json::to_string(&c).unwrap();
assert_eq!(serde_json::from_str::<ConnectionCounts>(&text).unwrap(), c);
vlastnosttyppovinnépopis
read_deadline_seconds integer (uint64) ano server.read_deadline_seconds: tak, jak ho tento proces uplatňuje.
closed_by_deadline integer (uint64) ano Spojení uzavřená, protože se na nich v termínu nepřečetl celý požadavek.
refused_busy integer (uint64) ano Požadavky zodpovězené 503, protože všechny handlery požadavků byly zaneprázdněné.

Používá ServerStatus

Požadováno

object
Čím by tento spustitelný soubor chtěl, aby server tohoto checkoutu byl: adresa, na kterou by se navázal, verze a spustitelný soubor, ze kterého by servíroval. Vůči tomu se měří standing.

use majordomus_cli::capability::builtin::server::Desired;
let d = Desired { host: "127.0.0.1".into(), port: 8741, version: "1.0.0".into(), executable: None };
let v = serde_json::to_value(&d).unwrap();
assert_eq!(v["port"], 8741);
assert!(v.get("executable").is_none(), "an executable that cannot be located is not written as null");
vlastnosttyppovinnépopis
host string ano Rozhraní, na které by se server spuštěný zde navázal: to, co jmenuje MAJORDOMUS_HTTP_HOST v prostředí tohoto procesu, a loopback, když nejmenuje nic.
port celé číslo (uint16) ano Port, o který žádá jako první.
verze string ano Verze tohoto spustitelného souboru.
spustitelný soubor ExecutableIdentity | null → ExecutableIdentity ne Tento spustitelný soubor, když ho lze najít.

Používá ServerStatus

ExecutableIdentity

object
Identita souboru, ze kterého byl spustitelný program spuštěn: kde leží a mtime a velikost souboru na dané cestě. Server přežije vlastní binárku — rebuild nahradí soubor pod procesem, který dál obsluhuje kód načtený před hodinami — a nic na procesu samotném to neříká. Právě to to zviditelňuje.

use majordomus_cli::lease::ExecutableIdentity;
let recorded = ExecutableIdentity { path: "/opt/majordomus".into(), mtime: 1_700_000_000, size: 42 };
let text = serde_json::to_string(&recorded).unwrap();
assert_eq!(serde_json::from_str::<ExecutableIdentity>(&text).unwrap(), recorded);
vlastnosttyppovinnépopis
path string ano Cesta, ze které byl proces spuštěn.
mtime integer (uint64) ano Čas úpravy souboru, sekundy od epochy.
velikost integer (uint64) ano Velikost souboru v bajtech.

Používá Desired LeaseView

GitIdentity

object
Repozitář gitu, k němuž checkout patří, odlišný od samotného checkoutu.

identity jmenuje checkout: jeden server, jeden lease, jeden index na kořen checkoutu. Každý propojený worktree jednoho git repozitáře je podle této míry vlastním checkoutem a nic v tom neříkalo, že patří k sobě. Tohle říká: adresář gitu, který sdílí všechny pracovní stromy (git rev-parse --git-common-dir), je identitou repozitáře, jeho digest je jedna hodnota pro každý checkout toho repozitáře a linked říká, zda je tento checkout primární, nebo pracovní strom z něj odvozený. None, kde se git nedá zeptat: repozitář vrstvy nemusí být verzován.

use majordomus_cli::repository::{git_identity, identity, GitIdentity};
use std::process::Command;
let dir = tempfile::tempdir().unwrap();
let root = dir.path().join("repo");
std::fs::create_dir_all(&root).unwrap();
let git = |args: &[&str]| assert!(Command::new("git").arg("-C").arg(&root).args(args).status().unwrap().success());
git(&["init", "-q", "."]);
git(&["-c", "user.email=t@example.com", "-c", "user.name=t", "commit", "-q", "--allow-empty", "-m", "init"]);
let wt = dir.path().join("repo-wt");
git(&["worktree", "add", "-q", "-b", "feature/x", wt.to_str().unwrap()]);

let primary: GitIdentity = git_identity(&root).expect("a work tree");
let linked: GitIdentity = git_identity(&wt).expect("a linked work tree");
assert_eq!(primary.id, linked.id, "one repository");
assert_ne!(identity(&root), identity(&wt), "two checkouts");
assert!(!primary.linked && linked.linked);
assert!(!primary.id.contains('/'), "a digest, never a path");
vlastnosttyppovinnépopis
common_dir string ano Adresář gitu, který sdílejí všechny pracovní stromy repozitáře, kanonický.
id string ano Jeho digest: stejný pro každý checkout jednoho repozitáře, odlišný napříč repozitáři a nikdy cesta.
propojeno boolean ano Zda je tento checkout linked worktree, a ne primární.

Používá ServerStatus

LeaseView

object
Lease tak, jak ho vidí čtenář: co server napsal o sobě, bez tokenu, který činí soubor vlastním souborem serveru.

use majordomus_cli::capability::builtin::server::LeaseView;
let view = LeaseView { pid: 7, url: Some("http://127.0.0.1:8741".into()),
    started_at: "2026-09-10T00:00:00Z".into(), executable: None, version: Some("1.0.0".into()) };
let v = serde_json::to_value(&view).unwrap();
assert_eq!(v["pid"], 7);
assert!(v.get("token").is_none() && v.get("root").is_none());
vlastnosttyppovinnépopis
pid integer (uint32) ano Id procesu serveru. Není to důkaz živého serveru — jen sonda, na kterou se odpoví — ale rozhoduje se podle něj: živé pid si zaslouží, aby server, který neodpovídá, vydržel čekání volby, než se jeho lease převezme, a trpělivost serve ensure, než začne další; serve stop posílá svůj SIGTERM na toto pid.
url string | null ne Adresa, po navázání.
started_at string ano Kdy server převzal lease, RFC 3339.
spustitelný soubor ExecutableIdentity | null → ExecutableIdentity ne Spustitelný soubor, ze kterého byl server spuštěn, pokud se ho podařilo najít.
verze string | null ne Verze spustitelného souboru; chybí u serveru příliš starého na to, aby ji zapsal.

Používá ServerStatus ServerView

ServerStatus

object
Sdílený server tohoto checkoutu a každého dalšího checkoutu repozitáře.

use majordomus_cli::capability::builtin::server::{Desired, ServerStanding, ServerStatus};
let status = ServerStatus { checkout_id: "c".into(), git: None,
    desired: Desired { host: "127.0.0.1".into(), port: 8741, version: "1.0.0".into(), executable: None },
    this_process: None, standing: ServerStanding::Absent, servers: Vec::new(),
    connections: None, trunk: None };
let text = serde_json::to_string(&status).unwrap();
assert_eq!(serde_json::from_str::<ServerStatus>(&text).unwrap(), status);
vlastnosttyppovinnépopis
checkout_id string ano Identita tohoto checkoutu: čím odpovídá tento proces jako repository_id.
git GitIdentity | null → GitIdentity ne Repozitář git, do něhož tento checkout patří; chybí tam, kde se git nedá zeptat.
požadováno Desired → Desired ano Co by tento spustitelný soubor poskytoval a vůči čemu se měří standing.
this_process LeaseView | null → LeaseView ne Pronájem, který tento proces drží, pokud je serverem; chybí, pokud odpověděl proces, který nic neobsluhuje.
postavení ServerStanding → ServerStanding ano Kde stojí server tohoto checkoutu.
servery pole ServerView → ServerView ano Každý checkout repozitáře, primární první, každý se svým serverem. Jeden záznam — tento checkout — tam, kde se git nedá zeptat.
spojení ConnectionCounts | null → ConnectionCounts ne Co HTTP server tohoto procesu udělal s připojeními, která ho držela bez požadavku: uplatněný limit čtení, připojení, která tento limit zavřel, a požadavky odmítnuté, protože všechny obslužné rutiny byly zaneprázdněny. Chybí, pokud tento proces neobsluhuje HTTP.
trunk TrunkDistance | null → TrunkDistance ne Jak daleko je strom, který tento checkout obsluhuje, od vzdáleného trunku, posuzováno podle checkout.trunk_distance politiky: server checkoutu o 779 commitů pozadu odpovídá každé relaci ze stromu, který už neexistuje, a tady se to říká. Chybí jen v odpovědi, která předchází tomuto poli.

Používá server.status

ServerView

object
Jeden checkout repozitáře a server, který jmenuje jeho lease.

use majordomus_cli::capability::builtin::server::{ServerStanding, ServerView};
let view = ServerView { worktree: "/r".into(), branch: Some("master".into()), checkout_id: "c".into(),
    primary: true, this_checkout: true, standing: ServerStanding::Absent, reason: None, lease: None, peers: None };
let v = serde_json::to_value(&view).unwrap();
assert_eq!(v["standing"], "absent");
assert!(v.get("lease").is_none() && v.get("peers").is_none(), "what there is not is not written");
vlastnosttyppovinnépopis
worktree string ano Checkout, absolutně a kanonicky.
větev string | null ne Větev tam načtená, když ji git pojmenuje.
checkout_id string ano Identita checkoutu: jak ji jeho server odpovídá jako repository_id.
primární boolean ano Zda je to primární checkout, nikoli linked worktree.
this_checkout boolean ano Zda je to checkout, který odpovídající proces obsluhuje.
postavení ServerStanding → ServerStanding ano Kde stojí jeho server.
důvod string | null ne Proč, když stav není ready: co lease držel nebo co odpovědělo.
lease LeaseView | null → LeaseView ne Lease, pokud jej soubor obsahuje.
peers integer | null ne Kolik peerů server hlásí jako připojených, když odpoví.

Používá ServerStatus

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