[{"data":1,"prerenderedAt":1111},["ShallowReactive",2],{"docs-\u002Fdocs\u002Fv2\u002Fagent\u002Ftests":3},{"id":4,"title":5,"body":6,"description":1103,"extension":1104,"meta":1105,"navigation":130,"path":1107,"seo":1108,"stem":1109,"__hash__":1110},"docs\u002Fdocs\u002Fv2\u002Fagent\u002Ftests\u002Findex.md","tests\u002F",{"type":7,"value":8,"toc":1094},"minimark",[9,13,33,78,83,96,335,341,345,351,358,376,382,481,487,493,588,596,600,606,734,746,806,810,813,932,936,939,1037,1041,1051,1055,1087,1090],[10,11,5],"h1",{"id":12},"tests",[14,15,16,17,20,21,24,25,28,29,32],"p",{},"Put test files in ",[18,19,5],"code",{},". They are standard Bun test files — ",[18,22,23],{},"bun:test"," for the\nrunner, with the ",[18,26,27],{},"Axon()"," harness available as a global. The harness boots the complete\nagent runtime against your actual ",[18,30,31],{},"axon.config.ts",", so you are testing the real thing.",[34,35,40],"pre",{"className":36,"code":37,"language":38,"meta":39,"style":39},"language-bash shiki shiki-themes dark-plus","tests\u002F\n├── behavior.test.ts\n├── scripts.test.ts\n└── tools.test.ts\n","bash","",[18,41,42,51,61,69],{"__ignoreMap":39},[43,44,47],"span",{"class":45,"line":46},"line",1,[43,48,50],{"class":49},"sCudf","tests\u002F\n",[43,52,54,57],{"class":45,"line":53},2,[43,55,56],{"class":49},"├──",[43,58,60],{"class":59},"sKc5r"," behavior.test.ts\n",[43,62,64,66],{"class":45,"line":63},3,[43,65,56],{"class":49},[43,67,68],{"class":59}," scripts.test.ts\n",[43,70,72,75],{"class":45,"line":71},4,[43,73,74],{"class":49},"└──",[43,76,77],{"class":59}," tools.test.ts\n",[79,80,82],"h2",{"id":81},"the-harness","The harness",[14,84,85,87,88,91,92,95],{},[18,86,27],{}," boots a full agent runtime scoped to the test — real kernel, real capsule,\nreal tools, real policy. Swap in ",[18,89,90],{},"Mock()"," as the engine so runs are deterministic and\nfree. Call ",[18,93,94],{},"runtime.shutdown()"," when you're done.",[34,97,101],{"className":98,"code":99,"language":100,"meta":39,"style":39},"language-ts shiki shiki-themes dark-plus","import { Mock } from \"@arcforge\u002Fengines\u002Fmock\"\n\ndescribe(\"my agent\", () => {\n    it(\"responds to a request\", async () => {\n        const runtime = await Axon({\n            blueprint: { config: { engine: Mock({ hello: \"hi there\" }) } },\n        })\n\n        const result = await runtime.axon.request(\"hello\")\n        expect(result.text).toBe(\"hi there\")\n\n        await runtime.shutdown()\n    })\n})\n","ts",[18,102,103,126,132,153,176,198,229,235,240,273,302,307,323,329],{"__ignoreMap":39},[43,104,105,109,113,117,120,123],{"class":45,"line":46},[43,106,108],{"class":107},"sYbnZ","import",[43,110,112],{"class":111},"sTNBD"," { ",[43,114,116],{"class":115},"s3F5K","Mock",[43,118,119],{"class":111}," } ",[43,121,122],{"class":107},"from",[43,124,125],{"class":59}," \"@arcforge\u002Fengines\u002Fmock\"\n",[43,127,128],{"class":45,"line":53},[43,129,131],{"emptyLinePlaceholder":130},true,"\n",[43,133,134,137,140,143,146,150],{"class":45,"line":63},[43,135,136],{"class":49},"describe",[43,138,139],{"class":111},"(",[43,141,142],{"class":59},"\"my agent\"",[43,144,145],{"class":111},", () ",[43,147,149],{"class":148},"scz_3","=>",[43,151,152],{"class":111}," {\n",[43,154,155,158,160,163,166,169,172,174],{"class":45,"line":71},[43,156,157],{"class":49},"    it",[43,159,139],{"class":111},[43,161,162],{"class":59},"\"responds to a request\"",[43,164,165],{"class":111},", ",[43,167,168],{"class":148},"async",[43,170,171],{"class":111}," () ",[43,173,149],{"class":148},[43,175,152],{"class":111},[43,177,179,182,186,189,192,195],{"class":45,"line":178},5,[43,180,181],{"class":148},"        const",[43,183,185],{"class":184},"s9McN"," runtime",[43,187,188],{"class":111}," = ",[43,190,191],{"class":107},"await",[43,193,194],{"class":49}," Axon",[43,196,197],{"class":111},"({\n",[43,199,201,204,206,209,211,214,217,220,223,226],{"class":45,"line":200},6,[43,202,203],{"class":115},"            blueprint:",[43,205,112],{"class":111},[43,207,208],{"class":115},"config:",[43,210,112],{"class":111},[43,212,213],{"class":115},"engine:",[43,215,216],{"class":49}," Mock",[43,218,219],{"class":111},"({ ",[43,221,222],{"class":115},"hello:",[43,224,225],{"class":59}," \"hi there\"",[43,227,228],{"class":111}," }) } },\n",[43,230,232],{"class":45,"line":231},7,[43,233,234],{"class":111},"        })\n",[43,236,238],{"class":45,"line":237},8,[43,239,131],{"emptyLinePlaceholder":130},[43,241,243,245,248,250,252,254,257,260,262,265,267,270],{"class":45,"line":242},9,[43,244,181],{"class":148},[43,246,247],{"class":184}," result",[43,249,188],{"class":111},[43,251,191],{"class":107},[43,253,185],{"class":115},[43,255,256],{"class":111},".",[43,258,259],{"class":115},"axon",[43,261,256],{"class":111},[43,263,264],{"class":49},"request",[43,266,139],{"class":111},[43,268,269],{"class":59},"\"hello\"",[43,271,272],{"class":111},")\n",[43,274,276,279,281,284,286,289,292,295,297,300],{"class":45,"line":275},10,[43,277,278],{"class":49},"        expect",[43,280,139],{"class":111},[43,282,283],{"class":115},"result",[43,285,256],{"class":111},[43,287,288],{"class":115},"text",[43,290,291],{"class":111},").",[43,293,294],{"class":49},"toBe",[43,296,139],{"class":111},[43,298,299],{"class":59},"\"hi there\"",[43,301,272],{"class":111},[43,303,305],{"class":45,"line":304},11,[43,306,131],{"emptyLinePlaceholder":130},[43,308,310,313,315,317,320],{"class":45,"line":309},12,[43,311,312],{"class":107},"        await",[43,314,185],{"class":115},[43,316,256],{"class":111},[43,318,319],{"class":49},"shutdown",[43,321,322],{"class":111},"()\n",[43,324,326],{"class":45,"line":325},13,[43,327,328],{"class":111},"    })\n",[43,330,332],{"class":45,"line":331},14,[43,333,334],{"class":111},"})\n",[14,336,337,340],{},[18,338,339],{},"runtime.axon"," is the same handle available in scripts and routes. Same API, no special\ntest mode.",[79,342,344],{"id":343},"the-mock-engine","The Mock engine",[14,346,347,348,350],{},"Real inference in tests is slow, nondeterministic, and costs money. ",[18,349,90],{}," replaces\nit with a script you write — the full agent loop still runs. Tool calls execute, the\nsession log accumulates, stop conditions fire. Everything behaves as in production,\njust without a model.",[14,352,353,357],{},[354,355,356],"strong",{},"Echo"," — no input reflects the user's message back. Useful for testing routing and\nwiring without caring about content:",[34,359,361],{"className":98,"code":360,"language":100,"meta":39,"style":39},"engine: Mock()\n",[18,362,363],{"__ignoreMap":39},[43,364,365,369,372,374],{"class":45,"line":46},[43,366,368],{"class":367},"sqDPy","engine",[43,370,371],{"class":111},": ",[43,373,116],{"class":49},[43,375,322],{"class":111},[14,377,378,381],{},[354,379,380],{},"Map"," — patterns matched as case-insensitive substrings against the last user\nmessage. A reply is spoken text, or a sequence of steps consumed one per loop tick:",[34,383,385],{"className":98,"code":384,"language":100,"meta":39,"style":39},"import { Mock, run } from \"@arcforge\u002Fengines\u002Fmock\"\n\nengine: Mock({\n    \"sprint status\": \"Two issues remain in review.\",\n    \"review the file\": [\n        run(`fs.read(\"src\u002Findex.ts\")`),   \u002F\u002F tick 1: the \"model\" acts\n        \"The file looks correct.\",         \u002F\u002F tick 2: it sees the result, then speaks\n    ],\n})\n",[18,386,387,406,410,420,434,444,461,472,477],{"__ignoreMap":39},[43,388,389,391,393,395,397,400,402,404],{"class":45,"line":46},[43,390,108],{"class":107},[43,392,112],{"class":111},[43,394,116],{"class":115},[43,396,165],{"class":111},[43,398,399],{"class":115},"run",[43,401,119],{"class":111},[43,403,122],{"class":107},[43,405,125],{"class":59},[43,407,408],{"class":45,"line":53},[43,409,131],{"emptyLinePlaceholder":130},[43,411,412,414,416,418],{"class":45,"line":63},[43,413,368],{"class":367},[43,415,371],{"class":111},[43,417,116],{"class":49},[43,419,197],{"class":111},[43,421,422,425,428,431],{"class":45,"line":71},[43,423,424],{"class":59},"    \"sprint status\"",[43,426,427],{"class":115},":",[43,429,430],{"class":59}," \"Two issues remain in review.\"",[43,432,433],{"class":111},",\n",[43,435,436,439,441],{"class":45,"line":178},[43,437,438],{"class":59},"    \"review the file\"",[43,440,427],{"class":115},[43,442,443],{"class":111}," [\n",[43,445,446,449,451,454,457],{"class":45,"line":200},[43,447,448],{"class":49},"        run",[43,450,139],{"class":111},[43,452,453],{"class":59},"`fs.read(\"src\u002Findex.ts\")`",[43,455,456],{"class":111},"),   ",[43,458,460],{"class":459},"sOLPB","\u002F\u002F tick 1: the \"model\" acts\n",[43,462,463,466,469],{"class":45,"line":231},[43,464,465],{"class":59},"        \"The file looks correct.\"",[43,467,468],{"class":111},",         ",[43,470,471],{"class":459},"\u002F\u002F tick 2: it sees the result, then speaks\n",[43,473,474],{"class":45,"line":237},[43,475,476],{"class":111},"    ],\n",[43,478,479],{"class":45,"line":242},[43,480,334],{"class":111},[14,482,483,486],{},[18,484,485],{},"run()"," executes real code in the real capsule, under your real policy — the result\nlands in the session log and the next tick sees it, exactly as in production.",[14,488,489,492],{},[354,490,491],{},"Function"," — full control. Receives the engine request, returns the next step:",[34,494,496],{"className":98,"code":495,"language":100,"meta":39,"style":39},"engine: Mock(async (req) => {\n    const last = req.messages.at(-1)?.content ?? \"\"\n    return `You said: ${last}`\n})\n",[18,497,498,523,564,584],{"__ignoreMap":39},[43,499,500,502,504,506,508,510,513,516,519,521],{"class":45,"line":46},[43,501,368],{"class":367},[43,503,371],{"class":111},[43,505,116],{"class":49},[43,507,139],{"class":111},[43,509,168],{"class":148},[43,511,512],{"class":111}," (",[43,514,515],{"class":115},"req",[43,517,518],{"class":111},") ",[43,520,149],{"class":148},[43,522,152],{"class":111},[43,524,525,528,531,533,535,537,540,542,545,548,552,555,558,561],{"class":45,"line":53},[43,526,527],{"class":148},"    const",[43,529,530],{"class":184}," last",[43,532,188],{"class":111},[43,534,515],{"class":115},[43,536,256],{"class":111},[43,538,539],{"class":115},"messages",[43,541,256],{"class":111},[43,543,544],{"class":49},"at",[43,546,547],{"class":111},"(-",[43,549,551],{"class":550},"sDGX8","1",[43,553,554],{"class":111},")?.",[43,556,557],{"class":115},"content",[43,559,560],{"class":111}," ?? ",[43,562,563],{"class":59},"\"\"\n",[43,565,566,569,572,575,578,581],{"class":45,"line":63},[43,567,568],{"class":107},"    return",[43,570,571],{"class":59}," `You said: ",[43,573,574],{"class":148},"${",[43,576,577],{"class":115},"last",[43,579,580],{"class":148},"}",[43,582,583],{"class":59},"`\n",[43,585,586],{"class":45,"line":71},[43,587,334],{"class":111},[14,589,590,591,595],{},"See ",[592,593,90],"a",{"href":594},"\u002Fdocs\u002Fv2\u002Fagent\u002Fengines\u002Fmock"," for the full reference.",[79,597,599],{"id":598},"asserting-on-results","Asserting on results",[14,601,602,605],{},[18,603,604],{},"runtime.axon.request()"," returns the final text and the full entry log for the call:",[34,607,609],{"className":98,"code":608,"language":100,"meta":39,"style":39},"const result = await runtime.axon.request(\"run the test suite\")\n\n\u002F\u002F Text of the agent's spoken output\nexpect(result.text).toContain(\"passed\")\n\n\u002F\u002F Every entry the call produced, in commit order\nexpect(result.entries.some(e => e.type === \"cognet:output:text\")).toBe(true)\n",[18,610,611,639,643,648,673,677,682],{"__ignoreMap":39},[43,612,613,616,618,620,622,624,626,628,630,632,634,637],{"class":45,"line":46},[43,614,615],{"class":148},"const",[43,617,247],{"class":184},[43,619,188],{"class":111},[43,621,191],{"class":107},[43,623,185],{"class":115},[43,625,256],{"class":111},[43,627,259],{"class":115},[43,629,256],{"class":111},[43,631,264],{"class":49},[43,633,139],{"class":111},[43,635,636],{"class":59},"\"run the test suite\"",[43,638,272],{"class":111},[43,640,641],{"class":45,"line":53},[43,642,131],{"emptyLinePlaceholder":130},[43,644,645],{"class":45,"line":63},[43,646,647],{"class":459},"\u002F\u002F Text of the agent's spoken output\n",[43,649,650,653,655,657,659,661,663,666,668,671],{"class":45,"line":71},[43,651,652],{"class":49},"expect",[43,654,139],{"class":111},[43,656,283],{"class":115},[43,658,256],{"class":111},[43,660,288],{"class":115},[43,662,291],{"class":111},[43,664,665],{"class":49},"toContain",[43,667,139],{"class":111},[43,669,670],{"class":59},"\"passed\"",[43,672,272],{"class":111},[43,674,675],{"class":45,"line":178},[43,676,131],{"emptyLinePlaceholder":130},[43,678,679],{"class":45,"line":200},[43,680,681],{"class":459},"\u002F\u002F Every entry the call produced, in commit order\n",[43,683,684,686,688,690,692,695,697,700,702,705,708,711,713,716,719,722,725,727,729,732],{"class":45,"line":231},[43,685,652],{"class":49},[43,687,139],{"class":111},[43,689,283],{"class":115},[43,691,256],{"class":111},[43,693,694],{"class":115},"entries",[43,696,256],{"class":111},[43,698,699],{"class":49},"some",[43,701,139],{"class":111},[43,703,704],{"class":115},"e",[43,706,707],{"class":148}," =>",[43,709,710],{"class":115}," e",[43,712,256],{"class":111},[43,714,715],{"class":115},"type",[43,717,718],{"class":111}," === ",[43,720,721],{"class":59},"\"cognet:output:text\"",[43,723,724],{"class":111},")).",[43,726,294],{"class":49},[43,728,139],{"class":111},[43,730,731],{"class":148},"true",[43,733,272],{"class":111},[14,735,736,737,740,741,745],{},"The whole session is also on the record — ",[18,738,739],{},"runtime.session.entries"," holds every entry\ncommitted since boot, which is how you assert on what ",[742,743,744],"em",{},"actually happened"," rather than\nwhat was returned:",[747,748,749,762],"table",{},[750,751,752],"thead",{},[753,754,755,759],"tr",{},[756,757,758],"th",{},"Entry type",[756,760,761],{},"What it is",[763,764,765,776,786,796],"tbody",{},[753,766,767,773],{},[768,769,770],"td",{},[18,771,772],{},"cognet:stimulus:text",[768,774,775],{},"Input arriving at the agent",[753,777,778,783],{},[768,779,780],{},[18,781,782],{},"cognet:output:text",[768,784,785],{},"The agent speaking",[753,787,788,793],{},[768,789,790],{},[18,791,792],{},"cognet:action:typescript",[768,794,795],{},"Code the agent ran",[753,797,798,803],{},[768,799,800],{},[18,801,802],{},"cognet:action:result",[768,804,805],{},"What came back",[79,807,809],{"id":808},"testing-tools-directly","Testing tools directly",[14,811,812],{},"Tools are reachable without going through the loop at all — typed, real, policy-checked:",[34,814,816],{"className":98,"code":815,"language":100,"meta":39,"style":39},"const runtime = await Axon({ blueprint: { config: { engine: Mock() } } })\n\nconst sum = await runtime.axon.tools.math.add(2, 3)\nexpect(sum).toBe(5)\n\nawait runtime.shutdown()\n",[18,817,818,848,852,896,916,920],{"__ignoreMap":39},[43,819,820,822,824,826,828,830,832,835,837,839,841,843,845],{"class":45,"line":46},[43,821,615],{"class":148},[43,823,185],{"class":184},[43,825,188],{"class":111},[43,827,191],{"class":107},[43,829,194],{"class":49},[43,831,219],{"class":111},[43,833,834],{"class":115},"blueprint:",[43,836,112],{"class":111},[43,838,208],{"class":115},[43,840,112],{"class":111},[43,842,213],{"class":115},[43,844,216],{"class":49},[43,846,847],{"class":111},"() } } })\n",[43,849,850],{"class":45,"line":53},[43,851,131],{"emptyLinePlaceholder":130},[43,853,854,856,859,861,863,865,867,869,871,874,876,879,881,884,886,889,891,894],{"class":45,"line":63},[43,855,615],{"class":148},[43,857,858],{"class":184}," sum",[43,860,188],{"class":111},[43,862,191],{"class":107},[43,864,185],{"class":115},[43,866,256],{"class":111},[43,868,259],{"class":115},[43,870,256],{"class":111},[43,872,873],{"class":115},"tools",[43,875,256],{"class":111},[43,877,878],{"class":115},"math",[43,880,256],{"class":111},[43,882,883],{"class":49},"add",[43,885,139],{"class":111},[43,887,888],{"class":550},"2",[43,890,165],{"class":111},[43,892,893],{"class":550},"3",[43,895,272],{"class":111},[43,897,898,900,902,905,907,909,911,914],{"class":45,"line":71},[43,899,652],{"class":49},[43,901,139],{"class":111},[43,903,904],{"class":115},"sum",[43,906,291],{"class":111},[43,908,294],{"class":49},[43,910,139],{"class":111},[43,912,913],{"class":550},"5",[43,915,272],{"class":111},[43,917,918],{"class":45,"line":178},[43,919,131],{"emptyLinePlaceholder":130},[43,921,922,924,926,928,930],{"class":45,"line":200},[43,923,191],{"class":107},[43,925,185],{"class":115},[43,927,256],{"class":111},[43,929,319],{"class":49},[43,931,322],{"class":111},[79,933,935],{"id":934},"failure-behaviour","Failure behaviour",[14,937,938],{},"The runtime fails loudly, and tests can assert on that:",[34,940,942],{"className":98,"code":941,"language":100,"meta":39,"style":39},"it(\"rejects when no engine is configured\", async () => {\n    const runtime = await Axon()\n    await expect(runtime.axon.request(\"hello\")).rejects.toThrow(\u002FNo Engine Configured\u002F)\n    await runtime.shutdown()\n})\n",[18,943,944,964,978,1021,1033],{"__ignoreMap":39},[43,945,946,949,951,954,956,958,960,962],{"class":45,"line":46},[43,947,948],{"class":49},"it",[43,950,139],{"class":111},[43,952,953],{"class":59},"\"rejects when no engine is configured\"",[43,955,165],{"class":111},[43,957,168],{"class":148},[43,959,171],{"class":111},[43,961,149],{"class":148},[43,963,152],{"class":111},[43,965,966,968,970,972,974,976],{"class":45,"line":53},[43,967,527],{"class":148},[43,969,185],{"class":184},[43,971,188],{"class":111},[43,973,191],{"class":107},[43,975,194],{"class":49},[43,977,322],{"class":111},[43,979,980,983,986,988,991,993,995,997,999,1001,1003,1005,1008,1010,1013,1015,1019],{"class":45,"line":63},[43,981,982],{"class":107},"    await",[43,984,985],{"class":49}," expect",[43,987,139],{"class":111},[43,989,990],{"class":115},"runtime",[43,992,256],{"class":111},[43,994,259],{"class":115},[43,996,256],{"class":111},[43,998,264],{"class":49},[43,1000,139],{"class":111},[43,1002,269],{"class":59},[43,1004,724],{"class":111},[43,1006,1007],{"class":115},"rejects",[43,1009,256],{"class":111},[43,1011,1012],{"class":49},"toThrow",[43,1014,139],{"class":111},[43,1016,1018],{"class":1017},"sxaxS","\u002FNo Engine Configured\u002F",[43,1020,272],{"class":111},[43,1022,1023,1025,1027,1029,1031],{"class":45,"line":71},[43,1024,982],{"class":107},[43,1026,185],{"class":115},[43,1028,256],{"class":111},[43,1030,319],{"class":49},[43,1032,322],{"class":111},[43,1034,1035],{"class":45,"line":178},[43,1036,334],{"class":111},[79,1038,1040],{"id":1039},"config-overrides","Config overrides",[14,1042,1043,1044,1047,1048,1050],{},"The ",[18,1045,1046],{},"blueprint"," merges over your ",[18,1049,31],{}," — override only what the test needs.\nSwapping the engine is the common case; tools, prompts, and policy stay exactly as your\nagent declares them.",[79,1052,1054],{"id":1053},"running-tests","Running tests",[34,1056,1058],{"className":36,"code":1057,"language":38,"meta":39,"style":39},"bun test\nbun test tests\u002Ftools.test.ts\nbun test --watch\n",[18,1059,1060,1068,1078],{"__ignoreMap":39},[43,1061,1062,1065],{"class":45,"line":46},[43,1063,1064],{"class":49},"bun",[43,1066,1067],{"class":59}," test\n",[43,1069,1070,1072,1075],{"class":45,"line":53},[43,1071,1064],{"class":49},[43,1073,1074],{"class":59}," test",[43,1076,1077],{"class":59}," tests\u002Ftools.test.ts\n",[43,1079,1080,1082,1084],{"class":45,"line":63},[43,1081,1064],{"class":49},[43,1083,1074],{"class":59},[43,1085,1086],{"class":148}," --watch\n",[14,1088,1089],{},"Tests run against your local agent. The capsule boots, tools load, and the runtime is\navailable for the duration of the test.",[1091,1092,1093],"style",{},"html pre.shiki code .sCudf, html code.shiki .sCudf{--shiki-default:#DCDCAA}html pre.shiki code .sKc5r, html code.shiki .sKc5r{--shiki-default:#CE9178}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 .sYbnZ, html code.shiki .sYbnZ{--shiki-default:#C586C0}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 .scz_3, html code.shiki .scz_3{--shiki-default:#569CD6}html pre.shiki code .s9McN, html code.shiki .s9McN{--shiki-default:#4FC1FF}html pre.shiki code .sqDPy, html code.shiki .sqDPy{--shiki-default:#C8C8C8}html pre.shiki code .sOLPB, html code.shiki .sOLPB{--shiki-default:#6A9955}html pre.shiki code .sDGX8, html code.shiki .sDGX8{--shiki-default:#B5CEA8}html pre.shiki code .sxaxS, html code.shiki .sxaxS{--shiki-default:#D16969}",{"title":39,"searchDepth":53,"depth":53,"links":1095},[1096,1097,1098,1099,1100,1101,1102],{"id":81,"depth":53,"text":82},{"id":343,"depth":53,"text":344},{"id":598,"depth":53,"text":599},{"id":808,"depth":53,"text":809},{"id":934,"depth":53,"text":935},{"id":1039,"depth":53,"text":1040},{"id":1053,"depth":53,"text":1054},"Put test files in tests\u002F. They are standard Bun test files — bun:test for the\nrunner, with the Axon() harness available as a global. The harness boots the complete\nagent runtime against your actual axon.config.ts, so you are testing the real thing.","md",{"icon":1106},"vscode-icons:folder-type-test","\u002Fdocs\u002Fv2\u002Fagent\u002Ftests",{"title":5,"description":1103},"docs\u002Fv2\u002Fagent\u002Ftests\u002Findex","2X65iGqKsm80NXl6G8E95NKhh62hBxAUqQEyD1P2Tlc",1785671806613]