[{"data":1,"prerenderedAt":770},["ShallowReactive",2],{"docs-\u002Fdocs\u002Fv2\u002Ftui\u002Fapi\u002Fcommands":3},{"id":4,"title":5,"body":6,"description":763,"extension":764,"meta":765,"navigation":246,"path":766,"seo":767,"stem":768,"__hash__":769},"docs\u002Fdocs\u002Fv2\u002Ftui\u002Fapi\u002Fcommands.md","commands",{"type":7,"value":8,"toc":756},"minimark",[9,12,21,326,331,466,476,480,537,544,548,618,621,625,702,708,712,739,752],[10,11,5],"h1",{"id":5},[13,14,15,16,20],"p",{},"Commands in the ",[17,18,19],"code",{},":"," tree. Built-ins always win a collision; between two extensions the\nfirst loaded keeps the path and the second throws.",[22,23,28],"pre",{"className":24,"code":25,"language":26,"meta":27,"style":27},"language-ts shiki shiki-themes dark-plus","interface CommandsApi {\n    \u002F\u002F Add a command. Two forms — a bare function, or a definition object.\n    register(\n        path: string | readonly string[],\n        run: (signal: AbortSignal) => void | Promise\u003Cvoid>\n    ): Disposer\n    register(\n        path: string | readonly string[],\n        definition: {\n            run: (signal: AbortSignal) => void | Promise\u003Cvoid>\n            description?: string      \u002F\u002F shown beside the command in the palette\n            workingMessage?: string   \u002F\u002F shown in the working row while it runs\n        }\n    ): Disposer\n\n    \u002F\u002F Run one by path, exactly as pressing Enter on it would.\n    \u002F\u002F Throws COMMAND_NOT_FOUND on a missing path, or on a group.\n    run(path: string | readonly string[]): Promise\u003Cvoid>\n\n    \u002F\u002F Every registered path, built-in and user. Dynamic groups are not expanded.\n    list(): readonly string[][]\n}\n","ts","",[17,29,30,47,54,64,89,129,138,145,162,171,201,215,228,234,241,248,254,260,293,298,304,320],{"__ignoreMap":27},[31,32,35,39,43],"span",{"class":33,"line":34},"line",1,[31,36,38],{"class":37},"scz_3","interface",[31,40,42],{"class":41},"sNl3T"," CommandsApi",[31,44,46],{"class":45},"sTNBD"," {\n",[31,48,50],{"class":33,"line":49},2,[31,51,53],{"class":52},"sOLPB","    \u002F\u002F Add a command. Two forms — a bare function, or a definition object.\n",[31,55,57,61],{"class":33,"line":56},3,[31,58,60],{"class":59},"sCudf","    register",[31,62,63],{"class":45},"(\n",[31,65,67,71,74,77,80,83,86],{"class":33,"line":66},4,[31,68,70],{"class":69},"s3F5K","        path",[31,72,73],{"class":45},": ",[31,75,76],{"class":41},"string",[31,78,79],{"class":45}," | ",[31,81,82],{"class":37},"readonly",[31,84,85],{"class":41}," string",[31,87,88],{"class":45},"[],\n",[31,90,92,95,98,101,103,106,109,112,115,117,120,123,126],{"class":33,"line":91},5,[31,93,94],{"class":59},"        run",[31,96,97],{"class":45},": (",[31,99,100],{"class":69},"signal",[31,102,73],{"class":45},[31,104,105],{"class":41},"AbortSignal",[31,107,108],{"class":45},") ",[31,110,111],{"class":37},"=>",[31,113,114],{"class":41}," void",[31,116,79],{"class":45},[31,118,119],{"class":41},"Promise",[31,121,122],{"class":45},"\u003C",[31,124,125],{"class":41},"void",[31,127,128],{"class":45},">\n",[31,130,132,135],{"class":33,"line":131},6,[31,133,134],{"class":45},"    ): ",[31,136,137],{"class":41},"Disposer\n",[31,139,141,143],{"class":33,"line":140},7,[31,142,60],{"class":59},[31,144,63],{"class":45},[31,146,148,150,152,154,156,158,160],{"class":33,"line":147},8,[31,149,70],{"class":69},[31,151,73],{"class":45},[31,153,76],{"class":41},[31,155,79],{"class":45},[31,157,82],{"class":37},[31,159,85],{"class":41},[31,161,88],{"class":45},[31,163,165,168],{"class":33,"line":164},9,[31,166,167],{"class":69},"        definition",[31,169,170],{"class":45},": {\n",[31,172,174,177,179,181,183,185,187,189,191,193,195,197,199],{"class":33,"line":173},10,[31,175,176],{"class":59},"            run",[31,178,97],{"class":45},[31,180,100],{"class":69},[31,182,73],{"class":45},[31,184,105],{"class":41},[31,186,108],{"class":45},[31,188,111],{"class":37},[31,190,114],{"class":41},[31,192,79],{"class":45},[31,194,119],{"class":41},[31,196,122],{"class":45},[31,198,125],{"class":41},[31,200,128],{"class":45},[31,202,204,207,210,212],{"class":33,"line":203},11,[31,205,206],{"class":69},"            description",[31,208,209],{"class":45},"?: ",[31,211,76],{"class":41},[31,213,214],{"class":52},"      \u002F\u002F shown beside the command in the palette\n",[31,216,218,221,223,225],{"class":33,"line":217},12,[31,219,220],{"class":69},"            workingMessage",[31,222,209],{"class":45},[31,224,76],{"class":41},[31,226,227],{"class":52},"   \u002F\u002F shown in the working row while it runs\n",[31,229,231],{"class":33,"line":230},13,[31,232,233],{"class":45},"        }\n",[31,235,237,239],{"class":33,"line":236},14,[31,238,134],{"class":45},[31,240,137],{"class":41},[31,242,244],{"class":33,"line":243},15,[31,245,247],{"emptyLinePlaceholder":246},true,"\n",[31,249,251],{"class":33,"line":250},16,[31,252,253],{"class":52},"    \u002F\u002F Run one by path, exactly as pressing Enter on it would.\n",[31,255,257],{"class":33,"line":256},17,[31,258,259],{"class":52},"    \u002F\u002F Throws COMMAND_NOT_FOUND on a missing path, or on a group.\n",[31,261,263,266,269,272,274,276,278,280,282,285,287,289,291],{"class":33,"line":262},18,[31,264,265],{"class":59},"    run",[31,267,268],{"class":45},"(",[31,270,271],{"class":69},"path",[31,273,73],{"class":45},[31,275,76],{"class":41},[31,277,79],{"class":45},[31,279,82],{"class":37},[31,281,85],{"class":41},[31,283,284],{"class":45},"[]): ",[31,286,119],{"class":41},[31,288,122],{"class":45},[31,290,125],{"class":41},[31,292,128],{"class":45},[31,294,296],{"class":33,"line":295},19,[31,297,247],{"emptyLinePlaceholder":246},[31,299,301],{"class":33,"line":300},20,[31,302,303],{"class":52},"    \u002F\u002F Every registered path, built-in and user. Dynamic groups are not expanded.\n",[31,305,307,310,313,315,317],{"class":33,"line":306},21,[31,308,309],{"class":59},"    list",[31,311,312],{"class":45},"(): ",[31,314,82],{"class":37},[31,316,85],{"class":41},[31,318,319],{"class":45},"[][]\n",[31,321,323],{"class":33,"line":322},22,[31,324,325],{"class":45},"}\n",[327,328,330],"h2",{"id":329},"two-forms","Two forms",[22,332,334],{"className":24,"code":333,"language":26,"meta":27,"style":27},"\u002F\u002F Nothing to configure — just the behaviour.\ncommands.register(\"hello\", () => tui.info(\"hi\"))\n\n\u002F\u002F With presentation.\ncommands.register(\"sync\", {\n    async run(signal) {\n        await longRunningThing({ signal })\n    },\n    description: \"Sync everything\",\n    workingMessage: \"syncing...\",\n})\n",[17,335,336,341,378,382,387,403,418,435,440,451,461],{"__ignoreMap":27},[31,337,338],{"class":33,"line":34},[31,339,340],{"class":52},"\u002F\u002F Nothing to configure — just the behaviour.\n",[31,342,343,345,348,351,353,357,360,362,365,367,370,372,375],{"class":33,"line":49},[31,344,5],{"class":69},[31,346,347],{"class":45},".",[31,349,350],{"class":59},"register",[31,352,268],{"class":45},[31,354,356],{"class":355},"sKc5r","\"hello\"",[31,358,359],{"class":45},", () ",[31,361,111],{"class":37},[31,363,364],{"class":69}," tui",[31,366,347],{"class":45},[31,368,369],{"class":59},"info",[31,371,268],{"class":45},[31,373,374],{"class":355},"\"hi\"",[31,376,377],{"class":45},"))\n",[31,379,380],{"class":33,"line":56},[31,381,247],{"emptyLinePlaceholder":246},[31,383,384],{"class":33,"line":66},[31,385,386],{"class":52},"\u002F\u002F With presentation.\n",[31,388,389,391,393,395,397,400],{"class":33,"line":91},[31,390,5],{"class":69},[31,392,347],{"class":45},[31,394,350],{"class":59},[31,396,268],{"class":45},[31,398,399],{"class":355},"\"sync\"",[31,401,402],{"class":45},", {\n",[31,404,405,408,411,413,415],{"class":33,"line":131},[31,406,407],{"class":37},"    async",[31,409,410],{"class":59}," run",[31,412,268],{"class":45},[31,414,100],{"class":69},[31,416,417],{"class":45},") {\n",[31,419,420,424,427,430,432],{"class":33,"line":140},[31,421,423],{"class":422},"sYbnZ","        await",[31,425,426],{"class":59}," longRunningThing",[31,428,429],{"class":45},"({ ",[31,431,100],{"class":69},[31,433,434],{"class":45}," })\n",[31,436,437],{"class":33,"line":147},[31,438,439],{"class":45},"    },\n",[31,441,442,445,448],{"class":33,"line":164},[31,443,444],{"class":69},"    description:",[31,446,447],{"class":355}," \"Sync everything\"",[31,449,450],{"class":45},",\n",[31,452,453,456,459],{"class":33,"line":173},[31,454,455],{"class":69},"    workingMessage:",[31,457,458],{"class":355}," \"syncing...\"",[31,460,450],{"class":45},[31,462,463],{"class":33,"line":203},[31,464,465],{"class":45},"})\n",[13,467,468,469,471,472,475],{},"Both reach the tree identically. Returning a promise holds the palette in a working row\nuntil it settles; the ",[17,470,100],{}," aborts when the user presses ",[17,473,474],{},"Escape"," mid-flight.",[327,477,479],{"id":478},"nested-paths","Nested paths",[22,481,483],{"className":24,"code":482,"language":26,"meta":27,"style":27},"commands.register([\"git\", \"push\"], run)\ncommands.register([\"git\", \"pull\"], run)\n",[17,484,485,514],{"__ignoreMap":27},[31,486,487,489,491,493,496,499,502,505,508,511],{"class":33,"line":34},[31,488,5],{"class":69},[31,490,347],{"class":45},[31,492,350],{"class":59},[31,494,495],{"class":45},"([",[31,497,498],{"class":355},"\"git\"",[31,500,501],{"class":45},", ",[31,503,504],{"class":355},"\"push\"",[31,506,507],{"class":45},"], ",[31,509,510],{"class":69},"run",[31,512,513],{"class":45},")\n",[31,515,516,518,520,522,524,526,528,531,533,535],{"class":33,"line":49},[31,517,5],{"class":69},[31,519,347],{"class":45},[31,521,350],{"class":59},[31,523,495],{"class":45},[31,525,498],{"class":355},[31,527,501],{"class":45},[31,529,530],{"class":355},"\"pull\"",[31,532,507],{"class":45},[31,534,510],{"class":69},[31,536,513],{"class":45},[13,538,539,540,543],{},"Commands sharing a prefix share a group, created on demand — ",[17,541,542],{},":git "," now descends into\none with both. There is nothing to declare.",[327,545,547],{"id":546},"reaching-what-has-no-api","Reaching what has no API",[22,549,551],{"className":24,"code":550,"language":26,"meta":27,"style":27},"commands.register(\"fresh\", async () => {\n    await commands.run(\"agent clear\")\n    input.set(\"let's start over\")\n})\n",[17,552,553,578,597,614],{"__ignoreMap":27},[31,554,555,557,559,561,563,566,568,571,574,576],{"class":33,"line":34},[31,556,5],{"class":69},[31,558,347],{"class":45},[31,560,350],{"class":59},[31,562,268],{"class":45},[31,564,565],{"class":355},"\"fresh\"",[31,567,501],{"class":45},[31,569,570],{"class":37},"async",[31,572,573],{"class":45}," () ",[31,575,111],{"class":37},[31,577,46],{"class":45},[31,579,580,583,586,588,590,592,595],{"class":33,"line":49},[31,581,582],{"class":422},"    await",[31,584,585],{"class":69}," commands",[31,587,347],{"class":45},[31,589,510],{"class":59},[31,591,268],{"class":45},[31,593,594],{"class":355},"\"agent clear\"",[31,596,513],{"class":45},[31,598,599,602,604,607,609,612],{"class":33,"line":56},[31,600,601],{"class":69},"    input",[31,603,347],{"class":45},[31,605,606],{"class":59},"set",[31,608,268],{"class":45},[31,610,611],{"class":355},"\"let's start over\"",[31,613,513],{"class":45},[31,615,616],{"class":33,"line":66},[31,617,465],{"class":45},[13,619,620],{},"One verb, instead of re-exposing every command's implementation on the surface.",[327,622,624],{"id":623},"errors","Errors",[22,626,628],{"className":24,"code":627,"language":26,"meta":27,"style":27},"commands.register(\"reload\", run)                \u002F\u002F COMMAND_PATH_TAKEN — built-in\ncommands.register(\"x\", { description: \"hi\" })   \u002F\u002F COMMAND_INVALID — no run\nawait commands.run(\"git\")                       \u002F\u002F COMMAND_NOT_FOUND — a group\n",[17,629,630,653,681],{"__ignoreMap":27},[31,631,632,634,636,638,640,643,645,647,650],{"class":33,"line":34},[31,633,5],{"class":69},[31,635,347],{"class":45},[31,637,350],{"class":59},[31,639,268],{"class":45},[31,641,642],{"class":355},"\"reload\"",[31,644,501],{"class":45},[31,646,510],{"class":69},[31,648,649],{"class":45},")                ",[31,651,652],{"class":52},"\u002F\u002F COMMAND_PATH_TAKEN — built-in\n",[31,654,655,657,659,661,663,666,669,672,675,678],{"class":33,"line":49},[31,656,5],{"class":69},[31,658,347],{"class":45},[31,660,350],{"class":59},[31,662,268],{"class":45},[31,664,665],{"class":355},"\"x\"",[31,667,668],{"class":45},", { ",[31,670,671],{"class":69},"description:",[31,673,674],{"class":355}," \"hi\"",[31,676,677],{"class":45}," })   ",[31,679,680],{"class":52},"\u002F\u002F COMMAND_INVALID — no run\n",[31,682,683,686,688,690,692,694,696,699],{"class":33,"line":56},[31,684,685],{"class":422},"await",[31,687,585],{"class":69},[31,689,347],{"class":45},[31,691,510],{"class":59},[31,693,268],{"class":45},[31,695,498],{"class":355},[31,697,698],{"class":45},")                       ",[31,700,701],{"class":52},"\u002F\u002F COMMAND_NOT_FOUND — a group\n",[13,703,704,707],{},[17,705,706],{},"COMMAND_INVALID"," fires at registration, not at press time — a command that registers\ncleanly and does nothing on Enter reads as a broken terminal rather than a config mistake.",[327,709,711],{"id":710},"dynamic-groups-are-not-expanded","Dynamic groups are not expanded",[22,713,715],{"className":24,"code":714,"language":26,"meta":27,"style":27},"commands.list()\n\u002F\u002F [..., [\"open\"], [\"module\", \"update\"], ...]\n\u002F\u002F        ^ the group, not its rows\n",[17,716,717,729,734],{"__ignoreMap":27},[31,718,719,721,723,726],{"class":33,"line":34},[31,720,5],{"class":69},[31,722,347],{"class":45},[31,724,725],{"class":59},"list",[31,727,728],{"class":45},"()\n",[31,730,731],{"class":33,"line":49},[31,732,733],{"class":52},"\u002F\u002F [..., [\"open\"], [\"module\", \"update\"], ...]\n",[31,735,736],{"class":33,"line":56},[31,737,738],{"class":52},"\u002F\u002F        ^ the group, not its rows\n",[13,740,741,744,745,748,749,347],{},[17,742,743],{},":open"," asks whether an editor is attached; ",[17,746,747],{},":module update"," asks the registry what is\npublished. Expanding those in a read would boot composables as a side effect and return\nrows true only for that instant. Reach one with ",[17,750,751],{},"run()",[753,754,755],"style",{},"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 .sTNBD, html code.shiki .sTNBD{--shiki-default:#D4D4D4}html pre.shiki code .sOLPB, html code.shiki .sOLPB{--shiki-default:#6A9955}html pre.shiki code .sCudf, html code.shiki .sCudf{--shiki-default:#DCDCAA}html pre.shiki code .s3F5K, html code.shiki .s3F5K{--shiki-default:#9CDCFE}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 .sKc5r, html code.shiki .sKc5r{--shiki-default:#CE9178}html pre.shiki code .sYbnZ, html code.shiki .sYbnZ{--shiki-default:#C586C0}",{"title":27,"searchDepth":49,"depth":49,"links":757},[758,759,760,761,762],{"id":329,"depth":49,"text":330},{"id":478,"depth":49,"text":479},{"id":546,"depth":49,"text":547},{"id":623,"depth":49,"text":624},{"id":710,"depth":49,"text":711},"Commands in the : tree. Built-ins always win a collision; between two extensions the\nfirst loaded keeps the path and the second throws.","md",{},"\u002Fdocs\u002Fv2\u002Ftui\u002Fapi\u002Fcommands",{"title":5,"description":763},"docs\u002Fv2\u002Ftui\u002Fapi\u002Fcommands","68PtsXHhM5IX8EKM5JOPfzmhd-SjoQDCNWp3u8IEpZ8",1786791207938]