[{"data":1,"prerenderedAt":1781},["ShallowReactive",2],{"docs-nav":3,"docs-\u002Fdocs\u002Ftui":78},[4,9,13,16,21,26,30,34,38,42,46,50,53,58,62,66,69,74],{"path":5,"title":6,"navTitle":6,"group":7,"order":8},"\u002Fdocs\u002Fcommands","Other commands","Guide",999,{"path":10,"title":11,"navTitle":12,"group":7,"order":8},"\u002Fdocs\u002Fcompaction","Context and compaction","Context & compaction",{"path":14,"title":15,"navTitle":15,"group":7,"order":8},"\u002Fdocs\u002Fconfiguration","Configuration",{"path":17,"title":18,"navTitle":18,"group":19,"order":20},"\u002Fdocs\u002Fenvironment","Environment variables","Reference",11,{"path":22,"title":23,"navTitle":23,"group":24,"order":25},"\u002Fdocs\u002Fflags","Flag reference","CLI",8,{"path":27,"title":28,"navTitle":28,"group":7,"order":29},"\u002Fdocs","Introduction",1,{"path":31,"title":32,"navTitle":32,"group":7,"order":33},"\u002Fdocs\u002Finstallation","Installation",2,{"path":35,"title":36,"navTitle":36,"group":19,"order":37},"\u002Fdocs\u002Fproviders","Providers",10,{"path":39,"title":40,"navTitle":40,"group":7,"order":41},"\u002Fdocs\u002Fquickstart","Quickstart",3,{"path":43,"title":44,"navTitle":45,"group":7,"order":8},"\u002Fdocs\u002Freleases","Releases and upgrading","Releases",{"path":47,"title":48,"navTitle":49,"group":7,"order":8},"\u002Fdocs\u002Frun","The run command","Running an audit",{"path":51,"title":52,"navTitle":52,"group":7,"order":8},"\u002Fdocs\u002Fsecurity","Security model",{"path":54,"title":55,"navTitle":56,"group":24,"order":57},"\u002Fdocs\u002Fsessions","Sessions and forking","Sessions",6,{"path":59,"title":60,"navTitle":61,"group":7,"order":8},"\u002Fdocs\u002Fskills-roles","Skills and roles","Skills & roles",{"path":63,"title":64,"navTitle":64,"group":19,"order":65},"\u002Fdocs\u002Ftools","Tool reference",12,{"path":67,"title":68,"navTitle":68,"group":7,"order":8},"\u002Fdocs\u002Ftroubleshooting","Troubleshooting",{"path":70,"title":71,"navTitle":72,"group":24,"order":73},"\u002Fdocs\u002Ftui","The interactive TUI","Interactive TUI",9,{"path":75,"title":76,"navTitle":77,"group":7,"order":8},"\u002Fdocs\u002Fweb-eval","Dashboard and evaluation","Dashboard & evaluation",{"id":79,"title":71,"body":80,"description":1774,"extension":1775,"group":24,"meta":1776,"navTitle":72,"navigation":1777,"order":73,"path":70,"seo":1778,"stem":1779,"__hash__":1780},"docs\u002Fdocs\u002Ftui.md",{"type":81,"value":82,"toc":1754},"minimark",[83,87,96,107,112,174,177,188,192,195,205,316,322,326,340,590,596,603,612,623,629,639,645,651,658,676,682,691,695,701,757,771,783,815,828,832,850,856,862,885,900,904,911,917,920,930,934,937,943,1024,1030,1273,1276,1301,1317,1334,1345,1395,1412,1421,1427,1431,1445,1554,1557,1613,1621,1625,1631,1682,1685,1698,1702,1705,1712,1724,1727,1731,1750],[84,85,71],"h1",{"id":86},"the-interactive-tui",[88,89,90,91,95],"p",{},"On a real terminal ",[92,93,94],"code",{},"locac run"," opens an interactive UI: a transcript, a prompt box you can keep\ntyping into while the agent works, an approval overlay for dangerous tools, and a status footer.\nThis page documents what is on the screen and every key that does something.",[88,97,98,99,102,103,106],{},"If you are piping output or running in CI, use ",[92,100,101],{},"--print"," instead. See\n",[104,105,49],"a",{"href":47},".",[108,109,111],"h2",{"id":110},"the-two-renderers","The two renderers",[113,114,115,131],"table",{},[116,117,118],"thead",{},[119,120,121,125,128],"tr",{},[122,123,124],"th",{},"Renderer",[122,126,127],{},"Flag",[122,129,130],{},"What it is",[132,133,134,157],"tbody",{},[119,135,136,140,146],{},[137,138,139],"td",{},"Fullscreen",[137,141,142,143],{},"default, or ",[92,144,145],{},"--fullscreen",[137,147,148,149,152,153,156],{},"Alt-screen (like ",[92,150,151],{},"vim","\u002F",[92,154,155],{},"less","): header, input and footer pinned, the transcript windowed to the viewport. The terminal is restored on exit",[119,158,159,162,167],{},[137,160,161],{},"Inline",[137,163,164],{},[92,165,166],{},"--inline",[137,168,169,170,173],{},"A ",[92,171,172],{},"\u003CStatic>"," scrollback renderer. Output stays in your terminal's scrollback after locac exits, and your terminal does its own native scrolling",[88,175,176],{},"Fullscreen is the default because the transcript is long and a windowed view keeps the input box\nwhere you left it. Inline is the right choice when you want the run to still be there after the\nprocess ends, or when your terminal's scroll and selection are better than anything a program can\nreimplement.",[178,179,180],"blockquote",{},[88,181,182,183,187],{},"The fullscreen root is deliberately rendered ",[184,185,186],"strong",{},"one column short"," of the terminal width. Windows\nconsoles wrap the cursor the moment the last column is written instead of deferring it, which\nlands the erase-to-end-of-line on the row below and shifts the rest of the frame down. Never\nwriting the final cell makes that difference unobservable.",[108,189,191],{"id":190},"the-footer","The footer",[88,193,194],{},"The status bar under the input box:",[196,197,203],"pre",{"className":198,"code":200,"language":201,"meta":202},[199],"language-text","lecter · 3f2a91c8 · ↑42.1k ↓3.8k R120.4k W12.0k CH74% · $0.3120 · ctx 38% · claude-opus-4-8 ⚡high\n","text","",[92,204,200],{"__ignoreMap":202},[113,206,207,217],{},[116,208,209],{},[119,210,211,214],{},[122,212,213],{},"Segment",[122,215,216],{},"Meaning",[132,218,219,229,239,253,274,284,294,304],{},[119,220,221,226],{},[137,222,223],{},[92,224,225],{},"lecter",[137,227,228],{},"The last path segment of the target root",[119,230,231,236],{},[137,232,233],{},[92,234,235],{},"3f2a91c8",[137,237,238],{},"The session id",[119,240,241,250],{},[137,242,243,246,247],{},[92,244,245],{},"↑"," \u002F ",[92,248,249],{},"↓",[137,251,252],{},"Input and output tokens",[119,254,255,263],{},[137,256,257,246,260],{},[92,258,259],{},"R",[92,261,262],{},"W",[137,264,265,266,269,270,273],{},"Cache ",[184,267,268],{},"read"," and cache ",[184,271,272],{},"write"," tokens",[119,275,276,281],{},[137,277,278],{},[92,279,280],{},"CH",[137,282,283],{},"Cache hit rate, shown once there is any input or cache-read traffic",[119,285,286,291],{},[137,287,288],{},[92,289,290],{},"$…",[137,292,293],{},"Accumulated cost, hidden entirely while it is zero",[119,295,296,301],{},[137,297,298],{},[92,299,300],{},"ctx N%",[137,302,303],{},"How full the context window is. This is what compaction watches",[119,305,306,309],{},[137,307,308],{},"model",[137,310,311,312,315],{},"The model id, with ",[92,313,314],{},"⚡\u003Clevel>"," appended when a reasoning budget is actually going out on the wire",[88,317,318,319,321],{},"The effort badge is drawn from the same field the adapter sends, so a level the endpoint would drop\nnever appears there. See ",[104,320,36],{"href":35}," for which wire protocols carry one.",[108,323,325],{"id":324},"slash-commands","Slash commands",[88,327,328,329,331,332,335,336,339],{},"Type ",[92,330,152],{}," at the start of the line to open the palette. It filters as you type (a subsequence rank:\nprefix beats substring beats subsequence), ",[92,333,334],{},"Tab"," completes, ",[92,337,338],{},"Enter"," runs.",[113,341,342,358],{},[116,343,344],{},[119,345,346,349,352,355],{},[122,347,348],{},"Command",[122,350,351],{},"Argument",[122,353,354],{},"Available",[122,356,357],{},"What it does",[132,359,360,376,393,411,425,439,456,470,484,498,512,530,544,562,576],{},[119,361,362,367,370,373],{},[137,363,364],{},[92,365,366],{},"\u002Fmodel",[137,368,369],{},"-",[137,371,372],{},"idle",[137,374,375],{},"Switch provider + model from your saved list, as an ↑\u002F↓ menu",[119,377,378,383,388,390],{},[137,379,380],{},[92,381,382],{},"\u002Feffort",[137,384,385],{},[92,386,387],{},"[low|medium|high]",[137,389,372],{},[137,391,392],{},"Set the reasoning budget. With no argument, opens a menu",[119,394,395,400,405,408],{},[137,396,397],{},[92,398,399],{},"\u002Fcompact",[137,401,402],{},[92,403,404],{},"[instructions]",[137,406,407],{},"always",[137,409,410],{},"Compact and shrink the live context now",[119,412,413,418,420,422],{},[137,414,415],{},[92,416,417],{},"\u002Fcontext",[137,419,369],{},[137,421,407],{},[137,423,424],{},"Token and context usage, plus what a compaction pass would free",[119,426,427,432,434,436],{},[137,428,429],{},[92,430,431],{},"\u002Fnew",[137,433,369],{},[137,435,372],{},[137,437,438],{},"Start a fresh session",[119,440,441,446,451,453],{},[137,442,443],{},[92,444,445],{},"\u002Fname",[137,447,448],{},[92,449,450],{},"\u003Ctitle>",[137,452,372],{},[137,454,455],{},"Rename this session",[119,457,458,463,465,467],{},[137,459,460],{},[92,461,462],{},"\u002Fsession",[137,464,369],{},[137,466,407],{},[137,468,469],{},"Show the current session's id and title",[119,471,472,477,479,481],{},[137,473,474],{},[92,475,476],{},"\u002Fresume",[137,478,369],{},[137,480,372],{},[137,482,483],{},"Pick a past session from a filterable list",[119,485,486,491,493,495],{},[137,487,488],{},[92,489,490],{},"\u002Ffork",[137,492,369],{},[137,494,372],{},[137,496,497],{},"Branch the session at an earlier turn",[119,499,500,505,507,509],{},[137,501,502],{},[92,503,504],{},"\u002Ftree",[137,506,369],{},[137,508,372],{},[137,510,511],{},"The same picker drawn as the fork tree: parent above child, indented by depth",[119,513,514,519,521,523],{},[137,515,516],{},[92,517,518],{},"\u002Freload",[137,520,369],{},[137,522,372],{},[137,524,525,526,529],{},"Re-read ",[92,527,528],{},"keybindings.json"," without restarting",[119,531,532,537,539,541],{},[137,533,534],{},[92,535,536],{},"\u002Fmouse",[137,538,369],{},[137,540,407],{},[137,542,543],{},"Release or re-capture the mouse",[119,545,546,551,553,555],{},[137,547,548],{},[92,549,550],{},"\u002Fhelp",[137,552,369],{},[137,554,407],{},[137,556,557,558,561],{},"The keyboard-shortcut line. ",[92,559,560],{},"\u002Fhotkeys"," is an alias",[119,563,564,569,571,573],{},[137,565,566],{},[92,567,568],{},"\u002Fclear",[137,570,369],{},[137,572,407],{},[137,574,575],{},"Clear the transcript view",[119,577,578,583,585,587],{},[137,579,580],{},[92,581,582],{},"\u002Fquit",[137,584,369],{},[137,586,407],{},[137,588,589],{},"Exit locac",[88,591,592,593,595],{},"Commands marked ",[184,594,372],{}," are hidden while the agent is running: forking or switching models\nmid-turn would branch or re-target a turn the loop is still writing.",[88,597,598,599,602],{},"Every discovered skill also appears as a ",[92,600,601],{},"\u002Fskill:\u003Cname>"," entry, so you can inject a playbook without\nremembering its exact filename.",[604,605,607,609,610],"h3",{"id":606},"context-and-compact",[92,608,417],{}," and ",[92,611,399],{},[88,613,614,615,617,618,622],{},"Both print a deterministic one-liner. ",[92,616,417],{}," ends with what a compaction pass ",[619,620,621],"em",{},"would"," do right\nnow:",[196,624,627],{"className":625,"code":626,"language":201,"meta":202},[199],"would elide 14 results → ~28,400 freed\n",[92,628,626],{"__ignoreMap":202},[88,630,631,632,635,636,638],{},"…or ",[92,633,634],{},"no compaction headroom yet"," when there is nothing to elide. ",[92,637,399],{}," reports what it just\ndid:",[196,640,643],{"className":641,"code":642,"language":201,"meta":202},[199],"compacted: 96,240 → 61,880 tok · elided 14 results · kept 6 evidence · freed ~34,360\n",[92,644,642],{"__ignoreMap":202},[88,646,647,650],{},[92,648,649],{},"kept N evidence"," is the evidence floor: results a finding cites are never elided, however old they\nget.",[604,652,654,609,656],{"id":653},"resume-and-tree",[92,655,476],{},[92,657,504],{},[88,659,660,662,663,665,666,669,670,672,673,675],{},[92,661,476],{}," lists your past sessions newest first. ",[92,664,504],{}," opens the ",[619,667,668],{},"same"," picker over the ",[619,671,668],{},"\nsessions, but drawn as the fork forest: a session that ",[92,674,490],{}," branched sits under the session it\ncame from, one indent per generation.",[196,677,680],{"className":678,"code":679,"language":201,"meta":202},[199],"session tree ▸ 4 of 12\n  auth audit — deserialization sweep\n  ↳ retry with the taint tracer\n    ↳ narrowed to the cookie parser\n  release checklist\n",[92,681,679],{"__ignoreMap":202},[88,683,684,685,687,688,690],{},"That is derived entirely from the parent id ",[92,686,490],{}," already records, so nothing extra is stored and\nnothing is queried twice. Typing still filters, ",[92,689,338],{}," still resumes, and a fork whose parent was\ndeleted becomes a top-level row rather than disappearing.",[108,692,694],{"id":693},"the-input-box","The input box",[88,696,697,698,700],{},"Four line-start prefixes change what ",[92,699,338],{}," does:",[113,702,703,713],{},[116,704,705],{},[119,706,707,710],{},[122,708,709],{},"Prefix",[122,711,712],{},"Effect",[132,714,715,724,734,747],{},[119,716,717,721],{},[137,718,719],{},[92,720,152],{},[137,722,723],{},"Slash-command palette",[119,725,726,731],{},[137,727,728],{},[92,729,730],{},"@",[137,732,733],{},"Fuzzy file-reference picker over the project's files",[119,735,736,741],{},[137,737,738],{},[92,739,740],{},"!",[137,742,743,744],{},"Run a shell command, with the output shown to ",[184,745,746],{},"you only",[119,748,749,754],{},[137,750,751],{},[92,752,753],{},"!!",[137,755,756],{},"Run a shell command and also hand its output to the model",[88,758,759,760,762,763,766,767,770],{},"The ",[92,761,730],{}," picker enumerates project files with ",[92,764,765],{},"Bun.Glob",", skipping vendored, build and VCS trees so a\n",[92,768,769],{},"node_modules"," does not flood it, and it tells you when the file list itself was cut short rather\nthan silently showing nothing.",[88,772,773,774,777,778,609,780,782],{},"A bang line outranks both submit and steer, and works mid-run: ",[92,775,776],{},"!git log --oneline -5"," while the\nagent is working is exactly what the escape is for. The ",[92,779,740],{},[92,781,753],{}," variants differ in one way that\nmatters:",[784,785,786,799],"ul",{},[787,788,789,794,795,798],"li",{},[184,790,791],{},[92,792,793],{},"!cmd"," never touches the conversation. That is the point of having a local variant next to the\n",[92,796,797],{},"bash"," tool.",[787,800,801,806,807,810,811,814],{},[184,802,803],{},[92,804,805],{},"!!cmd"," appends a user turn containing the command ",[619,808,809],{},"and"," its output, wrapped in the same\n",[92,812,813],{},"⟦untrusted-output⟧"," fence a tool result would get. You typed the command, but its output came\nfrom the target, so it arrives as evidence, not as instruction.",[88,816,817,818,821,822,824,825,827],{},"If you have used pi, note that locac's two bangs are the other way round: here the ",[184,819,820],{},"single"," ",[92,823,740],{}," is\nthe local-only one and ",[92,826,753],{}," is the one that shares. That is deliberate. The dangerous variant, the\none that puts target output into the model's context, is the one that costs an extra keystroke.",[604,829,831],{"id":830},"attaching-an-image","Attaching an image",[88,833,834,835,838,839,842,843,845,846,849],{},"There are two ways in. ",[92,836,837],{},"Ctrl+V"," attaches the image currently on your clipboard to the draft, and\n",[92,840,841],{},"Alt+V"," does the same on terminals that keep ",[92,844,837],{}," for themselves. Or ",[184,847,848],{},"drag the file into the\nterminal window"," - your terminal writes its path into the line, and locac attaches the image instead\nof pasting the path. Either way: a screenshot of a stack trace, a rendered payload or a crash dialog,\nsent with your next message.",[196,851,854],{"className":852,"code":853,"language":201,"meta":202},[199],"📎 1 image attached - sent with the next message\n",[92,855,853],{"__ignoreMap":202},[88,857,858,859,861],{},"The attachment goes out with the next ",[92,860,338],{}," and the draft is cleared. Attach several and they all\nride along. A message with an attachment and no text is a normal turn.",[88,863,864,865,868,869,872,873,876,877,880,881,884],{},"The clipboard reader is platform-native and adds no dependency: ",[92,866,867],{},"Clipboard::GetImage"," through\nPowerShell on Windows, ",[92,870,871],{},"osascript"," on macOS, ",[92,874,875],{},"wl-paste"," or ",[92,878,879],{},"xclip"," on Linux. PNG, JPEG, GIF and WebP\nare accepted. The format is decided by ",[184,882,883],{},"sniffing the magic bytes",", never by what the helper claims\nor by what the filename ends in, because a screenshot taken inside a target environment is content\nyou did not write. If the clipboard has no image on it, the box says so and nothing is attached.",[88,886,887,888,891,892,895,896,899],{},"A drop is only ever ",[619,889,890],{},"added"," to your paste, never substituted for it. Drag a ",[92,893,894],{},".ts"," file in, drop two\nfiles at once, or paste prose that happens to contain a path, and the text lands in the editor\nexactly as it always did - only a single absolute path that turns out to hold real image bytes is\nswallowed. Quoted paths, shell-escaped spaces and ",[92,897,898],{},"file:\u002F\u002F"," URLs are all understood, since which one\nyour terminal writes is its choice, not yours.",[604,901,903],{"id":902},"the-size-ceiling","The size ceiling",[88,905,906,907,910],{},"An attachment is capped at ",[184,908,909],{},"3 MiB of raw image data",". Over that, locac refuses it and says so:",[196,912,915],{"className":913,"code":914,"language":201,"meta":202},[199],"image is 7.2 MB, over the 3.0 MB limit - not attached\n",[92,916,914],{"__ignoreMap":202},[88,918,919],{},"It is a refusal rather than a resize on purpose. Re-encoding your evidence would mean a decoder\ndependency and a lossy transform of the thing you are asking the model to look at. Take a tighter\nscreenshot, or crop it, and the answer improves along with the size.",[88,921,922,923,926,927,929],{},"The ceiling is not only about the provider's own per-image limit (base64 inflates the bytes by a\nthird, and 3 MiB lands under the usual 5 MB). An attachment is stored in the session database with\nthe turn that carried it and ",[184,924,925],{},"replayed to the model on every later turn of the run",", so an\nunbounded screenshot is a cost that repeats for as long as the session does. The transcript view\nshows only the count; the bytes are in the message, which is why ",[92,928,399],{}," and a fresh session are\nthe two ways to stop paying for one.",[108,931,933],{"id":932},"keybindings","Keybindings",[88,935,936],{},"These are the defaults. Every one of them is remappable.",[88,938,939,942],{},[184,940,941],{},"Global",", resolved before any overlay:",[113,944,945,955],{},[116,946,947],{},[119,948,949,952],{},[122,950,951],{},"Key",[122,953,954],{},"Action",[132,956,957,971,981,994,1004,1014],{},[119,958,959,964],{},[137,960,961],{},[92,962,963],{},"Ctrl+D",[137,965,966,967,970],{},"Quit — ",[184,968,969],{},"on an empty editor",". Inside a draft it is forward-delete instead (see below)",[119,972,973,978],{},[137,974,975],{},[92,976,977],{},"Ctrl+C",[137,979,980],{},"Clear the editor, or quit when it is already empty",[119,982,983,991],{},[137,984,985,246,988],{},[92,986,987],{},"PageUp",[92,989,990],{},"PageDown",[137,992,993],{},"Scroll the transcript",[119,995,996,1001],{},[137,997,998],{},[92,999,1000],{},"Ctrl+End",[137,1002,1003],{},"Jump back to the tail and resume following it",[119,1005,1006,1011],{},[137,1007,1008],{},[92,1009,1010],{},"Ctrl+Home",[137,1012,1013],{},"Jump to the first line of the transcript",[119,1015,1016,1021],{},[137,1017,1018],{},[92,1019,1020],{},"Ctrl+O",[137,1022,1023],{},"Hand the mouse back to the terminal, or take it again",[88,1025,1026,1029],{},[184,1027,1028],{},"Editing",", active when no overlay is open:",[113,1031,1032,1040],{},[116,1033,1034],{},[119,1035,1036,1038],{},[122,1037,951],{},[122,1039,954],{},[132,1041,1042,1051,1061,1071,1081,1094,1114,1133,1144,1154,1164,1179,1192,1202,1212,1223,1233,1250,1263],{},[119,1043,1044,1048],{},[137,1045,1046],{},[92,1047,338],{},[137,1049,1050],{},"Submit, or steer a running turn",[119,1052,1053,1058],{},[137,1054,1055],{},[92,1056,1057],{},"Shift+Enter",[137,1059,1060],{},"Newline",[119,1062,1063,1068],{},[137,1064,1065],{},[92,1066,1067],{},"Alt+Enter",[137,1069,1070],{},"Queue a follow-up",[119,1072,1073,1078],{},[137,1074,1075],{},[92,1076,1077],{},"Escape",[137,1079,1080],{},"Abort the running turn, else clear the editor",[119,1082,1083,1091],{},[137,1084,1085,246,1088],{},[92,1086,1087],{},"←",[92,1089,1090],{},"→",[137,1092,1093],{},"Move by character",[119,1095,1096,1111],{},[137,1097,1098,246,1101,1104,1105,246,1108],{},[92,1099,1100],{},"Alt+←",[92,1102,1103],{},"Alt+B",", ",[92,1106,1107],{},"Alt+→",[92,1109,1110],{},"Alt+F",[137,1112,1113],{},"Move by word",[119,1115,1116,1130],{},[137,1117,1118,246,1121,1104,1124,246,1127],{},[92,1119,1120],{},"Ctrl+A",[92,1122,1123],{},"Home",[92,1125,1126],{},"Ctrl+E",[92,1128,1129],{},"End",[137,1131,1132],{},"Start \u002F end of line",[119,1134,1135,1141],{},[137,1136,1137,246,1139],{},[92,1138,245],{},[92,1140,249],{},[137,1142,1143],{},"History, or vertical movement inside a multi-line draft",[119,1145,1146,1151],{},[137,1147,1148],{},[92,1149,1150],{},"Alt+↑",[137,1152,1153],{},"Pull queued steers and follow-ups back into the editor",[119,1155,1156,1161],{},[137,1157,1158],{},[92,1159,1160],{},"Backspace",[137,1162,1163],{},"Delete backward",[119,1165,1166,1173],{},[137,1167,1168,246,1171],{},[92,1169,1170],{},"Delete",[92,1172,963],{},[137,1174,1175,1176,1178],{},"Delete forward (",[92,1177,963],{}," only while the draft is non-empty)",[119,1180,1181,1189],{},[137,1182,1183,246,1186],{},[92,1184,1185],{},"Ctrl+U",[92,1187,1188],{},"Ctrl+K",[137,1190,1191],{},"Delete to line start \u002F end",[119,1193,1194,1199],{},[137,1195,1196],{},[92,1197,1198],{},"Ctrl+W",[137,1200,1201],{},"Delete the previous word",[119,1203,1204,1209],{},[137,1205,1206],{},[92,1207,1208],{},"Ctrl+Y",[137,1210,1211],{},"Yank",[119,1213,1214,1220],{},[137,1215,1216,246,1218],{},[92,1217,837],{},[92,1219,841],{},[137,1221,1222],{},"Attach the clipboard image to the draft (or drag a file into the window)",[119,1224,1225,1230],{},[137,1226,1227],{},[92,1228,1229],{},"Ctrl+X",[137,1231,1232],{},"Copy the last assistant message to the clipboard",[119,1234,1235,1240],{},[137,1236,1237],{},[92,1238,1239],{},"Ctrl+G",[137,1241,1242,1243,246,1246,1249],{},"Hand the draft to ",[92,1244,1245],{},"$VISUAL",[92,1247,1248],{},"$EDITOR"," and take back whatever you save",[119,1251,1252,1257],{},[137,1253,1254],{},[92,1255,1256],{},"Ctrl+L",[137,1258,1259,1260,1262],{},"Open the ",[92,1261,366],{}," picker (idle only)",[119,1264,1265,1270],{},[137,1266,1267],{},[92,1268,1269],{},"Shift+Tab",[137,1271,1272],{},"Cycle the reasoning-effort level (idle only)",[88,1274,1275],{},"Three of those need a word of explanation.",[88,1277,1278,1281,1282,1285,1286,1289,1290,1293,1294,1297,1298,1300],{},[184,1279,1280],{},"Backspace and Delete really are different keys here."," Backspace sends ",[92,1283,1284],{},"0x7f"," on macOS and Linux\nand ",[92,1287,1288],{},"0x08"," on Windows; the terminal layer reports both as ",[619,1291,1292],{},"backspace",", and reserves ",[619,1295,1296],{},"delete"," for the\nDelete key proper. So each one deletes its own side of the cursor, and ",[92,1299,963],{}," — readline's own\nforward-delete — is the binding you want when your keyboard has no Delete key at all.",[88,1302,1303,1308,1309,1312,1313,1316],{},[184,1304,1305,1307],{},[92,1306,963],{}," is overloaded on purpose,"," the way a shell overloads it: on an empty editor it quits, and\ninside a draft it deletes the character under the cursor. Without that split, one keystroke throws\naway a long typed prompt. Both halves are separate actions (",[92,1310,1311],{},"app.exit"," and\n",[92,1314,1315],{},"tui.editor.deleteCharForward",") so you can rebind either one independently.",[88,1318,1319,1324,1325,1327,1328,1330,1331,1333],{},[184,1320,1321,1323],{},[92,1322,1150],{}," un-queues."," A line you ",[92,1326,338],{}," while the agent is running is queued, not sent; ",[92,1329,1067],{},"\nqueues a follow-up the same way. ",[92,1332,1150],{}," takes every still-queued line back out of the queue and puts\nit at the top of your draft, so a steer typed too early can be rewritten before the loop pulls it.\nAttachments are not restored — re-attaching is one keystroke or one drag, and a base64 screenshot in\nthe editor is not editable text.",[88,1335,1336,1339,1340,1104,1342,1344],{},[184,1337,1338],{},"Overlays."," The approval prompt, ",[92,1341,366],{},[92,1343,382],{},", the palette and the session picker share\none navigation set:",[113,1346,1347,1355],{},[116,1348,1349],{},[119,1350,1351,1353],{},[122,1352,951],{},[122,1354,954],{},[132,1356,1357,1368,1377,1386],{},[119,1358,1359,1365],{},[137,1360,1361,246,1363],{},[92,1362,245],{},[92,1364,249],{},[137,1366,1367],{},"Previous \u002F next row",[119,1369,1370,1374],{},[137,1371,1372],{},[92,1373,338],{},[137,1375,1376],{},"Confirm",[119,1378,1379,1383],{},[137,1380,1381],{},[92,1382,1077],{},[137,1384,1385],{},"Cancel",[119,1387,1388,1392],{},[137,1389,1390],{},[92,1391,334],{},[137,1393,1394],{},"Complete",[88,1396,1397,1400,1401,1404,1405,1408,1409,1411],{},[184,1398,1399],{},"Approval."," Letter shortcuts on the approval overlay: ",[92,1402,1403],{},"y"," yes, ",[92,1406,1407],{},"n"," no, ",[92,1410,104],{}," always.",[88,1413,1414,1416,1417,1420],{},[92,1415,550],{}," prints the same list, regenerated from whatever is ",[619,1418,1419],{},"actually"," bound:",[196,1422,1425],{"className":1423,"code":1424,"language":201,"meta":202},[199],"keys — submit\u002Fsteer enter · follow-up alt+enter · abort\u002Fclear escape · clear-or-quit ctrl+c ·\nquit ctrl+d · copy last ctrl+x · paste image ctrl+v · model ctrl+l · effort shift+tab ·\nunqueue alt+up · word left alt+left · word right alt+right · kill word ctrl+w · yank ctrl+y ·\n$EDITOR ctrl+g · newline shift+enter · scroll pageup · follow tail ctrl+end ·\nmouse → terminal ctrl+o · @ file · \u002F command · ! shell (!! shares output) · ↑\u002F↓ history · Esc abort\n",[92,1426,1424],{"__ignoreMap":202},[604,1428,1430],{"id":1429},"rebinding","Rebinding",[88,1432,1433,1434,1436,1437,1440,1441,1444],{},"Write ",[92,1435,528],{}," under ",[92,1438,1439],{},"LOCAC_HOME"," (",[92,1442,1443],{},"~\u002F.locac\u002Fkeybindings.json","). Each key is an action id;\neach value is a combo string or an array of them:",[196,1446,1450],{"className":1447,"code":1448,"language":1449,"meta":202,"style":202},"language-json shiki shiki-themes vitesse-dark","{\n  \"tui.input.submit\": [\"ctrl+enter\"],\n  \"tui.input.newLine\": [\"enter\"],\n  \"app.mouse.toggle\": [\"ctrl+t\", \"alt+m\"]\n}\n","json",[92,1451,1452,1460,1491,1513,1548],{"__ignoreMap":202},[1453,1454,1456],"span",{"class":1455,"line":29},"line",[1453,1457,1459],{"class":1458},"s_pn2","{\n",[1453,1461,1462,1466,1470,1473,1476,1479,1482,1486,1488],{"class":1455,"line":33},[1453,1463,1465],{"class":1464},"s6USN","  \"",[1453,1467,1469],{"class":1468},"sm68I","tui.input.submit",[1453,1471,1472],{"class":1464},"\"",[1453,1474,1475],{"class":1458},":",[1453,1477,1478],{"class":1458}," [",[1453,1480,1472],{"class":1481},"sNJcY",[1453,1483,1485],{"class":1484},"s7rlk","ctrl+enter",[1453,1487,1472],{"class":1481},[1453,1489,1490],{"class":1458},"],\n",[1453,1492,1493,1495,1498,1500,1502,1504,1506,1509,1511],{"class":1455,"line":41},[1453,1494,1465],{"class":1464},[1453,1496,1497],{"class":1468},"tui.input.newLine",[1453,1499,1472],{"class":1464},[1453,1501,1475],{"class":1458},[1453,1503,1478],{"class":1458},[1453,1505,1472],{"class":1481},[1453,1507,1508],{"class":1484},"enter",[1453,1510,1472],{"class":1481},[1453,1512,1490],{"class":1458},[1453,1514,1516,1518,1521,1523,1525,1527,1529,1532,1534,1537,1540,1543,1545],{"class":1455,"line":1515},4,[1453,1517,1465],{"class":1464},[1453,1519,1520],{"class":1468},"app.mouse.toggle",[1453,1522,1472],{"class":1464},[1453,1524,1475],{"class":1458},[1453,1526,1478],{"class":1458},[1453,1528,1472],{"class":1481},[1453,1530,1531],{"class":1484},"ctrl+t",[1453,1533,1472],{"class":1481},[1453,1535,1536],{"class":1458},",",[1453,1538,1539],{"class":1481}," \"",[1453,1541,1542],{"class":1484},"alt+m",[1453,1544,1472],{"class":1481},[1453,1546,1547],{"class":1458},"]\n",[1453,1549,1551],{"class":1455,"line":1550},5,[1453,1552,1553],{"class":1458},"}\n",[88,1555,1556],{},"The rules:",[784,1558,1559,1566,1593,1604,1607],{},[787,1560,1561,1562,1565],{},"A listed action's combos ",[184,1563,1564],{},"replace"," its defaults. Unlisted actions keep theirs.",[787,1567,1568,1569,246,1572,246,1575,1578,1579,1582,1583,1586,1587,1590,1591,106],{},"Combos are ",[92,1570,1571],{},"ctrl+",[92,1573,1574],{},"alt+",[92,1576,1577],{},"shift+"," in that fixed order, then the base key. ",[92,1580,1581],{},"alt"," is the meta\nmodifier. ",[92,1584,1585],{},"shift"," is only meaningful on named keys, so ",[92,1588,1589],{},"Y"," canonicalises to ",[92,1592,1403],{},[787,1594,1595,1596,1599,1600,1603],{},"An unknown action id or an unparseable combo is ",[184,1597,1598],{},"warned about and ignored",", never fatal. If\n",[619,1601,1602],{},"every"," combo for an action was invalid, the default is kept, so a typo can never silently unbind\nsomething.",[787,1605,1606],{},"Malformed JSON falls back to the full default keymap with a warning.",[787,1608,1609,1610,1612],{},"The file is read only from ",[92,1611,1439],{},", never from the repository under audit.",[88,1614,1615,1617,1618,1620],{},[92,1616,518],{}," re-reads the file mid-session, and ",[92,1619,550],{}," immediately reflects the new bindings.",[108,1622,1624],{"id":1623},"the-approval-overlay","The approval overlay",[88,1626,1627,1628,1630],{},"When the agent calls a dangerous tool and the run has no approval flag, the TUI parks the call and\nasks. The overlay works mid-run and takes ↑\u002F↓ + ",[92,1629,338],{}," or the letter shortcuts:",[113,1632,1633,1644],{},[116,1634,1635],{},[119,1636,1637,1640,1642],{},[122,1638,1639],{},"Option",[122,1641,951],{},[122,1643,712],{},[132,1645,1646,1658,1670],{},[119,1647,1648,1651,1655],{},[137,1649,1650],{},"Yes",[137,1652,1653],{},[92,1654,1403],{},[137,1656,1657],{},"Approve this one call",[119,1659,1660,1663,1667],{},[137,1661,1662],{},"No",[137,1664,1665],{},[92,1666,1407],{},[137,1668,1669],{},"Deny it. The model is told, and continues",[119,1671,1672,1675,1679],{},[137,1673,1674],{},"Always (don't ask again)",[137,1676,1677],{},[92,1678,104],{},[137,1680,1681],{},"Approve it and stop asking for that tool this session",[88,1683,1684],{},"The prompt shows the actual command, script or code in full, not truncated to a preview,\nbecause approving a command you cannot fully see is not approval.",[88,1686,1687,1688,246,1691,1694,1695,1697],{},"Off a TTY there is no overlay, and with no ",[92,1689,1690],{},"--yes",[92,1692,1693],{},"--auto"," the call is simply denied.\n",[104,1696,49],{"href":47}," covers the full approval matrix.",[108,1699,1701],{"id":1700},"mouse","Mouse",[88,1703,1704],{},"The fullscreen renderer has no native scrollback, so it turns on mouse tracking (button events,\nmotion-while-held, and SGR coordinates). That gives you wheel scrolling that the transcript\nactually scrolls, instead of the terminal translating the wheel into ↑\u002F↓ keys that the editor eats\nas history.",[88,1706,1707,1708,1711],{},"The cost is that the terminal itself no longer sees the mouse. locac therefore implements what it\ntook: ",[184,1709,1710],{},"drag to select, and the selection is copied on release."," Copying goes out both as OSC 52\n(the only path that reaches the clipboard of the machine you are sitting at when locac runs over\nSSH) and through the local clipboard command, because several terminals, VS Code's among them,\nrefuse OSC 52 writes by default.",[88,1713,1714,1715,1717,1718,1720,1721,1723],{},"For the one thing that cannot be done in-band, your terminal's own right-click menu, ",[92,1716,1020],{}," or\n",[92,1719,536],{}," hands the mouse back. It is a typed command as well as a keybinding on purpose: some hosts\nswallow ",[92,1722,1020],{}," (VS Code binds it to Open File), and a mode reachable only through a stolen key is\nnot reachable.",[88,1725,1726],{},"Both tracking modes are always toggled together, and are paired off on exit so your terminal's\nselection works again afterwards.",[108,1728,1730],{"id":1729},"next","Next",[88,1732,1733,1735,1736,1738,1739,1741,1742,1104,1744,1104,1746,1749],{},[104,1734,36],{"href":35}," covers every built-in endpoint the ",[92,1737,366],{}," switcher can select, and\n",[104,1740,18],{"href":17}," documents ",[92,1743,1248],{},[92,1745,1245],{},[92,1747,1748],{},"NO_COLOR"," and every\nother variable the TUI reads.",[1751,1752,1753],"style",{},"html pre.shiki code .s_pn2, html code.shiki .s_pn2{--shiki-default:#666666}html pre.shiki code .s6USN, html code.shiki .s6USN{--shiki-default:#B8A96577}html pre.shiki code .sm68I, html code.shiki .sm68I{--shiki-default:#B8A965}html pre.shiki code .sNJcY, html code.shiki .sNJcY{--shiki-default:#C98A7D77}html pre.shiki code .s7rlk, html code.shiki .s7rlk{--shiki-default:#C98A7D}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);}",{"title":202,"searchDepth":41,"depth":41,"links":1755},[1756,1757,1758,1764,1768,1771,1772,1773],{"id":110,"depth":33,"text":111},{"id":190,"depth":33,"text":191},{"id":324,"depth":33,"text":325,"children":1759},[1760,1762],{"id":606,"depth":41,"text":1761},"\u002Fcontext and \u002Fcompact",{"id":653,"depth":41,"text":1763},"\u002Fresume and \u002Ftree",{"id":693,"depth":33,"text":694,"children":1765},[1766,1767],{"id":830,"depth":41,"text":831},{"id":902,"depth":41,"text":903},{"id":932,"depth":33,"text":933,"children":1769},[1770],{"id":1429,"depth":41,"text":1430},{"id":1623,"depth":33,"text":1624},{"id":1700,"depth":33,"text":1701},{"id":1729,"depth":33,"text":1730},"The fullscreen and inline renderers, every slash command, every default keybinding, the approval overlay, mouse selection, and how to rebind any of it from keybindings.json.","md",{},true,{"title":71,"description":1774},"docs\u002Ftui","_GQ2e5L-qngjNgaabVD-BRf06QCBBeKpkcHjKZiXDDs",1786794387680]