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

Typovaná doména relace: stavový automat životního cyklu, kterým epizoda prochází, deklarovaný jednou ve spustitelném souboru a promítnutý sem, ne překreslovaný na každém povrchu, a identity, které tento checkout zaznamenává — repozitář, checkout, epizoda a vlastní relace providera — každá s kanonickou hodnotou a vlastním zápisem každého úložiště, protože úložiště zapisují šest věcí třemi slovy a nikdo to neřekl.

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.

session_domain

Typovaná doména relace: stavový automat životního cyklu, kterým epizoda prochází, deklarovaný jednou ve spustitelném souboru a promítnutý sem, ne překreslovaný na každém povrchu, a identity, které tento checkout zaznamenává — repozitář, checkout, epizoda a vlastní relace providera — každá s kanonickou hodnotou a vlastním zápisem každého úložiště, protože úložiště zapisují šest věcí třemi slovy a nikdo to neřekl.

GET /api/v1/session/identity session_domain.identity

Co identifikuje tento checkout a jak to který store zapisuje

Repozitář, checkout, otevřená epizoda a relace providera, každé s kanonickou hodnotou, kterou tento spustitelný soubor vypočítá, a vedle ní zápisem každého úložiště. Úložiště zaznamenávají repozitář někdy jako absolutní cestu k .git, jindy jako URL remote, worktree jako cestu i jako digest a relaci jako id epizody i UUID providera; tento povrch to říká, aby čtenář nikdy neporovnával dva zápisy různých věcí a nedošel k závěru, že se neshodují.

  • query
  • behaviorally_verified
  • vyžaduje se měření výkonu
  • cache process (max_entries=2, ttl_seconds=2)
  • Nástroj MCP majordomus_session_identity
  • Zdroj MCP {"name": "session-identity", "uri": "majordomus://session/identity"}

Žá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/session/identity"

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 IdentityReport Co identifikuje tento checkout a jak to každé úložiště píš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.
GET /api/v1/session/machine session_domain.machine

Životní cyklus epizody jako data

Každý stav, v němž může být epizoda, zda je koncový a kam se může přesunout; každý přechod — open, resume, checkpoint, detach, close, recover — se stavy, mezi nimiž běží, a zda stav vůbec posouvá. Odvozeno z typů, takže diagram, který se rozchází s kódem, nemůže existovat. Na čem stroj záměrně nezávisí, je řečeno, ne ponecháno k dedukci: na stavu úlohy, což je ADR 0052.

  • query
  • behaviorally_verified
  • vyžaduje se měření výkonu
  • proces cache (max_entries=1, ttl_seconds=600)
  • Nástroj MCP majordomus_session_machine
  • zdroj MCP {"name": "session-machine", "uri": "majordomus://session/machine"}

Žá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/session/machine"

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 MachineReport Životní cyklus epizody jako data: 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.

EpisodeState

"opening" | "open" | "detached" | "closed"
Kde epizoda je: vytvořena, otevřena, odpojena od spojení, které ji drželo, nebo uzavřena do neměnného záznamu.

use majordomus_cli::session::EpisodeState;

assert!(EpisodeState::Open.may_move_to(EpisodeState::Closed));
assert!(!EpisodeState::Closed.may_move_to(EpisodeState::Open), "a record is immutable");
assert!(EpisodeState::Open.may_move_to(EpisodeState::Open), "a resume is not a move");
assert!(EpisodeState::Closed.is_final());
  • openingIdentita byla vyražena a nic trvalého ještě nebylo zapsáno. Existuje proto, aby pád mezi vyražením id a zápisem záznamu otevření byl stavem, který model umí pojmenovat, a ne epizodou, která se nikdy nestala.
  • openOtevřený záznam platí. Pracovník je tady, nebo tu nedávno byl.
  • detachedSpojení, které drželo epizodu, zmizelo, a epizoda ne. Spadlý socket je nejběžnější věc, která se relaci stane; epizoda, která by se při každém odpojení sama uzavřela, by ztratila práci každého pracovníka, jemuž síť škytla. Stále ji lze obnovit a stále je obnovitelná, pokud ji nikdo neobnoví.
  • closedNeměnný záznam byl publikován. Konečný, a konečnost je smysl: čtyři záznamy s-20260909152316-024f existují všechny proto, že nic v předchozí reprezentaci nemohlo říct tohle.

Používá StateView TransitionView

IdentityFacet

object
Jedna identita tohoto checkoutu tak, jak ji tento program počítá a jak ji zapisuje každé úložiště. To, na co odpovídá session.identity, a přímá projekce tabulky auditu.

use majordomus_cli::session::{identities, IdentityFacet};

