[{"data":1,"prerenderedAt":1923},["ShallowReactive",2],{"/docs/scripts/free-phone/events":3,"/docs/scripts/free-phone/events-surround":1914,"/docs/scripts/free-phone/events-implemented-suggestions":1922},{"id":4,"title":5,"body":6,"description":1905,"extension":1906,"head":1907,"implementedSuggestions":1907,"meta":1908,"navigation":253,"path":1909,"schemaOrg":1907,"seo":1910,"sitemap":1911,"stem":1912,"__hash__":1913},"docs/1.docs/scripts/4.free-phone/4.events.md","Events",{"type":7,"value":8,"toc":1888},"minimark",[9,13,17,29,34,42,139,144,324,328,443,447,636,651,655,662,666,726,730,817,823,827,979,982,1010,1013,1017,1106,1110,1408,1415,1419,1422,1695,1699,1702,1858,1866,1870,1873,1881,1884],[10,11,5],"h1",{"id":12},"events",[14,15,16],"p",{},"Free Phone separates public observer events from internal transport events. Public observer events\nmay be handled by another resource. Internal events coordinate Free Phone itself and must not be\ntriggered as integration shortcuts.",[18,19,20],"warning",{},[14,21,22,23,28],{},"Events are not mutation APIs. Use the documented ",[24,25,27],"a",{"href":26},"/docs/scripts/free-phone/exports","Exports"," to\nregister apps, create invoices, send notifications, or create CrewLink pings.",[30,31,33],"h2",{"id":32},"public-crewlink-observer-events","Public CrewLink observer events",[14,35,36,37,41],{},"These events run locally on the server. They can be observed with ",[38,39,40],"code",{},"AddEventHandler"," and are safe for\nlogging, dispatch synchronization, or read-only reactions.",[43,44,45,61],"table",{},[46,47,48],"thead",{},[49,50,51,55,58],"tr",{},[52,53,54],"th",{},"Event",[52,56,57],{},"Parameters",[52,59,60],{},"Fired when",[62,63,64,80,94,109,124],"tbody",{},[49,65,66,72,77],{},[67,68,69],"td",{},[38,70,71],{},"sky_phone:crewlink:memberJoined",[67,73,74],{},[38,75,76],{},"(group_id, profile_id)",[67,78,79],{},"A profile joins a group.",[49,81,82,87,91],{},[67,83,84],{},[38,85,86],{},"sky_phone:crewlink:memberLeft",[67,88,89],{},[38,90,76],{},[67,92,93],{},"A profile leaves a group.",[49,95,96,101,106],{},[67,97,98],{},[38,99,100],{},"sky_phone:crewlink:activeChanged",[67,102,103],{},[38,104,105],{},"(profile_id, group_id)",[67,107,108],{},"A profile changes its active group.",[49,110,111,116,121],{},[67,112,113],{},[38,114,115],{},"sky_phone:crewlink:pingCreated",[67,117,118],{},[38,119,120],{},"(group_id, ping)",[67,122,123],{},"A group ping is created.",[49,125,126,131,136],{},[67,127,128],{},[38,129,130],{},"sky_phone:crewlink:pingRemoved",[67,132,133],{},[38,134,135],{},"(group_id, ping_id)",[67,137,138],{},"A group ping is removed.",[140,141,143],"h3",{"id":142},"observe-membership-changes","Observe membership changes",[145,146,152],"pre",{"className":147,"code":148,"filename":149,"language":150,"meta":151,"style":151},"language-lua shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","AddEventHandler(\"sky_phone:crewlink:memberJoined\", function(group_id, profile_id)\n    print((\"[crew-audit] Profile %s joined group %s\"):format(\n        profile_id,\n        group_id\n    ))\nend)\n\nAddEventHandler(\"sky_phone:crewlink:memberLeft\", function(group_id, profile_id)\n    print((\"[crew-audit] Profile %s left group %s\"):format(\n        profile_id,\n        group_id\n    ))\nend)\n","server.lua","lua","",[38,153,154,197,222,228,234,240,248,255,282,302,307,312,317],{"__ignoreMap":151},[155,156,159,162,166,170,173,175,178,182,184,188,191,194],"span",{"class":157,"line":158},"line",1,[155,160,40],{"class":161},"s2Zo4",[155,163,165],{"class":164},"sTEyZ","(",[155,167,169],{"class":168},"sMK4o","\"",[155,171,71],{"class":172},"sfazB",[155,174,169],{"class":168},[155,176,177],{"class":164},", ",[155,179,181],{"class":180},"s7zQu","function",[155,183,165],{"class":168},[155,185,187],{"class":186},"sHdIc","group_id",[155,189,190],{"class":168},",",[155,192,193],{"class":186}," profile_id",[155,195,196],{"class":168},")\n",[155,198,200,203,206,208,211,213,216,219],{"class":157,"line":199},2,[155,201,202],{"class":161},"    print",[155,204,205],{"class":164},"((",[155,207,169],{"class":168},[155,209,210],{"class":172},"[crew-audit] Profile %s joined group %s",[155,212,169],{"class":168},[155,214,215],{"class":164},"):",[155,217,218],{"class":161},"format",[155,220,221],{"class":164},"(\n",[155,223,225],{"class":157,"line":224},3,[155,226,227],{"class":164},"        profile_id,\n",[155,229,231],{"class":157,"line":230},4,[155,232,233],{"class":164},"        group_id\n",[155,235,237],{"class":157,"line":236},5,[155,238,239],{"class":164},"    ))\n",[155,241,243,246],{"class":157,"line":242},6,[155,244,245],{"class":180},"end",[155,247,196],{"class":164},[155,249,251],{"class":157,"line":250},7,[155,252,254],{"emptyLinePlaceholder":253},true,"\n",[155,256,258,260,262,264,266,268,270,272,274,276,278,280],{"class":157,"line":257},8,[155,259,40],{"class":161},[155,261,165],{"class":164},[155,263,169],{"class":168},[155,265,86],{"class":172},[155,267,169],{"class":168},[155,269,177],{"class":164},[155,271,181],{"class":180},[155,273,165],{"class":168},[155,275,187],{"class":186},[155,277,190],{"class":168},[155,279,193],{"class":186},[155,281,196],{"class":168},[155,283,285,287,289,291,294,296,298,300],{"class":157,"line":284},9,[155,286,202],{"class":161},[155,288,205],{"class":164},[155,290,169],{"class":168},[155,292,293],{"class":172},"[crew-audit] Profile %s left group %s",[155,295,169],{"class":168},[155,297,215],{"class":164},[155,299,218],{"class":161},[155,301,221],{"class":164},[155,303,305],{"class":157,"line":304},10,[155,306,227],{"class":164},[155,308,310],{"class":157,"line":309},11,[155,311,233],{"class":164},[155,313,315],{"class":157,"line":314},12,[155,316,239],{"class":164},[155,318,320,322],{"class":157,"line":319},13,[155,321,245],{"class":180},[155,323,196],{"class":164},[140,325,327],{"id":326},"observe-the-active-group","Observe the active group",[145,329,331],{"className":147,"code":330,"filename":149,"language":150,"meta":151,"style":151},"AddEventHandler(\"sky_phone:crewlink:activeChanged\", function(profile_id, group_id)\n    if group_id then\n        print((\"[crew-audit] Profile %s activated group %s\"):format(\n            profile_id,\n            group_id\n        ))\n    else\n        print((\"[crew-audit] Profile %s has no active group\"):format(profile_id))\n    end\nend)\n",[38,332,333,361,372,392,397,402,407,412,432,437],{"__ignoreMap":151},[155,334,335,337,339,341,343,345,347,349,351,354,356,359],{"class":157,"line":158},[155,336,40],{"class":161},[155,338,165],{"class":164},[155,340,169],{"class":168},[155,342,100],{"class":172},[155,344,169],{"class":168},[155,346,177],{"class":164},[155,348,181],{"class":180},[155,350,165],{"class":168},[155,352,353],{"class":186},"profile_id",[155,355,190],{"class":168},[155,357,358],{"class":186}," group_id",[155,360,196],{"class":168},[155,362,363,366,369],{"class":157,"line":199},[155,364,365],{"class":180},"    if",[155,367,368],{"class":164}," group_id ",[155,370,371],{"class":180},"then\n",[155,373,374,377,379,381,384,386,388,390],{"class":157,"line":224},[155,375,376],{"class":161},"        print",[155,378,205],{"class":164},[155,380,169],{"class":168},[155,382,383],{"class":172},"[crew-audit] Profile %s activated group %s",[155,385,169],{"class":168},[155,387,215],{"class":164},[155,389,218],{"class":161},[155,391,221],{"class":164},[155,393,394],{"class":157,"line":230},[155,395,396],{"class":164},"            profile_id,\n",[155,398,399],{"class":157,"line":236},[155,400,401],{"class":164},"            group_id\n",[155,403,404],{"class":157,"line":242},[155,405,406],{"class":164},"        ))\n",[155,408,409],{"class":157,"line":250},[155,410,411],{"class":180},"    else\n",[155,413,414,416,418,420,423,425,427,429],{"class":157,"line":257},[155,415,376],{"class":161},[155,417,205],{"class":164},[155,419,169],{"class":168},[155,421,422],{"class":172},"[crew-audit] Profile %s has no active group",[155,424,169],{"class":168},[155,426,215],{"class":164},[155,428,218],{"class":161},[155,430,431],{"class":164},"(profile_id))\n",[155,433,434],{"class":157,"line":284},[155,435,436],{"class":180},"    end\n",[155,438,439,441],{"class":157,"line":304},[155,440,245],{"class":180},[155,442,196],{"class":164},[140,444,446],{"id":445},"observe-shared-pings","Observe shared pings",[145,448,450],{"className":147,"code":449,"filename":149,"language":150,"meta":151,"style":151},"AddEventHandler(\"sky_phone:crewlink:pingCreated\", function(group_id, ping)\n    print((\"[crew-audit] Ping %s created in group %s at %.2f, %.2f, %.2f\"):format(\n        ping.id,\n        group_id,\n        ping.coords.x,\n        ping.coords.y,\n        ping.coords.z\n    ))\nend)\n\nAddEventHandler(\"sky_phone:crewlink:pingRemoved\", function(group_id, ping_id)\n    print((\"[crew-audit] Ping %s removed from group %s\"):format(\n        ping_id,\n        group_id\n    ))\nend)\n",[38,451,452,479,498,510,515,530,543,554,558,564,568,595,614,619,624,629],{"__ignoreMap":151},[155,453,454,456,458,460,462,464,466,468,470,472,474,477],{"class":157,"line":158},[155,455,40],{"class":161},[155,457,165],{"class":164},[155,459,169],{"class":168},[155,461,115],{"class":172},[155,463,169],{"class":168},[155,465,177],{"class":164},[155,467,181],{"class":180},[155,469,165],{"class":168},[155,471,187],{"class":186},[155,473,190],{"class":168},[155,475,476],{"class":186}," ping",[155,478,196],{"class":168},[155,480,481,483,485,487,490,492,494,496],{"class":157,"line":199},[155,482,202],{"class":161},[155,484,205],{"class":164},[155,486,169],{"class":168},[155,488,489],{"class":172},"[crew-audit] Ping %s created in group %s at %.2f, %.2f, %.2f",[155,491,169],{"class":168},[155,493,215],{"class":164},[155,495,218],{"class":161},[155,497,221],{"class":164},[155,499,500,503,507],{"class":157,"line":224},[155,501,502],{"class":164},"        ping.",[155,504,506],{"class":505},"sBMFI","id",[155,508,509],{"class":164},",\n",[155,511,512],{"class":157,"line":230},[155,513,514],{"class":164},"        group_id,\n",[155,516,517,519,522,525,528],{"class":157,"line":236},[155,518,502],{"class":164},[155,520,521],{"class":505},"coords",[155,523,524],{"class":164},".",[155,526,527],{"class":505},"x",[155,529,509],{"class":164},[155,531,532,534,536,538,541],{"class":157,"line":242},[155,533,502],{"class":164},[155,535,521],{"class":505},[155,537,524],{"class":164},[155,539,540],{"class":505},"y",[155,542,509],{"class":164},[155,544,545,547,549,551],{"class":157,"line":250},[155,546,502],{"class":164},[155,548,521],{"class":505},[155,550,524],{"class":164},[155,552,553],{"class":505},"z\n",[155,555,556],{"class":157,"line":257},[155,557,239],{"class":164},[155,559,560,562],{"class":157,"line":284},[155,561,245],{"class":180},[155,563,196],{"class":164},[155,565,566],{"class":157,"line":304},[155,567,254],{"emptyLinePlaceholder":253},[155,569,570,572,574,576,578,580,582,584,586,588,590,593],{"class":157,"line":309},[155,571,40],{"class":161},[155,573,165],{"class":164},[155,575,169],{"class":168},[155,577,130],{"class":172},[155,579,169],{"class":168},[155,581,177],{"class":164},[155,583,181],{"class":180},[155,585,165],{"class":168},[155,587,187],{"class":186},[155,589,190],{"class":168},[155,591,592],{"class":186}," ping_id",[155,594,196],{"class":168},[155,596,597,599,601,603,606,608,610,612],{"class":157,"line":314},[155,598,202],{"class":161},[155,600,205],{"class":164},[155,602,169],{"class":168},[155,604,605],{"class":172},"[crew-audit] Ping %s removed from group %s",[155,607,169],{"class":168},[155,609,215],{"class":164},[155,611,218],{"class":161},[155,613,221],{"class":164},[155,615,616],{"class":157,"line":319},[155,617,618],{"class":164},"        ping_id,\n",[155,620,622],{"class":157,"line":621},14,[155,623,233],{"class":164},[155,625,627],{"class":157,"line":626},15,[155,628,239],{"class":164},[155,630,632,634],{"class":157,"line":631},16,[155,633,245],{"class":180},[155,635,196],{"class":164},[14,637,638,639,642,643,646,647,650],{},"Do not call ",[38,640,641],{},"TriggerEvent"," with these names to change CrewLink state. Use ",[38,644,645],{},"CreateCrewLinkPing"," and\n",[38,648,649],{},"RemoveCrewLinkPing"," for supported mutations.",[30,652,654],{"id":653},"custom-app-iframe-messages","Custom-app iframe messages",[14,656,657,658,661],{},"Custom apps communicate with the phone host through a versioned ",[38,659,660],{},"postMessage"," contract. Every\nmessage is validated against its iframe source, origin, app ID, request ID, permission, and payload\nlimit.",[140,663,665],{"id":664},"app-to-phone","App to phone",[43,667,668,681],{},[46,669,670],{},[49,671,672,675,678],{},[52,673,674],{},"Message type",[52,676,677],{},"Required data",[52,679,680],{},"Purpose",[62,682,683,701],{},[49,684,685,690,698],{},[67,686,687],{},[38,688,689],{},"sky-phone-app:ready",[67,691,692,177,695],{},[38,693,694],{},"appId",[38,696,697],{},"protocolVersion",[67,699,700],{},"Tell the host that the iframe bridge is ready.",[49,702,703,708,723],{},[67,704,705],{},[38,706,707],{},"sky-phone-app:request",[67,709,710,177,712,177,714,177,717,177,720],{},[38,711,694],{},[38,713,697],{},[38,715,716],{},"requestId",[38,718,719],{},"method",[38,721,722],{},"payload?",[67,724,725],{},"Request a permission-bound host method.",[140,727,729],{"id":728},"announce-bridge-readiness","Announce bridge readiness",[145,731,736],{"className":732,"code":733,"filename":734,"language":735,"meta":151,"style":151},"language-js shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","window.parent.postMessage({\n  type: 'sky-phone-app:ready',\n  appId: 'dispatch-board',\n  protocolVersion: 1\n}, '*')\n","web/app.js","js",[38,737,738,757,776,792,803],{"__ignoreMap":151},[155,739,740,743,745,748,750,752,754],{"class":157,"line":158},[155,741,742],{"class":164},"window",[155,744,524],{"class":168},[155,746,747],{"class":164},"parent",[155,749,524],{"class":168},[155,751,660],{"class":161},[155,753,165],{"class":164},[155,755,756],{"class":168},"{\n",[155,758,759,763,766,769,771,774],{"class":157,"line":199},[155,760,762],{"class":761},"swJcz","  type",[155,764,765],{"class":168},":",[155,767,768],{"class":168}," '",[155,770,689],{"class":172},[155,772,773],{"class":168},"'",[155,775,509],{"class":168},[155,777,778,781,783,785,788,790],{"class":157,"line":224},[155,779,780],{"class":761},"  appId",[155,782,765],{"class":168},[155,784,768],{"class":168},[155,786,787],{"class":172},"dispatch-board",[155,789,773],{"class":168},[155,791,509],{"class":168},[155,793,794,797,799],{"class":157,"line":230},[155,795,796],{"class":761},"  protocolVersion",[155,798,765],{"class":168},[155,800,802],{"class":801},"sbssI"," 1\n",[155,804,805,808,810,813,815],{"class":157,"line":236},[155,806,807],{"class":168},"},",[155,809,768],{"class":168},[155,811,812],{"class":172},"*",[155,814,773],{"class":168},[155,816,196],{"class":164},[14,818,819,820,822],{},"Use the exact allowed host origin instead of ",[38,821,812],{}," when the custom app knows it.",[140,824,826],{"id":825},"request-app-storage","Request app storage",[145,828,830],{"className":732,"code":829,"filename":734,"language":735,"meta":151,"style":151},"const requestId = crypto.randomUUID()\n\nwindow.parent.postMessage({\n  type: 'sky-phone-app:request',\n  appId: 'dispatch-board',\n  protocolVersion: 1,\n  requestId,\n  method: 'device.storage.get',\n  payload: {\n    key: 'filters'\n  }\n}, '*')\n",[38,831,832,855,859,875,889,903,914,921,937,947,962,967],{"__ignoreMap":151},[155,833,834,838,841,844,847,849,852],{"class":157,"line":158},[155,835,837],{"class":836},"spNyl","const",[155,839,840],{"class":164}," requestId ",[155,842,843],{"class":168},"=",[155,845,846],{"class":164}," crypto",[155,848,524],{"class":168},[155,850,851],{"class":161},"randomUUID",[155,853,854],{"class":164},"()\n",[155,856,857],{"class":157,"line":199},[155,858,254],{"emptyLinePlaceholder":253},[155,860,861,863,865,867,869,871,873],{"class":157,"line":224},[155,862,742],{"class":164},[155,864,524],{"class":168},[155,866,747],{"class":164},[155,868,524],{"class":168},[155,870,660],{"class":161},[155,872,165],{"class":164},[155,874,756],{"class":168},[155,876,877,879,881,883,885,887],{"class":157,"line":230},[155,878,762],{"class":761},[155,880,765],{"class":168},[155,882,768],{"class":168},[155,884,707],{"class":172},[155,886,773],{"class":168},[155,888,509],{"class":168},[155,890,891,893,895,897,899,901],{"class":157,"line":236},[155,892,780],{"class":761},[155,894,765],{"class":168},[155,896,768],{"class":168},[155,898,787],{"class":172},[155,900,773],{"class":168},[155,902,509],{"class":168},[155,904,905,907,909,912],{"class":157,"line":242},[155,906,796],{"class":761},[155,908,765],{"class":168},[155,910,911],{"class":801}," 1",[155,913,509],{"class":168},[155,915,916,919],{"class":157,"line":250},[155,917,918],{"class":164},"  requestId",[155,920,509],{"class":168},[155,922,923,926,928,930,933,935],{"class":157,"line":257},[155,924,925],{"class":761},"  method",[155,927,765],{"class":168},[155,929,768],{"class":168},[155,931,932],{"class":172},"device.storage.get",[155,934,773],{"class":168},[155,936,509],{"class":168},[155,938,939,942,944],{"class":157,"line":284},[155,940,941],{"class":761},"  payload",[155,943,765],{"class":168},[155,945,946],{"class":168}," {\n",[155,948,949,952,954,956,959],{"class":157,"line":304},[155,950,951],{"class":761},"    key",[155,953,765],{"class":168},[155,955,768],{"class":168},[155,957,958],{"class":172},"filters",[155,960,961],{"class":168},"'\n",[155,963,964],{"class":157,"line":309},[155,965,966],{"class":168},"  }\n",[155,968,969,971,973,975,977],{"class":157,"line":314},[155,970,807],{"class":168},[155,972,768],{"class":168},[155,974,812],{"class":172},[155,976,773],{"class":168},[155,978,196],{"class":164},[14,980,981],{},"Supported request methods in ABI 1 are:",[983,984,985,991,996,1000,1005],"ul",{},[986,987,988],"li",{},[38,989,990],{},"app.close",[986,992,993],{},[38,994,995],{},"app.open",[986,997,998],{},[38,999,932],{},[986,1001,1002],{},[38,1003,1004],{},"device.storage.set",[986,1006,1007],{},[38,1008,1009],{},"notification.create",[14,1011,1012],{},"The matching permission must be declared in the client definition and server policy.",[140,1014,1016],{"id":1015},"phone-to-app","Phone to app",[43,1018,1019,1030],{},[46,1020,1021],{},[49,1022,1023,1025,1028],{},[52,1024,674],{},[52,1026,1027],{},"Data",[52,1029,680],{},[62,1031,1032,1047,1065,1084],{},[49,1033,1034,1039,1044],{},[67,1035,1036],{},[38,1037,1038],{},"sky-phone-app:context",[67,1040,1041],{},[38,1042,1043],{},"context",[67,1045,1046],{},"Supplies app ID, capabilities, locale, theme, scale, and safe area.",[49,1048,1049,1054,1059],{},[67,1050,1051],{},[38,1052,1053],{},"sky-phone-app:open",[67,1055,1056],{},[38,1057,1058],{},"data?",[67,1060,1061,1062,524],{},"Supplies opening data from ",[38,1063,1064],{},"OpenCustomApp",[49,1066,1067,1072,1077],{},[67,1068,1069],{},[38,1070,1071],{},"sky-phone-app:message",[67,1073,1074],{},[38,1075,1076],{},"payload",[67,1078,1079,1080,1083],{},"Delivers ",[38,1081,1082],{},"SendCustomAppMessage"," data.",[49,1085,1086,1091,1103],{},[67,1087,1088],{},[38,1089,1090],{},"sky-phone-app:response",[67,1092,1093,177,1095,177,1098,177,1100],{},[38,1094,716],{},[38,1096,1097],{},"success",[38,1099,1058],{},[38,1101,1102],{},"error?",[67,1104,1105],{},"Resolves a bridge request.",[140,1107,1109],{"id":1108},"receive-host-messages","Receive host messages",[145,1111,1113],{"className":732,"code":1112,"filename":734,"language":735,"meta":151,"style":151},"window.addEventListener('message', (event) => {\n  const message = event.data\n\n  if (!message || typeof message !== 'object') return\n\n  switch (message.type) {\n    case 'sky-phone-app:context':\n      document.documentElement.dataset.theme = message.context.theme\n      break\n\n    case 'sky-phone-app:open':\n      openIncident(message.data?.incidentId)\n      break\n\n    case 'sky-phone-app:message':\n      applyPhoneMessage(message.payload)\n      break\n\n    case 'sky-phone-app:response':\n      resolveBridgeRequest(message)\n      break\n  }\n})\n",[38,1114,1115,1149,1168,1172,1208,1212,1230,1244,1277,1282,1286,1298,1320,1324,1328,1340,1355,1360,1365,1378,1390,1395,1400],{"__ignoreMap":151},[155,1116,1117,1119,1121,1124,1126,1128,1131,1133,1135,1138,1141,1144,1147],{"class":157,"line":158},[155,1118,742],{"class":164},[155,1120,524],{"class":168},[155,1122,1123],{"class":161},"addEventListener",[155,1125,165],{"class":164},[155,1127,773],{"class":168},[155,1129,1130],{"class":172},"message",[155,1132,773],{"class":168},[155,1134,190],{"class":168},[155,1136,1137],{"class":168}," (",[155,1139,1140],{"class":186},"event",[155,1142,1143],{"class":168},")",[155,1145,1146],{"class":836}," =>",[155,1148,946],{"class":168},[155,1150,1151,1154,1157,1160,1163,1165],{"class":157,"line":199},[155,1152,1153],{"class":836},"  const",[155,1155,1156],{"class":164}," message",[155,1158,1159],{"class":168}," =",[155,1161,1162],{"class":164}," event",[155,1164,524],{"class":168},[155,1166,1167],{"class":164},"data\n",[155,1169,1170],{"class":157,"line":224},[155,1171,254],{"emptyLinePlaceholder":253},[155,1173,1174,1177,1179,1182,1184,1187,1190,1192,1195,1197,1200,1202,1205],{"class":157,"line":230},[155,1175,1176],{"class":180},"  if",[155,1178,1137],{"class":761},[155,1180,1181],{"class":168},"!",[155,1183,1130],{"class":164},[155,1185,1186],{"class":168}," ||",[155,1188,1189],{"class":168}," typeof",[155,1191,1156],{"class":164},[155,1193,1194],{"class":168}," !==",[155,1196,768],{"class":168},[155,1198,1199],{"class":172},"object",[155,1201,773],{"class":168},[155,1203,1204],{"class":761},") ",[155,1206,1207],{"class":180},"return\n",[155,1209,1210],{"class":157,"line":236},[155,1211,254],{"emptyLinePlaceholder":253},[155,1213,1214,1217,1219,1221,1223,1226,1228],{"class":157,"line":242},[155,1215,1216],{"class":180},"  switch",[155,1218,1137],{"class":761},[155,1220,1130],{"class":164},[155,1222,524],{"class":168},[155,1224,1225],{"class":164},"type",[155,1227,1204],{"class":761},[155,1229,756],{"class":168},[155,1231,1232,1235,1237,1239,1241],{"class":157,"line":250},[155,1233,1234],{"class":180},"    case",[155,1236,768],{"class":168},[155,1238,1038],{"class":172},[155,1240,773],{"class":168},[155,1242,1243],{"class":168},":\n",[155,1245,1246,1249,1251,1254,1256,1259,1261,1264,1266,1268,1270,1272,1274],{"class":157,"line":257},[155,1247,1248],{"class":164},"      document",[155,1250,524],{"class":168},[155,1252,1253],{"class":164},"documentElement",[155,1255,524],{"class":168},[155,1257,1258],{"class":164},"dataset",[155,1260,524],{"class":168},[155,1262,1263],{"class":164},"theme",[155,1265,1159],{"class":168},[155,1267,1156],{"class":164},[155,1269,524],{"class":168},[155,1271,1043],{"class":164},[155,1273,524],{"class":168},[155,1275,1276],{"class":164},"theme\n",[155,1278,1279],{"class":157,"line":284},[155,1280,1281],{"class":180},"      break\n",[155,1283,1284],{"class":157,"line":304},[155,1285,254],{"emptyLinePlaceholder":253},[155,1287,1288,1290,1292,1294,1296],{"class":157,"line":309},[155,1289,1234],{"class":180},[155,1291,768],{"class":168},[155,1293,1053],{"class":172},[155,1295,773],{"class":168},[155,1297,1243],{"class":168},[155,1299,1300,1303,1305,1307,1309,1312,1315,1318],{"class":157,"line":314},[155,1301,1302],{"class":161},"      openIncident",[155,1304,165],{"class":761},[155,1306,1130],{"class":164},[155,1308,524],{"class":168},[155,1310,1311],{"class":164},"data",[155,1313,1314],{"class":168},"?.",[155,1316,1317],{"class":164},"incidentId",[155,1319,196],{"class":761},[155,1321,1322],{"class":157,"line":319},[155,1323,1281],{"class":180},[155,1325,1326],{"class":157,"line":621},[155,1327,254],{"emptyLinePlaceholder":253},[155,1329,1330,1332,1334,1336,1338],{"class":157,"line":626},[155,1331,1234],{"class":180},[155,1333,768],{"class":168},[155,1335,1071],{"class":172},[155,1337,773],{"class":168},[155,1339,1243],{"class":168},[155,1341,1342,1345,1347,1349,1351,1353],{"class":157,"line":631},[155,1343,1344],{"class":161},"      applyPhoneMessage",[155,1346,165],{"class":761},[155,1348,1130],{"class":164},[155,1350,524],{"class":168},[155,1352,1076],{"class":164},[155,1354,196],{"class":761},[155,1356,1358],{"class":157,"line":1357},17,[155,1359,1281],{"class":180},[155,1361,1363],{"class":157,"line":1362},18,[155,1364,254],{"emptyLinePlaceholder":253},[155,1366,1368,1370,1372,1374,1376],{"class":157,"line":1367},19,[155,1369,1234],{"class":180},[155,1371,768],{"class":168},[155,1373,1090],{"class":172},[155,1375,773],{"class":168},[155,1377,1243],{"class":168},[155,1379,1381,1384,1386,1388],{"class":157,"line":1380},20,[155,1382,1383],{"class":161},"      resolveBridgeRequest",[155,1385,165],{"class":761},[155,1387,1130],{"class":164},[155,1389,196],{"class":761},[155,1391,1393],{"class":157,"line":1392},21,[155,1394,1281],{"class":180},[155,1396,1398],{"class":157,"line":1397},22,[155,1399,966],{"class":168},[155,1401,1403,1406],{"class":157,"line":1402},23,[155,1404,1405],{"class":168},"}",[155,1407,196],{"class":164},[14,1409,1410,1411,1414],{},"Validate ",[38,1412,1413],{},"event.origin"," for remote apps before processing a message.",[30,1416,1418],{"id":1417},"custom-app-lifecycle-hooks","Custom-app lifecycle hooks",[14,1420,1421],{},"Client definitions may include lifecycle functions. They run inside the resource that registered\nthe app and are useful for local cleanup or telemetry.",[145,1423,1426],{"className":147,"code":1424,"filename":1425,"language":150,"meta":151,"style":151},"local definition = {\n    id = \"dispatch-board\",\n    name = \"Dispatch Board\",\n    ui = \"web/index.html\",\n\n    onInstall = function()\n        print(\"[my_dispatch] App installed\")\n    end,\n\n    onOpen = function(data)\n        print((\"[my_dispatch] App opened for incident %s\"):format(\n            tostring(data and data.incidentId)\n        ))\n    end,\n\n    onReady = function()\n        print(\"[my_dispatch] Iframe bridge ready\")\n    end,\n\n    onClose = function()\n        print(\"[my_dispatch] App closed\")\n    end,\n}\n\nexports[\"sky_phone\"]:AddCustomApp(definition)\n","client.lua",[38,1427,1428,1440,1456,1472,1488,1492,1504,1519,1526,1530,1545,1564,1581,1585,1591,1595,1606,1621,1627,1631,1642,1657,1663,1668,1673],{"__ignoreMap":151},[155,1429,1430,1433,1436,1438],{"class":157,"line":158},[155,1431,1432],{"class":168},"local",[155,1434,1435],{"class":164}," definition ",[155,1437,843],{"class":168},[155,1439,946],{"class":164},[155,1441,1442,1445,1447,1450,1452,1454],{"class":157,"line":199},[155,1443,1444],{"class":164},"    id ",[155,1446,843],{"class":168},[155,1448,1449],{"class":168}," \"",[155,1451,787],{"class":172},[155,1453,169],{"class":168},[155,1455,509],{"class":164},[155,1457,1458,1461,1463,1465,1468,1470],{"class":157,"line":224},[155,1459,1460],{"class":164},"    name ",[155,1462,843],{"class":168},[155,1464,1449],{"class":168},[155,1466,1467],{"class":172},"Dispatch Board",[155,1469,169],{"class":168},[155,1471,509],{"class":164},[155,1473,1474,1477,1479,1481,1484,1486],{"class":157,"line":230},[155,1475,1476],{"class":164},"    ui ",[155,1478,843],{"class":168},[155,1480,1449],{"class":168},[155,1482,1483],{"class":172},"web/index.html",[155,1485,169],{"class":168},[155,1487,509],{"class":164},[155,1489,1490],{"class":157,"line":236},[155,1491,254],{"emptyLinePlaceholder":253},[155,1493,1494,1497,1499,1502],{"class":157,"line":242},[155,1495,1496],{"class":161},"    onInstall",[155,1498,1159],{"class":168},[155,1500,1501],{"class":180}," function",[155,1503,854],{"class":168},[155,1505,1506,1508,1510,1512,1515,1517],{"class":157,"line":250},[155,1507,376],{"class":161},[155,1509,165],{"class":164},[155,1511,169],{"class":168},[155,1513,1514],{"class":172},"[my_dispatch] App installed",[155,1516,169],{"class":168},[155,1518,196],{"class":164},[155,1520,1521,1524],{"class":157,"line":257},[155,1522,1523],{"class":180},"    end",[155,1525,509],{"class":164},[155,1527,1528],{"class":157,"line":284},[155,1529,254],{"emptyLinePlaceholder":253},[155,1531,1532,1535,1537,1539,1541,1543],{"class":157,"line":304},[155,1533,1534],{"class":161},"    onOpen",[155,1536,1159],{"class":168},[155,1538,1501],{"class":180},[155,1540,165],{"class":168},[155,1542,1311],{"class":186},[155,1544,196],{"class":168},[155,1546,1547,1549,1551,1553,1556,1558,1560,1562],{"class":157,"line":309},[155,1548,376],{"class":161},[155,1550,205],{"class":164},[155,1552,169],{"class":168},[155,1554,1555],{"class":172},"[my_dispatch] App opened for incident %s",[155,1557,169],{"class":168},[155,1559,215],{"class":164},[155,1561,218],{"class":161},[155,1563,221],{"class":164},[155,1565,1566,1569,1572,1575,1577,1579],{"class":157,"line":314},[155,1567,1568],{"class":161},"            tostring",[155,1570,1571],{"class":164},"(data ",[155,1573,1574],{"class":168},"and",[155,1576,1083],{"class":164},[155,1578,1317],{"class":505},[155,1580,196],{"class":164},[155,1582,1583],{"class":157,"line":319},[155,1584,406],{"class":164},[155,1586,1587,1589],{"class":157,"line":621},[155,1588,1523],{"class":180},[155,1590,509],{"class":164},[155,1592,1593],{"class":157,"line":626},[155,1594,254],{"emptyLinePlaceholder":253},[155,1596,1597,1600,1602,1604],{"class":157,"line":631},[155,1598,1599],{"class":161},"    onReady",[155,1601,1159],{"class":168},[155,1603,1501],{"class":180},[155,1605,854],{"class":168},[155,1607,1608,1610,1612,1614,1617,1619],{"class":157,"line":1357},[155,1609,376],{"class":161},[155,1611,165],{"class":164},[155,1613,169],{"class":168},[155,1615,1616],{"class":172},"[my_dispatch] Iframe bridge ready",[155,1618,169],{"class":168},[155,1620,196],{"class":164},[155,1622,1623,1625],{"class":157,"line":1362},[155,1624,1523],{"class":180},[155,1626,509],{"class":164},[155,1628,1629],{"class":157,"line":1367},[155,1630,254],{"emptyLinePlaceholder":253},[155,1632,1633,1636,1638,1640],{"class":157,"line":1380},[155,1634,1635],{"class":161},"    onClose",[155,1637,1159],{"class":168},[155,1639,1501],{"class":180},[155,1641,854],{"class":168},[155,1643,1644,1646,1648,1650,1653,1655],{"class":157,"line":1392},[155,1645,376],{"class":161},[155,1647,165],{"class":164},[155,1649,169],{"class":168},[155,1651,1652],{"class":172},"[my_dispatch] App closed",[155,1654,169],{"class":168},[155,1656,196],{"class":164},[155,1658,1659,1661],{"class":157,"line":1397},[155,1660,1523],{"class":180},[155,1662,509],{"class":164},[155,1664,1665],{"class":157,"line":1402},[155,1666,1667],{"class":164},"}\n",[155,1669,1671],{"class":157,"line":1670},24,[155,1672,254],{"emptyLinePlaceholder":253},[155,1674,1676,1679,1681,1684,1686,1689,1692],{"class":157,"line":1675},25,[155,1677,1678],{"class":164},"exports[",[155,1680,169],{"class":168},[155,1682,1683],{"class":172},"sky_phone",[155,1685,169],{"class":168},[155,1687,1688],{"class":164},"]:",[155,1690,1691],{"class":161},"AddCustomApp",[155,1693,1694],{"class":164},"(definition)\n",[30,1696,1698],{"id":1697},"internal-push-and-net-events","Internal push and net events",[14,1700,1701],{},"The following event families are private implementation details. They are listed so developers can\nrecognize them in logs, not as a compatibility promise.",[43,1703,1704,1714],{},[46,1705,1706],{},[49,1707,1708,1711],{},[52,1709,1710],{},"Area",[52,1712,1713],{},"Internal examples",[62,1715,1716,1732,1748,1761,1774,1790,1806,1819,1832,1845],{},[49,1717,1718,1721],{},[67,1719,1720],{},"Device",[67,1722,1723,177,1726,177,1729],{},[38,1724,1725],{},"sky_phone:device:open",[38,1727,1728],{},"sky_phone:device:updated",[38,1730,1731],{},"sky_phone:device:invalidated",[49,1733,1734,1737],{},[67,1735,1736],{},"Calls",[67,1738,1739,177,1742,177,1745],{},[38,1740,1741],{},"sky_phone:call:incoming",[38,1743,1744],{},"sky_phone:call:state",[38,1746,1747],{},"sky_phone:calls:changed",[49,1749,1750,1753],{},[67,1751,1752],{},"Messages",[67,1754,1755,177,1758],{},[38,1756,1757],{},"sky_phone:messages:changed",[38,1759,1760],{},"sky_phone:messages:new",[49,1762,1763,1766],{},[67,1764,1765],{},"Billing",[67,1767,1768,177,1771],{},[38,1769,1770],{},"sky_phone:billing:changed",[38,1772,1773],{},"sky_phone:billing:new",[49,1775,1776,1779],{},[67,1777,1778],{},"Social apps",[67,1780,1781,177,1784,177,1787],{},[38,1782,1783],{},"sky_phone:picstagram:new",[38,1785,1786],{},"sky_phone:feather:new",[38,1788,1789],{},"sky_phone:fliptok:new",[49,1791,1792,1795],{},[67,1793,1794],{},"Gallery and media",[67,1796,1797,177,1800,177,1803],{},[38,1798,1799],{},"sky_phone:gallery:changed",[38,1801,1802],{},"sky_phone:media:upload-ready",[38,1804,1805],{},"sky_phone:media:upload-result",[49,1807,1808,1811],{},[67,1809,1810],{},"Voice Memos",[67,1812,1813,177,1816],{},[38,1814,1815],{},"sky_phone:memos:upload-ready",[38,1817,1818],{},"sky_phone:memos:upload-result",[49,1820,1821,1824],{},[67,1822,1823],{},"Radio",[67,1825,1826,177,1829],{},[38,1827,1828],{},"sky_phone:radio:members",[38,1830,1831],{},"sky_phone:radio:notification",[49,1833,1834,1837],{},[67,1835,1836],{},"Companies",[67,1838,1839,177,1842],{},[38,1840,1841],{},"sky_phone:companies:changed",[38,1843,1844],{},"sky_phone:companies:notification",[49,1846,1847,1850],{},[67,1848,1849],{},"Marketplace",[67,1851,1852,177,1855],{},[38,1853,1854],{},"sky_phone:marketplace:changed",[38,1856,1857],{},"sky_phone:marketplace:new-message",[1859,1860,1863],"callout",{"color":1861,"icon":1862},"neutral","i-lucide-shield-check",[14,1864,1865],{},"Do not trigger internal events from another resource. Their payloads, session checks, and names may\nchange. Use public exports and observer events only.",[30,1867,1869],{"id":1868},"client-local-lifecycle-events","Client-local lifecycle events",[14,1871,1872],{},"These events coordinate Free Phone's own focus, animations, and camera state:",[145,1874,1879],{"className":1875,"code":1877,"language":1878,"meta":151},[1876],"language-text","sky_phone:client:nuiReady\nsky_phone:nuiClosed\nsky_phone:client:forceClose\nsky_phone:client:setSuspended\nsky_phone:client:setCameraFocus\nsky_phone:client:cameraFocusApplied\nsky_phone:client:setPayphoneFocus\nsky_phone:animation:phone\nsky_phone:animation:call\nsky_phone:animation:camera\nsky_phone:animation:reset\n","text",[38,1880,1877],{"__ignoreMap":151},[14,1882,1883],{},"They are not public integration points. A custom app receives lifecycle through its hooks and the\niframe bridge instead.",[1885,1886,1887],"style",{},"html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--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);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":151,"searchDepth":158,"depth":199,"links":1889},[1890,1895,1902,1903,1904],{"id":32,"depth":199,"text":33,"children":1891},[1892,1893,1894],{"id":142,"depth":224,"text":143},{"id":326,"depth":224,"text":327},{"id":445,"depth":224,"text":446},{"id":653,"depth":199,"text":654,"children":1896},[1897,1898,1899,1900,1901],{"id":664,"depth":224,"text":665},{"id":728,"depth":224,"text":729},{"id":825,"depth":224,"text":826},{"id":1015,"depth":224,"text":1016},{"id":1108,"depth":224,"text":1109},{"id":1417,"depth":199,"text":1418},{"id":1697,"depth":199,"text":1698},{"id":1868,"depth":199,"text":1869},"Public Free Phone observer events, custom-app bridge messages, lifecycle hooks, and internal event boundaries with examples.","md",null,{},"/docs/scripts/free-phone/events",{"title":5,"description":1905},{"loc":1909},"1.docs/scripts/4.free-phone/4.events","mKeJsCl4B-ZYQkCWhHkV5SxPqVucecjjI16Qlw7MW_M",[1915,1918],{"title":27,"path":26,"stem":1916,"description":1917,"children":-1},"1.docs/scripts/4.free-phone/3.exports","Client and server exports provided by Free Phone, with arguments, return values, security boundaries, and complete Lua examples.",{"title":1919,"path":1920,"stem":1921,"description":151,"children":-1},"Banking","/docs/scripts/banking/banking","1.docs/scripts/banking/banking",[],1787244846793]