1 line
34 KiB
JSON

[{"data":1,"prerenderedAt":1959},["ShallowReactive",2],{"navigation_docs":3,"-getting-started-module-reference":145,"-getting-started-module-reference-surround":1954},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":15,"body":147,"description":157,"extension":1948,"links":1949,"meta":1950,"navigation":1951,"path":16,"seo":1952,"stem":17,"__hash__":1953},"docs\u002F1.getting-started\u002F2.module-reference.md",{"type":148,"value":149,"toc":1927},"minimark",[150,154,158,163,174,178,553,583,614,618,782,786,789,803,813,818,861,864,958,964,967,1064,1068,1071,1142,1146,1149,1214,1218,1221,1306,1311,1314,1403,1407,1410,1550,1554,1557,1656,1660,1663,1751,1755,1759,1845,1849,1923],[151,152,15],"h1",{"id":153},"module-reference",[155,156,157],"p",{},"This reference lists the main Forge modules and where each layer lives.",[159,160,162],"h2",{"id":161},"directory-map","Directory Map",[164,165,171],"pre",{"className":166,"code":168,"language":169,"meta":170},[167],"language-text","arma\u002Fclient\u002Faddons\u002F Client-side Arma addons and browser UIs\narma\u002Fserver\u002Faddons\u002F Server-side Arma addons and extension bridge\narma\u002Fserver\u002Fextension\u002F Rust arma-rs extension and SurrealDB adapters\nbin\u002Ficom\u002F Interprocess communication helper\nlib\u002Fmodels\u002F Shared domain data models\nlib\u002Frepositories\u002F Repository traits and in-memory stores\nlib\u002Fservices\u002F Domain services and workflow logic\nlib\u002Fshared\u002F Cross-crate helpers\ntools\u002F Web UI build tooling\ndocs\u002F Framework-level documentation\n","text","",[172,173,168],"code",{"__ignoreMap":170},[159,175,177],{"id":176},"gameplay-domains","Gameplay Domains",[179,180,181,206],"table",{},[182,183,184],"thead",{},[185,186,187,191,194,197,200,203],"tr",{},[188,189,190],"th",{},"Domain",[188,192,193],{},"Purpose",[188,195,196],{},"Client addon",[188,198,199],{},"Server addon",[188,201,202],{},"Service\u002Fmodel layer",[188,204,205],{},"Extension group",[207,208,209,242,276,307,341,375,409,440,471,500,527],"tbody",{},[185,210,211,215,218,223,228,237],{},[212,213,214],"td",{},"Actor",[212,216,217],{},"Player identity, loadout, position, status, contact identifiers, and persistent character data.",[212,219,220],{},[172,221,222],{},"arma\u002Fclient\u002Faddons\u002Factor",[212,224,225],{},[172,226,227],{},"arma\u002Fserver\u002Faddons\u002Factor",[212,229,230,233,234],{},[172,231,232],{},"lib\u002Fmodels\u002Fsrc\u002Factor.rs",", ",[172,235,236],{},"lib\u002Fservices\u002Fsrc\u002Factor.rs",[212,238,239],{},[172,240,241],{},"actor:*",[185,243,244,247,250,255,260,268],{},[212,245,246],{},"Bank",[212,248,249],{},"Player accounts, cash\u002Fbank balances, PIN validation, transfers, checkout charging, and transaction context.",[212,251,252],{},[172,253,254],{},"arma\u002Fclient\u002Faddons\u002Fbank",[212,256,257],{},[172,258,259],{},"arma\u002Fserver\u002Faddons\u002Fbank",[212,261,262,233,265],{},[172,263,264],{},"lib\u002Fmodels\u002Fsrc\u002Fbank.rs",[172,266,267],{},"lib\u002Fservices\u002Fsrc\u002Fbank.rs",[212,269,270,233,273],{},[172,271,272],{},"bank:*",[172,274,275],{},"bank:hot:*",[185,277,278,281,284,289,294,302],{},[212,279,280],{},"CAD",[212,282,283],{},"Dispatch requests, assignments, orders, activity stream, profiles, groups, and hydrated dispatcher views.",[212,285,286],{},[172,287,288],{},"arma\u002Fclient\u002Faddons\u002Fcad",[212,290,291],{},[172,292,293],{},"arma\u002Fserver\u002Faddons\u002Fcad",[212,295,296,233,299],{},[172,297,298],{},"lib\u002Fmodels\u002Fsrc\u002Fcad.rs",[172,300,301],{},"lib\u002Fservices\u002Fsrc\u002Fcad.rs",[212,303,304],{},[172,305,306],{},"cad:*",[185,308,309,312,315,320,325,333],{},[212,310,311],{},"Garage",[212,313,314],{},"Player vehicle storage with plate IDs, fuel, damage, and hit point state.",[212,316,317],{},[172,318,319],{},"arma\u002Fclient\u002Faddons\u002Fgarage",[212,321,322],{},[172,323,324],{},"arma\u002Fserver\u002Faddons\u002Fgarage",[212,326,327,233,330],{},[172,328,329],{},"lib\u002Fmodels\u002Fsrc\u002Fgarage.rs",[172,331,332],{},"lib\u002Fservices\u002Fsrc\u002Fgarage.rs",[212,334,335,233,338],{},[172,336,337],{},"garage:*",[172,339,340],{},"garage:hot:*",[185,342,343,346,349,354,359,367],{},[212,344,345],{},"Locker",[212,347,348],{},"Player item storage keyed by classname with category and amount.",[212,350,351],{},[172,352,353],{},"arma\u002Fclient\u002Faddons\u002Flocker",[212,355,356],{},[172,357,358],{},"arma\u002Fserver\u002Faddons\u002Flocker",[212,360,361,233,364],{},[172,362,363],{},"lib\u002Fmodels\u002Fsrc\u002Flocker.rs",[172,365,366],{},"lib\u002Fservices\u002Fsrc\u002Flocker.rs",[212,368,369,233,372],{},[172,370,371],{},"locker:*",[172,373,374],{},"locker:hot:*",[185,376,377,380,383,388,393,401],{},[212,378,379],{},"Organization",[212,381,382],{},"Player organizations, membership, treasury, credit lines, shared assets, and fleet data.",[212,384,385],{},[172,386,387],{},"arma\u002Fclient\u002Faddons\u002Forg",[212,389,390],{},[172,391,392],{},"arma\u002Fserver\u002Faddons\u002Forg",[212,394,395,233,398],{},[172,396,397],{},"lib\u002Fmodels\u002Fsrc\u002Forg.rs",[172,399,400],{},"lib\u002Fservices\u002Fsrc\u002Forg.rs",[212,402,403,233,406],{},[172,404,405],{},"org:*",[172,407,408],{},"org:hot:*",[185,410,411,414,417,422,427,435],{},[212,412,413],{},"Phone",[212,415,416],{},"Contacts, messages, and email state.",[212,418,419],{},[172,420,421],{},"arma\u002Fclient\u002Faddons\u002Fphone",[212,423,424],{},[172,425,426],{},"arma\u002Fserver\u002Faddons\u002Fphone",[212,428,429,233,432],{},[172,430,431],{},"lib\u002Fmodels\u002Fsrc\u002Fphone.rs",[172,433,434],{},"lib\u002Fservices\u002Fsrc\u002Fphone.rs",[212,436,437],{},[172,438,439],{},"phone:*",[185,441,442,445,448,453,458,466],{},[212,443,444],{},"Store",[212,446,447],{},"Storefront entity setup, catalog hydration, checkout workflows, and checkout charging integration.",[212,449,450],{},[172,451,452],{},"arma\u002Fclient\u002Faddons\u002Fstore",[212,454,455],{},[172,456,457],{},"arma\u002Fserver\u002Faddons\u002Fstore",[212,459,460,233,463],{},[172,461,462],{},"lib\u002Fmodels\u002Fsrc\u002Fstore.rs",[172,464,465],{},"lib\u002Fservices\u002Fsrc\u002Fstore.rs",[212,467,468],{},[172,469,470],{},"store:checkout",[185,472,473,476,479,482,487,495],{},[212,474,475],{},"Task",[212,477,478],{},"Server-owned mission\u002Ftask flows, catalog, ownership, status, participant tracking, rewards, and defuse counters.",[212,480,481],{},"none",[212,483,484],{},[172,485,486],{},"arma\u002Fserver\u002Faddons\u002Ftask",[212,488,489,233,492],{},[172,490,491],{},"lib\u002Fmodels\u002Fsrc\u002Ftask.rs",[172,493,494],{},"lib\u002Fservices\u002Fsrc\u002Ftask.rs",[212,496,497],{},[172,498,499],{},"task:*",[185,501,502,505,508,511,514,522],{},[212,503,504],{},"Owned Garage",[212,506,507],{},"Organization or owner-scoped vehicle unlock storage.",[212,509,510],{},"via garage\u002Forg UI",[212,512,513],{},"server extension only",[212,515,516,233,519],{},[172,517,518],{},"lib\u002Fmodels\u002Fsrc\u002Fv_garage.rs",[172,520,521],{},"lib\u002Fservices\u002Fsrc\u002Fv_garage.rs",[212,523,524],{},[172,525,526],{},"owned:garage:*",[185,528,529,532,535,538,540,548],{},[212,530,531],{},"Owned Locker",[212,533,534],{},"Organization or owner-scoped arsenal unlock storage.",[212,536,537],{},"via locker\u002Forg UI",[212,539,513],{},[212,541,542,233,545],{},[172,543,544],{},"lib\u002Fmodels\u002Fsrc\u002Fv_locker.rs",[172,546,547],{},"lib\u002Fservices\u002Fsrc\u002Fv_locker.rs",[212,549,550],{},[172,551,552],{},"owned:locker:*",[155,554,555,556,559,560,559,562,559,564,559,567,559,569,559,571,559,573,559,576,559,578,559,580,582],{},"Server and extension guides:\n",[557,558,214],"a",{"href":50},",\n",[557,561,246],{"href":62},[557,563,280],{"href":66},[557,565,566],{"href":70},"Economy",[557,568,311],{"href":74},[557,570,345],{"href":78},[557,572,379],{"href":82},[557,574,575],{"href":86},"Owned Storage",[557,577,413],{"href":90},[557,579,444],{"href":54},[557,581,475],{"href":58},".",[155,584,585,586,559,589,559,592,559,595,559,597,559,599,559,601,559,603,559,605,559,608,559,610,559,612,582],{},"Client guides:\n",[557,587,588],{"href":95},"Client Overview",[557,590,591],{"href":102},"Main",[557,593,594],{"href":114},"Common",[557,596,214],{"href":118},[557,598,246],{"href":122},[557,600,280],{"href":126},[557,602,311],{"href":130},[557,604,345],{"href":134},[557,606,607],{"href":138},"Notifications",[557,609,379],{"href":142},[557,611,413],{"href":106},[557,613,444],{"href":110},[159,615,617],{"id":616},"infrastructure-modules","Infrastructure Modules",[179,619,620,632],{},[182,621,622],{},[185,623,624,627,629],{},[188,625,626],{},"Module",[188,628,193],{},[188,630,631],{},"Location",[207,633,634,652,671,689,704,719,737,752,767],{},[185,635,636,641,644],{},[212,637,638],{},[172,639,640],{},"common",[212,642,643],{},"Shared SQF helpers, base stores, utility functions, and shared UI bridge pieces.",[212,645,646,233,649],{},[172,647,648],{},"arma\u002Fclient\u002Faddons\u002Fcommon",[172,650,651],{},"arma\u002Fserver\u002Faddons\u002Fcommon",[185,653,654,659,666],{},[212,655,656],{},[172,657,658],{},"extension",[212,660,661,662,665],{},"Server SQF bridge around ",[172,663,664],{},"forge_server"," extension calls and chunked transport.",[212,667,668],{},[172,669,670],{},"arma\u002Fserver\u002Faddons\u002Fextension",[185,672,673,678,681],{},[212,674,675],{},[172,676,677],{},"main",[212,679,680],{},"Mod-level configuration, pre-init wiring, and server\u002Fclient startup glue.",[212,682,683,233,686],{},[172,684,685],{},"arma\u002Fclient\u002Faddons\u002Fmain",[172,687,688],{},"arma\u002Fserver\u002Faddons\u002Fmain",[185,690,691,696,699],{},[212,692,693],{},[172,694,695],{},"economy",[212,697,698],{},"Server-side fuel, medical, and service economy helpers. Fuel and repair charge organization hot state; medical charges player bank\u002Fcash first, then organization funds with repayable member debt when personal funds cannot cover the bill.",[212,700,701],{},[172,702,703],{},"arma\u002Fserver\u002Faddons\u002Feconomy",[185,705,706,711,714],{},[212,707,708],{},[172,709,710],{},"notifications",[212,712,713],{},"Client notification UI, sounds, and UI event handling.",[212,715,716],{},[172,717,718],{},"arma\u002Fclient\u002Faddons\u002Fnotifications",[185,720,721,726,729],{},[212,722,723],{},[172,724,725],{},"icom",[212,727,728],{},"Rust helper for interprocess communication and event broadcasting.",[212,730,731,233,734],{},[172,732,733],{},"bin\u002Ficom",[172,735,736],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002Ficom.rs",[185,738,739,744,747],{},[212,740,741],{},[172,742,743],{},"terrain",[212,745,746],{},"Extension-side terrain export helper.",[212,748,749],{},[172,750,751],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002Fterrain.rs",[185,753,754,759,762],{},[212,755,756],{},[172,757,758],{},"transport",[212,760,761],{},"Chunked request\u002Fresponse handling for large extension payloads.",[212,763,764],{},[172,765,766],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002Ftransport.rs",[185,768,769,774,777],{},[212,770,771],{},[172,772,773],{},"surreal",[212,775,776],{},"SurrealDB connection lifecycle and status reporting.",[212,778,779],{},[172,780,781],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002Fsurreal.rs",[159,783,785],{"id":784},"extension-command-groups","Extension Command Groups",[155,787,788],{},"Commands are invoked with:",[164,790,794],{"className":791,"code":792,"language":793,"meta":170,"style":170},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\"forge_server\" callExtension [\"group:command\", [_arg1, _arg2]];\n","sqf",[172,795,796],{"__ignoreMap":170},[797,798,801],"span",{"class":799,"line":800},"line",1,[797,802,792],{},[155,804,805,806,809,810,582],{},"Nested groups use additional ",[172,807,808],{},":"," separators, for example\n",[172,811,812],{},"bank:hot:deposit",[814,815,817],"h3",{"id":816},"core","Core",[179,819,820,829],{},[182,821,822],{},[185,823,824,827],{},[188,825,826],{},"Command",[188,828,193],{},[207,830,831,841,851],{},[185,832,833,838],{},[212,834,835],{},[172,836,837],{},"version",[212,839,840],{},"Return the extension version string.",[185,842,843,848],{},[212,844,845],{},[172,846,847],{},"status",[212,849,850],{},"Return SurrealDB connection state.",[185,852,853,858],{},[212,854,855],{},[172,856,857],{},"surreal:status",[212,859,860],{},"Return SurrealDB connection state directly from the Surreal module.",[814,862,214],{"id":863},"actor",[179,865,866,874],{},[182,867,868],{},[185,869,870,872],{},[188,871,826],{},[188,873,193],{},[207,875,876,886,896,906,923,933],{},[185,877,878,883],{},[212,879,880],{},[172,881,882],{},"actor:get",[212,884,885],{},"Fetch actor data for a resolved player UID.",[185,887,888,893],{},[212,889,890],{},[172,891,892],{},"actor:create",[212,894,895],{},"Create actor data from JSON.",[185,897,898,903],{},[212,899,900],{},[172,901,902],{},"actor:update",[212,904,905],{},"Apply actor JSON updates.",[185,907,908,913],{},[212,909,910],{},[172,911,912],{},"actor:exists",[212,914,915,916,919,920,582],{},"Return ",[172,917,918],{},"true"," or ",[172,921,922],{},"false",[185,924,925,930],{},[212,926,927],{},[172,928,929],{},"actor:delete",[212,931,932],{},"Delete actor data.",[185,934,935,955],{},[212,936,937,233,940,233,943,233,946,233,949,233,952],{},[172,938,939],{},"actor:hot:init",[172,941,942],{},"actor:hot:get",[172,944,945],{},"actor:hot:keys",[172,947,948],{},"actor:hot:override",[172,950,951],{},"actor:hot:save",[172,953,954],{},"actor:hot:remove",[212,956,957],{},"Manage actor hot state.",[155,959,960,961,963],{},"See ",[557,962,49],{"href":50}," for examples.",[814,965,246],{"id":966},"bank",[179,968,969,977],{},[182,970,971],{},[185,972,973,975],{},[188,974,826],{},[188,976,193],{},[207,978,979,1001,1026,1044,1054],{},[185,980,981,998],{},[212,982,983,233,986,233,989,233,992,233,995],{},[172,984,985],{},"bank:get",[172,987,988],{},"bank:create",[172,990,991],{},"bank:update",[172,993,994],{},"bank:exists",[172,996,997],{},"bank:delete",[212,999,1000],{},"Durable bank CRUD.",[185,1002,1003,1023],{},[212,1004,1005,233,1008,233,1011,233,1014,233,1017,233,1020],{},[172,1006,1007],{},"bank:hot:init",[172,1009,1010],{},"bank:hot:get",[172,1012,1013],{},"bank:hot:override",[172,1015,1016],{},"bank:hot:patch",[172,1018,1019],{},"bank:hot:save",[172,1021,1022],{},"bank:hot:remove",[212,1024,1025],{},"Manage bank hot state.",[185,1027,1028,1041],{},[212,1029,1030,233,1032,233,1035,233,1038],{},[172,1031,812],{},[172,1033,1034],{},"bank:hot:withdraw",[172,1036,1037],{},"bank:hot:deposit_earnings",[172,1039,1040],{},"bank:hot:transfer",[212,1042,1043],{},"Mutate hot bank balances with operation context.",[185,1045,1046,1051],{},[212,1047,1048],{},[172,1049,1050],{},"bank:hot:charge_checkout",[212,1052,1053],{},"Charge a checkout against hot bank state.",[185,1055,1056,1061],{},[212,1057,1058],{},[172,1059,1060],{},"bank:hot:validate_pin",[212,1062,1063],{},"Validate a PIN for bank operations.",[155,1065,960,1066,963],{},[557,1067,61],{"href":62},[814,1069,311],{"id":1070},"garage",[179,1072,1073,1081],{},[182,1074,1075],{},[185,1076,1077,1079],{},[188,1078,826],{},[188,1080,193],{},[207,1082,1083,1114],{},[185,1084,1085,1111],{},[212,1086,1087,233,1090,233,1093,233,1096,233,1099,233,1102,233,1105,233,1108],{},[172,1088,1089],{},"garage:create",[172,1091,1092],{},"garage:get",[172,1094,1095],{},"garage:add",[172,1097,1098],{},"garage:update",[172,1100,1101],{},"garage:patch",[172,1103,1104],{},"garage:remove",[172,1106,1107],{},"garage:delete",[172,1109,1110],{},"garage:exists",[212,1112,1113],{},"Durable player garage operations.",[185,1115,1116,1139],{},[212,1117,1118,233,1121,233,1124,233,1127,233,1130,233,1133,233,1136],{},[172,1119,1120],{},"garage:hot:init",[172,1122,1123],{},"garage:hot:get",[172,1125,1126],{},"garage:hot:override",[172,1128,1129],{},"garage:hot:add",[172,1131,1132],{},"garage:hot:remove_vehicle",[172,1134,1135],{},"garage:hot:save",[172,1137,1138],{},"garage:hot:remove",[212,1140,1141],{},"Manage player garage hot state.",[155,1143,960,1144,963],{},[557,1145,73],{"href":74},[814,1147,345],{"id":1148},"locker",[179,1150,1151,1159],{},[182,1152,1153],{},[185,1154,1155,1157],{},[188,1156,826],{},[188,1158,193],{},[207,1160,1161,1192],{},[185,1162,1163,1189],{},[212,1164,1165,233,1168,233,1171,233,1174,233,1177,233,1180,233,1183,233,1186],{},[172,1166,1167],{},"locker:create",[172,1169,1170],{},"locker:get",[172,1172,1173],{},"locker:add",[172,1175,1176],{},"locker:update",[172,1178,1179],{},"locker:patch",[172,1181,1182],{},"locker:remove",[172,1184,1185],{},"locker:delete",[172,1187,1188],{},"locker:exists",[212,1190,1191],{},"Durable player locker operations.",[185,1193,1194,1211],{},[212,1195,1196,233,1199,233,1202,233,1205,233,1208],{},[172,1197,1198],{},"locker:hot:init",[172,1200,1201],{},"locker:hot:get",[172,1203,1204],{},"locker:hot:override",[172,1206,1207],{},"locker:hot:save",[172,1209,1210],{},"locker:hot:remove",[212,1212,1213],{},"Manage player locker hot state.",[155,1215,960,1216,963],{},[557,1217,77],{"href":78},[814,1219,379],{"id":1220},"organization",[179,1222,1223,1231],{},[182,1224,1225],{},[185,1226,1227,1229],{},[188,1228,826],{},[188,1230,193],{},[207,1232,1233,1255,1268,1281,1297],{},[185,1234,1235,1252],{},[212,1236,1237,233,1240,233,1243,233,1246,233,1249],{},[172,1238,1239],{},"org:get",[172,1241,1242],{},"org:create",[172,1244,1245],{},"org:update",[172,1247,1248],{},"org:exists",[172,1250,1251],{},"org:delete",[212,1253,1254],{},"Durable organization CRUD.",[185,1256,1257,1265],{},[212,1258,1259,233,1262],{},[172,1260,1261],{},"org:assets:get",[172,1263,1264],{},"org:assets:update",[212,1266,1267],{},"Manage organization assets.",[185,1269,1270,1278],{},[212,1271,1272,233,1275],{},[172,1273,1274],{},"org:fleet:get",[172,1276,1277],{},"org:fleet:update",[212,1279,1280],{},"Manage organization fleet entries.",[185,1282,1283,1294],{},[212,1284,1285,233,1288,233,1291],{},[172,1286,1287],{},"org:members:get",[172,1289,1290],{},"org:members:add",[172,1292,1293],{},"org:members:remove",[212,1295,1296],{},"Manage organization membership.",[185,1298,1299,1303],{},[212,1300,1301],{},[172,1302,408],{},[212,1304,1305],{},"Runtime organization workflows including registration, invites, credit lines, checkout charging, assets, fleet, leave, disband, save, and remove.",[155,1307,960,1308,963],{},[557,1309,1310],{"href":82},"Org Usage Guide",[814,1312,413],{"id":1313},"phone",[179,1315,1316,1324],{},[182,1317,1318],{},[185,1319,1320,1322],{},[188,1321,826],{},[188,1323,193],{},[207,1325,1326,1336,1352,1374,1393],{},[185,1327,1328,1333],{},[212,1329,1330],{},[172,1331,1332],{},"phone:init",[212,1334,1335],{},"Initialize phone state for a UID.",[185,1337,1338,1349],{},[212,1339,1340,233,1343,233,1346],{},[172,1341,1342],{},"phone:contacts:list",[172,1344,1345],{},"phone:contacts:add",[172,1347,1348],{},"phone:contacts:remove",[212,1350,1351],{},"Manage contacts.",[185,1353,1354,1371],{},[212,1355,1356,233,1359,233,1362,233,1365,233,1368],{},[172,1357,1358],{},"phone:messages:list",[172,1360,1361],{},"phone:messages:thread",[172,1363,1364],{},"phone:messages:send",[172,1366,1367],{},"phone:messages:mark_read",[172,1369,1370],{},"phone:messages:delete",[212,1372,1373],{},"Manage messages.",[185,1375,1376,1390],{},[212,1377,1378,233,1381,233,1384,233,1387],{},[172,1379,1380],{},"phone:emails:list",[172,1382,1383],{},"phone:emails:send",[172,1385,1386],{},"phone:emails:mark_read",[172,1388,1389],{},"phone:emails:delete",[212,1391,1392],{},"Manage emails.",[185,1394,1395,1400],{},[212,1396,1397],{},[172,1398,1399],{},"phone:remove",[212,1401,1402],{},"Remove phone state for a UID.",[155,1404,960,1405,963],{},[557,1406,89],{"href":90},[814,1408,280],{"id":1409},"cad",[179,1411,1412,1421],{},[182,1413,1414],{},[185,1415,1416,1419],{},[188,1417,1418],{},"Command Group",[188,1420,193],{},[207,1422,1423,1436,1461,1486,1511,1530,1540],{},[185,1424,1425,1433],{},[212,1426,1427,233,1430],{},[172,1428,1429],{},"cad:activity:append",[172,1431,1432],{},"cad:activity:recent",[212,1434,1435],{},"Append and read recent activity.",[185,1437,1438,1458],{},[212,1439,1440,233,1443,233,1446,233,1449,233,1452,233,1455],{},[172,1441,1442],{},"cad:assignments:list",[172,1444,1445],{},"cad:assignments:assign",[172,1447,1448],{},"cad:assignments:acknowledge",[172,1450,1451],{},"cad:assignments:decline",[172,1453,1454],{},"cad:assignments:upsert",[172,1456,1457],{},"cad:assignments:delete",[212,1459,1460],{},"Manage dispatch assignments.",[185,1462,1463,1483],{},[212,1464,1465,233,1468,233,1471,233,1474,233,1477,233,1480],{},[172,1466,1467],{},"cad:orders:list",[172,1469,1470],{},"cad:orders:create",[172,1472,1473],{},"cad:orders:create_from_context",[172,1475,1476],{},"cad:orders:close",[172,1478,1479],{},"cad:orders:upsert",[172,1481,1482],{},"cad:orders:delete",[212,1484,1485],{},"Manage orders.",[185,1487,1488,1508],{},[212,1489,1490,233,1493,233,1496,233,1499,233,1502,233,1505],{},[172,1491,1492],{},"cad:requests:list",[172,1494,1495],{},"cad:requests:submit",[172,1497,1498],{},"cad:requests:submit_from_context",[172,1500,1501],{},"cad:requests:close",[172,1503,1504],{},"cad:requests:upsert",[172,1506,1507],{},"cad:requests:delete",[212,1509,1510],{},"Manage requests.",[185,1512,1513,1527],{},[212,1514,1515,233,1518,233,1521,233,1524],{},[172,1516,1517],{},"cad:profiles:list",[172,1519,1520],{},"cad:profiles:update_from_context",[172,1522,1523],{},"cad:profiles:upsert",[172,1525,1526],{},"cad:profiles:delete",[212,1528,1529],{},"Manage profiles.",[185,1531,1532,1537],{},[212,1533,1534],{},[172,1535,1536],{},"cad:groups:build",[212,1538,1539],{},"Build grouped CAD state.",[185,1541,1542,1547],{},[212,1543,1544],{},[172,1545,1546],{},"cad:view:hydrate",[212,1548,1549],{},"Build the dispatcher view model.",[155,1551,960,1552,963],{},[557,1553,65],{"href":66},[814,1555,475],{"id":1556},"task",[179,1558,1559,1567],{},[182,1560,1561],{},[185,1562,1563,1565],{},[188,1564,1418],{},[188,1566,193],{},[207,1568,1569,1579,1598,1617,1633,1646],{},[185,1570,1571,1576],{},[212,1572,1573],{},[172,1574,1575],{},"task:reset",[212,1577,1578],{},"Reset task state.",[185,1580,1581,1595],{},[212,1582,1583,233,1586,233,1589,233,1592],{},[172,1584,1585],{},"task:catalog:active",[172,1587,1588],{},"task:catalog:get",[172,1590,1591],{},"task:catalog:upsert",[172,1593,1594],{},"task:catalog:delete",[212,1596,1597],{},"Manage task catalog entries.",[185,1599,1600,1614],{},[212,1601,1602,233,1605,233,1608,233,1611],{},[172,1603,1604],{},"task:ownership:bind",[172,1606,1607],{},"task:ownership:release",[172,1609,1610],{},"task:ownership:accept",[172,1612,1613],{},"task:ownership:reward_context",[212,1615,1616],{},"Manage task ownership and rewards.",[185,1618,1619,1630],{},[212,1620,1621,233,1624,233,1627],{},[172,1622,1623],{},"task:status:set",[172,1625,1626],{},"task:status:get",[172,1628,1629],{},"task:status:clear",[212,1631,1632],{},"Manage task status.",[185,1634,1635,1643],{},[212,1636,1637,233,1640],{},[172,1638,1639],{},"task:defuse:increment",[172,1641,1642],{},"task:defuse:get",[212,1644,1645],{},"Manage defuse counters.",[185,1647,1648,1653],{},[212,1649,1650],{},[172,1651,1652],{},"task:clear",[212,1654,1655],{},"Clear task state.",[155,1657,960,1658,963],{},[557,1659,57],{"href":58},[814,1661,575],{"id":1662},"owned-storage",[179,1664,1665,1673],{},[182,1666,1667],{},[185,1668,1669,1671],{},[188,1670,1418],{},[188,1672,193],{},[207,1674,1675,1703,1713,1741],{},[185,1676,1677,1700],{},[212,1678,1679,233,1682,233,1685,233,1688,233,1691,233,1694,233,1697],{},[172,1680,1681],{},"owned:garage:create",[172,1683,1684],{},"owned:garage:fetch",[172,1686,1687],{},"owned:garage:get",[172,1689,1690],{},"owned:garage:add",[172,1692,1693],{},"owned:garage:remove",[172,1695,1696],{},"owned:garage:delete",[172,1698,1699],{},"owned:garage:exists",[212,1701,1702],{},"Owner-scoped vehicle storage.",[185,1704,1705,1710],{},[212,1706,1707],{},[172,1708,1709],{},"owned:garage:hot:*",[212,1711,1712],{},"Owner-scoped vehicle hot state.",[185,1714,1715,1738],{},[212,1716,1717,233,1720,233,1723,233,1726,233,1729,233,1732,233,1735],{},[172,1718,1719],{},"owned:locker:create",[172,1721,1722],{},"owned:locker:fetch",[172,1724,1725],{},"owned:locker:get",[172,1727,1728],{},"owned:locker:add",[172,1730,1731],{},"owned:locker:remove",[172,1733,1734],{},"owned:locker:delete",[172,1736,1737],{},"owned:locker:exists",[212,1739,1740],{},"Owner-scoped item storage.",[185,1742,1743,1748],{},[212,1744,1745],{},[172,1746,1747],{},"owned:locker:hot:*",[212,1749,1750],{},"Owner-scoped item hot state.",[155,1752,960,1753,963],{},[557,1754,85],{"href":86},[814,1756,1758],{"id":1757},"other-extension-groups","Other Extension Groups",[179,1760,1761,1769],{},[182,1762,1763],{},[185,1764,1765,1767],{},[188,1766,1418],{},[188,1768,193],{},[207,1770,1771,1780,1796,1806,1819,1832],{},[185,1772,1773,1777],{},[212,1774,1775],{},[172,1776,470],{},[212,1778,1779],{},"Run store checkout behavior.",[185,1781,1782,1793],{},[212,1783,1784,233,1787,233,1790],{},[172,1785,1786],{},"icom:connect",[172,1788,1789],{},"icom:broadcast",[172,1791,1792],{},"icom:send_event",[212,1794,1795],{},"ICom connection and event forwarding.",[185,1797,1798,1803],{},[212,1799,1800],{},[172,1801,1802],{},"terrain:exportSVG",[212,1804,1805],{},"Export terrain data as SVG.",[185,1807,1808,1816],{},[212,1809,1810,233,1813],{},[172,1811,1812],{},"transport:invoke",[172,1814,1815],{},"transport:invoke_stored",[212,1817,1818],{},"Invoke commands through transport.",[185,1820,1821,1829],{},[212,1822,1823,233,1826],{},[172,1824,1825],{},"transport:request:append",[172,1827,1828],{},"transport:request:clear",[212,1830,1831],{},"Manage stored request chunks.",[185,1833,1834,1842],{},[212,1835,1836,233,1839],{},[172,1837,1838],{},"transport:response:get",[172,1840,1841],{},"transport:response:clear",[212,1843,1844],{},"Manage stored response chunks.",[159,1846,1848],{"id":1847},"rust-crates","Rust Crates",[179,1850,1851,1861],{},[182,1852,1853],{},[185,1854,1855,1858],{},[188,1856,1857],{},"Crate",[188,1859,1860],{},"Role",[207,1862,1863,1873,1883,1893,1903,1913],{},[185,1864,1865,1870],{},[212,1866,1867],{},[172,1868,1869],{},"forge-models",[212,1871,1872],{},"Domain models and validation. Keep these serializable and free of persistence details.",[185,1874,1875,1880],{},[212,1876,1877],{},[172,1878,1879],{},"forge-repositories",[212,1881,1882],{},"Repository traits and in-memory implementations. Keep these storage-agnostic.",[185,1884,1885,1890],{},[212,1886,1887],{},[172,1888,1889],{},"forge-services",[212,1891,1892],{},"Business rules and workflows. Depend on repository traits, not concrete databases.",[185,1894,1895,1900],{},[212,1896,1897],{},[172,1898,1899],{},"forge-shared",[212,1901,1902],{},"Cross-crate helpers. Keep dependencies light.",[185,1904,1905,1910],{},[212,1906,1907],{},[172,1908,1909],{},"forge-server",[212,1911,1912],{},"Arma extension crate. Owns command registration, SurrealDB runtime wiring, and concrete storage adapters.",[185,1914,1915,1920],{},[212,1916,1917],{},[172,1918,1919],{},"forge-icom",[212,1921,1922],{},"ICom helper binary and client library.",[1924,1925,1926],"style",{},"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":170,"searchDepth":1928,"depth":1928,"links":1929},2,[1930,1931,1932,1933,1947],{"id":161,"depth":1928,"text":162},{"id":176,"depth":1928,"text":177},{"id":616,"depth":1928,"text":617},{"id":784,"depth":1928,"text":785,"children":1934},[1935,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946],{"id":816,"depth":1936,"text":817},3,{"id":863,"depth":1936,"text":214},{"id":966,"depth":1936,"text":246},{"id":1070,"depth":1936,"text":311},{"id":1148,"depth":1936,"text":345},{"id":1220,"depth":1936,"text":379},{"id":1313,"depth":1936,"text":413},{"id":1409,"depth":1936,"text":280},{"id":1556,"depth":1936,"text":475},{"id":1662,"depth":1936,"text":575},{"id":1757,"depth":1936,"text":1758},{"id":1847,"depth":1928,"text":1848},"md",null,{},true,{"title":15,"description":157},"DvQwc2rM4FqseD3QHUyCecRoLIjQmfZuZK0p1V8hxZw",[1955,1957],{"title":11,"path":12,"stem":13,"description":1956,"children":-1},"Forge is organized around domain modules. A domain usually has SQF addon\nentry points, Rust models, repository traits, service logic, extension command\nhandlers, and optional browser UI.",{"title":19,"path":20,"stem":21,"description":1958,"children":-1},"This guide covers the usual path for adding or changing a Forge module.",1776806627742]