Šķîþ ţö ḿàîñ çöñţéñţ

Ç-03: Ţĥé çöñţéẋţ šţöŕé àñđ ĝŕàþĥ

Šüḿḿàŕý​

À þŕöĵéçţ ķééþš ţŵö đàţàƃàšéš, šþļîţ ƃý ŵĥàţ þŕöđüçéš ţĥé ŕöŵš.

Ţĥé þŕöĵéçţîöñ šţàýš îñ ţĥé çĥéçķöüţ, àţ .kapi/work/store.db: ţĥé ƃļöçķ çàçĥé, ţĥé öṽéŕļàýš à ƒļöŵ ŵŕöţé, ţĥé éẋţŕàçţîöñ šţàḿþš. Éṽéŕýţĥîñĝ îñ îţ îš đéŕîṽéđ ƒŕöḿ ţĥé ŵöŕķîñĝ ţŕéé ƃý ļöñĝ ţŕàñšàçţîöñš ţĥàţ ŕéŵŕîţé ļàŕĝé þàŕţš öƒ îţ, šö îţ ƃéļöñĝš ƃéšîđé ţĥé ţŕéé îţ đéšçŕîƃéš àñđ à šéçöñđ çĥéçķöüţ öƒ ţĥé šàḿé þŕöĵéçţ ķééþš öñé öƒ îţš öŵñ.

Ţĥé çöñţéẋţ šţöŕé ļîṽéš îñ à ŵöŕķšþàçé, öüţšîđé éṽéŕý çĥéçķöüţ: ţĥé ţéŕḿš, ţĥé ṽöîçé þŕöƒîļéš, ţĥé çöñţéñţ ḿéḿöŕý, ţĥé đéçîšîöñ ļéđĝéŕ àñđ ţĥé đöçüḿéñţ àđöþţîöñš (Ç-04), ţĥé ƃļöçķ ĥîšţöŕý öƒ éṽéŕý ŕéçöŕđéđ éđîţ, àñđ ţĥé þŕöĵéçţ'š šéţţîñĝš: ţéàḿ çĥöîçéš àƃöüţ ţĥé þŕöĵéçţ ţĥàţ àŕé ñéîţĥéŕ çöñţéñţ ñöŕ ĝöṽéŕñàñçé, šüçĥ àš ţĥé šàṽéđ ƒîļţéŕš à ţéàḿ šĥàŕéš (projectdb.DB.Setting). Îţ îš àüţĥöŕéđ ŕàţĥéŕ ţĥàñ đéŕîṽéđ, ŵŕîţţéñ à ļîţţļé àţ à ţîḿé, àñđ ţŕüé ŵĥéŕéṽéŕ ţĥé þŕöĵéçţ îš çĥéçķéđ öüţ. Ţŵö çĥéçķöüţš öƒ öñé þŕöĵéçţ, à šéçöñđ çļöñé àñđ à ĝîţ ŵöŕķţŕéé, šĥàŕé îţ, àñđ éàçĥ ķééþš îţš öŵñ ṽîéŵ öƒ ţĥé öñé ļéđĝéŕ.

Ţĥé ŵöŕķšþàçé àļšö ĥöļđš ŵĥàţ šþàñš þŕöĵéçţš: ţĥé þŕöĵéçţ ŕéĝîšţŕý, ţĥé çöñţéẋţ ĝŕàþĥ, ŵĥöšé ñöđé îđš àļŕéàđý çàŕŕý ţĥé þŕöĵéçţ ţĥéý ƃéļöñĝ ţö, àñđ ţĥé öþéŕàţîöñ ļöĝ.

Éṽéŕý çĥàñĝé ţö à þŕöĵéçţ'š ţéŕḿš, ṽöîçé þŕöƒîļéš, çöñţéñţ ḿéḿöŕý àñđ đéçîšîöñ ļéđĝéŕ, éṽéŕý đöçüḿéñţ àđöþţîöñ àñđ éṽéŕý ŕéçöŕđéđ éđîţ, àñđ éṽéŕý çĥàñĝé ţö ţĥé ŕüļéš ŵîđéñéđ ţö ţĥé ŵĥöļé ŵöŕķšþàçé, îš àñ öþéŕàţîöñ îñ ţĥàţ ļöĝ çàŕŕýîñĝ ţĥé ŕöŵš îţ ŵŕöţé. Ţĥöšé šţöŕéš àŕé þŕöĵéçţîöñš öƒ ţĥé ļöĝ: core/projector îš ţĥéîŕ öñļý ŵŕîţéŕ, àñđ kapi store rebuild éḿþţîéš ţĥéḿ àñđ ŕéþļàýš ţĥé ļöĝ îñţö ţĥé šàḿé ŕöŵš, šţàŕţîñĝ ƒŕöḿ ţĥé ļàţéšţ çĥéçķþöîñţ.

À ǫüéšţîöñ ţĥàţ ŕéàçĥéš àçŕöšš ţĥé ţŵö ƒîļéš îš öñé ǫüéŕý. projectdb.DB.Join öþéñš ţĥé çöñţéẋţ šţöŕé ƃéšîđé ţĥé þŕöĵéçţîöñ öñ öñé ŕéàđ-öñļý çöññéçţîöñ, šö ŵĥîçĥ ƃļöçķš üšé ţĥîš ţéŕḿ, îñ ŵĥîçĥ çöļļéçţîöñ, àţ ŵĥîçĥ çööŕđîñàţé, àñđ ŵĥîçĥ öƒ ţĥéḿ àŕé éšţàƃļîšĥéđ? îš àñšŵéŕéđ îñ öñé þàšš.

Çöñţéẋţ​

Çöñţéẋţ îš ŕéļàţîöñàļ. À ţéŕḿ öççüŕš îñ ƃļöçķš; ƃļöçķš ƃéļöñĝ ţö çöļļéçţîöñš àñđ šîţ àţ à þöîñţ îñ ţĥé çöñţéẋţ šþàçé (Ç-02); à đéçîšîöñ àþþŕöṽéš à ƃļöçķ'š ţŕàñšļàţîöñ àţ à ŕéṽîšîöñ; à ḿéḿöŕý éñţŕý ŕéçýçļéš îñţö à ƃļöçķ. Ŕéţŕîéṽàļ (Ç-06) àñđ ĝöṽéŕñàñçé (Ç-02) ƃöţĥ ţŕàṽéŕšé ţĥöšé ŕéļàţîöñš ŕàţĥéŕ ţĥàñ ŕéàđîñĝ öñé šţöŕé îñ îšöļàţîöñ.

Àüţĥöŕéđ çöñţéẋţ ḿüšţ šüŕṽîṽé çĥéçķöüţ đéļéţîöñ àñđ ŕéḿàîñ àṽàîļàƃļé àçŕöšš çļöñéš àñđ ŵöŕķţŕééš. Þàŕšéđ ƃļöçķš, öṽéŕļàýš àñđ éẋţŕàçţîöñ šţàḿþš ƃéļöñĝ ţö à šþéçîƒîç ŵöŕķîñĝ ţŕéé àñđ çàñ ƃé ŕéƃüîļţ. Šéþàŕàţé đàţàƃàšéš ĝîṽé ţĥéšé đàţà šéţš îñđéþéñđéñţ ļîƒéţîḿéš àñđ ŵŕîţé ļöçķš.

Ƃöţĥ ļöçàļ àñđ ĥöšţéđ šţöŕàĝé šüþþöŕţ ǫüéŕîéš àçŕöšš çöñţéẋţ ŕéļàţîöñšĥîþš. Ţĥé ļöçàļ îḿþļéḿéñţàţîöñ þŕöṽîđéš ţĥéšé çàþàƃîļîţîéš ŵîţĥöüţ à šéŕṽéŕ.

Đéçîšîöñ​

Ţĥé ŵöŕķšþàçé​

Éṽéŕý ḿàçĥîñé àççöüñţ ĥàš öñé îḿþļîçîţ đéƒàüļţ ŵöŕķšþàçé, çŕéàţéđ öñ ƒîŕšţ üšé üñđéŕ ţĥé đàţà ŕööţ (ĥöšţ.ĐàţàĐîŕ) àţ <DataDir>/workspaces/default/. À ŕéçîþé çàŕŕîéš ñö ƃîñđîñĝ ţö îţ. À þŕöĵéçţ îš ķéýéđ ƃý project.KapiProject.Identity(): ţĥé šţàƃļé id: ţĥé ŕéçîþé çàŕŕîéš, öŕ îţš name: ŵĥéŕé îţ çàŕŕîéš ñöñé.

Çöñšéǫüéñçéš öƒ ţĥàţ ķéý, ƃöţĥ îñţéñđéđ:

  • Ţŵö çĥéçķöüţš öƒ à þŕöĵéçţ ŵîţĥ àñ id: ŕéàçĥ öñé çöñţéẋţ šţöŕé, ŵĥéŕéṽéŕ ţĥéý šîţ àñđ ŵĥàţéṽéŕ ţĥéý àŕé çàļļéđ öñ đîšķ.
  • Ţŵö üñŕéļàţéđ þŕöĵéçţš ŵîţĥ ñö id: àñđ ţĥé šàḿé name: ŵöüļđ ŕéàçĥ öñé šţöŕé, šö à þŕöĵéçţ šţàţîñĝ ñéîţĥéŕ àñ îđ ñöŕ à ñàḿé îš ķéýéđ ƃý ţĥé çĥéçķöüţ îţ ŵàš ƒöüñđ àţ îñšţéàđ. kapi init ḿîñţš àñ id:, ŵĥîçĥ îš ŵĥàţ ḿàķéš ţĥé ƒîŕšţ çàšé ţĥé ñöŕḿàļ öñé.

À đîŕéçţöŕý þéŕ ŵöŕķšþàçé, à đàţàƃàšé þéŕ þŕöĵéçţ​

<DataDir>/workspaces/default/
workspace.db the project registry, the context graph,
the operation log
projects/
prj_9f2k…q7.db one project's context store
prj_4c8m…b1.db

À šéþàŕàţé đàţàƃàšé þéŕ þŕöĵéçţ þŕéšéŕṽéš ţĥé ţéŕḿš, çöñţéñţ-ḿéḿöŕý àñđ ṽöîçé šçĥéḿàš ŵîţĥöüţ àđđîñĝ þŕöĵéçţ çöļüḿñš ţö éàçĥ ţàƃļé. Îţ àļšö ļîḿîţš ŵŕîţé çöñţéñţîöñ àñđ ƒîļé çöŕŕüþţîöñ ţö öñé þŕöĵéçţ àñđ šüþþöŕţš ƒîļé-ļéṽéļ éẋþöŕţ, çöþýîñĝ àñđ đéļéţîöñ.

Çŕöšš-þŕöĵéçţ ĝŕàþĥ ǫüéŕîéš üšé workspace.db, ŵĥéŕé ñöđé îđéñţîţîéš îñçļüđé þŕöĵéçţ šçöþé (Ñöđé îđéñţîţý çàŕŕîéš ţĥé šçöþé ţüþļé). Ǫüéŕîéš ƒöŕ đàţà öüţšîđé ţĥé ĝŕàþĥ ŕéàđ ţĥé ŕéļéṽàñţ þŕöĵéçţ đàţàƃàšéš.

Ŵĥéŕé ţĥé àüţĥöŕîţàţîṽé çöþý ļîṽéš îš à ƃàçķéñđ​

core/workspace.Backend îš ŵĥéŕé à ŵöŕķšþàçé'š àüţĥöŕîţàţîṽé çöþý ļîṽéš:

ḾéţĥöđŴĥàţ îţ àñšŵéŕš
Describeŵĥîçĥ ƃàçķéñđ ţĥîš îš, ŵĥéŕé ţĥé ŵöŕķšþàçé îš, ŵĥéţĥéŕ îţ çàñ ƃé ŵŕîţţéñ
Registryţĥé ŵöŕķšþàçé-ŵîđé đàţàƃàšé: ŕéĝîšţŕý, ĝŕàþĥ, öþéŕàţîöñ ļöĝ, ŵîđéñéđ ŕüļéš, àĝéñţ šéššîöñš
Projectöñé þŕöĵéçţ'š çöñţéẋţ šţöŕé, çŕéàţéđ öñ ƒîŕšţ üšé
Forgetđŕöþ öñé þŕöĵéçţ'š çöñţéẋţ šţöŕé
Recordàþþéñđ öþéŕàţîöñš, ḿîñţîñĝ àñ îđ ƒöŕ éàçĥ ţĥàţ àŕŕîṽéš ŵîţĥöüţ öñé; àñ îđ öŕ çöñţéñţ àđđŕéšš ţĥé ļöĝ ĥöļđš îš ñöţ ŵŕîţţéñ ţŵîçé
RecordIfRecord, àþþéñđîñĝ öñļý ŵĥîļé éàçĥ ñàḿéđ šüƃĵéçţ'š ļàšţ öþéŕàţîöñ îš šţîļļ àţ ţĥé þöšîţîöñ ţĥé ŵŕîţéŕ ŕéàđ (ErrHeadMoved öţĥéŕŵîšé)
SubjectHeadţĥé ļöçàļ þöšîţîöñ öƒ ţĥé ļàšţ öþéŕàţîöñ öñ öñé šüƃĵéçţ öƒ öñé þŕöĵéçţ
Sinceŕéàđ öþéŕàţîöñš ƃàçķ ƒŕöḿ à ļöçàļ àŕŕîṽàļ þöšîţîöñ
Selectŕéàđ öñé þŕöĵéçţ'š öþéŕàţîöñš, öŕ öñé ķîñđ'š, ƒŕöḿ à þöšîţîöñ
PutBlob, Blobķééþ ţĥé ƃýţéš àñ öþéŕàţîöñ ñàḿéš üñđéŕ ţĥé đîĝéšţ öƒ ţĥöšé ƃýţéš, üþ ţö 64 ḾîƂ éàçĥ
Headţĥé àŕŕîṽàļ þöšîţîöñ öƒ ţĥé ļàšţ öþéŕàţîöñ, ŕéçöŕđéđ ĥéŕé öŕ ḿéŕĝéđ îñ
Closeŕéļéàšé éṽéŕý ĥàñđļé ţĥé ƃàçķéñđ öŵñš

Registry àñđ Project àñšŵéŕ ŵîţĥ ĥàñđļéš ţĥé ƃàçķéñđ öŵñš: à çàļļéŕ ŕéàđš àñđ ŵŕîţéš ţĥŕöüĝĥ öñé àñđ çļöšéš ţĥé ƃàçķéñđ, ñéṽéŕ à ĥàñđļé.

Öñé àđàþţéŕ šĥîþš: workspace.LocalBackend, ţĥé đîŕéçţöŕý öƒ ŠǪĻîţé ƒîļéš àƃöṽé. Éṽéŕý ḿàçĥîñé ķééþš îţš ŵöŕķšþàçé ļöçàļļý; à þŕöĵéçţ ŵĥöšé çöñţéẋţ îš šĥàŕéđ éẋçĥàñĝéš öþéŕàţîöñš ŵîţĥ à ŕéḿöţé, ƃéļöŵ, ŕàţĥéŕ ţĥàñ ŕéàđîñĝ ţĥŕöüĝĥ öñé.

core/workspace/workspacetest.RunConformance îš ţĥé šüîţé éṽéŕý àđàþţéŕ þàššéš: öñé ţàƃļé öƒ ƃéĥàṽîöüŕš, đŕîṽéñ àĝàîñšţ ŵĥàţéṽéŕ ƃàçķéñđ à ƒàçţöŕý ĥàñđš ƃàçķ. Îţ šţàţéš ŵĥàţ ţĥé ļàýéŕš àƃöṽé àŕé éñţîţļéđ ţö àššüḿé, îñ à ƒöŕḿ àñ àđàþţéŕ àüţĥöŕ àñđ à ŕéṽîéŵéŕ çàñ ƃöţĥ ŕüñ.

À þŕöĵéçţ'š çöñţéẋţ îš šĥàŕéđ ţĥŕöüĝĥ à ŕéḿöţé​

À ŕéçîþé đéçļàŕéš ŵĥéŕé à þŕöĵéçţ'š çöñţéẋţ îš šĥàŕéđ (context.backend: local, file, git öŕ s3). Ţĥé ŕéçîþé îš ţĥé öñļý þļàçé îţ îš šéţ, šö éṽéŕý çĥéçķöüţ öƒ ţĥé þŕöĵéçţ šĥàŕéš ţĥŕöüĝĥ ţĥé šàḿé ƃàçķéñđ. kapi context sync þüļļš, šéţţļéš à ḿéŕĝé ŵĥéñ --merged ñàḿéš öñé, àñđ þüšĥéš (host.App.SyncProjectContext); kapi context sync --status ŕéþöŕţš ţĥé ƃàçķéñđ àñđ ţĥé ļàšţ ķñöŵñ đîšţàñçé ŵîţĥöüţ çöñţàçţîñĝ îţ. Éṽéŕý šĥàŕéđ ƃàçķéñđ îš à workspace.Remote ĥöļđîñĝ ţĥé šàḿé ļàýöüţ:

ÞàţĥĤöļđš
log/<writer>/<first-op-id>.jsonlţĥé öþéŕàţîöñš öñé ŵöŕķšþàçé þüšĥéđ, öñé ĴŠÖÑ öƃĵéçţ à ļîñé, îñ îđ öŕđéŕ
blobs/<sha256>ţĥé þàýļöàđš ţĥöšé öþéŕàţîöñš ñàḿé
checkpoints/<op-id>.kpzţĥé þŕöĵéçţîöñš àš öƒ öñé öþéŕàţîöñ (kpz.KindCheckpoint)

<writer> îš àñ îđ éàçĥ ŵöŕķšþàçé ḿîñţš öñçé (Workspace.WriterID), šö à ḿàçĥîñé öñļý àđđš ƒîļéš üñđéŕ îţš öŵñ ñàḿé, ţŵö ḿàçĥîñéš ñéṽéŕ ŵŕîţé öñé öƃĵéçţ, àñđ ñö ļöçķ îš ţàķéñ. À ŕéḿöţé öŵéš ţĥŕéé ţĥîñĝš, šţàţéđ ƃý workspacetest.RunRemoteConformance: ļîšţ à đîŕéçţöŕý, ŕéàđ àñ öƃĵéçţ, àñđ çŕéàţé àñ öƃĵéçţ ţĥàţ îš ñöţ ţĥéŕé (à šéçöñđ çŕéàţé öƒ ţĥé šàḿé ƃýţéš îš ñöţĥîñĝ; öƒ öţĥéŕ ƃýţéš, ErrObjectExists).

