[{"data":1,"prerenderedAt":2220},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Fschema":135,"\u002Fdocs\u002Fschema-surround":2215},[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":103,"body":137,"description":143,"extension":2210,"meta":2211,"navigation":2212,"path":104,"seo":2213,"stem":105,"__hash__":2214},"docs\u002Fdocs\u002Fschema.md",{"type":138,"value":139,"toc":2202},"minimark",[140,144,149,259,272,293,297,860,911,915,945,1105,1118,1122,1133,1456,1531,1625,1687,1954,1978,1982,2030,2034,2063,2184,2198],[141,142,143],"p",{},"The graph is one SQLite file. Node and edge details for a language live on that language's page; this page is the index of tables and kinds.",[145,146,148],"h2",{"id":147},"tables","Tables",[150,151,156],"pre",{"className":152,"code":153,"language":154,"meta":155,"style":155},"language-sql shiki shiki-themes cg-light cg-light cg-dark","nodes(id PK, kind, name, fqn, file, line, end_line, module, doc, lang, entry_kind, attrs JSON)\nedges(id, src, dst, kind, file, line, confidence, conf_rank, attrs JSON)  -- file:line is the evidence\nedge_kinds(kind PK, propagates, description)  -- propagates=1: src depends on dst (reaches \u002F impact)\nnode_entry(node_id, entry_kind, entry_count, sample_entry)\nmeta(key, value)  -- corpus, commit, stats, redact_salt (per-graph HMAC salt, 32 hex; see surface)\n","sql","",[157,158,159,196,220,234,240],"code",{"__ignoreMap":155},[160,161,164,168,172,176,179,182,185,187,190,193],"span",{"class":162,"line":163},"line",1,[160,165,167],{"class":166},"sZJo5","nodes",[160,169,171],{"class":170},"snmWg","(id PK, kind, ",[160,173,175],{"class":174},"sHkq1","name",[160,177,178],{"class":170},", fqn, ",[160,180,181],{"class":174},"file",[160,183,184],{"class":170},", ",[160,186,162],{"class":174},[160,188,189],{"class":170},", end_line, module, doc, lang, entry_kind, attrs ",[160,191,192],{"class":174},"JSON",[160,194,195],{"class":170},")\n",[160,197,199,202,204,206,208,211,213,216],{"class":162,"line":198},2,[160,200,201],{"class":170},"edges(id, src, dst, kind, ",[160,203,181],{"class":174},[160,205,184],{"class":170},[160,207,162],{"class":174},[160,209,210],{"class":170},", confidence, conf_rank, attrs ",[160,212,192],{"class":174},[160,214,215],{"class":170},")  ",[160,217,219],{"class":218},"seS0s","-- file:line is the evidence\n",[160,221,223,226,229,231],{"class":162,"line":222},3,[160,224,225],{"class":170},"edge_kinds(kind PK, propagates, ",[160,227,228],{"class":174},"description",[160,230,215],{"class":170},[160,232,233],{"class":218},"-- propagates=1: src depends on dst (reaches \u002F impact)\n",[160,235,237],{"class":162,"line":236},4,[160,238,239],{"class":170},"node_entry(node_id, entry_kind, entry_count, sample_entry)\n",[160,241,243,246,249,251,254,256],{"class":162,"line":242},5,[160,244,245],{"class":170},"meta(",[160,247,248],{"class":174},"key",[160,250,184],{"class":170},[160,252,253],{"class":174},"value",[160,255,215],{"class":170},[160,257,258],{"class":218},"-- corpus, commit, stats, redact_salt (per-graph HMAC salt, 32 hex; see surface)\n",[141,260,261,262,265,266,271],{},"On a combined DB only, ",[157,263,264],{},"payload_checks(endpoint, route, kind, severity, message, client_at, server_at, details JSON)"," holds the request\u002Fresponse field check (",[267,268,270],"a",{"href":269},"\u002Fdocs\u002Farchitecture#payload--field-check","payload \u002F field check",").",[141,273,274,277,278,281,282,285,286,289,290,292],{},[157,275,276],{},"module"," is the path or namespace (",[157,279,280],{},"Http\u002FControllers\u002FAdmin",", a Rust module path, a C\u002FC++ directory). ",[157,283,284],{},"doc"," holds the doc comment. ",[157,287,288],{},"reaches"," groups by ",[157,291,276],{},".",[145,294,296],{"id":295},"node-kinds","Node kinds",[298,299,300,316],"table",{},[301,302,303],"thead",{},[304,305,306,310,313],"tr",{},[307,308,309],"th",{},"area",[307,311,312],{},"kinds",[307,314,315],{},"notes",[317,318,319,409,454,541,624,669,693,725,757,840],"tbody",{},[304,320,321,325,387],{},[322,323,324],"td",{},"PHP \u002F shared",[322,326,327,184,330,184,333,184,336,339,340,184,343,184,346,184,349,184,352,184,355,184,358,184,361,184,364,184,367,184,370,184,372,184,375,184,378,184,381,184,384],{},[157,328,329],{},"class",[157,331,332],{},"interface",[157,334,335],{},"trait",[157,337,338],{},"method"," (functions too), ",[157,341,342],{},"property",[157,344,345],{},"external_class",[157,347,348],{},"route",[157,350,351],{},"command",[157,353,354],{},"schedule",[157,356,357],{},"job",[157,359,360],{},"event",[157,362,363],{},"listener",[157,365,366],{},"observer",[157,368,369],{},"admin",[157,371,298],{},[157,373,374],{},"column",[157,376,377],{},"connection",[157,379,380],{},"config",[157,382,383],{},"env",[157,385,386],{},"script",[322,388,389,392,393,184,396,184,399,184,402,405,406],{},[157,390,391],{},"channel:\u003Cpattern>"," has ",[157,394,395],{},"pattern",[157,397,398],{},"visibility",[157,400,401],{},"declared",[157,403,404],{},"callback"," \u002F ",[157,407,408],{},"handler",[304,410,411,414,419],{},[322,412,413],{},"Tests",[322,415,416],{},[157,417,418],{},"test",[322,420,421,422,425,426,429,430,433,434,437,438,184,441,184,444,184,447,450,451],{},"id ",[157,423,424],{},"test:\u003Cfile>::\u003Cname>"," (Python ",[157,427,428],{},"test:\u003Cmodule>.\u003CClass>.\u003Cmethod>","). Attrs: ",[157,431,432],{},"framework"," (phpunit, pest, vitest, jest, playwright, cypress, pytest, unittest), ",[157,435,436],{},"suite","; Python adds ",[157,439,440],{},"params",[157,442,443],{},"marks",[157,445,446],{},"testcase",[157,448,449],{},"inherited_from",". Nodes in test code have ",[157,452,453],{},"attrs.test",[304,455,456,459,498],{},[322,457,458],{},"TypeScript \u002F Vue",[322,460,461,184,463,184,466,184,469,184,472,184,475,184,478,184,481,184,484,184,486,184,489,184,492,184,495],{},[157,462,276],{},[157,464,465],{},"page",[157,467,468],{},"component",[157,470,471],{},"layout",[157,473,474],{},"app",[157,476,477],{},"composable",[157,479,480],{},"store",[157,482,483],{},"function",[157,485,329],{},[157,487,488],{},"type",[157,490,491],{},"http",[157,493,494],{},"channel_sub",[157,496,497],{},"i18n",[322,499,500,503,504,503,507,510,511,514,515,518,519,184,522,525,526,528,529,184,531,184,533,184,535,184,538,540],{},[157,501,502],{},"http:\u003CMETHOD> \u003Cpath>","; ",[157,505,506],{},"channel_sub:\u003Cname>",[157,508,509],{},"i18n:\u003Ckey>"," at the key's line in the default locale file, with ",[157,512,513],{},"attrs.definitions"," (",[157,516,517],{},"[{locale, file, line}]","), ",[157,520,521],{},"missing_locales",[157,523,524],{},"uses",". See ",[267,527,115],{"href":116}," for Nest, Next, Express and React Router \u002F Remix kinds (",[157,530,348],{},[157,532,465],{},[157,534,471],{},[157,536,537],{},"message",[157,539,357],{},", …)",[304,542,543,546,603],{},[322,544,545],{},"Rust, C, C++",[322,547,548,184,551,184,554,184,556,184,558,184,560,184,563,184,566,184,569,184,571,184,574,184,577,184,579,184,582,184,585,184,588,184,591,184,594,184,597,184,600],{},[157,549,550],{},"crate",[157,552,553],{},"mod",[157,555,181],{},[157,557,483],{},[157,559,338],{},[157,561,562],{},"struct",[157,564,565],{},"enum",[157,567,568],{},"union",[157,570,329],{},[157,572,573],{},"typedef",[157,575,576],{},"type_alias",[157,578,335],{},[157,580,581],{},"field",[157,583,584],{},"variant",[157,586,587],{},"enumerator",[157,589,590],{},"const",[157,592,593],{},"static",[157,595,596],{},"global",[157,598,599],{},"macro",[157,601,602],{},"ffi",[322,604,605,606,184,609,184,612,184,615,184,618,621,622],{},"Fact nodes: ",[157,607,608],{},"feature:",[157,610,611],{},"cfg:",[157,613,614],{},"define:",[157,616,617],{},"unsafe:",[157,619,620],{},"env:",". ",[267,623,71],{"href":72},[304,625,626,628,663],{},[322,627,95],{},[322,629,630,184,632,184,634,184,636,184,638,184,640,642,643,184,645,184,647,184,649,184,651,184,653,184,655,184,657,184,659,184,661],{},[157,631,276],{},[157,633,329],{},[157,635,483],{},[157,637,338],{},[157,639,581],{},[157,641,386],{},", plus Django ",[157,644,348],{},[157,646,298],{},[157,648,374],{},[157,650,380],{},[157,652,383],{},[157,654,357],{},[157,656,363],{},[157,658,351],{},[157,660,369],{},[157,662,360],{},[322,664,665],{},[267,666,668],{"href":667},"\u002Fdocs\u002Fpython#entry-points-and-function-references","entry points and function references",[304,670,671,674,690],{},[322,672,673],{},"Dart",[322,675,676,184,678,184,680,184,682,184,684,184,686,184,688],{},[157,677,276],{},[157,679,329],{},[157,681,338],{},[157,683,483],{},[157,685,491],{},[157,687,465],{},[157,689,383],{},[322,691,692],{},"Pages: Navigator, go_router, auto_route",[304,694,695,698,703],{},[322,696,697],{},"Protocols",[322,699,700],{},[157,701,702],{},"endpoint",[322,704,705,708,709,184,711,184,713,184,716,184,718,184,720,722,723],{},[157,706,707],{},"endpoint:\u003Cprotocol>:\u003Cname>",". Existing ",[157,710,491],{},[157,712,348],{},[157,714,715],{},"channel",[157,717,537],{},[157,719,357],{},[157,721,360],{}," ids stay and are read as endpoints. ",[267,724,91],{"href":92},[304,726,727,730,737],{},[322,728,729],{},"AI",[322,731,732,184,734],{},[157,733,702],{},[157,735,736],{},"agent",[322,738,739,184,742,184,745,184,748,503,751,621,754],{},[157,740,741],{},"endpoint:llm_tool:",[157,743,744],{},"endpoint:mcp_tool:",[157,746,747],{},"endpoint:mcp_resource:",[157,749,750],{},"endpoint:mcp_prompt:",[157,752,753],{},"agent:\u003Cname>",[267,755,756],{"href":11},"AI tools",[304,758,759,762,767],{},[322,760,761],{},"External",[322,763,764],{},[157,765,766],{},"external",[322,768,769,514,772,775,776,184,779,184,782,184,785,788,789,514,792,184,795,184,798,801,802,184,804,184,807,184,809,503,811,814,815,818,819,822,823,826,827,829,830,184,833,184,836,621,838],{},[157,770,771],{},"external:\u003Cprotocol>:\u003Ctarget>",[157,773,774],{},"external:saas:\u003Cprovider>"," for Stripe, SendGrid, Mailgun, Postmark, Resend, Twilio, Vonage, MessageBird, Plivo, APNs, Web Push and Expo push; ",[157,777,778],{},"external:gcp:\u003Cservice>[:resource]",[157,780,781],{},"external:azure:keyvault[:vault-host]",[157,783,784],{},"external:k8s:\u003Capi-group>",[157,786,787],{},"external:docker:\u003Csocket-or-host:port>","). Attrs name host, port, TLS, ",[157,790,791],{},"auth",[157,793,794],{},"ambient",[157,796,797],{},"explicit",[157,799,800],{},"unknown",") and credential source (",[157,803,383],{},[157,805,806],{},"literal",[157,808,181],{},[157,810,794],{},[157,812,813],{},"credential_literal"," for a key in the code, ",[157,816,817],{},"credential_file"," for a key path in the code), never the secret. ",[157,820,821],{},"CONNECTS_TO"," also carries ",[157,824,825],{},"namespace"," for a literal Kubernetes namespace. ",[157,828,821],{}," carries ",[157,831,832],{},"via",[157,834,835],{},"op",[157,837,791],{},[267,839,38],{"href":39},[304,841,842,845,849],{},[322,843,844],{},"Bridges",[322,846,847],{},[157,848,702],{},[322,850,851,852,854,855,621,858],{},"Capacitor, React Native, Flutter, Electron IPC, Tauri. ObjC and missed Java \u002F Kotlin \u002F Swift receivers are ",[157,853,338],{}," nodes with ",[157,856,857],{},"attrs.bridge_stub",[267,859,18],{"href":19},[141,861,862,863,184,866,184,869,872,873,876,877,879,880,883,884,887,888,891,892,184,895,184,898,184,901,621,904,907,908,292],{},"Route paths use ",[157,864,865],{},"{param}",[157,867,868],{},"{param?}",[157,870,871],{},"{rest*}"," and ",[157,874,875],{},"{rest*?}",". A Laravel ",[157,878,348],{}," node may carry ",[157,881,882],{},"attrs.inline_guards",": objects ",[157,885,886],{},"{name, kind, at, conditional}"," with ",[157,889,890],{},"kind"," one of ",[157,893,894],{},"policy",[157,896,897],{},"permission",[157,899,900],{},"secret",[157,902,903],{},"role",[157,905,906],{},"cg routes --json"," returns the same list. See ",[267,909,79],{"href":910},"\u002Fdocs\u002Fphp#inline-guards",[145,912,914],{"id":913},"enum-cases-and-constants","Enum cases and constants",[141,916,917,918,921,922,925,926,929,930,933,934,936,937,940,941,944],{},"Every language indexes them as ",[157,919,920],{},"CONTAINS"," children of the type or module. A reference is an edge only where the binding is certain. Nothing ",[157,923,924],{},"CALLS"," these nodes. Query across languages with ",[157,927,928],{},"kind IN ('enum_case', 'variant', 'enumerator')",". C# has no plugin. Java enum constants are ",[157,931,932],{},"enum_case"," nodes. Dart enums stay ",[157,935,329],{}," nodes. ",[157,938,939],{},"cg coverage --details"," adds a ",[157,942,943],{},"values:"," line.",[298,946,947,963],{},[301,948,949],{},[304,950,951,954,957,960],{},[307,952,953],{},"language",[307,955,956],{},"case",[307,958,959],{},"constant",[307,961,962],{},"edge",[317,964,965,982,998,1014,1031,1047,1063,1085],{},[304,966,967,969,973,977],{},[322,968,111],{},[322,970,971],{},[157,972,932],{},[322,974,975],{},[157,976,959],{},[322,978,979],{},[157,980,981],{},"USES_VALUE",[304,983,984,986,990,994],{},[322,985,54],{},[322,987,988],{},[157,989,932],{},[322,991,992],{},[157,993,959],{},[322,995,996],{},[157,997,981],{},[304,999,1000,1002,1006,1008],{},[322,1001,50],{},[322,1003,1004],{},[157,1005,932],{},[322,1007],{},[322,1009,1010,1011,1013],{},"a constant is a node; ",[157,1012,981],{}," is not emitted yet",[304,1015,1016,1019,1023,1027],{},[322,1017,1018],{},"TypeScript \u002F JavaScript",[322,1020,1021],{},[157,1022,932],{},[322,1024,1025],{},[157,1026,959],{},[322,1028,1029],{},[157,1030,981],{},[304,1032,1033,1035,1039,1043],{},[322,1034,95],{},[322,1036,1037],{},[157,1038,932],{},[322,1040,1041],{},[157,1042,959],{},[322,1044,1045],{},[157,1046,981],{},[304,1048,1049,1051,1055,1059],{},[322,1050,79],{},[322,1052,1053],{},[157,1054,932],{},[322,1056,1057],{},[157,1058,959],{},[322,1060,1061],{},[157,1062,981],{},[304,1064,1065,1068,1072,1078],{},[322,1066,1067],{},"Rust",[322,1069,1070],{},[157,1071,584],{},[322,1073,1074,184,1076],{},[157,1075,590],{},[157,1077,593],{},[322,1079,1080,184,1083],{},[157,1081,1082],{},"ACCESSES_FIELD",[157,1084,981],{},[304,1086,1087,1090,1094,1101],{},[322,1088,1089],{},"C \u002F C++",[322,1091,1092],{},[157,1093,587],{},[322,1095,1096,1098,1099],{},[157,1097,596],{},", object-like ",[157,1100,599],{},[322,1102,1103],{},[157,1104,981],{},[141,1106,1107,1108,184,1110,184,1112,184,1114,184,1116,271],{},"Ids and which spellings resolve: the language pages (",[267,1109,111],{"href":112},[267,1111,54],{"href":55},[267,1113,50],{"href":51},[267,1115,71],{"href":72},[267,1117,95],{"href":96},[145,1119,1121],{"id":1120},"edge-kinds","Edge kinds",[141,1123,1124,1127,1128,405,1130,292],{},[157,1125,1126],{},"✓"," propagates in ",[157,1129,288],{},[157,1131,1132],{},"impact",[298,1134,1135,1144],{},[301,1136,1137],{},[304,1138,1139,1142],{},[307,1140,1141],{},"group",[307,1143,312],{},[317,1145,1146,1186,1217,1274,1306,1320,1346,1386,1408,1427],{},[304,1147,1148,1151],{},[322,1149,1150],{},"Calls and types",[322,1152,1153,1155,1156,1155,1159,1155,1162,1155,1165,184,1168,184,1171,184,1174,184,1177,184,1180,184,1183],{},[157,1154,924],{},"✓, ",[157,1157,1158],{},"IMPLEMENTED_BY",[157,1160,1161],{},"OVERRIDDEN_BY",[157,1163,1164],{},"BOUND_TO",[157,1166,1167],{},"EXTENDS",[157,1169,1170],{},"IMPLEMENTS",[157,1172,1173],{},"USES_TRAIT",[157,1175,1176],{},"INSTANTIATES",[157,1178,1179],{},"INJECTS",[157,1181,1182],{},"REFERENCES",[157,1184,1185],{},"REFERENCES_TYPE",[304,1187,1188,1191],{},[322,1189,1190],{},"HTTP and jobs",[322,1192,1193,1155,1196,1155,1199,1155,1202,1155,1205,1155,1208,1155,1211,184,1214],{},[157,1194,1195],{},"ROUTES_TO",[157,1197,1198],{},"USES_MIDDLEWARE",[157,1200,1201],{},"HANDLED_BY",[157,1203,1204],{},"SCHEDULES",[157,1206,1207],{},"DISPATCHES",[157,1209,1210],{},"LISTENED_BY",[157,1212,1213],{},"OBSERVED_BY",[157,1215,1216],{},"BINDS",[304,1218,1219,1222],{},[322,1220,1221],{},"Data",[322,1223,1224,1155,1227,1155,1230,1155,1233,1155,1236,1155,1239,1155,1242,1155,1245,1155,1248,1155,1251,1155,1254,1155,1257,1155,1260,1155,1263,184,1266,184,1269,184,1271],{},[157,1225,1226],{},"READS_COLUMN",[157,1228,1229],{},"WRITES_COLUMN",[157,1231,1232],{},"MENTIONS_COLUMN",[157,1234,1235],{},"READS_TABLE",[157,1237,1238],{},"WRITES_TABLE",[157,1240,1241],{},"USES_CONNECTION",[157,1243,1244],{},"REGISTERS_CONNECTION",[157,1246,1247],{},"READS_CONFIG",[157,1249,1250],{},"WRITES_CONFIG",[157,1252,1253],{},"READS_ENV",[157,1255,1256],{},"REFERS_TO",[157,1258,1259],{},"CONFIGURED_BY",[157,1261,1262],{},"CONFIG_CONTAINS",[157,1264,1265],{},"MAPS_TO_TABLE",[157,1267,1268],{},"HAS_RELATION",[157,1270,920],{},[157,1272,1273],{},"DEFINES",[304,1275,1276,1279],{},[322,1277,1278],{},"UI",[322,1280,1281,1155,1284,1155,1287,1155,1290,1155,1293,1296,1297,184,1300,1155,1303],{},[157,1282,1283],{},"RENDERS",[157,1285,1286],{},"USES_COMPOSABLE",[157,1288,1289],{},"USES_STORE",[157,1291,1292],{},"HTTP_CALLS",[157,1294,1295],{},"MATCHES_ROUTE","✓ (combined DB), ",[157,1298,1299],{},"USES_LAYOUT",[157,1301,1302],{},"USES_I18N",[157,1304,1305],{},"NAVIGATES_TO",[304,1307,1308,1311],{},[322,1309,1310],{},"Properties",[322,1312,1313,1155,1316,1319],{},[157,1314,1315],{},"READS_PROP",[157,1317,1318],{},"WRITES_PROP","✓ (Swift, Kotlin, Python, TypeScript, PHP; see the language pages)",[304,1321,1322,1325],{},[322,1323,1324],{},"Native",[322,1326,1327,1155,1330,1155,1332,1155,1334,1155,1337,1155,1340,1155,1343,1126],{},[157,1328,1329],{},"USES_TYPE",[157,1331,1082],{},[157,1333,981],{},[157,1335,1336],{},"REFERENCES_FN",[157,1338,1339],{},"USES_UNSAFE",[157,1341,1342],{},"GATED_BY",[157,1344,1345],{},"INCLUDES",[304,1347,1348,1351],{},[322,1349,1350],{},"Boundaries",[322,1352,1353,1155,1356,1155,1359,1155,1362,1365,1366,184,1369,184,1372,518,1375,1155,1377,184,1380,1155,1383,1126],{},[157,1354,1355],{},"SENDS_TO",[157,1357,1358],{},"RECEIVED_BY",[157,1360,1361],{},"MATCHES_ENDPOINT",[157,1363,1364],{},"REGISTERS_CALLBACK"," (function -> the app's own route whose URL it registers with an external party; ",[157,1367,1368],{},"attrs.body_key",[157,1370,1371],{},"attrs.endpoint",[157,1373,1374],{},"attrs.via",[157,1376,821],{},[157,1378,1379],{},"CREDENTIAL_FROM",[157,1381,1382],{},"OFFERS_TOOL",[157,1384,1385],{},"HANDS_OFF_TO",[304,1387,1388,1391],{},[322,1389,1390],{},"Broadcast",[322,1392,1393,1155,1396,184,1399,1155,1402,1155,1405],{},[157,1394,1395],{},"AUTHORIZES_CHANNEL",[157,1397,1398],{},"BROADCASTS_ON",[157,1400,1401],{},"SUBSCRIBES_CHANNEL",[157,1403,1404],{},"MATCHES_CHANNEL",[157,1406,1407],{},"LISTENS_FOR",[304,1409,1410,1412],{},[322,1411,413],{},[322,1413,1414,184,1417,184,1420,184,1423,1426],{},[157,1415,1416],{},"TEST_CALLS",[157,1418,1419],{},"TEST_USES",[157,1421,1422],{},"TEST_HTTP",[157,1424,1425],{},"TEST_VISITS"," (none propagate)",[304,1428,1429,1432],{},[322,1430,1431],{},"Other",[322,1433,1434,184,1437,1440,1441,518,1444,184,1447,184,1450,184,1453],{},[157,1435,1436],{},"IMPORTS",[157,1438,1439],{},"COPY_OF"," (with ",[157,1442,1443],{},"--include-generated",[157,1445,1446],{},"EMITS_STATE",[157,1448,1449],{},"HANDLES_STATE",[157,1451,1452],{},"PARSES_JSON",[157,1454,1455],{},"USES_SCHEMA",[141,1457,1458,1459,1461,1462,184,1465,184,1468,184,1471,1474,1475,1478,1479,184,1482,514,1484,184,1487,184,1490,184,1493,518,1496,1499,1500,1503,1504,514,1507,1510,1511,503,1514,405,1517,1520,1521,621,1524,1527,1528,292],{},"Mass-assignment facts: a ",[157,1460,1229],{}," edge from ",[157,1463,1464],{},"update($request->validated())",[157,1466,1467],{},"create($data)",[157,1469,1470],{},"fill(...)",[157,1472,1473],{},"new Model($data)"," + ",[157,1476,1477],{},"save()"," and similar calls has ",[157,1480,1481],{},"attrs.mass_assignment = true",[157,1483,1374],{},[157,1485,1486],{},"update(validated())",[157,1488,1489],{},"create(all())",[157,1491,1492],{},"update(array_merge(validated()))",[157,1494,1495],{},"new Order(validate())",[157,1497,1498],{},"attrs.keys_from"," (the rule sources and the model declarations that filtered the keys, e.g. ",[157,1501,1502],{},"[\"UpdateBookRequest::rules\", \"Book::$fillable\"]",") and, when the array reached the call through a parameter, ",[157,1505,1506],{},"attrs.param",[157,1508,1509],{},"$data","). Confidence is ",[157,1512,1513],{},"resolved",[157,1515,1516],{},"$request->all()",[157,1518,1519],{},"input()"," give ",[157,1522,1523],{},"heuristic",[157,1525,1526],{},"cg node"," prints ",[157,1529,1530],{},"via … keys from A ∩ B",[141,1532,1533,1534,184,1536,184,1538,184,1540,1542,1543,1545,1546,1549,1550,1553,1554,1557,1558,1561,1562,1565,1566,184,1569,184,1572,184,1575,1578,1579,1582,1583,872,1586,1589,1590,1592,1593,184,1596,1599,1600,1602,1603,1607,1608,1542,1610,1613,1614,184,1617,1620,1621,1624],{},"Connection facts: a ",[157,1535,1235],{},[157,1537,1238],{},[157,1539,1226],{},[157,1541,1229],{}," (and ",[157,1544,1232],{},", when a plugin knows it) edge has ",[157,1547,1548],{},"attrs.connection",", the database connection it goes to: a name, a dynamic pattern (",[157,1551,1552],{},"legacy_{store.id}",") or ",[157,1555,1556],{},"?"," when it cannot be resolved. ",[157,1559,1560],{},"attrs.connection_default"," is the project's default connection (an edge without it always prints its connection). The Laravel plugin also sets ",[157,1563,1564],{},"connection_via"," (how the connection was chosen: ",[157,1567,1568],{},"Book::on",[157,1570,1571],{},"DB::connection",[157,1573,1574],{},"setConnection",[157,1576,1577],{},"Shipment::$connection","; absent on the default), ",[157,1580,1581],{},"connection_from"," (the method that returns a dynamic name), ",[157,1584,1585],{},"connection_model",[157,1587,1588],{},"connection_fallback",". A ",[157,1591,298],{}," node has ",[157,1594,1595],{},"attrs.connections",[157,1597,1598],{},"{connection: edge count}"," over those edges, most used first, and one ",[157,1601,821],{}," per connection that maps to an external system (",[267,1604,1606],{"href":1605},"\u002Fdocs\u002Fexternal#tables-on-several-connections","external systems","). Another ORM only has to set ",[157,1609,1548],{},[157,1611,1612],{},"connection_default"," to hide the default) for ",[157,1615,1616],{},"conn=",[157,1618,1619],{},"--connection"," and the ",[157,1622,1623],{},"connections:"," line to work.",[141,1626,1627,1628,879,1631,514,1634,1637,1638,1640,1641,872,1644,503,1647,392,1649,184,1651,1653,1654,1657,1658,1661,1662,1665,1666,872,1669,1672,1673,1665,1676,405,1678,887,1680,525,1683,292],{},"Webhook facts: a sender ",[157,1629,1630],{},"endpoint:webhook:*",[157,1632,1633],{},"attrs.subscriber_urls",[157,1635,1636],{},"[{url, at}]","); a ",[157,1639,1355],{}," edge from a stored subscription has ",[157,1642,1643],{},"attrs.via = \"stored subscription\"",[157,1645,1646],{},"attrs.source",[157,1648,1364],{},[157,1650,1368],{},[157,1652,1371],{}," (the outbound ",[157,1655,1656],{},"http:"," endpoint, when known) and ",[157,1659,1660],{},"attrs.via = \"SDK webhook registration\""," for an SDK call; a route's ",[157,1663,1664],{},"attrs.webhook"," adds ",[157,1667,1668],{},"via = \"driver\"",[157,1670,1671],{},"drivers"," when its checks come from run-time resolved driver implementations. ",[157,1674,1675],{},"cg link",[157,1677,1295],{},[157,1679,1361],{},[157,1681,1682],{},"attrs.via = \"subscriber url\"",[267,1684,1686],{"href":1685},"\u002Fdocs\u002Fprotocols#subscriptions-callbacks-and-drivers-152-part-b","protocols",[141,1688,1689,1690,879,1693,1696,1697,514,1700,1702,1703,184,1706,184,1709,184,1712,184,1715,1718,1719,1722,1723,405,1725,1727,1728,1731,1732,1592,1735,1738,1739,1742,1743,184,1746,1750,1751,405,1753,1755,1756,514,1759,1702,1762,184,1765,184,1768,184,1771,184,1774,1718,1777,503,1780,1782,1783,1702,1786,184,1789,184,1792,1718,1794,503,1796,1702,1798,1718,1801,503,1804,1807,1808,872,1811,1814,1815,1818,1819,1822,1823,1826,1827,1718,1829,1832,1833,1836,1837,184,1839,1842,1843,1846,1847,1850,1851,514,1854,1857,1858,1861,1862,1864,1865,1868,1869,1872,1873,1875,1876,514,1879,1882,1883,518,1886,872,1889,514,1892,184,1895,1898,1899,1902,1903,1906,1907,1909,1910,829,1913,1916,1917,1920,1921,1589,1924,1926,1927,1930,1931,184,1934,184,1937,184,1940,872,1943,1946,1947,1949,1950,1953],{},"Insecure transport facts: a function, method, module or ",[157,1691,1692],{},"file:config:\u003Cpath>",[157,1694,1695],{},"attrs.insecure_transport",", a list of ",[157,1698,1699],{},"{kind, line, lib, detail, confidence}",[157,1701,890],{}," is ",[157,1704,1705],{},"tls-verify-off",[157,1707,1708],{},"ssh-hostkey-off",[157,1710,1711],{},"grpc-plaintext",[157,1713,1714],{},"ipc-extension-manifest",[157,1716,1717],{},"ipc-extension-external"," or ",[157,1720,1721],{},"ipc-electron","). A ",[157,1724,821],{},[157,1726,1292],{}," edge or external node whose call disables verification has ",[157,1729,1730],{},"attrs.tls_verify = false",". A listening ",[157,1733,1734],{},"endpoint:unix:*",[157,1736,1737],{},"attrs.mode",". Outbound URLs built from request input (",[157,1740,1741],{},"cg surface"," finding ",[157,1744,1745],{},"ssrf",[267,1747,1749],{"href":1748},"\u002Fdocs\u002Fsurface#outbound-urls-from-request-input-ssrf","surface","): an ",[157,1752,1292],{},[157,1754,821],{}," edge carries ",[157,1757,1758],{},"attrs.url_from_input = {source, key, part, via, checked}",[157,1760,1761],{},"source",[157,1763,1764],{},"query",[157,1766,1767],{},"body",[157,1769,1770],{},"param",[157,1772,1773],{},"header",[157,1775,1776],{},"path",[157,1778,1779],{},"cookie",[157,1781,248],{}," is the request-input name, never a value; ",[157,1784,1785],{},"part",[157,1787,1788],{},"host",[157,1790,1791],{},"url",[157,1793,1776],{},[157,1795,1764],{},[157,1797,832],{},[157,1799,1800],{},"direct",[157,1802,1803],{},"helper",[157,1805,1806],{},"checked"," is true after an allow-list comparison), ",[157,1809,1810],{},"cg api-calls",[157,1812,1813],{},"cg external"," print it as ",[157,1816,1817],{},"url from input (\u003Csource>.\u003Ckey>, \u003Cpart>)","; a call with no edge puts the same dict as ",[157,1820,1821],{},"url_from_input"," in an ",[157,1824,1825],{},"insecure_transport"," fact of kind ",[157,1828,1745],{},[157,1830,1831],{},"dns-input"," (a DNS lookup of input), with ",[157,1834,1835],{},"caller"," (the function that passed the value) for a helper flow. Credential-looking config values (Laravel config ",[157,1838,253],{},[157,1840,1841],{},"env_default",") are stored as ",[157,1844,1845],{},"redacted:hmac:\u003C8 hex>",", an HMAC-SHA-256 of the value keyed by the graph's ",[157,1848,1849],{},"meta"," key ",[157,1852,1853],{},"redact_salt",[157,1855,1856],{},"secrets.token_hex(16)",", created with the database, kept on re-index and ",[157,1859,1860],{},"cg refresh",", not present on a ",[157,1863,1675],{}," combined graph; markers from older indexes read ",[157,1866,1867],{},"redacted:sha256:\u003C8 hex>","); see ",[267,1870,1749],{"href":1871},"\u002Fdocs\u002Fsurface#no-secret-values-in-the-index",". Guard names that ",[157,1874,1741],{}," derives from project settings when it classifies a route (read from the source at report time, never stored in the graph): ",[157,1877,1878],{},"drf-default:\u003CPermissionClass>",[157,1880,1881],{},"REST_FRAMEWORK"," ",[157,1884,1885],{},"DEFAULT_PERMISSION_CLASSES",[157,1887,1888],{},"laravel-global:\u003CMiddleware>",[157,1890,1891],{},"laravel-group:\u003Cgroup>:\u003CMiddleware>",[157,1893,1894],{},"Kernel.php",[157,1896,1897],{},"bootstrap\u002Fapp.php","). Nest ",[157,1900,1901],{},"APP_GUARD"," providers were already recorded by the plugin; a Nest ",[157,1904,1905],{},"@Public()"," opt-out removes them for that route. A Django ",[157,1908,348],{}," node for a DRF view reached by a plain ",[157,1911,1912],{},"path()",[157,1914,1915],{},"attrs.drf = true","; an empty ",[157,1918,1919],{},"permission_classes"," list is recorded as the guard ",[157,1922,1923],{},"AllowAny",[157,1925,1741],{}," inbound item has the guard state ",[157,1928,1929],{},"public"," (a route in the public-by-design table) in addition to ",[157,1932,1933],{},"guarded",[157,1935,1936],{},"secret-checked",[157,1938,1939],{},"inline-guarded",[157,1941,1942],{},"unguarded",[157,1944,1945],{},"unchecked",", and may carry ",[157,1948,1929],{}," (the reason) and ",[157,1951,1952],{},"unsure"," (why a finding is only a heuristic).",[141,1955,1956,1957,405,1960,1963,1964,184,1967,184,1970,184,1973,184,1975,271],{},"Platform conditions, generated-file markers and bridge attrs sit on ",[157,1958,1959],{},"nodes.attrs",[157,1961,1962],{},"edges.attrs",". The language and boundary pages list the keys (",[157,1965,1966],{},"platforms",[157,1968,1969],{},"generated",[157,1971,1972],{},"process",[157,1974,832],{},[157,1976,1977],{},"dispatch",[145,1979,1981],{"id":1980},"confidence","Confidence",[298,1983,1984,1993],{},[301,1985,1986],{},[304,1987,1988,1990],{},[307,1989,253],{},[307,1991,1992],{},"when",[317,1994,1995,2012,2021],{},[304,1996,1997,2002],{},[322,1998,1999],{},[157,2000,2001],{},"exact",[322,2003,2004,2005,184,2008,2011],{},"syntactically certain (",[157,2006,2007],{},"new X",[157,2009,2010],{},"$this->m()",", a literal key)",[304,2013,2014,2018],{},[322,2015,2016],{},[157,2017,1513],{},[322,2019,2020],{},"type or name resolution (typed params, inferred variables, model → table)",[304,2022,2023,2027],{},[322,2024,2025],{},[157,2026,1523],{},[322,2028,2029],{},"a unique-method-name fallback, or a column-name literal",[145,2031,2033],{"id":2032},"entry-kinds","Entry kinds",[141,2035,2036,2037,2039,2040,2044,2045,2048,2049,514,2052,2055,2056,2059,2060,292],{},"Tagging walks forward from each entry over propagating edges. ",[157,2038,288],{}," then labels a node ",[2041,2042,2043],"strong",{},"runtime"," (any runtime entry), ",[2041,2046,2047],{},"operator-only"," (commands or admin only), ",[2041,2050,2051],{},"library",[157,2053,2054],{},"public_api"," only), ",[2041,2057,2058],{},"dev"," (tests, benches, examples, build scripts only) or ",[2041,2061,2062],{},"none",[298,2064,2065,2073],{},[301,2066,2067],{},[304,2068,2069,2071],{},[307,2070,1141],{},[307,2072,312],{},[317,2074,2075,2105,2124,2132,2145,2154,2172],{},[304,2076,2077,2080],{},[322,2078,2079],{},"Runtime",[322,2081,2082,184,2085,184,2088,184,2091,184,2094,184,2097,184,2099,184,2102],{},[157,2083,2084],{},"http_route",[157,2086,2087],{},"channel_auth",[157,2089,2090],{},"websocket",[157,2092,2093],{},"scheduled",[157,2095,2096],{},"queue_job",[157,2098,363],{},[157,2100,2101],{},"message_handler",[157,2103,2104],{},"llm_tool",[304,2106,2107,2110],{},[322,2108,2109],{},"Operator",[322,2111,2112,184,2115,184,2118,184,2121],{},[157,2113,2114],{},"artisan_command",[157,2116,2117],{},"management_command",[157,2119,2120],{},"cli_command",[157,2122,2123],{},"admin_panel",[304,2125,2126,2128],{},[322,2127,1431],{},[322,2129,2130],{},[157,2131,366],{},[304,2133,2134,2137],{},[322,2135,2136],{},"Program",[322,2138,2139,184,2142],{},[157,2140,2141],{},"main",[157,2143,2144],{},"ffi_export",[304,2146,2147,2150],{},[322,2148,2149],{},"Library",[322,2151,2152],{},[157,2153,2054],{},[304,2155,2156,2159],{},[322,2157,2158],{},"Dev \u002F build",[322,2160,2161,184,2163,184,2166,184,2169],{},[157,2162,418],{},[157,2164,2165],{},"bench",[157,2167,2168],{},"example",[157,2170,2171],{},"build_script",[304,2173,2174,2176],{},[322,2175,1278],{},[322,2177,2178,184,2181],{},[157,2179,2180],{},"ui_page",[157,2182,2183],{},"ui_global",[141,2185,2186,2187,184,2189,184,2191,184,2194,184,2196,292],{},"Which framework produces which kind: ",[267,2188,95],{"href":96},[267,2190,115],{"href":116},[267,2192,2193],{"href":23},"Channels and tests",[267,2195,756],{"href":11},[267,2197,71],{"href":72},[2199,2200,2201],"style",{},"html pre.shiki code .sZJo5, html code.shiki .sZJo5{--shiki-light:#65A30D;--shiki-default:#65A30D;--shiki-dark:#84CC16}html pre.shiki code .snmWg, html code.shiki .snmWg{--shiki-light:#27272A;--shiki-default:#27272A;--shiki-dark:#E4E4E7}html pre.shiki code .sHkq1, html code.shiki .sHkq1{--shiki-light:#6FAF00;--shiki-default:#6FAF00;--shiki-dark:#A3E635}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 .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":155,"searchDepth":236,"depth":198,"links":2203},[2204,2205,2206,2207,2208,2209],{"id":147,"depth":198,"text":148},{"id":295,"depth":198,"text":296},{"id":913,"depth":198,"text":914},{"id":1120,"depth":198,"text":1121},{"id":1980,"depth":198,"text":1981},{"id":2032,"depth":198,"text":2033},"md",{},true,{"title":103,"description":143},"GyaxW7LJoRPBTu5WaChS081V81ZKuCfe6a4IzuztTjw",[2216,2218],{"title":99,"path":100,"stem":101,"description":2217,"children":-1},"Install cg, index a sample, ask four questions, and connect an agent. Python 3.11+.",{"title":107,"path":108,"stem":109,"description":2219,"children":-1},"cg surface reads facts the index already holds and answers three questions: what does the code expose, what does it\nconnect to, and where are credentials and transport protection weak. Nothing is rescanned: the checks that need source\ntext (disabled verification, insecure gRPC channels, risky IPC settings) run once at index time and leave facts on the\ngraph. A secret value is never stored or printed: a finding names the kind and the location, and the index keeps only a\nredacted marker for a credential literal (No secret values in the index).",1792170232408]