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

Sledovaný strom jako několik shardů Markdownu omezených počtem tokenů, které umí indexovat souborové vyhledávání jazykového modelu, s indexem, který čtenáři dává orientaci, a manifestem, který následně dokládá, co stroj opustilo: jen bloby git indexu, nikdy pracovní strom a nikdy binárka, gitlink ani worktree, symbolický odkaz, výstup buildu nebo přihlašovací údaj, ať index obsahuje cokoli.

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.

pack

Sledovaný strom jako několik shardů Markdownu omezených počtem tokenů, které umí indexovat souborové vyhledávání jazykového modelu, s indexem, který čtenáři dává orientaci, a manifestem, který následně dokládá, co stroj opustilo: jen bloby git indexu, nikdy pracovní strom a nikdy binárka, gitlink ani worktree, symbolický odkaz, výstup buildu nebo přihlašovací údaj, ať index obsahuje cokoli.

GET /api/v1/pack/plan pack.plan

Naplánovat zdrojový balík

Co by zabalil profil share/archive.yaml: nesené soubory a jejich bajty a tokeny o200k_base, každý vynechaný soubor podle důvodu (worktree, link, artifact, binary, derived, excluded; derived se počítá, ostatní se vypisují), shardy, na které se řeže v rámci tokenového rozpočtu a počtu souborů profilu, a každé zjištění, které build odmítne — soubor nad rozpočet, příliš mnoho shardů, strojová cesta nebo přihlašovací údaj ve vybraném souboru, prázdný výběr, profil bez limitů. Čte jen index a bloby gitu; nic nezapisuje.

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

Parametry dotazu

názevtyppovinnépopispříklady
profil string ne Profil z `share/archive.yaml`; jeho `default`, když chybí. chatgpt: "chatgpt"

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/pack/plan?profile=chatgpt"

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 PackPlan Naplánovat zdrojový pack: 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/pack/verify pack.verify

Ověřit zapsaný zdrojový balík

Přečte adresář balíčku uvnitř repozitáře proti jeho pack.json: každý soubor, který jmenuje, je přítomen se svým digestem a nic jiného tam není, obsah každého nesení souboru má digest, který zaznamenává jeho značka, žádná nesená cesta není binárka, artefakt, odkaz ani gitlink podle profilu, který manifest jmenuje, žádný soubor nepřekračuje tokenový rozpočet profilu ani neobsahuje bajt NUL či únik a souborů není víc, než profil dovoluje. Nečitelný manifest je neměřeno, nikdy ne úspěch.

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

Parametry dotazu

názevtyppovinnépopispříklady
dir string ano Adresář balíčku uvnitř repozitáře: relativně k jeho kořeni, nebo absolutně pod ním. absent: "tmp/packs/absent"

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/pack/verify?dir=tmp%2Fpacks%2Fabsent"

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 PackVerdict Ověřit zapsaný zdrojový balíček: 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.

DropReason

"worktree" | "link" | "artifact" | "binary" | "derived" | "excluded"
Proč sledovaný soubor není v balíčku. Každý důvod kromě derived a excluded je konečný: žádné include profilu nepřipustí zpět odkaz, gitlink, artefakt ani binárku.

use majordomus_cli::pack::DropReason;
assert_eq!(DropReason::Binary.as_str(), "binary");
let json = serde_json::to_string(&DropReason::Artifact).unwrap();
assert_eq!(json, "\"artifact\"");
  • worktreeGitlink: vnořený repozitář nebo worktree, jehož obsah v tomto indexu není.
  • linkSymbolický odkaz, jehož obsahem je cesta na stroji, který ho commitl.
  • artifactCesta, kterou distribuce jmenuje jako výstup buildu, cache nebo kontejner worktree.
  • binaryNení text: bajt NUL, obsah, který není UTF-8, nebo přípona ze seznamu binárních.
  • derivedOznačeno merge=derived v .gitattributes: projekce souboru, který je zde.
  • excludedOdpovídá exclude profilu.

Používá DroppedFile

DroppedFile

object
Jeden vynechaný soubor, který report jmenuje. Odvozené soubory se počítají, nevypisují: jsou funkcí souborů, které v balíku jsou.

Níže uvedené příklady plánují repozitář obsahující main.rs a logo.png, jejíž obsah je binární, s distribucí, jejíž profil chat má limity a profil bare žádné.

