[{"data":1,"prerenderedAt":2141},["ShallowReactive",2],{"\u002Fdocs\u002Fagents\u002Fprotocol":3},{"id":4,"title":5,"body":6,"description":2133,"extension":2134,"meta":2135,"navigation":2136,"path":2137,"seo":2138,"stem":2139,"__hash__":2140},"docs\u002Fdocs\u002Fagents\u002Fprotocol.md","Agent Protocol",{"type":7,"value":8,"toc":2123},"minimark",[9,13,17,22,99,178,203,233,237,244,252,308,315,321,328,332,336,339,387,441,448,452,455,485,546,549,553,563,569,573,587,2094,2113,2119],[10,11,5],"h1",{"id":12},"agent-protocol",[14,15,16],"p",{},"Agents talk to the NetIgnite server over a single WebSocket connection that the agent opens. The\nprotocol is plain text and small enough to implement in a few dozen lines, so you can write an\nagent for any platform: a Raspberry Pi, a NAS or a router.",[18,19,21],"h2",{"id":20},"connecting","Connecting",[23,24,25,38],"table",{},[26,27,28],"thead",{},[29,30,31,35],"tr",{},[32,33,34],"th",{},"Setting",[32,36,37],{},"Value",[39,40,41,61,79,89],"tbody",{},[29,42,43,50],{},[44,45,46],"td",{},[47,48,49],"strong",{},"URL",[44,51,52,56,57,60],{},[53,54,55],"code",{},"wss:\u002F\u002F\u003Cserver>\u002Fapi\u002Fagent-control-service"," (or ",[53,58,59],{},"ws:\u002F\u002F"," without TLS)",[29,62,63,68],{},[44,64,65],{},[47,66,67],{},"Port",[44,69,70,71,74,75,78],{},"The server's HTTP port: ",[53,72,73],{},"443"," behind a proxy, ",[53,76,77],{},"18232"," for the Docker container",[29,80,81,86],{},[44,82,83],{},[47,84,85],{},"Authentication",[44,87,88],{},"HTTP Basic, sent with the WebSocket upgrade request",[29,90,91,96],{},[44,92,93],{},[47,94,95],{},"Subprotocol",[44,97,98],{},"None",[100,101,106],"pre",{"className":102,"code":103,"language":104,"meta":105,"style":105},"language-http shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","GET \u002Fapi\u002Fagent-control-service HTTP\u002F1.1\nHost: netignite.example.com\nUpgrade: websocket\nConnection: Upgrade\nAuthorization: Basic MzpzM2NyM3Q=\n","http","",[53,107,108,131,145,156,167],{"__ignoreMap":105},[109,110,113,117,121,125,128],"span",{"class":111,"line":112},"line",1,[109,114,116],{"class":115},"s7zQu","GET",[109,118,120],{"class":119},"sTEyZ"," \u002Fapi\u002Fagent-control-service ",[109,122,124],{"class":123},"sbssI","HTTP",[109,126,127],{"class":119},"\u002F",[109,129,130],{"class":123},"1.1\n",[109,132,134,138,141],{"class":111,"line":133},2,[109,135,137],{"class":136},"swJcz","Host",[109,139,140],{"class":123},":",[109,142,144],{"class":143},"sfazB"," netignite.example.com\n",[109,146,148,151,153],{"class":111,"line":147},3,[109,149,150],{"class":136},"Upgrade",[109,152,140],{"class":123},[109,154,155],{"class":143}," websocket\n",[109,157,159,162,164],{"class":111,"line":158},4,[109,160,161],{"class":136},"Connection",[109,163,140],{"class":123},[109,165,166],{"class":143}," Upgrade\n",[109,168,170,173,175],{"class":111,"line":169},5,[109,171,172],{"class":136},"Authorization",[109,174,140],{"class":123},[109,176,177],{"class":143}," Basic MzpzM2NyM3Q=\n",[14,179,180,181,184,185,188,189,192,193,196,197,202],{},"The credentials are ",[53,182,183],{},"base64(\"\u003Cagent ID>:\u003Csecret>\")","; the example above encodes ",[53,186,187],{},"3:s3cr3t",". The ID\nis the agent's numeric ",[47,190,191],{},"Connection ID"," and the secret its ",[47,194,195],{},"Connection Secret"," (see\n",[198,199,201],"a",{"href":200},"\u002Fdocs\u002Fguides\u002Fagents","Managing Agents",").",[204,205,206,221,224,227],"ul",{},[207,208,209,210,212,213,216,217,220],"li",{},"The server accepts the upgrade first and checks the credentials afterwards. With a missing or\nwrong ",[53,211,172],{}," header, it closes the connection right away with code ",[53,214,215],{},"1008"," and reason\n",[53,218,219],{},"Missing or invalid credentials",".",[207,222,223],{},"Each agent can have one connection. When an agent connects again, the server closes the older\nconnection.",[207,225,226],{},"If the agent's secret is regenerated or the agent is deleted, the server closes the connection.",[207,228,229,230,232],{},"Browsers can't set the ",[53,231,172],{}," header on WebSockets, so agents can't run in a browser.",[18,234,236],{"id":235},"message-format","Message format",[14,238,239,240,243],{},"Every message is a UTF-8 ",[47,241,242],{},"text frame"," with three parts separated by colons:",[100,245,250],{"className":246,"code":248,"language":249,"meta":105},[247],"language-text","\u003CCOMMAND>:\u003CID>:\u003CJSON>\n","text",[53,251,248],{"__ignoreMap":105},[23,253,254,264],{},[26,255,256],{},[29,257,258,261],{},[32,259,260],{},"Part",[32,262,263],{},"Description",[39,265,266,280,298],{},[29,267,268,273],{},[44,269,270],{},[53,271,272],{},"COMMAND",[44,274,275,276,279],{},"The command name, for example ",[53,277,278],{},"WAKEUP",". Case-sensitive.",[29,281,282,287],{},[44,283,284],{},[53,285,286],{},"ID",[44,288,289,290,293,294,297],{},"A decimal number from ",[53,291,292],{},"0"," to ",[53,295,296],{},"4294967295"," that identifies the request.",[29,299,300,305],{},[44,301,302],{},[53,303,304],{},"JSON",[44,306,307],{},"A JSON object with the command's payload. May itself contain colons; split only at the first two.",[14,309,310,311,314],{},"The server sends commands; the agent answers each one with the ",[47,312,313],{},"same command name and ID"," and a\nresponse object:",[100,316,319],{"className":317,"code":318,"language":249,"meta":105},[247],"→ WAKEUP:2876151413:{\"macAddress\":\"AA:BB:CC:DD:EE:FF\",\"port\":9}\n← WAKEUP:2876151413:{\"status\":\"OK\",\"message\":\"Wakeup successful\"}\n",[53,320,318],{"__ignoreMap":105},[14,322,323,324,327],{},"The server waits ",[47,325,326],{},"5 seconds"," for each response; after that it treats the command as failed.\nSeveral commands can be pending at once, and responses may arrive in any order. They're matched by\nID.",[18,329,331],{"id":330},"commands","Commands",[333,334,278],"h3",{"id":335},"wakeup",[14,337,338],{},"Send a Wake-on-LAN magic packet.",[23,340,341,353],{},[26,342,343],{},[29,344,345,348,351],{},[32,346,347],{},"Request field",[32,349,350],{},"Type",[32,352,263],{},[39,354,355,371],{},[29,356,357,362,365],{},[44,358,359],{},[53,360,361],{},"macAddress",[44,363,364],{},"string",[44,366,367,368,202],{},"Target MAC address, as stored in the device record (for example ",[53,369,370],{},"AA:BB:CC:DD:EE:FF",[29,372,373,378,381],{},[44,374,375],{},[53,376,377],{},"port",[44,379,380],{},"number",[44,382,383,384,220],{},"UDP port for the magic packet, usually ",[53,385,386],{},"9",[23,388,389,400],{},[26,390,391],{},[29,392,393,396,398],{},[32,394,395],{},"Response field",[32,397,350],{},[32,399,263],{},[39,401,402,421],{},[29,403,404,409,418],{},[44,405,406],{},[53,407,408],{},"status",[44,410,411,414,415],{},[53,412,413],{},"\"OK\""," | ",[53,416,417],{},"\"ERROR\"",[44,419,420],{},"Whether the packet was sent.",[29,422,423,428,430],{},[44,424,425],{},[53,426,427],{},"message",[44,429,364],{},[44,431,432,433,436,437,220],{},"Human-readable result. On ",[53,434,435],{},"ERROR",", the dashboard shows it after ",[438,439,440],"em",{},"Wakeup command failed:",[14,442,443,444,447],{},"A magic packet is 6 bytes of ",[53,445,446],{},"0xFF"," followed by the 6-byte MAC address repeated 16 times, sent as\na UDP broadcast to the local subnet.",[333,449,451],{"id":450},"get_status","GET_STATUS",[14,453,454],{},"Report whether a device is reachable.",[23,456,457,467],{},[26,458,459],{},[29,460,461,463,465],{},[32,462,347],{},[32,464,350],{},[32,466,263],{},[39,468,469],{},[29,470,471,476,478],{},[44,472,473],{},[53,474,475],{},"address",[44,477,364],{},[44,479,480,481,484],{},"The device's address. The current server always sends the device's ",[47,482,483],{},"MAC address"," here.",[23,486,487,497],{},[26,488,489],{},[29,490,491,493,495],{},[32,492,395],{},[32,494,350],{},[32,496,263],{},[39,498,499,514,525],{},[29,500,501,505,511],{},[44,502,503],{},[53,504,408],{},[44,506,507,414,509],{},[53,508,413],{},[53,510,417],{},[44,512,513],{},"Whether the check could run.",[29,515,516,520,522],{},[44,517,518],{},[53,519,427],{},[44,521,364],{},[44,523,524],{},"Human-readable result.",[29,526,527,532,543],{},[44,528,529],{},[53,530,531],{},"online",[44,533,534,414,537,414,540],{},[53,535,536],{},"\"online\"",[53,538,539],{},"\"offline\"",[53,541,542],{},"\"unknown\"",[44,544,545],{},"The device status shown in the dashboard.",[14,547,548],{},"How you resolve a MAC address to something you can ping is up to the agent. The ESP32 agent pings\nthe device's EUI-64 IPv6 link-local address; an agent on a full computer could look the MAC up in\nits ARP\u002Fneighbor table instead.",[333,550,552],{"id":551},"heartbeat","HEARTBEAT",[14,554,555,556,559,560,562],{},"Sent by the server to every connected agent once a minute, with an empty payload ",[53,557,558],{},"{}",". The server\ndoesn't wait for the answer; replying with ",[53,561,558],{}," is fine.",[100,564,567],{"className":565,"code":566,"language":249,"meta":105},[247],"→ HEARTBEAT:1739004211:{}\n← HEARTBEAT:1739004211:{}\n",[53,568,566],{"__ignoreMap":105},[18,570,572],{"id":571},"example-agent","Example agent",[14,574,575,576,582,583,586],{},"A minimal agent for ",[198,577,581],{"href":578,"rel":579},"https:\u002F\u002Fbun.sh",[580],"nofollow","Bun"," that handles all three commands. Create an agent of type\n",[47,584,585],{},"Server"," in the dashboard and fill in its credentials and your subnet's broadcast address:",[100,588,593],{"className":589,"code":590,"filename":591,"language":592,"meta":105,"style":105},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { createSocket } from \"node:dgram\";\n\nconst SERVER_URL = \"wss:\u002F\u002Fnetignite.example.com\u002Fapi\u002Fagent-control-service\";\nconst AGENT_ID = \"3\";\nconst AGENT_SECRET = \"your-connection-secret\";\nconst BROADCAST_ADDRESS = \"192.168.1.255\";\n\ntype Payload = Record\u003Cstring, unknown>;\n\nfunction sendMagicPacket(macAddress: string, port: number) {\n    const mac = macAddress.split(\u002F[:-]\u002F).map((part) => Number.parseInt(part, 16));\n    if (mac.length !== 6 || mac.some(Number.isNaN)) throw new Error(\"Invalid MAC address\");\n\n    \u002F\u002F 6 × 0xFF, then the MAC address 16 times.\n    const packet = Buffer.alloc(102, 0xff);\n    for (let i = 0; i \u003C 16; i++) Buffer.from(mac).copy(packet, 6 + i * 6);\n\n    const socket = createSocket(\"udp4\");\n    socket.bind(() => {\n        socket.setBroadcast(true);\n        socket.send(packet, port, BROADCAST_ADDRESS, () => socket.close());\n    });\n}\n\nfunction handleCommand(command: string, payload: Payload): Payload {\n    switch (command) {\n        case \"WAKEUP\":\n            sendMagicPacket(String(payload.macAddress), Number(payload.port));\n            return { status: \"OK\", message: \"Wakeup successful\" };\n        case \"GET_STATUS\":\n            \u002F\u002F Look up and ping the device here, then report \"online\" or \"offline\".\n            return { status: \"OK\", message: \"Status check not implemented\", online: \"unknown\" };\n        case \"HEARTBEAT\":\n            return {};\n        default:\n            return { status: \"ERROR\", message: \"Unknown command\" };\n    }\n}\n\nfunction connect() {\n    const ws = new WebSocket(SERVER_URL, {\n        headers: { Authorization: `Basic ${btoa(`${AGENT_ID}:${AGENT_SECRET}`)}` },\n    });\n\n    ws.onopen = () => console.log(\"Connected\");\n\n    ws.onmessage = (event) => {\n        const message = String(event.data);\n        const first = message.indexOf(\":\");\n        const second = message.indexOf(\":\", first + 1);\n        const command = message.slice(0, first);\n        const id = message.slice(first + 1, second);\n\n        let response: Payload;\n        try {\n            response = handleCommand(command, JSON.parse(message.slice(second + 1)));\n        } catch (error) {\n            response = { status: \"ERROR\", message: String(error) };\n        }\n        ws.send(`${command}:${id}:${JSON.stringify(response)}`);\n    };\n\n    ws.onclose = (event) => {\n        console.log(`Disconnected (${event.code} ${event.reason}), reconnecting in 10 seconds`);\n        setTimeout(connect, 10_000);\n    };\n}\n\nconnect();\n","agent.ts","ts",[53,594,595,625,631,652,670,688,707,712,742,747,784,855,923,928,935,967,1048,1053,1078,1098,1119,1161,1171,1177,1182,1215,1230,1245,1283,1320,1333,1339,1385,1398,1406,1414,1446,1452,1457,1462,1474,1498,1553,1562,1567,1605,1610,1633,1659,1688,1725,1754,1787,1792,1807,1815,1861,1879,1915,1921,1968,1974,1979,2001,2050,2070,2075,2080,2085],{"__ignoreMap":105},[109,596,597,600,604,607,610,613,616,619,622],{"class":111,"line":112},[109,598,599],{"class":115},"import",[109,601,603],{"class":602},"sMK4o"," {",[109,605,606],{"class":119}," createSocket",[109,608,609],{"class":602}," }",[109,611,612],{"class":115}," from",[109,614,615],{"class":602}," \"",[109,617,618],{"class":143},"node:dgram",[109,620,621],{"class":602},"\"",[109,623,624],{"class":602},";\n",[109,626,627],{"class":111,"line":133},[109,628,630],{"emptyLinePlaceholder":629},true,"\n",[109,632,633,637,640,643,645,648,650],{"class":111,"line":147},[109,634,636],{"class":635},"spNyl","const",[109,638,639],{"class":119}," SERVER_URL ",[109,641,642],{"class":602},"=",[109,644,615],{"class":602},[109,646,647],{"class":143},"wss:\u002F\u002Fnetignite.example.com\u002Fapi\u002Fagent-control-service",[109,649,621],{"class":602},[109,651,624],{"class":602},[109,653,654,656,659,661,663,666,668],{"class":111,"line":158},[109,655,636],{"class":635},[109,657,658],{"class":119}," AGENT_ID ",[109,660,642],{"class":602},[109,662,615],{"class":602},[109,664,665],{"class":143},"3",[109,667,621],{"class":602},[109,669,624],{"class":602},[109,671,672,674,677,679,681,684,686],{"class":111,"line":169},[109,673,636],{"class":635},[109,675,676],{"class":119}," AGENT_SECRET ",[109,678,642],{"class":602},[109,680,615],{"class":602},[109,682,683],{"class":143},"your-connection-secret",[109,685,621],{"class":602},[109,687,624],{"class":602},[109,689,691,693,696,698,700,703,705],{"class":111,"line":690},6,[109,692,636],{"class":635},[109,694,695],{"class":119}," BROADCAST_ADDRESS ",[109,697,642],{"class":602},[109,699,615],{"class":602},[109,701,702],{"class":143},"192.168.1.255",[109,704,621],{"class":602},[109,706,624],{"class":602},[109,708,710],{"class":111,"line":709},7,[109,711,630],{"emptyLinePlaceholder":629},[109,713,715,718,722,725,728,731,733,736,739],{"class":111,"line":714},8,[109,716,717],{"class":635},"type",[109,719,721],{"class":720},"sBMFI"," Payload",[109,723,724],{"class":602}," =",[109,726,727],{"class":720}," Record",[109,729,730],{"class":602},"\u003C",[109,732,364],{"class":720},[109,734,735],{"class":602},",",[109,737,738],{"class":720}," unknown",[109,740,741],{"class":602},">;\n",[109,743,745],{"class":111,"line":744},9,[109,746,630],{"emptyLinePlaceholder":629},[109,748,750,753,757,760,763,765,768,770,773,775,778,781],{"class":111,"line":749},10,[109,751,752],{"class":635},"function",[109,754,756],{"class":755},"s2Zo4"," sendMagicPacket",[109,758,759],{"class":602},"(",[109,761,361],{"class":762},"sHdIc",[109,764,140],{"class":602},[109,766,767],{"class":720}," string",[109,769,735],{"class":602},[109,771,772],{"class":762}," port",[109,774,140],{"class":602},[109,776,777],{"class":720}," number",[109,779,780],{"class":602},")",[109,782,783],{"class":602}," {\n",[109,785,787,790,793,795,798,800,803,805,808,811,814,816,818,821,823,825,828,830,833,836,838,841,843,845,847,850,853],{"class":111,"line":786},11,[109,788,789],{"class":635},"    const",[109,791,792],{"class":119}," mac",[109,794,724],{"class":602},[109,796,797],{"class":119}," macAddress",[109,799,220],{"class":602},[109,801,802],{"class":755},"split",[109,804,759],{"class":136},[109,806,807],{"class":602},"\u002F[",[109,809,810],{"class":143},":-",[109,812,813],{"class":602},"]\u002F",[109,815,780],{"class":136},[109,817,220],{"class":602},[109,819,820],{"class":755},"map",[109,822,759],{"class":136},[109,824,759],{"class":602},[109,826,827],{"class":762},"part",[109,829,780],{"class":602},[109,831,832],{"class":635}," =>",[109,834,835],{"class":119}," Number",[109,837,220],{"class":602},[109,839,840],{"class":755},"parseInt",[109,842,759],{"class":136},[109,844,827],{"class":119},[109,846,735],{"class":602},[109,848,849],{"class":123}," 16",[109,851,852],{"class":136},"))",[109,854,624],{"class":602},[109,856,858,861,864,867,869,872,875,878,881,883,885,888,890,893,895,898,901,904,907,910,912,914,917,919,921],{"class":111,"line":857},12,[109,859,860],{"class":115},"    if",[109,862,863],{"class":136}," (",[109,865,866],{"class":119},"mac",[109,868,220],{"class":602},[109,870,871],{"class":119},"length",[109,873,874],{"class":602}," !==",[109,876,877],{"class":123}," 6",[109,879,880],{"class":602}," ||",[109,882,792],{"class":119},[109,884,220],{"class":602},[109,886,887],{"class":755},"some",[109,889,759],{"class":136},[109,891,892],{"class":119},"Number",[109,894,220],{"class":602},[109,896,897],{"class":119},"isNaN",[109,899,900],{"class":136},")) ",[109,902,903],{"class":115},"throw",[109,905,906],{"class":602}," new",[109,908,909],{"class":755}," Error",[109,911,759],{"class":136},[109,913,621],{"class":602},[109,915,916],{"class":143},"Invalid MAC address",[109,918,621],{"class":602},[109,920,780],{"class":136},[109,922,624],{"class":602},[109,924,926],{"class":111,"line":925},13,[109,927,630],{"emptyLinePlaceholder":629},[109,929,931],{"class":111,"line":930},14,[109,932,934],{"class":933},"sHwdD","    \u002F\u002F 6 × 0xFF, then the MAC address 16 times.\n",[109,936,938,940,943,945,948,950,953,955,958,960,963,965],{"class":111,"line":937},15,[109,939,789],{"class":635},[109,941,942],{"class":119}," packet",[109,944,724],{"class":602},[109,946,947],{"class":119}," Buffer",[109,949,220],{"class":602},[109,951,952],{"class":755},"alloc",[109,954,759],{"class":136},[109,956,957],{"class":123},"102",[109,959,735],{"class":602},[109,961,962],{"class":123}," 0xff",[109,964,780],{"class":136},[109,966,624],{"class":602},[109,968,970,973,975,978,981,983,986,989,991,994,996,998,1000,1003,1006,1009,1011,1014,1016,1018,1020,1022,1025,1027,1030,1032,1034,1037,1039,1042,1044,1046],{"class":111,"line":969},16,[109,971,972],{"class":115},"    for",[109,974,863],{"class":136},[109,976,977],{"class":635},"let",[109,979,980],{"class":119}," i",[109,982,724],{"class":602},[109,984,985],{"class":123}," 0",[109,987,988],{"class":602},";",[109,990,980],{"class":119},[109,992,993],{"class":602}," \u003C",[109,995,849],{"class":123},[109,997,988],{"class":602},[109,999,980],{"class":119},[109,1001,1002],{"class":602},"++",[109,1004,1005],{"class":136},") ",[109,1007,1008],{"class":119},"Buffer",[109,1010,220],{"class":602},[109,1012,1013],{"class":755},"from",[109,1015,759],{"class":136},[109,1017,866],{"class":119},[109,1019,780],{"class":136},[109,1021,220],{"class":602},[109,1023,1024],{"class":755},"copy",[109,1026,759],{"class":136},[109,1028,1029],{"class":119},"packet",[109,1031,735],{"class":602},[109,1033,877],{"class":123},[109,1035,1036],{"class":602}," +",[109,1038,980],{"class":119},[109,1040,1041],{"class":602}," *",[109,1043,877],{"class":123},[109,1045,780],{"class":136},[109,1047,624],{"class":602},[109,1049,1051],{"class":111,"line":1050},17,[109,1052,630],{"emptyLinePlaceholder":629},[109,1054,1056,1058,1061,1063,1065,1067,1069,1072,1074,1076],{"class":111,"line":1055},18,[109,1057,789],{"class":635},[109,1059,1060],{"class":119}," socket",[109,1062,724],{"class":602},[109,1064,606],{"class":755},[109,1066,759],{"class":136},[109,1068,621],{"class":602},[109,1070,1071],{"class":143},"udp4",[109,1073,621],{"class":602},[109,1075,780],{"class":136},[109,1077,624],{"class":602},[109,1079,1081,1084,1086,1089,1091,1094,1096],{"class":111,"line":1080},19,[109,1082,1083],{"class":119},"    socket",[109,1085,220],{"class":602},[109,1087,1088],{"class":755},"bind",[109,1090,759],{"class":136},[109,1092,1093],{"class":602},"()",[109,1095,832],{"class":635},[109,1097,783],{"class":602},[109,1099,1101,1104,1106,1109,1111,1115,1117],{"class":111,"line":1100},20,[109,1102,1103],{"class":119},"        socket",[109,1105,220],{"class":602},[109,1107,1108],{"class":755},"setBroadcast",[109,1110,759],{"class":136},[109,1112,1114],{"class":1113},"sfNiH","true",[109,1116,780],{"class":136},[109,1118,624],{"class":602},[109,1120,1122,1124,1126,1129,1131,1133,1135,1137,1139,1142,1144,1147,1149,1151,1153,1156,1159],{"class":111,"line":1121},21,[109,1123,1103],{"class":119},[109,1125,220],{"class":602},[109,1127,1128],{"class":755},"send",[109,1130,759],{"class":136},[109,1132,1029],{"class":119},[109,1134,735],{"class":602},[109,1136,772],{"class":119},[109,1138,735],{"class":602},[109,1140,1141],{"class":119}," BROADCAST_ADDRESS",[109,1143,735],{"class":602},[109,1145,1146],{"class":602}," ()",[109,1148,832],{"class":635},[109,1150,1060],{"class":119},[109,1152,220],{"class":602},[109,1154,1155],{"class":755},"close",[109,1157,1158],{"class":136},"())",[109,1160,624],{"class":602},[109,1162,1164,1167,1169],{"class":111,"line":1163},22,[109,1165,1166],{"class":602},"    }",[109,1168,780],{"class":136},[109,1170,624],{"class":602},[109,1172,1174],{"class":111,"line":1173},23,[109,1175,1176],{"class":602},"}\n",[109,1178,1180],{"class":111,"line":1179},24,[109,1181,630],{"emptyLinePlaceholder":629},[109,1183,1185,1187,1190,1192,1195,1197,1199,1201,1204,1206,1208,1211,1213],{"class":111,"line":1184},25,[109,1186,752],{"class":635},[109,1188,1189],{"class":755}," handleCommand",[109,1191,759],{"class":602},[109,1193,1194],{"class":762},"command",[109,1196,140],{"class":602},[109,1198,767],{"class":720},[109,1200,735],{"class":602},[109,1202,1203],{"class":762}," payload",[109,1205,140],{"class":602},[109,1207,721],{"class":720},[109,1209,1210],{"class":602},"):",[109,1212,721],{"class":720},[109,1214,783],{"class":602},[109,1216,1218,1221,1223,1225,1227],{"class":111,"line":1217},26,[109,1219,1220],{"class":115},"    switch",[109,1222,863],{"class":136},[109,1224,1194],{"class":119},[109,1226,1005],{"class":136},[109,1228,1229],{"class":602},"{\n",[109,1231,1233,1236,1238,1240,1242],{"class":111,"line":1232},27,[109,1234,1235],{"class":115},"        case",[109,1237,615],{"class":602},[109,1239,278],{"class":143},[109,1241,621],{"class":602},[109,1243,1244],{"class":602},":\n",[109,1246,1248,1251,1253,1256,1258,1261,1263,1265,1267,1269,1271,1273,1275,1277,1279,1281],{"class":111,"line":1247},28,[109,1249,1250],{"class":755},"            sendMagicPacket",[109,1252,759],{"class":136},[109,1254,1255],{"class":755},"String",[109,1257,759],{"class":136},[109,1259,1260],{"class":119},"payload",[109,1262,220],{"class":602},[109,1264,361],{"class":119},[109,1266,780],{"class":136},[109,1268,735],{"class":602},[109,1270,835],{"class":755},[109,1272,759],{"class":136},[109,1274,1260],{"class":119},[109,1276,220],{"class":602},[109,1278,377],{"class":119},[109,1280,852],{"class":136},[109,1282,624],{"class":602},[109,1284,1286,1289,1291,1294,1296,1298,1301,1303,1305,1308,1310,1312,1315,1317],{"class":111,"line":1285},29,[109,1287,1288],{"class":115},"            return",[109,1290,603],{"class":602},[109,1292,1293],{"class":136}," status",[109,1295,140],{"class":602},[109,1297,615],{"class":602},[109,1299,1300],{"class":143},"OK",[109,1302,621],{"class":602},[109,1304,735],{"class":602},[109,1306,1307],{"class":136}," message",[109,1309,140],{"class":602},[109,1311,615],{"class":602},[109,1313,1314],{"class":143},"Wakeup successful",[109,1316,621],{"class":602},[109,1318,1319],{"class":602}," };\n",[109,1321,1323,1325,1327,1329,1331],{"class":111,"line":1322},30,[109,1324,1235],{"class":115},[109,1326,615],{"class":602},[109,1328,451],{"class":143},[109,1330,621],{"class":602},[109,1332,1244],{"class":602},[109,1334,1336],{"class":111,"line":1335},31,[109,1337,1338],{"class":933},"            \u002F\u002F Look up and ping the device here, then report \"online\" or \"offline\".\n",[109,1340,1342,1344,1346,1348,1350,1352,1354,1356,1358,1360,1362,1364,1367,1369,1371,1374,1376,1378,1381,1383],{"class":111,"line":1341},32,[109,1343,1288],{"class":115},[109,1345,603],{"class":602},[109,1347,1293],{"class":136},[109,1349,140],{"class":602},[109,1351,615],{"class":602},[109,1353,1300],{"class":143},[109,1355,621],{"class":602},[109,1357,735],{"class":602},[109,1359,1307],{"class":136},[109,1361,140],{"class":602},[109,1363,615],{"class":602},[109,1365,1366],{"class":143},"Status check not implemented",[109,1368,621],{"class":602},[109,1370,735],{"class":602},[109,1372,1373],{"class":136}," online",[109,1375,140],{"class":602},[109,1377,615],{"class":602},[109,1379,1380],{"class":143},"unknown",[109,1382,621],{"class":602},[109,1384,1319],{"class":602},[109,1386,1388,1390,1392,1394,1396],{"class":111,"line":1387},33,[109,1389,1235],{"class":115},[109,1391,615],{"class":602},[109,1393,552],{"class":143},[109,1395,621],{"class":602},[109,1397,1244],{"class":602},[109,1399,1401,1403],{"class":111,"line":1400},34,[109,1402,1288],{"class":115},[109,1404,1405],{"class":602}," {};\n",[109,1407,1409,1412],{"class":111,"line":1408},35,[109,1410,1411],{"class":115},"        default",[109,1413,1244],{"class":602},[109,1415,1417,1419,1421,1423,1425,1427,1429,1431,1433,1435,1437,1439,1442,1444],{"class":111,"line":1416},36,[109,1418,1288],{"class":115},[109,1420,603],{"class":602},[109,1422,1293],{"class":136},[109,1424,140],{"class":602},[109,1426,615],{"class":602},[109,1428,435],{"class":143},[109,1430,621],{"class":602},[109,1432,735],{"class":602},[109,1434,1307],{"class":136},[109,1436,140],{"class":602},[109,1438,615],{"class":602},[109,1440,1441],{"class":143},"Unknown command",[109,1443,621],{"class":602},[109,1445,1319],{"class":602},[109,1447,1449],{"class":111,"line":1448},37,[109,1450,1451],{"class":602},"    }\n",[109,1453,1455],{"class":111,"line":1454},38,[109,1456,1176],{"class":602},[109,1458,1460],{"class":111,"line":1459},39,[109,1461,630],{"emptyLinePlaceholder":629},[109,1463,1465,1467,1470,1472],{"class":111,"line":1464},40,[109,1466,752],{"class":635},[109,1468,1469],{"class":755}," connect",[109,1471,1093],{"class":602},[109,1473,783],{"class":602},[109,1475,1477,1479,1482,1484,1486,1489,1491,1494,1496],{"class":111,"line":1476},41,[109,1478,789],{"class":635},[109,1480,1481],{"class":119}," ws",[109,1483,724],{"class":602},[109,1485,906],{"class":602},[109,1487,1488],{"class":755}," WebSocket",[109,1490,759],{"class":136},[109,1492,1493],{"class":119},"SERVER_URL",[109,1495,735],{"class":602},[109,1497,783],{"class":602},[109,1499,1501,1504,1506,1508,1511,1513,1516,1519,1522,1525,1527,1530,1533,1536,1538,1540,1543,1546,1548,1550],{"class":111,"line":1500},42,[109,1502,1503],{"class":136},"        headers",[109,1505,140],{"class":602},[109,1507,603],{"class":602},[109,1509,1510],{"class":136}," Authorization",[109,1512,140],{"class":602},[109,1514,1515],{"class":602}," `",[109,1517,1518],{"class":143},"Basic ",[109,1520,1521],{"class":602},"${",[109,1523,1524],{"class":755},"btoa",[109,1526,759],{"class":119},[109,1528,1529],{"class":602},"`${",[109,1531,1532],{"class":119},"AGENT_ID",[109,1534,1535],{"class":602},"}",[109,1537,140],{"class":143},[109,1539,1521],{"class":602},[109,1541,1542],{"class":119},"AGENT_SECRET",[109,1544,1545],{"class":602},"}`",[109,1547,780],{"class":119},[109,1549,1545],{"class":602},[109,1551,1552],{"class":602}," },\n",[109,1554,1556,1558,1560],{"class":111,"line":1555},43,[109,1557,1166],{"class":602},[109,1559,780],{"class":136},[109,1561,624],{"class":602},[109,1563,1565],{"class":111,"line":1564},44,[109,1566,630],{"emptyLinePlaceholder":629},[109,1568,1570,1573,1575,1578,1580,1582,1584,1587,1589,1592,1594,1596,1599,1601,1603],{"class":111,"line":1569},45,[109,1571,1572],{"class":119},"    ws",[109,1574,220],{"class":602},[109,1576,1577],{"class":755},"onopen",[109,1579,724],{"class":602},[109,1581,1146],{"class":602},[109,1583,832],{"class":635},[109,1585,1586],{"class":119}," console",[109,1588,220],{"class":602},[109,1590,1591],{"class":755},"log",[109,1593,759],{"class":136},[109,1595,621],{"class":602},[109,1597,1598],{"class":143},"Connected",[109,1600,621],{"class":602},[109,1602,780],{"class":136},[109,1604,624],{"class":602},[109,1606,1608],{"class":111,"line":1607},46,[109,1609,630],{"emptyLinePlaceholder":629},[109,1611,1613,1615,1617,1620,1622,1624,1627,1629,1631],{"class":111,"line":1612},47,[109,1614,1572],{"class":119},[109,1616,220],{"class":602},[109,1618,1619],{"class":755},"onmessage",[109,1621,724],{"class":602},[109,1623,863],{"class":602},[109,1625,1626],{"class":762},"event",[109,1628,780],{"class":602},[109,1630,832],{"class":635},[109,1632,783],{"class":602},[109,1634,1636,1639,1641,1643,1646,1648,1650,1652,1655,1657],{"class":111,"line":1635},48,[109,1637,1638],{"class":635},"        const",[109,1640,1307],{"class":119},[109,1642,724],{"class":602},[109,1644,1645],{"class":755}," String",[109,1647,759],{"class":136},[109,1649,1626],{"class":119},[109,1651,220],{"class":602},[109,1653,1654],{"class":119},"data",[109,1656,780],{"class":136},[109,1658,624],{"class":602},[109,1660,1662,1664,1667,1669,1671,1673,1676,1678,1680,1682,1684,1686],{"class":111,"line":1661},49,[109,1663,1638],{"class":635},[109,1665,1666],{"class":119}," first",[109,1668,724],{"class":602},[109,1670,1307],{"class":119},[109,1672,220],{"class":602},[109,1674,1675],{"class":755},"indexOf",[109,1677,759],{"class":136},[109,1679,621],{"class":602},[109,1681,140],{"class":143},[109,1683,621],{"class":602},[109,1685,780],{"class":136},[109,1687,624],{"class":602},[109,1689,1691,1693,1696,1698,1700,1702,1704,1706,1708,1710,1712,1714,1716,1718,1721,1723],{"class":111,"line":1690},50,[109,1692,1638],{"class":635},[109,1694,1695],{"class":119}," second",[109,1697,724],{"class":602},[109,1699,1307],{"class":119},[109,1701,220],{"class":602},[109,1703,1675],{"class":755},[109,1705,759],{"class":136},[109,1707,621],{"class":602},[109,1709,140],{"class":143},[109,1711,621],{"class":602},[109,1713,735],{"class":602},[109,1715,1666],{"class":119},[109,1717,1036],{"class":602},[109,1719,1720],{"class":123}," 1",[109,1722,780],{"class":136},[109,1724,624],{"class":602},[109,1726,1728,1730,1733,1735,1737,1739,1742,1744,1746,1748,1750,1752],{"class":111,"line":1727},51,[109,1729,1638],{"class":635},[109,1731,1732],{"class":119}," command",[109,1734,724],{"class":602},[109,1736,1307],{"class":119},[109,1738,220],{"class":602},[109,1740,1741],{"class":755},"slice",[109,1743,759],{"class":136},[109,1745,292],{"class":123},[109,1747,735],{"class":602},[109,1749,1666],{"class":119},[109,1751,780],{"class":136},[109,1753,624],{"class":602},[109,1755,1757,1759,1762,1764,1766,1768,1770,1772,1775,1777,1779,1781,1783,1785],{"class":111,"line":1756},52,[109,1758,1638],{"class":635},[109,1760,1761],{"class":119}," id",[109,1763,724],{"class":602},[109,1765,1307],{"class":119},[109,1767,220],{"class":602},[109,1769,1741],{"class":755},[109,1771,759],{"class":136},[109,1773,1774],{"class":119},"first",[109,1776,1036],{"class":602},[109,1778,1720],{"class":123},[109,1780,735],{"class":602},[109,1782,1695],{"class":119},[109,1784,780],{"class":136},[109,1786,624],{"class":602},[109,1788,1790],{"class":111,"line":1789},53,[109,1791,630],{"emptyLinePlaceholder":629},[109,1793,1795,1798,1801,1803,1805],{"class":111,"line":1794},54,[109,1796,1797],{"class":635},"        let",[109,1799,1800],{"class":119}," response",[109,1802,140],{"class":602},[109,1804,721],{"class":720},[109,1806,624],{"class":602},[109,1808,1810,1813],{"class":111,"line":1809},55,[109,1811,1812],{"class":115},"        try",[109,1814,783],{"class":602},[109,1816,1818,1821,1823,1825,1827,1829,1831,1834,1836,1839,1841,1843,1845,1847,1849,1852,1854,1856,1859],{"class":111,"line":1817},56,[109,1819,1820],{"class":119},"            response",[109,1822,724],{"class":602},[109,1824,1189],{"class":755},[109,1826,759],{"class":136},[109,1828,1194],{"class":119},[109,1830,735],{"class":602},[109,1832,1833],{"class":119}," JSON",[109,1835,220],{"class":602},[109,1837,1838],{"class":755},"parse",[109,1840,759],{"class":136},[109,1842,427],{"class":119},[109,1844,220],{"class":602},[109,1846,1741],{"class":755},[109,1848,759],{"class":136},[109,1850,1851],{"class":119},"second",[109,1853,1036],{"class":602},[109,1855,1720],{"class":123},[109,1857,1858],{"class":136},")))",[109,1860,624],{"class":602},[109,1862,1864,1867,1870,1872,1875,1877],{"class":111,"line":1863},57,[109,1865,1866],{"class":602},"        }",[109,1868,1869],{"class":115}," catch",[109,1871,863],{"class":136},[109,1873,1874],{"class":119},"error",[109,1876,1005],{"class":136},[109,1878,1229],{"class":602},[109,1880,1882,1884,1886,1888,1890,1892,1894,1896,1898,1900,1902,1904,1906,1908,1910,1912],{"class":111,"line":1881},58,[109,1883,1820],{"class":119},[109,1885,724],{"class":602},[109,1887,603],{"class":602},[109,1889,1293],{"class":136},[109,1891,140],{"class":602},[109,1893,615],{"class":602},[109,1895,435],{"class":143},[109,1897,621],{"class":602},[109,1899,735],{"class":602},[109,1901,1307],{"class":136},[109,1903,140],{"class":602},[109,1905,1645],{"class":755},[109,1907,759],{"class":136},[109,1909,1874],{"class":119},[109,1911,1005],{"class":136},[109,1913,1914],{"class":602},"};\n",[109,1916,1918],{"class":111,"line":1917},59,[109,1919,1920],{"class":602},"        }\n",[109,1922,1924,1927,1929,1931,1933,1935,1937,1939,1941,1943,1946,1948,1950,1952,1954,1956,1959,1962,1964,1966],{"class":111,"line":1923},60,[109,1925,1926],{"class":119},"        ws",[109,1928,220],{"class":602},[109,1930,1128],{"class":755},[109,1932,759],{"class":136},[109,1934,1529],{"class":602},[109,1936,1194],{"class":119},[109,1938,1535],{"class":602},[109,1940,140],{"class":143},[109,1942,1521],{"class":602},[109,1944,1945],{"class":119},"id",[109,1947,1535],{"class":602},[109,1949,140],{"class":143},[109,1951,1521],{"class":602},[109,1953,304],{"class":119},[109,1955,220],{"class":602},[109,1957,1958],{"class":755},"stringify",[109,1960,1961],{"class":119},"(response)",[109,1963,1545],{"class":602},[109,1965,780],{"class":136},[109,1967,624],{"class":602},[109,1969,1971],{"class":111,"line":1970},61,[109,1972,1973],{"class":602},"    };\n",[109,1975,1977],{"class":111,"line":1976},62,[109,1978,630],{"emptyLinePlaceholder":629},[109,1980,1982,1984,1986,1989,1991,1993,1995,1997,1999],{"class":111,"line":1981},63,[109,1983,1572],{"class":119},[109,1985,220],{"class":602},[109,1987,1988],{"class":755},"onclose",[109,1990,724],{"class":602},[109,1992,863],{"class":602},[109,1994,1626],{"class":762},[109,1996,780],{"class":602},[109,1998,832],{"class":635},[109,2000,783],{"class":602},[109,2002,2004,2007,2009,2011,2013,2016,2019,2021,2023,2025,2027,2029,2032,2034,2036,2039,2041,2044,2046,2048],{"class":111,"line":2003},64,[109,2005,2006],{"class":119},"        console",[109,2008,220],{"class":602},[109,2010,1591],{"class":755},[109,2012,759],{"class":136},[109,2014,2015],{"class":602},"`",[109,2017,2018],{"class":143},"Disconnected (",[109,2020,1521],{"class":602},[109,2022,1626],{"class":119},[109,2024,220],{"class":602},[109,2026,53],{"class":119},[109,2028,1535],{"class":602},[109,2030,2031],{"class":602}," ${",[109,2033,1626],{"class":119},[109,2035,220],{"class":602},[109,2037,2038],{"class":119},"reason",[109,2040,1535],{"class":602},[109,2042,2043],{"class":143},"), reconnecting in 10 seconds",[109,2045,2015],{"class":602},[109,2047,780],{"class":136},[109,2049,624],{"class":602},[109,2051,2053,2056,2058,2061,2063,2066,2068],{"class":111,"line":2052},65,[109,2054,2055],{"class":755},"        setTimeout",[109,2057,759],{"class":136},[109,2059,2060],{"class":119},"connect",[109,2062,735],{"class":602},[109,2064,2065],{"class":123}," 10_000",[109,2067,780],{"class":136},[109,2069,624],{"class":602},[109,2071,2073],{"class":111,"line":2072},66,[109,2074,1973],{"class":602},[109,2076,2078],{"class":111,"line":2077},67,[109,2079,1176],{"class":602},[109,2081,2083],{"class":111,"line":2082},68,[109,2084,630],{"emptyLinePlaceholder":629},[109,2086,2088,2090,2092],{"class":111,"line":2087},69,[109,2089,2060],{"class":755},[109,2091,1093],{"class":119},[109,2093,624],{"class":602},[100,2095,2100],{"className":2096,"code":2097,"filename":2098,"language":2099,"meta":105,"style":105},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","bun run agent.ts\n","Terminal","bash",[53,2101,2102],{"__ignoreMap":105},[109,2103,2104,2107,2110],{"class":111,"line":112},[109,2105,2106],{"class":720},"bun",[109,2108,2109],{"class":143}," run",[109,2111,2112],{"class":143}," agent.ts\n",[14,2114,2115,2116,2118],{},"The agent's status in the dashboard turns ",[47,2117,531],{}," as soon as it connects.",[2120,2121,2122],"style",{},"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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":105,"searchDepth":133,"depth":133,"links":2124},[2125,2126,2127,2132],{"id":20,"depth":133,"text":21},{"id":235,"depth":133,"text":236},{"id":330,"depth":133,"text":331,"children":2128},[2129,2130,2131],{"id":335,"depth":147,"text":278},{"id":450,"depth":147,"text":451},{"id":551,"depth":147,"text":552},{"id":571,"depth":133,"text":572},"The WebSocket protocol between the NetIgnite server and its agents: connection, authentication, message format and commands.","md",{},{"title":5},"\u002Fdocs\u002Fagents\u002Fprotocol",{"title":5,"description":2133},"docs\u002Fagents\u002Fprotocol","SEZrFz-JIgYuxovX_gAxn-g5ldJy4xR2zmfBblZr0a4",1792355946319]