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

Epizody provádění, které tento sdílený server drží: jedna na klienta, který si o ni řekl, otevřená při připojení klienta, udržovaná jeho vlastním provozem, při přerušení spojení odpojená, a ne uzavřená, a uzavřená při záměrném odpojení, při vypnutí nebo uklízečem (reaper), když se nic neozvalo. Hranice epizody pro klienta bez vlastních provider hooků (ADR 0103).

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.

epizody

Epizody provádění, které tento sdílený server drží: jedna na klienta, který si o ni řekl, otevřená při připojení klienta, udržovaná jeho vlastním provozem, při přerušení spojení odpojená, a ne uzavřená, a uzavřená při záměrném odpojení, při vypnutí nebo uklízečem (reaper), když se nic neozvalo. Hranice epizody pro klienta bez vlastních provider hooků (ADR 0103).

GET /api/v1/episodes episodes.list

Vypsat epizody

Každá epizoda provádění, kterou tento sdílený server drží, otevřená i odpojená, se spojením, které každou drží, kdy její klient naposledy promluvil, kolik spojení ji neslo a co ohlásil vlastní příkaz repozitáře pro epizody. V paměti: co přežije proces, je záznam relace repozitáře.

  • query
  • behaviorally_verified
  • vyžaduje se měření výkonu
  • cache vypnuta
  • Nástroj MCP majordomus_episodes

Žádné parametry.

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/episodes"

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 EpisodeList Vypsat epizody: 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.
POST /api/v1/episodes/attach episodes.attach

Připojit toto spojení k epizodě

Otevře epizodu provádění pro volajícího klienta, nebo obnoví tu, kterou už měl. 'external_id' je vlastní trvalé jméno klienta pro sezení — id jeho konverzace nebo vlákna — a musí přežít opětovné připojení: klient, který se vrátí pod stejnou identitou, dostane znovu svou vlastní epizodu, pod jakýmkoli peer id, které má nyní, místo druhé. Peer id tohoto serveru nestačí; přiděluje se na připojení. Poté vlastní provoz klienta udržuje epizodu naživu, ztráta spojení ji odpojí, ne uzavře, a uzavře ji majordomus_session_detach, zastavení serveru nebo reaper po uplynutí odkladu opětovného připojení. Epizodu repozitáře otevírá stejný příkaz, který spouští hook providera, a co ohlásil, je v odpovědi. Vyžaduje relaci MCP: přes prosté HTTP není připojení, ke kterému by se vázalo.

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

Tělo požadavku — AttachInput, JSON

příklad default

{"external_id":"benchmark-episode"}

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/episodes/attach" -H "content-type: application/json" -d '{"external_id":"benchmark-episode"}'

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 Připojeno Připojit toto spojení k epizodě: 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.
POST /api/v1/episodes/detach episodes.detach

Uzavřít epizodu tohoto spojení

Úmyslně uzavře epizodu provádění: práce je hotová, nejen přerušená, a záznam repozitáře to říká. Bez 'external_id' jde o epizodu, kterou drží volající spojení, což vyžaduje relaci MCP: přes prosté HTTP žádné spojení neexistuje, takže je volání odmítnuto a epizodu je nutné pojmenovat. Klient, který prostě zmizí, toto nepotřebuje — jeho epizoda se odpojí a reaper ji uzavře jako přerušenou — a rozdíl mezi těmito dvěma záznamy je jediná věc o skončené epizodě, která mění, co kdo udělá dál.

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

Tělo požadavku — DetachInput, JSON

příklad default

{}

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/episodes/detach" -H "content-type: application/json" -d '{}'

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 Detached Uzavřít epizodu tohoto spojení: 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.

AttachInput

object
Vstup episodes.attach: který kus práce toto připojení nese.

Identita je jediné pole a neznámé je odmítnuto místo ignorováno, takže klient, který pošle peer id pod jiným názvem, se to dozví hned:

