[{"data":1,"prerenderedAt":1255},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Farchitecture":135,"\u002Fdocs\u002Farchitecture-surround":1250},[4],{"title":5,"path":6,"stem":7,"children":8,"page":134},"Docs","\u002Fdocs","docs",[9,13,17,21,25,29,33,37,41,45,49,53,57,61,70,74,78,82,86,90,94,98,102,106,110,114,118,122,126,130],{"title":10,"path":11,"stem":12},"AI harnesses: LLM tools, MCP servers and agents","\u002Fdocs\u002Fai-tools","docs\u002Fai-tools",{"title":14,"path":15,"stem":16},"Architecture","\u002Fdocs\u002Farchitecture","docs\u002Farchitecture",{"title":18,"path":19,"stem":20},"Web \u002F native bridges","\u002Fdocs\u002Fbridges","docs\u002Fbridges",{"title":22,"path":23,"stem":24},"Broadcast channels and tests","\u002Fdocs\u002Fchannels-and-tests","docs\u002Fchannels-and-tests",{"title":26,"path":27,"stem":28},"CLI reference","\u002Fdocs\u002Fcli","docs\u002Fcli",{"title":30,"path":31,"stem":32},"Completeness: how far an answer reaches","\u002Fdocs\u002Fcompleteness","docs\u002Fcompleteness",{"title":34,"path":35,"stem":36},"Configuration","\u002Fdocs\u002Fconfiguration","docs\u002Fconfiguration",{"title":38,"path":39,"stem":40},"External systems","\u002Fdocs\u002Fexternal","docs\u002Fexternal",{"title":42,"path":43,"stem":44},"Generated, copied and vendored files","\u002Fdocs\u002Fgenerated","docs\u002Fgenerated",{"title":46,"path":47,"stem":48},"Installing and updating cg","\u002Fdocs\u002Finstall","docs\u002Finstall",{"title":50,"path":51,"stem":52},"Java","\u002Fdocs\u002Fjava","docs\u002Fjava",{"title":54,"path":55,"stem":56},"Kotlin","\u002Fdocs\u002Fkotlin","docs\u002Fkotlin",{"title":58,"path":59,"stem":60},"Known limitations","\u002Fdocs\u002Flimitations","docs\u002Flimitations",{"title":62,"path":63,"stem":64,"children":65},"MCP server","\u002Fdocs\u002Fmcp","docs\u002Fmcp",[66],{"title":67,"path":68,"stem":69},"code-graph MCP: sample outputs (real calls via the MCP Python SDK stdio client)","\u002Fdocs\u002Fmcp\u002Fsample_outputs","docs\u002Fmcp\u002Fsample_outputs",{"title":71,"path":72,"stem":73},"Rust, C and C++","\u002Fdocs\u002Fnative","docs\u002Fnative",{"title":75,"path":76,"stem":77},"Port gaps: cg parity","\u002Fdocs\u002Fparity","docs\u002Fparity",{"title":79,"path":80,"stem":81},"PHP","\u002Fdocs\u002Fphp","docs\u002Fphp",{"title":83,"path":84,"stem":85},"Planned changes","\u002Fdocs\u002Fplans","docs\u002Fplans",{"title":87,"path":88,"stem":89},"Platform-specific code","\u002Fdocs\u002Fplatforms","docs\u002Fplatforms",{"title":91,"path":92,"stem":93},"Protocol links","\u002Fdocs\u002Fprotocols","docs\u002Fprotocols",{"title":95,"path":96,"stem":97},"Python","\u002Fdocs\u002Fpython","docs\u002Fpython",{"title":99,"path":100,"stem":101},"Quick start","\u002Fdocs\u002Fquickstart","docs\u002Fquickstart",{"title":103,"path":104,"stem":105},"Graph schema","\u002Fdocs\u002Fschema","docs\u002Fschema",{"title":107,"path":108,"stem":109},"Attack surface","\u002Fdocs\u002Fsurface","docs\u002Fsurface",{"title":111,"path":112,"stem":113},"Swift","\u002Fdocs\u002Fswift","docs\u002Fswift",{"title":115,"path":116,"stem":117},"TypeScript \u002F JavaScript frameworks","\u002Fdocs\u002Fts-frameworks","docs\u002Fts-frameworks",{"title":119,"path":120,"stem":121},"How we validate","\u002Fdocs\u002Fvalidation","docs\u002Fvalidation",{"title":123,"path":124,"stem":125},"Validation log","\u002Fdocs\u002Fvalidation-log","docs\u002Fvalidation-log",{"title":127,"path":128,"stem":129},"Value facts and resolutions","\u002Fdocs\u002Fvalue-facts","docs\u002Fvalue-facts",{"title":131,"path":132,"stem":133},"Visual view","\u002Fdocs\u002Fviz","docs\u002Fviz",false,{"id":136,"title":14,"body":137,"description":143,"extension":1246,"meta":1247,"navigation":620,"path":15,"seo":1248,"stem":16,"__hash__":1249},"docs\u002Fdocs\u002Farchitecture.md",{"type":138,"value":139,"toc":1237},"minimark",[140,144,149,152,208,212,222,321,349,362,376,387,465,482,486,734,737,792,806,823,827,904,932,936,1019,1063,1068,1084,1152,1177,1233],[141,142,143],"p",{},"An index is a deterministic graph in SQLite. Queries, MCP, and the visual view read that graph.\nWhat each language extracts lives on its own page. This page is the pipeline and the rules every plugin shares.",[145,146,148],"h2",{"id":147},"invariants","Invariants",[141,150,151],{},"These hold everywhere in the code base. A change that breaks one is a design change.",[153,154,155,163,186,192,198],"ul",{},[156,157,158,162],"li",{},[159,160,161],"strong",{},"Deterministic edges."," Every edge comes from a parser, the type checker, or a named rule. The same code gives the same graph.",[156,164,165,168,169,173,174,177,178,181,182,185],{},[159,166,167],{},"Edges carry evidence."," The ",[170,171,172],"code",{},"file:line"," that produced the edge, plus a confidence: ",[170,175,176],{},"exact",", ",[170,179,180],{},"resolved",", or ",[170,183,184],{},"heuristic",".",[156,187,188,191],{},[159,189,190],{},"Static analysis."," The indexer reads source files. The app, its code, and its databases stay untouched.",[156,193,194,197],{},[159,195,196],{},"Plans are overlays."," Loading or checking a plan leaves the graph DB unchanged.",[156,199,200,203,204,207],{},[159,201,202],{},"Read-only serving."," MCP and the visual view only read the graph. The MCP ",[170,205,206],{},"index"," tool rebuilds it from source.",[145,209,211],{"id":210},"index-store-query","Index, store, query",[213,214,220],"pre",{"className":215,"code":217,"language":218,"meta":219},[216],"language-text","source files\n    │  detect languages and frameworks\n    ▼\nlanguage plugin.index()\n    │  framework hooks, then framework.contribute()\n    ▼\nGraphBuilder  →  SQLite (core\u002Fstore.py)\n    │\n    ├── query.py      reaches, impact, path, writers, readers\n    ├── link.py       N repo DBs → one DB (`link` is the two-repo form)\n    ├── plans.py      overlay checks (the DB stays unchanged)\n    ├── mcp_server    stdio; read-only except index\n    └── viz\u002F          local read-only web view\n","text","",[170,221,217],{"__ignoreMap":219},[223,224,225,241],"table",{},[226,227,228],"thead",{},[229,230,231,235,238],"tr",{},[232,233,234],"th",{},"step",[232,236,237],{},"who",[232,239,240],{},"result",[242,243,244,270,282,295,308],"tbody",{},[229,245,246,250,267],{},[247,248,249],"td",{},"detect",[247,251,252,255,256,259,260,263,264],{},[170,253,254],{},"core\u002Fdetect.py",", then ",[170,257,258],{},".cg.yaml"," ",[170,261,262],{},"frameworks.add"," \u002F ",[170,265,266],{},"remove",[247,268,269],{},"the active languages and frameworks",[229,271,272,274,279],{},[247,273,206],{},[247,275,276],{},[170,277,278],{},"LanguagePlugin.index",[247,280,281],{},"syntax nodes, calls, a per-file report",[229,283,284,287,292],{},[247,285,286],{},"hooks",[247,288,289],{},[170,290,291],{},"FrameworkPlugin.register_hooks",[247,293,294],{},"type rules and fact handlers, before resolution",[229,296,297,300,305],{},[247,298,299],{},"contribute",[247,301,302],{},[170,303,304],{},"FrameworkPlugin.contribute",[247,306,307],{},"framework nodes and edges",[229,309,310,313,318],{},[247,311,312],{},"finish",[247,314,315],{},[170,316,317],{},"indexer.py",[247,319,320],{},"completeness, entry tags, the SQLite write",[141,322,323,324,177,327,177,330,177,333,336,337,340,341,344,345,348],{},"Marker files include ",[170,325,326],{},"composer.json",[170,328,329],{},"package.json",[170,331,332],{},"Cargo.toml",[170,334,335],{},"pyproject.toml",", and ",[170,338,339],{},"Package.swift",".\nPresets in ",[170,342,343],{},"presets\u002F"," supply guard names and skip lists (common, then language, then framework) and are stored in graph meta. ",[170,346,347],{},"routes"," reads them back.",[141,350,351,354,355,357,358,361],{},[170,352,353],{},"core\u002Fpaths.py"," is the one skip list and ",[170,356,258],{}," exclude set.\nEvery plugin and the coverage scan use it, so the same rules decide what is indexed and what ",[170,359,360],{},"cg coverage"," counts.",[141,363,364,367,368,371,372,375],{},[170,365,366],{},"GraphBuilder.add_node(kind, key, …)"," gives the id ",[170,369,370],{},"kind:key",". ",[170,373,374],{},"add_edge"," stores the edge with its evidence.",[141,377,378,379,382,383,386],{},"After ",[170,380,381],{},"index()",", a plugin may set ",[170,384,385],{},"self.file_report"," (repo-relative paths):",[223,388,389,399],{},[226,390,391],{},[229,392,393,396],{},[232,394,395],{},"key",[232,397,398],{},"meaning",[242,400,401,411,421,431,441,451],{},[229,402,403,408],{},[247,404,405],{},[170,406,407],{},"seen",[247,409,410],{},"files that became nodes",[229,412,413,418],{},[247,414,415],{},[170,416,417],{},"parse_failed",[247,419,420],{},"syntax errors",[229,422,423,428],{},[247,424,425],{},[170,426,427],{},"skipped_oversize",[247,429,430],{},"over the size limit",[229,432,433,438],{},[247,434,435],{},[170,436,437],{},"unmapped",[247,439,440],{},"parsed, not placed in the module table",[229,442,443,448],{},[247,444,445],{},[170,446,447],{},"excluded",[247,449,450],{},"left out by skips or exclude globs",[229,452,453,458],{},[247,454,455],{},[170,456,457],{},"roots",[247,459,460,461,464],{},"directories (ending in ",[170,462,463],{},"\u002F",") and files the plugin reads",[141,466,467,470,471,475,476,478,479,481],{},[170,468,469],{},"coverage.py"," buckets every discovered file of that language from the report (",[472,473,474],"a",{"href":31},"Completeness",").\nA file missing from ",[170,477,407],{}," counts as excluded, or as unmapped when the report has ",[170,480,457],{}," and the file sits under none of them.",[145,483,485],{"id":484},"plugins","Plugins",[213,487,491],{"className":488,"code":489,"language":490,"meta":219,"style":219},"language-python shiki shiki-themes cg-light cg-light cg-dark","class LanguagePlugin(ABC):\n    name: str\n    def detect(self, project: Project) -> bool\n    def index(self, project, builder: GraphBuilder, frameworks: list[FrameworkPlugin]) -> dict\n\nclass FrameworkPlugin(ABC):    # Laravel on PHP, Django on Python, Nuxt on TypeScript\n    name: str; language: str\n    def detect(self, project) -> bool\n    def register_hooks(self, lang_ctx) -> None\n    def contribute(self, project, builder, lang_ctx) -> dict\n","python",[170,492,493,517,529,564,615,622,641,658,679,704],{"__ignoreMap":219},[494,495,498,502,506,510,514],"span",{"class":496,"line":497},"line",1,[494,499,501],{"class":500},"sHkq1","class",[494,503,505],{"class":504},"sbOAO"," LanguagePlugin",[494,507,509],{"class":508},"sZ_TN","(",[494,511,513],{"class":512},"snmWg","ABC",[494,515,516],{"class":508},"):\n",[494,518,520,523,526],{"class":496,"line":519},2,[494,521,522],{"class":512},"    name",[494,524,525],{"class":508},":",[494,527,528],{"class":504}," str\n",[494,530,532,535,539,541,544,547,550,552,555,558,561],{"class":496,"line":531},3,[494,533,534],{"class":500},"    def",[494,536,538],{"class":537},"sZJo5"," detect",[494,540,509],{"class":508},[494,542,543],{"class":512},"self",[494,545,546],{"class":508},",",[494,548,549],{"class":512}," project",[494,551,525],{"class":508},[494,553,554],{"class":512}," Project",[494,556,557],{"class":508},")",[494,559,560],{"class":508}," ->",[494,562,563],{"class":504}," bool\n",[494,565,567,569,572,574,576,578,580,582,585,587,590,592,595,597,600,603,606,609,612],{"class":496,"line":566},4,[494,568,534],{"class":500},[494,570,571],{"class":537}," index",[494,573,509],{"class":508},[494,575,543],{"class":512},[494,577,546],{"class":508},[494,579,549],{"class":537},[494,581,546],{"class":508},[494,583,584],{"class":537}," builder",[494,586,525],{"class":508},[494,588,589],{"class":537}," GraphBuilder",[494,591,546],{"class":508},[494,593,594],{"class":537}," frameworks",[494,596,525],{"class":508},[494,598,599],{"class":537}," list",[494,601,602],{"class":508},"[",[494,604,605],{"class":537},"FrameworkPlugin",[494,607,608],{"class":508},"])",[494,610,611],{"class":512}," -> ",[494,613,614],{"class":504},"dict\n",[494,616,618],{"class":496,"line":617},5,[494,619,621],{"emptyLinePlaceholder":620},true,"\n",[494,623,625,627,630,632,634,637],{"class":496,"line":624},6,[494,626,501],{"class":500},[494,628,629],{"class":537}," FrameworkPlugin",[494,631,509],{"class":508},[494,633,513],{"class":537},[494,635,636],{"class":508},"):",[494,638,640],{"class":639},"seS0s","    # Laravel on PHP, Django on Python, Nuxt on TypeScript\n",[494,642,644,646,648,651,654,656],{"class":496,"line":643},7,[494,645,522],{"class":512},[494,647,525],{"class":508},[494,649,650],{"class":504}," str",[494,652,653],{"class":512},"; language",[494,655,525],{"class":508},[494,657,528],{"class":504},[494,659,661,663,665,667,669,671,673,675,677],{"class":496,"line":660},8,[494,662,534],{"class":500},[494,664,538],{"class":537},[494,666,509],{"class":508},[494,668,543],{"class":512},[494,670,546],{"class":508},[494,672,549],{"class":512},[494,674,557],{"class":508},[494,676,560],{"class":508},[494,678,563],{"class":504},[494,680,682,684,687,689,691,693,696,698,700],{"class":496,"line":681},9,[494,683,534],{"class":500},[494,685,686],{"class":537}," register_hooks",[494,688,509],{"class":508},[494,690,543],{"class":512},[494,692,546],{"class":508},[494,694,695],{"class":537}," lang_ctx",[494,697,557],{"class":508},[494,699,611],{"class":512},[494,701,703],{"class":702},"sZWGQ","None\n",[494,705,707,709,712,714,716,718,720,722,724,726,728,730,732],{"class":496,"line":706},10,[494,708,534],{"class":500},[494,710,711],{"class":537}," contribute",[494,713,509],{"class":508},[494,715,543],{"class":512},[494,717,546],{"class":508},[494,719,549],{"class":537},[494,721,546],{"class":508},[494,723,584],{"class":537},[494,725,546],{"class":508},[494,727,695],{"class":537},[494,729,557],{"class":508},[494,731,611],{"class":512},[494,733,614],{"class":504},[141,735,736],{},"A framework teaches the host resolver, then adds its own nodes.",[223,738,739,749],{},[226,740,741],{},[229,742,743,746],{},[232,744,745],{},"hook",[232,747,748],{},"example",[242,750,751,772],{},[229,752,753,756],{},[247,754,755],{},"type rule",[247,757,758,761,762,765,766,761,769],{},[170,759,760],{},"Model::query()"," → ",[170,763,764],{},"builder:Model","; ",[170,767,768],{},"app(X::class)",[170,770,771],{},"X",[229,773,774,777],{},[247,775,776],{},"fact handler",[247,778,779,782,783,765,786,761,789],{},[170,780,781],{},"->where('col')"," on that builder → ",[170,784,785],{},"READS_COLUMN",[170,787,788],{},"DB::connection('x')",[170,790,791],{},"USES_CONNECTION",[141,793,794,795,798,799,802,803,805],{},"Compiler indexes (rust-analyzer, scip-clang, scip-java, the Swift index) match SCIP occurrences onto the syntax-layer nodes by file, line, and name.\nIds stay the same in heuristic and exact mode. ",[170,796,797],{},"cg index --scip FILE"," merges an existing index.\nGo has an indexer recipe only (",[170,800,801],{},"plugins\u002Fstubs","). Java is a heuristic plugin (",[472,804,50],{"href":51},").",[141,807,808,809,177,811,177,813,177,815,177,817,177,819,177,821,185],{},"Per-language facts: ",[472,810,95],{"href":96},[472,812,79],{"href":80},[472,814,115],{"href":116},[472,816,54],{"href":55},[472,818,50],{"href":51},[472,820,111],{"href":112},[472,822,71],{"href":72},[145,824,826],{"id":825},"queries","Queries",[223,828,829,839],{},[226,830,831],{},[229,832,833,836],{},[232,834,835],{},"command",[232,837,838],{},"walk",[242,840,841,855,865,884,894],{},[229,842,843,848],{},[247,844,845],{},[170,846,847],{},"reaches",[247,849,850,851,854],{},"propagating edges in reverse; depth recorded; shortest evidence path per dependent (",[170,852,853],{},"KIND @file:line [confidence]","); grouped by entry kind and module",[229,856,857,862],{},[247,858,859],{},[170,860,861],{},"impact",[247,863,864],{},"that walk from a method, stopping at entry points",[229,866,867,875],{},[247,868,869,263,872],{},[170,870,871],{},"writers",[170,873,874],{},"readers",[247,876,877,263,880,883],{},[170,878,879],{},"WRITES_*",[170,881,882],{},"READS_*"," edges for a table or a stored property",[229,885,886,891],{},[247,887,888],{},[170,889,890],{},"siblings",[247,892,893],{},"the same method on sibling types; other users of the same tables, columns, config keys, and connections; co-callers by Jaccard similarity of callee sets",[229,895,896,901],{},[247,897,898],{},[170,899,900],{},"path",[247,902,903],{},"one shortest chain between two specs",[141,905,906,907,909,910,913,914,336,917,263,920,922,923,927,928,185],{},"Override hops are the override relation: ",[170,908,861],{}," shows ",[170,911,912],{},"overrides:"," and ",[170,915,916],{},"(via override)",[170,918,919],{},"tests",[170,921,847],{}," seed the same way.\nWith a gate scenario indexed, dependents reached only through gated code sit in a GATED group (",[472,924,926],{"href":925},"\u002Fdocs\u002Fconfiguration#gate-scenarios","gate scenarios",").\nSpecs: ",[472,929,931],{"href":930},"\u002Fdocs\u002Fcli#query-targets-specs","query targets",[145,933,935],{"id":934},"cross-repo-link","Cross-repo link",[141,937,938,941,942,946,947,950,951,954,955,958,959,913,962,965,966,969,970,973,974,977,978,263,981,984,985,987,988,913,991,994,995,998,999,1002,1003,177,1005,336,1008,1010,1011,1014,1015,805],{},[170,939,940],{},"cg link"," copies every repo graph into one SQLite DB (",[472,943,945],{"href":944},"\u002Fdocs\u002Fcli#workspace","workspace",").\n",[170,948,949],{},"file"," gains a repo prefix and ",[170,952,953],{},"attrs.repo"," is set. An id that occurs in more than one repo is stored as ",[170,956,957],{},"\u003Crepo>:\u003Cid>"," and its edges are rewritten, except ",[170,960,961],{},"external:",[170,963,964],{},"endpoint:"," ids, which stay one node (one system, one protocol name). Other ids are unchanged, so two repos with no shared ids keep the same ids.\nThe command adds ",[170,967,968],{},"MATCHES_ROUTE"," from each repo's ",[170,971,972],{},"http:"," endpoints to routes of every other server (a backend may be the client), then runs channels, protocols, payload checks and entry tagging once over the union.\nA Laravel app is a client when it calls ",[170,975,976],{},"Http",", an injected ",[170,979,980],{},"Factory",[170,982,983],{},"PendingRequest",", or Guzzle. The PHP plugin writes the same ",[170,986,972],{}," endpoints as the TypeScript and Kotlin clients, including a base URL read from a container binding through ",[170,989,990],{},"config()",[170,992,993],{},"env()",", so ",[170,996,997],{},"cg link --repo api=…:both --repo payments=…:both"," matches those calls to the other backend. See ",[472,1000,79],{"href":1001},"\u002Fdocs\u002Fphp#outbound-http",".\n",[170,1004,861],{},[170,1006,1007],{},"downstream",[170,1009,900],{}," then cross the whole workspace, including a chain of three or more repos.\nA frontend ",[170,1012,1013],{},"links:"," list limits which servers that repo is matched against (",[472,1016,1018],{"href":1017},"\u002Fdocs\u002Fconfiguration#apps-and-workspace","apps and workspace",[141,1020,1021,1022,1025,1026,1029,1030,1032,1033,1035,1036,1038,1039,1042,1043,1046,1047,1050,1051,1054,1055,1058,1059,1062],{},"Matching (",[170,1023,1024],{},"cg_code_graph\u002Flink.py",") is deterministic: the method must agree, then each path segment.\nA literal fitted into ",[170,1027,1028],{},"{param}"," is ",[170,1031,180],{},". Catch-alls absorb the tail. The best candidate has the fewest heuristic fits, then the most literal agreements; a tie is ambiguous.\n",[170,1034,176],{}," means the segments agree and the client base was traced. An unknown origin is a suffix match at ",[170,1037,184],{},", and only when the dropped route prefix is a base path such as ",[170,1040,1041],{},"api"," or ",[170,1044,1045],{},"v1",". A short path does not match a longer route by dropping a leading literal (",[170,1048,1049],{},"\u002Fstatus"," does not match ",[170,1052,1053],{},"\u002Fpayments\u002F{id}\u002Fstatus","). When the client origin is an env placeholder or a literal base URL and that text names one linked repo, only that repo's routes are considered. When it names a service that is none of the linked repos, an unmatched call is ",[170,1056,1057],{},"external (other origin)"," and is not suffix-matched. A generic base such as ",[170,1060,1061],{},"API_BASE_URL"," still matches by path. The report lists every endpoint with its match and evidence. A match whose calling function has no entry point (test entries excluded) is listed under \"Matched, no live caller\" and is not counted as a live call site.",[1064,1065,1067],"h3",{"id":1066},"payload-field-check","Payload \u002F field check",[141,1069,1070,1071,1074,1075,1078,1079,1081,1082,185],{},"For a client endpoint with one route match, ",[170,1072,1073],{},"cg_code_graph\u002Fpayload.py"," compares the keys the client sends and parses with the server schema or the returned shape, and writes ",[170,1076,1077],{},"payload_checks"," (each issue has ",[170,1080,172],{}," on both sides).\nAmbiguous matches are skipped. Kind names: ",[472,1083,103],{"href":104},[141,1085,1086,1087,1090,1091,1094,1095,1098,1099,177,1102,336,1105,1108,1109,177,1112,177,1115,1118,1119,177,1122,177,1125,177,1128,177,1131,177,1134,1137,1138,1140,1141,1144,1145,1148,1149,185],{},"Laravel routes store ",[170,1088,1089],{},"attrs.request.keys"," from the action's FormRequest ",[170,1092,1093],{},"rules()"," (",[170,1096,1097],{},"VALIDATED_BY","), inline ",[170,1100,1101],{},"$request->validate([...])",[170,1103,1104],{},"Validator::make($request->all(), [...])",[170,1106,1107],{},"$request->validated()"," reads. A key records ",[170,1110,1111],{},"required",[170,1113,1114],{},"nullable",[170,1116,1117],{},"sometimes",", a type from the rule (",[170,1120,1121],{},"integer",[170,1123,1124],{},"numeric",[170,1126,1127],{},"boolean",[170,1129,1130],{},"array",[170,1132,1133],{},"string",[170,1135,1136],{},"in:a,b"," as enum values), and ",[170,1139,172],{},". Nested ",[170,1142,1143],{},"items.*.id"," stays dotted. GET and HEAD keys are ",[170,1146,1147],{},"query","; other methods are ",[170,1150,1151],{},"body",[141,1153,1154,1155,1158,1159,371,1162,1165,1166,913,1169,1172,1173,1176],{},"TypeScript, Dart, Kotlin and Swift body and query keys are normalised to one list before that compare. The TypeScript shape is ",[170,1156,1157],{},"{keys, conditional}"," (a payload variable in the same function, or a typed parameter whose optional members are conditional). Dart, Kotlin and Swift use ",[170,1160,1161],{},"[{key, type, line}]",[170,1163,1164],{},"cg api-calls"," prints ",[170,1167,1168],{},"body keys:",[170,1170,1171],{},"query keys:"," under each call site; ",[170,1174,1175],{},"--json"," includes both.",[141,1178,1179,1180,1183,1184,371,1187,1190,1191,1029,1194,1197,1198,177,1200,336,1202,263,1205,263,1208,1211,1212,177,1215,1218,1219,1222,1223,1226,1227,913,1229,1232],{},"A client key the schema does not declare is ",[170,1181,1182],{},"request_unknown_field"," (medium: Laravel ignores it). A required key the client does not send is ",[170,1185,1186],{},"request_missing_required",[170,1188,1189],{},"orderId"," against ",[170,1192,1193],{},"order_id",[170,1195,1196],{},"request_case_mismatch"," when that folded spelling matches one server key and the route has no ConvertCase \u002F CamelCase \u002F SnakeCase middleware. ",[170,1199,1117],{},[170,1201,1114],{},[170,1203,1204],{},"required_if",[170,1206,1207],{},"required_with",[170,1209,1210],{},"Rule::requiredIf"," are not reported missing. A spread, ",[170,1213,1214],{},"Object.assign",[170,1216,1217],{},"FormData",", or a value built in another function is opaque and produces neither missing nor unknown keys. ",[170,1220,1221],{},"items"," sent as a whole value satisfies ",[170,1224,1225],{},"items.*",". An Elysia model name that does not resolve on that instance is an unknown schema, so nothing is checked. ",[170,1228,1107],{},[170,1230,1231],{},"$request->input()"," keys are stored and are not required; a route with no rules is not checked.",[1234,1235,1236],"style",{},"html pre.shiki code .sHkq1, html code.shiki .sHkq1{--shiki-light:#6FAF00;--shiki-default:#6FAF00;--shiki-dark:#A3E635}html pre.shiki code .sbOAO, html code.shiki .sbOAO{--shiki-light:#3F6212;--shiki-default:#3F6212;--shiki-dark:#A3E635}html pre.shiki code .sZ_TN, html code.shiki .sZ_TN{--shiki-light:#71717A;--shiki-default:#71717A;--shiki-dark:#A1A1AA}html pre.shiki code .snmWg, html code.shiki .snmWg{--shiki-light:#27272A;--shiki-default:#27272A;--shiki-dark:#E4E4E7}html pre.shiki code .sZJo5, html code.shiki .sZJo5{--shiki-light:#65A30D;--shiki-default:#65A30D;--shiki-dark:#84CC16}html pre.shiki code .seS0s, html code.shiki .seS0s{--shiki-light:#71717A;--shiki-light-font-style:italic;--shiki-default:#71717A;--shiki-default-font-style:italic;--shiki-dark:#A1A1AA;--shiki-dark-font-style:italic}html pre.shiki code .sZWGQ, html code.shiki .sZWGQ{--shiki-light:#8B5CF6;--shiki-default:#8B5CF6;--shiki-dark:#C4B5FD}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":219,"searchDepth":566,"depth":519,"links":1238},[1239,1240,1241,1242,1243],{"id":147,"depth":519,"text":148},{"id":210,"depth":519,"text":211},{"id":484,"depth":519,"text":485},{"id":825,"depth":519,"text":826},{"id":934,"depth":519,"text":935,"children":1244},[1245],{"id":1066,"depth":531,"text":1067},"md",{},{"title":14,"description":143},"kIahGusNxcmF-EjXuPplH84Q5Zy_bt4-NWY48003TLY",[1251,1253],{"title":10,"path":11,"stem":12,"description":1252,"children":-1},"A tool is registered under a name and a harness dispatches to the handler. There is no call edge\nin the code, so cg models the tool as a protocol endpoint:",{"title":18,"path":19,"stem":20,"description":1254,"children":-1},"A hybrid app calls native code by name. cg links each call to the Kotlin, Java, Swift or\nObjective-C handler on every platform, so impact, downstream, tests and --platform\ncross the bridge. Electron IPC and Tauri commands use the same endpoint model across processes.",1792170232407]