[{"data":1,"prerenderedAt":1422},["ShallowReactive",2],{"docs-\u002Fdocs\u002Fv2\u002Fmodules\u002Fconfig":3},{"id":4,"title":5,"body":6,"description":16,"extension":1416,"meta":1417,"navigation":77,"path":1418,"seo":1419,"stem":1420,"__hash__":1421},"docs\u002Fdocs\u002Fv2\u002Fmodules\u002Fconfig.md","module.config.ts",{"type":7,"value":8,"toc":1406},"minimark",[9,13,17,379,386,390,393,419,422,425,427,434,517,527,592,594,607,708,724,789,792,815,821,824,831,925,933,1041,1044,1047,1134,1136,1139,1174,1176,1179,1368,1375,1402],[10,11,5],"h1",{"id":12},"moduleconfigts",[14,15,16],"p",{},"The entry point for every module. Declares identity, configuration, env requirements,\nemitted hooks, and the boot lifecycle in one place.",[18,19,24],"pre",{"className":20,"code":21,"language":22,"meta":23,"style":23},"language-ts shiki shiki-themes dark-plus","export default defineModule({\n    name: \"discord\",\n    description: \"Discord bot integration — receive messages and send replies.\",\n\n    env: {\n        DISCORD_BOT_TOKEN: {\n            required: true,\n            description: \"Bot token from the Discord developer portal.\",\n        },\n    },\n\n    options: {\n        mentionOnly: { type: \"boolean\", default: false },\n        channelIds:  { type: \"string\",  required: false },\n    },\n\n    emits: {\n        \"discord:message.received\": {} as {\n            content: string\n            username: string\n            reply: (text: string) => Promise\u003Cvoid>\n        },\n    },\n\n    async setup({ axon, options }) {\n        const token = axon.env.require(\"DISCORD_BOT_TOKEN\")\n        \u002F\u002F ...\n    },\n})\n","ts","",[25,26,27,47,61,72,79,88,96,108,119,125,131,136,144,171,195,200,205,213,230,243,253,288,293,298,303,326,361,368,373],"code",{"__ignoreMap":23},[28,29,32,36,39,43],"span",{"class":30,"line":31},"line",1,[28,33,35],{"class":34},"sYbnZ","export",[28,37,38],{"class":34}," default",[28,40,42],{"class":41},"sCudf"," defineModule",[28,44,46],{"class":45},"sTNBD","({\n",[28,48,50,54,58],{"class":30,"line":49},2,[28,51,53],{"class":52},"s3F5K","    name:",[28,55,57],{"class":56},"sKc5r"," \"discord\"",[28,59,60],{"class":45},",\n",[28,62,64,67,70],{"class":30,"line":63},3,[28,65,66],{"class":52},"    description:",[28,68,69],{"class":56}," \"Discord bot integration — receive messages and send replies.\"",[28,71,60],{"class":45},[28,73,75],{"class":30,"line":74},4,[28,76,78],{"emptyLinePlaceholder":77},true,"\n",[28,80,82,85],{"class":30,"line":81},5,[28,83,84],{"class":52},"    env:",[28,86,87],{"class":45}," {\n",[28,89,91,94],{"class":30,"line":90},6,[28,92,93],{"class":52},"        DISCORD_BOT_TOKEN:",[28,95,87],{"class":45},[28,97,99,102,106],{"class":30,"line":98},7,[28,100,101],{"class":52},"            required:",[28,103,105],{"class":104},"scz_3"," true",[28,107,60],{"class":45},[28,109,111,114,117],{"class":30,"line":110},8,[28,112,113],{"class":52},"            description:",[28,115,116],{"class":56}," \"Bot token from the Discord developer portal.\"",[28,118,60],{"class":45},[28,120,122],{"class":30,"line":121},9,[28,123,124],{"class":45},"        },\n",[28,126,128],{"class":30,"line":127},10,[28,129,130],{"class":45},"    },\n",[28,132,134],{"class":30,"line":133},11,[28,135,78],{"emptyLinePlaceholder":77},[28,137,139,142],{"class":30,"line":138},12,[28,140,141],{"class":52},"    options:",[28,143,87],{"class":45},[28,145,147,150,153,156,159,162,165,168],{"class":30,"line":146},13,[28,148,149],{"class":52},"        mentionOnly:",[28,151,152],{"class":45}," { ",[28,154,155],{"class":52},"type:",[28,157,158],{"class":56}," \"boolean\"",[28,160,161],{"class":45},", ",[28,163,164],{"class":52},"default:",[28,166,167],{"class":104}," false",[28,169,170],{"class":45}," },\n",[28,172,174,177,180,182,185,188,191,193],{"class":30,"line":173},14,[28,175,176],{"class":52},"        channelIds:",[28,178,179],{"class":45},"  { ",[28,181,155],{"class":52},[28,183,184],{"class":56}," \"string\"",[28,186,187],{"class":45},",  ",[28,189,190],{"class":52},"required:",[28,192,167],{"class":104},[28,194,170],{"class":45},[28,196,198],{"class":30,"line":197},15,[28,199,130],{"class":45},[28,201,203],{"class":30,"line":202},16,[28,204,78],{"emptyLinePlaceholder":77},[28,206,208,211],{"class":30,"line":207},17,[28,209,210],{"class":52},"    emits:",[28,212,87],{"class":45},[28,214,216,219,222,225,228],{"class":30,"line":215},18,[28,217,218],{"class":56},"        \"discord:message.received\"",[28,220,221],{"class":52},":",[28,223,224],{"class":45}," {} ",[28,226,227],{"class":34},"as",[28,229,87],{"class":45},[28,231,233,236,239],{"class":30,"line":232},19,[28,234,235],{"class":52},"            content",[28,237,238],{"class":45},": ",[28,240,242],{"class":241},"sNl3T","string\n",[28,244,246,249,251],{"class":30,"line":245},20,[28,247,248],{"class":52},"            username",[28,250,238],{"class":45},[28,252,242],{"class":241},[28,254,256,259,262,265,267,270,273,276,279,282,285],{"class":30,"line":255},21,[28,257,258],{"class":41},"            reply",[28,260,261],{"class":45},": (",[28,263,264],{"class":52},"text",[28,266,238],{"class":45},[28,268,269],{"class":241},"string",[28,271,272],{"class":45},") ",[28,274,275],{"class":104},"=>",[28,277,278],{"class":241}," Promise",[28,280,281],{"class":45},"\u003C",[28,283,284],{"class":241},"void",[28,286,287],{"class":45},">\n",[28,289,291],{"class":30,"line":290},22,[28,292,124],{"class":45},[28,294,296],{"class":30,"line":295},23,[28,297,130],{"class":45},[28,299,301],{"class":30,"line":300},24,[28,302,78],{"emptyLinePlaceholder":77},[28,304,306,309,312,315,318,320,323],{"class":30,"line":305},25,[28,307,308],{"class":104},"    async",[28,310,311],{"class":41}," setup",[28,313,314],{"class":45},"({ ",[28,316,317],{"class":52},"axon",[28,319,161],{"class":45},[28,321,322],{"class":52},"options",[28,324,325],{"class":45}," }) {\n",[28,327,329,332,336,339,341,344,347,349,352,355,358],{"class":30,"line":328},26,[28,330,331],{"class":104},"        const",[28,333,335],{"class":334},"s9McN"," token",[28,337,338],{"class":45}," = ",[28,340,317],{"class":52},[28,342,343],{"class":45},".",[28,345,346],{"class":52},"env",[28,348,343],{"class":45},[28,350,351],{"class":41},"require",[28,353,354],{"class":45},"(",[28,356,357],{"class":56},"\"DISCORD_BOT_TOKEN\"",[28,359,360],{"class":45},")\n",[28,362,364],{"class":30,"line":363},27,[28,365,367],{"class":366},"sOLPB","        \u002F\u002F ...\n",[28,369,371],{"class":30,"line":370},28,[28,372,130],{"class":45},[28,374,376],{"class":30,"line":375},29,[28,377,378],{"class":45},"})\n",[14,380,381,382,385],{},"Axon reads the static fields at install time without executing any code. ",[25,383,384],{},"setup"," runs\nonce at agent boot.",[387,388,389],"h2",{"id":389},"name",[14,391,392],{},"The module's registry identifier. Lowercase, hyphenated. Combined with your account\nscope on publish:",[18,394,396],{"className":20,"code":395,"language":22,"meta":23,"style":23},"export default defineModule({ name: \"discord\" })  \u002F\u002F → @you\u002Fdiscord on the registry\n",[25,397,398],{"__ignoreMap":23},[28,399,400,402,404,406,408,411,413,416],{"class":30,"line":31},[28,401,35],{"class":34},[28,403,38],{"class":34},[28,405,42],{"class":41},[28,407,314],{"class":45},[28,409,410],{"class":52},"name:",[28,412,57],{"class":56},[28,414,415],{"class":45}," })  ",[28,417,418],{"class":366},"\u002F\u002F → @you\u002Fdiscord on the registry\n",[387,420,421],{"id":421},"description",[14,423,424],{},"One line. Shown in the registry and the TUI module browser.",[387,426,346],{"id":346},[14,428,429,430,433],{},"Env keys the module requires. The installing agent adds these to their ",[25,431,432],{},".env",". Axon\nvalidates presence at boot.",[18,435,437],{"className":20,"code":436,"language":22,"meta":23,"style":23},"export default defineModule({\n    env: {\n        DISCORD_BOT_TOKEN: {\n            required: true,\n            description: \"Bot token from the Discord developer portal.\",\n        },\n        DISCORD_GUILD_ID: {\n            required: false,\n            description: \"Restrict to a specific server. Leave empty for all servers.\",\n        },\n    },\n})\n",[25,438,439,449,455,461,469,477,481,488,496,505,509,513],{"__ignoreMap":23},[28,440,441,443,445,447],{"class":30,"line":31},[28,442,35],{"class":34},[28,444,38],{"class":34},[28,446,42],{"class":41},[28,448,46],{"class":45},[28,450,451,453],{"class":30,"line":49},[28,452,84],{"class":52},[28,454,87],{"class":45},[28,456,457,459],{"class":30,"line":63},[28,458,93],{"class":52},[28,460,87],{"class":45},[28,462,463,465,467],{"class":30,"line":74},[28,464,101],{"class":52},[28,466,105],{"class":104},[28,468,60],{"class":45},[28,470,471,473,475],{"class":30,"line":81},[28,472,113],{"class":52},[28,474,116],{"class":56},[28,476,60],{"class":45},[28,478,479],{"class":30,"line":90},[28,480,124],{"class":45},[28,482,483,486],{"class":30,"line":98},[28,484,485],{"class":52},"        DISCORD_GUILD_ID:",[28,487,87],{"class":45},[28,489,490,492,494],{"class":30,"line":110},[28,491,101],{"class":52},[28,493,167],{"class":104},[28,495,60],{"class":45},[28,497,498,500,503],{"class":30,"line":121},[28,499,113],{"class":52},[28,501,502],{"class":56}," \"Restrict to a specific server. Leave empty for all servers.\"",[28,504,60],{"class":45},[28,506,507],{"class":30,"line":127},[28,508,124],{"class":45},[28,510,511],{"class":30,"line":133},[28,512,130],{"class":45},[28,514,515],{"class":30,"line":138},[28,516,378],{"class":45},[14,518,519,520,522,523,526],{},"Inside ",[25,521,384],{},", use ",[25,524,525],{},"axon.env.require()"," to validate and retrieve:",[18,528,530],{"className":20,"code":529,"language":22,"meta":23,"style":23},"const token = axon.env.require(\"DISCORD_BOT_TOKEN\")   \u002F\u002F throws if missing\nconst guild = axon.env.get(\"DISCORD_GUILD_ID\")         \u002F\u002F returns undefined if absent\n",[25,531,532,561],{"__ignoreMap":23},[28,533,534,537,539,541,543,545,547,549,551,553,555,558],{"class":30,"line":31},[28,535,536],{"class":104},"const",[28,538,335],{"class":334},[28,540,338],{"class":45},[28,542,317],{"class":52},[28,544,343],{"class":45},[28,546,346],{"class":52},[28,548,343],{"class":45},[28,550,351],{"class":41},[28,552,354],{"class":45},[28,554,357],{"class":56},[28,556,557],{"class":45},")   ",[28,559,560],{"class":366},"\u002F\u002F throws if missing\n",[28,562,563,565,568,570,572,574,576,578,581,583,586,589],{"class":30,"line":49},[28,564,536],{"class":104},[28,566,567],{"class":334}," guild",[28,569,338],{"class":45},[28,571,317],{"class":52},[28,573,343],{"class":45},[28,575,346],{"class":52},[28,577,343],{"class":45},[28,579,580],{"class":41},"get",[28,582,354],{"class":45},[28,584,585],{"class":56},"\"DISCORD_GUILD_ID\"",[28,587,588],{"class":45},")         ",[28,590,591],{"class":366},"\u002F\u002F returns undefined if absent\n",[387,593,322],{"id":322},[14,595,596,597,600,601,603,604,606],{},"User-configurable settings for the module. Set by the installing agent in\n",[25,598,599],{},"axon.config.ts",". Passed to ",[25,602,384],{}," as the ",[25,605,322],{}," parameter.",[18,608,610],{"className":20,"code":609,"language":22,"meta":23,"style":23},"export default defineModule({\n    options: {\n        mentionOnly: {\n            type: \"boolean\",\n            default: false,\n            description: \"Only trigger when the bot is @mentioned.\",\n        },\n        channelIds: {\n            type: \"string\",\n            required: false,\n            description: \"Comma-separated channel IDs. Empty means all channels.\",\n        },\n    },\n})\n",[25,611,612,622,628,634,643,652,661,665,671,679,687,696,700,704],{"__ignoreMap":23},[28,613,614,616,618,620],{"class":30,"line":31},[28,615,35],{"class":34},[28,617,38],{"class":34},[28,619,42],{"class":41},[28,621,46],{"class":45},[28,623,624,626],{"class":30,"line":49},[28,625,141],{"class":52},[28,627,87],{"class":45},[28,629,630,632],{"class":30,"line":63},[28,631,149],{"class":52},[28,633,87],{"class":45},[28,635,636,639,641],{"class":30,"line":74},[28,637,638],{"class":52},"            type:",[28,640,158],{"class":56},[28,642,60],{"class":45},[28,644,645,648,650],{"class":30,"line":81},[28,646,647],{"class":52},"            default:",[28,649,167],{"class":104},[28,651,60],{"class":45},[28,653,654,656,659],{"class":30,"line":90},[28,655,113],{"class":52},[28,657,658],{"class":56}," \"Only trigger when the bot is @mentioned.\"",[28,660,60],{"class":45},[28,662,663],{"class":30,"line":98},[28,664,124],{"class":45},[28,666,667,669],{"class":30,"line":110},[28,668,176],{"class":52},[28,670,87],{"class":45},[28,672,673,675,677],{"class":30,"line":121},[28,674,638],{"class":52},[28,676,184],{"class":56},[28,678,60],{"class":45},[28,680,681,683,685],{"class":30,"line":127},[28,682,101],{"class":52},[28,684,167],{"class":104},[28,686,60],{"class":45},[28,688,689,691,694],{"class":30,"line":133},[28,690,113],{"class":52},[28,692,693],{"class":56}," \"Comma-separated channel IDs. Empty means all channels.\"",[28,695,60],{"class":45},[28,697,698],{"class":30,"line":138},[28,699,124],{"class":45},[28,701,702],{"class":30,"line":146},[28,703,130],{"class":45},[28,705,706],{"class":30,"line":173},[28,707,378],{"class":45},[14,709,710,711,714,715,719,720,723],{},"The installing agent configures them. ",[25,712,713],{},"modules"," is an ",[716,717,718],"strong",{},"array"," of entries; to\npass options, use a ",[25,721,722],{},"[module, options]"," tuple:",[18,725,727],{"className":20,"code":726,"language":22,"meta":23,"style":23},"\u002F\u002F axon.config.ts\nexport default defineAgent({\n    modules: [\n        [\"@axon\u002Fdiscord\", { mentionOnly: true, channelIds: \"1234567890\" }],\n    ],\n})\n",[25,728,729,734,745,753,780,785],{"__ignoreMap":23},[28,730,731],{"class":30,"line":31},[28,732,733],{"class":366},"\u002F\u002F axon.config.ts\n",[28,735,736,738,740,743],{"class":30,"line":49},[28,737,35],{"class":34},[28,739,38],{"class":34},[28,741,742],{"class":41}," defineAgent",[28,744,46],{"class":45},[28,746,747,750],{"class":30,"line":63},[28,748,749],{"class":52},"    modules:",[28,751,752],{"class":45}," [\n",[28,754,755,758,761,764,767,769,771,774,777],{"class":30,"line":74},[28,756,757],{"class":45},"        [",[28,759,760],{"class":56},"\"@axon\u002Fdiscord\"",[28,762,763],{"class":45},", { ",[28,765,766],{"class":52},"mentionOnly:",[28,768,105],{"class":104},[28,770,161],{"class":45},[28,772,773],{"class":52},"channelIds:",[28,775,776],{"class":56}," \"1234567890\"",[28,778,779],{"class":45}," }],\n",[28,781,782],{"class":30,"line":81},[28,783,784],{"class":45},"    ],\n",[28,786,787],{"class":30,"line":90},[28,788,378],{"class":45},[14,790,791],{},"A module with no options is just its name (or import):",[18,793,795],{"className":20,"code":794,"language":22,"meta":23,"style":23},"modules: [\"@axon\u002Fdiscord\", \"@axon\u002Ffs\"]\n",[25,796,797],{"__ignoreMap":23},[28,798,799,802,805,807,809,812],{"class":30,"line":31},[28,800,713],{"class":801},"sqDPy",[28,803,804],{"class":45},": [",[28,806,760],{"class":56},[28,808,161],{"class":45},[28,810,811],{"class":56},"\"@axon\u002Ffs\"",[28,813,814],{"class":45},"]\n",[14,816,817,818,820],{},"Options are validated against the declared types before ",[25,819,384],{}," runs.",[387,822,823],{"id":823},"emits",[14,825,826,827,830],{},"Named hooks the module fires during its lifetime. The type cast (",[25,828,829],{},"{} as { ... }",")\nis the payload type — it flows through to the subscription site so the agent author\ngets typed payloads.",[18,832,834],{"className":20,"code":833,"language":22,"meta":23,"style":23},"export default defineModule({\n    emits: {\n        \"discord:message.received\": {} as {\n            content: string\n            username: string\n            channelId: string\n            reply: (text: string) => Promise\u003Cvoid>\n        },\n    },\n})\n",[25,835,836,846,852,864,872,880,889,913,917,921],{"__ignoreMap":23},[28,837,838,840,842,844],{"class":30,"line":31},[28,839,35],{"class":34},[28,841,38],{"class":34},[28,843,42],{"class":41},[28,845,46],{"class":45},[28,847,848,850],{"class":30,"line":49},[28,849,210],{"class":52},[28,851,87],{"class":45},[28,853,854,856,858,860,862],{"class":30,"line":63},[28,855,218],{"class":56},[28,857,221],{"class":52},[28,859,224],{"class":45},[28,861,227],{"class":34},[28,863,87],{"class":45},[28,865,866,868,870],{"class":30,"line":74},[28,867,235],{"class":52},[28,869,238],{"class":45},[28,871,242],{"class":241},[28,873,874,876,878],{"class":30,"line":81},[28,875,248],{"class":52},[28,877,238],{"class":45},[28,879,242],{"class":241},[28,881,882,885,887],{"class":30,"line":90},[28,883,884],{"class":52},"            channelId",[28,886,238],{"class":45},[28,888,242],{"class":241},[28,890,891,893,895,897,899,901,903,905,907,909,911],{"class":30,"line":98},[28,892,258],{"class":41},[28,894,261],{"class":45},[28,896,264],{"class":52},[28,898,238],{"class":45},[28,900,269],{"class":241},[28,902,272],{"class":45},[28,904,275],{"class":104},[28,906,278],{"class":241},[28,908,281],{"class":45},[28,910,284],{"class":241},[28,912,287],{"class":45},[28,914,915],{"class":30,"line":110},[28,916,124],{"class":45},[28,918,919],{"class":30,"line":121},[28,920,130],{"class":45},[28,922,923],{"class":30,"line":127},[28,924,378],{"class":45},[14,926,519,927,929,930,221],{},[25,928,384],{},", fire hooks with ",[25,931,932],{},"axon.callHook",[18,934,936],{"className":20,"code":935,"language":22,"meta":23,"style":23},"await axon.callHook(\"discord:message.received\", {\n    content: msg.content,\n    username: msg.author.username,\n    channelId: msg.channelId,\n    reply: (text) => msg.reply(text),\n})\n",[25,937,938,959,974,993,1007,1037],{"__ignoreMap":23},[28,939,940,943,946,948,951,953,956],{"class":30,"line":31},[28,941,942],{"class":34},"await",[28,944,945],{"class":52}," axon",[28,947,343],{"class":45},[28,949,950],{"class":41},"callHook",[28,952,354],{"class":45},[28,954,955],{"class":56},"\"discord:message.received\"",[28,957,958],{"class":45},", {\n",[28,960,961,964,967,969,972],{"class":30,"line":49},[28,962,963],{"class":52},"    content:",[28,965,966],{"class":52}," msg",[28,968,343],{"class":45},[28,970,971],{"class":52},"content",[28,973,60],{"class":45},[28,975,976,979,981,983,986,988,991],{"class":30,"line":63},[28,977,978],{"class":52},"    username:",[28,980,966],{"class":52},[28,982,343],{"class":45},[28,984,985],{"class":52},"author",[28,987,343],{"class":45},[28,989,990],{"class":52},"username",[28,992,60],{"class":45},[28,994,995,998,1000,1002,1005],{"class":30,"line":74},[28,996,997],{"class":52},"    channelId:",[28,999,966],{"class":52},[28,1001,343],{"class":45},[28,1003,1004],{"class":52},"channelId",[28,1006,60],{"class":45},[28,1008,1009,1012,1014,1017,1019,1021,1023,1025,1027,1030,1032,1034],{"class":30,"line":81},[28,1010,1011],{"class":41},"    reply",[28,1013,221],{"class":52},[28,1015,1016],{"class":45}," (",[28,1018,264],{"class":52},[28,1020,272],{"class":45},[28,1022,275],{"class":104},[28,1024,966],{"class":52},[28,1026,343],{"class":45},[28,1028,1029],{"class":41},"reply",[28,1031,354],{"class":45},[28,1033,264],{"class":52},[28,1035,1036],{"class":45},"),\n",[28,1038,1039],{"class":30,"line":90},[28,1040,378],{"class":45},[387,1042,1043],{"id":1043},"policy",[14,1045,1046],{},"Declares what capabilities the module uses. Advisory — the parent agent grants actual\naccess through its own policy block. A module cannot expand policy, only declare its\nintentions.",[18,1048,1050],{"className":20,"code":1049,"language":22,"meta":23,"style":23},"export default defineModule({\n    policy: {\n        network: { needs: [\"discord.com\", \"gateway.discord.gg\"] },\n        fs:      { needs: [\"data\u002F**\"] },\n        process: { needs: [\"git *\"] },\n    },\n})\n",[25,1051,1052,1062,1069,1093,1110,1126,1130],{"__ignoreMap":23},[28,1053,1054,1056,1058,1060],{"class":30,"line":31},[28,1055,35],{"class":34},[28,1057,38],{"class":34},[28,1059,42],{"class":41},[28,1061,46],{"class":45},[28,1063,1064,1067],{"class":30,"line":49},[28,1065,1066],{"class":52},"    policy:",[28,1068,87],{"class":45},[28,1070,1071,1074,1076,1079,1082,1085,1087,1090],{"class":30,"line":63},[28,1072,1073],{"class":52},"        network:",[28,1075,152],{"class":45},[28,1077,1078],{"class":52},"needs:",[28,1080,1081],{"class":45}," [",[28,1083,1084],{"class":56},"\"discord.com\"",[28,1086,161],{"class":45},[28,1088,1089],{"class":56},"\"gateway.discord.gg\"",[28,1091,1092],{"class":45},"] },\n",[28,1094,1095,1098,1101,1103,1105,1108],{"class":30,"line":74},[28,1096,1097],{"class":52},"        fs:",[28,1099,1100],{"class":45},"      { ",[28,1102,1078],{"class":52},[28,1104,1081],{"class":45},[28,1106,1107],{"class":56},"\"data\u002F**\"",[28,1109,1092],{"class":45},[28,1111,1112,1115,1117,1119,1121,1124],{"class":30,"line":81},[28,1113,1114],{"class":52},"        process:",[28,1116,152],{"class":45},[28,1118,1078],{"class":52},[28,1120,1081],{"class":45},[28,1122,1123],{"class":56},"\"git *\"",[28,1125,1092],{"class":45},[28,1127,1128],{"class":30,"line":90},[28,1129,130],{"class":45},[28,1131,1132],{"class":30,"line":98},[28,1133,378],{"class":45},[387,1135,713],{"id":713},[14,1137,1138],{},"Other modules this module depends on. Resolved and merged automatically when this\nmodule is installed — the agent author sees one install.",[18,1140,1142],{"className":20,"code":1141,"language":22,"meta":23,"style":23},"export default defineModule({\n    modules: [\"@axon\u002Ffs\", \"@you\u002Fshared-prompts\"],\n})\n",[25,1143,1144,1154,1170],{"__ignoreMap":23},[28,1145,1146,1148,1150,1152],{"class":30,"line":31},[28,1147,35],{"class":34},[28,1149,38],{"class":34},[28,1151,42],{"class":41},[28,1153,46],{"class":45},[28,1155,1156,1158,1160,1162,1164,1167],{"class":30,"line":49},[28,1157,749],{"class":52},[28,1159,1081],{"class":45},[28,1161,811],{"class":56},[28,1163,161],{"class":45},[28,1165,1166],{"class":56},"\"@you\u002Fshared-prompts\"",[28,1168,1169],{"class":45},"],\n",[28,1171,1172],{"class":30,"line":63},[28,1173,378],{"class":45},[387,1175,384],{"id":384},[14,1177,1178],{},"Runs once at agent boot. Narrow scope: env validation, external service connections,\nhook registration, and teardown.",[18,1180,1182],{"className":20,"code":1181,"language":22,"meta":23,"style":23},"async setup({ axon, options }) {\n    const token = axon.env.require(\"DISCORD_BOT_TOKEN\")\n    const client = new Client({ ... })\n\n    client.on(Events.MessageCreate, async (msg) => {\n        await axon.callHook(\"discord:message.received\", { ... })\n    })\n\n    await client.login(token)\n\n    axon.hook(\"axon:agent:shutdown\", () => client.destroy())\n}\n",[25,1183,1184,1201,1226,1244,1248,1283,1301,1306,1310,1329,1333,1363],{"__ignoreMap":23},[28,1185,1186,1189,1191,1193,1195,1197,1199],{"class":30,"line":31},[28,1187,1188],{"class":52},"async",[28,1190,311],{"class":41},[28,1192,314],{"class":45},[28,1194,317],{"class":52},[28,1196,161],{"class":45},[28,1198,322],{"class":52},[28,1200,325],{"class":45},[28,1202,1203,1206,1208,1210,1212,1214,1216,1218,1220,1222,1224],{"class":30,"line":49},[28,1204,1205],{"class":104},"    const",[28,1207,335],{"class":334},[28,1209,338],{"class":45},[28,1211,317],{"class":52},[28,1213,343],{"class":45},[28,1215,346],{"class":52},[28,1217,343],{"class":45},[28,1219,351],{"class":41},[28,1221,354],{"class":45},[28,1223,357],{"class":56},[28,1225,360],{"class":45},[28,1227,1228,1230,1233,1235,1238,1241],{"class":30,"line":63},[28,1229,1205],{"class":104},[28,1231,1232],{"class":334}," client",[28,1234,338],{"class":45},[28,1236,1237],{"class":104},"new",[28,1239,1240],{"class":41}," Client",[28,1242,1243],{"class":45},"({ ... })\n",[28,1245,1246],{"class":30,"line":74},[28,1247,78],{"emptyLinePlaceholder":77},[28,1249,1250,1253,1255,1258,1260,1263,1265,1268,1270,1272,1274,1277,1279,1281],{"class":30,"line":81},[28,1251,1252],{"class":52},"    client",[28,1254,343],{"class":45},[28,1256,1257],{"class":41},"on",[28,1259,354],{"class":45},[28,1261,1262],{"class":52},"Events",[28,1264,343],{"class":45},[28,1266,1267],{"class":52},"MessageCreate",[28,1269,161],{"class":45},[28,1271,1188],{"class":104},[28,1273,1016],{"class":45},[28,1275,1276],{"class":52},"msg",[28,1278,272],{"class":45},[28,1280,275],{"class":104},[28,1282,87],{"class":45},[28,1284,1285,1288,1290,1292,1294,1296,1298],{"class":30,"line":90},[28,1286,1287],{"class":34},"        await",[28,1289,945],{"class":52},[28,1291,343],{"class":45},[28,1293,950],{"class":41},[28,1295,354],{"class":45},[28,1297,955],{"class":56},[28,1299,1300],{"class":45},", { ... })\n",[28,1302,1303],{"class":30,"line":98},[28,1304,1305],{"class":45},"    })\n",[28,1307,1308],{"class":30,"line":110},[28,1309,78],{"emptyLinePlaceholder":77},[28,1311,1312,1315,1317,1319,1322,1324,1327],{"class":30,"line":121},[28,1313,1314],{"class":34},"    await",[28,1316,1232],{"class":52},[28,1318,343],{"class":45},[28,1320,1321],{"class":41},"login",[28,1323,354],{"class":45},[28,1325,1326],{"class":52},"token",[28,1328,360],{"class":45},[28,1330,1331],{"class":30,"line":127},[28,1332,78],{"emptyLinePlaceholder":77},[28,1334,1335,1338,1340,1343,1345,1348,1351,1353,1355,1357,1360],{"class":30,"line":133},[28,1336,1337],{"class":52},"    axon",[28,1339,343],{"class":45},[28,1341,1342],{"class":41},"hook",[28,1344,354],{"class":45},[28,1346,1347],{"class":56},"\"axon:agent:shutdown\"",[28,1349,1350],{"class":45},", () ",[28,1352,275],{"class":104},[28,1354,1232],{"class":52},[28,1356,343],{"class":45},[28,1358,1359],{"class":41},"destroy",[28,1361,1362],{"class":45},"())\n",[28,1364,1365],{"class":30,"line":138},[28,1366,1367],{"class":45},"}\n",[14,1369,1370,1371,1374],{},"For polling modules, wait for ",[25,1372,1373],{},"server:ready"," before starting — all plugins need to\nbe registered before the first hook fires:",[18,1376,1378],{"className":20,"code":1377,"language":22,"meta":23,"style":23},"axon.hook(\"server:ready\", () => startPolling())\n",[25,1379,1380],{"__ignoreMap":23},[28,1381,1382,1384,1386,1388,1390,1393,1395,1397,1400],{"class":30,"line":31},[28,1383,317],{"class":52},[28,1385,343],{"class":45},[28,1387,1342],{"class":41},[28,1389,354],{"class":45},[28,1391,1392],{"class":56},"\"server:ready\"",[28,1394,1350],{"class":45},[28,1396,275],{"class":104},[28,1398,1399],{"class":41}," startPolling",[28,1401,1362],{"class":45},[1403,1404,1405],"style",{},"html pre.shiki code .sYbnZ, html code.shiki .sYbnZ{--shiki-default:#C586C0}html pre.shiki code .sCudf, html code.shiki .sCudf{--shiki-default:#DCDCAA}html pre.shiki code .sTNBD, html code.shiki .sTNBD{--shiki-default:#D4D4D4}html pre.shiki code .s3F5K, html code.shiki .s3F5K{--shiki-default:#9CDCFE}html pre.shiki code .sKc5r, html code.shiki .sKc5r{--shiki-default:#CE9178}html pre.shiki code .scz_3, html code.shiki .scz_3{--shiki-default:#569CD6}html pre.shiki code .sNl3T, html code.shiki .sNl3T{--shiki-default:#4EC9B0}html pre.shiki code .s9McN, html code.shiki .s9McN{--shiki-default:#4FC1FF}html pre.shiki code .sOLPB, html code.shiki .sOLPB{--shiki-default:#6A9955}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 pre.shiki code .sqDPy, html code.shiki .sqDPy{--shiki-default:#C8C8C8}",{"title":23,"searchDepth":49,"depth":49,"links":1407},[1408,1409,1410,1411,1412,1413,1414,1415],{"id":389,"depth":49,"text":389},{"id":421,"depth":49,"text":421},{"id":346,"depth":49,"text":346},{"id":322,"depth":49,"text":322},{"id":823,"depth":49,"text":823},{"id":1043,"depth":49,"text":1043},{"id":713,"depth":49,"text":713},{"id":384,"depth":49,"text":384},"md",{},"\u002Fdocs\u002Fv2\u002Fmodules\u002Fconfig",{"title":5,"description":16},"docs\u002Fv2\u002Fmodules\u002Fconfig","wIQm_bWYnj9p1VgC3gK0bF2f3nqrf4nlN1q_IRhyPac",1785671806668]