use majordomus_cli::pack::{plan, DropReason, DroppedFile};
#### use std::process::Command;
#### let dir = tempfile::tempdir().unwrap();
#### let (root, share) = (dir.path().join("repo"), dir.path().join("share"));
#### std::fs::create_dir_all(&root).unwrap();
#### std::fs::create_dir_all(&share).unwrap();
#### std::fs::write(share.join("archive.yaml"), "default: chat\nprofiles:\n  - id: chat\n    binary: drop\n    artifacts: drop\n    shards:\n      max_count: 5\n      max_tokens: 4000\n  - id: bare\n    binary: drop\n").unwrap();
#### let git = |a: &[&str]| assert!(Command::new("git").arg("-C").arg(&root)
####     .args(["-c", "user.email=t@example.com", "-c", "user.name=t"]).args(a)
####     .status().unwrap().success());
#### git(&["init", "-q"]);
#### std::fs::write(root.join("main.rs"), "fn main() {}\n").unwrap();
#### std::fs::write(root.join("logo.png"), b"\x89PNG\0\x01").unwrap();
#### git(&["add", "-A"]);
#### git(&["commit", "-q", "-m", "one"]);
let dropped = plan(&root, &share, None).plan.dropped_files;
let want = DroppedFile { path: "logo.png".into(), reason: DropReason::Binary };
assert_eq!(dropped, [want]);
vlastnosttyppovinnépopis
path string ano Cesta.
důvod DropReason → DropReason ano Why.

Používá PackPlan

PackFinding

object
Důvod, proč balík nelze sestavit podle plánu, nebo proč zapsaný balík neodpovídá svému manifestu: stabilní kód, cesta, je-li nějaká, a náprava.

Níže uvedené příklady plánují repozitář obsahující main.rs a logo.png, jejíž obsah je binární, s distribucí, jejíž profil chat má limity a profil bare žádné.

use majordomus_cli::pack::{plan, PackFinding};
#### use std::process::Command;
#### let dir = tempfile::tempdir().unwrap();
#### let (root, share) = (dir.path().join("repo"), dir.path().join("share"));
#### std::fs::create_dir_all(&root).unwrap();
#### std::fs::create_dir_all(&share).unwrap();
#### std::fs::write(share.join("archive.yaml"), "default: chat\nprofiles:\n  - id: chat\n    binary: drop\n    artifacts: drop\n    shards:\n      max_count: 5\n      max_tokens: 4000\n  - id: bare\n    binary: drop\n").unwrap();
#### let git = |a: &[&str]| assert!(Command::new("git").arg("-C").arg(&root)
####     .args(["-c", "user.email=t@example.com", "-c", "user.name=t"]).args(a)
####     .status().unwrap().success());
#### git(&["init", "-q"]);
#### std::fs::write(root.join("main.rs"), "fn main() {}\n").unwrap();
#### std::fs::write(root.join("logo.png"), b"\x89PNG\0\x01").unwrap();
#### git(&["add", "-A"]);
#### git(&["commit", "-q", "-m", "one"]);
let findings: Vec<PackFinding> = plan(&root, &share, Some("bare")).plan.findings;
assert_eq!(findings[0].code, "pack.no_limits");
assert!(findings[0].path.is_none() && !findings[0].remedy.is_empty());
vlastnosttyppovinnépopis
kód string ano Stabilní kód: pack.file_too_large, pack.too_many_shards, pack.index_too_large, pack.leak, pack.empty, pack.no_limits a od ověřování pack.tampered, pack.not_text, pack.forbidden_path, pack.missing, pack.stray, pack.over_budget, pack.manifest.
path string | null ne Cesta, které se zjištění týká, pokud se nějaké týká.
zpráva string ano Co je špatně.
náprava string ano Co o tom rozhoduje.

Používá PackPlan PackVerdict

PackPlan

object
Plán jednoho balíčku: co nese, co vynechává a proč, jak je rozřezán na shardy a zda může být sestaven.

Níže uvedené příklady plánují repozitář obsahující main.rs a logo.png, jejíž obsah je binární, s distribucí, jejíž profil chat má limity a profil bare žádné.