use majordomus_cli::capability::builtin::episodes::AttachInput;
let input: AttachInput = serde_json::from_str(r#"{"external_id":"conv-42"}"#).unwrap();
assert_eq!(input.external_id, "conv-42");
assert!(serde_json::from_str::<AttachInput>(r#"{"external_id":"x","peer":"p1"}"#).is_err());
assert!(serde_json::from_str::<AttachInput>("{}").is_err(), "the identity is required");
vlastnosttyppovinnépopis
external_id string ano Vlastní trvalé jméno epizody od klienta — id jeho konverzace, id vlákna nebo jak jinak nazývá sezení, v němž je.

Musí přežít znovupřipojení, protože to je celá jeho úloha: klient, který se vrátí pod stejnou identitou, dostane znovu svou vlastní epizodu a ne druhou. Postačí cokoli, co klient dokáže reprodukovat; nepostačí peer id tohoto serveru, které se přiděluje pro každé spojení a je při každém znovupřipojení klienta jiným řetězcem.

Používá episodes.attach

Připojeno

object
Odpověď episodes.attach: epizoda, kterou spojení nyní drží, zda byla obnovena místo otevřena a jak dlouho přežije ztrátu spojení.

use majordomus_cli::capability::builtin::episodes::Attached;
let schema = serde_json::to_value(schemars::schema_for!(Attached)).unwrap();
for field in ["episode", "resumed", "reattach_grace_seconds"] {
    assert!(schema["required"].as_array().unwrap().iter().any(|f| f == field), "{field}");
}
vlastnosttyppovinnépopis
epizoda ConnectionEpisode → ConnectionEpisode ano Epizoda, kterou toto spojení nyní drží.
obnoveno boolean ano Zda byla obnovena epizoda už existující pod touto identitou, místo aby se otevřela nová. Pravda po znovupřipojení, restartu klienta nebo pádu, a pole, které volající kontroluje, aby věděl, zda v něčem pokračuje.
reattach_grace_seconds integer (uint64) ano Jak dlouho tato epizoda přežije své spojení, než ji reaper uzavře, v sekundách. Uvedeno, ne ponecháno k objevení: klient, který zná odklad, může rozhodnout, zda se vyplatí znovu připojit.

Používá episodes.attach

ConnectionEpisode

object
Jedna epizoda: jak se klient nazývá, které spojení ji nyní drží a co s ní repozitář udělal.

use majordomus_cli::episodes::{ConnectionEpisode, EpisodeBoard};
use majordomus_cli::peers::{PeerBoard, Transport};
let peer = PeerBoard::new().attach(Transport::Http);
let (episode, _) = EpisodeBoard::new().attach(&peer, "conv-42", "generic");
let episode: ConnectionEpisode = episode;
assert_eq!((episode.external_id.as_str(), episode.provider.as_str()), ("conv-42", "generic"));
assert_eq!(episode.peer.as_ref(), Some(&peer));
// never empty: a board with no repository behind it says so
assert!(episode.repository.contains("without a driver"));
vlastnosttyppovinnépopis
external_id string ano Vlastní trvalý název klienta pro tento kus práce a klíč, podle kterého se zde vše adresuje. Nikdy id peera: viz dokumentace modulu.
provider string ano Id poskytovatele, pod kterým je tato epizoda zaznamenána, jak ho pojmenovává share/providers.yaml.
peer PeerId | null → PeerId ne Připojení, které ji drží, pokud nějaké je. None při odpojení — což je stav, kterého má epizoda dosáhnout a vrátit se z něj, nikoli závada.
opened_at string ano Kdy byla poprvé otevřena, RFC 3339, UTC. Opětovné připojení to nemění: epizoda je práce a práce nezačala znovu jen proto, že se restartoval socket.
last_activity_seconds_ago integer (uint64) ano Sekundy od chvíle, kdy klient na něm naposledy promluvil, přes jakékoli připojení.
přílohy integer (uint32) ano Kolikrát jej připojení převzalo, včetně prvního připojení.
state ConnectionEpisodeState → ConnectionEpisodeState ano Otevřeno, nebo odpojeno a čekající na svého klienta.
repozitář string ano Co hlásil vlastní příkaz epizody repozitáře, doslova — záznam, který otevřel, nebo důvod, proč nemohl. Nikdy se zde neinterpretuje a nikdy není prázdný: subsystém, který tiše nic nedělá, je režim selhání, který toto pole zviditelňuje.

Používá Attached Detached EpisodeList

ConnectionEpisodeState

"open" | "detached"
V jakém stavu epizoda je: držená živým připojením, nebo čekající, až se její klient vrátí. Uzavřený stav neexistuje, protože uzavřená epizoda z nástěnky mizí; co ji přežije, je vlastní záznam repozitáře.

use majordomus_cli::episodes::{ConnectionEpisodeState, EpisodeBoard};
use majordomus_cli::peers::{PeerBoard, Transport};
let peer = PeerBoard::new().attach(Transport::Stdio);
let board = EpisodeBoard::new();
assert_eq!(board.attach(&peer, "w", "generic").0.state, ConnectionEpisodeState::Open);
assert_eq!(board.detach(&peer)[0].state, ConnectionEpisodeState::Detached);
assert_eq!(serde_json::to_string(&ConnectionEpisodeState::Detached).unwrap(), "\"detached\"");
  • openDrží ji spojení a klient mluví.
  • detachedSpojení zaniklo; epizoda se uchovává po dobu REATTACH_GRACE, aby se k ní klient mohl vrátit. Do tohoto stavu skončí pád a z tohoto stavu se zotavuje opětovné připojení.

Používá ConnectionEpisode

DetachInput

object
Vstup episodes.detach: epizoda k uzavření.

Prázdný je platný vstup a znamená epizodu, kterou drží volající spojení; přes rozhraní bez spojení se tento vstup odmítne, protože není odkud „epizodu tohoto spojení“ vzít.

use majordomus_cli::capability::builtin::episodes::DetachInput;
let mine: DetachInput = serde_json::from_str("{}").unwrap();
assert!(mine.external_id.is_none());
let named: DetachInput = serde_json::from_str(r#"{"external_id":"conv-42"}"#).unwrap();
assert_eq!(named.external_id.as_deref(), Some("conv-42"));
assert_eq!(serde_json::to_string(&mine).unwrap(), "{}", "an omitted id is not written as null");
vlastnosttyppovinnépopis
external_id string | null ne Epizoda k uzavření. Při vynechání je to ta, kterou toto spojení drží, což je to, co znamená klient ukončující vlastní sezení.

Používá episodes.detach

Detached

object
Odpověď episodes.detach: epizoda tak, jak byla uzavřena, už ji nedrží žádné spojení, s tím, co ohlásila koncová událost repozitáře.

use majordomus_cli::capability::builtin::episodes::Detached;
let schema = serde_json::to_value(schemars::schema_for!(Detached)).unwrap();
assert_eq!(schema["required"], serde_json::json!(["episode"]));
vlastnosttyppovinnépopis
epizoda ConnectionEpisode → ConnectionEpisode ano Epizoda tak, jak byla uzavřena, přičemž její pole repository nese to, co hlásila vlastní koncová událost repozitáře.

Používá episodes.detach

EpisodeList

object
Odpověď episodes.list: každá epizoda, kterou tento server drží, spočítaná podle stavu, a ta, kterou drží volající. Pouze v paměti — je to asociace mezi živými spojeními a záznamy repozitáře, která přestane platit, když se proces zastaví.

Oba počty rozdělují seznam a mine se z JSON vynechá, místo aby se zapsalo jako null, když volající nedrží nic, což je přes prosté HTTP vždy:

use majordomus_cli::capability::builtin::episodes::EpisodeList;
let none = EpisodeList { open: 0, detached: 0, episodes: vec![], mine: None };
let json = serde_json::to_value(&none).unwrap();
assert_eq!(json, serde_json::json!({"open": 0, "detached": 0, "episodes": []}));
let back: EpisodeList = serde_json::from_value(json).unwrap();
assert_eq!(back.open + back.detached, back.episodes.len());
vlastnosttyppovinnépopis
open integer (uint) ano Kolik jich je otevřených — držených spojením, které tam stále je.
detached integer (uint) ano Kolik jich je odpojených a čeká v době odkladu, až se klient vrátí. Není to počet chyb: tady čeká na obnovení práce zhroucený klient.
epizody pole ConnectionEpisode → ConnectionEpisode ano Každá epizoda, otevřená i odpojená, v pořadí externí identity.
moje ConnectionEpisode | null → ConnectionEpisode ne Epizoda, kterou volající spojení drží, pokud nějakou drží.

Používá episodes.list

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