[{"data":1,"prerenderedAt":1116},["ShallowReactive",2],{"navigation_docs":3,"-guide-custom":80,"-guide-custom-surround":1111},[4,56],{"title":5,"path":6,"stem":7,"children":8,"icon":55},"Guide","\u002Fguide","1.guide\u002F01.index",[9,11,15,19,23,27,31,35,39,43,47,51],{"title":10,"path":6,"stem":7},"Getting Started",{"title":12,"path":13,"stem":14},"Authentication","\u002Fguide\u002Fauth","1.guide\u002F02.auth",{"title":16,"path":17,"stem":18},"Repositories","\u002Fguide\u002Frepositories","1.guide\u002F03.repositories",{"title":20,"path":21,"stem":22},"Issues","\u002Fguide\u002Fissues","1.guide\u002F04.issues",{"title":24,"path":25,"stem":26},"Pull requests","\u002Fguide\u002Fpull-requests","1.guide\u002F05.pull-requests",{"title":28,"path":29,"stem":30},"Review threads","\u002Fguide\u002Fthreads","1.guide\u002F06.threads",{"title":32,"path":33,"stem":34},"Commits and CI","\u002Fguide\u002Fcommits","1.guide\u002F07.commits",{"title":36,"path":37,"stem":38},"Contribution templates","\u002Fguide\u002Ftemplates","1.guide\u002F08.templates",{"title":40,"path":41,"stem":42},"Code search","\u002Fguide\u002Fcode-search","1.guide\u002F09.code-search",{"title":44,"path":45,"stem":46},"Agents","\u002Fguide\u002Fagents","1.guide\u002F10.agents",{"title":48,"path":49,"stem":50},"Custom providers","\u002Fguide\u002Fcustom","1.guide\u002F11.custom",{"title":52,"path":53,"stem":54},"Explorer","\u002Fguide\u002Fexplorer","1.guide\u002F12.explorer","i-lucide-book-open",{"title":57,"path":58,"stem":59,"children":60,"icon":79},"Platforms","\u002Fplatforms","2.platforms\u002F0.index",[61,63,67,71,75],{"title":62,"path":58,"stem":59},"Overview",{"title":64,"path":65,"stem":66},"GitHub","\u002Fplatforms\u002Fgithub","2.platforms\u002F01.github",{"title":68,"path":69,"stem":70},"GitLab","\u002Fplatforms\u002Fgitlab","2.platforms\u002F02.gitlab",{"title":72,"path":73,"stem":74},"Gitea","\u002Fplatforms\u002Fgitea","2.platforms\u002F03.gitea",{"title":76,"path":77,"stem":78},"GitBucket","\u002Fplatforms\u002Fgitbucket","2.platforms\u002F04.gitbucket","i-lucide-library",{"id":81,"title":48,"body":82,"description":1104,"extension":1105,"links":1106,"meta":1107,"navigation":311,"path":49,"seo":1109,"stem":50,"__hash__":1110},"docs\u002F1.guide\u002F11.custom.md",{"type":83,"value":84,"toc":1098},"minimark",[85,90,163,181,184,727,738,742,749,753,827,877,881,1087,1094],[86,87,89],"h2",{"id":88},"the-base-class","The base class",[91,92,97],"pre",{"className":93,"code":94,"language":95,"meta":96,"style":96},"language-ts shiki shiki-themes github-light github-light poimandres","import { Provider } from \"@agntn\u002Fforges\";\nimport type { ProviderRawTypes } from \"@agntn\u002Fforges\";\n","ts","",[98,99,100,138],"code",{"__ignoreMap":96},[101,102,105,109,113,117,120,124,128,132,135],"span",{"class":103,"line":104},"line",1,[101,106,108],{"class":107},"sP0CR","import",[101,110,112],{"class":111},"sKlNE"," {",[101,114,116],{"class":115},"snHMy"," Provider",[101,118,119],{"class":111}," }",[101,121,123],{"class":122},"stCPd"," from",[101,125,127],{"class":126},"scVjq"," \"",[101,129,131],{"class":130},"sQ7BG","@agntn\u002Fforges",[101,133,134],{"class":126},"\"",[101,136,137],{"class":111},";\n",[101,139,141,143,146,148,151,153,155,157,159,161],{"class":103,"line":140},2,[101,142,108],{"class":107},[101,144,145],{"class":122}," type",[101,147,112],{"class":111},[101,149,150],{"class":115}," ProviderRawTypes",[101,152,119],{"class":111},[101,154,123],{"class":122},[101,156,127],{"class":126},[101,158,131],{"class":130},[101,160,134],{"class":126},[101,162,137],{"class":111},[164,165,166,169,170,173,174,173,177,180],"p",{},[98,167,168],{},"Provider"," owns the nine resource accessors. Its constructor binds ",[98,171,172],{},"repos",", ",[98,175,176],{},"issues",[98,178,179],{},"pullRequests"," and the rest to protected methods you implement, and does the argument checks that are the same everywhere: an empty search query, a repository scope without an owner, two assignees where the platform takes one.",[164,182,183],{},"A concrete class brings its raw response types and the mappers:",[91,185,187],{"className":93,"code":186,"language":95,"meta":96,"style":96},"interface MyRawTypes extends ProviderRawTypes {\n  owner: MyRawOwner;\n  repository: MyRawRepository;\n  issue: MyRawIssue;\n  pullRequest: MyRawPullRequest;\n  user: MyRawUser;\n  thread: MyRawThread;\n  comment: MyRawComment;\n}\n\nexport class MyProvider extends Provider\u003CMyRawTypes> {\n  constructor(config: ProviderConfig) {\n    super();\n    \u002F\u002F create an HTTP client with the platform's auth header\n  }\n\n  protected mapRepository(raw: MyRawRepository): Repository {\n    return {\n      id: String(raw.id),\n      name: raw.name,\n      fullName: raw.full_name,\n      \u002F\u002F …\n    };\n  }\n\n  protected async getRepo(owner: string, repo: string): Promise\u003CRepository> {\n    try {\n      const data = await this.client\u003CMyRawRepository>(`\u002Frepos\u002F${owner}\u002F${repo}`);\n      return this.mapRepository(data);\n    } catch (error) {\n      throw normalizeError(error, \"my-platform\");\n    }\n  }\n\n  \u002F\u002F listRepos, listIssues, getIssue, createIssue, listPullRequests, getPullRequest,\n  \u002F\u002F createPullRequest, listIssueComments, listPullRequestComments, getIssueComment,\n  \u002F\u002F getPullRequestComment, getUser, getAuthenticatedUser, getCommit,\n  \u002F\u002F listThreads, getThread, replyToThread, resolveThread, unresolveThread\n}\n",[98,188,189,208,222,235,248,261,274,287,300,306,313,338,359,369,376,382,387,415,424,450,469,486,492,498,503,508,553,562,621,641,658,682,688,693,698,704,710,716,722],{"__ignoreMap":96},[101,190,191,195,199,202,205],{"class":103,"line":104},[101,192,194],{"class":193},"s1TYA","interface",[101,196,198],{"class":197},"sCrqT"," MyRawTypes",[101,200,201],{"class":107}," extends",[101,203,150],{"class":204},"scZRh",[101,206,207],{"class":111}," {\n",[101,209,210,214,217,220],{"class":103,"line":140},[101,211,213],{"class":212},"s0VbO","  owner",[101,215,216],{"class":193},":",[101,218,219],{"class":197}," MyRawOwner",[101,221,137],{"class":111},[101,223,225,228,230,233],{"class":103,"line":224},3,[101,226,227],{"class":212},"  repository",[101,229,216],{"class":193},[101,231,232],{"class":197}," MyRawRepository",[101,234,137],{"class":111},[101,236,238,241,243,246],{"class":103,"line":237},4,[101,239,240],{"class":212},"  issue",[101,242,216],{"class":193},[101,244,245],{"class":197}," MyRawIssue",[101,247,137],{"class":111},[101,249,251,254,256,259],{"class":103,"line":250},5,[101,252,253],{"class":212},"  pullRequest",[101,255,216],{"class":193},[101,257,258],{"class":197}," MyRawPullRequest",[101,260,137],{"class":111},[101,262,264,267,269,272],{"class":103,"line":263},6,[101,265,266],{"class":212},"  user",[101,268,216],{"class":193},[101,270,271],{"class":197}," MyRawUser",[101,273,137],{"class":111},[101,275,277,280,282,285],{"class":103,"line":276},7,[101,278,279],{"class":212},"  thread",[101,281,216],{"class":193},[101,283,284],{"class":197}," MyRawThread",[101,286,137],{"class":111},[101,288,290,293,295,298],{"class":103,"line":289},8,[101,291,292],{"class":212},"  comment",[101,294,216],{"class":193},[101,296,297],{"class":197}," MyRawComment",[101,299,137],{"class":111},[101,301,303],{"class":103,"line":302},9,[101,304,305],{"class":111},"}\n",[101,307,309],{"class":103,"line":308},10,[101,310,312],{"emptyLinePlaceholder":311},true,"\n",[101,314,316,319,322,325,327,329,332,335],{"class":103,"line":315},11,[101,317,318],{"class":107},"export",[101,320,321],{"class":193}," class",[101,323,324],{"class":204}," MyProvider",[101,326,201],{"class":107},[101,328,116],{"class":204},[101,330,331],{"class":111},"\u003C",[101,333,334],{"class":197},"MyRawTypes",[101,336,337],{"class":111},"> {\n",[101,339,341,344,347,351,353,356],{"class":103,"line":340},12,[101,342,343],{"class":193},"  constructor",[101,345,346],{"class":111},"(",[101,348,350],{"class":349},"s1jWp","config",[101,352,216],{"class":193},[101,354,355],{"class":197}," ProviderConfig",[101,357,358],{"class":111},") {\n",[101,360,362,366],{"class":103,"line":361},13,[101,363,365],{"class":364},"s-lox","    super",[101,367,368],{"class":111},"();\n",[101,370,372],{"class":103,"line":371},14,[101,373,375],{"class":374},"sjhu3","    \u002F\u002F create an HTTP client with the platform's auth header\n",[101,377,379],{"class":103,"line":378},15,[101,380,381],{"class":111},"  }\n",[101,383,385],{"class":103,"line":384},16,[101,386,312],{"emptyLinePlaceholder":311},[101,388,390,393,396,398,401,403,405,408,410,413],{"class":103,"line":389},17,[101,391,392],{"class":107},"  protected",[101,394,395],{"class":204}," mapRepository",[101,397,346],{"class":111},[101,399,400],{"class":349},"raw",[101,402,216],{"class":193},[101,404,232],{"class":197},[101,406,407],{"class":111},")",[101,409,216],{"class":193},[101,411,412],{"class":197}," Repository",[101,414,207],{"class":111},[101,416,418,422],{"class":103,"line":417},18,[101,419,421],{"class":420},"sZW6a","    return",[101,423,207],{"class":111},[101,425,427,430,432,436,438,441,444,447],{"class":103,"line":426},19,[101,428,429],{"class":115},"      id",[101,431,216],{"class":111},[101,433,435],{"class":434},"sULi6"," String",[101,437,346],{"class":111},[101,439,400],{"class":440},"spVlQ",[101,442,443],{"class":111},".",[101,445,446],{"class":440},"id",[101,448,449],{"class":111},"),\n",[101,451,453,456,458,461,463,466],{"class":103,"line":452},20,[101,454,455],{"class":115},"      name",[101,457,216],{"class":111},[101,459,460],{"class":440}," raw",[101,462,443],{"class":111},[101,464,465],{"class":440},"name",[101,467,468],{"class":111},",\n",[101,470,472,475,477,479,481,484],{"class":103,"line":471},21,[101,473,474],{"class":115},"      fullName",[101,476,216],{"class":111},[101,478,460],{"class":440},[101,480,443],{"class":111},[101,482,483],{"class":440},"full_name",[101,485,468],{"class":111},[101,487,489],{"class":103,"line":488},22,[101,490,491],{"class":374},"      \u002F\u002F …\n",[101,493,495],{"class":103,"line":494},23,[101,496,497],{"class":111},"    };\n",[101,499,501],{"class":103,"line":500},24,[101,502,381],{"class":111},[101,504,506],{"class":103,"line":505},25,[101,507,312],{"emptyLinePlaceholder":311},[101,509,511,513,516,519,521,524,526,530,532,535,537,539,541,543,546,548,551],{"class":103,"line":510},26,[101,512,392],{"class":107},[101,514,515],{"class":107}," async",[101,517,518],{"class":204}," getRepo",[101,520,346],{"class":111},[101,522,523],{"class":349},"owner",[101,525,216],{"class":193},[101,527,529],{"class":528},"s8yaW"," string",[101,531,173],{"class":111},[101,533,534],{"class":349},"repo",[101,536,216],{"class":193},[101,538,529],{"class":528},[101,540,407],{"class":111},[101,542,216],{"class":193},[101,544,545],{"class":197}," Promise",[101,547,331],{"class":111},[101,549,550],{"class":197},"Repository",[101,552,337],{"class":111},[101,554,556,560],{"class":103,"line":555},27,[101,557,559],{"class":558},"szlwh","    try",[101,561,207],{"class":111},[101,563,565,568,572,575,578,581,583,586,588,591,594,597,600,603,605,608,611,613,615,618],{"class":103,"line":564},28,[101,566,567],{"class":193},"      const",[101,569,571],{"class":570},"saoiD"," data",[101,573,574],{"class":193}," =",[101,576,577],{"class":420}," await",[101,579,580],{"class":364}," this",[101,582,443],{"class":111},[101,584,585],{"class":434},"client",[101,587,331],{"class":111},[101,589,590],{"class":197},"MyRawRepository",[101,592,593],{"class":111},">(",[101,595,596],{"class":126},"`",[101,598,599],{"class":130},"\u002Frepos\u002F",[101,601,602],{"class":126},"${",[101,604,523],{"class":440},[101,606,607],{"class":126},"}",[101,609,610],{"class":130},"\u002F",[101,612,602],{"class":126},[101,614,534],{"class":440},[101,616,617],{"class":126},"}`",[101,619,620],{"class":111},");\n",[101,622,624,627,629,631,634,636,639],{"class":103,"line":623},29,[101,625,626],{"class":420},"      return",[101,628,580],{"class":364},[101,630,443],{"class":111},[101,632,633],{"class":434},"mapRepository",[101,635,346],{"class":111},[101,637,638],{"class":440},"data",[101,640,620],{"class":111},[101,642,644,647,650,653,656],{"class":103,"line":643},30,[101,645,646],{"class":111},"    } ",[101,648,649],{"class":558},"catch",[101,651,652],{"class":111}," (",[101,654,655],{"class":440},"error",[101,657,358],{"class":111},[101,659,661,664,667,669,671,673,675,678,680],{"class":103,"line":660},31,[101,662,663],{"class":558},"      throw",[101,665,666],{"class":434}," normalizeError",[101,668,346],{"class":111},[101,670,655],{"class":440},[101,672,173],{"class":111},[101,674,134],{"class":126},[101,676,677],{"class":130},"my-platform",[101,679,134],{"class":126},[101,681,620],{"class":111},[101,683,685],{"class":103,"line":684},32,[101,686,687],{"class":111},"    }\n",[101,689,691],{"class":103,"line":690},33,[101,692,381],{"class":111},[101,694,696],{"class":103,"line":695},34,[101,697,312],{"emptyLinePlaceholder":311},[101,699,701],{"class":103,"line":700},35,[101,702,703],{"class":374},"  \u002F\u002F listRepos, listIssues, getIssue, createIssue, listPullRequests, getPullRequest,\n",[101,705,707],{"class":103,"line":706},36,[101,708,709],{"class":374},"  \u002F\u002F createPullRequest, listIssueComments, listPullRequestComments, getIssueComment,\n",[101,711,713],{"class":103,"line":712},37,[101,714,715],{"class":374},"  \u002F\u002F getPullRequestComment, getUser, getAuthenticatedUser, getCommit,\n",[101,717,719],{"class":103,"line":718},38,[101,720,721],{"class":374},"  \u002F\u002F listThreads, getThread, replyToThread, resolveThread, unresolveThread\n",[101,723,725],{"class":103,"line":724},39,[101,726,305],{"class":111},[164,728,729,730,733,734,737],{},"Mappers are pure: raw in, normalized out, nothing else. IDs are strings, always ",[98,731,732],{},"String(raw.id)",", because one platform sends numbers and the day you compare ",[98,735,736],{},"123 === \"123\""," is a bad day.",[86,739,741],{"id":740},"what-you-may-skip","What you may skip",[164,743,744,745,748],{},"Contribution templates, code search, CI runs, commit lists, issue and pull request search, pull request files and pull request checks all have defaults that reject with a ",[98,746,747],{},"ForgesError"," of status 501 and a sentence naming the operation. Implement what your platform has. The rest fails honestly instead of pretending.",[86,750,752],{"id":751},"the-building-blocks","The building blocks",[91,754,756],{"className":93,"code":755,"language":95,"meta":96,"style":96},"import {\n  createHttpClient,\n  rawFetch,\n  normalizeError,\n  parseLinkHeader,\n  paginate,\n  fetchAllPages,\n  cachedFetch,\n} from \"@agntn\u002Fforges\";\n",[98,757,758,764,771,778,785,792,799,806,813],{"__ignoreMap":96},[101,759,760,762],{"class":103,"line":104},[101,761,108],{"class":107},[101,763,207],{"class":111},[101,765,766,769],{"class":103,"line":140},[101,767,768],{"class":115},"  createHttpClient",[101,770,468],{"class":111},[101,772,773,776],{"class":103,"line":224},[101,774,775],{"class":115},"  rawFetch",[101,777,468],{"class":111},[101,779,780,783],{"class":103,"line":237},[101,781,782],{"class":115},"  normalizeError",[101,784,468],{"class":111},[101,786,787,790],{"class":103,"line":250},[101,788,789],{"class":115},"  parseLinkHeader",[101,791,468],{"class":111},[101,793,794,797],{"class":103,"line":263},[101,795,796],{"class":115},"  paginate",[101,798,468],{"class":111},[101,800,801,804],{"class":103,"line":276},[101,802,803],{"class":115},"  fetchAllPages",[101,805,468],{"class":111},[101,807,808,811],{"class":103,"line":289},[101,809,810],{"class":115},"  cachedFetch",[101,812,468],{"class":111},[101,814,815,817,819,821,823,825],{"class":103,"line":302},[101,816,607],{"class":111},[101,818,123],{"class":122},[101,820,127],{"class":126},[101,822,131],{"class":130},[101,824,134],{"class":126},[101,826,137],{"class":111},[828,829,830,837,843,862,868],"ul",{},[831,832,833,836],"li",{},[98,834,835],{},"createHttpClient({ baseURL, token, tokenHeader, tokenPrefix })"," is the ofetch wrapper with auth, retry and rate limit handling the shipped providers use.",[831,838,839,842],{},[98,840,841],{},"rawFetch"," returns the headers too, which a list needs for pagination.",[831,844,845,848,849,852,853,173,856,173,859,443],{},[98,846,847],{},"parseLinkHeader"," reads a ",[98,850,851],{},"Link"," header into ",[98,854,855],{},"next",[98,857,858],{},"prev",[98,860,861],{},"last",[831,863,864,867],{},[98,865,866],{},"cachedFetch"," caches a GET and refuses anything else.",[831,869,870,873,874,876],{},[98,871,872],{},"normalizeError(error, platform)"," maps a transport error onto the ",[98,875,747],{}," hierarchy. Every operation ends with it. No raw throws, ever.",[86,878,880],{"id":879},"sub-path-imports","Sub path imports",[91,882,884],{"className":93,"code":883,"language":95,"meta":96,"style":96},"import { GitHubProvider } from \"@agntn\u002Fforges\u002Fgithub\";\nimport { GitLabProvider } from \"@agntn\u002Fforges\u002Fgitlab\";\nimport { GiteaProvider } from \"@agntn\u002Fforges\u002Fgitea\";\nimport { Provider } from \"@agntn\u002Fforges\u002Fprovider\";\nimport type { Repository } from \"@agntn\u002Fforges\u002Ftypes\";\n\nconst gitea = new GiteaProvider({\n  token: process.env.GITEA_TOKEN,\n  baseURL: \"https:\u002F\u002Fcodeberg.org\",\n});\nconsole.log(gitea instanceof Provider); \u002F\u002F true\n",[98,885,886,908,930,952,973,996,1000,1018,1040,1056,1061],{"__ignoreMap":96},[101,887,888,890,892,895,897,899,901,904,906],{"class":103,"line":104},[101,889,108],{"class":107},[101,891,112],{"class":111},[101,893,894],{"class":115}," GitHubProvider",[101,896,119],{"class":111},[101,898,123],{"class":122},[101,900,127],{"class":126},[101,902,903],{"class":130},"@agntn\u002Fforges\u002Fgithub",[101,905,134],{"class":126},[101,907,137],{"class":111},[101,909,910,912,914,917,919,921,923,926,928],{"class":103,"line":140},[101,911,108],{"class":107},[101,913,112],{"class":111},[101,915,916],{"class":115}," GitLabProvider",[101,918,119],{"class":111},[101,920,123],{"class":122},[101,922,127],{"class":126},[101,924,925],{"class":130},"@agntn\u002Fforges\u002Fgitlab",[101,927,134],{"class":126},[101,929,137],{"class":111},[101,931,932,934,936,939,941,943,945,948,950],{"class":103,"line":224},[101,933,108],{"class":107},[101,935,112],{"class":111},[101,937,938],{"class":115}," GiteaProvider",[101,940,119],{"class":111},[101,942,123],{"class":122},[101,944,127],{"class":126},[101,946,947],{"class":130},"@agntn\u002Fforges\u002Fgitea",[101,949,134],{"class":126},[101,951,137],{"class":111},[101,953,954,956,958,960,962,964,966,969,971],{"class":103,"line":237},[101,955,108],{"class":107},[101,957,112],{"class":111},[101,959,116],{"class":115},[101,961,119],{"class":111},[101,963,123],{"class":122},[101,965,127],{"class":126},[101,967,968],{"class":130},"@agntn\u002Fforges\u002Fprovider",[101,970,134],{"class":126},[101,972,137],{"class":111},[101,974,975,977,979,981,983,985,987,989,992,994],{"class":103,"line":250},[101,976,108],{"class":107},[101,978,145],{"class":122},[101,980,112],{"class":111},[101,982,412],{"class":115},[101,984,119],{"class":111},[101,986,123],{"class":122},[101,988,127],{"class":126},[101,990,991],{"class":130},"@agntn\u002Fforges\u002Ftypes",[101,993,134],{"class":126},[101,995,137],{"class":111},[101,997,998],{"class":103,"line":263},[101,999,312],{"emptyLinePlaceholder":311},[101,1001,1002,1005,1008,1010,1013,1015],{"class":103,"line":276},[101,1003,1004],{"class":193},"const",[101,1006,1007],{"class":570}," gitea",[101,1009,574],{"class":193},[101,1011,1012],{"class":107}," new",[101,1014,938],{"class":434},[101,1016,1017],{"class":111},"({\n",[101,1019,1020,1023,1025,1028,1030,1033,1035,1038],{"class":103,"line":289},[101,1021,1022],{"class":115},"  token",[101,1024,216],{"class":111},[101,1026,1027],{"class":440}," process",[101,1029,443],{"class":111},[101,1031,1032],{"class":440},"env",[101,1034,443],{"class":111},[101,1036,1037],{"class":570},"GITEA_TOKEN",[101,1039,468],{"class":111},[101,1041,1042,1045,1047,1049,1052,1054],{"class":103,"line":302},[101,1043,1044],{"class":115},"  baseURL",[101,1046,216],{"class":111},[101,1048,127],{"class":126},[101,1050,1051],{"class":130},"https:\u002F\u002Fcodeberg.org",[101,1053,134],{"class":126},[101,1055,468],{"class":111},[101,1057,1058],{"class":103,"line":308},[101,1059,1060],{"class":111},"});\n",[101,1062,1063,1066,1068,1071,1073,1076,1079,1081,1084],{"class":103,"line":315},[101,1064,1065],{"class":440},"console",[101,1067,443],{"class":111},[101,1069,1070],{"class":434},"log",[101,1072,346],{"class":111},[101,1074,1075],{"class":440},"gitea",[101,1077,1078],{"class":193}," instanceof",[101,1080,116],{"class":197},[101,1082,1083],{"class":111},"); ",[101,1085,1086],{"class":374},"\u002F\u002F true\n",[164,1088,1089,1090,1093],{},"One provider without the other two, better for tree shaking. Constructing a class directly skips the token detection of ",[98,1091,1092],{},"createProvider",", so pass the token yourself.",[1095,1096,1097],"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 .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 .s1TYA, html code.shiki .s1TYA{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#91B4D5}html pre.shiki code .sCrqT, html code.shiki .sCrqT{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#A6ACCDC0}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 .s1jWp, html code.shiki .s1jWp{--shiki-light:#E36209;--shiki-default:#E36209;--shiki-dark:#E4F0FB}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 .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 .sZW6a, html code.shiki .sZW6a{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#5DE4C7C0}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 .s8yaW, html code.shiki .s8yaW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#A6ACCDC0}html pre.shiki code .szlwh, html code.shiki .szlwh{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#D0679D}html pre.shiki code .saoiD, html code.shiki .saoiD{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#E4F0FB}",{"title":96,"searchDepth":140,"depth":140,"links":1099},[1100,1101,1102,1103],{"id":88,"depth":140,"text":89},{"id":740,"depth":140,"text":741},{"id":751,"depth":140,"text":752},{"id":879,"depth":140,"text":880},"Extend the abstract Provider for a platform this package does not know, implement the typed mappers, and get the nine resources for free.","md",null,{"icon":1108},"i-lucide-plus",{"title":48,"description":1104},"8kdc-ElLuGePW9-J6zBOgOjnCfTNPOta4J3BaDeyEhE",[1112,1114],{"title":44,"path":45,"stem":46,"description":1113,"children":-1},"The same thirty tools over MCP, the Pi extension and the OMP extension, what they hold back, and how tokens and hosts stay out of a model's hands.",{"title":52,"path":53,"stem":54,"description":1115,"children":-1},"The explorer page behind forges.agntn.dev that runs the library live, and what it does to be a good citizen.",1788525966686]