Klienci runtime’u todo2code dla pięciu języków. Każdy SDK rozmawia z
endpointem A2A v1.0 (POST /a2a, nagłówek A2A-Version: 1.0) i udostępnia
ten sam zestaw akcji.
| Język | Katalog | Zależności | Klasa |
|---|---|---|---|
| TypeScript / Node | typescript/ |
brak (globalne fetch) |
T2CClient |
| Python 3.10+ | python/ |
brak (urllib, subprocess, json) |
T2CClient, TypeScriptRuntime |
| Go 1.21+ | go/ |
brak (biblioteka standardowa) | todo2code.Client |
| Rust 1.70+ | rust/ |
serde, serde_json |
todo2code::Client |
| PHP 8.1+ | php/ |
brak (ext-json) |
Todo2Code\Client |
Rust jest jedynym SDK z zależnością zewnętrzną: standardowa biblioteka nie ma
parsera JSON. HTTP jest tam mówione wprost po std::net::TcpStream, żeby nie
wciągać runtime’u asynchronicznego.
Wszystkie akcje przechodzą przez SendMessage i zwracają task A2A. Metoda
call() rozpakowuje pierwszy artefakt JSON, więc kod wywołujący pracuje na
zwykłym wyniku:
send(action, input) -> Task (pełna odpowiedź A2A)
call(action, input) -> wynik akcji (rozpakowany artefakt)
Uwaga na kształt odpowiedzi: SendMessage opakowuje task jako {"task": …},
natomiast GetTask i CancelTask zwracają go bez wrappera. Każdy SDK
akceptuje obie postacie.
extract_nl, extract_git, extract_ast, extract_markdown, extract_docs,
extract_communication, analyze_communication, link, diagnose,
summarize, diff, diff_files, diff_git, reality,
compare_workspace, pipeline.
Granica LLM obowiązuje tak samo jak w CLI: extract_nl oraz semantyczne
wzbogacanie extract_markdown obsługują prefer-llm/require-llm, a
extract_docs i summarize wołają OpenRouter. Każdy SDK może wymusić
nlMode: deterministic lub markdownMode: deterministic i odczytać audyt
fallbacku (audit.status, effectiveMode, reason, runtimeVersion,
configuration). Wszystkie pięć klientów ma convenience methods dla NL i
dokumentacji. Python zachowuje metody zwracające same rekordy oraz udostępnia
pełne envelope przez warianty *_result(). Przykłady wymuszają
deterministyczne NL i Markdown, aby wynik i koszt nie zależały od sieci, oraz
odrzucają wynik bez poprawnego audytu.
Python ma dodatkowo lokalny most TypeScriptRuntime, który przez subprocess
uruchamia kanoniczny CLI Node/TypeScript. Dzięki temu paczka może wykonywać
pipeline, diagnostykę, graph diff i reality bez serwera, zachowując dokładnie tę
samą semantykę co CLI.
Najpierw serwer:
npm run build
node dist/src/interfaces/a2a.js # domyślnie :8787
Potem dowolny przykład (wszystkie robią to samo: NL → AST → Markdown → graf → diagnostyka → widok reality → diff Git):
export T2C_A2A_URL=http://localhost:8787
export T2C_EXAMPLE_ROOT=examples/backend
npx tsc -p sdk/typescript/tsconfig.json && node sdk/typescript/dist/examples/basic.js
python3 sdk/python/examples/basic.py
(cd sdk/go && go run ./examples/basic)
(cd sdk/rust && cargo run --example basic)
php sdk/php/examples/basic.php
Opcjonalny czwarty przypadek testuje porównanie origin/main z aktualnym
filesystemem przez wspólną akcję runtime’u:
export T2C_COMPARE_WORKSPACE=1
export T2C_COMPARE_BASE=origin/main
Gdy serwer działa z T2C_A2A_TOKEN, ustaw tę samą zmienną w środowisku
klienta — każdy SDK dołączy nagłówek Authorization: Bearer.
Wszystkie pięć przykładów przepuszcza te same 92 rekordy przez link i musi
otrzymać identyczny fingerprint grafu. Rozjazd oznacza, że typy danego SDK
gubią pole przy round-tripie:
graph fingerprint: debfd0f1923dbae0 # TS, Python, Go, Rust, PHP
Fingerprint dotyczy fixture’a examples/backend w wersji 0.4.0; jego zmiana
po świadomej aktualizacji fixture’a lub semantyki linkera wymaga ponownego
uruchomienia wszystkich pięciu przykładów i aktualizacji tej wartości.