diff --git a/src/agent/nim.cfg b/src/agent/nim.cfg index 4124d00..d26c6e1 100644 --- a/src/agent/nim.cfg +++ b/src/agent/nim.cfg @@ -4,5 +4,5 @@ --opt:size --passL:"-s" # Strip symbols, such as sensitive function names -d:CONFIGURATION="PLACEHOLDERAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPLACEHOLDER" --d:MODULES="12" +-d:MODULES="255" -o:"/mnt/c/Users/jakob/Documents/Projects/conquest/bin/monarch.x64.exe" \ No newline at end of file diff --git a/src/client/views/console.nim b/src/client/views/console.nim index a590b11..a1a5a38 100644 --- a/src/client/views/console.nim +++ b/src/client/views/console.nim @@ -60,6 +60,9 @@ proc Console*(agent: UIAgent): ConsoleComponent = #[ Text input callback function for managing console history and autocompletion ]# +var currentCompletionIndex: int = -1 +var lastMatches: seq[string] = @[] + proc callback(data: ptr ImGuiInputTextCallbackData): cint {.cdecl.} = let component = cast[ConsoleComponent](data.UserData) @@ -108,8 +111,61 @@ proc callback(data: ptr ImGuiInputTextCallbackData): cint {.cdecl.} = return 0 of ImGui_InputTextFlags_CallbackCompletion.int32: - # Handle Tab-autocompletion - discard + # Handle Tab-autocompletion for agent commands + let commands = getCommands(component.agent.modules).mapIt(it.name & " ") & @["help "] + + # Get the word to complete + let inputEndPos = data.CursorPos + var inputStartPos = inputEndPos + + while inputStartPos > 0: + let c = cast[ptr UncheckedArray[char]](data.Buf)[inputStartPos - 1] + if c in [' ', '\t', ',', ';']: + break + dec inputStartPos + + let inputLen = inputEndPos - inputStartPos + var currentWord = newString(inputLen) + for i in 0.. complete common prefix + else: + var prefixLen = inputLen + + while prefixLen < matches[0].len(): + let c = matches[0][prefixLen] + var allMatch = true + + for i in 1 ..< matches.len(): + if prefixLen >= matches[i].len() or matches[i][prefixLen] != c: + allMatch = false + break + + if not allMatch: + break + + inc prefixLen + + if prefixLen > inputLen: + data.ImGuiInputTextCallbackData_DeleteChars(inputStartPos.cint, inputLen.cint) + data.ImGuiInputTextCallbackData_InsertChars(data.CursorPos, matches[0][0..