[{"data":1,"prerenderedAt":5115},["ShallowReactive",2],{"fougere:post.list:{}":3,"docs:\u002Fdocs\u002Fconcepts\u002Ffact":6,"docs-uses":918,"docs-nav":1089,"demo:emit-split":1227},{"items":4,"hasMore":5},[],false,{"id":7,"title":8,"body":9,"description":909,"extension":910,"forms":911,"kind":912,"meta":913,"navigation":188,"path":914,"seo":915,"stem":916,"step":221,"uses":911,"__hash__":917},"docs\u002Fdocs\u002F1.concepts\u002F6.fact.md","Fact",{"type":10,"value":11,"toc":900},"minimark",[12,32,37,40,150,312,359,377,381,384,387,442,446,449,507,514,517,679,726,742,749,753,770,776,780,791,798,802,813,821,824,830,841,889,896],[13,14,15,16,20,21,26,27,31],"p",{},"A fact says that something happened. Every other call names one recipient — an address in\n",[17,18,19],"code",{},"fronds:",", a ",[22,23,25],"a",{"href":24},"\u002Fdocs\u002Fconcepts\u002Ffacade","facade",". A fact names a ",[28,29,30],"strong",{},"subject"," instead: whoever accepts\nit receives it, and the one who announces it names nobody.",[33,34,36],"h2",{"id":35},"announce-and-accept","Announce, and accept",[13,38,39],{},"A fact is an entity, usually cut from the one it is about:",[41,42,47],"pre",{"className":43,"code":44,"language":45,"meta":46,"style":46},"language-ts shiki shiki-themes material-theme-lighter fougere-pastel material-theme-palenight","\u002F\u002F fronds\u002Fblog\u002Fentities\u002FPostPublished.ts\nexport default class PostPublished extends Post.pick('id', 'title').extend({ at: created() }) {}\n","ts","",[17,48,49,58],{"__ignoreMap":46},[50,51,54],"span",{"class":52,"line":53},"line",1,[50,55,57],{"class":56},"skXKP","\u002F\u002F fronds\u002Fblog\u002Fentities\u002FPostPublished.ts\n",[50,59,61,65,68,72,76,79,83,87,91,95,99,103,105,108,111,114,116,119,121,124,126,129,133,136,139,142,145,147],{"class":52,"line":60},2,[50,62,64],{"class":63},"sK6XW","export",[50,66,67],{"class":63}," default",[50,69,71],{"class":70},"s76I7"," class",[50,73,75],{"class":74},"sBZYL"," PostPublished",[50,77,78],{"class":70}," extends",[50,80,82],{"class":81},"sPEhv"," Post",[50,84,86],{"class":85},"s15xx",".",[50,88,90],{"class":89},"s4mR9","pick",[50,92,94],{"class":93},"srlTG","(",[50,96,98],{"class":97},"sDDC1","'",[50,100,102],{"class":101},"sN-8n","id",[50,104,98],{"class":97},[50,106,107],{"class":85},",",[50,109,110],{"class":97}," '",[50,112,113],{"class":101},"title",[50,115,98],{"class":97},[50,117,118],{"class":93},")",[50,120,86],{"class":85},[50,122,123],{"class":89},"extend",[50,125,94],{"class":93},[50,127,128],{"class":85},"{",[50,130,132],{"class":131},"sHtqg"," at",[50,134,135],{"class":85},":",[50,137,138],{"class":89}," created",[50,140,141],{"class":93},"()",[50,143,144],{"class":85}," }",[50,146,118],{"class":93},[50,148,149],{"class":85}," {}\n",[41,151,153],{"className":43,"code":152,"language":45,"meta":46,"style":46},"\u002F\u002F fronds\u002Fblog\u002Fhandlers\u002FPostHandler.ts — announces\nconstructor(private published: Emit\u003CPostPublished>) {}\n\nasync publish(id: Post['id']) {\n  const post = await this.findById(id);\n  await this.published({ id: post!.id, title: post!.title });   \u002F\u002F `at` is stamped for you\n}\n",[17,154,155,160,183,190,219,253,306],{"__ignoreMap":46},[50,156,157],{"class":52,"line":53},[50,158,159],{"class":56},"\u002F\u002F fronds\u002Fblog\u002Fhandlers\u002FPostHandler.ts — announces\n",[50,161,162,165,167,170,173,176,179,181],{"class":52,"line":60},[50,163,164],{"class":89},"constructor",[50,166,94],{"class":93},[50,168,169],{"class":81},"private published: Emit",[50,171,172],{"class":85},"\u003C",[50,174,175],{"class":81},"PostPublished",[50,177,178],{"class":85},">",[50,180,118],{"class":93},[50,182,149],{"class":85},[50,184,186],{"class":52,"line":185},3,[50,187,189],{"emptyLinePlaceholder":188},true,"\n",[50,191,193,196,199,201,204,207,209,211,213,216],{"class":52,"line":192},4,[50,194,195],{"class":81},"async ",[50,197,198],{"class":89},"publish",[50,200,94],{"class":93},[50,202,203],{"class":81},"id: Post",[50,205,206],{"class":93},"[",[50,208,98],{"class":97},[50,210,102],{"class":101},[50,212,98],{"class":97},[50,214,215],{"class":93},"])",[50,217,218],{"class":85}," {\n",[50,220,222,225,228,231,234,238,240,243,246,248,250],{"class":52,"line":221},5,[50,223,224],{"class":70},"  const",[50,226,227],{"class":81}," post",[50,229,230],{"class":85}," =",[50,232,233],{"class":63}," await",[50,235,237],{"class":236},"sxG60"," this",[50,239,86],{"class":85},[50,241,242],{"class":89},"findById",[50,244,94],{"class":245},"spAFX",[50,247,102],{"class":81},[50,249,118],{"class":245},[50,251,252],{"class":85},";\n",[50,254,256,259,261,263,266,268,270,273,275,277,280,283,285,288,290,292,294,296,298,300,303],{"class":52,"line":255},6,[50,257,258],{"class":63},"  await",[50,260,237],{"class":236},[50,262,86],{"class":85},[50,264,265],{"class":89},"published",[50,267,94],{"class":245},[50,269,128],{"class":85},[50,271,272],{"class":131}," id",[50,274,135],{"class":85},[50,276,227],{"class":81},[50,278,279],{"class":85},"!.",[50,281,102],{"class":282},"sy9f4",[50,284,107],{"class":85},[50,286,287],{"class":131}," title",[50,289,135],{"class":85},[50,291,227],{"class":81},[50,293,279],{"class":85},[50,295,113],{"class":282},[50,297,144],{"class":85},[50,299,118],{"class":245},[50,301,302],{"class":85},";",[50,304,305],{"class":56},"   \u002F\u002F `at` is stamped for you\n",[50,307,309],{"class":52,"line":308},7,[50,310,311],{"class":85},"}\n",[41,313,315],{"className":43,"code":314,"language":45,"meta":46,"style":46},"\u002F\u002F fronds\u002Fsearch\u002Fhandlers\u002FIndexHandler.ts — another frond, accepts\nasync reindex(fact: Fact\u003CPostPublished>): Promise\u003Cvoid> { … }\n",[17,316,317,322],{"__ignoreMap":46},[50,318,319],{"class":52,"line":53},[50,320,321],{"class":56},"\u002F\u002F fronds\u002Fsearch\u002Fhandlers\u002FIndexHandler.ts — another frond, accepts\n",[50,323,324,326,329,331,334,336,338,340,342,345,348,351,354,357],{"class":52,"line":60},[50,325,195],{"class":81},[50,327,328],{"class":89},"reindex",[50,330,94],{"class":93},[50,332,333],{"class":81},"fact: Fact",[50,335,172],{"class":85},[50,337,175],{"class":81},[50,339,178],{"class":85},[50,341,118],{"class":93},[50,343,344],{"class":81},": ",[50,346,347],{"class":74},"Promise",[50,349,350],{"class":85},"\u003Cvoid>",[50,352,353],{"class":85}," {",[50,355,356],{"class":81}," … ",[50,358,311],{"class":85},[13,360,361,362,369,370,373,374,376],{},"There is no topic, no subscribe call, no list of listeners. ",[28,363,364,365,368],{},"Accepting a ",[17,366,367],{},"Fact\u003CT>"," is the\nsubscription",": the scan reads the signature, and that is all. A fourth listener does not reopen\n",[17,371,372],{},"PostHandler",". Nothing marks ",[17,375,175],{}," as a fact either; it is one because someone announces\nor accepts it.",[33,378,380],{"id":379},"what-a-listener-promises","What a listener promises",[13,382,383],{},"A listener is an ordinary operation: it keeps its validation and the links that stand around its\ncalls. But it has no caller — no REST route, no GraphQL field, and a page cannot call it. What comes\nfrom outside is a command, which announces. Another process delivering the fact still reaches it,\nand so does the terminal, for an operator replaying one by hand.",[13,385,386],{},"Being called by an announcement changes three things:",[388,389,390,405],"table",{},[391,392,393],"thead",{},[394,395,396,399,402],"tr",{},[397,398],"th",{},[397,400,401],{},"called directly",[397,403,404],{},"called by an announcement",[406,407,408,420,431],"tbody",{},[394,409,410,414,417],{},[411,412,413],"td",{},"its return",[411,415,416],{},"someone reads it",[411,418,419],{},"nobody, unless the announcer waits (below)",[394,421,422,425,428],{},[411,423,424],{},"an exception",[411,426,427],{},"reaches the caller",[411,429,430],{},"reaches a log",[394,432,433,436,439],{},[411,434,435],{},"how many times",[411,437,438],{},"once per request",[411,440,441],{},"possibly again — write it so a replay is harmless",[33,443,445],{"id":444},"a-resolver-not-a-queue","A resolver, not a queue",[13,447,448],{},"An announcement finds who accepts the fact and calls each of them. There is no queue behind it:",[450,451,452,463,481],"ul",{},[453,454,455,458,459,462],"li",{},[28,456,457],{},"Handing over is not finishing."," ",[17,460,461],{},"await this.published(…)"," returns once every listener has\nbeen handed the fact, not once they are done. A listener that fails is logged; the announcer goes on.",[453,464,465,468,469,472,473,476,477,480],{},[28,466,467],{},"A fact cannot cause itself."," A ring (",[17,470,471],{},"A → B → A",") is refused, naming it; a diamond\n(",[17,474,475],{},"A → B → D",", ",[17,478,479],{},"A → C → D",") is fine.",[453,482,483,486,487,491,492,495,496,499,500,506],{},[28,484,485],{},"Nothing is durable."," If the listener's process is down, the fact is lost. A real channel — a\nlog, a cursor per listener, an acknowledgement — goes ",[488,489,490],"em",{},"under"," the announcement. What Fougere gives\nit is ",[17,493,494],{},"app.deliver()",", which waits for every local listener and ",[28,497,498],{},"rejects"," if one refused, so a\ncarrier can acknowledge, retry or set the message aside.\n",[22,501,505],{"href":502,"rel":503},"https:\u002F\u002Fgithub.com\u002Fchok\u002Ffougere\u002Ftree\u002Fmain\u002Fdemos\u002Femit-multirepo",[504],"nofollow","emit-multirepo"," has a broker of\nunder a hundred lines that holds the queue, and the frond holds none of it.",[33,508,510,511],{"id":509},"waiting-for-answers-emitt-a","Waiting for answers — ",[17,512,513],{},"Emit\u003CT, A>",[13,515,516],{},"A second type makes an announcement wait, and hands back what each listener answered:",[41,518,520],{"className":43,"code":519,"language":45,"meta":46,"style":46},"\u002F\u002F fronds\u002Fbooking\u002Fhandlers\u002FBookingHandler.ts — asks, and decides with the answers\nconstructor(private mayBook: Emit\u003CCanBook, Verdict>) {}\n\nasync reserve(room: string) {\n  const verdicts = await this.mayBook({ room });\n\n  return { room, booked: verdicts.length > 0 && verdicts.every((one) => one.ok) };\n}\n",[17,521,522,527,552,556,572,603,607,674],{"__ignoreMap":46},[50,523,524],{"class":52,"line":53},[50,525,526],{"class":56},"\u002F\u002F fronds\u002Fbooking\u002Fhandlers\u002FBookingHandler.ts — asks, and decides with the answers\n",[50,528,529,531,533,536,538,541,543,546,548,550],{"class":52,"line":60},[50,530,164],{"class":89},[50,532,94],{"class":93},[50,534,535],{"class":81},"private mayBook: Emit",[50,537,172],{"class":85},[50,539,540],{"class":81},"CanBook",[50,542,107],{"class":85},[50,544,545],{"class":81}," Verdict",[50,547,178],{"class":85},[50,549,118],{"class":93},[50,551,149],{"class":85},[50,553,554],{"class":52,"line":185},[50,555,189],{"emptyLinePlaceholder":188},[50,557,558,560,563,565,568,570],{"class":52,"line":192},[50,559,195],{"class":81},[50,561,562],{"class":89},"reserve",[50,564,94],{"class":93},[50,566,567],{"class":81},"room: string",[50,569,118],{"class":93},[50,571,218],{"class":85},[50,573,574,576,579,581,583,585,587,590,592,594,597,599,601],{"class":52,"line":221},[50,575,224],{"class":70},[50,577,578],{"class":81}," verdicts",[50,580,230],{"class":85},[50,582,233],{"class":63},[50,584,237],{"class":236},[50,586,86],{"class":85},[50,588,589],{"class":89},"mayBook",[50,591,94],{"class":245},[50,593,128],{"class":85},[50,595,596],{"class":81}," room",[50,598,144],{"class":85},[50,600,118],{"class":245},[50,602,252],{"class":85},[50,604,605],{"class":52,"line":255},[50,606,189],{"emptyLinePlaceholder":188},[50,608,609,612,614,616,618,621,623,625,627,630,633,637,640,642,644,647,649,651,655,657,661,664,666,669,671],{"class":52,"line":308},[50,610,611],{"class":63},"  return",[50,613,353],{"class":85},[50,615,596],{"class":81},[50,617,107],{"class":85},[50,619,620],{"class":131}," booked",[50,622,135],{"class":85},[50,624,578],{"class":81},[50,626,86],{"class":85},[50,628,629],{"class":282},"length",[50,631,632],{"class":85}," >",[50,634,636],{"class":635},"s3dPA"," 0",[50,638,639],{"class":85}," &&",[50,641,578],{"class":81},[50,643,86],{"class":85},[50,645,646],{"class":89},"every",[50,648,94],{"class":245},[50,650,94],{"class":85},[50,652,654],{"class":653},"shDUQ","one",[50,656,118],{"class":85},[50,658,660],{"class":659},"scTuO"," =>",[50,662,663],{"class":81}," one",[50,665,86],{"class":85},[50,667,668],{"class":282},"ok",[50,670,118],{"class":245},[50,672,673],{"class":85}," };\n",[50,675,677],{"class":52,"line":676},8,[50,678,311],{"class":85},[41,680,682],{"className":43,"code":681,"language":45,"meta":46,"style":46},"\u002F\u002F fronds\u002Frooms\u002Fhandlers\u002FRoomsHandler.ts — its return type is its answer\nasync check(question: Fact\u003CCanBook>): Promise\u003CVerdict> { … }\n",[17,683,684,689],{"__ignoreMap":46},[50,685,686],{"class":52,"line":53},[50,687,688],{"class":56},"\u002F\u002F fronds\u002Frooms\u002Fhandlers\u002FRoomsHandler.ts — its return type is its answer\n",[50,690,691,693,696,698,701,703,705,707,709,711,713,715,718,720,722,724],{"class":52,"line":60},[50,692,195],{"class":81},[50,694,695],{"class":89},"check",[50,697,94],{"class":93},[50,699,700],{"class":81},"question: Fact",[50,702,172],{"class":85},[50,704,540],{"class":81},[50,706,178],{"class":85},[50,708,118],{"class":93},[50,710,344],{"class":81},[50,712,347],{"class":74},[50,714,172],{"class":85},[50,716,717],{"class":81},"Verdict",[50,719,178],{"class":85},[50,721,353],{"class":85},[50,723,356],{"class":81},[50,725,311],{"class":85},[13,727,728,729,732,733,735,736,741],{},"A listener answering ",[17,730,731],{},"Promise\u003Cvoid>"," has no opinion; any other return is one. The rule —\neveryone, a majority, the first refusal — is the announcer's, in its own code. A listener that does\nnot answer refuses the whole announcement: given only the others, the announcer could not tell them\nfrom a full answer, and silence would read as consent. A carrier brings no answer back, so an app\nsending facts through one refuses ",[17,734,513],{}," at boot.\n",[22,737,740],{"href":738,"rel":739},"https:\u002F\u002Fgithub.com\u002Fchok\u002Ffougere\u002Ftree\u002Fmain\u002Fdemos\u002Fask-quorum",[504],"ask-quorum"," runs it across three processes.",[13,743,744,745,86],{},"To change a fact before anyone reads it — a hash, a lookup the announcer should not hold — see\n",[22,746,748],{"href":747},"\u002Fdocs\u002Fbehaviour\u002Ffinish-a-fact","Finish a fact",[33,750,752],{"id":751},"across-processes","Across processes",[13,754,755,756,758,759,762,763,766,767,769],{},"Only ",[17,757,19],{}," changes. A listener whose code is read here is called through a stand-in when its\nfrond is placed elsewhere. A listener whose code is not read here — ",[17,760,761],{},"fougere serve blog"," reads\n",[17,764,765],{},"blog"," alone — is found on its frond's card, where each operation states the fact it accepts. Either\nway the fact arrives as a call, so ",[17,768,513],{}," still gets its answers.",[13,771,772,773,775],{},"A process with no address in ",[17,774,19],{}," cannot be called, so a listener hosted by a Nuxt app is not\nreached from a frond served on its own.",[777,778],"demo",{"name":779},"emit-split",[13,781,782,787,788,790],{},[22,783,786],{"href":784,"rel":785},"https:\u002F\u002Fgithub.com\u002Fchok\u002Ffougere\u002Ftree\u002Fmain\u002Fdemos\u002Femit-fleet",[504],"emit-fleet"," goes further: a hub and N\ndevices over one socket, facts in both directions, and one device addressed in the data — ",[17,789,19],{},"\nnames a kind of frond, never one instance of it.",[13,792,793,794,86],{},"For a listener in another repository, see\n",[22,795,797],{"href":796},"\u002Fdocs\u002Fadopt\u002Fanother-repository#facts-across-repositories","A frond from another repository",[33,799,801],{"id":800},"changing-a-fact","Changing a fact",[13,803,804,805,808,809,812],{},"A fact is checked like any input: a key outside the contract is ",[17,806,807],{},"Unknown field",". Tolerating it would\nlet a reader silently ignore a field it was meant to handle. So ",[28,810,811],{},"adding a field breaks every reader\nstill holding the older copy",", and since handing over is not finishing, the refusal reaches the\nreader's log, not the sender:",[41,814,819],{"className":815,"code":817,"language":818},[816],"language-text","ERR [blog] postPublished → index.reindex refused the shape — author: Unknown field.\n    If 'postPublished' gained a field, this copy is older than the sender's:\n    re-run `fougere sync`.\n","text",[17,820,817],{"__ignoreMap":46},[13,822,823],{},"The order is part of the change:",[41,825,828],{"className":826,"code":827,"language":818},[816],"1. the sender declares the new field\n2. every reader: `fougere sync`, then deploy      ← first\n3. the sender deploys                              ← last\n",[17,829,827],{"__ignoreMap":46},[13,831,832,833,836,837,840],{},"Removing a field breaks readers the same way. When you cannot deploy the readers first — another\nteam, a fleet — ",[28,834,835],{},"announce a second fact instead of changing the first",". It costs one class and one\n",[17,838,839],{},"Emit\u003CT>","; both run side by side, and readers move when they move:",[41,842,844],{"className":43,"code":843,"language":45,"meta":46,"style":46},"constructor(\n  private published: Emit\u003CPostPublished>,        \u002F\u002F the old readers, untouched\n  private publishedV2: Emit\u003CPostPublishedFull>,  \u002F\u002F the new shape\n) {}\n",[17,845,846,853,868,883],{"__ignoreMap":46},[50,847,848,850],{"class":52,"line":53},[50,849,164],{"class":89},[50,851,852],{"class":93},"(\n",[50,854,855,858,860,862,865],{"class":52,"line":60},[50,856,857],{"class":81},"  private published: Emit",[50,859,172],{"class":85},[50,861,175],{"class":81},[50,863,864],{"class":85},">,",[50,866,867],{"class":56},"        \u002F\u002F the old readers, untouched\n",[50,869,870,873,875,878,880],{"class":52,"line":185},[50,871,872],{"class":81},"  private publishedV2: Emit",[50,874,172],{"class":85},[50,876,877],{"class":81},"PostPublishedFull",[50,879,864],{"class":85},[50,881,882],{"class":56},"  \u002F\u002F the new shape\n",[50,884,885,887],{"class":52,"line":192},[50,886,118],{"class":93},[50,888,149],{"class":85},[13,890,891,892,895],{},"Delete the first ",[17,893,894],{},"Emit"," when its last reader is gone. A listener is found by the type it accepts,\nso a misspelled fact does not compile and the payload is typed.",[897,898,899],"style",{},"html pre.shiki code .skXKP, html code.shiki .skXKP{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#7D8C80;--shiki-default-font-style:inherit;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sK6XW, html code.shiki .sK6XW{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#8FCF86;--shiki-default-font-style:inherit;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s76I7, html code.shiki .s76I7{--shiki-light:#9C3EDA;--shiki-default:#8FCF86;--shiki-dark:#C792EA}html pre.shiki code .sBZYL, html code.shiki .sBZYL{--shiki-light:#E2931D;--shiki-default:#EFCD8F;--shiki-dark:#FFCB6B}html pre.shiki code .sPEhv, html code.shiki .sPEhv{--shiki-light:#90A4AE;--shiki-default:#DDE5DA;--shiki-dark:#BABED8}html pre.shiki code .s15xx, html code.shiki .s15xx{--shiki-light:#39ADB5;--shiki-default:#A3B0A5;--shiki-dark:#89DDFF}html pre.shiki code .s4mR9, html code.shiki .s4mR9{--shiki-light:#6182B8;--shiki-default:#C9B6EA;--shiki-dark:#82AAFF}html pre.shiki code .srlTG, html code.shiki .srlTG{--shiki-light:#90A4AE;--shiki-default:#A3B0A5;--shiki-dark:#BABED8}html pre.shiki code .sDDC1, html code.shiki .sDDC1{--shiki-light:#39ADB5;--shiki-default:#EE9F6B;--shiki-dark:#89DDFF}html pre.shiki code .sN-8n, html code.shiki .sN-8n{--shiki-light:#91B859;--shiki-default:#EE9F6B;--shiki-dark:#C3E88D}html pre.shiki code .sHtqg, html code.shiki .sHtqg{--shiki-light:#E53935;--shiki-default:#93CFC0;--shiki-dark:#F07178}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sxG60, html code.shiki .sxG60{--shiki-light:#39ADB5;--shiki-light-font-style:inherit;--shiki-default:#8FCF86;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:inherit}html pre.shiki code .spAFX, html code.shiki .spAFX{--shiki-light:#E53935;--shiki-default:#A3B0A5;--shiki-dark:#F07178}html pre.shiki code .sy9f4, html code.shiki .sy9f4{--shiki-light:#90A4AE;--shiki-default:#93CFC0;--shiki-dark:#BABED8}html pre.shiki code .s3dPA, html code.shiki .s3dPA{--shiki-light:#F76D47;--shiki-default:#EE9F6B;--shiki-dark:#F78C6C}html pre.shiki code .shDUQ, html code.shiki .shDUQ{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#DDE5DA;--shiki-default-font-style:inherit;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .scTuO, html code.shiki .scTuO{--shiki-light:#9C3EDA;--shiki-default:#A3B0A5;--shiki-dark:#C792EA}",{"title":46,"searchDepth":60,"depth":60,"links":901},[902,903,904,905,907,908],{"id":35,"depth":60,"text":36},{"id":379,"depth":60,"text":380},{"id":444,"depth":60,"text":445},{"id":509,"depth":60,"text":906},"Waiting for answers — Emit\u003CT, A>",{"id":751,"depth":60,"text":752},{"id":800,"depth":60,"text":801},"Announcing what happened without naming who listens.","md",null,"concept",{},"\u002Fdocs\u002Fconcepts\u002Ffact",{"title":8,"description":909},"docs\u002F1.concepts\u002F6.fact","Z4JJtDWUK0MbQ5AI8f1AIvhfWXQhq6v69NlwnTi1blY",[919,922,925,928,931,933,934,937,940,946,952,957,961,965,969,973,977,982,986,990,993,997,1001,1005,1009,1013,1017,1021,1025,1029,1033,1037,1041,1045,1049,1052,1056,1059,1062,1065,1068,1071,1074,1077,1080,1083,1086],{"path":920,"title":921,"uses":911},"\u002Fdocs\u002Fconcepts\u002Fentity","Entity",{"path":923,"title":924,"uses":911},"\u002Fdocs\u002Fconcepts\u002Fhandler","Handler",{"path":926,"title":927,"uses":911},"\u002Fdocs\u002Fconcepts\u002Frepository","Repository",{"path":929,"title":930,"uses":911},"\u002Fdocs\u002Fconcepts\u002Ffrond","Frond",{"path":24,"title":932,"uses":911},"Facade",{"path":914,"title":8,"uses":911},{"path":935,"title":936,"uses":911},"\u002Fdocs\u002Fconcepts\u002Fport","Port",{"path":938,"title":939,"uses":911},"\u002Fdocs\u002Fconcepts\u002Fconfiguration","Configuration",{"path":941,"title":942,"uses":943},"\u002Fdocs\u002Faccess\u002Fauthentication","Authentication",[944,945],"port","frond",{"path":947,"title":948,"uses":949},"\u002Fdocs\u002Faccess\u002Fstate","Keep a caller's state",[950,951],"configuration","handler",{"path":953,"title":954,"uses":955},"\u002Fdocs\u002Fdata\u002Fsql","SQLite or Postgres",[956,950],"entity",{"path":958,"title":959,"uses":960},"\u002Fdocs\u002Fdata\u002Fseveral-databases","Several databases",[950,956],{"path":962,"title":963,"uses":964},"\u002Fdocs\u002Fdata\u002Fcomputed-field","A computed field",[956,944],{"path":966,"title":967,"uses":968},"\u002Fdocs\u002Fdata\u002Fevolve","Evolve a schema",[956],{"path":970,"title":971,"uses":972},"\u002Fdocs\u002Fdata\u002Fseeds","Seed data",[956],{"path":974,"title":975,"uses":976},"\u002Fdocs\u002Fdata\u002Fvalues","Read settings and secrets",[956,950],{"path":978,"title":979,"uses":980},"\u002Fdocs\u002Fdata\u002Fmirror","Mirror a source you cannot query",[981],"repository",{"path":983,"title":984,"uses":985},"\u002Fdocs\u002Fdata\u002Ftogether","Two writes as one",[981],{"path":987,"title":988,"uses":989},"\u002Fdocs\u002Fbehaviour\u002Faround-every-call","Around every call",[944,945],{"path":747,"title":748,"uses":991},[992],"fact",{"path":994,"title":995,"uses":996},"\u002Fdocs\u002Fserve\u002Frest-graphql","REST, OpenAPI, GraphQL",[951,950],{"path":998,"title":999,"uses":1000},"\u002Fdocs\u002Fserve\u002Fpages","Pages: queries and commands",[951,25],{"path":1002,"title":1003,"uses":1004},"\u002Fdocs\u002Fserve\u002Fforms","A form",[956],{"path":1006,"title":1007,"uses":1008},"\u002Fdocs\u002Fserve\u002Fadmin","An admin panel",[951],{"path":1010,"title":1011,"uses":1012},"\u002Fdocs\u002Frun\u002Fdeploy","Deploy a split",[950,945],{"path":1014,"title":1015,"uses":1016},"\u002Fdocs\u002Frun\u002Fsecure","Secure calls between processes",[950,945],{"path":1018,"title":1019,"uses":1020},"\u002Fdocs\u002Frun\u002Flifecycle","Reload and shut down",[950],{"path":1022,"title":1023,"uses":1024},"\u002Fdocs\u002Frun\u002Fobserve","Observe",[950,951],{"path":1026,"title":1027,"uses":1028},"\u002Fdocs\u002Frun\u002Fdev-panel","The dev panel",[951],{"path":1030,"title":1031,"uses":1032},"\u002Fdocs\u002Frun\u002Ftest","Test",[956,944],{"path":1034,"title":1035,"uses":1036},"\u002Fdocs\u002Fadopt\u002Fnew-project","Start a project",[945,950],{"path":1038,"title":1039,"uses":1040},"\u002Fdocs\u002Fadopt\u002Fexisting-app","Add Fougere to an existing app",[945,950],{"path":1042,"title":1043,"uses":1044},"\u002Fdocs\u002Fadopt\u002Fbring-your-schema","Bring your schema",[956],{"path":1046,"title":1047,"uses":1048},"\u002Fdocs\u002Fadopt\u002Fhosts","Pick a host",[950],{"path":1050,"title":797,"uses":1051},"\u002Fdocs\u002Fadopt\u002Fanother-repository",[25,945],{"path":1053,"title":1054,"uses":1055},"\u002Fdocs\u002Fadopt\u002Fdemos","Demos",[],{"path":1057,"title":1058,"uses":911},"\u002Fdocs\u002Fextending\u002Fscan","How the scan reads a project",{"path":1060,"title":1061,"uses":911},"\u002Fdocs\u002Fextending\u002Fwithout-compiler","Boot without the compiler",{"path":1063,"title":1064,"uses":911},"\u002Fdocs\u002Fextending\u002Fboot","The boot, step by step",{"path":1066,"title":1067,"uses":911},"\u002Fdocs\u002Fextending\u002Fcard-and-wire","The card and the wire",{"path":1069,"title":1070,"uses":911},"\u002Fdocs\u002Fextending\u002Fextension-points","Registries and extension points",{"path":1072,"title":1073,"uses":911},"\u002Fdocs\u002Fextending\u002Fvocabulary","Teach a word",{"path":1075,"title":1076,"uses":911},"\u002Fdocs\u002Fextending\u002Fextensions","Run code at boot and shutdown",{"path":1078,"title":1079,"uses":911},"\u002Fdocs\u002Fextending\u002Fsource-adapter","Write a source adapter",{"path":1081,"title":1082,"uses":911},"\u002Fdocs\u002Fextending\u002Fsurface","Write a surface",{"path":1084,"title":1085,"uses":911},"\u002Fdocs\u002Fextending\u002Fforeign-frond","A frond in another language",{"path":1087,"title":1088,"uses":911},"\u002Fdocs","What is Fougere",[1090],{"title":1091,"path":1087,"stem":1092,"children":1093,"page":-1},"Docs","docs",[1094,1096,1116,1125,1146,1155,1168,1185,1202],{"title":1088,"path":1087,"stem":1095},"docs\u002Findex",{"title":1097,"path":1098,"stem":1099,"children":1100,"page":5},"Concepts","\u002Fdocs\u002Fconcepts","docs\u002F1.concepts",[1101,1103,1105,1107,1109,1111,1112,1114],{"title":921,"path":920,"stem":1102},"docs\u002F1.concepts\u002F1.entity",{"title":924,"path":923,"stem":1104},"docs\u002F1.concepts\u002F2.handler",{"title":927,"path":926,"stem":1106},"docs\u002F1.concepts\u002F3.repository",{"title":930,"path":929,"stem":1108},"docs\u002F1.concepts\u002F4.frond",{"title":932,"path":24,"stem":1110},"docs\u002F1.concepts\u002F5.facade",{"title":8,"path":914,"stem":916},{"title":936,"path":935,"stem":1113},"docs\u002F1.concepts\u002F7.port",{"title":939,"path":938,"stem":1115},"docs\u002F1.concepts\u002F8.configuration",{"title":1117,"path":1118,"stem":1119,"children":1120,"page":5},"Access","\u002Fdocs\u002Faccess","docs\u002F2.access",[1121,1123],{"title":942,"path":941,"stem":1122},"docs\u002F2.access\u002F1.authentication",{"title":948,"path":947,"stem":1124},"docs\u002F2.access\u002F2.state",{"title":1126,"path":1127,"stem":1128,"children":1129,"page":5},"Data","\u002Fdocs\u002Fdata","docs\u002F3.data",[1130,1132,1134,1136,1138,1140,1142,1144],{"title":954,"path":953,"stem":1131},"docs\u002F3.data\u002F1.sql",{"title":959,"path":958,"stem":1133},"docs\u002F3.data\u002F2.several-databases",{"title":963,"path":962,"stem":1135},"docs\u002F3.data\u002F3.computed-field",{"title":967,"path":966,"stem":1137},"docs\u002F3.data\u002F4.evolve",{"title":971,"path":970,"stem":1139},"docs\u002F3.data\u002F5.seeds",{"title":975,"path":974,"stem":1141},"docs\u002F3.data\u002F6.values",{"title":979,"path":978,"stem":1143},"docs\u002F3.data\u002F7.mirror",{"title":984,"path":983,"stem":1145},"docs\u002F3.data\u002F8.together",{"title":1147,"path":1148,"stem":1149,"children":1150,"page":5},"Behaviour","\u002Fdocs\u002Fbehaviour","docs\u002F4.behaviour",[1151,1153],{"title":988,"path":987,"stem":1152},"docs\u002F4.behaviour\u002F1.around-every-call",{"title":748,"path":747,"stem":1154},"docs\u002F4.behaviour\u002F2.finish-a-fact",{"title":1156,"path":1157,"stem":1158,"children":1159,"page":5},"Serve","\u002Fdocs\u002Fserve","docs\u002F5.serve",[1160,1162,1164,1166],{"title":995,"path":994,"stem":1161},"docs\u002F5.serve\u002F1.rest-graphql",{"title":999,"path":998,"stem":1163},"docs\u002F5.serve\u002F2.pages",{"title":1003,"path":1002,"stem":1165},"docs\u002F5.serve\u002F3.forms",{"title":1007,"path":1006,"stem":1167},"docs\u002F5.serve\u002F4.admin",{"title":1169,"path":1170,"stem":1171,"children":1172,"page":5},"Run","\u002Fdocs\u002Frun","docs\u002F6.run",[1173,1175,1177,1179,1181,1183],{"title":1011,"path":1010,"stem":1174},"docs\u002F6.run\u002F1.deploy",{"title":1015,"path":1014,"stem":1176},"docs\u002F6.run\u002F2.secure",{"title":1019,"path":1018,"stem":1178},"docs\u002F6.run\u002F3.lifecycle",{"title":1023,"path":1022,"stem":1180},"docs\u002F6.run\u002F4.observe",{"title":1027,"path":1026,"stem":1182},"docs\u002F6.run\u002F5.dev-panel",{"title":1031,"path":1030,"stem":1184},"docs\u002F6.run\u002F6.test",{"title":1186,"path":1187,"stem":1188,"children":1189,"page":5},"Adopt","\u002Fdocs\u002Fadopt","docs\u002F7.adopt",[1190,1192,1194,1196,1198,1200],{"title":1035,"path":1034,"stem":1191},"docs\u002F7.adopt\u002F1.new-project",{"title":1039,"path":1038,"stem":1193},"docs\u002F7.adopt\u002F2.existing-app",{"title":1043,"path":1042,"stem":1195},"docs\u002F7.adopt\u002F3.bring-your-schema",{"title":1047,"path":1046,"stem":1197},"docs\u002F7.adopt\u002F4.hosts",{"title":797,"path":1050,"stem":1199},"docs\u002F7.adopt\u002F5.another-repository",{"title":1054,"path":1053,"stem":1201},"docs\u002F7.adopt\u002F6.demos",{"title":1203,"path":1204,"stem":1205,"children":1206,"page":5},"Extending","\u002Fdocs\u002Fextending","docs\u002F8.extending",[1207,1209,1211,1213,1215,1217,1219,1221,1223,1225],{"title":1058,"path":1057,"stem":1208},"docs\u002F8.extending\u002F1.scan",{"title":1061,"path":1060,"stem":1210},"docs\u002F8.extending\u002F10.without-compiler",{"title":1064,"path":1063,"stem":1212},"docs\u002F8.extending\u002F2.boot",{"title":1067,"path":1066,"stem":1214},"docs\u002F8.extending\u002F3.card-and-wire",{"title":1070,"path":1069,"stem":1216},"docs\u002F8.extending\u002F4.extension-points",{"title":1073,"path":1072,"stem":1218},"docs\u002F8.extending\u002F5.vocabulary",{"title":1076,"path":1075,"stem":1220},"docs\u002F8.extending\u002F6.extensions",{"title":1079,"path":1078,"stem":1222},"docs\u002F8.extending\u002F7.source-adapter",{"title":1082,"path":1081,"stem":1224},"docs\u002F8.extending\u002F8.surface",{"title":1085,"path":1084,"stem":1226},"docs\u002F8.extending\u002F9.foreign-frond",{"id":1228,"title":779,"body":1229,"count":1317,"description":46,"entry":1234,"extension":910,"meta":5110,"name":779,"navigation":188,"path":5111,"runnable":188,"seo":5112,"stem":5113,"__hash__":5114},"demo\u002Fdemo\u002Femit-split.md",{"type":10,"value":1230,"toc":5108},[1231,5105],[1232,1233,1235,1762,1926,2068,2328,2518,2762,4029,4347,4957],"code-tree",{"default-value":1234},"main.ts",[41,1236,1240],{"className":1237,"code":1238,"filename":1239,"language":910,"meta":46,"style":46},"language-md shiki shiki-themes material-theme-lighter fougere-pastel material-theme-palenight","# emit-split — one fact, two processes\n\nA post is published. Search re-indexes it. `blog` never names `search`.\n\n```bash\npnpm install\npnpm -r build          # if packages\u002F*\u002Fdist is missing\n\n# terminal 1\npnpm dev:search        # the search frond alone, on :4210\n\n# terminal 2\npnpm dev               # publishes twice: in this process, then across the wire\n```\n\n## What to watch\n\nThe **pid** in each line. The first publication is indexed in the emitting process; the\nsecond is indexed in the other terminal.\n\n```\n1. Both fronds in THIS process\n  [search · pid 34732] indexed p1 — \"Ferns are not plants that give up\"\n\n2. search declared remote — remotes: { search: 'http:\u002F\u002F127.0.0.1:4210' }\n  { id: 'p2', status: 'published' }\n                                       ← and in terminal 1:\n                                       [search · pid 34697] indexed p2 — …\n```\n\n## What is written, in full\n\n```ts\n\u002F\u002F fronds\u002Fblog\u002Fhandlers\u002FPostHandler.ts — the emitter names a SUBJECT\nconstructor(private published: Emit\u003CPostPublished>) {}\nawait this.published({ id, title, at: new Date() });\n\n\u002F\u002F fronds\u002Fsearch\u002Fhandlers\u002FIndexHandler.ts — another frond\nasync reindex(fact: Fact\u003CPostPublished>): Promise\u003Cvoid> { … }\n```\n\nThere is no topic, no subscription call, no listener list. **Accepting a `Fact\u003CT>` IS the\nsubscription** — the scan reads the signature, and that is the whole mechanism. Adding a\nthird listener does not reopen `PostHandler`.\n\nAnd `remotes:` is the only line that differs between the two runs. `search\u002F` sits on disk\nin both: it is scanned either way, so the emitter knows its signature; declaring it remote\nonly says it is not hosted here.\n\n## What this demo does NOT show\n\n- **Durability.** `Emit\u003CT>` is a resolver, not a channel: it answers *who*, then hands over\n  to the facade that already exists. Kill terminal 1 and the fact is lost — the dispatch logs\n  the failure and the publication succeeds anyway. At-least-once means putting a real\n  channel underneath, in the transport.\n- **Discovery in the other direction.** Here the emitter declares where the listener runs.\n  A listener that wants to hear a frond it does not know about is the open half.\n\n","README.md",[17,1241,1242,1252,1256,1281,1285,1295,1300,1305,1309,1315,1321,1326,1332,1338,1344,1349,1358,1363,1382,1388,1393,1398,1404,1410,1415,1421,1427,1433,1439,1444,1449,1457,1462,1470,1476,1495,1538,1543,1549,1580,1585,1590,1605,1611,1625,1630,1656,1662,1668,1673,1681,1686,1723,1729,1735,1741,1756],{"__ignoreMap":46},[50,1243,1244,1248],{"class":52,"line":53},[50,1245,1247],{"class":1246},"sd7zb","#",[50,1249,1251],{"class":1250},"sLf9K"," emit-split — one fact, two processes\n",[50,1253,1254],{"class":52,"line":60},[50,1255,189],{"emptyLinePlaceholder":188},[50,1257,1258,1261,1264,1266,1268,1271,1273,1276,1278],{"class":52,"line":185},[50,1259,1260],{"class":81},"A post is published. Search re-indexes it. ",[50,1262,1263],{"class":85},"`",[50,1265,765],{"class":101},[50,1267,1263],{"class":85},[50,1269,1270],{"class":81}," never names ",[50,1272,1263],{"class":85},[50,1274,1275],{"class":101},"search",[50,1277,1263],{"class":85},[50,1279,1280],{"class":81},".\n",[50,1282,1283],{"class":52,"line":192},[50,1284,189],{"emptyLinePlaceholder":188},[50,1286,1287,1291],{"class":52,"line":221},[50,1288,1290],{"class":1289},"siB6D","```",[50,1292,1294],{"class":1293},"sYNOY","bash\n",[50,1296,1297],{"class":52,"line":255},[50,1298,1299],{"class":1293},"pnpm install\n",[50,1301,1302],{"class":52,"line":308},[50,1303,1304],{"class":1293},"pnpm -r build          # if packages\u002F*\u002Fdist is missing\n",[50,1306,1307],{"class":52,"line":676},[50,1308,189],{"emptyLinePlaceholder":188},[50,1310,1312],{"class":52,"line":1311},9,[50,1313,1314],{"class":1293},"# terminal 1\n",[50,1316,1318],{"class":52,"line":1317},10,[50,1319,1320],{"class":1293},"pnpm dev:search        # the search frond alone, on :4210\n",[50,1322,1324],{"class":52,"line":1323},11,[50,1325,189],{"emptyLinePlaceholder":188},[50,1327,1329],{"class":52,"line":1328},12,[50,1330,1331],{"class":1293},"# terminal 2\n",[50,1333,1335],{"class":52,"line":1334},13,[50,1336,1337],{"class":1293},"pnpm dev               # publishes twice: in this process, then across the wire\n",[50,1339,1341],{"class":52,"line":1340},14,[50,1342,1343],{"class":1289},"```\n",[50,1345,1347],{"class":52,"line":1346},15,[50,1348,189],{"emptyLinePlaceholder":188},[50,1350,1352,1355],{"class":52,"line":1351},16,[50,1353,1354],{"class":1246},"##",[50,1356,1357],{"class":1250}," What to watch\n",[50,1359,1361],{"class":52,"line":1360},17,[50,1362,189],{"emptyLinePlaceholder":188},[50,1364,1366,1369,1373,1377,1379],{"class":52,"line":1365},18,[50,1367,1368],{"class":81},"The ",[50,1370,1372],{"class":1371},"sHaeK","**",[50,1374,1376],{"class":1375},"s7rwI","pid",[50,1378,1372],{"class":1371},[50,1380,1381],{"class":81}," in each line. The first publication is indexed in the emitting process; the\n",[50,1383,1385],{"class":52,"line":1384},19,[50,1386,1387],{"class":81},"second is indexed in the other terminal.\n",[50,1389,1391],{"class":52,"line":1390},20,[50,1392,189],{"emptyLinePlaceholder":188},[50,1394,1396],{"class":52,"line":1395},21,[50,1397,1343],{"class":1289},[50,1399,1401],{"class":52,"line":1400},22,[50,1402,1403],{"class":1293},"1. Both fronds in THIS process\n",[50,1405,1407],{"class":52,"line":1406},23,[50,1408,1409],{"class":1293},"  [search · pid 34732] indexed p1 — \"Ferns are not plants that give up\"\n",[50,1411,1413],{"class":52,"line":1412},24,[50,1414,189],{"emptyLinePlaceholder":188},[50,1416,1418],{"class":52,"line":1417},25,[50,1419,1420],{"class":1293},"2. search declared remote — remotes: { search: 'http:\u002F\u002F127.0.0.1:4210' }\n",[50,1422,1424],{"class":52,"line":1423},26,[50,1425,1426],{"class":1293},"  { id: 'p2', status: 'published' }\n",[50,1428,1430],{"class":52,"line":1429},27,[50,1431,1432],{"class":1293},"                                       ← and in terminal 1:\n",[50,1434,1436],{"class":52,"line":1435},28,[50,1437,1438],{"class":1293},"                                       [search · pid 34697] indexed p2 — …\n",[50,1440,1442],{"class":52,"line":1441},29,[50,1443,1343],{"class":1289},[50,1445,1447],{"class":52,"line":1446},30,[50,1448,189],{"emptyLinePlaceholder":188},[50,1450,1452,1454],{"class":52,"line":1451},31,[50,1453,1354],{"class":1246},[50,1455,1456],{"class":1250}," What is written, in full\n",[50,1458,1460],{"class":52,"line":1459},32,[50,1461,189],{"emptyLinePlaceholder":188},[50,1463,1465,1467],{"class":52,"line":1464},33,[50,1466,1290],{"class":1289},[50,1468,1469],{"class":1293},"ts\n",[50,1471,1473],{"class":52,"line":1472},34,[50,1474,1475],{"class":56},"\u002F\u002F fronds\u002Fblog\u002Fhandlers\u002FPostHandler.ts — the emitter names a SUBJECT\n",[50,1477,1479,1481,1483,1485,1487,1489,1491,1493],{"class":52,"line":1478},35,[50,1480,164],{"class":89},[50,1482,94],{"class":93},[50,1484,169],{"class":81},[50,1486,172],{"class":85},[50,1488,175],{"class":81},[50,1490,178],{"class":85},[50,1492,118],{"class":93},[50,1494,149],{"class":85},[50,1496,1498,1501,1503,1505,1507,1509,1511,1513,1515,1517,1519,1521,1523,1526,1530,1532,1534,1536],{"class":52,"line":1497},36,[50,1499,1500],{"class":63},"await",[50,1502,237],{"class":236},[50,1504,86],{"class":85},[50,1506,265],{"class":89},[50,1508,94],{"class":93},[50,1510,128],{"class":85},[50,1512,272],{"class":81},[50,1514,107],{"class":85},[50,1516,287],{"class":81},[50,1518,107],{"class":85},[50,1520,132],{"class":131},[50,1522,135],{"class":85},[50,1524,1525],{"class":85}," new",[50,1527,1529],{"class":1528},"sgjsB"," Date",[50,1531,141],{"class":93},[50,1533,144],{"class":85},[50,1535,118],{"class":93},[50,1537,252],{"class":85},[50,1539,1541],{"class":52,"line":1540},37,[50,1542,189],{"emptyLinePlaceholder":188},[50,1544,1546],{"class":52,"line":1545},38,[50,1547,1548],{"class":56},"\u002F\u002F fronds\u002Fsearch\u002Fhandlers\u002FIndexHandler.ts — another frond\n",[50,1550,1552,1554,1556,1558,1560,1562,1564,1566,1568,1570,1572,1574,1576,1578],{"class":52,"line":1551},39,[50,1553,195],{"class":81},[50,1555,328],{"class":89},[50,1557,94],{"class":93},[50,1559,333],{"class":81},[50,1561,172],{"class":85},[50,1563,175],{"class":81},[50,1565,178],{"class":85},[50,1567,118],{"class":93},[50,1569,344],{"class":81},[50,1571,347],{"class":74},[50,1573,350],{"class":85},[50,1575,353],{"class":85},[50,1577,356],{"class":81},[50,1579,311],{"class":85},[50,1581,1583],{"class":52,"line":1582},40,[50,1584,1343],{"class":1289},[50,1586,1588],{"class":52,"line":1587},41,[50,1589,189],{"emptyLinePlaceholder":188},[50,1591,1593,1596,1598,1600,1602],{"class":52,"line":1592},42,[50,1594,1595],{"class":81},"There is no topic, no subscription call, no listener list. **Accepting a ",[50,1597,1263],{"class":85},[50,1599,367],{"class":101},[50,1601,1263],{"class":85},[50,1603,1604],{"class":81}," IS the\n",[50,1606,1608],{"class":52,"line":1607},43,[50,1609,1610],{"class":81},"subscription** — the scan reads the signature, and that is the whole mechanism. Adding a\n",[50,1612,1614,1617,1619,1621,1623],{"class":52,"line":1613},44,[50,1615,1616],{"class":81},"third listener does not reopen ",[50,1618,1263],{"class":85},[50,1620,372],{"class":101},[50,1622,1263],{"class":85},[50,1624,1280],{"class":81},[50,1626,1628],{"class":52,"line":1627},45,[50,1629,189],{"emptyLinePlaceholder":188},[50,1631,1633,1636,1638,1641,1643,1646,1648,1651,1653],{"class":52,"line":1632},46,[50,1634,1635],{"class":81},"And ",[50,1637,1263],{"class":85},[50,1639,1640],{"class":101},"remotes:",[50,1642,1263],{"class":85},[50,1644,1645],{"class":81}," is the only line that differs between the two runs. ",[50,1647,1263],{"class":85},[50,1649,1650],{"class":101},"search\u002F",[50,1652,1263],{"class":85},[50,1654,1655],{"class":81}," sits on disk\n",[50,1657,1659],{"class":52,"line":1658},47,[50,1660,1661],{"class":81},"in both: it is scanned either way, so the emitter knows its signature; declaring it remote\n",[50,1663,1665],{"class":52,"line":1664},48,[50,1666,1667],{"class":81},"only says it is not hosted here.\n",[50,1669,1671],{"class":52,"line":1670},49,[50,1672,189],{"emptyLinePlaceholder":188},[50,1674,1676,1678],{"class":52,"line":1675},50,[50,1677,1354],{"class":1246},[50,1679,1680],{"class":1250}," What this demo does NOT show\n",[50,1682,1684],{"class":52,"line":1683},51,[50,1685,189],{"emptyLinePlaceholder":188},[50,1687,1689,1692,1695,1698,1700,1703,1705,1707,1710,1714,1718,1720],{"class":52,"line":1688},52,[50,1690,1691],{"class":85},"-",[50,1693,1694],{"class":1371}," **",[50,1696,1697],{"class":1375},"Durability.",[50,1699,1372],{"class":1371},[50,1701,1702],{"class":85}," `",[50,1704,839],{"class":101},[50,1706,1263],{"class":85},[50,1708,1709],{"class":81}," is a resolver, not a channel: it answers ",[50,1711,1713],{"class":1712},"sOLEQ","*",[50,1715,1717],{"class":1716},"sJ4h6","who",[50,1719,1713],{"class":1712},[50,1721,1722],{"class":81},", then hands over\n",[50,1724,1726],{"class":52,"line":1725},53,[50,1727,1728],{"class":81},"  to the facade that already exists. Kill terminal 1 and the fact is lost — the dispatch logs\n",[50,1730,1732],{"class":52,"line":1731},54,[50,1733,1734],{"class":81},"  the failure and the publication succeeds anyway. At-least-once means putting a real\n",[50,1736,1738],{"class":52,"line":1737},55,[50,1739,1740],{"class":81},"  channel underneath, in the transport.\n",[50,1742,1744,1746,1748,1751,1753],{"class":52,"line":1743},56,[50,1745,1691],{"class":85},[50,1747,1694],{"class":1371},[50,1749,1750],{"class":1375},"Discovery in the other direction.",[50,1752,1372],{"class":1371},[50,1754,1755],{"class":81}," Here the emitter declares where the listener runs.\n",[50,1757,1759],{"class":52,"line":1758},57,[50,1760,1761],{"class":81},"  A listener that wants to hear a frond it does not know about is the open half.\n",[41,1763,1766],{"className":43,"code":1764,"filename":1765,"language":45,"meta":46,"style":46},"import { entity, primary, text, oneOf } from '@fougere\u002Fschema';\n\nexport default class Post extends entity({\n  id: primary(),\n  title: text({ min: 1 }),\n  status: oneOf('draft', 'published', { default: 'draft' }),\n}) {}\n\n","fronds\u002Fblog\u002Fentities\u002FPost.ts",[17,1767,1768,1807,1811,1830,1844,1871,1917],{"__ignoreMap":46},[50,1769,1770,1773,1775,1778,1780,1783,1785,1788,1790,1793,1795,1798,1800,1803,1805],{"class":52,"line":53},[50,1771,1772],{"class":63},"import",[50,1774,353],{"class":85},[50,1776,1777],{"class":81}," entity",[50,1779,107],{"class":85},[50,1781,1782],{"class":81}," primary",[50,1784,107],{"class":85},[50,1786,1787],{"class":81}," text",[50,1789,107],{"class":85},[50,1791,1792],{"class":81}," oneOf",[50,1794,144],{"class":85},[50,1796,1797],{"class":63}," from",[50,1799,110],{"class":97},[50,1801,1802],{"class":101},"@fougere\u002Fschema",[50,1804,98],{"class":97},[50,1806,252],{"class":85},[50,1808,1809],{"class":52,"line":60},[50,1810,189],{"emptyLinePlaceholder":188},[50,1812,1813,1815,1817,1819,1821,1823,1825,1827],{"class":52,"line":185},[50,1814,64],{"class":63},[50,1816,67],{"class":63},[50,1818,71],{"class":70},[50,1820,82],{"class":74},[50,1822,78],{"class":70},[50,1824,1777],{"class":89},[50,1826,94],{"class":93},[50,1828,1829],{"class":85},"{\n",[50,1831,1832,1835,1837,1839,1841],{"class":52,"line":192},[50,1833,1834],{"class":131},"  id",[50,1836,135],{"class":85},[50,1838,1782],{"class":89},[50,1840,141],{"class":93},[50,1842,1843],{"class":85},",\n",[50,1845,1846,1849,1851,1853,1855,1857,1860,1862,1865,1867,1869],{"class":52,"line":221},[50,1847,1848],{"class":131},"  title",[50,1850,135],{"class":85},[50,1852,1787],{"class":89},[50,1854,94],{"class":93},[50,1856,128],{"class":85},[50,1858,1859],{"class":131}," min",[50,1861,135],{"class":85},[50,1863,1864],{"class":635}," 1",[50,1866,144],{"class":85},[50,1868,118],{"class":93},[50,1870,1843],{"class":85},[50,1872,1873,1876,1878,1880,1882,1884,1887,1889,1891,1893,1895,1897,1899,1901,1903,1905,1907,1909,1911,1913,1915],{"class":52,"line":255},[50,1874,1875],{"class":131},"  status",[50,1877,135],{"class":85},[50,1879,1792],{"class":89},[50,1881,94],{"class":93},[50,1883,98],{"class":97},[50,1885,1886],{"class":101},"draft",[50,1888,98],{"class":97},[50,1890,107],{"class":85},[50,1892,110],{"class":97},[50,1894,265],{"class":101},[50,1896,98],{"class":97},[50,1898,107],{"class":85},[50,1900,353],{"class":85},[50,1902,67],{"class":131},[50,1904,135],{"class":85},[50,1906,110],{"class":97},[50,1908,1886],{"class":101},[50,1910,98],{"class":97},[50,1912,144],{"class":85},[50,1914,118],{"class":93},[50,1916,1843],{"class":85},[50,1918,1919,1922,1924],{"class":52,"line":308},[50,1920,1921],{"class":85},"}",[50,1923,118],{"class":93},[50,1925,149],{"class":85},[41,1927,1930],{"className":43,"code":1928,"filename":1929,"language":45,"meta":46,"style":46},"import { created } from '@fougere\u002Fschema';\nimport Post from '.\u002FPost.js';\n\n\u002F**\n * A fact is an entity, and usually a derivation of the one it is about.\n *\n * `pick` keeps its source, so a constraint that moves on `Post` moves here without anyone\n * touching this file. Nothing marks it as a fact: it becomes one because somebody writes\n * `Emit\u003CPostPublished>` — or `Fact\u003CPostPublished>` — about it.\n *\u002F\nexport default class PostPublished extends Post.pick('id', 'title').extend({ at: created() }) {}\n\n","fronds\u002Fblog\u002Fentities\u002FPostPublished.ts",[17,1931,1932,1952,1971,1975,1980,1985,1990,1995,2000,2005,2010],{"__ignoreMap":46},[50,1933,1934,1936,1938,1940,1942,1944,1946,1948,1950],{"class":52,"line":53},[50,1935,1772],{"class":63},[50,1937,353],{"class":85},[50,1939,138],{"class":81},[50,1941,144],{"class":85},[50,1943,1797],{"class":63},[50,1945,110],{"class":97},[50,1947,1802],{"class":101},[50,1949,98],{"class":97},[50,1951,252],{"class":85},[50,1953,1954,1956,1959,1962,1964,1967,1969],{"class":52,"line":60},[50,1955,1772],{"class":63},[50,1957,1958],{"class":81}," Post ",[50,1960,1961],{"class":63},"from",[50,1963,110],{"class":97},[50,1965,1966],{"class":101},".\u002FPost.js",[50,1968,98],{"class":97},[50,1970,252],{"class":85},[50,1972,1973],{"class":52,"line":185},[50,1974,189],{"emptyLinePlaceholder":188},[50,1976,1977],{"class":52,"line":192},[50,1978,1979],{"class":56},"\u002F**\n",[50,1981,1982],{"class":52,"line":221},[50,1983,1984],{"class":56}," * A fact is an entity, and usually a derivation of the one it is about.\n",[50,1986,1987],{"class":52,"line":255},[50,1988,1989],{"class":56}," *\n",[50,1991,1992],{"class":52,"line":308},[50,1993,1994],{"class":56}," * `pick` keeps its source, so a constraint that moves on `Post` moves here without anyone\n",[50,1996,1997],{"class":52,"line":676},[50,1998,1999],{"class":56}," * touching this file. Nothing marks it as a fact: it becomes one because somebody writes\n",[50,2001,2002],{"class":52,"line":1311},[50,2003,2004],{"class":56}," * `Emit\u003CPostPublished>` — or `Fact\u003CPostPublished>` — about it.\n",[50,2006,2007],{"class":52,"line":1317},[50,2008,2009],{"class":56}," *\u002F\n",[50,2011,2012,2014,2016,2018,2020,2022,2024,2026,2028,2030,2032,2034,2036,2038,2040,2042,2044,2046,2048,2050,2052,2054,2056,2058,2060,2062,2064,2066],{"class":52,"line":1323},[50,2013,64],{"class":63},[50,2015,67],{"class":63},[50,2017,71],{"class":70},[50,2019,75],{"class":74},[50,2021,78],{"class":70},[50,2023,82],{"class":81},[50,2025,86],{"class":85},[50,2027,90],{"class":89},[50,2029,94],{"class":93},[50,2031,98],{"class":97},[50,2033,102],{"class":101},[50,2035,98],{"class":97},[50,2037,107],{"class":85},[50,2039,110],{"class":97},[50,2041,113],{"class":101},[50,2043,98],{"class":97},[50,2045,118],{"class":93},[50,2047,86],{"class":85},[50,2049,123],{"class":89},[50,2051,94],{"class":93},[50,2053,128],{"class":85},[50,2055,132],{"class":131},[50,2057,135],{"class":85},[50,2059,138],{"class":89},[50,2061,141],{"class":93},[50,2063,144],{"class":85},[50,2065,118],{"class":93},[50,2067,149],{"class":85},[41,2069,2072],{"className":43,"code":2070,"filename":2071,"language":45,"meta":46,"style":46},"import type { Emit } from '@fougere\u002Fcore';\nimport type PostPublished from '..\u002Fentities\u002FPostPublished.js';\n\n\u002F**\n * The frond that owns publication.\n *\n * It names a SUBJECT, never a recipient. There is no list of interested parties here, and\n * adding a fourth listener will not reopen this file.\n *\u002F\nexport default class PostHandler {\n  constructor(private published: Emit\u003CPostPublished>) {}\n\n  \u002F** Publish a draft, and say so. *\u002F\n  async publish(id: string, title: string): Promise\u003C{ id: string; status: string }> {\n    await this.published({ id, title, at: new Date() });\n\n    return { id, status: 'published' };\n  }\n}\n\n","fronds\u002Fblog\u002Fhandlers\u002FPostHandler.ts",[17,2073,2074,2099,2119,2123,2127,2132,2136,2141,2146,2150,2163,2189,2193,2198,2253,2292,2296,2319,2324],{"__ignoreMap":46},[50,2075,2076,2078,2081,2083,2086,2088,2090,2092,2095,2097],{"class":52,"line":53},[50,2077,1772],{"class":63},[50,2079,2080],{"class":63}," type",[50,2082,353],{"class":85},[50,2084,2085],{"class":81}," Emit",[50,2087,144],{"class":85},[50,2089,1797],{"class":63},[50,2091,110],{"class":97},[50,2093,2094],{"class":101},"@fougere\u002Fcore",[50,2096,98],{"class":97},[50,2098,252],{"class":85},[50,2100,2101,2103,2105,2108,2110,2112,2115,2117],{"class":52,"line":60},[50,2102,1772],{"class":63},[50,2104,2080],{"class":63},[50,2106,2107],{"class":81}," PostPublished ",[50,2109,1961],{"class":63},[50,2111,110],{"class":97},[50,2113,2114],{"class":101},"..\u002Fentities\u002FPostPublished.js",[50,2116,98],{"class":97},[50,2118,252],{"class":85},[50,2120,2121],{"class":52,"line":185},[50,2122,189],{"emptyLinePlaceholder":188},[50,2124,2125],{"class":52,"line":192},[50,2126,1979],{"class":56},[50,2128,2129],{"class":52,"line":221},[50,2130,2131],{"class":56}," * The frond that owns publication.\n",[50,2133,2134],{"class":52,"line":255},[50,2135,1989],{"class":56},[50,2137,2138],{"class":52,"line":308},[50,2139,2140],{"class":56}," * It names a SUBJECT, never a recipient. There is no list of interested parties here, and\n",[50,2142,2143],{"class":52,"line":676},[50,2144,2145],{"class":56}," * adding a fourth listener will not reopen this file.\n",[50,2147,2148],{"class":52,"line":1311},[50,2149,2009],{"class":56},[50,2151,2152,2154,2156,2158,2161],{"class":52,"line":1317},[50,2153,64],{"class":63},[50,2155,67],{"class":63},[50,2157,71],{"class":70},[50,2159,2160],{"class":74}," PostHandler",[50,2162,218],{"class":85},[50,2164,2165,2168,2170,2173,2176,2178,2180,2182,2184,2187],{"class":52,"line":1323},[50,2166,2167],{"class":70},"  constructor",[50,2169,94],{"class":85},[50,2171,2172],{"class":70},"private",[50,2174,2175],{"class":653}," published",[50,2177,135],{"class":85},[50,2179,2085],{"class":74},[50,2181,172],{"class":85},[50,2183,175],{"class":74},[50,2185,2186],{"class":85},">)",[50,2188,149],{"class":85},[50,2190,2191],{"class":52,"line":1328},[50,2192,189],{"emptyLinePlaceholder":188},[50,2194,2195],{"class":52,"line":1334},[50,2196,2197],{"class":56},"  \u002F** Publish a draft, and say so. *\u002F\n",[50,2199,2200,2203,2207,2209,2211,2213,2216,2218,2220,2222,2224,2227,2230,2233,2235,2237,2239,2241,2244,2246,2248,2251],{"class":52,"line":1340},[50,2201,2202],{"class":70},"  async",[50,2204,2206],{"class":2205},"shDkW"," publish",[50,2208,94],{"class":85},[50,2210,102],{"class":653},[50,2212,135],{"class":85},[50,2214,2215],{"class":74}," string",[50,2217,107],{"class":85},[50,2219,287],{"class":653},[50,2221,135],{"class":85},[50,2223,2215],{"class":74},[50,2225,2226],{"class":85},"):",[50,2228,2229],{"class":74}," Promise",[50,2231,2232],{"class":85},"\u003C{",[50,2234,272],{"class":131},[50,2236,135],{"class":85},[50,2238,2215],{"class":74},[50,2240,302],{"class":85},[50,2242,2243],{"class":131}," status",[50,2245,135],{"class":85},[50,2247,2215],{"class":74},[50,2249,2250],{"class":85}," }>",[50,2252,218],{"class":85},[50,2254,2255,2258,2260,2262,2264,2266,2268,2270,2272,2274,2276,2278,2280,2282,2284,2286,2288,2290],{"class":52,"line":1346},[50,2256,2257],{"class":63},"    await",[50,2259,237],{"class":236},[50,2261,86],{"class":85},[50,2263,265],{"class":89},[50,2265,94],{"class":245},[50,2267,128],{"class":85},[50,2269,272],{"class":81},[50,2271,107],{"class":85},[50,2273,287],{"class":81},[50,2275,107],{"class":85},[50,2277,132],{"class":131},[50,2279,135],{"class":85},[50,2281,1525],{"class":85},[50,2283,1529],{"class":1528},[50,2285,141],{"class":245},[50,2287,144],{"class":85},[50,2289,118],{"class":245},[50,2291,252],{"class":85},[50,2293,2294],{"class":52,"line":1351},[50,2295,189],{"emptyLinePlaceholder":188},[50,2297,2298,2301,2303,2305,2307,2309,2311,2313,2315,2317],{"class":52,"line":1360},[50,2299,2300],{"class":63},"    return",[50,2302,353],{"class":85},[50,2304,272],{"class":81},[50,2306,107],{"class":85},[50,2308,2243],{"class":131},[50,2310,135],{"class":85},[50,2312,110],{"class":97},[50,2314,265],{"class":101},[50,2316,98],{"class":97},[50,2318,673],{"class":85},[50,2320,2321],{"class":52,"line":1365},[50,2322,2323],{"class":85},"  }\n",[50,2325,2326],{"class":52,"line":1384},[50,2327,311],{"class":85},[41,2329,2334],{"className":2330,"code":2331,"filename":2332,"language":2333,"meta":46,"style":46},"language-json shiki shiki-themes material-theme-lighter fougere-pastel material-theme-palenight","{\n  \"name\": \"@fronds\u002Fblog\",\n  \"version\": \"0.0.1\",\n  \"type\": \"module\",\n  \"fougere\": {\n    \"frond\": \"blog\"\n  },\n  \"exports\": {\n    \".\u002Fentities\u002F*.js\": \".\u002Fentities\u002F*.ts\",\n    \".\u002Fentities\u002F*\": \".\u002Fentities\u002F*.ts\",\n    \".\u002Fpackage.json\": \".\u002Fpackage.json\"\n  }\n}\n\n","fronds\u002Fblog\u002Fpackage.json","json",[17,2335,2336,2340,2364,2384,2404,2417,2436,2441,2454,2474,2493,2510,2514],{"__ignoreMap":46},[50,2337,2338],{"class":52,"line":53},[50,2339,1829],{"class":85},[50,2341,2342,2345,2349,2352,2354,2357,2360,2362],{"class":52,"line":60},[50,2343,2344],{"class":85},"  \"",[50,2346,2348],{"class":2347},"s8ClO","name",[50,2350,2351],{"class":85},"\"",[50,2353,135],{"class":85},[50,2355,2356],{"class":97}," \"",[50,2358,2359],{"class":101},"@fronds\u002Fblog",[50,2361,2351],{"class":97},[50,2363,1843],{"class":85},[50,2365,2366,2368,2371,2373,2375,2377,2380,2382],{"class":52,"line":185},[50,2367,2344],{"class":85},[50,2369,2370],{"class":2347},"version",[50,2372,2351],{"class":85},[50,2374,135],{"class":85},[50,2376,2356],{"class":97},[50,2378,2379],{"class":101},"0.0.1",[50,2381,2351],{"class":97},[50,2383,1843],{"class":85},[50,2385,2386,2388,2391,2393,2395,2397,2400,2402],{"class":52,"line":192},[50,2387,2344],{"class":85},[50,2389,2390],{"class":2347},"type",[50,2392,2351],{"class":85},[50,2394,135],{"class":85},[50,2396,2356],{"class":97},[50,2398,2399],{"class":101},"module",[50,2401,2351],{"class":97},[50,2403,1843],{"class":85},[50,2405,2406,2408,2411,2413,2415],{"class":52,"line":221},[50,2407,2344],{"class":85},[50,2409,2410],{"class":2347},"fougere",[50,2412,2351],{"class":85},[50,2414,135],{"class":85},[50,2416,218],{"class":85},[50,2418,2419,2422,2425,2427,2429,2431,2433],{"class":52,"line":255},[50,2420,2421],{"class":85},"    \"",[50,2423,945],{"class":2424},"sWI7z",[50,2426,2351],{"class":85},[50,2428,135],{"class":85},[50,2430,2356],{"class":97},[50,2432,765],{"class":101},[50,2434,2435],{"class":97},"\"\n",[50,2437,2438],{"class":52,"line":308},[50,2439,2440],{"class":85},"  },\n",[50,2442,2443,2445,2448,2450,2452],{"class":52,"line":676},[50,2444,2344],{"class":85},[50,2446,2447],{"class":2347},"exports",[50,2449,2351],{"class":85},[50,2451,135],{"class":85},[50,2453,218],{"class":85},[50,2455,2456,2458,2461,2463,2465,2467,2470,2472],{"class":52,"line":1311},[50,2457,2421],{"class":85},[50,2459,2460],{"class":2424},".\u002Fentities\u002F*.js",[50,2462,2351],{"class":85},[50,2464,135],{"class":85},[50,2466,2356],{"class":97},[50,2468,2469],{"class":101},".\u002Fentities\u002F*.ts",[50,2471,2351],{"class":97},[50,2473,1843],{"class":85},[50,2475,2476,2478,2481,2483,2485,2487,2489,2491],{"class":52,"line":1317},[50,2477,2421],{"class":85},[50,2479,2480],{"class":2424},".\u002Fentities\u002F*",[50,2482,2351],{"class":85},[50,2484,135],{"class":85},[50,2486,2356],{"class":97},[50,2488,2469],{"class":101},[50,2490,2351],{"class":97},[50,2492,1843],{"class":85},[50,2494,2495,2497,2500,2502,2504,2506,2508],{"class":52,"line":1323},[50,2496,2421],{"class":85},[50,2498,2499],{"class":2424},".\u002Fpackage.json",[50,2501,2351],{"class":85},[50,2503,135],{"class":85},[50,2505,2356],{"class":97},[50,2507,2499],{"class":101},[50,2509,2435],{"class":97},[50,2511,2512],{"class":52,"line":1328},[50,2513,2323],{"class":85},[50,2515,2516],{"class":52,"line":1334},[50,2517,311],{"class":85},[41,2519,2522],{"className":43,"code":2520,"filename":2521,"language":45,"meta":46,"style":46},"import type { Fact } from '@fougere\u002Fcore';\nimport type PostPublished from '@fronds\u002Fblog\u002Fentities\u002FPostPublished.js';\n\n\u002F**\n * Another frond, owning no row at all — and subscribing to nothing.\n *\n * There is no registration, no topic, no listener list. Accepting a `Fact\u003CPostPublished>`\n * IS the subscription: the scan reads this signature and that is the whole mechanism.\n *\n * `Fact\u003CT>` is also a promise about this method — replayable, nobody reads what it returns,\n * its failures are its own. Push is the strict mode; an op written for it is correct when\n * called directly too.\n *\u002F\nexport default class IndexHandler {\n  \u002F** Re-index a post that has just been published. *\u002F\n  async reindex(fact: Fact\u003CPostPublished>): Promise\u003Cvoid> {\n    console.log(\n      `\\x1b[36m  [search · pid ${process.pid}]\\x1b[0m indexed \\x1b[1m${fact.id}\\x1b[0m — \"${fact.title}\"`,\n    );\n  }\n}\n\n","fronds\u002Fsearch\u002Fhandlers\u002FIndexHandler.ts",[17,2523,2524,2547,2566,2570,2574,2579,2583,2588,2593,2597,2602,2607,2612,2616,2629,2634,2667,2679,2747,2754,2758],{"__ignoreMap":46},[50,2525,2526,2528,2530,2532,2535,2537,2539,2541,2543,2545],{"class":52,"line":53},[50,2527,1772],{"class":63},[50,2529,2080],{"class":63},[50,2531,353],{"class":85},[50,2533,2534],{"class":81}," Fact",[50,2536,144],{"class":85},[50,2538,1797],{"class":63},[50,2540,110],{"class":97},[50,2542,2094],{"class":101},[50,2544,98],{"class":97},[50,2546,252],{"class":85},[50,2548,2549,2551,2553,2555,2557,2559,2562,2564],{"class":52,"line":60},[50,2550,1772],{"class":63},[50,2552,2080],{"class":63},[50,2554,2107],{"class":81},[50,2556,1961],{"class":63},[50,2558,110],{"class":97},[50,2560,2561],{"class":101},"@fronds\u002Fblog\u002Fentities\u002FPostPublished.js",[50,2563,98],{"class":97},[50,2565,252],{"class":85},[50,2567,2568],{"class":52,"line":185},[50,2569,189],{"emptyLinePlaceholder":188},[50,2571,2572],{"class":52,"line":192},[50,2573,1979],{"class":56},[50,2575,2576],{"class":52,"line":221},[50,2577,2578],{"class":56}," * Another frond, owning no row at all — and subscribing to nothing.\n",[50,2580,2581],{"class":52,"line":255},[50,2582,1989],{"class":56},[50,2584,2585],{"class":52,"line":308},[50,2586,2587],{"class":56}," * There is no registration, no topic, no listener list. Accepting a `Fact\u003CPostPublished>`\n",[50,2589,2590],{"class":52,"line":676},[50,2591,2592],{"class":56}," * IS the subscription: the scan reads this signature and that is the whole mechanism.\n",[50,2594,2595],{"class":52,"line":1311},[50,2596,1989],{"class":56},[50,2598,2599],{"class":52,"line":1317},[50,2600,2601],{"class":56}," * `Fact\u003CT>` is also a promise about this method — replayable, nobody reads what it returns,\n",[50,2603,2604],{"class":52,"line":1323},[50,2605,2606],{"class":56}," * its failures are its own. Push is the strict mode; an op written for it is correct when\n",[50,2608,2609],{"class":52,"line":1328},[50,2610,2611],{"class":56}," * called directly too.\n",[50,2613,2614],{"class":52,"line":1334},[50,2615,2009],{"class":56},[50,2617,2618,2620,2622,2624,2627],{"class":52,"line":1340},[50,2619,64],{"class":63},[50,2621,67],{"class":63},[50,2623,71],{"class":70},[50,2625,2626],{"class":74}," IndexHandler",[50,2628,218],{"class":85},[50,2630,2631],{"class":52,"line":1346},[50,2632,2633],{"class":56},"  \u002F** Re-index a post that has just been published. *\u002F\n",[50,2635,2636,2638,2641,2643,2645,2647,2649,2651,2653,2656,2658,2660,2663,2665],{"class":52,"line":1351},[50,2637,2202],{"class":70},[50,2639,2640],{"class":2205}," reindex",[50,2642,94],{"class":85},[50,2644,992],{"class":653},[50,2646,135],{"class":85},[50,2648,2534],{"class":74},[50,2650,172],{"class":85},[50,2652,175],{"class":74},[50,2654,2655],{"class":85},">):",[50,2657,2229],{"class":74},[50,2659,172],{"class":85},[50,2661,2662],{"class":74},"void",[50,2664,178],{"class":85},[50,2666,218],{"class":85},[50,2668,2669,2672,2674,2677],{"class":52,"line":1360},[50,2670,2671],{"class":81},"    console",[50,2673,86],{"class":85},[50,2675,2676],{"class":89},"log",[50,2678,852],{"class":245},[50,2680,2681,2684,2688,2691,2694,2697,2699,2701,2703,2706,2708,2711,2713,2716,2718,2720,2722,2724,2726,2728,2731,2733,2735,2737,2739,2741,2743,2745],{"class":52,"line":1365},[50,2682,2683],{"class":97},"      `",[50,2685,2687],{"class":2686},"sfnqo","\\x1b",[50,2689,2690],{"class":101},"[36m  [search · pid ",[50,2692,2693],{"class":85},"${",[50,2695,2696],{"class":81},"process",[50,2698,86],{"class":85},[50,2700,1376],{"class":282},[50,2702,1921],{"class":85},[50,2704,2705],{"class":101},"]",[50,2707,2687],{"class":2686},[50,2709,2710],{"class":101},"[0m indexed ",[50,2712,2687],{"class":2686},[50,2714,2715],{"class":101},"[1m",[50,2717,2693],{"class":85},[50,2719,992],{"class":81},[50,2721,86],{"class":85},[50,2723,102],{"class":282},[50,2725,1921],{"class":85},[50,2727,2687],{"class":2686},[50,2729,2730],{"class":101},"[0m — \"",[50,2732,2693],{"class":85},[50,2734,992],{"class":81},[50,2736,86],{"class":85},[50,2738,113],{"class":282},[50,2740,1921],{"class":85},[50,2742,2351],{"class":101},[50,2744,1263],{"class":97},[50,2746,1843],{"class":85},[50,2748,2749,2752],{"class":52,"line":1384},[50,2750,2751],{"class":245},"    )",[50,2753,252],{"class":85},[50,2755,2756],{"class":52,"line":1390},[50,2757,2323],{"class":85},[50,2759,2760],{"class":52,"line":1395},[50,2761,311],{"class":85},[41,2763,2765],{"className":43,"code":2764,"filename":1234,"language":45,"meta":46,"style":46},"\u002F**\n * The same emission, twice: in this process, then across a wire.\n *\n * `PostHandler` is not read twice and not compiled twice. `remotes:` is the whole\n * difference between the two runs below — one line of deployment, zero lines of domain.\n *\n *   terminal 1   pnpm dev:search\n *   terminal 2   pnpm dev\n *\u002F\nimport { createApp, createLocalRunner } from '@fougere\u002Fcore';\nimport { appOptionsOf } from '@fougere\u002Fdefaults';\nimport { frondAliases, setModuleLoader } from '@fougere\u002Fcore\u002Fnode';\nimport type { App, InvocationContext } from '@fougere\u002Fcore';\nimport { createContainer } from '@fougere\u002Fcontainer';\nimport { createHttpTransport } from '@fougere\u002Ftransport-http';\n\nconst SEARCH = `http:\u002F\u002F127.0.0.1:${process.env.PORT ?? 4210}`;\n\nconst inv = (params: Record\u003Cstring, string>): InvocationContext =>\n  ({ params, query: {}, input: undefined, state: {} });\n\n\u002F** Dispatch is not delivery — the emitter returns before its listeners are done. *\u002F\nconst settle = () => new Promise((r) => setTimeout(r, 300));\n\nasync function publish(app: App, id: string, title: string) {\n  return createLocalRunner(app)({ address: 'post', op: 'publish' }, inv({ id, title }));\n}\n\nfunction title(n: string, text: string) {\n  console.log(`\\n\\x1b[1m${n}\\x1b[0m ${text}`);\n}\n\nasync function main() {\n  const { createJiti } = await import('jiti');\n  const jiti = createJiti(import.meta.url, {\n    interopDefault: true,\n    \u002F\u002F `@fronds\u002F\u003Cname>` is how a frond names its neighbour; the loader has to know it.\n    alias: await frondAliases(import.meta.dirname),\n  });\n  setModuleLoader((path) => jiti.import(path) as Promise\u003CRecord\u003Cstring, unknown>>);\n\n  title('1.', 'Both fronds in THIS process — nothing is declared, nothing is registered');\n\n  const together = await createApp({ ...(await appOptionsOf(import.meta.dirname)), createContainer });\n  console.log(await publish(together, 'p1', 'Ferns are not plants that give up'));\n  await settle();\n\n  title('2.', `search declared remote — remotes: { search: '${SEARCH}' }`);\n  console.log('   the SAME PostHandler, unchanged. Watch the other terminal.\\n');\n\n  const split = await createApp({\n    ...(await appOptionsOf(import.meta.dirname)),\n    createContainer,\n    \u002F\u002F The whole topology statement. `search\u002F` still sits on disk — it is scanned, so the\n    \u002F\u002F emitter knows its signature; it is simply not hosted here.\n    remotes: { search: SEARCH },\n    remoteTransport: createHttpTransport,\n  });\n  console.log(await publish(split, 'p2', 'A frond is a leaf that repeats itself'));\n  await settle();\n\n  console.log('\\n\\x1b[2m  Same emitter, two topologies. The fact found its listener both times.\\x1b[0m\\n');\n  await together[Symbol.asyncDispose]?.();\n  await split[Symbol.asyncDispose]?.();\n}\n\nmain().catch((err) => { console.error(err); process.exit(1); });\n\n",[17,2766,2767,2771,2776,2780,2785,2790,2794,2799,2804,2808,2834,2856,2883,2911,2933,2955,2959,3001,3005,3042,3086,3090,3095,3141,3145,3184,3245,3249,3253,3281,3322,3326,3330,3343,3374,3403,3416,3421,3449,3458,3512,3516,3542,3546,3596,3637,3647,3651,3687,3711,3715,3732,3759,3766,3771,3776,3796,3807,3816,3858,3869,3874,3905,3931,3954,3959,3964],{"__ignoreMap":46},[50,2768,2769],{"class":52,"line":53},[50,2770,1979],{"class":56},[50,2772,2773],{"class":52,"line":60},[50,2774,2775],{"class":56}," * The same emission, twice: in this process, then across a wire.\n",[50,2777,2778],{"class":52,"line":185},[50,2779,1989],{"class":56},[50,2781,2782],{"class":52,"line":192},[50,2783,2784],{"class":56}," * `PostHandler` is not read twice and not compiled twice. `remotes:` is the whole\n",[50,2786,2787],{"class":52,"line":221},[50,2788,2789],{"class":56}," * difference between the two runs below — one line of deployment, zero lines of domain.\n",[50,2791,2792],{"class":52,"line":255},[50,2793,1989],{"class":56},[50,2795,2796],{"class":52,"line":308},[50,2797,2798],{"class":56}," *   terminal 1   pnpm dev:search\n",[50,2800,2801],{"class":52,"line":676},[50,2802,2803],{"class":56}," *   terminal 2   pnpm dev\n",[50,2805,2806],{"class":52,"line":1311},[50,2807,2009],{"class":56},[50,2809,2810,2812,2814,2817,2819,2822,2824,2826,2828,2830,2832],{"class":52,"line":1317},[50,2811,1772],{"class":63},[50,2813,353],{"class":85},[50,2815,2816],{"class":81}," createApp",[50,2818,107],{"class":85},[50,2820,2821],{"class":81}," createLocalRunner",[50,2823,144],{"class":85},[50,2825,1797],{"class":63},[50,2827,110],{"class":97},[50,2829,2094],{"class":101},[50,2831,98],{"class":97},[50,2833,252],{"class":85},[50,2835,2836,2838,2840,2843,2845,2847,2849,2852,2854],{"class":52,"line":1323},[50,2837,1772],{"class":63},[50,2839,353],{"class":85},[50,2841,2842],{"class":81}," appOptionsOf",[50,2844,144],{"class":85},[50,2846,1797],{"class":63},[50,2848,110],{"class":97},[50,2850,2851],{"class":101},"@fougere\u002Fdefaults",[50,2853,98],{"class":97},[50,2855,252],{"class":85},[50,2857,2858,2860,2862,2865,2867,2870,2872,2874,2876,2879,2881],{"class":52,"line":1328},[50,2859,1772],{"class":63},[50,2861,353],{"class":85},[50,2863,2864],{"class":81}," frondAliases",[50,2866,107],{"class":85},[50,2868,2869],{"class":81}," setModuleLoader",[50,2871,144],{"class":85},[50,2873,1797],{"class":63},[50,2875,110],{"class":97},[50,2877,2878],{"class":101},"@fougere\u002Fcore\u002Fnode",[50,2880,98],{"class":97},[50,2882,252],{"class":85},[50,2884,2885,2887,2889,2891,2894,2896,2899,2901,2903,2905,2907,2909],{"class":52,"line":1334},[50,2886,1772],{"class":63},[50,2888,2080],{"class":63},[50,2890,353],{"class":85},[50,2892,2893],{"class":81}," App",[50,2895,107],{"class":85},[50,2897,2898],{"class":81}," InvocationContext",[50,2900,144],{"class":85},[50,2902,1797],{"class":63},[50,2904,110],{"class":97},[50,2906,2094],{"class":101},[50,2908,98],{"class":97},[50,2910,252],{"class":85},[50,2912,2913,2915,2917,2920,2922,2924,2926,2929,2931],{"class":52,"line":1340},[50,2914,1772],{"class":63},[50,2916,353],{"class":85},[50,2918,2919],{"class":81}," createContainer",[50,2921,144],{"class":85},[50,2923,1797],{"class":63},[50,2925,110],{"class":97},[50,2927,2928],{"class":101},"@fougere\u002Fcontainer",[50,2930,98],{"class":97},[50,2932,252],{"class":85},[50,2934,2935,2937,2939,2942,2944,2946,2948,2951,2953],{"class":52,"line":1346},[50,2936,1772],{"class":63},[50,2938,353],{"class":85},[50,2940,2941],{"class":81}," createHttpTransport",[50,2943,144],{"class":85},[50,2945,1797],{"class":63},[50,2947,110],{"class":97},[50,2949,2950],{"class":101},"@fougere\u002Ftransport-http",[50,2952,98],{"class":97},[50,2954,252],{"class":85},[50,2956,2957],{"class":52,"line":1351},[50,2958,189],{"emptyLinePlaceholder":188},[50,2960,2961,2964,2967,2970,2972,2975,2977,2979,2981,2984,2986,2989,2992,2995,2997,2999],{"class":52,"line":1360},[50,2962,2963],{"class":70},"const",[50,2965,2966],{"class":81}," SEARCH ",[50,2968,2969],{"class":85},"=",[50,2971,1702],{"class":97},[50,2973,2974],{"class":101},"http:\u002F\u002F127.0.0.1:",[50,2976,2693],{"class":85},[50,2978,2696],{"class":81},[50,2980,86],{"class":85},[50,2982,2983],{"class":282},"env",[50,2985,86],{"class":85},[50,2987,2988],{"class":282},"PORT",[50,2990,2991],{"class":85}," ??",[50,2993,2994],{"class":635}," 4210",[50,2996,1921],{"class":85},[50,2998,1263],{"class":97},[50,3000,252],{"class":85},[50,3002,3003],{"class":52,"line":1365},[50,3004,189],{"emptyLinePlaceholder":188},[50,3006,3007,3009,3013,3015,3018,3021,3023,3026,3028,3031,3033,3035,3037,3039],{"class":52,"line":1384},[50,3008,2963],{"class":70},[50,3010,3012],{"class":3011},"slP7D"," inv",[50,3014,230],{"class":85},[50,3016,3017],{"class":85}," (",[50,3019,3020],{"class":653},"params",[50,3022,135],{"class":85},[50,3024,3025],{"class":74}," Record",[50,3027,172],{"class":85},[50,3029,3030],{"class":74},"string",[50,3032,107],{"class":85},[50,3034,2215],{"class":74},[50,3036,2655],{"class":85},[50,3038,2898],{"class":74},[50,3040,3041],{"class":659}," =>\n",[50,3043,3044,3047,3049,3052,3054,3057,3059,3062,3065,3067,3070,3072,3075,3077,3080,3082,3084],{"class":52,"line":1390},[50,3045,3046],{"class":93},"  (",[50,3048,128],{"class":85},[50,3050,3051],{"class":81}," params",[50,3053,107],{"class":85},[50,3055,3056],{"class":131}," query",[50,3058,135],{"class":85},[50,3060,3061],{"class":85}," {},",[50,3063,3064],{"class":131}," input",[50,3066,135],{"class":85},[50,3068,3069],{"class":97}," undefined",[50,3071,107],{"class":85},[50,3073,3074],{"class":131}," state",[50,3076,135],{"class":85},[50,3078,3079],{"class":85}," {}",[50,3081,144],{"class":85},[50,3083,118],{"class":93},[50,3085,252],{"class":85},[50,3087,3088],{"class":52,"line":1395},[50,3089,189],{"emptyLinePlaceholder":188},[50,3091,3092],{"class":52,"line":1400},[50,3093,3094],{"class":56},"\u002F** Dispatch is not delivery — the emitter returns before its listeners are done. *\u002F\n",[50,3096,3097,3099,3102,3104,3107,3109,3111,3113,3115,3117,3120,3122,3124,3127,3129,3131,3133,3136,3139],{"class":52,"line":1406},[50,3098,2963],{"class":70},[50,3100,3101],{"class":3011}," settle",[50,3103,230],{"class":85},[50,3105,3106],{"class":85}," ()",[50,3108,660],{"class":659},[50,3110,1525],{"class":85},[50,3112,2229],{"class":74},[50,3114,94],{"class":93},[50,3116,94],{"class":85},[50,3118,3119],{"class":653},"r",[50,3121,118],{"class":85},[50,3123,660],{"class":659},[50,3125,3126],{"class":1528}," setTimeout",[50,3128,94],{"class":93},[50,3130,3119],{"class":81},[50,3132,107],{"class":85},[50,3134,3135],{"class":635}," 300",[50,3137,3138],{"class":93},"))",[50,3140,252],{"class":85},[50,3142,3143],{"class":52,"line":1412},[50,3144,189],{"emptyLinePlaceholder":188},[50,3146,3147,3150,3153,3155,3157,3160,3162,3164,3166,3168,3170,3172,3174,3176,3178,3180,3182],{"class":52,"line":1417},[50,3148,3149],{"class":70},"async",[50,3151,3152],{"class":70}," function",[50,3154,2206],{"class":89},[50,3156,94],{"class":85},[50,3158,3159],{"class":653},"app",[50,3161,135],{"class":85},[50,3163,2893],{"class":74},[50,3165,107],{"class":85},[50,3167,272],{"class":653},[50,3169,135],{"class":85},[50,3171,2215],{"class":74},[50,3173,107],{"class":85},[50,3175,287],{"class":653},[50,3177,135],{"class":85},[50,3179,2215],{"class":74},[50,3181,118],{"class":85},[50,3183,218],{"class":85},[50,3185,3186,3188,3190,3192,3194,3197,3199,3202,3204,3206,3209,3211,3213,3216,3218,3220,3222,3224,3227,3229,3231,3233,3235,3237,3239,3241,3243],{"class":52,"line":1423},[50,3187,611],{"class":63},[50,3189,2821],{"class":89},[50,3191,94],{"class":245},[50,3193,3159],{"class":81},[50,3195,3196],{"class":245},")(",[50,3198,128],{"class":85},[50,3200,3201],{"class":131}," address",[50,3203,135],{"class":85},[50,3205,110],{"class":97},[50,3207,3208],{"class":101},"post",[50,3210,98],{"class":97},[50,3212,107],{"class":85},[50,3214,3215],{"class":131}," op",[50,3217,135],{"class":85},[50,3219,110],{"class":97},[50,3221,198],{"class":101},[50,3223,98],{"class":97},[50,3225,3226],{"class":85}," },",[50,3228,3012],{"class":89},[50,3230,94],{"class":245},[50,3232,128],{"class":85},[50,3234,272],{"class":81},[50,3236,107],{"class":85},[50,3238,287],{"class":81},[50,3240,144],{"class":85},[50,3242,3138],{"class":245},[50,3244,252],{"class":85},[50,3246,3247],{"class":52,"line":1429},[50,3248,311],{"class":85},[50,3250,3251],{"class":52,"line":1435},[50,3252,189],{"emptyLinePlaceholder":188},[50,3254,3255,3258,3260,3262,3265,3267,3269,3271,3273,3275,3277,3279],{"class":52,"line":1441},[50,3256,3257],{"class":70},"function",[50,3259,287],{"class":89},[50,3261,94],{"class":85},[50,3263,3264],{"class":653},"n",[50,3266,135],{"class":85},[50,3268,2215],{"class":74},[50,3270,107],{"class":85},[50,3272,1787],{"class":653},[50,3274,135],{"class":85},[50,3276,2215],{"class":74},[50,3278,118],{"class":85},[50,3280,218],{"class":85},[50,3282,3283,3286,3288,3290,3292,3294,3297,3299,3301,3303,3305,3307,3310,3312,3314,3316,3318,3320],{"class":52,"line":1446},[50,3284,3285],{"class":81},"  console",[50,3287,86],{"class":85},[50,3289,2676],{"class":89},[50,3291,94],{"class":245},[50,3293,1263],{"class":97},[50,3295,3296],{"class":2686},"\\n\\x1b",[50,3298,2715],{"class":101},[50,3300,2693],{"class":85},[50,3302,3264],{"class":81},[50,3304,1921],{"class":85},[50,3306,2687],{"class":2686},[50,3308,3309],{"class":101},"[0m ",[50,3311,2693],{"class":85},[50,3313,818],{"class":81},[50,3315,1921],{"class":85},[50,3317,1263],{"class":97},[50,3319,118],{"class":245},[50,3321,252],{"class":85},[50,3323,3324],{"class":52,"line":1451},[50,3325,311],{"class":85},[50,3327,3328],{"class":52,"line":1459},[50,3329,189],{"emptyLinePlaceholder":188},[50,3331,3332,3334,3336,3339,3341],{"class":52,"line":1464},[50,3333,3149],{"class":70},[50,3335,3152],{"class":70},[50,3337,3338],{"class":89}," main",[50,3340,141],{"class":85},[50,3342,218],{"class":85},[50,3344,3345,3347,3349,3352,3354,3356,3358,3361,3363,3365,3368,3370,3372],{"class":52,"line":1472},[50,3346,224],{"class":70},[50,3348,353],{"class":85},[50,3350,3351],{"class":81}," createJiti",[50,3353,144],{"class":85},[50,3355,230],{"class":85},[50,3357,233],{"class":63},[50,3359,3360],{"class":85}," import",[50,3362,94],{"class":245},[50,3364,98],{"class":97},[50,3366,3367],{"class":101},"jiti",[50,3369,98],{"class":97},[50,3371,118],{"class":245},[50,3373,252],{"class":85},[50,3375,3376,3378,3381,3383,3385,3387,3389,3391,3394,3396,3399,3401],{"class":52,"line":1478},[50,3377,224],{"class":70},[50,3379,3380],{"class":81}," jiti",[50,3382,230],{"class":85},[50,3384,3351],{"class":89},[50,3386,94],{"class":245},[50,3388,1772],{"class":63},[50,3390,86],{"class":85},[50,3392,3393],{"class":282},"meta",[50,3395,86],{"class":85},[50,3397,3398],{"class":282},"url",[50,3400,107],{"class":85},[50,3402,218],{"class":85},[50,3404,3405,3408,3410,3414],{"class":52,"line":1497},[50,3406,3407],{"class":131},"    interopDefault",[50,3409,135],{"class":85},[50,3411,3413],{"class":3412},"slmMI"," true",[50,3415,1843],{"class":85},[50,3417,3418],{"class":52,"line":1540},[50,3419,3420],{"class":56},"    \u002F\u002F `@fronds\u002F\u003Cname>` is how a frond names its neighbour; the loader has to know it.\n",[50,3422,3423,3426,3428,3430,3432,3434,3436,3438,3440,3442,3445,3447],{"class":52,"line":1545},[50,3424,3425],{"class":131},"    alias",[50,3427,135],{"class":85},[50,3429,233],{"class":63},[50,3431,2864],{"class":89},[50,3433,94],{"class":245},[50,3435,1772],{"class":63},[50,3437,86],{"class":85},[50,3439,3393],{"class":282},[50,3441,86],{"class":85},[50,3443,3444],{"class":282},"dirname",[50,3446,118],{"class":245},[50,3448,1843],{"class":85},[50,3450,3451,3454,3456],{"class":52,"line":1551},[50,3452,3453],{"class":85},"  }",[50,3455,118],{"class":245},[50,3457,252],{"class":85},[50,3459,3460,3463,3465,3467,3470,3472,3474,3476,3478,3480,3482,3484,3486,3489,3491,3493,3496,3498,3500,3502,3505,3508,3510],{"class":52,"line":1582},[50,3461,3462],{"class":89},"  setModuleLoader",[50,3464,94],{"class":245},[50,3466,94],{"class":85},[50,3468,3469],{"class":653},"path",[50,3471,118],{"class":85},[50,3473,660],{"class":659},[50,3475,3380],{"class":81},[50,3477,86],{"class":85},[50,3479,1772],{"class":89},[50,3481,94],{"class":245},[50,3483,3469],{"class":81},[50,3485,118],{"class":245},[50,3487,3488],{"class":63}," as",[50,3490,2229],{"class":74},[50,3492,172],{"class":85},[50,3494,3495],{"class":74},"Record",[50,3497,172],{"class":85},[50,3499,3030],{"class":74},[50,3501,107],{"class":85},[50,3503,3504],{"class":74}," unknown",[50,3506,3507],{"class":85},">>",[50,3509,118],{"class":245},[50,3511,252],{"class":85},[50,3513,3514],{"class":52,"line":1587},[50,3515,189],{"emptyLinePlaceholder":188},[50,3517,3518,3520,3522,3524,3527,3529,3531,3533,3536,3538,3540],{"class":52,"line":1592},[50,3519,1848],{"class":89},[50,3521,94],{"class":245},[50,3523,98],{"class":97},[50,3525,3526],{"class":101},"1.",[50,3528,98],{"class":97},[50,3530,107],{"class":85},[50,3532,110],{"class":97},[50,3534,3535],{"class":101},"Both fronds in THIS process — nothing is declared, nothing is registered",[50,3537,98],{"class":97},[50,3539,118],{"class":245},[50,3541,252],{"class":85},[50,3543,3544],{"class":52,"line":1607},[50,3545,189],{"emptyLinePlaceholder":188},[50,3547,3548,3550,3553,3555,3557,3559,3561,3563,3566,3568,3570,3572,3574,3576,3578,3580,3582,3584,3586,3588,3590,3592,3594],{"class":52,"line":1613},[50,3549,224],{"class":70},[50,3551,3552],{"class":81}," together",[50,3554,230],{"class":85},[50,3556,233],{"class":63},[50,3558,2816],{"class":89},[50,3560,94],{"class":245},[50,3562,128],{"class":85},[50,3564,3565],{"class":85}," ...",[50,3567,94],{"class":245},[50,3569,1500],{"class":63},[50,3571,2842],{"class":89},[50,3573,94],{"class":245},[50,3575,1772],{"class":63},[50,3577,86],{"class":85},[50,3579,3393],{"class":282},[50,3581,86],{"class":85},[50,3583,3444],{"class":282},[50,3585,3138],{"class":245},[50,3587,107],{"class":85},[50,3589,2919],{"class":81},[50,3591,144],{"class":85},[50,3593,118],{"class":245},[50,3595,252],{"class":85},[50,3597,3598,3600,3602,3604,3606,3608,3610,3612,3615,3617,3619,3622,3624,3626,3628,3631,3633,3635],{"class":52,"line":1627},[50,3599,3285],{"class":81},[50,3601,86],{"class":85},[50,3603,2676],{"class":89},[50,3605,94],{"class":245},[50,3607,1500],{"class":63},[50,3609,2206],{"class":89},[50,3611,94],{"class":245},[50,3613,3614],{"class":81},"together",[50,3616,107],{"class":85},[50,3618,110],{"class":97},[50,3620,3621],{"class":101},"p1",[50,3623,98],{"class":97},[50,3625,107],{"class":85},[50,3627,110],{"class":97},[50,3629,3630],{"class":101},"Ferns are not plants that give up",[50,3632,98],{"class":97},[50,3634,3138],{"class":245},[50,3636,252],{"class":85},[50,3638,3639,3641,3643,3645],{"class":52,"line":1632},[50,3640,258],{"class":63},[50,3642,3101],{"class":89},[50,3644,141],{"class":245},[50,3646,252],{"class":85},[50,3648,3649],{"class":52,"line":1658},[50,3650,189],{"emptyLinePlaceholder":188},[50,3652,3653,3655,3657,3659,3662,3664,3666,3668,3671,3673,3676,3678,3681,3683,3685],{"class":52,"line":1664},[50,3654,1848],{"class":89},[50,3656,94],{"class":245},[50,3658,98],{"class":97},[50,3660,3661],{"class":101},"2.",[50,3663,98],{"class":97},[50,3665,107],{"class":85},[50,3667,1702],{"class":97},[50,3669,3670],{"class":101},"search declared remote — remotes: { search: '",[50,3672,2693],{"class":85},[50,3674,3675],{"class":81},"SEARCH",[50,3677,1921],{"class":85},[50,3679,3680],{"class":101},"' }",[50,3682,1263],{"class":97},[50,3684,118],{"class":245},[50,3686,252],{"class":85},[50,3688,3689,3691,3693,3695,3697,3699,3702,3705,3707,3709],{"class":52,"line":1670},[50,3690,3285],{"class":81},[50,3692,86],{"class":85},[50,3694,2676],{"class":89},[50,3696,94],{"class":245},[50,3698,98],{"class":97},[50,3700,3701],{"class":101},"   the SAME PostHandler, unchanged. Watch the other terminal.",[50,3703,3704],{"class":2686},"\\n",[50,3706,98],{"class":97},[50,3708,118],{"class":245},[50,3710,252],{"class":85},[50,3712,3713],{"class":52,"line":1675},[50,3714,189],{"emptyLinePlaceholder":188},[50,3716,3717,3719,3722,3724,3726,3728,3730],{"class":52,"line":1683},[50,3718,224],{"class":70},[50,3720,3721],{"class":81}," split",[50,3723,230],{"class":85},[50,3725,233],{"class":63},[50,3727,2816],{"class":89},[50,3729,94],{"class":245},[50,3731,1829],{"class":85},[50,3733,3734,3737,3739,3741,3743,3745,3747,3749,3751,3753,3755,3757],{"class":52,"line":1688},[50,3735,3736],{"class":85},"    ...",[50,3738,94],{"class":245},[50,3740,1500],{"class":63},[50,3742,2842],{"class":89},[50,3744,94],{"class":245},[50,3746,1772],{"class":63},[50,3748,86],{"class":85},[50,3750,3393],{"class":282},[50,3752,86],{"class":85},[50,3754,3444],{"class":282},[50,3756,3138],{"class":245},[50,3758,1843],{"class":85},[50,3760,3761,3764],{"class":52,"line":1725},[50,3762,3763],{"class":81},"    createContainer",[50,3765,1843],{"class":85},[50,3767,3768],{"class":52,"line":1731},[50,3769,3770],{"class":56},"    \u002F\u002F The whole topology statement. `search\u002F` still sits on disk — it is scanned, so the\n",[50,3772,3773],{"class":52,"line":1737},[50,3774,3775],{"class":56},"    \u002F\u002F emitter knows its signature; it is simply not hosted here.\n",[50,3777,3778,3781,3783,3785,3788,3790,3793],{"class":52,"line":1743},[50,3779,3780],{"class":131},"    remotes",[50,3782,135],{"class":85},[50,3784,353],{"class":85},[50,3786,3787],{"class":131}," search",[50,3789,135],{"class":85},[50,3791,3792],{"class":81}," SEARCH",[50,3794,3795],{"class":85}," },\n",[50,3797,3798,3801,3803,3805],{"class":52,"line":1758},[50,3799,3800],{"class":131},"    remoteTransport",[50,3802,135],{"class":85},[50,3804,2941],{"class":81},[50,3806,1843],{"class":85},[50,3808,3810,3812,3814],{"class":52,"line":3809},58,[50,3811,3453],{"class":85},[50,3813,118],{"class":245},[50,3815,252],{"class":85},[50,3817,3819,3821,3823,3825,3827,3829,3831,3833,3836,3838,3840,3843,3845,3847,3849,3852,3854,3856],{"class":52,"line":3818},59,[50,3820,3285],{"class":81},[50,3822,86],{"class":85},[50,3824,2676],{"class":89},[50,3826,94],{"class":245},[50,3828,1500],{"class":63},[50,3830,2206],{"class":89},[50,3832,94],{"class":245},[50,3834,3835],{"class":81},"split",[50,3837,107],{"class":85},[50,3839,110],{"class":97},[50,3841,3842],{"class":101},"p2",[50,3844,98],{"class":97},[50,3846,107],{"class":85},[50,3848,110],{"class":97},[50,3850,3851],{"class":101},"A frond is a leaf that repeats itself",[50,3853,98],{"class":97},[50,3855,3138],{"class":245},[50,3857,252],{"class":85},[50,3859,3861,3863,3865,3867],{"class":52,"line":3860},60,[50,3862,258],{"class":63},[50,3864,3101],{"class":89},[50,3866,141],{"class":245},[50,3868,252],{"class":85},[50,3870,3872],{"class":52,"line":3871},61,[50,3873,189],{"emptyLinePlaceholder":188},[50,3875,3877,3879,3881,3883,3885,3887,3889,3892,3894,3897,3899,3901,3903],{"class":52,"line":3876},62,[50,3878,3285],{"class":81},[50,3880,86],{"class":85},[50,3882,2676],{"class":89},[50,3884,94],{"class":245},[50,3886,98],{"class":97},[50,3888,3296],{"class":2686},[50,3890,3891],{"class":101},"[2m  Same emitter, two topologies. The fact found its listener both times.",[50,3893,2687],{"class":2686},[50,3895,3896],{"class":101},"[0m",[50,3898,3704],{"class":2686},[50,3900,98],{"class":97},[50,3902,118],{"class":245},[50,3904,252],{"class":85},[50,3906,3908,3910,3912,3914,3917,3919,3922,3924,3927,3929],{"class":52,"line":3907},63,[50,3909,258],{"class":63},[50,3911,3552],{"class":81},[50,3913,206],{"class":245},[50,3915,3916],{"class":81},"Symbol",[50,3918,86],{"class":85},[50,3920,3921],{"class":282},"asyncDispose",[50,3923,2705],{"class":245},[50,3925,3926],{"class":85},"?.",[50,3928,141],{"class":245},[50,3930,252],{"class":85},[50,3932,3934,3936,3938,3940,3942,3944,3946,3948,3950,3952],{"class":52,"line":3933},64,[50,3935,258],{"class":63},[50,3937,3721],{"class":81},[50,3939,206],{"class":245},[50,3941,3916],{"class":81},[50,3943,86],{"class":85},[50,3945,3921],{"class":282},[50,3947,2705],{"class":245},[50,3949,3926],{"class":85},[50,3951,141],{"class":245},[50,3953,252],{"class":85},[50,3955,3957],{"class":52,"line":3956},65,[50,3958,311],{"class":85},[50,3960,3962],{"class":52,"line":3961},66,[50,3963,189],{"emptyLinePlaceholder":188},[50,3965,3967,3970,3972,3974,3977,3979,3981,3984,3986,3988,3990,3993,3995,3998,4000,4002,4004,4006,4009,4011,4014,4016,4019,4021,4023,4025,4027],{"class":52,"line":3966},67,[50,3968,3969],{"class":89},"main",[50,3971,141],{"class":93},[50,3973,86],{"class":85},[50,3975,3976],{"class":89},"catch",[50,3978,94],{"class":93},[50,3980,94],{"class":85},[50,3982,3983],{"class":653},"err",[50,3985,118],{"class":85},[50,3987,660],{"class":659},[50,3989,353],{"class":85},[50,3991,3992],{"class":81}," console",[50,3994,86],{"class":85},[50,3996,3997],{"class":89},"error",[50,3999,94],{"class":245},[50,4001,3983],{"class":81},[50,4003,118],{"class":245},[50,4005,302],{"class":85},[50,4007,4008],{"class":81}," process",[50,4010,86],{"class":85},[50,4012,4013],{"class":89},"exit",[50,4015,94],{"class":245},[50,4017,4018],{"class":635},"1",[50,4020,118],{"class":245},[50,4022,302],{"class":85},[50,4024,144],{"class":85},[50,4026,118],{"class":93},[50,4028,252],{"class":85},[41,4030,4033],{"className":2330,"code":4031,"filename":4032,"language":2333,"meta":46,"style":46},"{\n  \"name\": \"emit-split\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"scripts\": {\n    \"dev:search\": \"tsx search.ts\",\n    \"dev\": \"tsx main.ts\",\n    \"typecheck\": \"tsc --noEmit -p .\"\n  },\n  \"dependencies\": {\n    \"@fougere\u002Fdefaults\": \"^0.30.0-alpha.5\",\n    \"@fougere\u002Fcore\": \"^0.30.0-alpha.5\",\n    \"@fougere\u002Fschema\": \"^0.30.0-alpha.5\",\n    \"@fougere\u002Ftransport-http\": \"^0.30.0-alpha.5\",\n    \"jiti\": \"^2.0.0\",\n    \"@fougere\u002Fcontainer\": \"^0.30.0-alpha.5\",\n    \"@fougere\u002Fcompiler\": \"^0.30.0-alpha.5\"\n  },\n  \"devDependencies\": {\n    \"tsx\": \"^4.0.0\"\n  }\n}\n\n","package.json",[17,4034,4035,4039,4057,4071,4089,4102,4122,4142,4160,4164,4177,4196,4214,4232,4250,4269,4287,4304,4308,4321,4339,4343],{"__ignoreMap":46},[50,4036,4037],{"class":52,"line":53},[50,4038,1829],{"class":85},[50,4040,4041,4043,4045,4047,4049,4051,4053,4055],{"class":52,"line":60},[50,4042,2344],{"class":85},[50,4044,2348],{"class":2347},[50,4046,2351],{"class":85},[50,4048,135],{"class":85},[50,4050,2356],{"class":97},[50,4052,779],{"class":101},[50,4054,2351],{"class":97},[50,4056,1843],{"class":85},[50,4058,4059,4061,4063,4065,4067,4069],{"class":52,"line":185},[50,4060,2344],{"class":85},[50,4062,2172],{"class":2347},[50,4064,2351],{"class":85},[50,4066,135],{"class":85},[50,4068,3413],{"class":97},[50,4070,1843],{"class":85},[50,4072,4073,4075,4077,4079,4081,4083,4085,4087],{"class":52,"line":192},[50,4074,2344],{"class":85},[50,4076,2390],{"class":2347},[50,4078,2351],{"class":85},[50,4080,135],{"class":85},[50,4082,2356],{"class":97},[50,4084,2399],{"class":101},[50,4086,2351],{"class":97},[50,4088,1843],{"class":85},[50,4090,4091,4093,4096,4098,4100],{"class":52,"line":221},[50,4092,2344],{"class":85},[50,4094,4095],{"class":2347},"scripts",[50,4097,2351],{"class":85},[50,4099,135],{"class":85},[50,4101,218],{"class":85},[50,4103,4104,4106,4109,4111,4113,4115,4118,4120],{"class":52,"line":255},[50,4105,2421],{"class":85},[50,4107,4108],{"class":2424},"dev:search",[50,4110,2351],{"class":85},[50,4112,135],{"class":85},[50,4114,2356],{"class":97},[50,4116,4117],{"class":101},"tsx search.ts",[50,4119,2351],{"class":97},[50,4121,1843],{"class":85},[50,4123,4124,4126,4129,4131,4133,4135,4138,4140],{"class":52,"line":308},[50,4125,2421],{"class":85},[50,4127,4128],{"class":2424},"dev",[50,4130,2351],{"class":85},[50,4132,135],{"class":85},[50,4134,2356],{"class":97},[50,4136,4137],{"class":101},"tsx main.ts",[50,4139,2351],{"class":97},[50,4141,1843],{"class":85},[50,4143,4144,4146,4149,4151,4153,4155,4158],{"class":52,"line":676},[50,4145,2421],{"class":85},[50,4147,4148],{"class":2424},"typecheck",[50,4150,2351],{"class":85},[50,4152,135],{"class":85},[50,4154,2356],{"class":97},[50,4156,4157],{"class":101},"tsc --noEmit -p .",[50,4159,2435],{"class":97},[50,4161,4162],{"class":52,"line":1311},[50,4163,2440],{"class":85},[50,4165,4166,4168,4171,4173,4175],{"class":52,"line":1317},[50,4167,2344],{"class":85},[50,4169,4170],{"class":2347},"dependencies",[50,4172,2351],{"class":85},[50,4174,135],{"class":85},[50,4176,218],{"class":85},[50,4178,4179,4181,4183,4185,4187,4189,4192,4194],{"class":52,"line":1323},[50,4180,2421],{"class":85},[50,4182,2851],{"class":2424},[50,4184,2351],{"class":85},[50,4186,135],{"class":85},[50,4188,2356],{"class":97},[50,4190,4191],{"class":101},"^0.30.0-alpha.5",[50,4193,2351],{"class":97},[50,4195,1843],{"class":85},[50,4197,4198,4200,4202,4204,4206,4208,4210,4212],{"class":52,"line":1328},[50,4199,2421],{"class":85},[50,4201,2094],{"class":2424},[50,4203,2351],{"class":85},[50,4205,135],{"class":85},[50,4207,2356],{"class":97},[50,4209,4191],{"class":101},[50,4211,2351],{"class":97},[50,4213,1843],{"class":85},[50,4215,4216,4218,4220,4222,4224,4226,4228,4230],{"class":52,"line":1334},[50,4217,2421],{"class":85},[50,4219,1802],{"class":2424},[50,4221,2351],{"class":85},[50,4223,135],{"class":85},[50,4225,2356],{"class":97},[50,4227,4191],{"class":101},[50,4229,2351],{"class":97},[50,4231,1843],{"class":85},[50,4233,4234,4236,4238,4240,4242,4244,4246,4248],{"class":52,"line":1340},[50,4235,2421],{"class":85},[50,4237,2950],{"class":2424},[50,4239,2351],{"class":85},[50,4241,135],{"class":85},[50,4243,2356],{"class":97},[50,4245,4191],{"class":101},[50,4247,2351],{"class":97},[50,4249,1843],{"class":85},[50,4251,4252,4254,4256,4258,4260,4262,4265,4267],{"class":52,"line":1346},[50,4253,2421],{"class":85},[50,4255,3367],{"class":2424},[50,4257,2351],{"class":85},[50,4259,135],{"class":85},[50,4261,2356],{"class":97},[50,4263,4264],{"class":101},"^2.0.0",[50,4266,2351],{"class":97},[50,4268,1843],{"class":85},[50,4270,4271,4273,4275,4277,4279,4281,4283,4285],{"class":52,"line":1351},[50,4272,2421],{"class":85},[50,4274,2928],{"class":2424},[50,4276,2351],{"class":85},[50,4278,135],{"class":85},[50,4280,2356],{"class":97},[50,4282,4191],{"class":101},[50,4284,2351],{"class":97},[50,4286,1843],{"class":85},[50,4288,4289,4291,4294,4296,4298,4300,4302],{"class":52,"line":1360},[50,4290,2421],{"class":85},[50,4292,4293],{"class":2424},"@fougere\u002Fcompiler",[50,4295,2351],{"class":85},[50,4297,135],{"class":85},[50,4299,2356],{"class":97},[50,4301,4191],{"class":101},[50,4303,2435],{"class":97},[50,4305,4306],{"class":52,"line":1365},[50,4307,2440],{"class":85},[50,4309,4310,4312,4315,4317,4319],{"class":52,"line":1384},[50,4311,2344],{"class":85},[50,4313,4314],{"class":2347},"devDependencies",[50,4316,2351],{"class":85},[50,4318,135],{"class":85},[50,4320,218],{"class":85},[50,4322,4323,4325,4328,4330,4332,4334,4337],{"class":52,"line":1390},[50,4324,2421],{"class":85},[50,4326,4327],{"class":2424},"tsx",[50,4329,2351],{"class":85},[50,4331,135],{"class":85},[50,4333,2356],{"class":97},[50,4335,4336],{"class":101},"^4.0.0",[50,4338,2435],{"class":97},[50,4340,4341],{"class":52,"line":1395},[50,4342,2323],{"class":85},[50,4344,4345],{"class":52,"line":1400},[50,4346,311],{"class":85},[41,4348,4351],{"className":43,"code":4349,"filename":4350,"language":45,"meta":46,"style":46},"\u002F**\n * The search frond, alone in its own process.\n *\n * It serves `IndexHandler` over JSON-RPC and knows nothing about who might announce a\n * `PostPublished`. `remotes` is not declared here: an emitter reaches ITS listeners, and\n * a listener never reaches back.\n *\u002F\nimport { createApp, createAppRunner } from '@fougere\u002Fcore';\nimport { appOptionsOf } from '@fougere\u002Fdefaults';\nimport { frondAliases, setModuleLoader } from '@fougere\u002Fcore\u002Fnode';\nimport { createContainer } from '@fougere\u002Fcontainer';\nimport { serve } from '@fougere\u002Ftransport-http';\n\nconst PORT = Number(process.env.PORT ?? 4210);\n\nasync function main() {\n  const { createJiti } = await import('jiti');\n  const jiti = createJiti(import.meta.url, {\n    interopDefault: true,\n    \u002F\u002F `@fronds\u002F\u003Cname>` is how a frond names its neighbour; the loader has to know it.\n    alias: await frondAliases(import.meta.dirname),\n  });\n  setModuleLoader((path) => jiti.import(path) as Promise\u003CRecord\u003Cstring, unknown>>);\n\n  const app = await createApp({\n    ...(await appOptionsOf(import.meta.dirname, { only: ['search'] })),\n    createContainer,\n    \u002F\u002F Only this frond runs here. `blog` stays on disk and is simply not loaded.\n  });\n\n  await serve(createAppRunner(app), { port: PORT });\n  console.log(`\\x1b[36m[search · pid ${process.pid}]\\x1b[0m listening on http:\u002F\u002F127.0.0.1:${PORT}`);\n  console.log('  waiting for a fact…\\n');\n}\n\nmain().catch((err) => { console.error(err); process.exit(1); });\n\n","search.ts",[17,4352,4353,4357,4362,4366,4371,4376,4381,4385,4410,4430,4454,4474,4495,4499,4531,4535,4547,4575,4601,4611,4615,4641,4649,4697,4701,4718,4766,4772,4777,4785,4789,4824,4870,4893,4897,4901],{"__ignoreMap":46},[50,4354,4355],{"class":52,"line":53},[50,4356,1979],{"class":56},[50,4358,4359],{"class":52,"line":60},[50,4360,4361],{"class":56}," * The search frond, alone in its own process.\n",[50,4363,4364],{"class":52,"line":185},[50,4365,1989],{"class":56},[50,4367,4368],{"class":52,"line":192},[50,4369,4370],{"class":56}," * It serves `IndexHandler` over JSON-RPC and knows nothing about who might announce a\n",[50,4372,4373],{"class":52,"line":221},[50,4374,4375],{"class":56}," * `PostPublished`. `remotes` is not declared here: an emitter reaches ITS listeners, and\n",[50,4377,4378],{"class":52,"line":255},[50,4379,4380],{"class":56}," * a listener never reaches back.\n",[50,4382,4383],{"class":52,"line":308},[50,4384,2009],{"class":56},[50,4386,4387,4389,4391,4393,4395,4398,4400,4402,4404,4406,4408],{"class":52,"line":676},[50,4388,1772],{"class":63},[50,4390,353],{"class":85},[50,4392,2816],{"class":81},[50,4394,107],{"class":85},[50,4396,4397],{"class":81}," createAppRunner",[50,4399,144],{"class":85},[50,4401,1797],{"class":63},[50,4403,110],{"class":97},[50,4405,2094],{"class":101},[50,4407,98],{"class":97},[50,4409,252],{"class":85},[50,4411,4412,4414,4416,4418,4420,4422,4424,4426,4428],{"class":52,"line":1311},[50,4413,1772],{"class":63},[50,4415,353],{"class":85},[50,4417,2842],{"class":81},[50,4419,144],{"class":85},[50,4421,1797],{"class":63},[50,4423,110],{"class":97},[50,4425,2851],{"class":101},[50,4427,98],{"class":97},[50,4429,252],{"class":85},[50,4431,4432,4434,4436,4438,4440,4442,4444,4446,4448,4450,4452],{"class":52,"line":1317},[50,4433,1772],{"class":63},[50,4435,353],{"class":85},[50,4437,2864],{"class":81},[50,4439,107],{"class":85},[50,4441,2869],{"class":81},[50,4443,144],{"class":85},[50,4445,1797],{"class":63},[50,4447,110],{"class":97},[50,4449,2878],{"class":101},[50,4451,98],{"class":97},[50,4453,252],{"class":85},[50,4455,4456,4458,4460,4462,4464,4466,4468,4470,4472],{"class":52,"line":1323},[50,4457,1772],{"class":63},[50,4459,353],{"class":85},[50,4461,2919],{"class":81},[50,4463,144],{"class":85},[50,4465,1797],{"class":63},[50,4467,110],{"class":97},[50,4469,2928],{"class":101},[50,4471,98],{"class":97},[50,4473,252],{"class":85},[50,4475,4476,4478,4480,4483,4485,4487,4489,4491,4493],{"class":52,"line":1328},[50,4477,1772],{"class":63},[50,4479,353],{"class":85},[50,4481,4482],{"class":81}," serve",[50,4484,144],{"class":85},[50,4486,1797],{"class":63},[50,4488,110],{"class":97},[50,4490,2950],{"class":101},[50,4492,98],{"class":97},[50,4494,252],{"class":85},[50,4496,4497],{"class":52,"line":1334},[50,4498,189],{"emptyLinePlaceholder":188},[50,4500,4501,4503,4506,4508,4511,4513,4515,4517,4519,4521,4523,4525,4527,4529],{"class":52,"line":1340},[50,4502,2963],{"class":70},[50,4504,4505],{"class":81}," PORT ",[50,4507,2969],{"class":85},[50,4509,4510],{"class":89}," Number",[50,4512,94],{"class":93},[50,4514,2696],{"class":81},[50,4516,86],{"class":85},[50,4518,2983],{"class":282},[50,4520,86],{"class":85},[50,4522,2988],{"class":282},[50,4524,2991],{"class":85},[50,4526,2994],{"class":635},[50,4528,118],{"class":93},[50,4530,252],{"class":85},[50,4532,4533],{"class":52,"line":1346},[50,4534,189],{"emptyLinePlaceholder":188},[50,4536,4537,4539,4541,4543,4545],{"class":52,"line":1351},[50,4538,3149],{"class":70},[50,4540,3152],{"class":70},[50,4542,3338],{"class":89},[50,4544,141],{"class":85},[50,4546,218],{"class":85},[50,4548,4549,4551,4553,4555,4557,4559,4561,4563,4565,4567,4569,4571,4573],{"class":52,"line":1360},[50,4550,224],{"class":70},[50,4552,353],{"class":85},[50,4554,3351],{"class":81},[50,4556,144],{"class":85},[50,4558,230],{"class":85},[50,4560,233],{"class":63},[50,4562,3360],{"class":85},[50,4564,94],{"class":245},[50,4566,98],{"class":97},[50,4568,3367],{"class":101},[50,4570,98],{"class":97},[50,4572,118],{"class":245},[50,4574,252],{"class":85},[50,4576,4577,4579,4581,4583,4585,4587,4589,4591,4593,4595,4597,4599],{"class":52,"line":1365},[50,4578,224],{"class":70},[50,4580,3380],{"class":81},[50,4582,230],{"class":85},[50,4584,3351],{"class":89},[50,4586,94],{"class":245},[50,4588,1772],{"class":63},[50,4590,86],{"class":85},[50,4592,3393],{"class":282},[50,4594,86],{"class":85},[50,4596,3398],{"class":282},[50,4598,107],{"class":85},[50,4600,218],{"class":85},[50,4602,4603,4605,4607,4609],{"class":52,"line":1384},[50,4604,3407],{"class":131},[50,4606,135],{"class":85},[50,4608,3413],{"class":3412},[50,4610,1843],{"class":85},[50,4612,4613],{"class":52,"line":1390},[50,4614,3420],{"class":56},[50,4616,4617,4619,4621,4623,4625,4627,4629,4631,4633,4635,4637,4639],{"class":52,"line":1395},[50,4618,3425],{"class":131},[50,4620,135],{"class":85},[50,4622,233],{"class":63},[50,4624,2864],{"class":89},[50,4626,94],{"class":245},[50,4628,1772],{"class":63},[50,4630,86],{"class":85},[50,4632,3393],{"class":282},[50,4634,86],{"class":85},[50,4636,3444],{"class":282},[50,4638,118],{"class":245},[50,4640,1843],{"class":85},[50,4642,4643,4645,4647],{"class":52,"line":1400},[50,4644,3453],{"class":85},[50,4646,118],{"class":245},[50,4648,252],{"class":85},[50,4650,4651,4653,4655,4657,4659,4661,4663,4665,4667,4669,4671,4673,4675,4677,4679,4681,4683,4685,4687,4689,4691,4693,4695],{"class":52,"line":1406},[50,4652,3462],{"class":89},[50,4654,94],{"class":245},[50,4656,94],{"class":85},[50,4658,3469],{"class":653},[50,4660,118],{"class":85},[50,4662,660],{"class":659},[50,4664,3380],{"class":81},[50,4666,86],{"class":85},[50,4668,1772],{"class":89},[50,4670,94],{"class":245},[50,4672,3469],{"class":81},[50,4674,118],{"class":245},[50,4676,3488],{"class":63},[50,4678,2229],{"class":74},[50,4680,172],{"class":85},[50,4682,3495],{"class":74},[50,4684,172],{"class":85},[50,4686,3030],{"class":74},[50,4688,107],{"class":85},[50,4690,3504],{"class":74},[50,4692,3507],{"class":85},[50,4694,118],{"class":245},[50,4696,252],{"class":85},[50,4698,4699],{"class":52,"line":1412},[50,4700,189],{"emptyLinePlaceholder":188},[50,4702,4703,4705,4708,4710,4712,4714,4716],{"class":52,"line":1417},[50,4704,224],{"class":70},[50,4706,4707],{"class":81}," app",[50,4709,230],{"class":85},[50,4711,233],{"class":63},[50,4713,2816],{"class":89},[50,4715,94],{"class":245},[50,4717,1829],{"class":85},[50,4719,4720,4722,4724,4726,4728,4730,4732,4734,4736,4738,4740,4742,4744,4747,4749,4752,4754,4756,4758,4760,4762,4764],{"class":52,"line":1423},[50,4721,3736],{"class":85},[50,4723,94],{"class":245},[50,4725,1500],{"class":63},[50,4727,2842],{"class":89},[50,4729,94],{"class":245},[50,4731,1772],{"class":63},[50,4733,86],{"class":85},[50,4735,3393],{"class":282},[50,4737,86],{"class":85},[50,4739,3444],{"class":282},[50,4741,107],{"class":85},[50,4743,353],{"class":85},[50,4745,4746],{"class":131}," only",[50,4748,135],{"class":85},[50,4750,4751],{"class":245}," [",[50,4753,98],{"class":97},[50,4755,1275],{"class":101},[50,4757,98],{"class":97},[50,4759,2705],{"class":245},[50,4761,144],{"class":85},[50,4763,3138],{"class":245},[50,4765,1843],{"class":85},[50,4767,4768,4770],{"class":52,"line":1429},[50,4769,3763],{"class":81},[50,4771,1843],{"class":85},[50,4773,4774],{"class":52,"line":1435},[50,4775,4776],{"class":56},"    \u002F\u002F Only this frond runs here. `blog` stays on disk and is simply not loaded.\n",[50,4778,4779,4781,4783],{"class":52,"line":1441},[50,4780,3453],{"class":85},[50,4782,118],{"class":245},[50,4784,252],{"class":85},[50,4786,4787],{"class":52,"line":1446},[50,4788,189],{"emptyLinePlaceholder":188},[50,4790,4791,4793,4795,4797,4800,4802,4804,4806,4808,4810,4813,4815,4818,4820,4822],{"class":52,"line":1451},[50,4792,258],{"class":63},[50,4794,4482],{"class":89},[50,4796,94],{"class":245},[50,4798,4799],{"class":89},"createAppRunner",[50,4801,94],{"class":245},[50,4803,3159],{"class":81},[50,4805,118],{"class":245},[50,4807,107],{"class":85},[50,4809,353],{"class":85},[50,4811,4812],{"class":131}," port",[50,4814,135],{"class":85},[50,4816,4817],{"class":81}," PORT",[50,4819,144],{"class":85},[50,4821,118],{"class":245},[50,4823,252],{"class":85},[50,4825,4826,4828,4830,4832,4834,4836,4838,4841,4843,4845,4847,4849,4851,4853,4855,4858,4860,4862,4864,4866,4868],{"class":52,"line":1459},[50,4827,3285],{"class":81},[50,4829,86],{"class":85},[50,4831,2676],{"class":89},[50,4833,94],{"class":245},[50,4835,1263],{"class":97},[50,4837,2687],{"class":2686},[50,4839,4840],{"class":101},"[36m[search · pid ",[50,4842,2693],{"class":85},[50,4844,2696],{"class":81},[50,4846,86],{"class":85},[50,4848,1376],{"class":282},[50,4850,1921],{"class":85},[50,4852,2705],{"class":101},[50,4854,2687],{"class":2686},[50,4856,4857],{"class":101},"[0m listening on http:\u002F\u002F127.0.0.1:",[50,4859,2693],{"class":85},[50,4861,2988],{"class":81},[50,4863,1921],{"class":85},[50,4865,1263],{"class":97},[50,4867,118],{"class":245},[50,4869,252],{"class":85},[50,4871,4872,4874,4876,4878,4880,4882,4885,4887,4889,4891],{"class":52,"line":1464},[50,4873,3285],{"class":81},[50,4875,86],{"class":85},[50,4877,2676],{"class":89},[50,4879,94],{"class":245},[50,4881,98],{"class":97},[50,4883,4884],{"class":101},"  waiting for a fact…",[50,4886,3704],{"class":2686},[50,4888,98],{"class":97},[50,4890,118],{"class":245},[50,4892,252],{"class":85},[50,4894,4895],{"class":52,"line":1472},[50,4896,311],{"class":85},[50,4898,4899],{"class":52,"line":1478},[50,4900,189],{"emptyLinePlaceholder":188},[50,4902,4903,4905,4907,4909,4911,4913,4915,4917,4919,4921,4923,4925,4927,4929,4931,4933,4935,4937,4939,4941,4943,4945,4947,4949,4951,4953,4955],{"class":52,"line":1497},[50,4904,3969],{"class":89},[50,4906,141],{"class":93},[50,4908,86],{"class":85},[50,4910,3976],{"class":89},[50,4912,94],{"class":93},[50,4914,94],{"class":85},[50,4916,3983],{"class":653},[50,4918,118],{"class":85},[50,4920,660],{"class":659},[50,4922,353],{"class":85},[50,4924,3992],{"class":81},[50,4926,86],{"class":85},[50,4928,3997],{"class":89},[50,4930,94],{"class":245},[50,4932,3983],{"class":81},[50,4934,118],{"class":245},[50,4936,302],{"class":85},[50,4938,4008],{"class":81},[50,4940,86],{"class":85},[50,4942,4013],{"class":89},[50,4944,94],{"class":245},[50,4946,4018],{"class":635},[50,4948,118],{"class":245},[50,4950,302],{"class":85},[50,4952,144],{"class":85},[50,4954,118],{"class":93},[50,4956,252],{"class":85},[41,4958,4961],{"className":2330,"code":4959,"filename":4960,"language":2333,"meta":46,"style":46},"{\n  \"extends\": [\"@fougere\u002Fcore\u002Ftsconfig\", \"..\u002F..\u002Ftsconfig.base.json\"],\n  \"compilerOptions\": {\n    \"noEmit\": true,\n    \"rootDir\": \".\"\n  },\n  \"include\": [\".\"],\n  \"exclude\": [\"**\u002Fdist\", \"node_modules\"]\n}\n\n","tsconfig.json",[17,4962,4963,4967,4999,5012,5027,5044,5048,5069,5101],{"__ignoreMap":46},[50,4964,4965],{"class":52,"line":53},[50,4966,1829],{"class":85},[50,4968,4969,4971,4974,4976,4978,4980,4982,4985,4987,4989,4991,4994,4996],{"class":52,"line":60},[50,4970,2344],{"class":85},[50,4972,4973],{"class":2347},"extends",[50,4975,2351],{"class":85},[50,4977,135],{"class":85},[50,4979,4751],{"class":85},[50,4981,2351],{"class":97},[50,4983,4984],{"class":101},"@fougere\u002Fcore\u002Ftsconfig",[50,4986,2351],{"class":97},[50,4988,107],{"class":85},[50,4990,2356],{"class":97},[50,4992,4993],{"class":101},"..\u002F..\u002Ftsconfig.base.json",[50,4995,2351],{"class":97},[50,4997,4998],{"class":85},"],\n",[50,5000,5001,5003,5006,5008,5010],{"class":52,"line":185},[50,5002,2344],{"class":85},[50,5004,5005],{"class":2347},"compilerOptions",[50,5007,2351],{"class":85},[50,5009,135],{"class":85},[50,5011,218],{"class":85},[50,5013,5014,5016,5019,5021,5023,5025],{"class":52,"line":192},[50,5015,2421],{"class":85},[50,5017,5018],{"class":2424},"noEmit",[50,5020,2351],{"class":85},[50,5022,135],{"class":85},[50,5024,3413],{"class":97},[50,5026,1843],{"class":85},[50,5028,5029,5031,5034,5036,5038,5040,5042],{"class":52,"line":221},[50,5030,2421],{"class":85},[50,5032,5033],{"class":2424},"rootDir",[50,5035,2351],{"class":85},[50,5037,135],{"class":85},[50,5039,2356],{"class":97},[50,5041,86],{"class":101},[50,5043,2435],{"class":97},[50,5045,5046],{"class":52,"line":255},[50,5047,2440],{"class":85},[50,5049,5050,5052,5055,5057,5059,5061,5063,5065,5067],{"class":52,"line":308},[50,5051,2344],{"class":85},[50,5053,5054],{"class":2347},"include",[50,5056,2351],{"class":85},[50,5058,135],{"class":85},[50,5060,4751],{"class":85},[50,5062,2351],{"class":97},[50,5064,86],{"class":101},[50,5066,2351],{"class":97},[50,5068,4998],{"class":85},[50,5070,5071,5073,5076,5078,5080,5082,5084,5087,5089,5091,5093,5096,5098],{"class":52,"line":676},[50,5072,2344],{"class":85},[50,5074,5075],{"class":2347},"exclude",[50,5077,2351],{"class":85},[50,5079,135],{"class":85},[50,5081,4751],{"class":85},[50,5083,2351],{"class":97},[50,5085,5086],{"class":101},"**\u002Fdist",[50,5088,2351],{"class":97},[50,5090,107],{"class":85},[50,5092,2356],{"class":97},[50,5094,5095],{"class":101},"node_modules",[50,5097,2351],{"class":97},[50,5099,5100],{"class":85},"]\n",[50,5102,5103],{"class":52,"line":1311},[50,5104,311],{"class":85},[897,5106,5107],{},"html pre.shiki code .sd7zb, html code.shiki .sd7zb{--shiki-light:#39ADB5;--shiki-light-font-weight:inherit;--shiki-default:#A3B0A5;--shiki-default-font-weight:bold;--shiki-dark:#89DDFF;--shiki-dark-font-weight:inherit}html pre.shiki code .sLf9K, html code.shiki .sLf9K{--shiki-light:#E2931D;--shiki-light-font-weight:inherit;--shiki-default:#8FCF86;--shiki-default-font-weight:bold;--shiki-dark:#FFCB6B;--shiki-dark-font-weight:inherit}html pre.shiki code .sPEhv, html code.shiki .sPEhv{--shiki-light:#90A4AE;--shiki-default:#DDE5DA;--shiki-dark:#BABED8}html pre.shiki code .s15xx, html code.shiki .s15xx{--shiki-light:#39ADB5;--shiki-default:#A3B0A5;--shiki-dark:#89DDFF}html pre.shiki code .sN-8n, html code.shiki .sN-8n{--shiki-light:#91B859;--shiki-default:#EE9F6B;--shiki-dark:#C3E88D}html pre.shiki code .siB6D, html code.shiki .siB6D{--shiki-light:#91B859;--shiki-default:#A3B0A5;--shiki-dark:#C3E88D}html pre.shiki code .sYNOY, html code.shiki .sYNOY{--shiki-light:#90A4AE90;--shiki-default:#DDE5DA;--shiki-dark:#BABED890}html pre.shiki code .sHaeK, html code.shiki .sHaeK{--shiki-light:#39ADB5;--shiki-light-font-weight:bold;--shiki-default:#A3B0A5;--shiki-default-font-weight:inherit;--shiki-dark:#89DDFF;--shiki-dark-font-weight:bold}html pre.shiki code .s7rwI, html code.shiki .s7rwI{--shiki-light:#E53935;--shiki-light-font-weight:bold;--shiki-default:#DDE5DA;--shiki-default-font-weight:inherit;--shiki-dark:#F07178;--shiki-dark-font-weight:bold}html pre.shiki code .skXKP, html code.shiki .skXKP{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#7D8C80;--shiki-default-font-style:inherit;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s4mR9, html code.shiki .s4mR9{--shiki-light:#6182B8;--shiki-default:#C9B6EA;--shiki-dark:#82AAFF}html pre.shiki code .srlTG, html code.shiki .srlTG{--shiki-light:#90A4AE;--shiki-default:#A3B0A5;--shiki-dark:#BABED8}html pre.shiki code .sK6XW, html code.shiki .sK6XW{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#8FCF86;--shiki-default-font-style:inherit;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sxG60, html code.shiki .sxG60{--shiki-light:#39ADB5;--shiki-light-font-style:inherit;--shiki-default:#8FCF86;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:inherit}html pre.shiki code .sHtqg, html code.shiki .sHtqg{--shiki-light:#E53935;--shiki-default:#93CFC0;--shiki-dark:#F07178}html pre.shiki code .sgjsB, html code.shiki .sgjsB{--shiki-light:#6182B8;--shiki-default:#EFCD8F;--shiki-dark:#82AAFF}html pre.shiki code .sBZYL, html code.shiki .sBZYL{--shiki-light:#E2931D;--shiki-default:#EFCD8F;--shiki-dark:#FFCB6B}html pre.shiki code .sOLEQ, html code.shiki .sOLEQ{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#A3B0A5;--shiki-default-font-style:inherit;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sJ4h6, html code.shiki .sJ4h6{--shiki-light:#E53935;--shiki-light-font-style:italic;--shiki-default:#DDE5DA;--shiki-default-font-style:inherit;--shiki-dark:#F07178;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sDDC1, html code.shiki .sDDC1{--shiki-light:#39ADB5;--shiki-default:#EE9F6B;--shiki-dark:#89DDFF}html pre.shiki code .s76I7, html code.shiki .s76I7{--shiki-light:#9C3EDA;--shiki-default:#8FCF86;--shiki-dark:#C792EA}html pre.shiki code .s3dPA, html code.shiki .s3dPA{--shiki-light:#F76D47;--shiki-default:#EE9F6B;--shiki-dark:#F78C6C}html pre.shiki code .shDUQ, html code.shiki .shDUQ{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#DDE5DA;--shiki-default-font-style:inherit;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .shDkW, html code.shiki .shDkW{--shiki-light:#E53935;--shiki-default:#C9B6EA;--shiki-dark:#F07178}html pre.shiki code .spAFX, html code.shiki .spAFX{--shiki-light:#E53935;--shiki-default:#A3B0A5;--shiki-dark:#F07178}html pre.shiki code .s8ClO, html code.shiki .s8ClO{--shiki-light:#9C3EDA;--shiki-default:#93CFC0;--shiki-dark:#C792EA}html pre.shiki code .sWI7z, html code.shiki .sWI7z{--shiki-light:#E2931D;--shiki-default:#93CFC0;--shiki-dark:#FFCB6B}html pre.shiki code .sfnqo, html code.shiki .sfnqo{--shiki-light:#90A4AE;--shiki-default:#EE9F6B;--shiki-dark:#BABED8}html pre.shiki code .sy9f4, html code.shiki .sy9f4{--shiki-light:#90A4AE;--shiki-default:#93CFC0;--shiki-dark:#BABED8}html pre.shiki code .slP7D, html code.shiki .slP7D{--shiki-light:#90A4AE;--shiki-default:#C9B6EA;--shiki-dark:#BABED8}html pre.shiki code .scTuO, html code.shiki .scTuO{--shiki-light:#9C3EDA;--shiki-default:#A3B0A5;--shiki-dark:#C792EA}html pre.shiki code .slmMI, html code.shiki .slmMI{--shiki-light:#FF5370;--shiki-default:#EE9F6B;--shiki-dark:#FF9CAC}",{"title":46,"searchDepth":60,"depth":60,"links":5109},[],{},"\u002Fdemo\u002Femit-split",{"title":779,"description":46},"demo\u002Femit-split","pOBy2OEO4ixJ_ZIQGe7Drhid1UJIt0HPKscMnalpvKs",1794396614213]