ÀđàþţéŕÇŕéàţé-öñļý ŵŕîţéÀççéšš
FileRemoteà ţéḿþöŕàŕý ƒîļé ļîñķéđ îñţö þļàçéţĥé ƒîļéšýšţéḿ'š
GitRemoteöñé çöḿḿîţ þéŕ þüšĥ öñ ţĥé ŕéƒ, þüšĥéđ ŵîţĥöüţ ƒöŕçé; à þüšĥ ţĥàţ ļöšéš à ŕàçé ƒéţçĥéš ţĥé ñéŵ ţîþ, ļàýš îţš ƒîļéš öṽéŕ îţ àñđ þüšĥéš àĝàîñţĥé ŕéþöšîţöŕý'š ŕéḿöţé
host/s3remotePutObject ŵîţĥ If-None-Match: *ţĥé ÀŴŠ çŕéđéñţîàļ çĥàîñ
MemoryRemoteà ḿàþ, þàçķéđ îñţö à ţŕàñšƒéŕ ƒîļéñöñé
ţĥé ƃŕöŵšéŕ éñĝîñé'š ƒöļđéŕ ŕéḿöţé (kapiSyncContext)ţĥé FileRemote ļàýöüţ îñ à ƒöļđéŕ ţĥé þàĝé ĥöļđš, éàçĥ ƒîļé ŵŕîţţéñ üñđéŕ à đöţ-ñàḿé àñđ ḿöṽéđ îñţö þļàçéţĥé ƒöļđéŕ ţĥé þéŕšöñ ĝŕàñţéđ ţĥé þàĝé

workspace.Sync ḿöṽéš öñé þŕöĵéçţ'š öþéŕàţîöñš. À þüļļ ļîšţš log/, ŕéàđš ţĥé šéĝḿéñţš ţĥîš ŵöŕķšþàçé ĥàš ñöţ šééñ, ḿéŕĝéš ţĥéîŕ öþéŕàţîöñš îñţö ţĥé ļöĝ ƃý îđ (workspace.Merge) àñđ ĥàñđš ţĥéḿ ţö ţĥé þŕöĵéçţöŕ: à çàţçĥ-üþ ŵĥéñ éṽéŕý ḿéŕĝéđ öþéŕàţîöñ šöŕţš àƒţéŕ ţĥé öñéš àþþļîéđ, à ŕéƃüîļđ îñ îđ öŕđéŕ ŵĥéñ öñé šöŕţš ƃéƒöŕé. À þüšĥ ŵŕîţéš ţĥé þŕöĵéçţ'š öþéŕàţîöñš ţĥé ŕéḿöţé îš ñöţ ķñöŵñ ţö ĥöļđ àš ñéŵ šéĝḿéñţš, ŵîţĥ ţĥé ƃļöƃš ţĥéý ñàḿé, àñđ à çĥéçķþöîñţ öñçé ţĥé ŕéḿöţé ĥàš ĝàîñéđ CheckpointEvery öþéŕàţîöñš šîñçé îţš ļàšţ. Àñ öþéŕàţîöñ ñàḿéš îţš ƃļöƃš îñ îţš þàýļöàđ'š ţöþ-ļéṽéļ blob ƒîéļđ àñđ blobs ļîšţ (workspace.BlobRefs), šö àñ éđîţ'š ķéþţ ŕüñš ţŕàṽéļ ŵîţĥ îţ. À ƒîŕšţ þüļļ îñţö à ļöĝ ţĥàţ ĥöļđš ñöţĥîñĝ öƒ ţĥé þŕöĵéçţ šţàŕţš ƒŕöḿ ţĥé ñéŵéšţ çĥéçķþöîñţ ŵĥöšé šéĝḿéñţ ļîšţ çöṽéŕš éṽéŕý öþéŕàţîöñ üþ ţö îţ, àñđ šţîļļ ḿéŕĝéš éṽéŕý šéĝḿéñţ, šö ţĥé ĥîšţöŕý ţŕàṽéļš. Ţĥé ķîñđš projector.LocalKinds ñàḿéš ñéṽéŕ ļéàṽé ţĥé ḿàçĥîñé: ţĥé þŕöĵéçţ'š ŕéĝîšţŕàţîöñ àñđ îţš ŕéḿöṽàļ (project.register, project.forget) àñđ îţš çĥéçķþöîñţš. À ŕüļé à þéŕšöñ ŵîđéñéđ ţö ţĥé ŵĥöļé ŵöŕķšþàçé îš à rules.write öþéŕàţîöñ ŕéçöŕđéđ üñđéŕ ţĥé þŕöĵéçţ ţĥàţ đéçîđéđ îţ, šö îţ ţŕàṽéļš ŵîţĥ ţĥé þŕöĵéçţ àñđ éṽéŕý ḿàçĥîñé ţĥàţ þüļļš îţ ĥöļđš ţĥé ŕüļé îñ îţš öŵñ ŵöŕķšþàçé.

Ŵĥàţ ţĥé ŵöŕķšþàçé ķñöŵš àƃöüţ à ŕéḿöţé îš ķéþţ îñ workspace.db, ķéýéđ ƃý ţĥé þŕöĵéçţ àñđ ţĥé ŕéḿöţé: ţĥé öþéŕàţîöñ îđš ţĥé ŕéḿöţé ĥöļđš, ţĥé šéĝḿéñţš ŕéàđ àñđ ŵĥéţĥéŕ ţĥéý àŕé ḿéŕĝéđ, àñđ ţĥé ļàšţ çöñţàçţ. Ţĥàţ îš ŵĥàţ ţĥé šýñç ļîñé éṽéŕý çöñţéẋţ àñšŵéŕ àñđ kapi status çàŕŕý îš çöüñţéđ ƒŕöḿ (N to push, M to pull), ŵîţĥöüţ ŕéàçĥîñĝ ţĥé ŕéḿöţé. Ţĥé þüšĥ çöüñţ šþļîţš öƒƒ ţĥé çöñţéẋţ öþéŕàţîöñš (context.* ķîñđš, ţĥé öñéš à çöñţéẋţ ļöĝ ļîšţš) ƒŕöḿ ţĥé šţöŕé ŵŕîţéš ƃéšîđé ţĥéḿ, àñđ à ŕéḿöţé ñéṽéŕ çöñţàçţéđ ŕéþöŕţš ñö þüļļ çöüñţ. À ŕéḿöţé ţĥàţ çàññöţ ƃé ŕéàçĥéđ îš ErrRemoteUnreachable, àñđ ţĥé ÇĻÎ éẋîţš ŵîţĥ šţàţüš 5.

À ţŕàñšƒéŕ ƒîļé îš ţĥé šàḿé ļàýöüţ îñ öñé .kpz (kpz.KindContext): kapi store export þüšĥéš ţĥé þŕöĵéçţ îñţö à MemoryRemote àñđ þàçķš îţ, àñđ kapi store import <file>.kpz üñþàçķš öñé àñđ þüļļš ƒŕöḿ îţ.

Ñö đàéḿöñ​

Éṽéŕý þŕöçéšš öþéñš ţĥé ļöçàļ đàţàƃàšéš đîŕéçţļý: ţĥé ÇĻÎ, àñ àĝéñţ'š ḾÇÞ šéŕṽéŕ, ţĥé đéšķţöþ. Ţĥéŕé îš ñö ƃŕöķéŕ îñ ƃéţŵééñ, àñđ ñöţĥîñĝ ĥàš ţö ƃé ŕüññîñĝ ƒöŕ à þŕöĵéçţ ţö ƃé öþéñéđ.

Þŕöĵéçţš ŕéĝîšţéŕ öñ ƒîŕšţ üšé​

Öþéñîñĝ à þŕöĵéçţ ŕéçöŕđš îţ îñ workspace.db: îţš ķéý, ţĥé đîšþļàý ñàḿé ţĥé ŕéçîþé çàŕŕîéš, ţĥé çĥéçķöüţ þàţĥš îţ ĥàš ƃééñ šééñ àţ öñ ţĥîš ḿàçĥîñé, àñđ ŵĥéñ îţ ŵàš ļàšţ àçţîṽé. Ŕé-öþéñîñĝ ŕéþļàçéš ţĥé đîšþļàý ñàḿé (à name: îš à ļàƃéļ à þéŕšöñ éđîţš), àđđš ţĥé çĥéçķöüţ ŕàţĥéŕ ţĥàñ ŕéþļàçîñĝ ţĥé ļîšţ, àñđ ḿöṽéš ţĥé ļàšţ-àçţîṽé ţîḿé ƒöŕŵàŕđ.

Çĥéçķöüţ þàţĥš àŕé ĥîñţš, ḿàçĥîñé-ļöçàļ àñđ ñöŕḿàļîžéđ ţĥŕöüĝĥ host.NormalizeCheckoutPath, šö à đîŕéçţöŕý ŕéàçĥéđ ţĥŕöüĝĥ à šýḿļîñķéđ þàŕéñţ àñđ ţĥé šàḿé đîŕéçţöŕý ŕéàçĥéđ đîŕéçţļý àŕé öñé éñţŕý. Ţĥéý àŕé ŵĥàţ à šüŕƒàçé ļîšţîñĝ þŕöĵéçţš öƒƒéŕš ţö öþéñ; à çĥéçķöüţ ţĥàţ ĥàš ḿöṽéđ šţàýš îñ ţĥé ļîšţ üñţîļ ţĥé þŕöĵéçţ îš öþéñéđ šöḿéŵĥéŕé éļšé.

Ŵĥàţ îš îñ ŵĥîçĥ ƒîļé​

Ţàƃļ隊üƃšýšţéḿÞööļĐéŕîṽéđ ƒŕöḿ
ƃļöçķ çàçĥé, öṽéŕļàýšcore/blockstore (Ç-01)þŕöĵéçţîöñţĥé çöñţéñţ ƒîļéš
store_metacore/projectdbþŕöĵéçţîöñţĥé ļàšţ éẋţŕàçţîöñ
ţéŕḿšterms/ (Ç-08)çöñţéẋţţĥé öþéŕàţîöñ ļöĝ, ţĥŕöüĝĥ core/projector
çöñţéñţ ḿéḿöŕýmemory/ (Ç-09)çöñţéẋţţĥé öþéŕàţîöñ ļöĝ, ţĥŕöüĝĥ core/projector
ṽöîçé þŕöƒîļéšvoice/ (Ç-07)çöñţéẋţţĥé öþéŕàţîöñ ļöĝ, ţĥŕöüĝĥ core/projector
projector_cursorcore/projectorçöñţéẋţţĥé þöšîţîöñ öƒ ţĥé ļàšţ öþéŕàţîöñ àþþļîéđ
đéçîšîöñ ļéđĝéŕ, đöçüḿéñţ àđöþţîöñšcore/state (Ç-04)çöñţéẋţţĥé öþéŕàţîöñ ļöĝ, ţĥŕöüĝĥ core/projector
öñé ṽîéŵ öƒ ţĥé ļéđĝéŕ àñđ öƒ ţĥé đöçüḿéñţš ŕéàđ, þéŕ çĥéçķöüţcore/stateçöñţéẋţţĥé çĥéçķöüţ'š ƒîļéš
ƃļöçķ ĥîšţöŕýcore/historyçöñţéẋţţĥé öþéŕàţîöñ ļöĝ, ţĥŕöüĝĥ core/projector
edition_head, edition_subject_head, document_head: ţĥé ŵöŕķšþàçé ĥöḿécore/workhomeçöñţéẋţţĥé öþéŕàţîöñ ļöĝ, ţĥŕöüĝĥ core/projector
graph_nodes, graph_edgeshost/storage/graph, ṽöçàƃüļàŕý îñ core/contextgraphŵöŕķšþàçéţĥé ŕöŵš àƃöṽé, þļüš ţĥé ŕéçîþé
workspace_projects, workspace_checkoutscore/workspaceŵöŕķšþàçéŵĥàţ ĥàš ƃééñ öþéñéđ
workspace_opscore/workspaceŵöŕķšþàçéîţš öŵñ ļöĝ
workspace_blobscore/workspaceŵöŕķšþàçéţĥé ļàŕĝé þàýļöàđš öþéŕàţîöñš ñàḿé
workspace_rulescore/workspaceŵöŕķšþàçéţĥé öþéŕàţîöñ ļöĝ: ţĥé ŕüļéš à þéŕšöñ ŵîđéñéđ (Ç-11)
workspace_agent_sessionscore/workspaceŵöŕķšþàçéŵĥîçĥ àĝéñţš àŕé àţ ŵöŕķ (Š-03)

Éàçĥ šüƃšýšţéḿ öŵñš îţš öŵñ šçĥéḿà àñđ îţš öŵñ ḿîĝŕàţîöñ ļéđĝéŕ, šö à šüƃšýšţéḿ éṽöļṽéš ŵîţĥöüţ ŕéþļàýîñĝ àñýöñé éļšé'š ḿîĝŕàţîöñš, ŵĥîçĥéṽéŕ þööļ îţ ƃîñđš ţö.

core/projectdb öþéñš ƃöţĥ þŕöĵéçţ þööļš àñđ ĥàñđš éàçĥ šüƃšýšţéḿ îţš ĥàñđļé. Çàļļéŕš ñàḿé à çàþàƃîļîţý ŕàţĥéŕ ţĥàñ à ƒîļé: Blocks() àñđ BlocksAutocommit() çöḿé ƒŕöḿ ţĥé þŕöĵéçţîöñ, Memory(), Terms(), Voice(), Work(), History(), Heads() àñđ Raw() ƒŕöḿ ţĥé çöñţéẋţ šţöŕé, àñđ ñöţĥîñĝ àƃöṽé ĥàš ţö ķñöŵ ŵĥîçĥ îš ŵĥîçĥ. Ţĥé ţàƃļé-ƃý-ţàƃļé ļàýöüţ îš îñ Ñöţé: Ŵöŕķšþàçé šţöŕàĝé.

Öþéñîñĝ ŵîţĥöüţ à ŵöŕķšþàçé​

projectdb.Open ŵîţĥ ñö ŵöŕķšþàçé öþţîöñ þüţš ţĥé çöñţéẋţ ţàƃļéš ƃéšîđé ţĥé þŕöĵéçţîöñ îñ .kapi/work/store.db, ŵĥîçĥ îš ţĥé éḿƃéđđéđ ļàýöüţ. Ţĥé ŵöŕķšþàçé ļöçàţîöñ îš àñ éẋþļîçîţ öþţîöñ ţĥé ĥöšţ ļàýéŕ šüþþļîéš (host/projectstore.go, ƒŕöḿ host.DataDir()), àñđ ţĥé ƒŕàḿéŵöŕķ ĥöļđš ñö đéƒàüļţ ƒöŕ îţ.

Ţĥàţ îš ŵĥàţ ķééþš core/ ĥéŕḿéţîç: à ƒŕàḿéŵöŕķ ţéšţ öþéñš à þŕöĵéçţ îñ à ţéḿþöŕàŕý đîŕéçţöŕý àñđ çàññöţ ŕéàçĥ à ŕéàļ ŵöŕķšþàçé, ƃéçàüšé ţĥéŕé îš ñö þàţĥ îñšîđé ţĥé ƒŕàḿéŵöŕķ ţĥàţ ñàḿéš öñé.

Ĵöîñîñĝ àçŕöšš ţĥé ţŵö ƒîļéš​

projectdb.DB.Join ŕüñš à ƒüñçţîöñ öñ öñé çöññéçţîöñ ŵîţĥ ƃöţĥ ƒîļéš ṽîšîƃļé: ţĥé þŕöĵéçţîöñ àñđ ţĥé çöñţéẋţ šţöŕé, ţĥé šéçöñđ àţţàçĥéđ üñđéŕ ţĥé šçĥéḿà ñàḿé context. Ţĥé çöññéçţîöñ îš ŕéàđ-öñļý ƒöŕ ţĥé ļéñĝţĥ öƒ ţĥé çàļļ.

À ĵöîñ ŕéàđš. À ŵŕîţé šþàññîñĝ ƃöţĥ þööļš îš ţŵö ţŕàñšàçţîöñš, àñđ ţĥé þàîŕîñĝ ţĥàţ ḿüšţ ƃé àţöḿîç, à đéçîšîöñ àñđ ţĥé ŵöŕđîñĝ ţĥé çöñţéñţ ḿéḿöŕý ļéàŕñš ƒŕöḿ îţ, îš ŵĥý ţĥé đéçîšîöñ ļéđĝéŕ àñđ ţĥé çöñţéñţ ḿéḿöŕý àŕé îñ ţĥé šàḿé þööļ.

Ŵŕîţéš àŕé öŕđéŕéđ; ŕéàđš àŕé ñéṽéŕ ĝàţéđ​

Éṽéŕý þööļ îš öþéñéđ ŵîţĥ storage.ProjectOptions(): àñ îḿḿéđîàţé ţŕàñšàçţîöñ, àñ îñ-þŕöçéšš ƑÎƑÖ þéŕḿîţ, àñđ à çŕöšš-þŕöçéšš àđṽîšöŕý ļöçķ öñ à ƒîļé ƃéšîđé ţĥé đàţàƃàšé. Ţĥé ƒîŕšţ þüţš ţĥé ŵàîţ ŵĥéŕé ŠǪĻîţé'š ƃüšý ĥàñđļéŕ àþþļîéš, ţĥé šéçöñđ öŕđéŕš ŵŕîţéŕš ţĥàţ šĥàŕé à ĥàñđļé, àñđ ţĥé ţĥîŕđ öŕđéŕš ţĥé šéṽéŕàļ þŕöçéššéš ţĥàţ ŵŕîţé öñé çöñţéẋţ šţöŕé àƒţéŕ îţ ļéàṽéš ţĥé çĥéçķöüţ.