let dir = tempfile::tempdir().unwrap();
let facets: Vec<IdentityFacet> = identities(dir.path());
let repository = facets.iter().find(|f| f.subject == "repository").expect("a facet");
assert!(repository.spellings.len() >= 2, "one word, two writers, two values");
vlastnosttyppovinnépopis
předmět string ano Co se identifikuje: repository, checkout, episode, provider_session.
kanonické string ne Kanonická hodnota, kterou tento spustitelný soubor vypočte, umí-li nějakou vypočítat.
zápisy pole RecordedSpelling → RecordedSpelling ne Jak stejný předmět zapisuje každé úložiště, v pořadí, které udává crate::order.
poznámka string ano Proč subjekt potřebuje vlastní typ, v jedné větě, pro čtenáře, který na něj narazí v projekci, a ne v tomto modulu.

Používá IdentityReport

IdentityReport

object
Identity tohoto checkoutu: jedna fazeta na subjekt, se stálou poznámkou o tom, co s nimi čtenář nesmí dělat.

use majordomus_cli::capability::builtin::IdentityReport;
use majordomus_cli::session::identities;

let dir = tempfile::tempdir().unwrap();
let report = IdentityReport {
    checkout: dir.path().display().to_string(),
    facets: identities(dir.path()),
    findings: Vec::new(),
};
let subjects: Vec<&str> = report.facets.iter().map(|f| f.subject.as_str()).collect();
assert_eq!(subjects, ["repository", "checkout", "episode", "provider_session"]);
vlastnosttyppovinnépopis
checkout string ano Checkout, o kterém tato odpověď je. Absolutní cesta, protože tato schopnost se poskytuje pracovníkovi před tímto checkoutem a nikdy se nepublikuje — stejné pravidlo vystavení, které dodržuje continuity.state, ze stejného důvodu (ADR 0014).
fasety pole IdentityFacet → IdentityFacet ano Jedna položka na subjekt, v pořadí, v jakém se s nimi čtenář setkává: repozitář, checkout, epizoda, relace poskytovatele.
zjištění array of string ano Co by měl čtenář vědět dřív, než porovná kterékoli dvě z nich. Prázdné zde není dobrý případ — záměna je vlastností úložišť, ne tohoto checkoutu — takže stálá poznámka je přítomna vždy.

Používá session_domain.identity

MachineReport

object
Stroj životního cyklu, s rozhodnutím, které implementuje, aby čtenář, který ho potká v projekci, mohl jít a přečíst si, proč má takový tvar.

use majordomus_cli::capability::builtin::MachineReport;
use majordomus_cli::session::Machine;

// the report is the machine plus one citation; the machine itself is derived from the
// types and carries no second list
let report = MachineReport { machine: Machine::describe(), decision: "adr-0047".into() };
assert!(report.machine.transitions.iter().any(|t| !t.moves_state), "a checkpoint is an event");
assert!(report.decision.contains("0047"));
vlastnosttyppovinnépopis
stavy pole StateView → StateView ano Každý stav, s významem a zda je koncový.
přechody pole TransitionView → TransitionView ano Každý přechod, se stavy, mezi nimiž probíhá.
independent_of array of string ano Na čem stroj záměrně nezávisí, uvedeno tak, aby čtenář nemusel absenci odvozovat. Dnes jedna položka: stav úlohy.
rozhodnutí string ano Rozhodnutí, jehož implementací je tento stroj, aby čtenář, který na něj v projekci narazí, mohl jít přečíst, proč má takový tvar.

Používá session_domain.machine

RecordedSpelling

object
Zápis jednoho předmětu v jednom úložišti. Která polovina vrstvy ho zapsala, co ho zapsalo a hodnota, kterou by zde měl.

use majordomus_cli::session::{RecordedSpelling, Spelling};

let local = RecordedSpelling {
    spelling: Spelling::Local,
    writer: "mj_git_repo_id (lib/common.sh)".into(),
    value: "/src/repo/.git".into(),
};
// knowing which half a string came from is what stops a path being compared with a URL
assert_eq!(local.spelling.as_str(), "local");
assert!(local.value.starts_with('/'));
vlastnosttyppovinnépopis
pravopis Spelling → Spelling ano Která polovina vrstvy to zapsala.
zapisovatel string ano Zapisovač, pojmenovaný, aby se na něj čtenář mohl jít podívat.
hodnota string ne Hodnota, tak jak by ji tento checkout nechal zapsat. Prázdná, když ji tu zatím nic nezapsalo, což je čerstvý klon a ne závada.

Používá IdentityFacet

Pravopis

"local" | "shared" | "canonical"
Z kterého úložiště byla zaznamenaná identita přečtena, uchováno vedle hodnoty.

Nejde o to volit mezi mj_git_repo_id a mj_repository_id nebo mezi worktree: a worktree_id:. Jde o to přestat předstírat, že jsou jednou hodnotou. Čtenář, který ví, že řetězec je lokální zápis, jej může porovnat s jinými lokálními zápisy a může odmítnout porovnat jej se sdíleným, což je přesně srovnání, které vyrobilo „tyto dva záznamy jsou o různých repozitářích“ u záznamů téhož repozitáře napsaných s odstupem čtyř minut.

