Šéŕṽéŕ ÀÞÎ
Ƃöŵŕàîñ þŕöṽîđéš ƃöţĥ ŔÉŠŢ àñđ ĝŔÞÇ ÀÞΚ ƒöŕ þŕöĝŕàḿḿàţîç àççéšš ţö ţĥé þļàţƒöŕḿ.
ŔÉŠŢ ÀÞÎ
Ţĥé ŔÉŠŢ ÀÞÎ šéŕṽéš öñ ţĥé çöñƒîĝüŕéđ ĤŢŢÞ þöŕţ üñđéŕ /api/v1. Éṽéŕý ŕöüţé
ţĥàţ ţöüçĥéš à ŵöŕķšþàçé'š đàţà îš ŵöŕķšþàçé-šçöþéđ: :ws îš ţĥé ŵöŕķšþàçé
šļüĝ, :id à þŕöĵéçţ îđ, àñđ :ref ţĥé šţŕéàḿ (main ŵĥéñ à þŕöĵéçţ ĥàš öñļý
öñé). ÀÞÎ ţöķéñš (šéé Ḿéḿƃéŕš àñđ ŕöļéš)
àüţĥéñţîçàţé àš Authorization: Bearer <token>.
Ĥéàļţĥ
GET /api/v1/health
Þŕöĵéçţš
GET /api/v1/:ws/projects # List projects in a workspace
POST /api/v1/:ws/projects # Create a project
GET /api/v1/:ws/:id # Get a project
PUT /api/v1/:ws/:id # Update a project
DELETE /api/v1/:ws/:id # Delete a project
GET /api/v1/:ws/:id/blocks/:ref # Blocks on a stream (?item=&locale=&status=&q=)
GET /api/v1/:ws/:id/blocks/:ref/:bid # One block
Çöñţéñţ çĥàñĝéš
POST /api/v1/:ws/projects/:id/streams/:stream/changes # Apply a change set to a stream
PUT /api/v1/:ws/:id/blocks/:ref/:bid/access # Move a block along the access ladder
POST /api/v1/:ws/:id/blocks/:ref/:bid/rollback # Restore a translation to an entry of its history
POST /api/v1/:ws/:id/revert # Revert the changes recorded under one correlation id
POST /api/v1/:ws/:id/restore # Restore a stream to a version or a change-log cursor
GET /api/v1/:ws/:id/blocks/:ref/:bid/notes # A block's notes, oldest first
À þéŕšöñ çĥàñĝéš à šţŕéàḿ'š çöñţéñţ, đéçîđéš öñ à ţŕàñšļàţîöñ àñđ àññöţàţéš à
ƃļöçķ ţĥŕöüĝĥ ţĥé çĥàñĝéš ŕöüţé. Îţš ƃöđý îš à kapi.change/v1 çĥàñĝé šéţ, ţĥé
ƒöŕḿ kapi apply àñđ ţĥé apply_edits ţööļ ţàķé (šéé Çĥàñĝé
šéţš).
Éàçĥ öþéŕàţîöñ àđđŕéššéš öñé éđîţîöñ öƒ öñé ƃļöçķ àš {doc, block, edition}:
doc îš ţĥé îţéḿ'š þàţĥ îñ ţĥé šţŕéàḿ, block îš ţĥé ƃļöçķ'š ķéý, îţš ñàḿé öŕ
îţš îđ, àñđ àñ éḿþţý edition îš ţĥé šöüŕçé. Éàçĥ öþéŕàţîöñ çàŕŕîéš if_match,
ţĥé ŕéṽîšîöñ ţĥé šéñđéŕ ŕéàđ. Ţĥé àñšŵéŕ îš à kapi.change-result/v1 đöçüḿéñţ.
À çĥàñĝé šéţ ţĥàţ àþþļîéđ, þŕéṽîéŵéđ öŕ þàŕţļý ļàñđéđ îš àñšŵéŕéđ 200 ŵîţĥ
îţš šţàţüš. À ŕéƒüšéđ çĥàñĝé šéţ ŵŕîţéš ñöţĥîñĝ, àñđ îţš šţàţüš çöđé îš ţĥé öñé
îţš ƒîŕšţ ŕéƒüšàļ'š çöđé ḿàþš ţö:
| Çöđé | Šţàţüš |
|---|---|
invalid | 400 |
not_permitted | 403 |
not_found | 404 |
stale, ambiguous, doc_changed | 409 |
budget_exceeded | 413 |
guard, gate_failed, unsupported | 422 |
unreachable | 503 |
À stale ŕéƒüšàļ çàŕŕîéš ţĥé éđîţîöñ'š çüŕŕéñţ ŕéṽîšîöñ àñđ ţéẋţ, šö ţĥé
šéñđéŕ đéçîđéš àĝàîñ öñ ţĥé ŵöŕđîñĝ ţĥàţ šţàñđš. À ŕéṽîšîöñ çöṽéŕš àñ
éđîţîöñ'š çöñţéñţ, îñļîñé çöđéš îñçļüđéđ; à šöüŕçé éđîţ öŕ à ŕéṽîéŵ đéçîšîöñ
ļéàṽéš à ţŕàñšļàţîöñ'š ŕéṽîšîöñ ŵĥéŕé îţ ŵàš. Ţĥé éđîţöŕ'š ƃļöçķš þàýļöàđ
çàŕŕîéš éàçĥ šéŕṽéđ ţŕàñšļàţîöñ'š ŕéṽîšîöñ îñ target_revisions, àñđ ţĥé
get_block ţööļ ŕéţüŕñš ţĥé šàḿé ṽàļüéš àš revisions.
Ţĥé ŵéƃ éđîţöŕ, ţĥé ŕéṽîéŵ šüŕƒàçéš àñđ ţĥé đéšķţöþ àþþ šéñđ éṽéŕý šàṽé àñđ
đéçîšîöñ ŵîţĥ ţĥé ŕéṽîšîöñ ţĥéý ŕéñđéŕéđ ƒŕöḿ target_revisions
(bowrain/packages/ui/src/api/contentChanges.ts). Öñ à stale ŕéƒüšàļ ţĥé
šüŕƒàçé šĥöŵš ţĥé þéŕšöñ ţĥé ţŕàñšļàţîöñ àš îţ šţàñđš àñđ šéñđš ţĥé öþéŕàţîöñ
àĝàîñ öñ ţĥé ŕéƒüšàļ'š ŕéṽîšîöñ öñļý ŵĥéñ ţĥéý çĥööšé ţö. Öñ à gate_failed
ŕéƒüšàļ öƒ à šàṽé îţ ļîšţš ţĥé öþéŕàţîöñ'š ƒàîļîñĝ ƒîñđîñĝš àñđ, ŵĥéñ ţĥé
þéŕšöñ çĥööšéš ţö šàṽé àñýŵàý, šéñđš ţĥé šàḿé çĥàñĝé šéţ àĝàîñ ŵîţĥ
gate: "report", ŵĥîçĥ ţĥé šéŕṽéŕ àđḿîţš ƒŕöḿ à þéŕšöñ àñđ ŕéçöŕđš ŵîţĥ ţĥé
öṽéŕŕîđđéñ ƒîñđîñĝš. À ţŕàñšļàţîöñ îš àļŵàýš šéñţ àš runs: à þļüŕàļ àš öñé
þļüŕàļ ŕüñ ŵîţĥ îţš ƒöŕḿš, à çöñţéñţ-ḿéḿöŕý ḿàţçĥ àš ţĥé target_runs ţĥé
ḿàţçĥ ļööķüþ šéŕṽéš, àñđ àñ îñšéŕţéđ ţéŕḿ àþþéñđéđ ţö ţĥé ţŕàñšļàţîöñ'š ŕüñš,
šö îñļîñé çöđéš àñđ þļüŕàļ šţŕüçţüŕé ţŕàṽéļ ŵîţĥ ţĥé éđîţ. Ñöţéš àñđ éñţîţý
ḿàŕķš àŕé annotate àñđ unannotate öþéŕàţîöñš öñ ţĥé šöüŕçé éđîţîöñ, àñçĥöŕéđ
àţ ŕüñ þöšîţîöñš îñ source_runs, ŵĥîçĥ ţĥé ƃļöçķš ŕöüţé šéŕṽéš ƒöŕ àñý šöüŕçé
ţĥàţ îš ḿöŕé ţĥàñ öñé ŕüñ. Ţĥé
đéšķţöþ šéñđš îţš çĥàñĝé šéţš ţĥŕöüĝĥ editorclient.ApplyChanges; ŵîţĥ ţĥé
šéŕṽéŕ öüţ öƒ ŕéàçĥ îţ àþþļîéš öñé ţö îţš ļöçàļ çàçĥé àñđ ǫüéüéš îţ üñçĥàñĝéđ îñ
îţš öƒƒļîñé öüţƃöẋ, šö ţĥé šéŕṽéŕ ĵüđĝéš éàçĥ if_match öñ ŕéþļàý àñđ à ǫüéüéđ
éđîţ ţö à ţŕàñšļàţîöñ ţĥàţ ḿöṽéđ ḿéàñŵĥîļé îš ŕéƒüšéđ àñđ ḿàŕķéđ ƒàîļéđ.
Ţĥé šéŕṽéŕ ĥöļđš éàçĥ öþéŕàţîöñ ţö ŵĥàţ ţĥé šéñđéŕ ḿàý đö öñ ţĥé þŕöĵéçţ:
set_content,replace_textàñđremove_editionöñ à ţŕàñšļàţîöñ ţàķé ţĥétranslateþéŕḿîššîöñ ƒöŕ îţš ļàñĝüàĝé. Öñ ţĥé šöüŕçé ţĥéý ţàķéedit_source, àñđ ţĥé šöüŕçé öƒ àñ îţéḿ à çöññéçţöŕ šýñçš îš éđîţéđ àţ ţĥé çöññéçţöŕ. À ƃļöçķ ŵĥöšé àççéšš îš ŕéšţŕîçţéđ ţàķéš àñ éđîţ ƒŕöḿ îţš öŵñéŕ öŕ à ŕéṽîéŵéŕ öƒ ţĥé ļàñĝüàĝé, àñđ à þüƃļîšĥéđ ƃļöçķ ƒŕöḿ à þŕöĵéçţ ḿàñàĝéŕ. Ţĥé àççéšš ŕöüţé ḿöṽéš à ƃļöçķ àļöñĝ ţĥàţ ļàđđéŕ (open,restricted,published) àñđ îš ŕéçöŕđéđ àšcontent.access_changed: ŕéšţŕîçţîñĝ öŕ þüƃļîšĥîñĝ ţàķéšreview, üñ-þüƃļîšĥîñĝ ţàķéšmanage_project, àñđ à þüƃļîšĥ îš ĥéļđ ţö ţĥé ŵöŕķšþàçé'š šéþàŕàţîöñ-öƒ-đüţîéš þöļîçý ƒöŕ éṽéŕý ļàñĝüàĝé îţ þüƃļîšĥéš.decideŕéçöŕđš à ŕéṽîéŵ đéçîšîöñ.establishţàķéš ţĥéreviewþéŕḿîššîöñ ƒöŕ ţĥé ļàñĝüàĝé àñđ îš ĥéļđ ţö ţĥé ŵöŕķšþàçé'š šéþàŕàţîöñ-öƒ-đüţîéš þöļîçý; à çĥàñĝé šéţ ţĥàţ àļšö ŵŕîţéš ţĥé ţŕàñšļàţîöñ îţ àþþŕöṽéš îš àþþŕöṽîñĝ ţĥé šéñđéŕ'š öŵñ ŵöŕđîñĝ.rejectŕéţüŕñš ţĥé ţŕàñšļàţîöñ ţö đŕàƒţ àñđwithdrawţö ţŕàñšļàţéđ; ḿöṽîñĝ àñ àþþŕöṽéđ ţŕàñšļàţîöñ ţàķéšreview. Éàçĥ đéçîšîöñ îš ŵŕîţţéñ ţö ţĥé đéçîšîöñ ļéđĝéŕ àñđ ţĥé ŵöŕķšþàçé'š çöñţéñţ ḿéḿöŕý, àš àþþŕöṽé-þàššîñĝ ŵŕîţéš îţ.adviseŕéçöŕđš à þŕé-ŕéṽîéŵ: ţĥéscore(ŕéǫüîŕéđ, 0 ţö 100) àñđreasonsàñ àĝéñţ ĝîṽéš ţĥé ţŕàñšļàţîöñ, ƒîļéđ üñđéŕagent/<client>àĝàîñšţ ţĥé ŕéṽîšîöñ îñif_match. Îţ ḿöṽéš ñö šţàţüš àñđ ţàķéštranslateƒöŕ ţĥé ļàñĝüàĝé. Öñļý àñ àĝéñţ šéñđš îţ, öṽéŕ ţĥé šéŕṽéŕ ḾÇÞ; ţĥé çĥàñĝéš ŕöüţé ŕéƒüšéš à þéŕšöñ'šadviseŵîţĥnot_permitted, ƃéçàüšé ţĥé ǫüéüé šĥöŵš à þŕé-ŕéṽîéŵ àš ÀÎ àđṽîçé. Éàçĥ éñţŕý öƒ ţĥé þéñđîñĝ-ŕéṽîéŵ ǫüéüé çàŕŕîéš îţ àšpre_review, àñđ ţĥé ŕéṽîéŵ çöñţéẋţ àš ţĥé ĵüđĝéḿéñţ'šai_score,ai_modelàñđai_findings, ŵĥîļé ţĥé ţŕàñšļàţîöñ šţàñđš àţ ţĥàţ ŕéṽîšîöñ.- À ñöţé îš àñ
annotateöƒ ţýþénoteöñ ţĥé šöüŕçé, ŵĥîçĥ àñýöñé ŵĥö ḿàý ŕéàđ ţĥé çöñţéñţ ļéàṽéš; ţĥé šéŕṽéŕ šţàḿþš îţ ŵîţĥ îţš àüţĥöŕ àñđ ţĥé ţîḿé îţ ļàñđéđ. Àñannotateüñđéŕ àñ éẋîšţîñĝ ñöţé'š îđ ŕéŵŕîţéš îţ àñđ àñunannotateŕéḿöṽéš îţ, éàçĥ šéñţ ƃý îţš àüţĥöŕ öŕ à þŕöĵéçţ ḿàñàĝéŕ. À ñöţé öñ à ţŕàñšļàţîöñ îš ŕéƒüšéđ. Àñ éñţîţý îš àñ àññöţàţîöñ öƒ ţýþéentityöñ ţĥé šöüŕçé, àñđ ţàķéšedit_source. - Àñ àĝéñţ ḿàý ñéîţĥéŕ šéñđ
gate: reportñöŕ ŵŕîţé ŵîţĥöüţ ţĥé ŕéṽîšîöñ îţ ŕéàđ, àñđ ŕéçöŕđš ñö ŕéṽîéŵ đéçîšîöñ öţĥéŕ ţĥàñ à þŕé-ŕéṽîéŵ (advise). Ţĥé šéŕṽéŕ ḾÇÞ ĥöļđš àñ àĝéñţ ţö ţĥé þéŕḿîššîöñš ţĥé þŕöĵéçţ àççéšš ḿîđđļéŵàŕé ŕéšöļṽéš ƒöŕ ţĥé üšéŕ îţ àçţš ƒöŕ, ŵîţĥ ţĥé šàḿé ŕéšöļṽéŕ; ŵĥéñ ţĥé ŵöŕķšþàçé öŕ ţĥé üšéŕ'š ḿéḿƃéŕšĥîþ çàññöţ ƃé ŕéàđ, ţĥé çàļļ ƒàîļš àñđ ţĥé àĝéñţ çàñ ţŕý àĝàîñ.
Ƃéƒöŕé à çĥàñĝé šéţ ļàñđš, ţĥé šéŕṽéŕ çĥéçķš éàçĥ éđîţîöñ îţ çĥàñĝéš àĝàîñšţ
ţĥé çĥéçķš îñ ƒöŕçé ŵĥéŕé ţĥé îţéḿ šîţš, ŕéšöļṽéđ àš ţĥé éđîţöŕ'š çĥéçķ ŕöüţéš
àñđ ţĥé šĥîþ ĝàţé ŕéšöļṽé ţĥéḿ. À ţŕàñšļàţîöñ ḿééţš ţĥé ŕüļé çĥéçķš, ŵîţĥ
þļàçéĥöļđéŕ îñţéĝŕîţý àĝàîñšţ îţš šöüŕçé, ţĥé þŕöţéçţéđ ţéŕḿš àñđ ţĥé ţéŕḿ
ĝàţé. Ţĥé šöüŕçé ḿééţš ţĥé ṽöîçé þŕöƒîļé'š ŕüļéš àñđ ţĥé ŵöŕķšþàçé'š ŕéţîŕéđ,
ƒöŕƃîđđéñ àñđ çöḿþéţîţöŕ ţéŕḿš. À ƒàîļîñĝ ƒîñđîñĝ ŕéƒüšéš ţĥé çĥàñĝé šéţ ŵîţĥ
gate_failed àñđ ţĥé ƒîñđîñĝš, üñļéšš à þéŕšöñ šéñđš gate: report. Öñļý
đéţéŕḿîñîšţîç çĥéçķš ŕüñ àţ çöḿḿîţ.
Ţĥé ţéŕḿ ĝàţé ĥöļđš àñ îñ-ḿéḿöŕý šñàþšĥöţ öƒ ţĥé ŵöŕķšþàçé'š ţéŕḿš, ŵĥîçĥ ţĥé
çöḿḿîţ çĥéçķ, ţĥé šĥîþ-šţàţé þàšš àñđ ţĥé ŕéṽîéŵ ǫüéüé šĥàŕé. Éṽéŕý ŵŕîţé ţö
ţĥé ţéŕḿš šţöŕé ĝîṽéš ţĥé ŵöŕķšþàçé'š ţéŕḿš à ñéŵ ŕéṽîšîöñ (tb_revision, îñ
ţĥé ţŕàñšàçţîöñ öƒ ţĥé ŵŕîţé), àñđ ţĥé šéŕṽéŕ ķééþš öñé šñàþšĥöţ þéŕ ŵöŕķšþàçé
üñđéŕ ţĥé ŕéṽîšîöñ îţ ŵàš ŕéàđ àţ. À çàļļ ŕéàđš ţĥé ŕéṽîšîöñ ƒîŕšţ àñđ ŕéàđš
ţĥé ŵĥöļé ţéŕḿš àĝàîñ öñļý ŵĥéñ îţ ḿöṽéđ, šö à çĥéçķ çöšţš öñé ǫüéŕý ŵĥîļé
ñöƃöđý ŵŕîţéš ţĥé ţéŕḿš, öñ éṽéŕý ŕéþļîçà. Ţĥé ḿîĝŕàţîöñ ţĥàţ àđđš
tb_revision ĝîṽéš éṽéŕý ŵöŕķšþàçé ţĥàţ àļŕéàđý ĥöļđš ţéŕḿš à ƒîŕšţ ŕéṽîšîöñ.
À šéŕṽéŕ ķééþš šñàþšĥöţš ƒöŕ àţ ḿöšţ 32 ŵöŕķšþàçéš, đŕöþþîñĝ ţĥé öñé üšéđ ļéàšţ
ŕéçéñţļý, àñđ đŕöþš à ŵöŕķšþàçé'š šñàþšĥöţ ŵĥéñ îţš ŕéṽîšîöñ ŕéàđš éḿþţý. À
ŵŕîţé ḿàđé öüţšîđé ţĥé šţöŕé, šüçĥ àš öñé-öƒƒ ŠǪĻ, ḿöṽéš ñö ŕéṽîšîöñ; ţĥé ñéẋţ
ŵŕîţé ţĥŕöüĝĥ ţĥé šţöŕé, öŕ à ŕéšţàŕţ, ƃŕîñĝš ţĥé šñàþšĥöţ üþ ţö đàţé.
Ţĥé ŵŕîţéš öƒ à çĥàñĝé šéţ, ţĥé ƃļöçķ ĥîšţöŕý àñđ ţĥé çĥàñĝé ļöĝ ļàñđ îñ öñé
ţŕàñšàçţîöñ ţĥàţ ĥöļđš ţĥé ƃļöçķš' ŕöŵš, àñđ ţĥé ŕéṽîšîöñ éàçĥ öþéŕàţîöñ ñàḿéš
îš çöḿþàŕéđ îñšîđé îţ, šö à çĥàñĝé çöḿḿîţţéđ ƃéţŵééñ ţĥé šéñđéŕ'š ŕéàđ àñđ ţĥé
ŵŕîţé ŕéƒüšéš ţĥé öþéŕàţîöñ àš stale. Éàçĥ ĥîšţöŕý éñţŕý çàŕŕîéš ţĥé šéñđéŕ
àñđ ţĥé çĥàñĝé šéţ'š çöŕŕéļàţîöñ îđ, ŵĥîçĥ revert ţàķéš, àñđ éàçĥ çĥàñĝé šéţ
ţĥàţ ļàñđš îš ŕéçöŕđéđ àš à content.changed éṽéñţ.
Ŕöļļƃàçķ, ŕéṽéŕţ àñđ ŕéšţöŕé àþþļý ŵĥàţ ţĥéý ŕéšţöŕé àš à çĥàñĝé šéţ ƒŕöḿ ţĥé
þéŕšöñ ŵĥö àšķéđ, àĝàîñšţ ţĥé ŕéṽîšîöñ éàçĥ ţŕàñšļàţîöñ ĥöļđš ŵĥéñ ţĥé ŕöüţé
ŕéàđš îţ: ŕöļļƃàçķ šéţš ţĥé çöñţéñţ öƒ ţĥé ĥîšţöŕý éñţŕý, îñļîñé çöđéš
îñçļüđéđ, àñđ à ţŕàñšļàţîöñ ţĥàţ đîđ ñöţ éẋîšţ àţ ţĥé ŕéšţöŕéđ þöîñţ îš
ŕéḿöṽéđ. Ţĥéý ŕéàđ öñļý ţĥé ĥîšţöŕý éñţŕîéš ţĥàţ ŕéçöŕđ çöñţéñţ: àñ éñţŕý
ţĥàţ ŕéçöŕđš à ŕéḿöṽàļ ŕéšţöŕéš ñöñé, àñđ à ŕöļļƃàçķ ţö à đéçîšîöñ éñţŕý îš
ŕéƒüšéđ ŵîţĥ 422. À ŕöļļƃàçķ ţàķéš ţĥé ŕéṽîšîöñ ţĥé çàļļéŕ ŕéàđ àš
base_revision. À ţŕàñšļàţîöñ ţĥàţ ḿöṽéđ šîñçé ţĥé ŕöüţé ŕéàđ îţ ķééþš ŵĥàţ îţ
ĥöļđš. Ţĥé ŕéšţöŕéđ ŵöŕđîñĝ ļàñđš öṽéŕ ţĥé ƒîñđîñĝš îţ ƃŕîñĝš ƃàçķ.
Šýñç
Ţĥé šýñç ŕöüţéš àŕé ŵĥàţ ţĥé kapi-bowrain þļüĝîñ šþéàķš. À þüšĥ đéçļàŕéš îţš
ţŕéé, üþļöàđš öñļý ŵĥàţ ţĥé šéŕṽéŕ ļàçķš, àñđ çöḿḿîţš à ḿàñîƒéšţ; à þüļļ ŕéàđš
ţĥé šéŕṽéŕ'š ţŕéé àñđ ţĥé çĥàñĝéš šîñçé ţĥé çļîéñţ'š ŕéƒ.
GET /api/v1/:ws/:id/sync/:ref/tree # The declared tree
GET /api/v1/:ws/:id/sync/:ref/ref # The server's current ref
GET /api/v1/:ws/:id/sync/:ref/pull # Changes since a ref
GET /api/v1/:ws/:id/sync/:ref/blocks # Blocks by id
GET /api/v1/:ws/:id/sync/:ref/status # Standing of an in-flight push
GET /api/v1/:ws/:id/sync/:ref/blobs/:key # Download a blob
POST /api/v1/:ws/:id/sync/:ref/push/init # Declare the tree; receive what to upload
POST /api/v1/:ws/:id/sync/:ref/push/uploads # Presigned upload URLs for the chunks
PUT /api/v1/:ws/:id/sync/:ref/push/chunks/:uploadId/:chunkIndex # Proxied chunk upload
POST /api/v1/:ws/:id/sync/:ref/push/commit # Commit the manifest (202; a worker applies it)
Ţĥé þüšĥ îñîţ ţàķéš ţĥé ŕéçîþé'š settings (converge_policy,
translate_after àñđ term_rules, àţ ţĥéîŕ 郃éçţîṽé ṽàļüéš) àñđ àñšŵéŕš ŵîţĥ settings, ţĥé
ṽàļüéš ţĥé þŕöĵéçţ ĥöļđš, àñđ settings_refused, ţĥé öñéš ţĥîš çàļļéŕ'š çöḿḿîţ
ŵöüļđ ñöţ àþþļý. Ţĥé çļîéñţ þüţš îñ ţĥé çöḿḿîţ'š settings ḿàþ öñļý à šéţţîñĝ
ţĥàţ đéŕš àñđ îš ñöţ ŕéƒüšéđ, àñđ ŕéþöŕţš ţĥé ŕéƒüšàļš. Ţĥé çöḿḿîţ ŕéǫüîŕéš
ţĥé þüšĥ þéŕḿîššîöñ (manage_files), ṽàļîđàţéš éàçĥ ṽàļüé àĝàîñšţ ţĥé ŕéçîþé
šçĥéḿà (400 ƒöŕ à ṽàļüé öüţšîđé îţ) àñđ đéçîđéš àĝàîñ àĝàîñšţ ţĥé þŕöĵéçţ àš
îţ ţĥéñ šţàñđš:
- À þüšĥ ţö à šţŕéàḿ öţĥéŕ ţĥàñ ţĥé þŕöĵéçţ'š đéƒàüļţ àþþļîéš ñöţĥîñĝ, àñđ éàçĥ
đéŕîñĝ šéţţîñĝ îš ŕéƒüšéđ ŵîţĥ
not_default_stream. - Öñ ţĥé đéƒàüļţ šţŕéàḿ à šéţţîñĝ ţĥàţ ţîĝĥţéñš àþþļîéš (
translate_afterţöŵàŕđestablished,converge_policyţöŵàŕđmanual,term_rulesţĥàţ ķééþ éṽéŕý ŕüļé ţĥé þŕöĵéçţ ĥöļđš). À šéţţîñĝ ţĥàţ ļööšéñš àþþļîéš öñļý ŵĥéñ ţĥé çàļļéŕ ĥöļđšmanage_project, àñđ îš öţĥéŕŵîšé ŕéƒüšéđ ŵîţĥloosensàñđrequires: manage_project.
term_rules çàŕŕîéš ţĥé ŕéçîþé'š ŕüļéš àš core/profile.RecipeTermRules
éñçöđéš ţĥéḿ: all ƒöŕ ţĥé ŕüļéš öñ ƒļöŵ šţéþš àñđ îñ defaults.tools, àñđ
locales ƒöŕ ţĥé öñéš üñđéŕ defaults.locales.<lang>.tools. Ţĥé þŕöĵéçţ ķééþš
ţĥéḿ îñ îţš term_rules þŕöþéŕţý. Ţĥé šĥîþ-šţàţé þàšš, ţĥé ŕéṽîéŵ ǫüéüé àñđ
àþþŕöṽé-þàššîñĝ ŕéàđ ţĥéḿ ţĥŕöüĝĥ ţĥé ţéŕḿ ĝàţé (store.RecipeTermRulesOf),
àñđ ţĥé ţŕàñšļàţîöñ àñđ ŕéçýçļé ĵöƃš àđđ ţĥéḿ ţö ţĥé ŕüļéš ţĥé ŵöŕķšþàçé ţéŕḿš
ĝîṽé, à ŕéçîþé ŕüļé ŕéþļàçîñĝ ţĥé šţöŕéđ ŕüļé ƒöŕ ţĥé šàḿé ţéŕḿ.
Àþþļîéđ šéţţîñĝš àŕé ŵŕîţţéñ ƃéƒöŕé ţĥé þüšĥ ĵöƃ îš ǫüéüéđ, šö ţĥé ŕüñ ţĥé þüšĥ
šţàŕţš ŕéàđš ţĥéḿ. Éàçĥ öñé îš ŕéçöŕđéđ àš à project.setting_changed àüđîţ
éṽéñţ ŵîţĥ ţĥé àçţöŕ àñđ ţĥé ṽàļüé ƃéƒöŕé àñđ àƒţéŕ. Ţĥé 202 ŕéšþöñšé çàŕŕîéš
settings_applied àñđ settings_refused ŵĥéñ éîţĥéŕ îš ñöñ-éḿþţý.
À þüļļ ŵàļķš ţĥé šţŕéàḿ'š çĥàñĝé ļöĝ ƒöŕŵàŕđ ƒŕöḿ ţĥé çļîéñţ'š çüŕšöŕ àñđ šéŕṽéš éàçĥ çĥàñĝéđ ƃļöçķ üñđéŕ ţĥé îţéḿ îţ ƃéļöñĝš ţö. À þàĝé çàŕŕîéš éàçĥ ƃļöçķ öñçé, àţ îţš ļàţéšţ çĥàñĝé šîñçé ţĥé çüŕšöŕ, šö à þüļļ ƒŕöḿ ţĥé šţàŕţ šéŕṽéš éṽéŕý ƃļöçķ öñçé, àñđ à ƃļöçķ ţĥàţ çĥàñĝéš àƒţéŕ îţš þàĝé àŕŕîṽéš àĝàîñ öñ à ļàţéŕ þàĝé. À ƃļöçķ ŕöŵ ţĥàţ ƃéļöñĝš ţö ñö îţéḿ îš ļéƒţ öüţ öƒ ţĥé ŕéšþöñšé, àñđ ţĥé çüŕšöŕ ţĥé ŕéšþöñšé ŕéţüŕñš šţîļļ ḿöṽéš þàšţ îţš çĥàñĝé, šö éṽéŕý çļîéñţ çöñţîñüéš ƒŕöḿ ţĥé šàḿé þļàçé. Ţĥé šéŕṽéŕ ļöĝš ĥöŵ ḿàñý šüçĥ ŕöŵš à þüļļ ļéƒţ öüţ.
Šéŕṽéŕ ŵöŕķ ţĥàţ đŕàƒţš ƒŕöḿ ţĥé ƃļöçķš îţ ŕéàđ, šüçĥ àš ţĥé ţŕàñšļàţîöñ àñđ éẋţŕàçţîöñ ĵöƃš, þšéüđö-ţŕàñšļàţîöñ, çöñţéñţ-ḿéḿöŕý ţŕàñšļàţîöñ, àþþļýîñĝ çöñţéñţ ḿéḿöŕý îñ ƃüļķ àñđ ţĥé þàššéš öƒ à ƒļöŵ ŕüñ, çöḿḿîţš ŵĥàţ îţ þŕöđüçéđ àš à çĥàñĝé šéţ ƒŕöḿ ţĥé ţööļ, àĝàîñšţ ţĥé ŕéṽîšîöñ öƒ éàçĥ éđîţîöñ îţ ŕéàđ. Ţĥé šþàñš à ţööļ ḿàŕķš àŕé ĝüàŕđéđ ƃý ţĥé ŕéṽîšîöñ öƒ ţĥé éđîţîöñ ţĥéý ļîé öñ. À ƃļöçķ ŵĥöšé šöüŕçé ḿöṽéđ, öŕ ŵĥöšé ţŕàñšļàţîöñ à þéŕšöñ çĥàñĝéđ, šîñçé ţĥé ŕéàđ ķééþš ŵĥàţ îţ ĥöļđš, àñđ ţĥé ŕéšţ öƒ ţĥé çĥàñĝé šéţ ļàñđš; ţĥé šéŕṽéŕ ļöĝš ĥöŵ ḿàñý ƃļöçķš à çöḿḿîţ ļéƒţ öüţ, ƃý çöđé. À ŕéḿöṽéđ îţéḿ šţàýš ŕéḿöṽéđ. Ţĥé ƃļöçķ àññöţàţîöñš àñđ þŕöþéŕţîéš à ţööļ ŵŕîţéš (çöñţéñţ-ḿéḿöŕý çàñđîđàţéš, éẋţŕàçţéđ ţéŕḿîñöļöĝý) ļàñđ öñ ţĥé ŕöŵš ţĥàţ ĥöļđ ţĥé çöñţéñţ îţ þŕöđüçéđ, îñ ţĥé šàḿé ĥéļđ ŵŕîţé ţĥàţ šöüŕçé šéţţļéḿéñţ àñđ ţĥé ŕéṽîéŵ ŕéçĥéçķ üšé: ţĥöšé ţŵö ĵüđĝé çöñţéñţ ŵîţĥöüţ çĥàñĝîñĝ îţ, àñđ ţĥéîŕ šţàţüšéš, šţàḿþš àñđ ƒîñđîñĝš ļàñđ öñļý öñ à ŕöŵ ţĥàţ šţîļļ ĥöļđš ţĥé çöñţéñţ ţĥéý ŕéàđ, šö à ţŕàñšļàţîöñ à þéŕšöñ ŕéŵŕöţé ḿéàñŵĥîļé ķééþš ţĥé ŕéŵŕîţé. Ţĥé þŕöþéŕţîéš šüçĥ ŵöŕķ ŕéçöŕđš öñ à ƃļöçķ, šüçĥ àš ţĥé šöüŕçé šéţţļéḿéñţ šţàḿþ, àŕé šţöŕéđ ŵîţĥöüţ çĥàñĝîñĝ ţĥé ƃļöçķ'š šţöŕéđ çöñţéẋţ ĥàšĥ, šö ţĥé þŕöđüçéŕ'š ñéẋţ þüšĥ çöḿþàŕéš àĝàîñšţ ţĥé ĥàšĥéš îţš öŵñ þüšĥ šţöŕéđ àñđ üþļöàđš öñļý ŵĥàţ çĥàñĝéđ.
Àþþŕöṽîñĝ à šöüŕçé þŕöþöšàļ îš ţĥé àþþŕöṽéŕ'š éđîţ öƒ ţĥé šöüŕçé ţĥŕöüĝĥ ţĥé
çĥàñĝéš ŕöüţé'š ŕüļéš, ĝüàŕđéđ ƃý ţĥé šöüŕçé ţĥé þŕöþöšàļ ŵàš ḿàđé àĝàîñšţ.
Ţĥŕéé ŵŕîţéŕš ḿöṽé ŵĥàţ à ŕöŵ ĥöļđš ƃéšîđé îţš çöñţéñţ ŵîţĥöüţ à çĥàñĝé šéţ:
à ŕéṽîéŵ đéçîšîöñ'š šţàţüš (àþþļîéđ àš ţĥé decide öþéŕàţîöñ ļàñđš), ţĥé
ţéŕḿ çàñđîđàţé àñ éñţîţý'š þŕöḿöţîöñ àđđš, àñđ à þüšĥ, ŵĥîçĥ àþþļîéš à
þŕöđüçéŕ'š šţàţé. Ţĥé ƒîŕšţ ţŵö ĥöļđ ţĥé ƃļöçķ'š ŕöŵ ŵĥîļé ţĥéý ŵŕîţé, àñđ à
þüšĥ ĥöļđš ţĥé šţŕéàḿ'š ŵŕîţé ļöçķ àļöñé, šö à çĥàñĝé šéţ'š ŵŕîţé ŵàîţš ƒöŕ îţ
ţö çöḿḿîţ. Ţĥé
write_overlay àüţöḿàţîöñ àçţîöñ ŵŕîţéš àññöţàţîöñš àñđ þļüĝîñ öṽéŕļàýš àñđ
ŕéƒüšéš à ţŕàñšļàţîöñ.
À þüšĥ àššéŕţš ţĥé ŕéƒ îţ ļàšţ öƃšéŕṽéđ öñļý ƒöŕ ţĥé ĝöṽéŕñàñçé îţ ŵŕîţéš. Îţ
àššéŕţš ţĥé đéçîšîöñš çöḿþöñéñţ ŵĥéñ îţš ŕéçöŕđš îñçļüđé à đéçîšîöñ (à ŕéṽîéŵ
šţàţé, àñ àþþŕöṽàļ, à ţŕàñšļàţîöñ ĥéļđ ƒöŕ ŕéṽîéŵ, àñ àššîĝñéé öŕ à ñöţé), àñđ
ţĥé šéŕṽéŕ ŕéƒüšéš îţ ŵîţĥ 409 governance_moved ŵĥéñ àñöţĥéŕ đéçîšîöñ ĥàš
ļàñđéđ šîñçé. Ŕéçöŕđš ţĥàţ šàý öñļý ŵĥàţ ŵàš þŕöđüçéđ ƒöŕ à ƃļöçķ àššéŕţ ñöţĥîñĝ
àñđ ḿéŕĝé ƃý ŕéçöŕđ ţîḿé. Ţĥé đéçîšîöñš çöḿþöñéñţ ƒöļđš đéçîšîöñš àļöñé, šö ţĥé
ŕéçöŕđš à šéŕṽéŕ ŕüñ ŵŕîţéš ŵĥîļé îţ đŕàƒţš ļéàṽé îţ ŵĥéŕé à çļîéñţ ŕéàđ îţ. Ţĥé
ŵöŕķéŕ ḿàķéš ţĥé šàḿé àššéŕţîöñ àĝàîñ îñšîđé ţĥé þüšĥ'š ţŕàñšàçţîöñ, àĝàîñšţ ţĥé
ļéđĝéŕ àš îţ šţööđ ƃéƒöŕé ţĥé þüšĥ ŵŕöţé àñýţĥîñĝ, šö ŕöŵš ţĥé þüšĥ îţšéļƒ
çĥàñĝéš ñéṽéŕ çöüñţ àĝàîñšţ îţ.
À ŕéḿöṽàļ ţàķéš à ƒîļé'š çöñţéñţ àñđ ļéàṽéš ţĥé đéçîšîöñš îţ ĥöļđš šţàñđîñĝ. Ţĥé îţéḿ ŕöŵ šţàýš àš ţĥé àñçĥöŕ ţĥöšé ŕöŵš àŕé ķéýéđ öñ, ƃéçàüšé ţĥé þŕöđüçéŕ'š çöḿḿîţţéđ ŕéçöŕđ šţîļļ ĥöļđš ţĥé đéçîšîöñš àñđ à þŕöđüçéŕ šéñđš ţĥàţ ŕéçöŕđ àĝàîñ öñļý ŵĥéñ îţš ƒöļđ ḿöṽéš: ŕöŵš đŕöþþéđ ĥéŕé ŵöüļđ ĥàṽé ñöţĥîñĝ ţö ƃŕîñĝ ţĥéḿ ƃàçķ. Çöñţéñţ þüšĥéđ ţö ţĥàţ þàţĥ àĝàîñ ļàñđš öñ ţĥé šàḿé îţéḿ, àñđ ţĥé ļéđĝéŕ šţîļļ ĥöļđš ţĥöšé đéçîšîöñš. Àñ îţéḿ ĥöļđîñĝ ñö đéçîšîöñ îš ŕéḿöṽéđ öüţŕîĝĥţ, àñđ ţĥé ţŕéé ţĥé šéŕṽéŕ šéŕṽéš ļéàṽéš öüţ àñ îţéḿ ĥöļđîñĝ ñö ƃļöçķš, šö à þŕöđüçéŕ îš ñéṽéŕ ţöļđ àƃöüţ à ƒîļé îţ đöéš ñöţ ĥàṽé.
À šéŕṽéŕ ŕüñ ƃéĝîñš ƃý ŵàîţîñĝ ƒöŕ ţĥé þŕöĵéçţ'š þüšĥéš ţĥàţ àŕé šţîļļ ǫüéüéđ öŕ ƃéîñĝ àþþļîéđ, üþ ţö à ļîḿîţ, àñđ šéţţļéš šöüŕçé öñļý àƒţéŕ ţĥéḿ. À çļîéñţ çöñƒîŕḿš à þüšĥ ƒöŕ à ƒéŵ šéçöñđš ƃéƒöŕé îţ ḿàý šţàŕţ à ŕüñ, àñđ à ļàŕĝé þüšĥ àþþļîéš ƒöŕ ļöñĝéŕ, šö šéţţļéḿéñţ ŕéàđš ŵĥàţ ţĥé þüšĥ ŵŕöţé ŕàţĥéŕ ţĥàñ ţĥé ƃļöçķš ţĥé þüšĥ îš àƃöüţ ţö çĥàñĝé öŕ ŕéḿöṽé.
À ŕüñ'š éṽéñţ šţŕéàḿ šéñđš à çöḿḿéñţ ƒŕàḿé éṽéŕý 15 šéçöñđš ŵĥîļé à šţàĝé ŵöŕķš
îñ šîļéñçé, ŵĥîçĥ îš ŵéļļ îñšîđé ţĥé 60 šéçöñđš àñý çöññéçţîöñ ḿàý šîţ îđļé
ƃéţŵééñ à çļîéñţ àñđ ţĥîš šéŕṽéŕ. Ţĥé çöḿḿéñţ çàŕŕîéš ñö îđ àñđ ñö đàţà, šö îţ
ḿöṽéš ñö ŕéšüḿé þöîñţ àñđ ñö çļîéñţ ŕéñđéŕš îţ. À çļîéñţ ŵĥöšé çöññéçţîöñ đŕöþš
ŕéšüḿéš ƒŕöḿ ţĥé ļàšţ éṽéñţ îđ îţ ŕéçéîṽéđ, ţĥŕöüĝĥ ţĥé Last-Event-ID ĥéàđéŕ
öŕ ?after=<seq>, àñđ ţĥé šéŕṽéŕ ŕéþļàýš ţĥé þéŕšîšţéđ éṽéñţš þàšţ ţĥàţ þöîñţ.
À ŕüñ îţšéļƒ ƃéļöñĝš ţö ţĥé šéŕṽéŕ: îţ ĝöéš öñ, àñđ îţš éṽéñţš àŕé ŕéçöŕđéđ,
ŵĥéţĥéŕ öŕ ñöţ àñýöñé îš ŵàţçĥîñĝ ţĥé šţŕéàḿ.
À þüšĥ àþþļîéš üñđéŕ à ŵŕîţé ļöçķ öñ îţš þŕöĵéçţ šţŕéàḿ, àñđ šö đöéš ŕéḿöṽîñĝ à ƒîļé ƒŕöḿ ţĥé éđîţöŕ. Ţĥé šéŕṽéŕ'š ƃļöçķ ŵŕîţéš öñ ţĥàţ šţŕéàḿ, ŵŕîţé-ƃàçķš àḿöñĝ ţĥéḿ, šĥàŕé ţĥé ļöçķ ŵîţĥ öñé àñöţĥéŕ. À ƃļöçķ ŵŕîţé ŵàîţš ƒöŕ àñ àþþļýîñĝ þüšĥ ţö çöḿḿîţ àñđ à þüšĥ ŵàîţš ƒöŕ ţĥé ƃļöçķ ŵŕîţéš àļŕéàđý îñ þŕöĝŕéšš, àñđ ƃöţĥ çöḿþļéţé. À ŵŕîţé-ƃàçķ ţĥàţ ŵàîţéđ šķîþš ţĥé ƃļöçķš ţĥé þüšĥ ŕéḿöṽéđ öŕ çĥàñĝéđ.
Àþþŕöṽîñĝ à šöüŕçé þŕöþöšàļ îš ŕéƒüšéđ ŵĥéñ ţĥé ƃļöçķ'š šöüŕçé đéŕš ƒŕöḿ ţĥé šöüŕçé ţĥé þŕöþöšàļ ŵàš ḿàđé àĝàîñšţ, àñđ ţĥé þŕöþöšàļ šţàýš öþéñ. À ƃļöçķ ŕéḿöṽéđ îñ ţĥé ḿéàñţîḿé šţàýš ŕéḿöṽéđ, àš îţ đöéš ƒöŕ à ŕöļļƃàçķ, à ƃàţçĥ ŕéṽéŕţ öŕ à ƒļöŵ ŕüñ öṽéŕ ţĥé þŕöĵéçţ'š ƃļöçķš.
Ţĥé šàḿé ŕöüţéš éẋîšţ üñđéŕ /api/v1/projects/:id/sync/:ref/... ƒöŕ à þŕöĵéçţ
ţĥàţ ĥàš ñöţ ýéţ ƃééñ çļàîḿéđ îñţö à ŵöŕķšþàçé, àüţĥéñţîçàţéđ ƃý îţš çļàîḿ ţöķéñ.
Šéé kapi push ƒöŕ ţĥé þŕöţöçöļ àš à çļîéñţ šééš îţ.
Çöññéçţöŕš
Çöññéçţöŕ îñšţàñçéš àŕé ŵöŕķšþàçé-šçöþéđ àñđ ŕéǫüîŕé ţĥé ḿàñàĝé-çöññéçţöŕš þéŕḿîššîöñ. Šéé Çöññéçţöŕš ƒöŕ šéţüþ ĝüîđéš.
GET /api/v1/:ws/connectors # List active connectors
POST /api/v1/:ws/connectors # Add connector
PUT /api/v1/:ws/connectors/:id # Update connector
DELETE /api/v1/:ws/connectors/:id # Remove connector
GET /api/v1/:ws/connectors/:id/status # Sync status
GET /api/v1/:ws/connectors/:id/content # Browse available content
POST /api/v1/:ws/connectors/:id/fetch # Fetch content from the external system
POST /api/v1/:ws/connectors/:id/publish # Publish results back
Ƒļöŵš àñđ àüţöḿàţîöñ
GET /api/v1/:ws/:id/flows # List flows (built-in catalog + project flows)
POST /api/v1/:ws/:id/flows # Create a project flow
GET /api/v1/:ws/:id/flows/:flowId # Get one flow
PUT /api/v1/:ws/:id/flows/:flowId # Replace a project flow
DELETE /api/v1/:ws/:id/flows/:flowId # Delete a project flow
/api/v1/:ws/:id/automations # Automation rules (see Automation)
Ŕüñš àŕé šţàŕţéđ àñđ öƃšéŕṽéđ ţĥŕöüĝĥ ţĥé çöñṽéŕĝéñçé ŕöüţéš üñđéŕ à þŕöĵéçţ;
ţĥé Ŕüñš ṽîéŵ àñđ kapi up àŕé ţĥéîŕ çļîéñţš. Šéé
Šéŕṽéŕ-šîđé ƒļöŵš àñđ Àüţöḿàţîöñ.
Ŕéṽîéŵ àñđ đéļîṽéŕý
POST /api/v1/:ws/:id/review/approve-passing # Bulk-approve every block passing checks, checked terminology and the voice bar
POST /api/v1/:ws/:id/blocks/:ref/bulk-review # One review decision on the translations of chosen blocks
GET /api/v1/projects/:id/ship.json # Public per-locale ship manifest
GET /api/v1/:ws/audit-log/verify # Verify the workspace audit chain
Ŵéƃĥööķš (îñƃöüñđ)
POST /api/webhooks/forge/:configID # Repository push webhook (token mode)
POST /api/webhooks/github-app # GitHub App webhook
Ŕüññîñĝ ţĥé Šéŕṽéŕ
bin/bowrain-server --port 8080 --host 0.0.0.0 \
--database-url postgres://bowrain:password@localhost/bowrain
Ţĥé šéŕṽéŕ ŕéǫüîŕéš ÞöšţĝŕéŠǪĻ. Šéé Çöñƒîĝüŕàţîöñ ƒöŕ ţĥé çöḿþļéţé éñṽîŕöñḿéñţ-ṽàŕîàƃļé àñđ ƒļàĝ ŕéƒéŕéñçé.
ĝŔÞÇ ÀÞÎ
Ţĥé ĝŔÞÇ ÀÞÎ þŕöṽîđéš šţŕéàḿîñĝ àççéšš. Îţ îš ḿüļţîþļéẋéđ öñţö ţĥé šàḿé ĤŢŢÞ
þöŕţ àš ţĥé ŔÉŠŢ ÀÞÎ üšîñĝ ĥ2ç (çļéàŕţéẋţ ĤŢŢÞ/2): ŕéǫüéšţš çàŕŕýîñĝ
Content-Type: application/grpc àŕé ŕöüţéđ ţö ţĥé ĝŔÞÇ ĥàñđļéŕ, éṽéŕýţĥîñĝ éļšé
ţö ţĥé ŔÉŠŢ ĥàñđļéŕ. Ţĥéŕé îš ñö šéþàŕàţé ĝŔÞÇ þöŕţ öŕ ŢĻŠ ƒļàĝ; ţĥé šéŕṽéŕ
ŕüñš ƃéĥîñđ à ŢĻŠ-ţéŕḿîñàţîñĝ ŕéṽéŕšé þŕöẋý îñ þŕöđüçţîöñ (šéé
Šéļƒ-Ĥöšţîñĝ), ŵĥîçĥ ŕöüţéš /neokapi.*
ţö ţĥé šéŕṽéŕ.
Šéŕṽîçé Đéƒîñîţîöñ
Ţĥé NeokapiService þŕöṽîđéš ţĥéšé ŔÞÇš:
service NeokapiService {
rpc CreateProject(CreateProjectRequest) returns (ProjectResponse);
rpc GetProject(GetProjectRequest) returns (ProjectResponse);
rpc ListProjects(ListProjectsRequest) returns (ListProjectsResponse);
rpc CreateVersion(CreateVersionRequest) returns (VersionResponse);
rpc ListVersions(ListVersionsRequest) returns (ListVersionsResponse);
rpc PullContent(PullContentRequest) returns (PullContentResponse);
rpc PushContent(PushContentRequest) returns (PushContentResponse);
rpc ExecuteFlow(ExecuteFlowRequest) returns (stream FlowProgressResponse);
rpc Subscribe(SubscribeRequest) returns (stream EventResponse);
}
Šţŕéàḿîñĝ
Ţŵö ŔÞÇš üšé šéŕṽéŕ-šîđé šţŕéàḿîñĝ:
- ÉẋéçüţéƑļöŵ: šţŕéàḿš þŕöĝŕéšš üþđàţéš đüŕîñĝ ƒļöŵ éẋéçüţîöñ
- Šüƃšçŕîƃé: šţŕéàḿš éṽéñţš ḿàţçĥîñĝ ţĥé šüƃšçŕîþţîöñ ƒîļţéŕ
Ƃļöçķ çöñţéñţ đöéš ñöţ ţŕàṽéļ ţĥîš šéŕṽîçé. Îţ ḿöṽéš öṽéŕ ţĥé çàñöñîçàļ
neokapi.content.v1 šýñç ŵîŕé (core/proto/sync/v1/sync.proto), ŵĥîçĥ
çàŕŕîéš ŕüñš, öṽéŕļàýš, šéĝḿéñţàţîöñ àñđ šöüŕçé-ļöçàļé ļöššļéššļý.
Çļîéñţ Éẋàḿþļé
// Production: connect through the TLS-terminating proxy (port 443).
conn, err := grpc.NewClient("bowrain.example.com:443",
grpc.WithTransportCredentials(credentials.NewClientTLSFromCert(nil, "")),
)
// Local dev: the server speaks cleartext h2c on its HTTP port.
// conn, err := grpc.NewClient("localhost:8080",
// grpc.WithTransportCredentials(insecure.NewCredentials()),
// )
client := serverv1.NewNeokapiServiceClient(conn)
// Stream flow-execution progress
stream, _ := client.ExecuteFlow(ctx, &serverv1.ExecuteFlowRequest{
ProjectId: "proj-1",
FlowConfig: "name: qa\ntools:\n - case-transform",
})
for {
resp, err := stream.Recv()
if err == io.EOF {
break
}
fmt.Println(resp.Stage, resp.Message)
}
Þŕöţö Ƒîļé Ļöçàţîöñ
Ţĥé þŕöţö đéƒîñîţîöñš àŕé àţ bowrain/proto/v1/neokapi_service.proto. Ĝéñéŕàţé Ĝö çöđé ŵîţĥ:
make proto