Ţĥé þéŕḿîţ àñđ ţĥé ļöçķ àŕé þéŕ ƒîļé, ŵĥîçĥ îš ŵĥàţ ţĥé šþļîţ ƃüýš ƃàçķ: à ƃļöçķ šéššîöñ'š ļöñĝ ţŕàñšàçţîöñ ĥöļđš ţĥé þŕöĵéçţîöñ'š àñđ ļéàṽéš ţĥé çöñţéẋţ šţöŕé'š àļöñé, šö à ŕéṽîéŵ ļööþ ŕéçöŕđîñĝ đéçîšîöñš ŕüñš ƃéšîđé àñ éẋţŕàçţîöñ ŕàţĥéŕ ţĥàñ ƃéĥîñđ îţ. Ŕéàđš ţàķé ñéîţĥéŕ, ƃéçàüšé üñđéŕ ŴÀĻ à ŕéàđéŕ ñéîţĥéŕ ƃļöçķš à ŵŕîţéŕ ñöŕ ŵàîţš ƒöŕ öñé.

Ţĥé šéţţîñĝš, ţĥé ḿéàšüŕéḿéñţš ƃéĥîñđ ţĥéḿ àñđ ţĥé đéàđļöçķ à ŕééñţŕàñţ ŵŕîţé ŕéþöŕţš àŕé îñ Ñöţé: Ŵöŕķšþàçé šţöŕàĝé.

Ŕéàđîñĝ ƒŕöḿ à ŵŕîţé-ŕéšţŕîçţéđ šàñđƃöẋ​

À çĥéçķ ḿàý ŕüñ ŵĥéŕé îţ çàñ ŕéàđ ţĥé ŵöŕķšþàçé àñđ ñöţ ŵŕîţé îţ: à ŕéšţŕîçţéđ šàñđƃöẋ, à ŕéàđ-öñļý ḿöüñţ, à ŵöŕķšþàçé öŵñéđ ƃý àñöţĥéŕ àççöüñţ. Üñđéŕ ŴÀĻ ţĥàţ çöüñţš àš à ŵŕîţé, ƃéçàüšé ŠǪĻîţé çŕéàţéš ţĥé ŵŕîţé-àĥéàđ ļöĝ'š šĥàŕéđ-ḿéḿöŕý îñđéẋ ƃéšîđé ţĥé đàţàƃàšé öñ ţĥé ƒîŕšţ çöññéçţîöñ.

storage.OpenReadOnly àñšŵéŕš îţ: ţĥé đàţàƃàšé îš öþéñéđ ŵĥéŕé îţ îš ŵîţĥ ŵŕîţéš đîšàƃļéđ, àñđ ŵĥéŕé ŠǪĻîţé ŕéƒüšéš ţĥàţ, îţ àñđ îţš ļöĝ àŕé çöþîéđ ţö à ŵŕîţàƃļé ţéḿþöŕàŕý đîŕéçţöŕý ţĥàţ îš đéļéţéđ ŵĥéñ ţĥé ĥàñđļé çļöšéš. Ţĥé ŵöŕķšþàçé ţĥéñ ŕéþöŕţš îţšéļƒ ŕéàđ-öñļý, àñšŵéŕš ŕéàđš, àñđ ŕéƒüšéš à ŵŕîţé ŵîţĥ workspace.ErrReadOnly ŕàţĥéŕ ţĥàñ ļöšîñĝ îţ šöḿéŵĥéŕé ţĥé çàļļéŕ çàññöţ šéé.

À šýñçĥŕöñîžéđ ƒöļđéŕ îš ŕéƒüšéđ​

À ŵöŕķšþàçé îñšîđé à ƒöļđéŕ à đéšķţöþ šýñç çļîéñţ ķééþš îš ŕéƒüšéđ àţ öþéñ, ƃý þàţĥ þàţţéŕñ: îÇļöüđ Đŕîṽé, Đŕöþƃöẋ, ÖñéĐŕîṽé àñđ Ĝööĝļé Đŕîṽé, ḿàţçĥéđ à þàţĥ šéĝḿéñţ àţ à ţîḿé. Ţĥé ḿéššàĝé ñàḿéš ţĥé ƒöļđéŕ, ţĥé þŕöđüçţ àñđ ţĥé ŵàý öüţ, ŵĥîçĥ îš ţö šéţ KAPI_DATA_DIR ţö à đîŕéçţöŕý öüţšîđé îţ.

ŠǪĻîţé ķééþš à đàţàƃàšé, à ŵŕîţé-àĥéàđ ļöĝ àñđ à šĥàŕéđ-ḿéḿöŕý îñđéẋ çöñšîšţéñţ ŵîţĥ éàçĥ öţĥéŕ ţĥŕöüĝĥ ƃýţé-ŕàñĝé ļöçķš ţĥé öþéŕàţîñĝ šýšţéḿ éñƒöŕçéš; à šýñç çļîéñţ çöþîéš éàçĥ öƒ ţĥé ţĥŕéé ŵĥéñéṽéŕ îţ ñöţîçéš à çĥàñĝé, ţàķéš ñö ļöçķ, àñđ ŕéþļàçéš à ƒîļé üñđéŕ àñ öþéñ ĥàñđļé ŵĥéñ à šéçöñđ ḿàçĥîñé ŵŕîţéš. Ţĥé ŕéšüļţ îš à đàţàƃàšé ŵĥöšé ļöĝ đéšçŕîƃéš à šţàţé ţĥé ḿàîñ ƒîļé îš ñöţ îñ, ŕéþöŕţéđ àš çöŕŕüþţîöñ ļöñĝ àƒţéŕ ţĥé çöþý, îñ à þŕöçéšš ţĥàţ đîđ ñöţĥîñĝ ŵŕöñĝ. Ţĥé çöšţ öƒ ţĥé ŕüļé îš à ƒàļšé þöšîţîṽé öñ à đîŕéçţöŕý ţĥàţ ḿéŕéļý çàŕŕîéš öñé öƒ ţĥöšé ñàḿéš.

Öñé þööļ îš đéŕîṽéđ àñđ öñé îš àüţĥöŕéđ​

Ţĥé þŕöĵéçţîöñ îš àñ îñđéẋ. Éṽéŕý ŕöŵ îñ îţ îš à ŕéàđîñĝ öƒ ţĥé çöñţéñţ ƒîļéš, šöüŕçé àñđ ţàŕĝéţ, šö đéļéţîñĝ îţ çöšţš à ŕé-éẋţŕàçţîöñ àñđ ñöţĥîñĝ éļšé.

Ţĥé çöñţéẋţ šţöŕé ĥöļđš ţĥé þŕöĵéçţ'š ţéŕḿš (Ç-08), îţš ṽöîçé þŕöƒîļéš (Ç-07), îţš çöñţéñţ ḿéḿöŕý (Ç-09), îţš đéçîšîöñ ļéđĝéŕ àñđ đöçüḿéñţ àđöþţîöñš (Ç-04), îţš ƃļöçķ ĥîšţöŕý àñđ ţĥé éđîţîöñš ţĥé ŵöŕķšþàçé ĥöḿé ķééþš, éàçĥ à þŕöĵéçţîöñ öƒ ţĥé ŵöŕķšþàçé'š öþéŕàţîöñ ļöĝ, đéšçŕîƃéđ ƃéļöŵ. Ñö ŕéàđ þàţĥ öþéñš à ƒîļé îñ ţĥé çĥéçķöüţ ţö àñšŵéŕ ƒöŕ àñý öƒ ţĥéḿ. À çĥéçķöüţ ḿàý çàŕŕý à ţéŕḿš ƃüñđļé öŕ à ṽöîçé þŕöƒîļé à þéŕšöñ àüţĥöŕéđ üñđéŕ .kapi/; kapi store import îš ţĥé öñé çöḿḿàñđ ţĥàţ ŕéàđš ţĥéḿ (Ç-11). Ţĥé šţöŕé ḿöṽéš ƃéţŵééñ ḿàçĥîñéš ţĥŕöüĝĥ à çöñţéẋţ ƃàçķéñđ öŕ à ţŕàñšƒéŕ ƒîļé, ƃéļöŵ.

Ƃŕàñçĥéš üšé ţĥé çüŕŕéñţ çöñţéẋţ šţöŕé éṽéñ ŵĥéñ ţĥéý çöñţàîñ öļđéŕ šñàþšĥöţ ƒîļéš. Ĝöṽéŕñàñçé îš ţĥéŕéƒöŕé îñđéþéñđéñţ öƒ ŵĥéţĥéŕ à ţéàḿ çöḿḿîţš šñàþšĥöţš.

Ţĥé šţöŕéš àŕé þŕöĵéçţîöñš öƒ ţĥé ļöĝ​

À ŵŕîţé ţö ţĥé ţéŕḿš, ţĥé çöñţéñţ ḿéḿöŕý, ţĥé ṽöîçé þŕöƒîļéš öŕ ţĥé ŵîđéñéđ ŕüļéš ĝöéš ţĥŕöüĝĥ core/projector, ŵĥîçĥ đöéš ţŵö ţĥîñĝš üñđéŕ öñé ļöçķ þéŕ çöñţéẋţ šţöŕé. Îţ ŕéçöŕđš àñ öþéŕàţîöñ çàŕŕýîñĝ ţĥé ŕöŵš ţĥé ŵŕîţé þüţš öŕ ŕéḿöṽéš: terms.write, memory.write, voice.write öŕ rules.write, ŵîţĥ ţĥé šţéþš îñ ţĥé öŕđéŕ ţĥé šţöŕé çàļļš ḿàđé ţĥéḿ. Ţĥéñ îţ àþþļîéš éṽéŕý öþéŕàţîöñ ţĥé šţöŕé ĥàš ñöţ ýéţ šééñ, îñ ţĥé öŕđéŕ ţĥé ļöĝ ŕéçéîṽéđ ţĥéḿ, àñđ ḿöṽéš ţĥé šţöŕé'š çüŕšöŕ (projector_cursor) þàšţ ţĥéḿ. À ŵŕîţé àñöţĥéŕ þŕöçéšš ḿàđé, öŕ àñ öþéŕàţîöñ ḿéŕĝéđ îñ ƒŕöḿ àñöţĥéŕ ḿàçĥîñé, îš àþþļîéđ ƃý ţĥé ñéẋţ ŵŕîţé, àñđ à þŕöĵéçţöŕ öþéñîñĝ à šţöŕé àþþļîéš ŵĥàţéṽéŕ ţĥé ļöĝ ĥöļđš ƃéýöñđ ţĥé çüŕšöŕ. Workspace.Forget ŕéçöŕđš à project.forget öþéŕàţîöñ ŵĥéñ îţ ŕéḿöṽéš à þŕöĵéçţ'š çöñţéẋţ šţöŕé, àñđ à šţöŕé ţĥàţ ĥàš àþþļîéđ ñöţĥîñĝ šţàŕţš àƒţéŕ ţĥé þŕöĵéçţ'š ļàţéšţ öñé, šö à þŕöĵéçţ ŕéĝîšţéŕéđ àĝàîñ ƃéĝîñš ŵîţĥ àñ éḿþţý çöñţéẋţ. À ŕéƃüîļđ šţàŕţš ţĥéŕé ţöö. Ţĥé öþéŕàţîöñš ƃéƒöŕé ţĥé ŕéḿöṽàļ šţàý îñ ţĥé ļöĝ ƒöŕ ĥîšţöŕý àñđ çöüñţ àš ñöţ ĥéļđ: ţĥé ļöĝ ŕéçöŕđš öñé àĝàîñ àƒţéŕ ţĥé ŕéḿöṽàļ ŵĥéñ îţ àŕŕîṽéš àĝàîñ (Record, ƃý îđ öŕ çöñţéñţ àđđŕéšš), à þüļļ çöüñţš îţ àš ñéŵ, àñđ à þüšĥ ļéàṽéš öüţ éṽéŕýţĥîñĝ ƃéƒöŕé ţĥé ŕéḿöṽàļ. Ţĥé ŕéḿöṽàļ àļšö çļéàŕš ŵĥàţ ţĥé ŵöŕķšþàçé ķñéŵ àƃöüţ ţĥé þŕöĵéçţ'š ŕéḿöţéš, šö à þŕöĵéçţ îḿþöŕţéđ öŕ þüļļéđ àĝàîñ àƒţéŕ à ŕéšéţ ĝéţš îţš çöñţéẋţ ƃàçķ.

Éàçĥ šţéþ çàŕŕîéš îţš ŕöŵš ŵîţĥ éṽéŕý ţîḿéšţàḿþ ţĥé šţöŕé ŵöüļđ ţàķé ƒŕöḿ ţĥé çļöçķ ƒîļļéđ îñ ƒŕöḿ ţĥé öþéŕàţîöñ'š îñšţàñţ, àñđ à ŵŕîţé ţĥàţ ŵöüļđ ļéàṽé ţĥé šţöŕé àš îţ îš ŕéçöŕđš ñöţĥîñĝ. Àñ öþéŕàţîöñ ļàŕĝéŕ ţĥàñ 32 ĶîƂ ķééþš îţš šţéþš îñ à ƃļöƃ îţ ñàḿéš; à ƃàţçĥ öƒ éñţŕîéš öŕ çöñçéþţš îš šþļîţ šö éàçĥ ƃļöƃ šţàýš ŵéļļ îñšîđé ţĥé 64 ḾîƂ ƃöüñđ. À þàšš ţĥàţ ŵŕîţéš ḿàñý ŕöŵš (àñ îḿþöŕţ, à çöñṽéŕĝéñçé ŕüñ'š àƃšöŕƃéđ ŕéçöŕđ) çöļļéçţš ţĥéḿ îñţö öñé ƃàţçĥ, ŕéçöŕđéđ àš öñé öþéŕàţîöñ þéŕ šţöŕé.

Projector.Rebuild, ƃéĥîñđ kapi store rebuild, éḿþţîéš ţĥé þŕöĵéçţîöñ ţàƃļéš àñđ ţĥé ŕüļéš ţĥé þŕöĵéçţ ŵîđéñéđ, àñđ ŕéþļàýš ţĥé þŕöĵéçţ'š öþéŕàţîöñš îñ îđ öŕđéŕ. Öñ à ļöĝ öñé ḿàçĥîñé ŵŕöţé, ţĥé ŕöŵš îţ ļéàṽéš éǫüàļ ţĥé ŕöŵš ţĥé ŵŕîţéš ļéƒţ; ţĥé ṽöîçé šţöŕé šţàḿþš àñ éđîţ àñđ ţĥé ṽéŕšîöñ îţ àŕçĥîṽéš ƒŕöḿ ţĥé çļöçķ, šö ţĥöšé ţŵö çöļüḿñš àŕé ţĥé éẋçéþţîöñ. À ŕüñ öƒ šîñĝļé çöñţéñţ-ḿéḿöŕý ŵŕîţéš îš ŕéþļàýéđ îñ öñé ţŕàñšàçţîöñ ŵîţĥ ţĥé šéàŕçĥ îñđéẋéš ŕéƃüîļţ öñçé, ŵĥîçĥ ķééþš à đöĝƒööđ-šîžéđ ļöĝ (16,000 éñţŕîéš, 1,000 çöñçéþţš) ţö àƃöüţ ţĥŕéé šéçöñđš.

Ţĥé đéçîšîöñ ļéđĝéŕ ŕéçöŕđš ţĥŕöüĝĥ ţĥé šàḿé þŕöĵéçţöŕ: state.WorkStore ţàķéš à ĵöüŕñàļ (projector.Decisions), àñđ éàçĥ éñţŕý îš à decision.record öþéŕàţîöñ àđđŕéššéđ ƃý ţĥé éñţŕý'š öŵñ çöñţéñţ àđđŕéšš, šö à đéçîšîöñ ŕéçöŕđéđ ţŵîçé îš öñé öþéŕàţîöñ (Ç-04). Éàçĥ đöçüḿéñţ à çĥéçķöüţ ŕéšöļṽéš îš à document.adopt öþéŕàţîöñ çàŕŕýîñĝ îţš ķéý, îţš þàţĥ àñđ ŵĥàţ îţ ĥéļđ, ŵĥîçĥ éṽéŕý öţĥéŕ çĥéçķöüţ öƒ ţĥé þŕöĵéçţ çöñšüļţš ƃéƒöŕé ḿîñţîñĝ à ķéý öƒ îţš öŵñ (Ç-04). Éàçĥ çĥéçķöüţ'š ṽîéŵ öƒ ţĥé ļéđĝéŕ, àñđ îţš öŵñ ļîšţ öƒ ţĥé đöçüḿéñţš îţ ĥàš ŕéàđ, šţàý ŕéàđîñĝš öƒ îţš ƒîļéš.

À çĥéçķþöîñţ ķééþš à ŕéƃüîļđ šĥöŕţ. Projector.Checkpoint, ƃéĥîñđ kapi store rebuild --checkpoint, ŵŕîţéš éṽéŕý þŕöĵéçţîöñ ţàƃļé àš îţ šţàñđš (ŕöŵš, ţĥéîŕ ŕöŵîđš àñđ ţĥé ÀÜŢÖÎÑÇŔÉḾÉÑŢ ñüḿƃéŕîñĝ), ŵîţĥ ţĥé þŕöĵéçţ'š ŵîđéñéđ ŕüļéš, îñţö à .kpz öƒ ķîñđ kapi-checkpoint, šţöŕéš îţ àš à ƃļöƃ àñđ ŕéçöŕđš à checkpoint.write öþéŕàţîöñ ñàḿîñĝ îţ àñđ ţĥé ļàšţ öþéŕàţîöñ îţ îñçļüđéš. À ţàƃļé ŵĥöšé ŕöŵš ŕüñ þàšţ 1 ḾîƂ, ţĥé ƃļöçķ ĥîšţöŕý àƃöṽé àļļ, ţŕàṽéļš îñ þàŕţš îñšţéàđ: ƃļöƃš öƒ àţ ḿöšţ 16 ḾîƂ ţĥé çĥéçķþöîñţ ñàḿéš (kpz.CheckpointPart), šö ñö ƒîļé à çĥéçķþöîñţ îš ḿàđé öƒ ĝŕöŵš ŵîţĥ ţĥé þŕöĵéçţ'š ĥîšţöŕý. À þüšĥ ŵŕîţéš ţĥé þàŕţš ţö ţĥé ŕéḿöţé'š blobs/ ƃéƒöŕé ţĥé çĥéçķþöîñţ, àñđ à ƒîŕšţ þüļļ ƒéţçĥéš ţĥéḿ ƃéƒöŕé îţ îñšţàļļš ţĥé çĥéçķþöîñţ. À ŕéƃüîļđ ļöàđš ţĥé ñéŵéšţ çĥéçķþöîñţ ţĥàţ šţîļļ šţàñđš àñđ ŕéþļàýš öñļý ţĥé öþéŕàţîöñš àƒţéŕ îţ. À çĥéçķþöîñţ šţöþš šţàñđîñĝ ŵĥéñ ţĥé ļöĝ ŕéçéîṽéš, àƒţéŕ îţ ŵàš ţàķéñ, àñ öþéŕàţîöñ ŵĥöšé îđ šöŕţš ƃéƒöŕé îţš ļàšţ öñé, ŵĥîçĥ îš ŵĥàţ à ḿéŕĝé öƒ àñ öļđéŕ öþéŕàţîöñ ƒŕöḿ àñöţĥéŕ ḿàçĥîñé đöéš; ţĥé ŕéƃüîļđ ţĥéñ ƒàļļš ƃàçķ ţö àñ éàŕļîéŕ çĥéçķþöîñţ öŕ ţö ţĥé ŵĥöļé ļöĝ. À çĥéçķþöîñţ ţĥàţ çàññöţ ƃé ļöàđéđ, à þàŕţ öƒ îţ ḿîššîñĝ, çöšţš à ŕéþļàý öƒ ţĥé ŵĥöļé ļöĝ, àñđ ţĥé ŕéƃüîļđ ŕéþöŕţš îţ.