use majordomus_cli::pack::{plan, PackPlan};
#### use std::process::Command;
#### let dir = tempfile::tempdir().unwrap();
#### let (root, share) = (dir.path().join("repo"), dir.path().join("share"));
#### std::fs::create_dir_all(&root).unwrap();
#### std::fs::create_dir_all(&share).unwrap();
#### std::fs::write(share.join("archive.yaml"), "default: chat\nprofiles:\n  - id: chat\n    binary: drop\n    artifacts: drop\n    shards:\n      max_count: 5\n      max_tokens: 4000\n  - id: bare\n    binary: drop\n").unwrap();
#### let git = |a: &[&str]| assert!(Command::new("git").arg("-C").arg(&root)
####     .args(["-c", "user.email=t@example.com", "-c", "user.name=t"]).args(a)
####     .status().unwrap().success());
#### git(&["init", "-q"]);
#### std::fs::write(root.join("main.rs"), "fn main() {}\n").unwrap();
#### std::fs::write(root.join("logo.png"), b"\x89PNG\0\x01").unwrap();
#### git(&["add", "-A"]);
#### git(&["commit", "-q", "-m", "one"]);
let p: PackPlan = plan(&root, &share, None).plan;
assert!(p.measured && p.passes && p.index_matches_head);
assert_eq!((p.tracked, p.selected), (2, 1));
assert_eq!(p.dropped["binary"], 1);
// an unknown profile is not measured, and not measured is never a pass
let p: PackPlan = plan(&root, &share, Some("nope")).plan;
assert!(!p.measured && !p.passes);
vlastnosttyppovinnépopis
naměřeno boolean ano Zda šlo strom vůbec přečíst. false není úspěch.
důvod string | null ne Proč to nešlo, když to nešlo.
profil string ano Plánovaný profil.
commit string | null ne Commit, který jmenuje HEAD; obsah je obsahem indexu, který se mu rovná, když je index_matches_head pravda.
index_matches_head boolean ano Zda index drží přesně to, co drží HEAD. false znamená, že připravené změny cestují s balíčkem pod id commitu, který je neobsahuje.
sledováno integer (uint) ano Kolik souborů index sleduje.
vybráno integer (uint) ano Kolik jich pack nese.
bajty integer (uint64) ano Bajty nesoucího obsahu.
tokeny integer (uint64) ano Tokeny přeneseného obsahu v o200k_base.
tokenizér string ano Tokenizér, ve kterém jsou počty vyjádřeny.
limity ShardLimits | null → ShardLimits ne Uplatněné limity.
zahozeno mapa celých čísel (uint) ano Kolik souborů bylo vynecháno, podle důvodu.
dropped_files pole DroppedFile → DroppedFile ano Každý soubor vynechaný z jiného důvodu než derived.
shardy pole ShardPlan → ShardPlan ano Shardy v pořadí; index mezi ně nepatří.
zjištění pole PackFinding → PackFinding ano Každý důvod, proč balík nelze sestavit. Prázdný výpis je úspěšná odpověď.
průchody boolean ano true, když byl strom změřen a nic se nenašlo.

Používá pack.plan

PackVerdict

object
Verdikt o zapsaném balíčku: zda šel přečíst, co jmenuje jeho manifest, kolik souborů a zdrojů obsahuje a každé zjištění proti němu.

Příklady níže sestavují balíček repozitáře obsahujícího main.rs.

