[{"data":1,"prerenderedAt":1324},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Fbridges":135,"\u002Fdocs\u002Fbridges-surround":1319},[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":18,"body":137,"description":1313,"extension":1314,"meta":1315,"navigation":1316,"path":19,"seo":1317,"stem":20,"__hash__":1318},"docs\u002Fdocs\u002Fbridges.md",{"type":138,"value":139,"toc":1304},"minimark",[140,160,165,175,417,435,501,543,629,679,701,705,725,827,867,946,952,955,1011,1047,1085,1089,1141,1185,1191,1236,1240,1293,1300],[141,142,143,144,148,149,148,152,155,156,159],"p",{},"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 ",[145,146,147],"code",{},"impact",", ",[145,150,151],{},"downstream",[145,153,154],{},"tests"," and ",[145,157,158],{},"--platform","\ncross the bridge. Electron IPC and Tauri commands use the same endpoint model across processes.",[161,162,164],"h2",{"id":163},"model","Model",[166,167,172],"pre",{"className":168,"code":170,"language":171},[169],"language-text","JS \u002F Dart caller --SENDS_TO--> endpoint:\u003Cprotocol>:\u003Cmodule>#\u003Cmethod> --RECEIVED_BY--> native handler\n","text",[145,173,170],{"__ignoreMap":174},"",[176,177,178,197],"table",{},[179,180,181],"thead",{},[182,183,184,188,191,194],"tr",{},[185,186,187],"th",{},"protocol",[185,189,190],{},"id",[185,192,193],{},"sender",[185,195,196],{},"receiver",[198,199,200,241,284,314,337,380],"tbody",{},[182,201,202,208,213,224],{},[203,204,205],"td",{},[145,206,207],{},"capacitor",[203,209,210],{},[145,211,212],{},"endpoint:capacitor:Echo#echo",[203,214,215,148,218,148,221],{},[145,216,217],{},"registerPlugin('Echo')",[145,219,220],{},"Capacitor.Plugins.Echo",[145,222,223],{},"nativePromise('Echo', 'echo')",[203,225,226,229,230,233,234,237,238],{},[145,227,228],{},"@CapacitorPlugin"," + ",[145,231,232],{},"@PluginMethod","; Swift ",[145,235,236],{},"CAPPlugin"," \u002F ",[145,239,240],{},"CAP_PLUGIN",[182,242,243,248,253,265],{},[203,244,245],{},[145,246,247],{},"react-native",[203,249,250],{},[145,251,252],{},"endpoint:react-native:CalendarModule#createEvent",[203,254,255,148,258,261,262],{},[145,256,257],{},"NativeModules.X",[145,259,260],{},"TurboModuleRegistry.get",", Expo ",[145,263,264],{},"requireNativeModule",[203,266,267,237,270,273,274,277,278,237,281],{},[145,268,269],{},"@ReactMethod",[145,271,272],{},"Native*Spec","; ",[145,275,276],{},"RCT_EXPORT_METHOD","; Expo ",[145,279,280],{},"Function",[145,282,283],{},"AsyncFunction",[182,285,286,291,296,302],{},[203,287,288],{},[145,289,290],{},"flutter",[203,292,293],{},[145,294,295],{},"endpoint:flutter:\u003Cchannel>#\u003Cmethod>",[203,297,298,301],{},[145,299,300],{},"MethodChannel.invokeMethod"," (channel resolved through locals, fields, constants)",[203,303,304,237,307,237,310,313],{},[145,305,306],{},"call.method == \"m\"",[145,308,309],{},"when",[145,311,312],{},"switch"," on that channel",[182,315,316,321,326,331],{},[203,317,318],{},[145,319,320],{},"flutter-event",[203,322,323],{},[145,324,325],{},"endpoint:flutter-event:\u003Cchannel>",[203,327,328],{},[145,329,330],{},"EventChannel.receiveBroadcastStream()",[203,332,333,334],{},"the channel's ",[145,335,336],{},"StreamHandler",[182,338,339,344,349,363],{},[203,340,341],{},[145,342,343],{},"cordova",[203,345,346],{},[145,347,348],{},"endpoint:cordova:Toast#show",[203,350,351,354,355,358,359,362],{},[145,352,353],{},"cordova.exec(..., 'Toast', 'show', ...)"," (",[145,356,357],{},"www\u002F"," next to ",[145,360,361],{},"plugin.xml"," is indexed)",[203,364,365,368,369,372,373,376,377],{},[145,366,367],{},"execute"," comparing ",[145,370,371],{},"action",", or a ",[145,374,375],{},"CDVPlugin"," method. Service name from ",[145,378,379],{},"\u003Cfeature name>",[182,381,382,387,392,406],{},[203,383,384],{},[145,385,386],{},"pigeon",[203,388,389],{},[145,390,391],{},"endpoint:pigeon:NativeSyncApi#hashAssets",[203,393,394,395,398,399,402,403],{},"a call on the generated ",[145,396,397],{},"@HostApi()"," class, including Riverpod ",[145,400,401],{},"ref.read"," of a ",[145,404,405],{},"Provider\u003CApi>",[203,407,408,409,412,413,416],{},"the class that implements the generated interface. Definition files (",[145,410,411],{},"package:pigeon\u002F",") supply the API when ",[145,414,415],{},"*.g.dart"," is git-ignored",[141,418,419,422,423,426,427,430,431,434],{},[145,420,421],{},"direction = to_app"," (the rest are ",[145,424,425],{},"to_native","): a native ",[145,428,429],{},"invokeMethod"," on a known channel, a\nPigeon ",[145,432,433],{},"@FlutterApi()"," call, and native events.",[176,436,437,450],{},[179,438,439],{},[182,440,441,444,447],{},[185,442,443],{},"event id",[185,445,446],{},"from",[185,448,449],{},"to",[198,451,452,484],{},[182,453,454,459,471],{},[203,455,456],{},[145,457,458],{},"endpoint:react-native-event:\u003Cevent>",[203,460,461,148,464,261,467,470],{},[145,462,463],{},"emitDeviceEvent",[145,465,466],{},"sendEventWithName",[145,468,469],{},"sendEvent",", a helper that forwards its event-name parameter",[203,472,473,476,477,237,480,483],{},[145,474,475],{},"addListener"," on ",[145,478,479],{},"NativeEventEmitter",[145,481,482],{},"DeviceEventEmitter"," \u002F an Expo module",[182,485,486,491,496],{},[203,487,488],{},[145,489,490],{},"endpoint:capacitor-event:\u003CPlugin>#\u003Cevent>",[203,492,493],{},[145,494,495],{},"notifyListeners(\"evt\")",[203,497,498],{},[145,499,500],{},"Plugin.addListener",[141,502,503,504,148,507,510,511,514,515,518,519,522,523,526,527,530,531,534,535,538,539,542],{},"Event names may be constants, string enums (",[145,505,506],{},"rawValue",[145,508,509],{},"val event",") or a computed property\nwhose every return is a literal. React Native's own events (",[145,512,513],{},"keyboardDidShow",") and JS-only\n",[145,516,517],{},"DeviceEventEmitter.emit"," are not endpoints. ",[145,520,521],{},"platforms_sending"," lists who sends; ",[145,524,525],{},"missing_on","\nis not computed. No JS listener is ",[145,528,529],{},"no_listener"," (not a check). A listener of an in-repo module\nwith no native sender is ",[145,532,533],{},"no_sender","; a package such as ",[145,536,537],{},"@capacitor\u002Fkeyboard"," is ",[145,540,541],{},"external",".",[141,544,545,548,549,148,552,555,556,148,559,148,562,565,566,155,569,571,572,575,576,579,580,582,583,586,587,354,590,148,593,148,596,599,600,148,603,148,606,148,609,148,612,615,616,618,619,621,622,624,625,628],{},[145,546,547],{},"SENDS_TO"," (code → endpoint) carries ",[145,550,551],{},"role = invoke",[145,553,554],{},"via"," (how the module was reached:\n",[145,557,558],{},"NativeModules",[145,560,561],{},"TurboModuleRegistry",[145,563,564],{},"require","), ",[145,567,568],{},"module_at",[145,570,541],{}," (the npm\npackage when the plugin is outside the repo). A test file emits ",[145,573,574],{},"TEST_CALLS"," with\n",[145,577,578],{},"orig = SENDS_TO",", so ",[145,581,154],{}," finds it and it never counts as a caller. ",[145,584,585],{},"RECEIVED_BY"," carries\n",[145,588,589],{},"platform",[145,591,592],{},"android",[145,594,595],{},"ios",[145,597,598],{},"macos","; from ",[145,601,602],{},"android\u002F",[145,604,605],{},"ios\u002F",[145,607,608],{},"macos\u002F",[145,610,611],{},"androidMain\u002F",[145,613,614],{},"iosMain\u002F",", else the language) and ",[145,617,554],{}," (the registration form). Both propagate: ",[145,620,147],{}," on\na native method lists the JS \u002F Dart senders, and ",[145,623,151],{}," from a screen reaches every\nplatform. ",[145,626,627],{},"--platform android"," keeps only the Android receivers.",[141,630,631,632,148,634,148,637,640,641,148,644,148,647,148,650,148,653,148,655,148,657,660,661,148,664,148,667,354,670,672,673,676,677,542],{},"Endpoint attrs: ",[145,633,187],{},[145,635,636],{},"transport = local",[145,638,639],{},"namespace"," (module \u002F plugin \u002F channel),\n",[145,642,643],{},"method",[145,645,646],{},"platforms_received",[145,648,649],{},"side",[145,651,652],{},"checks",[145,654,525],{},[145,656,541],{},[145,658,659],{},"package",",\n",[145,662,663],{},"base_method",[145,665,666],{},"sender_platforms",[145,668,669],{},"direction",[145,671,425],{}," or ",[145,674,675],{},"to_app","),\n",[145,678,521],{},[141,680,681,682,685,686,148,689,692,693,696,697,700],{},"Objective-C has no language plugin. Java methods are indexed by the ",[683,684,50],"a",{"href":51}," plugin when\nthe file is in the graph. A method that plugin did not index is still a stub\n(",[145,687,688],{},"method:\u003Cpackage>.\u003CClass>.\u003Cmethod>",[145,690,691],{},"attrs.bridge_stub","), as are Objective-C methods\n(",[145,694,695],{},"method:objc:\u003CClass>.\u003Cmethod>","). The same stub is used when a Kotlin or Swift method was not\nindexed. Receiver files are platform-specific, so ",[145,698,699],{},"cg platforms"," sees them.",[161,702,704],{"id":703},"electron-and-tauri","Electron and Tauri",[141,706,707,708,237,711,237,714,717,718,721,722,542],{},"Process role replaces platform: Electron ",[145,709,710],{},"main",[145,712,713],{},"preload",[145,715,716],{},"renderer","; Tauri ",[145,719,720],{},"webview"," \u002F\n",[145,723,724],{},"core",[176,726,727,739],{},[179,728,729],{},[182,730,731,733,735,737],{},[185,732,187],{},[185,734,190],{},[185,736,193],{},[185,738,196],{},[198,740,741,775,797],{},[182,742,743,748,753,764],{},[203,744,745],{},[145,746,747],{},"electron-ipc",[203,749,750],{},[145,751,752],{},"endpoint:electron-ipc:settings:read",[203,754,755,237,758,273,761],{},[145,756,757],{},"ipcRenderer.invoke",[145,759,760],{},"send",[145,762,763],{},"webContents.send",[203,765,766,237,769,273,772],{},[145,767,768],{},"ipcMain.handle",[145,770,771],{},"on",[145,773,774],{},"ipcRenderer.on",[182,776,777,782,787,792],{},[203,778,779],{},[145,780,781],{},"electron-preload",[203,783,784],{},[145,785,786],{},"endpoint:electron-preload:api#readSettings",[203,788,789],{},[145,790,791],{},"window.api.readSettings()",[203,793,794],{},[145,795,796],{},"contextBridge.exposeInMainWorld('api', {readSettings})",[182,798,799,804,813,822],{},[203,800,801],{},[145,802,803],{},"tauri",[203,805,806,809,810],{},[145,807,808],{},"endpoint:tauri:greet","; plugins ",[145,811,812],{},"endpoint:tauri:plugin:fs|read_text_file",[203,814,815,354,818,821],{},[145,816,817],{},"invoke('greet')",[145,819,820],{},"@tauri-apps\u002Fapi"," v1 or v2)",[203,823,824],{},[145,825,826],{},"#[tauri::command] fn greet",[141,828,829,830,833,834,837,838,148,841,844,845,848,849,852,853,856,857,859,860,863,864,866],{},"Channels are string literals, ",[145,831,832],{},"const","s or enum members (\n",[145,835,836],{},"ipcMain.handle(IpcEvents.GET_FILES, fn)","). A project wrapper named after the Electron object (\n",[145,839,840],{},"ipcMainManager.handle",[145,842,843],{},"ipcRendererManager.send",") counts at ",[145,846,847],{},"heuristic"," confidence. A\nhandler outside the project (",[145,850,851],{},"ipcMain.on('quit', app.quit)",") makes the registering function\nthe receiver. A listener whose channel is a variable typed as a union of literals (a lookup\ntable, a relay over ",[145,854,855],{},"IpcEvents[]",") receives each member at ",[145,858,847],{}," confidence, but only\nchannels another process sends and that this process does not already receive by name. Handlers\nregistered in test files are not receivers. Inline handlers become function nodes named after\nthe registration (",[145,861,862],{},"ipcMain.handle('settings:read')","), so ",[145,865,147],{}," on the code they call\nreaches the renderer.",[141,868,869,870,873,874,877,878,881,882,885,886,889,890,892,893,896,897,900,901,903,904,907,908,911,912,915,916,919,920,922,923,926,927,929,930,538,933,936,937,237,939,155,941,936,944,542],{},"Tauri commands are listed in ",[145,871,872],{},"generate_handler![...]",". A command missing from it gets\n",[145,875,876],{},"unregistered",". Commands registered by a plugin crate in the repo (\n",[145,879,880],{},"tauri::plugin::Builder::new(\"x\")",") are ",[145,883,884],{},"endpoint:tauri:plugin:x|\u003Ccommand>",". A name registered\nmore than once (the app's ",[145,887,888],{},"get"," and a plugin's ",[145,891,888],{},") takes the ",[145,894,895],{},"generate_handler!","\nregistration closest to the command's file (longest common directory). A ",[145,898,899],{},"plugin:x|cmd"," call to\na plugin that is not in the repo is ",[145,902,541],{}," (package ",[145,905,906],{},"tauri-plugin-x","). A Tauri app without\na root ",[145,909,910],{},"Cargo.toml"," has its Rust core indexed from ",[145,913,914],{},"\u003Capp>\u002Fsrc-tauri\u002FCargo.toml",". ",[145,917,918],{},"no_receiver","\nhere means some other channel or command is received in this repo, but not this one. There is no\n",[145,921,525],{},". The module nodes of the files taking part get ",[145,924,925],{},"attrs.process"," (main, preload,\nrenderer, webview, core), and the edges carry ",[145,928,925],{}," of their side. Endpoint\n",[145,931,932],{},"transport",[145,934,935],{},"ipc"," for ",[145,938,747],{},[145,940,803],{},[145,942,943],{},"local",[145,945,781],{},[166,947,950],{"className":948,"code":949,"language":171,"meta":174},[169],"$ cg bridges --protocol tauri --db out\u002Fapp.db      # tests\u002Fbridge_fixtures\u002Ftauri_app\ntauri: 6 endpoint(s), 4 linked  (external 1, no_receiver 1, unregistered 1)\ntauri:greet  received in: core\n    sent by greet (main.ts) @ src\u002Fmain.ts:4 [exact, webview]\n    received by tauri_fixture::greet @ src-tauri\u002Fsrc\u002Fmain.rs:7 [core, #[tauri::command]]\ntauri:gret  ! NO RECEIVER (this app handles other commands, not this one)\ntauri:plugin:fs|read_text_file  ! external (tauri-plugin-fs)\ntauri:secret  ! NOT REGISTERED (missing from generate_handler!)\n    received by tauri_fixture::commands::secret @ src-tauri\u002Fsrc\u002Fcommands.rs:16\n",[145,951,949],{"__ignoreMap":174},[161,953,954],{"id":652},"Checks",[176,956,957,967],{},[179,958,959],{},[182,960,961,964],{},[185,962,963],{},"check",[185,965,966],{},"meaning",[198,968,969,978,987,999],{},[182,970,971,975],{},[203,972,973],{},[145,974,525],{},[203,976,977],{},"received on some targets that implement the module, not all",[182,979,980,984],{},[203,981,982],{},[145,983,918],{},[203,985,986],{},"the module is in the repo; this method is not",[182,988,989,993],{},[203,990,991],{},[145,992,541],{},[203,994,995,996,998],{},"a published package implements it (",[145,997,659],{}," names it)",[182,1000,1001,1008],{},[203,1002,1003,237,1005],{},[145,1004,533],{},[145,1006,1007],{},"test_sender_only",[203,1009,1010],{},"nothing in app code calls it (expected in a library repo)",[141,1012,1013,1014,1017,1018,1021,1022,354,1025,1027,1028,148,1031,148,1033,1036,1037,1040,1041,881,1044,1046],{},"Expected platforms are android and ios, plus macos when some module is implemented for it.\nNarrowed by ",[145,1015,1016],{},"codegenConfig.platforms",", Flutter platform folders next to ",[145,1019,1020],{},"pubspec.yaml",", and\nsenders that all sit under ",[145,1023,1024],{},"Platform.OS === 'android'",[145,1026,666],{},"). Framework base\nmethods (",[145,1029,1030],{},"checkPermissions",[145,1032,475],{},[145,1034,1035],{},"removeListeners",", Capacitor\n",[145,1038,1039],{},"removeAllListeners",", React Native ",[145,1042,1043],{},"getConstants",[145,1045,663],{}," and are not checked.",[141,1048,1049,1050,1053,1054,237,1056,1058,1059,1062,1063,237,1066,1069,1070,1073,1074,1077,1078,1081,1082,542],{},"Capacitor targets come from ",[145,1051,1052],{},"capacitor.config.*"," plus ",[145,1055,602],{},[145,1057,605],{}," and web.\n",[145,1060,1061],{},"Object.assign(NativeModule, { helper })"," is JS, not an endpoint. ",[145,1064,1065],{},"file:",[145,1067,1068],{},"link:"," \u002F workspace\npackages resolve without ",[145,1071,1072],{},"node_modules",". A local Expo ",[145,1075,1076],{},"modules\u002F"," wrapper is a sender only when\nthat directory is in ",[145,1079,1080],{},".cg.yaml"," ",[145,1083,1084],{},"include",[161,1086,1088],{"id":1087},"query","Query",[166,1090,1094],{"className":1091,"code":1092,"language":1093,"meta":174,"style":174},"language-bash shiki shiki-themes cg-light cg-light cg-dark","cg bridges [PATTERN] [--protocol P] [--unmatched] [--json] --db out\u002Fapp.db\n","bash",[145,1095,1096],{"__ignoreMap":174},[1097,1098,1101,1105,1109,1113,1117,1120,1123,1126,1129,1131,1133,1136,1138],"span",{"class":1099,"line":1100},"line",1,[1097,1102,1104],{"class":1103},"sZJo5","cg",[1097,1106,1108],{"class":1107},"sha9Y"," bridges",[1097,1110,1112],{"class":1111},"snmWg"," [PATTERN] ",[1097,1114,1116],{"class":1115},"sZ_TN","[",[1097,1118,1119],{"class":1111},"--protocol P",[1097,1121,1122],{"class":1115},"]",[1097,1124,1125],{"class":1115}," [",[1097,1127,1128],{"class":1111},"--unmatched",[1097,1130,1122],{"class":1115},[1097,1132,1125],{"class":1115},[1097,1134,1135],{"class":1111},"--json",[1097,1137,1122],{"class":1115},[1097,1139,1140],{"class":1111}," --db out\u002Fapp.db\n",[141,1142,1143,1146,1147,148,1150,1153,1154,148,1157,148,1160,1163,1164,354,1167,1170,1171,915,1174,155,1176,1179,1180,155,1182,542],{},[145,1144,1145],{},"PATTERN"," is a name, substring or glob (",[145,1148,1149],{},"Echo#echo",[145,1151,1152],{},"samples.flutter.dev\u002F*","). Dynamic names\n(",[145,1155,1156],{},"NativeModules[name]",[145,1158,1159],{},"invokeMethod(method)",[145,1161,1162],{},"cordova.exec"," with a variable service) are\nlisted as ",[145,1165,1166],{},"unresolved",[145,1168,1169],{},"stats.bridges.dynamic","), not dropped. MCP:\n",[145,1172,1173],{},"bridges(pattern?, protocol?, unmatched?)",[145,1175,147],{},[145,1177,1178],{},"path"," accept\n",[145,1181,252],{},[145,1183,1184],{},"CalendarModule.createEvent",[166,1186,1189],{"className":1187,"code":1188,"language":171,"meta":174},[169],"$ cg bridges Echo --db out\u002Fapp.db      # tests\u002Fbridge_fixtures\u002Fcapacitor_app\ncapacitor: 4 endpoint(s), 2 linked  (no_receiver 1, test_sender_only 1, missing_on 1)\nmobile targets: ios, android\ncapacitor:Echo#echo  received on: android, ios\n    sent by greet (app.ts) @ src\u002Fapp.ts:6 [exact]\n    received by EchoPlugin.echo @ ios\u002F...\u002FEchoPlugin.swift:13 [ios, CAPPluginMethod]\n    received by com.example.app.EchoPlugin.echo @ android\u002F...\u002FEchoPlugin.java:13 [android, stub]\ncapacitor:Echo#nowhere  ! NO NATIVE RECEIVER (the module is implemented here, this method is not)\ncapacitor:Echo#vibrate  received on: android  ! MISSING ON ios\n",[145,1190,1188],{"__ignoreMap":174},[141,1192,1193,1194,660,1197,148,1200,1202,1203,148,1206,148,1209,1212,1213,354,1215,1217,1218,148,1220,148,1222,155,1224,1226,1227,1229,1230,148,1232,1235],{},"Calls whose module, method or event name is not a literal (",[145,1195,1196],{},"NativeModules[name].f()",[145,1198,1199],{},"emitter.addListener(evt)",[145,1201,1162],{}," with a variable service,\n",[145,1204,1205],{},"notifyListeners(eventName)",[145,1207,1208],{},"channel.invokeMethod(method)",[145,1210,1211],{},"MethodChannel(name)",") are\nlisted at the end as ",[145,1214,1166],{},[145,1216,1169],{},": a count and up to 20 samples).\n",[145,1219,147],{},[145,1221,151],{},[145,1223,1178],{},[145,1225,154],{}," accept endpoint ids (\n",[145,1228,252],{},") and native methods (\n",[145,1231,1184],{},[145,1233,1234],{},"com.rnapp.CalendarModule.createEvent",").",[161,1237,1239],{"id":1238},"not-covered-yet","Not covered yet",[1241,1242,1243,1257,1263,1266],"ul",{},[1244,1245,1246,1249,1250,1253,1254,542],"li",{},[145,1247,1248],{},"BasicMessageChannel",", Pigeon ",[145,1251,1252],{},"@EventChannelApi",", native UI components, React Native codegen\n",[145,1255,1256],{},"emitOnX",[1244,1258,1259,1260,1262],{},"A Java callback that forwards an event name, and a native ",[145,1261,429],{}," on a channel created\nin another file (unless this file creates exactly one).",[1244,1264,1265],{},"Java is indexed by the language plugin; bridge registration is still a separate scan. Objective-C is scanned for registrations only.",[1244,1267,1268,1269,148,1272,1275,1276,237,1279,1282,1283,237,1286,1289,1290,542],{},"Electron ",[145,1270,1271],{},"MessagePort",[145,1273,1274],{},"utilityProcess",", preload listeners mapped through a renderer lookup\ntable. Tauri ",[145,1277,1278],{},"emit",[145,1280,1281],{},"listen",", and commands invoked from ",[145,1284,1285],{},".svelte",[145,1287,1288],{},".vue"," outside\n",[145,1291,1292],{},"\u003Cscript>",[141,1294,1295,1296,542],{},"Public-app results: ",[683,1297,1299],{"href":1298},"\u002Fdocs\u002Fvalidation-log#web--native-bridges","web \u002F native bridges",[1301,1302,1303],"style",{},"html pre.shiki code .sZJo5, html code.shiki .sZJo5{--shiki-light:#65A30D;--shiki-default:#65A30D;--shiki-dark:#84CC16}html pre.shiki code .sha9Y, html code.shiki .sha9Y{--shiki-light:#9F8CFF;--shiki-default:#9F8CFF;--shiki-dark:#C4B5FD}html pre.shiki code .snmWg, html code.shiki .snmWg{--shiki-light:#27272A;--shiki-default:#27272A;--shiki-dark:#E4E4E7}html pre.shiki code .sZ_TN, html code.shiki .sZ_TN{--shiki-light:#71717A;--shiki-default:#71717A;--shiki-dark:#A1A1AA}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":174,"searchDepth":1305,"depth":1306,"links":1307},4,2,[1308,1309,1310,1311,1312],{"id":163,"depth":1306,"text":164},{"id":703,"depth":1306,"text":704},{"id":652,"depth":1306,"text":954},{"id":1087,"depth":1306,"text":1088},{"id":1238,"depth":1306,"text":1239},"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.","md",{},true,{"title":18,"description":1313},"JCgcZPuga1HpCDYHbrNpRbjUASM-W70Up32o0vO3xrM",[1320,1322],{"title":14,"path":15,"stem":16,"description":1321,"children":-1},"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.",{"title":22,"path":23,"stem":24,"description":1323,"children":-1},"Realtime channels (who may join, what publishes, which client listens) and test code (which\ntests exercise a symbol, route or table). Examples are the task-board fixture in\ntests\u002Fbroadcast_fixture (api\u002F Laravel, web\u002F Nuxt, joined with cg link).",1792170236679]