From f3747a7581e84746b5e3320b8f6e2ac2b494639e Mon Sep 17 00:00:00 2001 From: Patedam Date: Wed, 22 Jul 2026 17:12:08 -0400 Subject: [PATCH] fixed some bugs for romeo --- Juliet/include/Core/Common/String.h | 10 ++-- Romeo/docs/overview.md | 73 +++++++++++++++++++++++++++- Romeo/docs/romeo.db | Bin 118828 -> 125237 bytes Romeo/src/AiGenerator.cpp | 18 +++---- Romeo/src/JsonParser.cpp | 25 +++++++--- Romeo/src/MarkdownGenerator.cpp | 53 ++++++++++++++++++-- Romeo/src/main.cpp | 31 +++++++++--- 7 files changed, 177 insertions(+), 33 deletions(-) diff --git a/Juliet/include/Core/Common/String.h b/Juliet/include/Core/Common/String.h index ec18cef..b84d519 100644 --- a/Juliet/include/Core/Common/String.h +++ b/Juliet/include/Core/Common/String.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include #include @@ -67,12 +68,9 @@ namespace Juliet size_t length = 0; if (str) { - while (char ch = *str) + while (*str) { - if ((ch & 0xC0) != 0x80) - { - ++length; - } + ++length; ++str; } } @@ -89,7 +87,7 @@ namespace Juliet { String result = {}; result.Data = const_cast(str); - result.Size = StringLength(str); + result.Size = str ? strlen(str) : 0; return result; } diff --git a/Romeo/docs/overview.md b/Romeo/docs/overview.md index b302c0a..019a23a 100644 --- a/Romeo/docs/overview.md +++ b/Romeo/docs/overview.md @@ -32,4 +32,75 @@ This is an auto-generated index of all C++ sources in the workspace. - [C:\Dev\Classified\Juliet\Juliet\include\Core\Logging\LogManager](C__Dev_Classified_Juliet_Juliet_include_Core_Logging_LogManager.md) - [C:\Dev\Classified\Juliet\Juliet\src\Core\Math\MathRound](C__Dev_Classified_Juliet_Juliet_src_Core_Math_MathRound.md) - [C:\Dev\Classified\Juliet\Juliet\include\Core\Memory\Allocator](C__Dev_Classified_Juliet_Juliet_include_Core_Memory_Allocator.md) -- [C:\Dev\Classified\Juliet\Juliet\include\Core\Memory\MemoryArena](C__Dev_Classified_Juliet_Juliet_include_Co \ No newline at end of file +- [C:\Dev\Classified\Juliet\Juliet\include\Core\Memory\MemoryArena](C__Dev_Classified_Juliet_Juliet_include_Core_Memory_MemoryArena.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Core\Memory\MemoryArenaDebug](C__Dev_Classified_Juliet_Juliet_include_Core_Memory_MemoryArenaDebug.md) +- [C:\Dev\Classified\Juliet\Juliet\src\Core\Memory\MemoryArenaTests](C__Dev_Classified_Juliet_Juliet_src_Core_Memory_MemoryArenaTests.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Core\Memory\ScratchArena](C__Dev_Classified_Juliet_Juliet_include_Core_Memory_ScratchArena.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Core\Networking\NetworkPacket](C__Dev_Classified_Juliet_Juliet_include_Core_Networking_NetworkPacket.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Core\Networking\Socket](C__Dev_Classified_Juliet_Juliet_include_Core_Networking_Socket.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Core\Networking\TcpListener](C__Dev_Classified_Juliet_Juliet_include_Core_Networking_TcpListener.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Core\Networking\TcpSocket](C__Dev_Classified_Juliet_Juliet_include_Core_Networking_TcpSocket.md) +- [C:\Dev\Classified\Juliet\Juliet\src\Core\Networking\Win32\Win32SocketPlatformImpl](C__Dev_Classified_Juliet_Juliet_src_Core_Networking_Win32_Win32SocketPlatformImpl.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Engine\Debug\MemoryDebugger](C__Dev_Classified_Juliet_Juliet_include_Engine_Debug_MemoryDebugger.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Engine\Engine](C__Dev_Classified_Juliet_Juliet_include_Engine_Engine.md) +- [C:\Dev\Classified\Juliet\Juliet\src\Graphics\D3D12\AgilitySDK\d3dx12\d3dx12_property_format_table](C__Dev_Classified_Juliet_Juliet_src_Graphics_D3D12_AgilitySDK_d3dx12_d3dx12_property_format_table.md) +- [C:\Dev\Classified\Juliet\Juliet\src\Graphics\D3D12\D3D12Buffer](C__Dev_Classified_Juliet_Juliet_src_Graphics_D3D12_D3D12Buffer.md) +- [C:\Dev\Classified\Juliet\Juliet\src\Graphics\D3D12\D3D12CommandList](C__Dev_Classified_Juliet_Juliet_src_Graphics_D3D12_D3D12CommandList.md) +- [C:\Dev\Classified\Juliet\Juliet\src\Graphics\D3D12\D3D12Common](C__Dev_Classified_Juliet_Juliet_src_Graphics_D3D12_D3D12Common.md) +- [C:\Dev\Classified\Juliet\Juliet\src\Graphics\D3D12\D3D12DescriptorHeap](C__Dev_Classified_Juliet_Juliet_src_Graphics_D3D12_D3D12DescriptorHeap.md) +- [C:\Dev\Classified\Juliet\Juliet\src\Graphics\D3D12\D3D12GraphicsDevice](C__Dev_Classified_Juliet_Juliet_src_Graphics_D3D12_D3D12GraphicsDevice.md) +- [C:\Dev\Classified\Juliet\Juliet\src\Graphics\D3D12\D3D12GraphicsPipeline](C__Dev_Classified_Juliet_Juliet_src_Graphics_D3D12_D3D12GraphicsPipeline.md) +- [C:\Dev\Classified\Juliet\Juliet\src\Graphics\D3D12\D3D12InternalTests](C__Dev_Classified_Juliet_Juliet_src_Graphics_D3D12_D3D12InternalTests.md) +- [C:\Dev\Classified\Juliet\Juliet\src\Graphics\D3D12\D3D12RenderPass](C__Dev_Classified_Juliet_Juliet_src_Graphics_D3D12_D3D12RenderPass.md) +- [C:\Dev\Classified\Juliet\Juliet\src\Graphics\D3D12\D3D12Shader](C__Dev_Classified_Juliet_Juliet_src_Graphics_D3D12_D3D12Shader.md) +- [C:\Dev\Classified\Juliet\Juliet\src\Graphics\D3D12\D3D12SwapChain](C__Dev_Classified_Juliet_Juliet_src_Graphics_D3D12_D3D12SwapChain.md) +- [C:\Dev\Classified\Juliet\Juliet\src\Graphics\D3D12\D3D12Synchronization](C__Dev_Classified_Juliet_Juliet_src_Graphics_D3D12_D3D12Synchronization.md) +- [C:\Dev\Classified\Juliet\Juliet\src\Graphics\D3D12\D3D12Texture](C__Dev_Classified_Juliet_Juliet_src_Graphics_D3D12_D3D12Texture.md) +- [C:\Dev\Classified\Juliet\Juliet\src\Graphics\D3D12\D3D12Utils](C__Dev_Classified_Juliet_Juliet_src_Graphics_D3D12_D3D12Utils.md) +- [C:\Dev\Classified\Juliet\Juliet\src\Graphics\DebugDisplayRenderer](C__Dev_Classified_Juliet_Juliet_src_Graphics_DebugDisplayRenderer.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Graphics\Graphics](C__Dev_Classified_Juliet_Juliet_include_Graphics_Graphics.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Graphics\ImGuiRenderer](C__Dev_Classified_Juliet_Juliet_include_Graphics_ImGuiRenderer.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Graphics\Mesh](C__Dev_Classified_Juliet_Juliet_include_Graphics_Mesh.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Graphics\MeshRenderer](C__Dev_Classified_Juliet_Juliet_include_Graphics_MeshRenderer.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Graphics\SkyboxRenderer](C__Dev_Classified_Juliet_Juliet_include_Graphics_SkyboxRenderer.md) +- [C:\Dev\Classified\Juliet\Juliet\src\UnitTest\Container\VectorUnitTest](C__Dev_Classified_Juliet_Juliet_src_UnitTest_Container_VectorUnitTest.md) +- [C:\Dev\Classified\Juliet\Juliet\src\UnitTest\RunUnitTests](C__Dev_Classified_Juliet_Juliet_src_UnitTest_RunUnitTests.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Core\Application\IApplication](C__Dev_Classified_Juliet_Juliet_include_Core_Application_IApplication.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Core\Common\CoreTypes](C__Dev_Classified_Juliet_Juliet_include_Core_Common_CoreTypes.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Core\Common\CRC32](C__Dev_Classified_Juliet_Juliet_include_Core_Common_CRC32.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Core\Common\EnumUtils](C__Dev_Classified_Juliet_Juliet_include_Core_Common_EnumUtils.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Core\Common\NonCopyable](C__Dev_Classified_Juliet_Juliet_include_Core_Common_NonCopyable.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Core\Common\NonMovable](C__Dev_Classified_Juliet_Juliet_include_Core_Common_NonMovable.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Core\Common\NonNullPtr](C__Dev_Classified_Juliet_Juliet_include_Core_Common_NonNullPtr.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Core\Common\Singleton](C__Dev_Classified_Juliet_Juliet_include_Core_Common_Singleton.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Core\HAL\DynLib\DynamicLibrary](C__Dev_Classified_Juliet_Juliet_include_Core_HAL_DynLib_DynamicLibrary.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Core\HAL\Keyboard\Keyboard](C__Dev_Classified_Juliet_Juliet_include_Core_HAL_Keyboard_Keyboard.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Core\HAL\Keyboard\KeyCode](C__Dev_Classified_Juliet_Juliet_include_Core_HAL_Keyboard_KeyCode.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Core\HAL\Keyboard\ScanCode](C__Dev_Classified_Juliet_Juliet_include_Core_HAL_Keyboard_ScanCode.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Core\HAL\Mouse\Mouse](C__Dev_Classified_Juliet_Juliet_include_Core_HAL_Mouse_Mouse.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Core\JulietInit](C__Dev_Classified_Juliet_Juliet_include_Core_JulietInit.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Core\Logging\LogTypes](C__Dev_Classified_Juliet_Juliet_include_Core_Logging_LogTypes.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Core\Main](C__Dev_Classified_Juliet_Juliet_include_Core_Main.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Core\Math\MathUtils](C__Dev_Classified_Juliet_Juliet_include_Core_Math_MathUtils.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Core\Math\Matrix](C__Dev_Classified_Juliet_Juliet_include_Core_Math_Matrix.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Core\Math\Shape](C__Dev_Classified_Juliet_Juliet_include_Core_Math_Shape.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Core\Math\Vector](C__Dev_Classified_Juliet_Juliet_include_Core_Math_Vector.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Core\Memory\Utils](C__Dev_Classified_Juliet_Juliet_include_Core_Memory_Utils.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Core\Networking\IPAddress](C__Dev_Classified_Juliet_Juliet_include_Core_Networking_IPAddress.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Core\Networking\SocketHandle](C__Dev_Classified_Juliet_Juliet_include_Core_Networking_SocketHandle.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Core\Thread\Mutex](C__Dev_Classified_Juliet_Juliet_include_Core_Thread_Mutex.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Core\Thread\Thread](C__Dev_Classified_Juliet_Juliet_include_Core_Thread_Thread.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Engine\Class](C__Dev_Classified_Juliet_Juliet_include_Engine_Class.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Graphics\Camera](C__Dev_Classified_Juliet_Juliet_include_Graphics_Camera.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Graphics\Colors](C__Dev_Classified_Juliet_Juliet_include_Graphics_Colors.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Graphics\DebugDisplay](C__Dev_Classified_Juliet_Juliet_include_Graphics_DebugDisplay.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Graphics\GraphicsBuffer](C__Dev_Classified_Juliet_Juliet_include_Graphics_GraphicsBuffer.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Graphics\GraphicsConfig](C__Dev_Classified_Juliet_Juliet_include_Graphics_GraphicsConfig.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Graphics\GraphicsPipeline](C__Dev_Classified_Juliet_Juliet_include_Graphics_GraphicsPipeline.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Graphics\Lighting](C__Dev_Classified_Juliet_Juliet_include_Graphics_Lighting.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Graphics\PushConstants](C__Dev_Classified_Juliet_Juliet_include_Graphics_PushConstants.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Graphics\RenderPass](C__Dev_Classified_Juliet_Juliet_include_Graphics_RenderPass.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Graphics\Shader](C__Dev_Classified_Juliet_Juliet_include_Graphics_Shader.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Graphics\Texture](C__Dev_Classified_Juliet_Juliet_include_Graphics_Texture.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Graphics\VertexData](C__Dev_Classified_Juliet_Juliet_include_Graphics_VertexData.md) +- [C:\Dev\Classified\Juliet\Juliet\include\Juliet](C__Dev_Classified_Juliet_Juliet_include_Juliet.md) diff --git a/Romeo/docs/romeo.db b/Romeo/docs/romeo.db index b94bb75c929ab4449e406408988b868f3ad7c6f7..642bef7f1b2181b9497d392d8e4ae0343a85266f 100644 GIT binary patch delta 12998 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, bodyCap JULIET_DEBUG_PARAM("ShowBody")); - snprintf(showBodyBuf, bodyCap, "{\"name\":\"%.*s\"}", static_cast(modelName.Size), CStr(modelName)); - Juliet::String showBody = Juliet::WrapString(showBodyBuf); + int showLen = snprintf(showBodyBuf, bodyCap, "{\"name\":\"%.*s\"}", static_cast(modelName.Size), CStr(modelName)); + Juliet::String showBody = { showBodyBuf, static_cast(showLen > 0 ? showLen : 0) }; Juliet::String showResponse = {}; bool showSuccess = PostWithRetry(arena, host, port, ConstString("/api/show"), false, showBody, showResponse); @@ -148,8 +148,8 @@ namespace Romeo OutputDebugStringA("Romeo AI: Model not found. Pulling model...\n"); char* pullBodyBuf = Juliet::ArenaPushArray(arena, bodyCap + 32 JULIET_DEBUG_PARAM("PullBody")); - snprintf(pullBodyBuf, bodyCap + 32, "{\"name\":\"%.*s\",\"stream\":false}", static_cast(modelName.Size), CStr(modelName)); - Juliet::String pullBody = Juliet::WrapString(pullBodyBuf); + int pullLen = snprintf(pullBodyBuf, bodyCap + 32, "{\"name\":\"%.*s\",\"stream\":false}", static_cast(modelName.Size), CStr(modelName)); + Juliet::String pullBody = { pullBodyBuf, static_cast(pullLen > 0 ? pullLen : 0) }; Juliet::String pullResponse = {}; bool pullSuccess = PostWithRetry(arena, host, port, ConstString("/api/pull"), false, pullBody, pullResponse); @@ -225,7 +225,7 @@ namespace Romeo ); } - Juliet::String prompt = { promptBuf, static_cast(written) }; + Juliet::String prompt = { promptBuf, static_cast(written > 0 ? written : 0) }; Juliet::String escapedPrompt = Json_EscapeString(arena, prompt); // Try local Ollama @@ -236,7 +236,7 @@ namespace Romeo Juliet::String modelName = GetEnvironmentVar(arena, "ROMEO_LLM_MODEL"); if (modelName.Size == 0) { - modelName = ConstString("qwen3.5:4b"); + modelName = ConstString("qwen2.5-coder:1.5b"); } // Check / pull model if needed @@ -252,12 +252,12 @@ namespace Romeo size_t bodyCap = modelName.Size + escapedPrompt.Size + 256; char* bodyBuf = Juliet::ArenaPushArray(arena, bodyCap JULIET_DEBUG_PARAM("OllamaBody")); - snprintf(bodyBuf, bodyCap, - "{\"model\":\"%.*s\",\"prompt\":\"%.*s\",\"stream\":false,\"think\":true}", + int bodyLen = snprintf(bodyBuf, bodyCap, + "{\"model\":\"%.*s\",\"prompt\":\"%.*s\",\"stream\":false}", static_cast(modelName.Size), CStr(modelName), static_cast(escapedPrompt.Size), CStr(escapedPrompt) ); - Juliet::String body = Juliet::WrapString(bodyBuf); + Juliet::String body = { bodyBuf, static_cast(bodyLen > 0 ? bodyLen : 0) }; Juliet::String response = {}; diff --git a/Romeo/src/JsonParser.cpp b/Romeo/src/JsonParser.cpp index ea3d80f..fd4c202 100644 --- a/Romeo/src/JsonParser.cpp +++ b/Romeo/src/JsonParser.cpp @@ -431,15 +431,19 @@ namespace Romeo Assert(arena != nullptr); size_t escLen = 0; - const char* p = CStr(str); - const char* end = p + str.Size; + const unsigned char* p = reinterpret_cast(CStr(str)); + const unsigned char* end = p + str.Size; while (p < end) { - char c = *p; - if (c == '"' || c == '\\' || c == '\n' || c == '\r' || c == '\t') + unsigned char c = *p; + if (c == '"' || c == '\\' || c == '\n' || c == '\r' || c == '\t' || c == '\b' || c == '\f') { escLen += 2; } + else if (c < 32) + { + escLen += 6; + } else { escLen += 1; @@ -449,16 +453,23 @@ namespace Romeo char* buf = Juliet::ArenaPushArray(arena, escLen + 1 JULIET_DEBUG_PARAM("JsonEscapedStr")); char* dst = buf; - p = CStr(str); + p = reinterpret_cast(CStr(str)); while (p < end) { - char c = *p; + unsigned char c = *p; if (c == '"') { *dst++ = '\\'; *dst++ = '"'; } else if (c == '\\') { *dst++ = '\\'; *dst++ = '\\'; } else if (c == '\n') { *dst++ = '\\'; *dst++ = 'n'; } else if (c == '\r') { *dst++ = '\\'; *dst++ = 'r'; } else if (c == '\t') { *dst++ = '\\'; *dst++ = 't'; } - else { *dst++ = c; } + else if (c == '\b') { *dst++ = '\\'; *dst++ = 'b'; } + else if (c == '\f') { *dst++ = '\\'; *dst++ = 'f'; } + else if (c < 32) + { + snprintf(dst, 7, "\\u00%02x", static_cast(c)); + dst += 6; + } + else { *dst++ = static_cast(c); } p++; } *dst = '\0'; diff --git a/Romeo/src/MarkdownGenerator.cpp b/Romeo/src/MarkdownGenerator.cpp index e42ab43..cefd56f 100644 --- a/Romeo/src/MarkdownGenerator.cpp +++ b/Romeo/src/MarkdownGenerator.cpp @@ -110,11 +110,37 @@ namespace Romeo { const char* absPtr = CStr(absolutePath); const char* rootPtr = CStr(workspaceRoot); - if (_strnicmp(absPtr, rootPtr, workspaceRoot.Size) == 0) + size_t rootSize = workspaceRoot.Size; + + size_t matched = 0; + while (matched < rootSize && matched < absolutePath.Size) { - const char* rel = absPtr + workspaceRoot.Size; - size_t newSize = absolutePath.Size - workspaceRoot.Size; - if (*rel == '\\' || *rel == '/') { rel++; newSize--; } + char c1 = absPtr[matched]; + char c2 = rootPtr[matched]; + if (c1 == '/') + { + c1 = '\\'; + } + if (c2 == '/') + { + c2 = '\\'; + } + if (tolower(static_cast(c1)) != tolower(static_cast(c2))) + { + break; + } + matched++; + } + + if (matched == rootSize) + { + const char* rel = absPtr + rootSize; + size_t newSize = absolutePath.Size - rootSize; + if (*rel == '\\' || *rel == '/') + { + rel++; + newSize--; + } return { const_cast(rel), newSize }; } } @@ -845,6 +871,25 @@ namespace Romeo { EnsureDirectoryExists(CStr(docsDir)); + // Clean up any stale broken C__*.md files from prior runs + { + char searchPattern[512]; + snprintf(searchPattern, sizeof(searchPattern), "%s\\C__*.md", CStr(docsDir)); + + WIN32_FIND_DATAA findData; + HANDLE hFind = FindFirstFileA(searchPattern, &findData); + if (hFind != INVALID_HANDLE_VALUE) + { + do + { + char filePath[512]; + snprintf(filePath, sizeof(filePath), "%s\\%s", CStr(docsDir), findData.cFileName); + DeleteFileA(filePath); + } while (FindNextFileA(hFind, &findData) != 0); + FindClose(hFind); + } + } + char overviewPath[512]; snprintf(overviewPath, sizeof(overviewPath), "%s\\overview.md", CStr(docsDir)); diff --git a/Romeo/src/main.cpp b/Romeo/src/main.cpp index d9a6534..7e3ccfa 100644 --- a/Romeo/src/main.cpp +++ b/Romeo/src/main.cpp @@ -36,15 +36,32 @@ static Juliet::String GetWorkspaceRoot(Juliet::Arena* arena) char* buf = Juliet::ArenaPushArray(arena, base.Size + 1 JULIET_DEBUG_PARAM("WorkspaceRootPath")); memcpy(buf, base.Data, base.Size); buf[base.Size] = '\0'; - + + // Normalize slashes + for (size_t i = 0; i < base.Size; ++i) + { + if (buf[i] == '/') + { + buf[i] = '\\'; + } + } + + // Search for \bin to find workspace root + char* binPtr = strstr(buf, "\\bin"); + if (binPtr != nullptr) + { + *binPtr = '\0'; + return { buf, static_cast(binPtr - buf) }; + } + size_t count = 0; for (size_t i = base.Size; i > 0; --i) { size_t idx = i - 1; - if (buf[idx] == '\\' || buf[idx] == '/') + if (buf[idx] == '\\') { count++; - if (count == 3) + if (count == 2) { buf[idx] = '\0'; return { buf, idx }; @@ -332,15 +349,17 @@ int JulietMain(int argc, wchar_t** argv) &jobInfo, sizeof(jobInfo)); } - // Build a mutable command line buffer (CreateProcessA requires mutable string) + // Build a command line for cmd.exe /k so the console window remains open char cmdLine[600] = {}; - snprintf(cmdLine, sizeof(cmdLine), "\"%s\" serve", ollamaPath); + snprintf(cmdLine, sizeof(cmdLine), "cmd.exe /k \"\"%s\" serve\"", ollamaPath); STARTUPINFOA si = {}; si.cb = sizeof(si); + si.dwFlags = STARTF_USESHOWWINDOW; + si.wShowWindow = SW_SHOW; PROCESS_INFORMATION pi = {}; BOOL createRes = CreateProcessA( - ollamaPath, + nullptr, cmdLine, nullptr, nullptr,