use majordomus_cli::pack::{build, plan, verify, PackVerdict, Profiles};
#### use std::process::Command;
#### let dir = tempfile::tempdir().unwrap();
#### let (root, share) = (dir.path().join("repo"), dir.path().join("share"));
#### std::fs::create_dir_all(&root).unwrap();
#### std::fs::create_dir_all(&share).unwrap();
#### std::fs::write(share.join("archive.yaml"), "default: chat\nprofiles:\n  - id: chat\n    binary: drop\n    artifacts: drop\n    shards:\n      max_count: 5\n      max_tokens: 4000\n").unwrap();
#### let git = |a: &[&str]| assert!(Command::new("git").arg("-C").arg(&root)
####     .args(["-c", "user.email=t@example.com", "-c", "user.name=t"]).args(a)
####     .status().unwrap().success());
#### git(&["init", "-q"]);
#### std::fs::write(root.join("main.rs"), "fn main() {}\n").unwrap();
#### git(&["add", "-A"]);
#### git(&["commit", "-q", "-m", "one"]);
let profiles = Profiles::load(&share, &root).unwrap();
let out = dir.path().join("pack");
let v: PackVerdict = build(&plan(&root, &share, None), &root, &out).unwrap();
assert_eq!((v.files, v.sources), (2, 1), "the index and one shard, carrying one file");
assert_eq!(v.profile.as_deref(), Some("chat"));
// a directory with no manifest is not measured, which is not a pass
let v: PackVerdict = verify(dir.path(), &profiles, &root);
assert!(!v.measured && !v.passes);
vlastnosttyppovinnépopis
naměřeno boolean ano Zda se balíček vůbec dal přečíst. false není úspěch.
důvod string | null ne Proč to nešlo, když to nešlo.
dir string ano Přečtený adresář.
profil string | null ne Profil, který pojmenovává jeho manifest.
commit string | null ne Commit, který pojmenovává jeho manifest.
soubory integer (uint) ano Kolik souborů drží, včetně indexu.
zdroje integer (uint) ano Kolik zdrojových souborů jeho shardy nesou.
largest_tokens integer (uint64) ano Tokeny jeho největšího souboru.
zjištění pole PackFinding → PackFinding ano Každý nález. Prázdné je úspěšná odpověď.
průchody boolean ano true, když byl balíček přečten a nic se nenašlo.

Používá pack.verify

ShardLimits

object
Limity shardů profilu: vlastní limity čtenáře na to, co dokáže indexovat, počet souborů projektu a tokeny, které smí obsahovat jeden jeho soubor.

use majordomus_cli::pack::{Profiles, ShardLimits};
let p = Profiles::parse(
    "default: a\nprofiles:\n  - id: a\n    shards:\n      max_count: 20\n      max_tokens: 900\n",
)
.unwrap();
let want = ShardLimits { max_count: 20, max_tokens: 900 };
assert_eq!(p.profile(None).unwrap().shards, Some(want));
vlastnosttyppovinnépopis
max_count integer (uint) ano Nejvíce souborů, které pack smí obsahovat, včetně indexu.
max_tokens integer (uint64) ano Nejvíce tokenů, které smí jeden soubor balíčku obsahovat, počítáno pomocí o200k_base.

Používá PackPlan

ShardPlan

object
Jeden plánovaný shard: soubor Markdown packu, cesty, které nese od první do poslední, a kolik váží v bajtech a v tokenech.

Níže uvedené příklady plánují repozitář obsahující main.rs a logo.png, jejíž obsah je binární, s distribucí, jejíž profil chat má limity a profil bare žádné.

use majordomus_cli::pack::{plan, ShardPlan};
#### use std::process::Command;
#### let dir = tempfile::tempdir().unwrap();
#### let (root, share) = (dir.path().join("repo"), dir.path().join("share"));
#### std::fs::create_dir_all(&root).unwrap();
#### std::fs::create_dir_all(&share).unwrap();
#### std::fs::write(share.join("archive.yaml"), "default: chat\nprofiles:\n  - id: chat\n    binary: drop\n    artifacts: drop\n    shards:\n      max_count: 5\n      max_tokens: 4000\n  - id: bare\n    binary: drop\n").unwrap();
#### let git = |a: &[&str]| assert!(Command::new("git").arg("-C").arg(&root)
####     .args(["-c", "user.email=t@example.com", "-c", "user.name=t"]).args(a)
####     .status().unwrap().success());
#### git(&["init", "-q"]);
#### std::fs::write(root.join("main.rs"), "fn main() {}\n").unwrap();
#### std::fs::write(root.join("logo.png"), b"\x89PNG\0\x01").unwrap();
#### git(&["add", "-A"]);
#### git(&["commit", "-q", "-m", "one"]);
let planned = plan(&root, &share, None);
let first: &ShardPlan = &planned.plan.shards[0];
assert_eq!((first.files, first.first.as_str(), first.last.as_str()), (1, "main.rs", "main.rs"));
assert!(first.file.ends_with(".md") && first.tokens > 0);
vlastnosttyppovinnépopis
soubor string ano Název souboru uvnitř balíčku.
soubory integer (uint) ano Kolik souborů nese.
první string ano První cesta, kterou nese.
poslední string ano Poslední cesta, kterou nese.
bajty integer (uint64) ano Bajty obsahu, který nese.
tokeny integer (uint64) ano Tokeny bloků, které nese.

Používá PackPlan

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