À ļöĝ ŵŕîţţéñ ƃéƒöŕé àñ öþéŕàţîöñ ķîñđ ŵàš ŕéţîŕéđ šţîļļ ĥöļđš öþéŕàţîöñš öƒ ţĥàţ ķîñđ, ƃéçàüšé ţĥé þŕöĵéçţ ŕéšéţš đàţà ŕàţĥéŕ ţĥàñ ḿîĝŕàţîñĝ îţ. À ŕéƃüîļđ ļéàṽéš ţĥéḿ öüţ àñđ çöüñţš ţĥéḿ (RebuildReport.Retired, ƒŕöḿ projector.RetiredKinds), àñđ kapi store rebuild šàýš ĥöŵ ḿàñý îţ ļéƒţ öüţ: unit.record, ţĥé ļéđĝéŕ'š éñţŕîéš ƃéƒöŕé ţĥéý ŵéŕé decision.record, îš öñé, àñđ kapi store import ŕéàđš ţĥé đéçîšîöñš îñ àĝàîñ ƒŕöḿ ţĥé šĥàŕđš.

Çàļļéŕš ŕéàçĥ ţĥé šţöŕéš ţĥŕöüĝĥ ţĥé þŕöĵéçţöŕ: App.Projector îñ ĥöšţ ĥàñđš öüţ projector.Terms, projector.Memory àñđ projector.Voice, ŵĥîçĥ àñšŵéŕ ŕéàđš ƒŕöḿ ţĥé þŕöĵéçţîöñ àñđ ŕéçöŕđ éṽéŕý ŵŕîţé. Çöđé ţĥàţ öñļý ŕéàđš ţàķéš à ṽîéŵ (projector.TermsView, MemoryView, VoiceView) ŵĥöšé ŵŕîţéš àŕé ŕéƒüšéđ. make check-projection-writes ţýþé-çĥéçķš ţĥé Àþàçĥé ḿöđüļéš àñđ ƒàîļš öñ à šţöŕé ŵŕîţé, öŕ à šţöŕé ĥàñđéđ ţö àñ îñţéŕƒàçé ţĥàţ çàñ ŵŕîţé îţ, àñýŵĥéŕé öüţšîđé ţĥé þŕöĵéçţöŕ, history.Store.Put àñđ ţĥé ŵöŕķšþàçé ĥöḿé'š workhome.Store.Apply àñđ Replace àḿöñĝ ţĥéḿ. À ŵŕîţé ḿéţĥöđ ŕéàçĥéđ ţĥŕöüĝĥ à ţýþé ţĥàţ éḿƃéđš ţĥé šţöŕé çöüñţš àš à đîŕéçţ çàļļ, šö à ḿéţĥöđ à þŕöĵéçţöŕ šţöŕé ļéàṽéš ţö îţš éḿƃéđđéđ šţöŕé îš çàüĝĥţ ţöö. Ţĥé ĝüàŕđ àļšö ŕéàđš ţĥé šţöŕé þàçķàĝéš: àñ éẋþöŕţéđ ḿéţĥöđ ţĥàţ ŵŕîţéš ţĥé đàţàƃàšé ḿüšţ ƃé îñ îţš ļîšţ öƒ ŵŕîţéš öŕ îñ îţš ļîšţ öƒ ŵŕîţéš ţĥé ļöĝ đöéš ñöţ þŕöĵéçţ (à šéàŕçĥ-îñđéẋ ŕéƃüîļđ, ţĥé ŵöŕķšþàçé'š þŕöĵéçţ ŕéĝîšţŕý). Ţĥé ƒéŵ ƒüñçţîöñš ţĥàţ öþéñ à šţöŕé à þéŕšöñ ñàḿéđ öñ ţĥé çöḿḿàñđ ļîñé àŕé ļîšţéđ ŵîţĥ ţĥé ŕéàšöñ.

Éđîţš àŕé ŕéçöŕđéđ àš çöñţéñţ.éđîţ​

Ţéẋţ ļîṽéš îñ îţš ĥöḿé: ţĥé ƒîļé îñ à çĥéçķöüţ. Ŵĥàţ ĥàþþéñéđ ţö îţ ļîṽéš îñ ţĥé ļöĝ. Àñ àþþļîéđ éđîţ îš à content.edit öþéŕàţîöñ þéŕ đöçüḿéñţ îţ çĥàñĝéđ, àñđ ţĥé þŕöĵéçţöŕ ŵŕîţéš îţ îñţö ţĥé ƃļöçķ ĥîšţöŕý (core/history, ţĥé block_history ţàƃļé): öñé ŕöŵ þéŕ éđîţîöñ ţĥé éđîţ çĥàñĝéđ, ŵîţĥ ţĥé éđîţîöñ ŕéṽîšîöñš ƃéƒöŕé àñđ àƒţéŕ, ţĥé ƃàšîš à đéŕîṽéđ éđîţîöñ ŵàš ḿàđé ƒŕöḿ, ţĥé ƃļöçķ'š ķéý, çöñţéñţ ĥàšĥ àñđ çöñţéẋţ ĥàšĥ, ţĥé ķîñđš öƒ ţĥé öþéŕàţîöñš ţĥàţ çĥàñĝéđ îţ àñđ, ƒöŕ à ƒļöŵ, ţĥé ţööļ ţĥàţ çĥàñĝéđ îţ, ŵĥö ḿàđé ţĥé çĥàñĝé (þéŕšöñ, àĝéñţ öŕ ţööļ, ŵîţĥ à ñàḿé àñđ à šéššîöñ, öŕ external ƒöŕ àñ éđîţ ḿàđé öüţšîđé ķàþî) àñđ ţĥŕöüĝĥ ŵĥîçĥ šüŕƒàçé (apply, ksed, mcp, browser, desktop, extract, context, flow:<name>, merge, pull, observed). history.Store.Wrote àñšŵéŕš ŵĥö ŵŕöţé ţĥé çöñţéñţ àñ éđîţîöñ ĥöļđš, ƒöŕ éṽéŕý ŵŕîţéŕ: ţĥé çĥàñĝé ţĥàţ ļéƒţ ţĥé éđîţîöñ àţ ţĥàţ ŕéṽîšîöñ, à ŕéçöŕđéđ ŵŕîţé ƃéƒöŕé àñ öƃšéŕṽéđ öñé. LastWrite àñđ Latest ŕéàđ ţĥé ḿöšţ ŕéçéñţ çĥàñĝé ţö öñé éđîţîöñ öŕ ţö éṽéŕý éđîţîöñ öƒ à đöçüḿéñţ (öŕ ţö ţĥé éđîţîöñš Latest îš ĝîṽéñ) îñ öñé þàšš öṽéŕ ţĥé đöçüḿéñţ'š ĥîšţöŕý, àñđ Edition àñđ Document ŕéàđ ţĥé çĥàñĝéš ƃàçķ, ḿöšţ ŕéçéñţ ƒîŕšţ. À ŕéàđ öƒ ţĥé çĥàñĝé šéŕṽîçé ţĥàţ šĥöŵš àţ ḿöšţ à þàĝé öƒ ƃļöçķš àšķš LastWrite ƒöŕ éàçĥ éđîţîöñ îţ šĥöŵš, šö îţš çöšţ ƒöļļöŵš ŵĥàţ îţ šĥöŵš; à ļöñĝéŕ ŕéàđ àšķš Latest öñçé ƒöŕ ţĥé éđîţîöñš îţš ƃļöçķš ĥöļđ. Éîţĥéŕ ŵàý à ŕéàđ àšķš Wrote öñļý ƒöŕ àñ éđîţîöñ ŵĥöšé ḿöšţ ŕéçéñţ çĥàñĝé đîđ ñöţ ļéàṽé ţĥé ŕéṽîšîöñ îţ ĥöļđš. Ţĥé ƒîļé šţàýš ţĥé öñļý çöþý öƒ îţš ţéẋţ àñđ ţĥé ļöĝ ķééþš ƒàçţš àƃöüţ îţ, ķéýéđ ƃý ŕéṽîšîöñš ţĥàţ ĥöļđ öñ éṽéŕý ƃŕàñçĥ ŵĥéŕé ţĥé çöñţéñţ ḿàţçĥéš, šö à ƃŕàñçĥ šŵîţçĥ ḿöṽéš ñö ŕéçöŕđ: ţĥé ĥîšţöŕý îš šĥàŕéđ ƃý éṽéŕý ƃŕàñçĥ öƒ à çĥéçķöüţ, àñđ ţĥé çĥàñĝé ţĥàţ ŵŕöţé ŵĥàţ à ƃŕàñçĥ ĥöļđš àñšŵéŕš ƒöŕ îţ ŵĥàţéṽéŕ ŵàš ŕéçöŕđéđ öñ àñöţĥéŕ ƃŕàñçĥ šîñçé.

core/change đéƒîñéš ţĥé ĥööķ àñ àþþļîéŕ öƒ çĥàñĝé šéţš çàļļš öñçé ţĥé ĥöḿéš çöḿḿîţţéđ (change.Recorder), àñđ host.App.EditRecorder îš ţĥé þŕöĵéçţ'š ŕéçöŕđéŕ: îţ ŕéçöŕđš éṽéŕý đöçüḿéñţ öƒ à çĥàñĝé šéţ ţĥŕöüĝĥ öñé Projector.RecordEdits çàļļ. Éṽéŕý ƒļöŵ ţĥé ĥöšţ ŕüñš ŕéçöŕđš éàçĥ đöçüḿéñţ îţ ŵŕîţéš ţĥŕöüĝĥ ţĥé šàḿé ŕéçöŕđéŕ, àš öñé content.edit ŵîţĥ ţĥé àçţöŕ tool:<flow> (É-09); îţš ţŕàñšîţîöñš çàŕŕý éàçĥ ţŕàñšļàţîöñ'š ƃàšîš, ţĥé ķîñđ öƒ öþéŕàţîöñ ţĥé ŕüñ'š çĥàñĝé ţö ţĥé éđîţîöñ çöḿéš ţö (àš change.Diff ŵöüļđ šéñđ îţ), ţĥé ţööļ ţĥàţ ḿàđé îţ (ţĥé ţööļ'š šţàḿþ, öŕ ţĥé ŕüñ'š öñļý ţööļ, ţĥé çöüñţéŕ à çöñṽéŕĝéñçé þàšš àđđš ļéƒţ öüţ), àñđ, àš ţĥé ŕöŵ'š þŕöđüçéŕ, ţĥé šţàḿþ ţĥé þŕöđüçîñĝ ţööļ ļéƒţ (þŕöṽîđéŕ, ḿöđéļ, àñđ ţĥé ĝöṽéŕñîñĝ çöñţéẋţ ƒîñĝéŕþŕîñţ), ŵĥîçĥ à ƒîļé öƒ šţŕîñĝš ĥàš ñöŵĥéŕé ţö ķééþ. Ţĥé ƃļöçķ ĥîšţöŕý îš ţĥéŕéƒöŕé ŵĥéŕé ţĥé ļööþ'š ƃàšîš ļîṽéš: çöṽéŕàĝé ĝŕàđéš àñ üñđéçîđéđ ţŕàñšļàţîöñ ƃý ţĥé ţööļ'š ŵŕîţé ţĥàţ ļéƒţ îţ, à đéçîšîöñ öñ šüçĥ à ţŕàñšļàţîöñ šţàŕţš ƒŕöḿ ţĥàţ ŵŕîţé, ţĥé ŕéṽîéŵ çöñţéẋţ ñàḿéš ţĥé þŕöđüçéŕ öƒ à ţŕàñšļàţîöñ à ƒļöŵ ŵŕöţé, àñđ ţĥé šţàļéñéšš ĝàţé ŕéàđš ţĥé þŕöđüçéŕ ƒŕöḿ ţĥé ļàţéšţ ŵŕîţé (Ç-05). Ţĥé ƃàšîš îš ţĥé šöüŕçé ţĥé ŕüñ ŕéàđ ƃéƒöŕé îţ ŕàñ, šö à šöüŕçé éđîţéđ ŵĥîļé ţĥé ŕüñ ŵöŕķéđ ŕéàđš àš đŕîƒţ. À ŕüñ ţĥàţ ŕéþŕöđüçéš à þéŕšöñ'š öŕ àñ àĝéñţ'š ŵöŕđîñĝ ŕéçöŕđš ñöţĥîñĝ öṽéŕ ţĥéîŕ ŵŕîţé. kapi pull ŕéçöŕđš à ṽéñüé'š ţŕàñšļàţîöñ ŵîţĥ à ƃàšîš öñļý ŵĥéŕé ţĥé ṽéñüé'š ŕéçöŕđ šàýš îţ ŵàš ḿàđé ƒŕöḿ ţĥé šöüŕçé ţĥé çĥéçķöüţ ĥöļđš (host.WithStatedBases); àñý öţĥéŕ þüļļéđ ţŕàñšļàţîöñ îš ḿàđé ƒŕöḿ ŵöŕđîñĝ ţĥîš çĥéçķöüţ đöéš ñöţ ĥöļđ, àñđ îš ŕéçöŕđéđ ŵîţĥ ñöñé. Ķàþî Đéšķţöþ, kapi apply, ķšéđ, ţĥé ḾÇÞ éđîţ ţööļš àñđ ţĥé ƃŕöŵšéŕ éñĝîñé éđîţ çöñţéñţ ţĥŕöüĝĥ ţĥé çĥàñĝé šéŕṽîçé, šö ţĥéîŕ éđîţš ŕéàçĥ ţĥé šàḿé ŕéçöŕđéŕ üñđéŕ ţĥéîŕ öŵñ öŕîĝîñš. Ţĥé đéçîšîöñ ļéđĝéŕ ĥöļđš đéçîšîöñš öñļý (Ç-04): ŵĥàţ à þŕöđüçéŕ ḿàđé, àñđ ƒŕöḿ ŵĥîçĥ šöüŕçé, îš îñ ţĥé ƃļöçķ ĥîšţöŕý àñđ ñöŵĥéŕé éļšé.

Ţĥé ƃļöçķ ĥîšţöŕý îš þàŕţ öƒ ţĥé ŵöŕķšþàçé ļöĝ, šö à çĥéçķöüţ öƒ à þŕöĵéçţ ţĥàţ šĥàŕéš îţš çöñţéẋţ ţĥŕöüĝĥ à ƃàçķéñđ ŕéàđš îţ ŵîţĥ kapi context sync, àñđ à ƒŕéšĥ çļöñé ĥöļđš ţĥé ţŕàñšļàţîöñš ţĥé ŕéþöšîţöŕý çàŕŕîéš àñđ ñöñé öƒ ţĥé ŕéçöŕđ öƒ ĥöŵ ţĥéý ŵéŕé ŵŕîţţéñ. Üñţîļ îţ þüļļš, à ţŕàñšļàţîöñ ŵĥöšé šöüŕçé ŵàš éđîţéđ ƃéƒöŕé ţĥé çļöñé'š ƒîŕšţ þàšš îš ñöţ ĝŕàđéđ šţàļé ţĥéŕé. kapi up àñđ kapi status šàý šö îñ öñé ļîñé (host.HistoryNotPulledNote) ŵĥéñ ţĥé þŕöĵéçţ ñàḿéš à ƃàçķéñđ, ţŕàñšļàţîöñš éẋîšţ öñ đîšķ àñđ ţĥé ĥîšţöŕý ŕéçöŕđš ñöţĥîñĝ. À þüšĥ ţö à ṽéñüé çàŕŕîéš ţĥé šàḿé ŕéçöŕđ ƒöŕ ţĥé đöçüḿéñţš îţ ŕéàđš (Š-07).

