[{"data":1,"prerenderedAt":1000},["ShallowReactive",2],{"navigation_docs":3,"-guide-custom":196,"-guide-custom-surround":995},[4,44],{"title":5,"path":6,"stem":7,"children":8,"icon":43},"Guide","\u002Fguide","1.guide\u002F01.index",[9,11,15,19,23,27,31,35,39],{"title":10,"path":6,"stem":7},"Getting Started",{"title":12,"path":13,"stem":14},"Registry and aliases","\u002Fguide\u002Fregistry","1.guide\u002F02.registry",{"title":16,"path":17,"stem":18},"Address validation","\u002Fguide\u002Fvalidation","1.guide\u002F03.validation",{"title":20,"path":21,"stem":22},"Identify","\u002Fguide\u002Fidentify","1.guide\u002F04.identify",{"title":24,"path":25,"stem":26},"Metadata","\u002Fguide\u002Fmetadata","1.guide\u002F05.metadata",{"title":28,"path":29,"stem":30},"CLI","\u002Fguide\u002Fcli","1.guide\u002F06.cli",{"title":32,"path":33,"stem":34},"Agents","\u002Fguide\u002Fagents","1.guide\u002F07.agents",{"title":36,"path":37,"stem":38},"Custom chains","\u002Fguide\u002Fcustom","1.guide\u002F08.custom",{"title":40,"path":41,"stem":42},"Playground","\u002Fguide\u002Fplayground","1.guide\u002F09.playground","i-lucide-book-open",{"title":45,"path":46,"stem":47,"children":48,"icon":195},"Chains","\u002Fchains","2.chains\u002F00.index",[49,51,55,59,63,67,71,75,79,83,87,91,95,99,103,107,111,115,119,123,127,131,135,139,143,147,151,155,159,163,167,171,175,179,183,187,191],{"title":50,"path":46,"stem":47},"Overview",{"title":52,"path":53,"stem":54},"Ethereum","\u002Fchains\u002Fethereum","2.chains\u002F01.ethereum",{"title":56,"path":57,"stem":58},"Base","\u002Fchains\u002Fbase","2.chains\u002F02.base",{"title":60,"path":61,"stem":62},"Arbitrum One","\u002Fchains\u002Farbitrum","2.chains\u002F03.arbitrum",{"title":64,"path":65,"stem":66},"Optimism","\u002Fchains\u002Foptimism","2.chains\u002F04.optimism",{"title":68,"path":69,"stem":70},"Polygon PoS","\u002Fchains\u002Fpolygon","2.chains\u002F05.polygon",{"title":72,"path":73,"stem":74},"BNB Chain","\u002Fchains\u002Fbsc","2.chains\u002F06.bsc",{"title":76,"path":77,"stem":78},"Avalanche C-Chain","\u002Fchains\u002Favalanche","2.chains\u002F07.avalanche",{"title":80,"path":81,"stem":82},"Fantom Opera","\u002Fchains\u002Ffantom","2.chains\u002F08.fantom",{"title":84,"path":85,"stem":86},"Gnosis Chain","\u002Fchains\u002Fgnosis","2.chains\u002F09.gnosis",{"title":88,"path":89,"stem":90},"Linea","\u002Fchains\u002Flinea","2.chains\u002F10.linea",{"title":92,"path":93,"stem":94},"zkSync Era","\u002Fchains\u002Fzksync","2.chains\u002F11.zksync",{"title":96,"path":97,"stem":98},"Scroll","\u002Fchains\u002Fscroll","2.chains\u002F12.scroll",{"title":100,"path":101,"stem":102},"Berachain","\u002Fchains\u002Fberachain","2.chains\u002F13.berachain",{"title":104,"path":105,"stem":106},"Bitcoin","\u002Fchains\u002Fbitcoin","2.chains\u002F14.bitcoin",{"title":108,"path":109,"stem":110},"Litecoin","\u002Fchains\u002Flitecoin","2.chains\u002F15.litecoin",{"title":112,"path":113,"stem":114},"Pepecoin","\u002Fchains\u002Fpepecoin","2.chains\u002F16.pepecoin",{"title":116,"path":117,"stem":118},"eCash","\u002Fchains\u002Fecash","2.chains\u002F17.ecash",{"title":120,"path":121,"stem":122},"Cardano","\u002Fchains\u002Fcardano","2.chains\u002F18.cardano",{"title":124,"path":125,"stem":126},"Solana","\u002Fchains\u002Fsolana","2.chains\u002F19.solana",{"title":128,"path":129,"stem":130},"Stellar","\u002Fchains\u002Fstellar","2.chains\u002F20.stellar",{"title":132,"path":133,"stem":134},"XRP Ledger","\u002Fchains\u002Fxrpl","2.chains\u002F21.xrpl",{"title":136,"path":137,"stem":138},"Aptos","\u002Fchains\u002Faptos","2.chains\u002F22.aptos",{"title":140,"path":141,"stem":142},"Sui","\u002Fchains\u002Fsui","2.chains\u002F23.sui",{"title":144,"path":145,"stem":146},"TON (The Open Network)","\u002Fchains\u002Fton","2.chains\u002F24.ton",{"title":148,"path":149,"stem":150},"TRON","\u002Fchains\u002Ftron","2.chains\u002F25.tron",{"title":152,"path":153,"stem":154},"Octra","\u002Fchains\u002Foctra","2.chains\u002F26.octra",{"title":156,"path":157,"stem":158},"Arweave","\u002Fchains\u002Farweave","2.chains\u002F27.arweave",{"title":160,"path":161,"stem":162},"Monero","\u002Fchains\u002Fmonero","2.chains\u002F28.monero",{"title":164,"path":165,"stem":166},"Decred","\u002Fchains\u002Fdecred","2.chains\u002F29.decred",{"title":168,"path":169,"stem":170},"Arc","\u002Fchains\u002Farc","2.chains\u002F30.arc",{"title":172,"path":173,"stem":174},"Dogecoin","\u002Fchains\u002Fdogecoin","2.chains\u002F31.dogecoin",{"title":176,"path":177,"stem":178},"Bitcoin Cash","\u002Fchains\u002Fbitcoincash","2.chains\u002F32.bitcoincash",{"title":180,"path":181,"stem":182},"Bitcoin SV","\u002Fchains\u002Fbitcoinsv","2.chains\u002F33.bitcoinsv",{"title":184,"path":185,"stem":186},"Bitcoin Gold","\u002Fchains\u002Fbitcoingold","2.chains\u002F34.bitcoingold",{"title":188,"path":189,"stem":190},"Dash","\u002Fchains\u002Fdash","2.chains\u002F35.dash",{"title":192,"path":193,"stem":194},"Zcash","\u002Fchains\u002Fzcash","2.chains\u002F36.zcash","i-lucide-link",{"id":197,"title":36,"body":198,"description":988,"extension":989,"links":990,"meta":991,"navigation":317,"path":37,"seo":993,"stem":38,"__hash__":994},"docs\u002F1.guide\u002F08.custom.md",{"type":199,"value":200,"toc":982},"minimark",[201,206,223,681,793,815,819,936,940,951,955,978],[202,203,205],"h2",{"id":204},"one-class-one-file","One class, one file",[207,208,209,210,214,215,218,219,222],"p",{},"Every built-in is a concrete class extending the exported abstract ",[211,212,213],"code",{},"Chain",", or ",[211,216,217],{},"EVM"," and ",[211,220,221],{},"Move"," when the address format is theirs. Yours is the same shape:",[224,225,231],"pre",{"className":226,"code":227,"filename":228,"language":229,"meta":230,"style":230},"language-ts shiki shiki-themes github-light github-light poimandres","import { Chain, InvalidAddressError, register } from \"@agntn\u002Fchains\";\nimport type { ChainKey, ChainType } from \"@agntn\u002Fchains\";\n\n\u002F** The shape of a Nano account. Its checksum stays unchecked here. *\u002F\nconst ADDRESS = \u002F^nano_[13][13456789abcdefghijkmnopqrstuwxyz]{59}$\u002F;\n\nclass Nano extends Chain {\n  static readonly key = \"nano\" as ChainKey;\n  readonly type = \"nano\" as ChainType;\n  readonly name = \"Nano\";\n  readonly symbol = \"XNO\";\n  override readonly decimals = 30;\n  readonly explorer = \"https:\u002F\u002Fnanexplorer.com\u002Fnano\";\n  readonly bip44 = 165;\n\n  override assertAddress(address: string): string {\n    if (!ADDRESS.test(address)) throw new InvalidAddressError(this.key, address);\n    return address;\n  }\n}\n\nregister(Nano);\n","nano.ts","ts","",[211,232,233,282,312,319,326,378,383,401,432,454,473,492,511,530,545,550,581,640,652,658,664,669],{"__ignoreMap":230},[234,235,238,242,246,250,253,256,258,261,264,268,272,276,279],"span",{"class":236,"line":237},"line",1,[234,239,241],{"class":240},"sP0CR","import",[234,243,245],{"class":244},"sKlNE"," {",[234,247,249],{"class":248},"snHMy"," Chain",[234,251,252],{"class":244},",",[234,254,255],{"class":248}," InvalidAddressError",[234,257,252],{"class":244},[234,259,260],{"class":248}," register",[234,262,263],{"class":244}," }",[234,265,267],{"class":266},"stCPd"," from",[234,269,271],{"class":270},"scVjq"," \"",[234,273,275],{"class":274},"sQ7BG","@agntn\u002Fchains",[234,277,278],{"class":270},"\"",[234,280,281],{"class":244},";\n",[234,283,285,287,290,292,295,297,300,302,304,306,308,310],{"class":236,"line":284},2,[234,286,241],{"class":240},[234,288,289],{"class":266}," type",[234,291,245],{"class":244},[234,293,294],{"class":248}," ChainKey",[234,296,252],{"class":244},[234,298,299],{"class":248}," ChainType",[234,301,263],{"class":244},[234,303,267],{"class":266},[234,305,271],{"class":270},[234,307,275],{"class":274},[234,309,278],{"class":270},[234,311,281],{"class":244},[234,313,315],{"class":236,"line":314},3,[234,316,318],{"emptyLinePlaceholder":317},true,"\n",[234,320,322],{"class":236,"line":321},4,[234,323,325],{"class":324},"sjhu3","\u002F** The shape of a Nano account. Its checksum stays unchecked here. *\u002F\n",[234,327,329,333,337,340,343,346,350,354,358,361,364,367,370,373,376],{"class":236,"line":328},5,[234,330,332],{"class":331},"s1TYA","const",[234,334,336],{"class":335},"saoiD"," ADDRESS",[234,338,339],{"class":331}," =",[234,341,342],{"class":270}," \u002F",[234,344,345],{"class":266},"^",[234,347,349],{"class":348},"sLrG9","nano_",[234,351,353],{"class":352},"sy8Ar","[",[234,355,357],{"class":356},"stM5N","13",[234,359,360],{"class":352},"][",[234,362,363],{"class":356},"13456789abcdefghijkmnopqrstuwxyz",[234,365,366],{"class":352},"]",[234,368,369],{"class":331},"{59}",[234,371,372],{"class":266},"$",[234,374,375],{"class":270},"\u002F",[234,377,281],{"class":244},[234,379,381],{"class":236,"line":380},6,[234,382,318],{"emptyLinePlaceholder":317},[234,384,386,389,393,396,398],{"class":236,"line":385},7,[234,387,388],{"class":331},"class",[234,390,392],{"class":391},"scZRh"," Nano",[234,394,395],{"class":240}," extends",[234,397,249],{"class":391},[234,399,400],{"class":244}," {\n",[234,402,404,407,410,414,416,418,421,423,427,430],{"class":236,"line":403},8,[234,405,406],{"class":240},"  static",[234,408,409],{"class":240}," readonly",[234,411,413],{"class":412},"s0VbO"," key",[234,415,339],{"class":331},[234,417,271],{"class":270},[234,419,420],{"class":274},"nano",[234,422,278],{"class":270},[234,424,426],{"class":425},"sp-LQ"," as",[234,428,294],{"class":429},"sCrqT",[234,431,281],{"class":244},[234,433,435,438,440,442,444,446,448,450,452],{"class":236,"line":434},9,[234,436,437],{"class":240},"  readonly",[234,439,289],{"class":412},[234,441,339],{"class":331},[234,443,271],{"class":270},[234,445,420],{"class":274},[234,447,278],{"class":270},[234,449,426],{"class":425},[234,451,299],{"class":429},[234,453,281],{"class":244},[234,455,457,459,462,464,466,469,471],{"class":236,"line":456},10,[234,458,437],{"class":240},[234,460,461],{"class":412}," name",[234,463,339],{"class":331},[234,465,271],{"class":270},[234,467,468],{"class":274},"Nano",[234,470,278],{"class":270},[234,472,281],{"class":244},[234,474,476,478,481,483,485,488,490],{"class":236,"line":475},11,[234,477,437],{"class":240},[234,479,480],{"class":412}," symbol",[234,482,339],{"class":331},[234,484,271],{"class":270},[234,486,487],{"class":274},"XNO",[234,489,278],{"class":270},[234,491,281],{"class":244},[234,493,495,498,500,503,505,509],{"class":236,"line":494},12,[234,496,497],{"class":240},"  override",[234,499,409],{"class":240},[234,501,502],{"class":412}," decimals",[234,504,339],{"class":331},[234,506,508],{"class":507},"siHFe"," 30",[234,510,281],{"class":244},[234,512,514,516,519,521,523,526,528],{"class":236,"line":513},13,[234,515,437],{"class":240},[234,517,518],{"class":412}," explorer",[234,520,339],{"class":331},[234,522,271],{"class":270},[234,524,525],{"class":274},"https:\u002F\u002Fnanexplorer.com\u002Fnano",[234,527,278],{"class":270},[234,529,281],{"class":244},[234,531,533,535,538,540,543],{"class":236,"line":532},14,[234,534,437],{"class":240},[234,536,537],{"class":412}," bip44",[234,539,339],{"class":331},[234,541,542],{"class":507}," 165",[234,544,281],{"class":244},[234,546,548],{"class":236,"line":547},15,[234,549,318],{"emptyLinePlaceholder":317},[234,551,553,555,558,561,565,568,572,575,577,579],{"class":236,"line":552},16,[234,554,497],{"class":240},[234,556,557],{"class":391}," assertAddress",[234,559,560],{"class":244},"(",[234,562,564],{"class":563},"s1jWp","address",[234,566,567],{"class":331},":",[234,569,571],{"class":570},"s8yaW"," string",[234,573,574],{"class":244},")",[234,576,567],{"class":331},[234,578,571],{"class":570},[234,580,400],{"class":244},[234,582,584,587,590,593,597,600,604,606,609,612,616,619,621,623,627,629,632,635,637],{"class":236,"line":583},17,[234,585,586],{"class":266},"    if",[234,588,589],{"class":244}," (",[234,591,592],{"class":331},"!",[234,594,596],{"class":595},"sqT1Y","ADDRESS",[234,598,599],{"class":244},".",[234,601,603],{"class":602},"sULi6","test",[234,605,560],{"class":244},[234,607,564],{"class":608},"spVlQ",[234,610,611],{"class":244},")) ",[234,613,615],{"class":614},"szlwh","throw",[234,617,618],{"class":240}," new",[234,620,255],{"class":602},[234,622,560],{"class":244},[234,624,626],{"class":625},"s-lox","this",[234,628,599],{"class":244},[234,630,631],{"class":608},"key",[234,633,634],{"class":244},", ",[234,636,564],{"class":608},[234,638,639],{"class":244},");\n",[234,641,643,647,650],{"class":236,"line":642},18,[234,644,646],{"class":645},"sZW6a","    return",[234,648,649],{"class":608}," address",[234,651,281],{"class":244},[234,653,655],{"class":236,"line":654},19,[234,656,657],{"class":244},"  }\n",[234,659,661],{"class":236,"line":660},20,[234,662,663],{"class":244},"}\n",[234,665,667],{"class":236,"line":666},21,[234,668,318],{"emptyLinePlaceholder":317},[234,670,672,675,677,679],{"class":236,"line":671},22,[234,673,674],{"class":602},"register",[234,676,560],{"class":244},[234,678,468],{"class":608},[234,680,639],{"class":244},[224,682,684],{"className":226,"code":683,"language":229,"meta":230,"style":230},"import \".\u002Fnano\";\nimport { create, getChain, identify } from \"@agntn\u002Fchains\";\n\ngetChain(\"nano\").name; \u002F\u002F \"Nano\"\nidentify(\"nano_3t6k35gi95xu6tergt6p69ck76ogmitsa8mnijtpxm9fkcm736xtoncuohr3\").matches[0]?.key; \u002F\u002F \"nano\"\n",[211,685,686,699,730,734,759],{"__ignoreMap":230},[234,687,688,690,692,695,697],{"class":236,"line":237},[234,689,241],{"class":240},[234,691,271],{"class":270},[234,693,694],{"class":274},".\u002Fnano",[234,696,278],{"class":270},[234,698,281],{"class":244},[234,700,701,703,705,708,710,713,715,718,720,722,724,726,728],{"class":236,"line":284},[234,702,241],{"class":240},[234,704,245],{"class":244},[234,706,707],{"class":248}," create",[234,709,252],{"class":244},[234,711,712],{"class":248}," getChain",[234,714,252],{"class":244},[234,716,717],{"class":248}," identify",[234,719,263],{"class":244},[234,721,267],{"class":266},[234,723,271],{"class":270},[234,725,275],{"class":274},[234,727,278],{"class":270},[234,729,281],{"class":244},[234,731,732],{"class":236,"line":314},[234,733,318],{"emptyLinePlaceholder":317},[234,735,736,739,741,743,745,747,750,753,756],{"class":236,"line":321},[234,737,738],{"class":602},"getChain",[234,740,560],{"class":244},[234,742,278],{"class":270},[234,744,420],{"class":274},[234,746,278],{"class":270},[234,748,749],{"class":244},").",[234,751,752],{"class":608},"name",[234,754,755],{"class":244},"; ",[234,757,758],{"class":324},"\u002F\u002F \"Nano\"\n",[234,760,761,764,766,768,771,773,775,778,780,783,786,788,790],{"class":236,"line":328},[234,762,763],{"class":602},"identify",[234,765,560],{"class":244},[234,767,278],{"class":270},[234,769,770],{"class":274},"nano_3t6k35gi95xu6tergt6p69ck76ogmitsa8mnijtpxm9fkcm736xtoncuohr3",[234,772,278],{"class":270},[234,774,749],{"class":244},[234,776,777],{"class":608},"matches",[234,779,353],{"class":244},[234,781,782],{"class":507},"0",[234,784,785],{"class":244},"]?.",[234,787,631],{"class":608},[234,789,755],{"class":244},[234,791,792],{"class":324},"\u002F\u002F \"nano\"\n",[207,794,795,796,218,799,802,803,806,807,810,811,814],{},"Two casts, and they are the honest part of this page. ",[211,797,798],{},"ChainKey",[211,800,801],{},"ChainType"," are closed unions of the built-in values, so a new key doesn't type check without ",[211,804,805],{},"as ChainKey",", and ",[211,808,809],{},"create(\"nano\")"," wants the same cast. ",[211,812,813],{},"getChain(\"nano\")"," takes a plain string and needs none. The unions exist so a typo in a key is a compile error inside the package; the price is paid once, in your class.",[202,816,818],{"id":817},"the-contract","The contract",[820,821,822,836,872,885,904,924],"ul",{},[823,824,825,828,829,831,832,835],"li",{},[211,826,827],{},"static readonly key"," is what ",[211,830,674],{}," files the class under and what ",[211,833,834],{},"chain.key"," returns. Lowercase, the chain's name rather than its ticker. Registering the same key again replaces the class.",[823,837,838,634,840,634,843,218,846,849,850,634,853,634,856,634,859,634,862,634,865,218,868,871],{},[211,839,752],{},[211,841,842],{},"symbol",[211,844,845],{},"type",[211,847,848],{},"explorer"," are required. ",[211,851,852],{},"decimals",[211,854,855],{},"bip44",[211,857,858],{},"chainId",[211,860,861],{},"caip2",[211,863,864],{},"magic",[211,866,867],{},"pow",[211,869,870],{},"rpcDefault"," are optional and mean unknown when left out, never a default.",[823,873,874,877,878,881,882,884],{},[211,875,876],{},"assertAddress"," returns the address or throws ",[211,879,880],{},"InvalidAddressError(this.key, address)",". Throw that class and nothing else for a bad address, because ",[211,883,763],{}," counts only that as a miss and lets any other throw come back out as a bug.",[823,886,887,888,218,890,893,894,897,898,806,901,903],{},"Skip ",[211,889,876],{},[211,891,892],{},"validatesAddress"," says ",[211,895,896],{},"false",", the base method throws ",[211,899,900],{},"AddressValidationUnsupportedError",[211,902,763],{}," lists your chain as unchecked rather than pretending it said no.",[823,905,906,909,910,913,914,893,917,919,920,923],{},[211,907,908],{},"assertTxid"," is optional the same way. Override it and throw ",[211,911,912],{},"InvalidTxidError",", or skip it and ",[211,915,916],{},"validatesTxid",[211,918,896],{},". ",[211,921,922],{},"class Mine extends UTXO"," gets the 64 hex digit check for free.",[823,925,926,927,930,931,634,933,935],{},"An EVM chain is ",[211,928,929],{},"class Mine extends EVM"," with ",[211,932,858],{},[211,934,861],{}," and the rest. Both format checks come with the family.",[202,937,939],{"id":938},"decode-when-you-can","Decode when you can",[207,941,942,943,946,947,950],{},"A regex is fine when the width is the whole format, as it is for Octra. When the format is Base58Check with a known byte length, decode and look at the bytes: a character window takes neighbouring chains and half the typos. The built-ins are the reference, ",[211,944,945],{},"src\u002Fchains\u002Ftron.ts"," is the short one and ",[211,948,949],{},"src\u002Fchains\u002Fcardano.ts"," the long one.",[202,952,954],{"id":953},"where-it-shows-up","Where it shows up",[207,956,957,958,634,961,964,965,967,968,970,971,218,974,977],{},"Once the module is imported, the chain is in ",[211,959,960],{},"chains()",[211,962,963],{},"has()"," says true, ",[211,966,738],{}," finds it by key and by display name, ",[211,969,763],{}," asks it like any other. The CLI and the MCP server only load the built-ins. To use a custom chain there you build your own binary around ",[211,972,973],{},"create",[211,975,976],{},"createMcpServer",". There's no plugin path, and I'd rather say so than invent one that half works.",[979,980,981],"style",{},"html pre.shiki code .sP0CR, html code.shiki .sP0CR{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#5DE4C7}html pre.shiki code .sKlNE, html code.shiki .sKlNE{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#A6ACCD}html pre.shiki code .snHMy, html code.shiki .snHMy{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#ADD7FF}html pre.shiki code .stCPd, html code.shiki .stCPd{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#A6ACCD}html pre.shiki code .scVjq, html code.shiki .scVjq{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#A6ACCD}html pre.shiki code .sQ7BG, html code.shiki .sQ7BG{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#5DE4C7}html pre.shiki code .sjhu3, html code.shiki .sjhu3{--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#767C9DB0;--shiki-dark-font-style:italic}html pre.shiki code .s1TYA, html code.shiki .s1TYA{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#91B4D5}html pre.shiki code .saoiD, html code.shiki .saoiD{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#E4F0FB}html pre.shiki code .sLrG9, html code.shiki .sLrG9{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#5FB3A1}html pre.shiki code .sy8Ar, html code.shiki .sy8Ar{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#A6ACCD}html pre.shiki code .stM5N, html code.shiki .stM5N{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#5FB3A1}html pre.shiki code .scZRh, html code.shiki .scZRh{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#ADD7FF}html pre.shiki code .s0VbO, html code.shiki .s0VbO{--shiki-light:#E36209;--shiki-default:#E36209;--shiki-dark:#A6ACCD}html pre.shiki code .sp-LQ, html code.shiki .sp-LQ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#A6ACCDC0}html pre.shiki code .sCrqT, html code.shiki .sCrqT{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#A6ACCDC0}html pre.shiki code .siHFe, html code.shiki .siHFe{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#5DE4C7}html pre.shiki code .s1jWp, html code.shiki .s1jWp{--shiki-light:#E36209;--shiki-default:#E36209;--shiki-dark:#E4F0FB}html pre.shiki code .s8yaW, html code.shiki .s8yaW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#A6ACCDC0}html pre.shiki code .sqT1Y, html code.shiki .sqT1Y{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#ADD7FF}html pre.shiki code .sULi6, html code.shiki .sULi6{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#E4F0FBD0}html pre.shiki code .spVlQ, html code.shiki .spVlQ{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E4F0FB}html pre.shiki code .szlwh, html code.shiki .szlwh{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#D0679D}html pre.shiki code .s-lox, html code.shiki .s-lox{--shiki-light:#005CC5;--shiki-light-font-style:inherit;--shiki-default:#005CC5;--shiki-default-font-style:inherit;--shiki-dark:#5DE4C7;--shiki-dark-font-style:italic}html pre.shiki code .sZW6a, html code.shiki .sZW6a{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#5DE4C7C0}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);}",{"title":230,"searchDepth":284,"depth":284,"links":983},[984,985,986,987],{"id":204,"depth":284,"text":205},{"id":817,"depth":284,"text":818},{"id":938,"depth":284,"text":939},{"id":953,"depth":284,"text":954},"Extend the abstract Chain with a key and a validator and register the class. From then on the registry treats it like a built-in.","md",null,{"icon":992},"i-lucide-plus",{"title":36,"description":988},"shoPL8trNZ4lohgzPSyQKbewZOVbvYykonsSe1CGY3w",[996,998],{"title":32,"path":33,"stem":34,"description":997,"children":-1},"The same five tools over MCP and the Pi and OMP extensions. What the text carries and what sets isError. What a model can't hand the process.",{"title":40,"path":41,"stem":42,"description":999,"children":-1},"The page behind chains.agntn.dev\u002Fplayground runs the library in your browser. What it can tell you and what it can't.",1790447828962]