use majordomus_cli::session::Spelling;
// the two halves are different answers to one question, and are never compared
assert_ne!(Spelling::Local, Spelling::Shared);
assert_eq!(Spelling::Canonical.as_str(), "canonical");
  • localZápis lokální poloviny: cesta v .ai/local/state/. Jmenuje tento disk a nikdy se nepublikuje.
  • sharedZápis sdílené poloviny: vzdálená URL nebo digest, v .ai/repo/sessions/. Jmenuje repozitář a putuje s klonem (ADR 0014).
  • canonicalVlastní kanonický digest tohoto spustitelného souboru, vypočtený, ne přečtený.

Používá RecordedSpelling

StateView

object
Jeden stav stroje: jeho slovo, zda z něj epizoda někdy odchází a kam může odtud jít.

use majordomus_cli::session::{EpisodeState, Machine, StateView};

let m = Machine::describe();
let closed: &StateView =
    m.states.iter().find(|s| s.state == EpisodeState::Closed).expect("a state");
assert!(closed.terminal && closed.may_move_to.is_empty());
vlastnosttyppovinnépopis
state EpisodeState → EpisodeState ano Slovo stavu.
terminál boolean ano Zda ji epizoda někdy opustí.
may_move_to pole EpisodeState → EpisodeState ano Stavy, do nichž se epizoda v tomto stavu může přesunout, v kanonickém pořadí.

Používá MachineReport

Přechod

"open" | "resume" | "checkpoint" | "detach" | "close" | "recover"
Co epizodu pohnulo. Slovník, který potřebuje audit ADR 0052: open, resume, checkpoint, detach, close, recover.

Jeden z nich stav nemění a přesto je přechodem. Checkpoint nechává otevřenou epizodu otevřenou — ale je to jedna ze dvou událostí, jejichž absence je to, co audit hledal, a událost modelovanou jako „nic se nestalo“ nelze spočítat. Šest dní ticha bylo šest dní, kdy session.started a session.closed nadále přicházely a dvě události, které vytvářejí záznamy, z nichž pracovník pokračuje, ne. Slovník, ve kterém tyto dvě nejsou události, je slovník, ve kterém je ten výpadek neviditelný.

use majordomus_cli::session::{EpisodeState, Transition};

// a checkpoint is a transition that does not move the state, and says so
let c = Transition::Checkpoint;
assert_eq!(c.from_to(), (EpisodeState::Open, EpisodeState::Open));
assert!(!c.moves_state());

// a resume is canonically the return to a detached episode; a provider's start event
// arriving at one that is already open is the same transition seen from `Open`, which
// the machine allows without a move
assert_eq!(Transition::Resume.from_to(), (EpisodeState::Detached, EpisodeState::Open));
assert!(EpisodeState::Open.may_move_to(EpisodeState::Open));

// and every transition's own move is one the machine allows
for t in Transition::ALL {
    let (from, to) = t.from_to();
    assert!(from.may_move_to(to), "{} is not a legal move", t.as_str());
}
  • openEpizoda začíná: vydá se id a zapíše se otevřený záznam.
  • resumeWorker se vrátil k odpojené epizodě. Startovní událost providera se také znovu spustí při resume a při compactionu proti epizodě, která je stále otevřená; je to tentýž přechod pozorovaný z Open a poctivá odpověď na „vaše epizoda je už otevřená“ je ponechat ji, ne otevřít druhou.
  • checkpointPoznámka o postupu byla zaznamenána k epizodě. Artefakt epizody, ne úlohy (ADR 0052): checkpoint mimo úlohu zaznamená task: none a je to běžný záznam, ne odmítnutí.
  • detachSpojení zaniklo bez koncové události.
  • closeWorker ukončil epizodu a neměnný záznam byl publikován.
  • recoverNikdo ji neukončil a její poslední známka života je starší než práh opuštění, takže ji uzavřela údržba. Záznam to říká: epizoda takto uzavřená je interrupted, protože čtenář, který z ní obnovuje, potřebuje vědět, že může být neúplná.

Používá TransitionView

TransitionView

object
Jeden přechod stroje: jeho slovo, stavy, mezi nimiž běží, a zda vůbec mění stav.

use majordomus_cli::session::{Machine, Transition, TransitionView};

let m = Machine::describe();
let close: &TransitionView = m
    .transitions
    .iter()
    .find(|t| t.transition == Transition::Close)
    .expect("a transition");
assert!(close.moves_state);
vlastnosttyppovinnépopis
transition Transition → Transition ano Slovo přechodu.
z EpisodeState → EpisodeState ano Kde začíná.
do EpisodeState → EpisodeState ano Kde končí.
moves_state boolean ano Nepravda pro resume a checkpoint, které jsou událostmi uvnitř stavu.

Používá MachineReport

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