Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
c62f3dc
fix: sanitize API keys/moodels to prevent 400/401, optimize workflow
Sep 19, 2026
0975e2b
Update multi-platform.yml
datlun2k11-pixel Sep 19, 2026
98f711d
fix: bump geode 5.9.0 -> 5.10.1 and set explicit Win64/MacOS targets
Sep 19, 2026
6242f95
ci: allow iOS to continue-on-error (bindings CCKeyboardDispatcher bug…
Sep 19, 2026
90adb7a
fix(ios): patch CCKeyboardDispatcher bindings bug for SDK 5.10.1
Sep 19, 2026
7025284
fix(ios): patch Modify.hpp to handle empty AddressInline_ (true fix)
Sep 19, 2026
7492d12
Merge branch 'entity12208:main' into main
datlun2k11-pixel Oct 2, 2026
6ad3dce
fix(provider): flush stale key on Test, refresh Groq presets, thinkin…
datlun2k11-pixel Oct 2, 2026
9294180
feat(models): update Gemini to 3.8-flash/3.5-flash-lite/3.1-pro/gemma…
datlun2k11-pixel Oct 4, 2026
a50ee10
feat(models): refresh Claude to sonnet-5-5/opus-5-5, OpenAI to GPT-6 …
datlun2k11-pixel Oct 4, 2026
40a851a
fix(auth): sanitize API key on save, validate with cleaned key, show …
datlun2k11-pixel Oct 4, 2026
ca5af96
Merge branch 'entity12208:main' into main
datlun2k11-pixel Oct 4, 2026
b59ddd9
fix(custom): allow no-key custom providers in preflights
datlun2k11-pixel Oct 4, 2026
4bd28db
fix(overlay): Test connection no longer undoes model preset pick
datlun2k11-pixel Oct 4, 2026
913df03
fix(security): stop logging API key fragments
datlun2k11-pixel Oct 4, 2026
186844b
fix(models): self-heal retired defaults so default always matches preset
datlun2k11-pixel Oct 4, 2026
cbb0dcb
fix(settings): collapse macOS paste+Return double-insert in text fields
datlun2k11-pixel Oct 4, 2026
c3d9d50
feat(settings): add Paste button to text fields on mobile (iOS/Android)
datlun2k11-pixel Oct 4, 2026
d5238c3
feat(settings): add Show/Hide toggle for masked API key fields
datlun2k11-pixel Oct 4, 2026
309f2e1
feat(overlay): add Show/Hide toggle for masked key fields in Settings
datlun2k11-pixel Oct 4, 2026
8a2be8c
feat(overlay): add Paste button to settings fields on mobile
datlun2k11-pixel Oct 4, 2026
99af376
feat(overlay): add big close (X) button on mobile fullscreen panel
datlun2k11-pixel Oct 4, 2026
97417f1
feat(mobile): draggable AI bubble, auto-dim after 5s idle, hidden in …
datlun2k11-pixel Oct 4, 2026
ca36581
feat(mobile): round 56px AI bubble with hold-0.1s to drag
datlun2k11-pixel Oct 4, 2026
0f83054
feat(mobile): native cocos AI bubble with direct touch drag (Eclipse-…
datlun2k11-pixel Oct 4, 2026
78a6004
fix(mobile): missing SceneManager include, ambiguous CCPoint init
datlun2k11-pixel Oct 4, 2026
b5926b9
fix(mobile): remove SceneManager dependency (removed in Geode 5.10)
datlun2k11-pixel Oct 4, 2026
af93717
fix(mobile): fully hide AI bubble while in level
datlun2k11-pixel Oct 4, 2026
12e6f17
fix(mobile): bigger, easier bubble with instant drag
datlun2k11-pixel Oct 4, 2026
76ffc85
fix(mobile): shrink AI bubble to ~62px with tighter hit-zone
datlun2k11-pixel Oct 4, 2026
74eea73
Merge branch 'entity12208:main' into main
datlun2k11-pixel Oct 6, 2026
070c9d4
fix(review): cancel-safe bubble touch, migrate only outdated default …
datlun2k11-pixel Oct 6, 2026
d5b05d9
fix eas/sim/bubble
datlun2k11-pixel Oct 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 17 additions & 6 deletions .github/workflows/multi-platform.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,11 @@ name: Build Geode Mod
on:
workflow_dispatch:
push:
branches:
- "**"
branches: [main, master]
pull_request:

permissions:
contents: read

jobs:
build:
Expand All @@ -14,27 +17,29 @@ jobs:
config:
- name: Windows
os: windows-latest

target: Win64
- name: macOS
os: macos-latest

target: MacOS
- name: iOS
os: macos-latest
target: iOS

- name: Android32
os: ubuntu-latest
target: Android32

- name: Android64
os: ubuntu-latest
target: Android64

name: ${{ matrix.config.name }}
runs-on: ${{ matrix.config.os }}
timeout-minutes: 30
continue-on-error: ${{ matrix.config.target == 'iOS' }}

steps:
- uses: actions/checkout@v4
with:
submodules: recursive

- name: Build the mod
uses: geode-sdk/build-geode-mod@main
Expand All @@ -47,12 +52,18 @@ jobs:
name: Package builds
runs-on: ubuntu-latest
needs: ['build']
if: always()

steps:
- uses: actions/download-artifact@v4
with:
path: artifacts

- uses: geode-sdk/build-geode-mod/combine@main
id: build

- uses: actions/upload-artifact@v4
with:
name: Build Output
path: ${{ steps.build.outputs.build-output }}
if-no-files-found: warn
42 changes: 41 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ else()
endif()
set(CMAKE_CXX_VISIBILITY_PRESET hidden)

project(EditorAI VERSION 2.1.9)
project(EditorAI VERSION 2.1.10)

file(GLOB_RECURSE SOURCES CONFIGURE_DEPENDS src/*.cpp)
add_library(${PROJECT_NAME} SHARED ${SOURCES})
Expand All @@ -28,6 +28,46 @@ endif()

add_subdirectory($ENV{GEODE_SDK} ${CMAKE_CURRENT_BINARY_DIR}/geode)

# Workaround for SDK 5.10.1 iOS bindings bug: CCKeyboardDispatcher modify has empty address
# Codegen generates `GEODE_APPLY_MODIFY_FOR_CONSTRUCTOR(, Default, ...)` which expands to
# `static auto address = ;` -> error: expected expression on iOS.
# Fix Modify.hpp to handle empty AddressInline_ as 0, plus patch generated file.
if (IOS OR "${CMAKE_SYSTEM_NAME}" STREQUAL "iOS")
# Configure-time: patch Modify.hpp directly (present before codegen)
set(_modify_hpp "$ENV{GEODE_SDK}/loader/include/Geode/modify/Modify.hpp")
if (EXISTS "${_modify_hpp}")
file(READ "${_modify_hpp}" _mod_content)
if (_mod_content MATCHES "static auto address = AddressInline_;")
string(REPLACE "static auto address = AddressInline_;" "static auto address = (AddressInline_ + 0);" _mod_content "${_mod_content}")
file(WRITE "${_modify_hpp}" "${_mod_content}")
message(STATUS "Patched Modify.hpp for iOS empty address bug (configure-time)")
endif()
endif()
# Also try patching already-generated CCKeyboardDispatcher.hpp if present
set(_ios_patch_file "${CMAKE_CURRENT_BINARY_DIR}/bindings/bindings/Geode/modify/CCKeyboardDispatcher.hpp")
if (EXISTS "${_ios_patch_file}")
file(READ "${_ios_patch_file}" _ios_content)
string(REPLACE "GEODE_APPLY_MODIFY_FOR_CONSTRUCTOR(, Default, cocos2d::CCKeyboardDispatcher, )" "// PATCHED IOS: constructor disabled" _ios_content "${_ios_content}")
string(REPLACE "GEODE_APPLY_MODIFY_FOR_DESTRUCTOR(, Default, cocos2d::CCKeyboardDispatcher)" "// PATCHED IOS: destructor disabled" _ios_content "${_ios_content}")
file(WRITE "${_ios_patch_file}" "${_ios_content}")
message(STATUS "Patched CCKeyboardDispatcher.hpp for iOS (configure-time)")
endif()
# Build-time patch via custom target (runs every build, after Codegen)
add_custom_target(patch-ios-bindings ALL
COMMAND ${CMAKE_COMMAND} -P "${CMAKE_CURRENT_SOURCE_DIR}/cmake/patch-ios.cmake"
COMMENT "Patching iOS bindings CCKeyboardDispatcher if needed"
VERBATIM
)
add_dependencies(${PROJECT_NAME} patch-ios-bindings)
# Ensure Codegen runs before patch (patch must be after Codegen generates the file)
if (TARGET GeodeCodegen)
add_dependencies(patch-ios-bindings GeodeCodegen)
endif()
if (TARGET codegen)
add_dependencies(patch-ios-bindings codegen)
endif()
endif()

# ImGui overlay — the mod's primary UI (E key on desktop, floating bubble
# on mobile). Platforms without it fall back to the classic cocos popups
# (src/overlay.cpp compiles to nothing; main.cpp re-adds the AI button).
Expand Down
33 changes: 33 additions & 0 deletions cmake/patch-ios.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Patch for iOS SDK 5.10.1 bug: CCKeyboardDispatcher modify has empty AddressInline_
# Fix 1: Patch Modify.hpp to handle empty AddressInline_ (static auto address = ; -> compile error)
# Change `static auto address = AddressInline_;` to `static auto address = (AddressInline_ + 0);`
# which evaluates to 0 when empty and to the address otherwise.

# Try to patch the SDK's Modify.hpp if it exists (configure-time and build-time)
foreach(_sdk_path IN ITEMS "$ENV{GEODE_SDK}" "${CMAKE_CURRENT_SOURCE_DIR}/geode-sdk-clone" "/Users/runner/work/EditorAI-optimized/EditorAI-optimized/geode-sdk-clone")
set(_mod_file "${_sdk_path}/loader/include/Geode/modify/Modify.hpp")
if(EXISTS "${_mod_file}")
file(READ "${_mod_file}" _content)
if(_content MATCHES "static auto address = AddressInline_;")
string(REPLACE "static auto address = AddressInline_;" "static auto address = (AddressInline_ + 0);" _content "${_content}")
file(WRITE "${_mod_file}" "${_content}")
message(STATUS "Patched Modify.hpp at ${_mod_file} for iOS empty address bug")
endif()
endif()
endforeach()

# Fix 2: Also patch the generated CCKeyboardDispatcher.hpp if it already exists (post-codegen)
set(_patch_file "${CMAKE_CURRENT_BINARY_DIR}/bindings/bindings/Geode/modify/CCKeyboardDispatcher.hpp")
if(NOT EXISTS "${_patch_file}")
set(_patch_file "${CMAKE_BINARY_DIR}/bindings/bindings/Geode/modify/CCKeyboardDispatcher.hpp")
endif()
if(EXISTS "${_patch_file}")
file(READ "${_patch_file}" _c)
string(FIND "${_c}" "GEODE_APPLY_MODIFY_FOR_CONSTRUCTOR(, Default, cocos2d::CCKeyboardDispatcher" _found)
if(NOT _found EQUAL -1)
string(REPLACE "GEODE_APPLY_MODIFY_FOR_CONSTRUCTOR(, Default, cocos2d::CCKeyboardDispatcher, )" "// PATCHED IOS: constructor disabled" _c "${_c}")
string(REPLACE "GEODE_APPLY_MODIFY_FOR_DESTRUCTOR(, Default, cocos2d::CCKeyboardDispatcher)" "// PATCHED IOS: destructor disabled" _c "${_c}")
file(WRITE "${_patch_file}" "${_c}")
message(STATUS "Patched ${_patch_file} for iOS")
endif()
endif()
68 changes: 37 additions & 31 deletions mod.json
Original file line number Diff line number Diff line change
Expand Up @@ -199,28 +199,34 @@
"type": "title",
"name": "Providers"
},
"gemini-model": {
"type": "string",
"default": "gemini-3-flash",
"name": "Gemini Model",
"description": "Use <cg>Fetch model list</c> in the in-mod Provider tab to pull the live list, or type any Gemini model id."
},
"gemini-model": {
"type": "string",
"default": "gemini-3.8-flash",
"name": "Gemini Model",
"description": "Use <cg>Fetch model list</c> in the in-mod Provider tab to pull the live list, or type any Gemini model id."
},
"gemini-api-key": {
"type": "string",
"default": "",
"name": "Gemini API Key",
"description": "From Google AI Studio. Stays on this device in Geode save data."
},
"disable-thinking": {
"type": "bool",
"default": true,
"name": "Disable Thinking",
"description": "For Gemini Flash models, skip the thinking/reasoning phase for much faster (but shallower) answers. Pro models cannot disable thinking and ignore this. Gemini only; takes effect on the next generation."
},
"_provider-claude": {
Comment thread
greptile-apps[bot] marked this conversation as resolved.
"type": "title",
"name": "Provider — Claude"
},
"claude-model": {
"type": "string",
"default": "claude-sonnet-4-6",
"name": "Claude Model",
"description": "Use <cg>Fetch model list</c> in the in-mod Provider tab to pull the live list, or type any Claude model id."
},
"claude-model": {
"type": "string",
"default": "claude-sonnet-5-5",
"name": "Claude Model",
"description": "Use <cg>Fetch model list</c> in the in-mod Provider tab to pull the live list, or type any Claude model id."
},
"claude-api-key": {
"type": "string",
"default": "",
Expand All @@ -231,12 +237,12 @@
"type": "title",
"name": "Provider — OpenAI"
},
"openai-model": {
"type": "string",
"default": "gpt-4o",
"name": "OpenAI Model",
"description": "Use <cg>Fetch model list</c> in the in-mod Provider tab to pull the live list, or type any OpenAI model id."
},
"openai-model": {
"type": "string",
"default": "gpt-6-astra",
"name": "OpenAI Model",
"description": "Use <cg>Fetch model list</c> in the in-mod Provider tab to pull the live list, or type any OpenAI model id."
},
"openai-api-key": {
"type": "string",
"default": "",
Expand All @@ -263,12 +269,12 @@
"type": "title",
"name": "Provider — Hugging Face"
},
"huggingface-model": {
"type": "string",
"default": "meta-llama/Llama-3.1-8B-Instruct",
"name": "HF Model",
"description": "Repo-style id, e.g. meta-llama/Llama-3.1-8B-Instruct."
},
"huggingface-model": {
"type": "string",
"default": "meta-llama/Llama-3.1-8B-Instruct",
"name": "HF Model",
"description": "Repo-style id, e.g. meta-llama/Llama-3.1-8B-Instruct."
},
"huggingface-api-key": {
"type": "string",
"default": "",
Expand All @@ -279,12 +285,12 @@
"type": "title",
"name": "Provider — OpenRouter"
},
"openrouter-model": {
"type": "string",
"default": "google/gemini-2.5-flash",
"name": "OpenRouter Model",
"description": "Provider/model slug, e.g. google/gemini-2.5-flash or anthropic/claude-3.5-sonnet."
},
"openrouter-model": {
"type": "string",
"default": "google/gemini-3.8-flash",
"name": "OpenRouter Model",
"description": "Provider/model slug, e.g. google/gemini-3.8-flash or anthropic/claude-3.5-sonnet."
},
"openrouter-api-key": {
"type": "string",
"default": "",
Expand Down Expand Up @@ -313,7 +319,7 @@
},
"groq-model": {
"type": "string",
"default": "llama-3.3-70b-versatile",
"default": "openai/gpt-oss-120b",
"name": "Groq Model",
"description": "Pick a preset or type any Groq model id in the in-mod Provider tab. Use <cg>Fetch model list</c> to pull the live list."
},
Expand Down
Loading
Loading