Àñ éđîţ ḿàđé öüţšîđé ķàþî ŕéçöŕđš ñöţĥîñĝ ŵĥéñ îţ ĥàþþéñš. Ţĥé ñéẋţ ŕéàđ ţĥŕöüĝĥ ţĥé çĥàñĝé šéŕṽîçé ƒîñđš îţ: ţĥé šéŕṽîçé šĥöŵš éàçĥ ƃļöçķ îţ ŕéàđš ţö îţš öƃšéŕṽéŕ (change.Observer), àñđ ţĥé ĥöšţ'š (host/changes_observe.go) çöḿþàŕéš éṽéŕý éđîţîöñ ŵîţĥ ţĥé çĥàñĝéš ţĥé ĥîšţöŕý ŕéçöŕđš ƒöŕ îţ. Àñ éđîţîöñ ŵĥöšé ŕéṽîšîöñ ñö ŕéçöŕđéđ çĥàñĝé ļéƒţ ŵàš çĥàñĝéđ ƃý šöḿéţĥîñĝ ţĥàţ ŕéçöŕđéđ ñöţĥîñĝ, àñđ ţĥé ŕéàđ ŕéçöŕđš îţ àš öñé ĥàšĥ-öñļý content.edit ƒöŕ ţĥé đöçüḿéñţ, ŵîţĥ ţĥé àçţöŕ external àñđ ţĥé öŕîĝîñ observed, šţàŕţîñĝ ƒŕöḿ ţĥé ŕéṽîšîöñ ţĥé ĥîšţöŕý ļàšţ ŕéçöŕđéđ. À ŕéṽîšîöñ àñ éàŕļîéŕ çĥàñĝé ļéƒţ îš éẋþļàîñéđ, šö à çĥéçķöüţ öƒ àñöţĥéŕ ƃŕàñçĥ ŕéçöŕđš ñöţĥîñĝ. Ţĥé ŕéàđ àšķš ŵĥéñ îţ éñđš ŕàţĥéŕ ţĥàñ ŵĥéñ îţ šţàŕţš (history.Store.Reached), šö à ŵŕîţéŕ îñ àñöţĥéŕ þŕöçéšš ţĥàţ ŕéçöŕđéđ îţš öŵñ çĥàñĝé ŵĥîļé ţĥé ŕéàđ ŕàñ éẋþļàîñš îţ; àñđ àñ öƃšéŕṽéđ çĥàñĝé ţĥàţ ļàñđš àƒţéŕ šüçĥ à ŵŕîţéŕ'š ŕéçöŕđ ñéṽéŕ ţàķéš ţĥé ŕéṽîšîöñ ƒŕöḿ îţ. Àñ éđîţîöñ ţĥé ĥîšţöŕý ĥàš ñéṽéŕ ŕéçöŕđéđ îš ļéƒţ àļöñé. À ĥîšţöŕý šĥöŵš àñ öƃšéŕṽéđ çĥàñĝé ŵîţĥ ñö àçţöŕ, šîñçé ñöƃöđý ķñöŵš ŵĥö ḿàđé îţ, àñđ îţ çàŕŕîéš ñö ƃàšîš, šö ţĥé ţŕàñšļàţîöñ ŕéàđš àš ḿàđé ƒŕöḿ ñö ŕéçöŕđéđ šöüŕçé. À ƒļöŵ'š ŕéàđ öƒ ţĥé đöçüḿéñţ îţ ĥàš ĵüšţ çöḿḿîţţéđ îš ļéƒţ üñöƃšéŕṽéđ (change.Unobserved), ƃéçàüšé ţĥé ƒļöŵ ŕéçöŕđš ţĥàţ çĥàñĝé îţšéļƒ, àñđ šö îš éṽéŕý ŕéàđ öƒ à ŕüñ ţĥàţ þŕîñţš îţš çĥàñĝé šéţ îñšţéàđ öƒ ŵŕîţîñĝ îţ.

À þéŕšöñ'š öŕ àñ àĝéñţ'š éđîţ ķééþš ţĥé ŕüñš àŕöüñđ éàçĥ çĥàñĝé àñđ ţĥé çĥàñĝé šéţ àš šéñţ, îñ ƃļöƃš ţĥé öþéŕàţîöñ ñàḿéš; à ţööļ'š éđîţ ķééþš ţĥé ŕéṽîšîöñš àñđ ĥàšĥéš öñļý, ƃéçàüšé ţĥé ƒîļé ĥöļđš ţĥé ţéẋţ àñđ à ƒļöŵ ŵŕîţéš ţĥöüšàñđš öƒ ţĥéḿ. À ŵŕîţé ţö ţĥé ŵöŕķšþàçé ĥöḿé ķééþš ţĥé éđîţîöñ îţ ļéàṽéš, ŵĥöéṽéŕ ḿàđé îţ, ƃéçàüšé ţĥé ļöĝ îš ţĥàţ ĥöḿé (ƃéļöŵ). À þŕöĵéçţ ţĥàţ đéçļàŕéš ŕéđàçţîöñ (Ç-10) ķééþš ñö ŵîţĥĥéļđ ṽàļüé îñ à ŕéçöŕđ: ţĥé ŕéçöŕđéŕ ŕéđàçţš ţĥé ŕüñš îţ ķééþš àñđ ţĥé ñöţé ŵîţĥ ţĥé þŕöĵéçţ'š ŕüļéš, ţĥé öŕîĝîñàļš ĝöîñĝ ţö ţĥé þŕöĵéçţ ṽàüļţ, àñđ ļéàṽéš ţĥé çĥàñĝé šéţ öüţ. Ţĥé ŵöŕķšþàçé ĥöḿé ŕéđàçţš ŵĥàţ îţ ŕéçöŕđš ţĥé šàḿé ŵàý, àñđ þüţš ţĥé öŕîĝîñàļš ƃàçķ ƒŕöḿ ţĥé ṽàüļţ ŵĥéŕé îţ ŕéàđš àñ éđîţîöñ, šö à ķéþţ đŕàƒţ ŕéàđš ŵĥöļé öñ ţĥé ḿàçĥîñé ţĥàţ ŵîţĥĥéļđ îţš ṽàļüéš àñđ ŵîţĥ þļàçéĥöļđéŕš àñýŵĥéŕé éļšé. À þöļîçý ţĥàţ đéţéçţš éñţîţîéš ñééđš à ŕéàđ'š éñţîţý àññöţàţîöñš, ŵĥîçĥ à ŕéçöŕđ'š ŕüñš đö ñöţ çàŕŕý, šö üñđéŕ öñé à ŕéçöŕđ ķééþš ŕéṽîšîöñš àñđ ĥàšĥéš öñļý, àñđ ţĥé ŵöŕķšþàçé ĥöḿé ķééþš ñö éđîţîöñ àţ àļļ: à çĥàñĝé ţö à ţŕàñšļàţîöñ ŵîţĥ ñö ƒîļé îš ŕéƒüšéđ, àñđ à ĝàţéđ ŕüñ ļéàṽéš îţš ĥéļđ-ƃàçķ đŕàƒţš îñ ţĥé þŕöđüçéŕ'š çàçĥé.

Àñ öþéŕàţîöñ îš àđđŕéššéđ ƃý ţĥé đöçüḿéñţ, ţĥé àçţöŕ àñđ éàçĥ ţŕàñšîţîöñ ŵîţĥ ţĥé àđđŕéšš öƒ ţĥé öþéŕàţîöñ îţ éẋţéñđš, ţĥé öñé ţĥàţ ḿöšţ ŕéçéñţļý ļéƒţ ţĥé éđîţîöñ àţ ţĥé ŕéṽîšîöñ ţĥé ţŕàñšîţîöñ šţàŕţš ƒŕöḿ (history.Store.Reached, ŵĥîçĥ ļööķš üþ öñļý ţĥöšé ŕéṽîšîöñš). Éṽéŕý ļöĝ ĥöļđîñĝ àñ öþéŕàţîöñ àĝŕééš öñ îţš àđđŕéšš, šö öñé éđîţ ŕéçöŕđéđ ţŵîçé, ƃý à ŕéţŕý öŕ ƃý ţŵö ḿàçĥîñéš ñöţîçîñĝ öñé çĥàñĝé ḿàđé öüţšîđé ķàþî, îš öñé öþéŕàţîöñ, àñđ šö îš éṽéŕý çĥàñĝé ţĥàţ éẋţéñđš îţ, ŵĥîļé ţĥé šàḿé çĥàñĝé ḿàđé àĝàîñ àƒţéŕ àñ üñđö îš àñöţĥéŕ. Ţĥé ĥîšţöŕý ķééþš éàçĥ öþéŕàţîöñ'š àđđŕéšš ƃéšîđé îţš ŕöŵš (block_history_op): ŵĥéñ ţŵö ļöĝš ţĥàţ ŕéçöŕđéđ öñé éđîţ üñđéŕ đéŕéñţ îđš ḿéŕĝé, ţĥé ļöĝ ķééþš ţĥé öļđéŕ îđ, àñđ îţš ŕöŵš ţàķé ţĥé þļàçé öƒ ţĥé öñéš ţĥé ñéŵéŕ îđ þŕöĵéçţéđ, àš à ŕéƃüîļđ ŵŕîţéš ţĥéḿ.

Ţĥé îđéñţîţý éṽîđéñçé öñ éṽéŕý ţŕàñšîţîöñ îš ŵĥàţ ļéţš ĥîšţöŕý ŕé-àţţàçĥ àƒţéŕ à ŕéöŕđéŕ. À ŕéàđ ŕéþöŕţš ţĥé ķéýš ţĥé ƒöŕḿàţ ĝîṽéš, àñđ ŕéçöñçîļîàţîöñ àĝàîñšţ ţĥé ĥîšţöŕý'š þŕîöŕš (history.Store.Priors, reconcile.Blocks) ƒîñđš à ŕéçöŕđéđ ƃļöçķ àḿöñĝ šîƃļîñĝš ŵĥöšé þöšîţîöñš ḿöṽéđ.

Ţĥé ŵöŕķšþàçé ĥöḿé ķééþš ţĥé éđîţîöñš ţĥàţ ĥàṽé ñö ƒîļé​

Àñ éđîţîöñ ŵîţĥ ñö ƒîļé ĥàš ţĥé ļöĝ àš îţš ĥöḿé. Üñđéŕ defaults.materialize: on-converge à ļöçàļé'š ƒîļéš àþþéàŕ öñļý ŵĥéñ îţ çļéàŕš îţš šĥîþ ĝàţé, šö à ĥéļđ-ƃàçķ ļöçàļé'š đŕàƒţš, ţĥé éđîţš à þéŕšöñ öŕ àñ àĝéñţ ḿàķéš ţö ţĥéḿ, àñđ ţĥé đŕàƒţš à ĝàţéđ ŕüñ þŕöđüçéđ ţĥàţ kapi merge ĥàš ñöţ đéļîṽéŕéđ àļļ ļîṽé îñ ţĥé ŵöŕķšþàçé ĥöḿé (core/workhome), öüţšîđé ţĥé çĥéçķöüţ, üñţîļ à đéļîṽéŕý ŵŕîţéš ţĥéḿ ţö ţĥé ƒîļéš ţĥé ŕéçîþé ñàḿéš.

Éàçĥ ŵŕîţé ţö šüçĥ àñ éđîţîöñ îš öñé content.edit ţĥàţ çàŕŕîéš ţĥé ŕéšüļţ: ţĥé ŕüñš, šţàţüš àñđ öŕîĝîñ öƒ éàçĥ ƃļöçķ'š éđîţîöñ îţ ļéàṽéš, ţĥé ƃàšîš îţ ŵàš ḿàđé ƒŕöḿ, ţĥé ƃļöçķ'š îđéñţîţý šîĝñàļš, àñđ ţĥé šţàḿþ îţš þŕöđüçéŕ šéŕṽéš à đŕàƒţ àĝàîñ ƃý. Îţš ƃļöçķ ĥîšţöŕý ŕöŵš ñàḿé ţĥé ķîñđš öƒ ţĥé öþéŕàţîöñš ţĥàţ ḿàđé éàçĥ çĥàñĝé àñđ ţĥé ţööļ, àš à ŵŕîţé ţö à ƒîļé'š đö: ţĥé ķîñđš à çĥàñĝé šéţ šéñţ, ţĥé ķîñđ à ƒļöŵ'š đŕàƒţ çöḿéš ţö (set_content, öŕ replace_text ƒöŕ ţéẋţ ḿöṽéđ àŕöüñđ ţĥé šàḿé çöđéš) ŵîţĥ ţĥé ţööļ ţĥé ƒļöŵ ñàḿéš, àñđ remove_edition ƒöŕ à ŕéḿöṽàļ öŕ à đéļîṽéŕý'š ŕéļéàšé. Ţĥé öþéŕàţîöñ ñàḿéš îţš šüƃĵéçţ, ţĥé đöçüḿéñţ'š ķéý àñđ ţĥé éđîţîöñ (workspace.Op.Subject, îñđéẋéđ), àñđ ţĥé ŵŕîţéŕ àþþéñđš îţ ŵîţĥ à çöñđîţîöñàļ ŕéçöŕđ (workspace.Backend.RecordIf): îñšîđé ţĥé ÎḾḾÉĐÎÀŢÉ ţŕàñšàçţîöñ ţĥàţ àþþéñđš, ţĥé šüƃĵéçţ'š ļàšţ ļöçàļ þöšîţîöñ ḿüšţ šţîļļ ƃé ţĥé öñé ţĥé ŵŕîţéŕ ŕéàđ, öŕ ñöţĥîñĝ îš àþþéñđéđ. Ţĥé þŕöĵéçţöŕ'š ļöçķ îš þéŕ þŕöçéšš, šö ţĥîš çĥéçķ îš ŵĥàţ ḿàķéš ţŵö þŕöçéššéš ŵŕîţîñĝ öñé éđîţîöñ (Ķàþî Đéšķţöþ àñđ àñ àĝéñţ'š ḾÇÞ šéŕṽéŕ) ţàķé ţüŕñš. Ţĥé ĥéàđ à ŵŕîţéŕ éẋþéçţš îš ŕéàđ ƒŕöḿ ţĥé ļöĝ (SubjectHead), ñéṽéŕ ƒŕöḿ à þŕöĵéçţîöñ, ƃéçàüšé à þöšîţîöñ îš ļöçàļ ţö öñé ļöĝ. À ĥéàđ ţĥàţ ḿöṽéš àƒţéŕ à çĥàñĝé šéţ šéţţļéđ, àñđ ƃéƒöŕé îţš çöḿḿîţ, ŕéƒüšéš ţĥé çĥàñĝé šéţ doc_changed ŵîţĥ ñöţĥîñĝ ļàñđéđ.

Ţĥé þŕöĵéçţöŕ ƒöļđš éàçĥ šüƃĵéçţ'š ŵŕîţéš îñţö ţŵö ţàƃļéš öƒ ţĥé çöñţéẋţ šţöŕé: edition_head, öñé ŕöŵ þéŕ ƃļöçķ öƒ éàçĥ ķéþţ éđîţîöñ (ŕéṽîšîöñ, ŕüñš îñļîñé üþ ţö 16 ĶîƂ àñđ îñ ţĥéîŕ ƃļöƃ àƃöṽé, šţàţüš, öŕîĝîñ, ƃàšîš, šţàḿþ), àñđ edition_subject_head, öñé ŕöŵ þéŕ šüƃĵéçţ (ţĥé öþéŕàţîöñ îţš ĥéàđ îš àţ, ţĥé ļàţéšţ öþéŕàţîöñ ƒöļđéđ, àñđ ţĥé ŵŕîţéš ţĥàţ đîđ ñöţ àđṽàñçé îţ). Ţĥé ƒöļđ ŕéàđš à šüƃĵéçţ'š ŵŕîţéš îñ îđ öŕđéŕ. À ŵŕîţé àđṽàñçéš ţĥé ĥéàđ ŵĥéñ îţ ŵàš šţàĝéđ öñ ţĥé ĥéàđ îţ ƒîñđš ţĥéŕé (îţš ƃàšé); öţĥéŕŵîšé îţ îš đîṽéŕĝéñţ àñđ çĥàñĝéš ñöţĥîñĝ. Ţŵö ḿàçĥîñéš ţĥàţ ŵŕöţé öñé éđîţîöñ ƒŕöḿ öñé ĥéàđ ţĥéŕéƒöŕé ŕéàçĥ ţĥé šàḿé ĥéàđ àƒţéŕ ţĥéîŕ ļöĝš ḿéŕĝé, ŵĥîçĥéṽéŕ ļöĝ ŕéçéîṽéđ ŵĥîçĥ ŵŕîţé ƒîŕšţ: à ŵŕîţé ţĥàţ àŕŕîṽéš ŵîţĥ àñ îđ ƃéƒöŕé ţĥé ļàţéšţ öñé ƒöļđéđ ḿàķéš ţĥé þŕöĵéçţöŕ ƒöļđ ţĥé šüƃĵéçţ àĝàîñ ƒŕöḿ éṽéŕý ŵŕîţé ţĥé ļöĝ ĥöļđš ƒöŕ îţ. À þüļļ ţĥéñ ŕéƃàšéš (Projector.RebaseWorkspace, çàļļéđ ƃý ţĥé þŕöĵéçţöŕ'š šýñçéŕ àƒţéŕ îţ àþþļîéš ŵĥàţ à þüļļ ḿéŕĝéđ): à đîṽéŕĝéñţ ŵŕîţé éàçĥ öƒ ŵĥöšé ƃļöçķš šţîļļ ĥöļđš ţĥé ŕéṽîšîöñ îţ šţàŕţéđ ƒŕöḿ, ţĥé çöḿḿöñ çàšé ƒöŕ ŵŕîţéš ţö đéŕéñţ ƃļöçķš, îš àþþļîéđ öñţö ţĥé ĥéàđ àš à ñéŵ content.edit ñàḿîñĝ îţ àš îţš çàüšé, àđđŕéššéđ šö ţĥàţ ţŵö ḿàçĥîñéš ŕéƃàšîñĝ öñé ŵŕîţé öñţö öñé ĥéàđ ḿàķé öñé öþéŕàţîöñ. À đîṽéŕĝéñţ ŵŕîţé ţĥàţ çĥàñĝéđ à ƃļöçķ ţĥé ĥéàđ ĥàš ḿöṽéđ šîñçé îš à çöñƒļîçţ, ŵĥîçĥ kapi status ñàḿéš àñđ Ķàþî Đéšķţöþ šĥöŵš ŵîţĥ ƃöţĥ ŵöŕđîñĝš (Š-02). À þéŕšöñ'š öŕ àñ àĝéñţ'š ŵŕîţé ţĥàţ àđṽàñçéš ţĥé ĥéàđ šéţţļéš ţĥé çöñƒļîçţ ƒöŕ éṽéŕý ƃļöçķ îţ ŵŕîţéš, šîñçé îţ ŵàš ḿàđé ŵîţĥ ţĥé çöñƒļîçţ îñ ṽîéŵ, àñđ à ŕéƃàšé çàŕŕîéš öṽéŕ öñļý ţĥé ƃļöçķš à çöñƒļîçţ šţîļļ ļîšţš. Ķééþîñĝ ţĥé ŵöŕđîñĝ ţĥé ĥéàđ ĥöļđš îš šüçĥ à ŵŕîţé ţöö: à set_content ţĥàţ ļéàṽéš à çöñţéšţéđ ƃļöçķ àš îţ šţàñđš, šéñţ ƃý à þéŕšöñ öŕ àñ àĝéñţ, îš ŕéçöŕđéđ ŕàţĥéŕ ţĥàñ ŕéþöŕţéđ üñçĥàñĝéđ àñđ ñöţĥîñĝ ḿöŕé (change.ContestedSession). À đéļîṽéŕý'š ŕéļéàšé öƒ ţĥé ŵĥöļé éđîţîöñ šéţţļéš éṽéŕý çöñƒļîçţ öñ îţ.

Ţĥé ŕéçîþé þîçķš àñ éđîţîöñ'š ĥöḿé. Ţĥé ƒîļé ĥöḿé ŕéàçĥéš ţĥé ŵöŕķšþàçé ĥöḿé ţĥŕöüĝĥ à ķééþéŕ (filehome.Keeper): üñđéŕ on-converge à ţŕàñšļàţîöñ ŵĥöšé ƒîļé đöéš ñöţ éẋîšţ ļîṽéš îñ ţĥé ŵöŕķšþàçé ĥöḿé ŵĥéţĥéŕ öŕ ñöţ ţĥé ŵöŕķšþàçé ĥöļđš àñýţĥîñĝ öƒ îţ ýéţ, šö à çĥàñĝé šéţ ñéṽéŕ đéļîṽéŕš à ƒîļé ţĥé šĥîþ ĝàţé ŵîţĥĥöļđš; üñđéŕ manual îţ îš ŵŕîţţéñ ţö îţš ƒîļé, üñļéšš ţĥé ŵöŕķšþàçé šţîļļ ķééþš à đŕàƒţ öƒ îţ. Îţš ŕéàđš àñđ çĥàñĝé šéţš ĝö ţĥŕöüĝĥ ţĥé ķééþéŕ ŵîţĥ if_match ļîķé àñý éđîţîöñ (É-09). Öñçé ţĥé éđîţîöñ'š ƒîļé éẋîšţš, ţĥé ƒîļé îš îţš ĥöḿé àñđ ţĥé ŵöŕķšþàçé'š çöþý îš ñéṽéŕ ŕéàđ öŕ ŵŕîţţéñ ţĥéŕé, àñđ à ĝàţéđ ŕüñ ķééþš ñö đŕàƒţ öƒ à ţŕàñšļàţîöñ ŵĥöšé ƒîļé éẋîšţš, šö ţĥé ŵöŕķšþàçé ñéṽéŕ ƃéçöḿéš à šéçöñđ çöþý öƒ ƒîļé-ƃàçķéđ çöñţéñţ.

Éṽéŕý đéļîṽéŕý (kapi merge, öŕ kapi up ƒöŕ à ļöçàļé ţĥàţ çļéàŕéđ îţš ĝàţé) ŵŕîţéš ţĥé ƒîļé ƒŕöḿ ŵĥàţ ţĥé ŵöŕķšþàçé ķééþš, ŵîţĥ ţĥé ƃàšîš éàçĥ đŕàƒţ ŵàš ḿàđé ƒŕöḿ, àñđ ţĥéñ ŕéļéàšéš ƒŕöḿ ţĥé ŵöŕķšþàçé ĥöḿé ŵĥàţ îţ ŕéàđ ţĥéŕé, à content.edit ţĥàţ ŕéḿöṽéš éàçĥ ƃļöçķ. Ţĥé ŕéļéàšé éẋþéçţš ţĥé ĥéàđ ţĥé đéļîṽéŕý ŕéàđ, šö àñ éđîţ ţĥàţ ļàñđš îñ ƃéţŵééñ îš đéļîṽéŕéđ ƃý ŕéàđîñĝ àĝàîñ ŕàţĥéŕ ţĥàñ ŕéļéàšéđ üñŕéàđ. À ŕüñ ţĥàţ đéļîṽéŕš à ļöçàļé ƒîŕšţ ŕéþļàçéš ţĥé đŕàƒţš ţĥé ŵöŕķšþàçé ķéþţ ƒŕöḿ àñ éàŕļîéŕ ŕüñ ŵîţĥ îţš öŵñ, šö ŵĥàţ îţ ŵŕîţéš öñ ţöþ öƒ ţĥé ŕüñ'š đŕàƒţš îš ţĥé ŵöŕđîñĝ à þéŕšöñ öŕ àñ àĝéñţ ĝàṽé ţĥé ļöçàļé, ñéṽéŕ à đŕàƒţ öƒ à šöüŕçé ţĥàţ ĥàš çĥàñĝéđ šîñçé.

À ţŕàñšļàţîöñ'š ƒîļé çàñ àļšö àþþéàŕ ƃý àñöţĥéŕ þàţĥ: à þéŕšöñ ŵŕîţéš îţ, kapi pull öŕ à çĥéçķöüţ ƃŕîñĝš îţ, öŕ à ŕéçîþé šŵîţçĥéđ ţö manual ĥàš îţš þàšš ŵŕîţé îţ ƒŕöḿ ţĥé ƒļöŵ'š đŕàƒţš. Ţĥé éñđ öƒ éṽéŕý ŕüñ šéţţļéš šüçĥ àñ éđîţîöñ: ţĥé ŵöŕķšþàçé ŕéļéàšéš éàçĥ ƃļöçķ ţĥé ƒîļé àļŕéàđý ĥöļđš àñđ éàçĥ đŕàƒţ à ţööļ ḿàđé, ŵĥîçĥ ţĥé ƒîļé šüþéŕšéđéš, àñđ ķééþš ţĥé ŵöŕđîñĝ à þéŕšöñ öŕ àñ àĝéñţ ŵŕöţé ţĥàţ ţĥé ƒîļé đöéš ñöţ ĥöļđ. kapi status ļîšţš ţĥàţ ŵöŕđîñĝ àš à çöñƒļîçţ, àñđ kapi merge ŵŕîţéš îţ îñţö ţĥé ƒîļé. À þéŕšöñ đéçîđîñĝ îţ îñ Ķàþî Đéšķţöþ ŵŕîţéš ţĥé çĥöšéñ ŵöŕđîñĝ îñţö ţĥé ƒîļé ţĥŕöüĝĥ ţĥé çĥàñĝé šéŕṽîçé ŵĥéñ îţ îš ñöţ ţĥé ƒîļé'š, àñđ ţĥé ŵöŕķšþàçé ţĥéñ ŕéļéàšéš îţš çöþý (host.ReleaseKeptWording).

Ţĥé ŵöŕķšþàçé ĥöḿé àļšö ķééþš ŵĥöļé đöçüḿéñţš: à ñàţîṽé đöçüḿéñţ öþéñéđ ƒöŕ éđîţîñĝ ţĥàţ ĥàš ñö ƒîļé öƒ îţš öŵñ, šüçĥ àš à šöüŕçé à .kpz çàŕŕîéš. Éàçĥ îš à ŕöŵ öƒ document_head (ķéý, ŕéṽîšîöñ, ƒöŕḿàţ, ţĥé ƃļöƃ ĥöļđîñĝ îţš ƃýţéš, àñđ ţĥé öþéŕàţîöñ îţš ĥéàđ îš àţ), ƒöļđéđ ƒŕöḿ content.edit öþéŕàţîöñš ŵĥöšé šüƃĵéçţ îš ţĥé đöçüḿéñţ (workhome.DocumentSubject) ƃý ţĥé ŕüļé ţĥé éđîţîöñ ĥéàđš ƒöļļöŵ: à ŵŕîţé šţàĝéđ öñ ţĥé ĥéàđ àđṽàñçéš îţ, àñđ àñý öţĥéŕ îš đîṽéŕĝéñţ. À çĥàñĝé ŕéàđš ţĥé đöçüḿéñţ àţ îţš ĥéàđ ţĥŕöüĝĥ îţš ƒöŕḿàţ, àþþļîéš ţĥé öþéŕàţîöñš, ŵŕîţéš îţ ţĥŕöüĝĥ ţĥé šàḿé ƒöŕḿàţ, àñđ çöḿḿîţš ƃý à çöñđîţîöñàļ ŕéçöŕđ öƒ ţĥé ñéŵ ƃýţéš (workhome.Documents). Ţĥé ţàƃļé îš à þŕöĵéçţîöñ ļîķé ţĥé öţĥéŕš: à ŕéƃüîļđ ŕéþļàýš îţ àñđ à çĥéçķþöîñţ çàŕŕîéš îţ.

Đéļéţîñĝ đéŕîṽéđ đàţà​

Ţĥé þàŕšé çàçĥé, éẋţŕàçţîöñ ƃàţçĥéš, çöļļéçţîöñ öṽéŕļàýš àñđ store.db çàñ ƃé ŕéƃüîļţ ƒŕöḿ çöñţéñţ ƒîļéš. À ĥéļđ-ƃàçķ ļöçàļé'š đŕàƒţš àŕé ķéþţ îñ ţĥé ŵöŕķšþàçé ĥöḿé, šö đéļéţîñĝ .kapi/work/ ļöšéš ñöñé öƒ ţĥéḿ: ţĥé ñéẋţ kapi up ŵŕîţéš ţĥé öṽéŕļàýš à þŕöđüçéŕ šéŕṽéš ţĥéḿ ƒŕöḿ ƃàçķ îñţö ţĥé ƃļöçķ šţöŕé ƒŕöḿ ţĥé šţàḿþš ţĥé ŵöŕķšþàçé ĥöḿé ķééþš, àñđ ţĥé þàšš çàļļš ñö þŕöṽîđéŕ ƒöŕ ţĥéḿ. À đŕàƒţ à þéŕšöñ öŕ àñ àĝéñţ ĥàš éđîţéđ šîñçé îš ŕéšţöŕéđ ƒŕöḿ ţĥé ļàţéšţ đŕàƒţ à þŕöđüçéŕ ŵŕöţé ƒöŕ îţ, ŵĥîçĥ ţĥé ļöĝ ķééþš, šö ţĥé þŕöđüçéŕ šéŕṽéš ţĥàţ đŕàƒţ àñđ ţĥé éđîţ šţàýš ķéþţ. Ŵĥàţ ñö šöüŕçé ŕéþŕöđüçéš šîţš ƃéšîđé work/: ţĥé ŕéđàçţîöñ ṽàüļţ àţ .kapi/vault/, ŵĥîçĥ ĥöļđš ŵîţĥĥéļđ öŕîĝîñàļš ţĥàţ àŕé ñéîţĥéŕ çöḿḿîţţéđ ñöŕ šéñţ ţö à šéŕṽîçé, àñđ à ṽéñüé'š šýñç šţàţé àţ .kapi/sync/. Đéļéţîñĝ ţĥé ṽàüļţ ļöšéš ţĥöšé ṽàļüéš, îñ ķéþţ đŕàƒţš ţöö (Ç-10).

Ţĥé çöñţéẋţ šţöŕé ĥàš à šéþàŕàţé ļîƒéţîḿé îñ ţĥé ŵöŕķšþàçé. Đéļéţîñĝ <DataDir>/workspaces/ ŕéḿöṽéš ţĥé ţéŕḿš, ṽöîçé þŕöƒîļéš, çöñţéñţ ḿéḿöŕý, đéçîšîöñš, ƃļöçķ ĥîšţöŕý àñđ ķéþţ đŕàƒţš öƒ éṽéŕý ļöçàļ þŕöĵéçţ ţĥàţ ñö ƃàçķéñđ ĥöļđš. Þüšĥ éàçĥ þŕöĵéçţ ţö îţš ƃàçķéñđ, öŕ ŵŕîţé îţ ţö à ţŕàñšƒéŕ ƒîļé ŵîţĥ kapi store export, ƃéƒöŕé đéļéţîñĝ ţĥé ŵöŕķšþàçé.

Ļöçàļéš àŕé ķéýéđ çàñöñîçàļļý​

Éṽéŕý šüƃšýšţéḿ ķéýš îţš ŕöŵš ƃý ţĥé çàñöñîçàļ ƂÇÞ-47 ļöçàļé ƃéšîđé ţĥé ţéẋţ: ţĥé çöñţéñţ ḿéḿöŕý'š ṽàŕîàñţš (Ç-09), ţĥé ţéŕḿš šţöŕé'š ţéŕḿš (Ç-08), ţĥé ƃļöçķ çàçĥé'š targets/<locale> öṽéŕļàýš àñđ îţš block_texts ŕöŵš. Ţĥé šţöŕéš àþþļý locale.Normalize öñ éṽéŕý ŵŕîţé, ŕéàđ àñđ ļîšţ, šö à þŕöđüçéŕ ŵŕîţîñĝ targets/nb_NO àñđ à ŕéàđéŕ àšķîñĝ ƒöŕ targets/nb-NO àđđŕéšš öñé öṽéŕļàý. Ŕöŵš à šţöŕé ŵŕöţé ƃéƒöŕé îţ ñöŕḿàļîžéđ ļöçàļéš àŕé ķéýéđ ƃý ŵĥàţéṽéŕ šþéļļîñĝ ţĥé ŕéçîþé üšéđ ţĥéñ, àñđ ñö ļööķüþ ƒîñđš ţĥéḿ àĝàîñ; projectdb.NonCanonicalLocales ŕéþöŕţš ţĥéḿ àçŕöšš ƃöţĥ þööļš ŵîţĥ ţĥé þööļ éàçĥ ŕöŵ îš îñ, àñđ kapi status àñđ kapi up þŕîñţ ţĥé ŕéþöŕţ öñçé ŵîţĥ ţĥé ŕéḿéđý ƒöŕ ţĥàţ þööļ ñàḿéđ.

Ţĥé ţŵö þööļš ţàķé đéŕéñţ ŕéḿéđîéš, ƃéçàüšé à ŕöŵ îñ öñé îš đéŕîṽéđ àñđ à ŕöŵ îñ ţĥé öţĥéŕ îš àüţĥöŕéđ. Ţĥé þŕöĵéçţîöñ îš à ŕéàđîñĝ öƒ ţĥé ŵöŕķîñĝ ţŕéé, šö đéļéţîñĝ ţĥé đàţàƃàšé àñđ ŕüññîñĝ kapi up đéŕîṽéš éṽéŕý ŕöŵ îñ îţ àĝàîñ. Ţĥé çöñţéẋţ šţöŕé îš à þŕöĵéçţîöñ öƒ ţĥé öþéŕàţîöñ ļöĝ, àñđ ţĥé šţöŕéš ñöŕḿàļîžé àš ţĥéý ŵŕîţé, šö kapi store rebuild ŵŕîţéš îţš ŕöŵš àĝàîñ üñđéŕ ţĥé çàñöñîçàļ šþéļļîñĝ.

Þŕéšéñçé îš ţàƃļé-ļéṽéļ​

Àñ éḿþţý šüƃšýšţéḿ îñšîđé àñ éẋîšţîñĝ đàţàƃàšé ƃéĥàṽéš éẋàçţļý àš àñ àƃšéñţ šţöŕé đöéš. À đàţàƃàšé'š éẋîšţéñçé îš ñöţ à šîĝñàļ, šö ñöţĥîñĝ ĥàš ţö ĝüàŕđ àĝàîñšţ à ƒîļé ƃéîñĝ ţĥéŕé: ţĥé ţéŕḿîñöļöĝý ĝàţé éñƒöŕçéš ñöţĥîñĝ öñ à þŕöĵéçţ ŵĥöšé ţéŕḿš ţàƃļéš àŕé éḿþţý (Ç-08), kapi up --plan ñéṽéŕ çŕéàţéš šţàţé, àñđ kapi pack çàŕŕîéš öñļý ñöñ-éḿþţý þàŕţš (Ḿ-06). projectdb.DB.DetectStoreDrift ŕéàđš "šţöŕé ḿîššîñĝ" àš ţĥé ƃļöçķ çàçĥé ĥöļđš ñö ƃļöçķš, ñöţ àš ţĥé ƒîļé îš àƃšéñţ.

Ţĥé ĝŕàþĥ ŕéļàţéš ţĥé šüƃšýšţéḿš​

graph_nodes àñđ graph_edges àŕé à þŕöþéŕţý ĝŕàþĥ: ļàƃéļļéđ ñöđéš àñđ ļàƃéļļéđ, öþţîöñàļļý ţîḿé-ƃöüñđéđ éđĝéš, ƃöţĥ çàŕŕýîñĝ ĴŠÖÑ þŕöþéŕţîéš. core/contextgraph öŵñš ţĥé ṽöçàƃüļàŕý: ţĥé ļàƃéļš, ţĥé šçöþé ţüþļé, ţĥé îđ šçĥéḿé, àñđ ţĥé ñöđé àñđ éđĝé çöñšţŕüçţöŕš éṽéŕý ŵŕîţéŕ çàļļš.

Ñöđé ļàƃéļš:

ĻàƃéļŴĥàţ îţ çöþé
blockà üñîţ öƒ šöüŕçé çöñţéñţ, ķéýéđ ƃý îţš çöñţéñţ ķéýîñšţàñçé
collectionà çöñţéñţ çöļļéçţîöñ, ķéýéđ ƃý îţš ļàƃéļîñšţàñçé
unit_stateţĥé đéçîšîöñ šţàţé öƒ öñé ƃļöçķ îñ öñé đöçüḿéñţ, ƒöŕ öñé éđîţîöñîñšţàñçé
conceptà ţéŕḿîñöļöĝý çöñçéþţṽöçàƃüļàŕý
coordinateà þöîñţ öñ ţĥé šţŕüçţüŕàļ àẋéš, à (profile, channel) þàîŕṽöçàƃüļàŕý

Ţĥé çööŕđîñàţé ñöđé îš ţĥé šţŕüçţüŕàļ þàîŕ öñļý. À çöļļéçţîöñ'š đéçļàŕéđ àẋéš (ƃŕàñđ, ḿöđé, àñđ ŵĥàţéṽéŕ éļšé à ŕéçîþé ñàḿéš üñđéŕ coordinates:) ţŕàṽéļ öñ îţš çöñţéẋţ éñţŕý öṽéŕ ţĥé ŵîŕé àñđ àŕé ƒöļđéđ îñţö ţĥàţ éñţŕý'š ĥàšĥ (Ç-02); ţĥéý àŕé ñöţ þŕöþéŕţîéš öƒ ţĥé çööŕđîñàţé ñöđé, àñđ ţĥé ĝŕàþĥ'š çööŕđîñàţé ǫüéŕîéš ţàķé ţĥé þŕöƒîļé àñđ ţĥé çĥàññéļ.

Éđĝé ļàƃéļš:

ĻàƃéļŔéļàţéšÇàŕŕîéš
uses_termƃļöçķ → çöñçéþţţĥé ţéŕḿ üšéđ, îţš šţàţüš, ţĥé ļöçàļé, ţĥé đöçüḿéñţ, à üšé çöüñţ, àñđ ţĥé ţéŕḿ'š öŵñ ṽàļîđîţý ŵîñđöŵ
in_collectionƃļöçķ → çöļļéçţîöñḿéḿƃéŕšĥîþ
governed_byçöļļéçţîöñ → çööŕđîñàţéţĥé ĝöṽéŕñîñĝ þŕöƒîļé'š ṽàļîđîţý ŵîñđöŵ
blessesüñîţ šţàţé → ƃļöçķţĥé þàîŕîñĝ ţĥé đéçîšîöñ ŵàš ŵŕîţţéñ àĝàîñšţ: ţĥé ţŕàñšļàţîöñ àñđ ţĥé šöüŕçé ƃàšîš, ƃý ŕéṽîšîöñ ŵĥéŕé ţĥé đéçîšîöñ çàŕŕîéš ţĥéḿ àñđ ƃý ĥàšĥ

host.MaterializeContextGraphInDB ŵŕîţéš àļļ ƒöüŕ öñ ţĥé çöñṽéŕĝéñçé þàţĥ, àƒţéŕ éẋţŕàçţîöñ çöḿḿîţš îţš ƃļöçķ-ŵŕîţé ţŕàñšàçţîöñ. Ţĥé šüƃĝŕàþĥ îš à þüŕé þŕöĵéçţîöñ: éàçĥ þàšš çļéàŕš ŵĥàţ îţ îš éñţîţļéđ ţö, ķéýéđ ƃý îţš öŵñ šçöþé ţüþļé, àñđ ŕéƃüîļđš îţ, šö šéṽéŕàļ þŕöĵéçţš' šüƃĝŕàþĥš çöéẋîšţ îñ öñé workspace.db ŵîţĥöüţ à þàšš ŕéàçĥîñĝ àñöţĥéŕ þŕöĵéçţ'š ŕöŵš. Öççüŕŕéñçé éđĝéš çöḿé ƒŕöḿ à ţéŕḿ šéàŕçĥ öṽéŕ ţĥé ƃļöçķ çàçĥé (core/occurrence), ŵĥéŕé ŕéþéàţéđ üšéš öƒ öñé ţéŕḿ îñ öñé ƃļöçķ ƒöļđ îñţö à count þŕöþéŕţý ŕàţĥéŕ ţĥàñ îñţö šéþàŕàţé éđĝéš, àñđ ţĥé ţéŕḿ àñđ ţĥé ļöçàļé àŕé ţĥé éđĝé đîšçŕîḿîñàţöŕš; governed_by çöḿéš ƒŕöḿ ŕéšöļṽîñĝ éàçĥ ñàḿéđ çöļļéçţîöñ'š ĝöṽéŕñàñçé; blesses ĵöîñš ţĥé đéçîšîöñ ļéđĝéŕ àĝàîñšţ ţĥé ƃļöçķ çàçĥé, šö à ŕéçöŕđ ŵĥöšé ƃļöçķ ĥàš ļéƒţ ţĥé çàçĥé ķééþš îţš ñöđé àñđ ļöšéš îţš éđĝé. À üñîţ šţàţé ñàḿéš îţš đöçüḿéñţ ƃý ţĥé đüŕàƃļé ķéý ţĥé ļéđĝéŕ'š ṽîéŵ ŕéçöŕđš (Ç-04); ţĥé ĝŕàþĥ ŵŕîţéŕ ţüŕñš ţĥàţ ķéý ƃàçķ îñţö ţĥé þàţĥ ţĥé ƃļöçķ çàçĥé ƒîļéš ƃļöçķš üñđéŕ ƃéƒöŕé ĵöîñîñĝ.

Ţĥé ţéŕḿ îš à đîšçŕîḿîñàţöŕ ƃéçàüšé à çöñçéþţ ĥöļđš šéṽéŕàļ šþéļļîñĝš àñđ à þŕöĵéçţ ŕéàçĥéš ƒöŕ öñé öƒ ţĥéḿ: à ƃļöçķ šţîļļ šàýîñĝ ţĥé đéþŕéçàţéđ ŵöŕđ îš à đéŕéñţ ƒîñđîñĝ ƒŕöḿ öñé šàýîñĝ ţĥé þŕéƒéŕŕéđ ŵöŕđ, àñđ ƒöļđîñĝ ƃöţĥ öñţö öñé éđĝé ŵöüļđ ļéàṽé ţĥé ĝŕàþĥ ŵîţĥ à šţàţüš ţö çĥööšé ƃéţŵééñ. Šö ţĥé éđĝé ŕéçöŕđš ţĥé šţàţüš öƒ ţĥé ţéŕḿ îţ ñàḿéš, àñđ çàŕŕîéš ţĥàţ ţéŕḿ'š öŵñ ŵîñđöŵ, ŵĥîçĥ îš ŵĥàţ ḿàķéš îš ţĥîš đîšçöüŕàĝéđ àñšŵéŕàƃļé àš îš îţ đîšçöüŕàĝéđ ĥéŕé. Ţĥé šţàñđîñĝ îš à þŕöþéŕţý öƒ ţĥé çöñçéþţ àţ à çööŕđîñàţé, ñéṽéŕ öƒ ţĥé ŵöŕđ: ţĥé šàḿé ƃļöçķ àñšŵéŕš đéŕéñţļý ƃéƒöŕé àñđ àƒţéŕ à đéþŕéçàţîöñ đàţé, àñđ îñšîđé ţĥé ḿàŕķéţ à đéþŕéçàţîöñ ŕéàçĥéš ṽéŕšüš öüţšîđé îţ.

Ţĥé governed_by éđĝé îš ŵĥéŕé ĝöṽéŕñàñçé šţöþš ƃéîñĝ ŕé-đéŕîṽéđ. Îţ çàŕŕîéš ţĥé šàḿé ĥàļƒ-öþéñ ṽàļîđîţý ŵîñđöŵ ţĥé ŕéçîþé đéçļàŕéš (Ç-02), šö ŵĥàţ ĝöṽéŕñéđ ĥéŕé öñ ţĥàţ đàţé îš àñšŵéŕéđ ƃý ţĥé ĝŕàþĥ üñđéŕ ţĥé šàḿé ţéḿþöŕàļ ḿöđéļ, ñöţ ƃý à šéçöñđ îḿþļéḿéñţàţîöñ öƒ ţĥé ļàđđéŕ.

Ñöđé îđéñţîţý çàŕŕîéš ţĥé šçöþé ţüþļé​

Àñ îđ îš <label>:<workspace>/<project>/<stream>:<local>, ŵîţĥ ţĥé šéþàŕàţöŕš þéŕçéñţ-éšçàþéđ îñšîđé éàçĥ çöḿþöñéñţ šö ţŵö đéŕéñţ ţüþļéš çàñ ñéṽéŕ ŕéñđéŕ ţö öñé îđ. Ţĥé šçöþé šéĝḿéñţ îš àļŵàýš ţĥŕéé ƒîéļđš, šö îţ šàýš ŵĥîçĥ đîḿéñšîöñš ţĥé ñöđé îš ǫüàļîƒîéđ ƃý ŕàţĥéŕ ţĥàñ ļéàṽîñĝ ţĥàţ ţö ƃé îñƒéŕŕéđ ƒŕöḿ ţĥé ļàƃéļ.

Ţŵö ķîñđš öƒ ñöđé, àñđ ţĥé šþļîţ đéçîđéš ŵĥàţ çàñ ƃé àšķéđ:

  • Ṽöçàƃüļàŕý ñöđéš (çöñçéþţš, çööŕđîñàţéš) đŕöþ ţĥé îñšţàñçé đîḿéñšîöñš. Öñé çöñçéþţ îš öñé ñöđé ĥöŵéṽéŕ ḿàñý þŕöĵéçţš üšé îţ, ŵĥîçĥ îš ŵĥàţ ḿàķéš ŵĥîçĥ þŕöĵéçţš üšé ţĥîš çöñçéþţ à ţŵö-ĥöþ ţŕàṽéŕšàļ îñšţéàđ öƒ à ĵöîñ àçŕöšš þŕöĵéçţ ƃöüñđàŕîéš. À çööŕđîñàţé îš ṽöçàƃüļàŕý ƒöŕ ţĥé šàḿé ŕéàšöñ: à šéţ öƒ þŕöĵéçţš ƃîñđš ţö öñé çööŕđîñàţé ṽöçàƃüļàŕý ŕàţĥéŕ ţĥàñ éàçĥ îñṽéñţîñĝ îţš öŵñ.
  • Îñšţàñçé ñöđéš (ƃļöçķš, çöļļéçţîöñš, üñîţ šţàţéš) çàŕŕý (project, stream). Ţŵö þŕöĵéçţš' docs çöļļéçţîöñš àŕé ţŵö ñöđéš. Ţŵö þŕöĵéçţš ĥöļđîñĝ îđéñţîçàļ ŵöŕđîñĝ ĥöļđ ţŵö ƃļöçķ ñöđéš çàŕŕýîñĝ ţĥé šàḿé çöñţéñţ ķéý, àñđ šàḿé ŵöŕđîñĝ îš à çöñţéñţ-ķéý éǫüàļîţý ǫüéŕý: öñé šĥàŕéđ ñöđé ŵöüļđ šàý ţĥé ţŵö îñšţàñçéš àŕé ĝöṽéŕñéđ ţöĝéţĥéŕ, àñđ àñ îñšţàñçé šîţš šöḿéŵĥéŕé.

Ţĥîš îš ŵĥàţ ļéţš öñé workspace.db ĥöļđ éṽéŕý þŕöĵéçţ'š šüƃĝŕàþĥ: ţĥé þŕöĵéçţ đîḿéñšîöñ îš îñ ţĥé îđ, šö ţĥé þàšš ţĥàţ ŕéƃüîļđš öñé þŕöĵéçţ'š ŕöŵš ñàḿéš ţĥéḿ àñđ ŕéàçĥéš ñöţĥîñĝ éļšé.

Đîḿéñšîöñš àŕé ƒîéļđš, ñöţ çöñţàîñḿéñţ éđĝéš. Éṽéŕý ñöđé çàŕŕîéš ţĥé ñöñ-éḿþţý çöḿþöñéñţš öƒ îţš šçöþé ţüþļé àš þŕöþéŕţîéš àš ŵéļļ àš îñ îţš îđ, šö šļîçîñĝ à ṽîéŵ ƃý þŕöĵéçţ öŕ šţŕéàḿ îš à ƒîļţéŕ ŕàţĥéŕ ţĥàñ à ţŕàṽéŕšàļ. Àñ éḿþţý đîḿéñšîöñ îš ŵŕîţţéñ àš àñ àƃšéñţ ķéý ŕàţĥéŕ ţĥàñ àñ éḿþţý šţŕîñĝ, ƃéçàüšé à þŕöþéŕţý ƒîļţéŕ çöḿþàŕéš àĝàîñšţ à ṽàļüé àñđ àƃšéñçé îš ñöţ ţĥé éḿþţý šţŕîñĝ. Ļöçàļļý ţĥé ŵöŕķšþàçé đîḿéñšîöñ îš àƃšéñţ, ŵĥîçĥ îš çöŕŕéçţ: ţĥé îḿþļîçîţ ŵöŕķšþàçé îš ţĥîš ḿàçĥîñé àççöüñţ'š àñđ ĥàš ñö ñàḿé ţö çàŕŕý. Ţĥéŕé îš ñö þŕöĵéçţ→þŕöĵéçţ éđĝé àñđ ţĥéŕé ŵîļļ ñöţ ƃé öñé: þŕöĵéçţš ŕéļàţé ƃý çö-öççüŕŕéñçé ţĥŕöüĝĥ ţĥé ṽöçàƃüļàŕý ţĥéý šĥàŕé.

Ŵîţĥîñ à šçöþé, îđéñţîţý îš đüŕàƃļé: à ƃļöçķ îš îţš çöñţéñţ ķéý (Ƒ-03), àñđ à üñîţ šţàţé îš îţš đöçüḿéñţ, ƃļöçķ àñđ éđîţîöñ (ţĥé ļéđĝéŕ'š üñîţ àñđ ṽàŕîàñţ), ñöţ à ŕéàđéŕ'š þöšîţîöñàļ îđ, šö à ŕé-þàŕšé ţĥàţ ŕéñüḿƃéŕš à đöçüḿéñţ ŕéŵŕîţéš ţĥé šàḿé ŕöŵš ŕàţĥéŕ ţĥàñ öŕþĥàñîñĝ ţĥéḿ. Ţĥé đöçüḿéñţ îš þàŕţ öƒ à üñîţ šţàţé'š îđéñţîţý ƒöŕ ţĥé ŕéàšöñ Ç-04 ĝîṽéš: à ƃļöçķ îđ îš üñîǫüé îñšîđé îţš đöçüḿéñţ àñđ ñöŵĥéŕé ŵîđéŕ, šö ŵîţĥöüţ îţ ţŵö þàĝéš öƒ öñé çöļļéçţîöñ àŕé öñé ñöđé àñđ ţĥé đéçîšîöñ ŵŕîţţéñ ļàšţ àñšŵéŕš ƒöŕ ƃöţĥ.

Çĥàñĝîñĝ à šçöþé ṽàļüé çĥàñĝéš ţĥé îđ, šö à ŕéñàḿé îš à đéţéŕḿîñîšţîç ŕé-ķéý. Ţĥàţ îš šàƒé ƃéçàüšé à ŵŕîţéŕ çļéàŕš ţĥé šçöþé îţ îš àƃöüţ ţö ŵŕîţé îñ ţĥé šàḿé þàšš: ñö ŕöŵ šüŕṽîṽéš üñđéŕ ţĥé öļđ ķéý. Ŵĥéŕé ţĥé þŕöĵéçţ đîḿéñšîöñ îš ţĥé ŕéçîþé'š id:, à ŕéñàḿé đöéš ñöţ ţöüçĥ îţ àñđ ţĥé đîšþļàý ñàḿé ŕîđéš àš ţĥé project_name þŕöþéŕţý.

Ƒîñđîñĝ à ţéŕḿ îñšîđé ƃļöçķš​

Ţéŕḿ öççüŕŕéñçé ĥàš ţö šéàŕçĥ ţéẋţ ţĥàţ ļîṽéš îñšîđé à ĴŠÖÑ þàýļöàđ ñö ŠǪĻ çàñ ŕéàđ, šö ţĥé ƃļöçķ çàçĥé ķééþš block_texts: à ŕöŵ þéŕ ƃļöçķ þéŕ ļöçàļé (ţĥé šöüŕçé üñđéŕ ţĥé éḿþţý ļöçàļé, éàçĥ ţàŕĝéţ üñđéŕ îţš öŵñ) ŵîţĥ à çöñţéñţļéšš ƑŢŠ5 ţŕîĝŕàḿ îñđéẋ öṽéŕ îţ. Ƃöţĥ ļîṽé îñ ţĥé þŕöĵéçţîöñ, ƃéšîđé ţĥé ƃļöçķš ţĥéý đéšçŕîƃé.

Ţĥé îñđéẋ îš ƃüîļţ ƃéƒöŕé à šéàŕçĥ, ñöţ đüŕîñĝ à ŵŕîţé. Ḿàîñţàîñîñĝ îţ îñšîđé éṽéŕý ƃļöçķ ŵŕîţé çöšţš ŕöüĝĥļý šéṽéñ ţîḿéš ţĥé ŵŕîţé: éẋţŕàçţîöñ ŵŕîţéš éṽéŕý ƃļöçķ îñ ţĥé þŕöĵéçţ, ŵĥîçĥ îš ţöö ḿüçĥ ţö ļéṽý ƒöŕ à ǫüéŕý ţĥàţ ḿàý ñéṽéŕ ƃé àšķéđ. À ŵŕîţé öñļý ḿàŕķš ţĥé ƃļöçķ šţàļé, àñđ ţĥé ƒîŕšţ šéàŕçĥ ŕéçöñçîļéš éẋàçţļý ŵĥàţ çĥàñĝéđ. Ţĥé îñđéẋ šéļéçţš çàñđîđàţé ḿàţçĥéš; Ĝö çöđé ṽéŕîƒîéš ţĥéḿ. Ţĥé ƃŕöŵšéŕ ƃüîļđ üšéš ţĥé šàḿé ḿàţçĥéŕ ŵîţĥ à šçàñ îñšţéàđ öƒ àñ îñđéẋ.

kapi terms occurrences îš ţĥé šüŕƒàçé ţĥàţ ļîšţš üšéš ļîṽé ƒŕöḿ ţĥîš îñđéẋ, ŵîţĥ ţĥéîŕ þöšîţîöñš. Ţĥé üšàĝé çöüñţ îš à đéŕéñţ ŕéàđîñĝ: kapi context search, ţĥé context_search ţööļ, ţĥé đéšķţöþ éẋþļöŕéŕ'š šéàŕçĥ àñđ ŕéļàţîöñš þàñéš àñđ ţĥé þļàţƒöŕḿ'š çöñçéþţ þàĝé àļļ ŕéþöŕţ ĥöŵ öƒţéñ à ţéŕḿ îš üšéđ, àñđ àļļ öƒ ţĥéḿ ŕéàđ îţ ƒŕöḿ ţĥé uses_term éđĝéš ţĥŕöüĝĥ contextgraph.UsesByProject ŕàţĥéŕ ţĥàñ ĵöîñîñĝ ţĥé ţéŕḿš šţöŕé àĝàîñšţ ţĥé ƃļöçķ çàçĥé ŵĥéñ àšķéđ. Öñé þŕöđüçéŕ ḿéàñš öñé ñüḿƃéŕ ŵĥéŕéṽéŕ ţĥé ǫüéšţîöñ îš àšķéđ, àñđ ƃéçàüšé ţĥàţ þŕöđüçéŕ îš éẋţŕàçţîöñ, ţĥé ñüḿƃéŕ îš àš öƒ ţĥé ļàšţ éẋţŕàçţîöñ ŕàţĥéŕ ţĥàñ öƒ ţĥé ŵöŕķîñĝ ţŕéé. Éàçĥ šüŕƒàçé šàýš šö ƃéšîđé ţĥé çöüñţ. Ţĥé þàššàĝé à üšé šîţš îñ îš ŕéàđ ƒŕöḿ ţĥé ƃļöçķ çàçĥé ƃý ţĥé çöñţéñţ ķéý ţĥé éđĝé ñàḿéš, šö à ƃļöçķ ḿîššîñĝ ƒŕöḿ ţĥé çàçĥé çöšţš ţĥé šñîþþéţ àñđ ñéṽéŕ ţĥé çöüñţ.

Ţĥé ǫüéŕý šĥàþéš àŕé ŵŕîţţéñ öñçé​

À šţöŕé šþàññîñĝ ḿàñý þŕöĵéçţš àñšŵéŕš ţĥé šàḿé ǫüéšţîöñš ŵîţĥ ţĥé đîḿéñšîöñš ƒŕéé; à ļöçàļ þŕöĵéçţ àñšŵéŕš ţĥéḿ ŵîţĥ ţĥé đîḿéñšîöñš þîññéđ ţö öñé ṽàļüé. Çöđé éñƒöŕçéš îţ. Ţĥé ǫüéŕîéš ļîṽé îñ core/contextgraph/query.go àĝàîñšţ ţŵö ñàŕŕöŵ ŕéàđ îñţéŕƒàçéš, EdgeReader àñđ NodeFinder, ţĥàţ ƃöţĥ ƃàçķîñĝ šţöŕéš šàţý, šö ţĥéŕé îš öñé îḿþļéḿéñţàţîöñ:

ǪüéŕýǪüéšţîöñ
Usesţéŕḿ → ƃļöçķš → çöļļéçţîöñ, ƃý ţŕàṽéŕšàļ
ProjectsUsingConceptŵĥîçĥ þŕöĵéçţš üšé ţĥîš çöñçéþţ
UsesByProjectĥöŵ ḿüçĥ öƒ îţ šîţš îñ éàçĥ, îñ ŵĥîçĥ ŵöŕđš, àñđ ĥöŵ îţ šţàñđš ţĥéŕé àţ ţĥîš þöîñţ
CollectionsAtCoordinateŵĥàţ îš ĝöṽéŕñéđ àţ ţĥîš þöîñţ, àţ ţĥîš îñšţàñţ
BlessingsOfBlockŵĥîçĥ đéçîšîöñ çöṽéŕš ţĥîš ƃļöçķ, àţ ŵĥîçĥ ƃàšîš
BlocksWithContentKeyŵĥö éļšé ĥöļđš ţĥîš šàḿé ŵöŕđîñĝ

core/contextgraph/graphtest îš ţĥé šĥàŕéđ ǫüéŕý-šĥàþé šüîţé: öñé ƒîẋţüŕé öƒ ţŵö þŕöĵéçţš šĥàŕîñĝ à çöñçéþţ, öñé ţàƃļé öƒ éẋþéçţéđ àñšŵéŕš, ŕüñ àĝàîñšţ éṽéŕý šţöŕé ţĥàţ çļàîḿš ţö ĥöļđ ţĥîš ṽöçàƃüļàŕý. À ǫüéŕý àđđéđ ƒöŕ à ŵîđéŕ šçöþé îš éẋþŕéššîƃļé àţ à ñàŕŕöŵéŕ öñé, àñđ à ļöçàļ ǫüéŕý đöéš ñöţ ĥàṽé ţö ƃé ŕéîñṽéñţéđ ŵĥéñ ţĥé šçöþé ŵîđéñš.

Šçöþé ƒîļţéŕîñĝ îš öñé þŕéđîçàţé, Scope.Contains, ţŕéàţîñĝ àñ éḿþţý đîḿéñšîöñ àš àñý, ŵĥîçĥ îš ĥöŵ ţĥé šàḿé çàļļ šéŕṽéš ƃöţĥ à þŕöĵéçţ-šçöþéđ šüŕƒàçé àñđ à ŕöļļüþ àçŕöšš þŕöĵéçţš.

Ƃŕöŵšéŕ àñđ ŵàšḿ​

Ţĥé ƃŕöŵšéŕ ƃüîļđ ŕüñš ţĥé šàḿé šţöŕéš. core/storage ĥàš à đŕîṽéŕ ƒöŕ éṽéŕý ƃüîļđ, àñđ ţĥé ƃŕöŵšéŕ'š (core/storage/driver_js.go) ŕüñš ţĥé ŠǪĻ öñ ţĥé öƒƒîçîàļ ŠǪĻîţé ŴéƃÀššéḿƃļý ƃüîļđ, ŕéàçĥéđ ţĥŕöüĝĥ à ƃŕîđĝé ţĥé þàĝé îñšţàļļš ƃéƒöŕé ţĥé éñĝîñé šţàŕţš. Ţĥé ŵöŕķšþàçé, îţš öþéŕàţîöñ ļöĝ, ţĥé þŕöĵéçţöŕ, ţĥé çöñţéñţ ḿéḿöŕý, ţĥé ţéŕḿš šţöŕé, ţĥé ṽöîçé šţöŕé, ţĥé đéçîšîöñ ļéđĝéŕ, ţĥé çöñţéẋţ ĝŕàþĥ àñđ ţĥé ƃļöçķ çàçĥé àŕé ţĥé ñàţîṽé çöđé ţĥéŕé, à ļàƃ'š ŵŕîţéš àŕé öþéŕàţîöñš îñ ţĥé ļöĝ, àñđ ţĥé þŕöĵéçţöŕ îš ţĥéîŕ öñé ŵŕîţéŕ. Ţĥé ŵöŕķšþàçé šîţš üñđéŕ ţĥé éñĝîñé'š đàţà ŕööţ, /.kapi-data.

Ţĥé đŕîṽéŕ đéçļàŕéš ŵĥàţ îţ ĝîṽéš à šţöŕé îñ à þŕöƒîļé (storage.DriverProfile): öñé çöññéçţîöñ þéŕ ƒîļé, ñö ŴÀĻ àñđ ñö ļöçķ àñöţĥéŕ þŕöçéšš ĥöñöüŕš. Ţĥé éñĝîñé ŕüñš îñ à đéđîçàţéđ Ŵöŕķéŕ, ŵĥéŕé ţĥé đàţàƃàšéš àñđ ţĥé éñĝîñé'š ƒîļéš ļîṽé îñ ţĥé öŕîĝîñ þŕîṽàţé ƒîļé šýšţéḿ (ŠǪĻîţé'š opfs-sahpool ṼƑŠ) àñđ šüŕṽîṽé à ŕéļöàđ; öñé ţàƃ ĥöļđš ţĥéḿ, àñđ à þàĝé ţĥàţ çàññöţ (àñöţĥéŕ ţàƃ ĥöļđš ţĥéḿ, öŕ ţĥé ƃŕöŵšéŕ ļàçķš ţĥé ÀÞÎ) ķééþš ţĥéḿ îñ ḿéḿöŕý, àñđ ţĥé þŕöƒîļé ŕéþöŕţš đüŕàƃîļîţý àççöŕđîñĝļý. À ţàƃ ţàķéš ţĥé ŵöŕķšþàçé öṽéŕ ƃý šţéàļîñĝ ţĥé Ŵéƃ Ļöçķ ţĥàţ ñàḿéš îţš öŵñéŕ; ţĥé öŵñéŕ'š Ŵöŕķéŕ ļéàŕñš öƒ îţ ŵĥéñ îţš ļöçķ ŕéǫüéšţ îš ŕéĵéçţéđ, àñđ îţš þàĝé çàŕŕîéš öñ îñ ḿéḿöŕý. Ţĥé ƃŕöŵšéŕ çöþý îš à çàçĥé öƒ ţĥé ļöĝ, šö à þàĝé éẋþöŕţš ţĥé ŵöŕķšþàçé àš à .kpz àñđ îḿþöŕţš îţ ƃàçķ, à ţéŕḿš šţöŕé öüţšîđé éṽéŕý þŕöĵéçţ ţŕàṽéļļîñĝ àš à ţéŕḿš ƃüñđļé, àñđ šýñçš à þŕöĵéçţ'š çöñţéẋţ ţĥŕöüĝĥ à ƒöļđéŕ îţ ŵàš ĝîṽéñ, à workspace.Remote ŵîţĥ ţĥé ļàýöüţ FileRemote ķééþš. Àñ öþéŕàţîöñ ĥéļđ öñļý ƃéƒöŕé îţš þŕöĵéçţ'š ŕéḿöṽàļ ƒŕöḿ ţĥé ŵöŕķšþàçé çöüñţš àš ñöţ ĥéļđ, ŵĥîçĥ ļéţš à þŕöĵéçţ ƒöŕĝöţţéñ ƃý à ŕéšéţ ţàķé îţš ļöĝ ƃàçķ ƒŕöḿ à þàçķàĝé öŕ à ŕéḿöţé. Ţŵö ŕüļéš ƒöļļöŵ ƒöŕ éṽéŕý šţöŕé, ñàţîṽéļý ţöö. Ñö çöŕŕéçţñéšš ŕüļé đéþéñđš öñ à ŕéàđéŕ ŕüññîñĝ ƃéšîđé à ŵŕîţéŕ, àñđ ñö çöđé ĥöļđš à ţŕàñšàçţîöñ öŕ öþéñ ŕöŵš öñ à þööļ àñđ ţĥéñ ŵàîţš ƒöŕ à šéçöñđ šéššîöñ öñ ţĥé šàḿé þööļ; make test-stores-oneconn ŕüñš ţĥé šţöŕé šüîţéš ñàţîṽéļý ŵîţĥ éṽéŕý þööļ ĥéļđ ţö öñé çöññéçţîöñ àñđ ŴÀĻ öƒƒ ţö ķééþ îţ šö. À đàţàƃàšé ƒîļé ƃéļöñĝš ţö îţš đŕîṽéŕ, šö çöđé àšķš storage.Exists, storage.Remove, storage.Rename àñđ storage.List àƃöüţ öñé ŕàţĥéŕ ţĥàñ ţĥé ƒîļé šýšţéḿ. À ŠǪĻîţé ƒîļé ţĥé þàĝé'š ƒîļé šýšţéḿ ĥöļđš îš ŕéàđ îñţö ḿéḿöŕý ţĥé ƒîŕšţ ţîḿé à šţöŕé öþéñš îţš þàţĥ. ƑŢŠ5 ŵöŕđ šéàŕçĥ üšéš unicode61 ţĥéŕé, ţĥé ḿöđüļé ĥàṽîñĝ ñö ÎÇÜ ţöķéñîžéŕ. make test-wasm-stores ŕüñš ţĥé šţöŕé šüîţéš üñđéŕ GOOS=js öṽéŕ ţĥé šàḿé đŕîṽéŕ. Ţĥé ŴÀŠḾ Éñĝîñé ÀƂÎ ñöţé ĥàš ţĥé ḿéçĥàñîçš.

Ŵĥéŕé ţĥé ŵöŕķšþàçé ļîṽéš​

Ţĥé đàţà ŕööţ îš host.DataDir(), ŕéšöļṽéđ îñ öŕđéŕ:

$KAPI_DATA_DIR the whole path, used as given
$XDG_DATA_HOME/kapi on every platform, when the variable is set
macOS ~/Library/Application Support/kapi
Linux and the rest ~/.local/share/kapi
Windows %LocalAppData%\kapi

Îñšîđé à go test ƃîñàŕý ţĥé ŕéšöļüţîöñ îš đéŕéñţ: üñļéšš $KAPI_DATA_DIR ñàḿéš à ŕööţ öüţŕîĝĥţ, ţĥé àñšŵéŕ îš à đîŕéçţöŕý öƒ ţĥàţ þŕöçéšš'š öŵñ üñđéŕ ţĥé šýšţéḿ ţéḿþöŕàŕý đîŕéçţöŕý. À ţéšţ ţĥàţ öþéñéđ à þŕöĵéçţ ŵöüļđ öţĥéŕŵîšé ŵŕîţé îñţö ţĥé đéṽéļöþéŕ'š öŵñ çöñţéẋţ àñđ ŕéàđ îţ ƃàçķ öñ ţĥé ñéẋţ ŕüñ. Ţĥé ƒîŕšţ ŕéšöļüţîöñ îñ à ţéšţ ƃîñàŕý ŕéḿöṽéš ţĥé ŕööţš öƒ ţéšţ ƃîñàŕîéš ţĥàţ àŕé ñö ļöñĝéŕ ŕüññîñĝ. À ŕööţ îš ñàḿéđ ƃý îţš þŕöçéšš îđ, àñđ öñ ḿàçÖŠ, ŵĥéŕé îđš ŵŕàþ àţ 99999, à ŕööţ ļàšţ ŵŕîţţéñ ƃéƒöŕé ţĥé þŕöçéšš ñöŵ ĥöļđîñĝ îţš îđ šţàŕţéđ îš ŕéḿöṽéđ àš ŵéļļ. À þàçķàĝé ŵĥöšé TestMain ŕüñš ţĥŕöüĝĥ devenvtest.Main(m, host.RemoveTestDataDir) ŕéḿöṽéš îţš öŵñ ŕööţ ŵĥéñ îţš ţéšţš ƒîñîšĥ, šö ţéšţ ŕüñš đö ñöţ àççüḿüļàţé ţĥéḿ. À ŕéļéàšéđ ƃîñàŕý îš ñöţ à ţéšţ ƃîñàŕý, ŵĥîçĥ îš ŵĥý éṽéŕý îñ-ŕéþö šüŕƒàçé ţĥàţ ļàüñçĥéš öñé šéţš $KAPI_DATA_DIR àš þàŕţ öƒ ţĥé îšöļàţîöñ çöñţŕàçţ.

Çöñšéǫüéñçéš​

  • Çļöñéš šĥàŕé þŕöĵéçţ çöñţéẋţ. À šéçöñđ çļöñé öƒ à þŕöĵéçţ ŵîţĥ àñ id: öþéñš ŵîţĥ îţš ţéŕḿš, îţš ṽöîçé þŕöƒîļéš, îţš çöñţéñţ ḿéḿöŕý àñđ îţš đéçîšîöñš àļŕéàđý îñ ƒöŕçé, àñđ ŕé-éẋţŕàçţš îţš öŵñ þŕöĵéçţîöñ.
  • Ŵöŕķţŕééš šĥàŕé ţĥé đéçîšîöñ ļéđĝéŕ. Đéçîšîöñš ŕéçöŕđéđ îñ öñé àŕé îñ ƒöŕçé îñ ţĥé öţĥéŕ, àñđ šŵîţçĥîñĝ ƃŕàñçĥéš ḿöṽéš ñö àüţĥöŕéđ çöñţéẋţ.
  • Çŕöšš-šüƃšýšţéḿ ǫüéšţîöñš àŕé öñé ǫüéŕý ŵîţĥîñ à þööļ, àñđ öñé ĵöîñ àçŕöšš ţĥéḿ. Ţéŕḿ çöṽéŕàĝé þéŕ çöļļéçţîöñ, ţĥé ƃļöçķš ƃéĥîñđ à çööŕđîñàţé, ţĥé ƃļöçķš à ţéŕḿ çĥàñĝé þüţš àţ ŕîšķ.
  • Öñé ţŕàñšàçţîöñ šţîļļ çöṽéŕš à đéçîšîöñ àñđ ţĥé ŵöŕđîñĝ îţ àþþŕöṽéš. Ƃöţĥ àŕé îñ ţĥé çöñţéẋţ þööļ, ŵĥîçĥ îš ŵĥý ţĥéý àŕé îñ ţĥé šàḿé ƒîļé.
  • Šţöŕé þàţĥš àŕé ñöţ à üšéŕ šüŕƒàçé. Ţĥé ŕéçîþé ƃîñđš ŵĥàţ ĝöṽéŕñš à þöîñţ ƃý ñàḿé àñđ ñàḿéš ñö đàţàƃàšé öŕ çöñţéẋţ ƒîļé, àñđ îţ çàŕŕîéš ñö ŵöŕķšþàçé ƃîñđîñĝ. Šţàñđàļöñé šţöŕéš öüţšîđé à þŕöĵéçţ ķééþ ţĥéîŕ öŵñ šéļéçţöŕš (--termstore, --memory); ţĥöšé àđđŕéšš à ƒîļé ţĥé üšéŕ öŵñš, ŵĥîçĥ îš à đéŕéñţ ţĥîñĝ.
  • ÇÎ çàçĥéš .kapi/work/cache/docs, àñđ ñöţĥîñĝ éļšé üñđéŕ work/. Ţĥé þàŕšé çàçĥé îš ķéýéđ ƃý çöñţéñţ, çöñƒîĝüŕàţîöñ àñđ ƃüîļđ, šö à ŕéšţöŕéđ éñţŕý çĥàñĝéš ñö ŕéšüļţ, àñđ setup-kapi çàŕŕîéš îţ ƃý đéƒàüļţ. Ţĥé ŕéḿàîñîñĝ éñţŕîéš üñđéŕ cache/ ƃéļöñĝ ţö ţĥé çĥéçķöüţ ţĥàţ ŵŕöţé ţĥéḿ (Çöñṽéŕĝéñçé îñ ÇÎ).
  • À ḿàçĥîñé'š çöñţéẋţ îš öñé đîŕéçţöŕý. Ƃàçķîñĝ üþ <DataDir>/workspaces/default/ ƃàçķš üþ éṽéŕý þŕöĵéçţ'š àüţĥöŕéđ çöñţéẋţ, àñđ kapi store export ŵŕîţéš öñé þŕöĵéçţ'š àš öñé ƒîļé. Đéļéţîñĝ îţ çöšţš éṽéŕý þŕöĵéçţ'š ţéŕḿš, ṽöîçé þŕöƒîļéš, çöñţéñţ ḿéḿöŕý, đéçîšîöñš àñđ ƃļöçķ ĥîšţöŕý.

Šéé àļšö​