Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
98 changes: 98 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,104 @@
# CMakeLists in this exact order for cmake to work correctly
cmake_minimum_required(VERSION 3.16)

option(MIMI_ENABLE_MICROPYTHON "Enable MicroPython integration" OFF)

# MicroPython helper (local clone to avoid component-manager object lib issues)
if(MIMI_ENABLE_MICROPYTHON)
set(MICROPY_HELPER_DIR "${CMAKE_CURRENT_LIST_DIR}/third_party/micropython-helper")
if(NOT EXISTS "${MICROPY_HELPER_DIR}")
find_package(Git QUIET)
if(GIT_FOUND)
execute_process(
COMMAND "${GIT_EXECUTABLE}" clone --depth 1 --recurse-submodules
https://github.com/mr9you/micropython-helper.git
"${MICROPY_HELPER_DIR}"
RESULT_VARIABLE _mimi_git_clone_rc
)
endif()
endif()
endif()
if(NOT MICROPY_BOARD)
set(MICROPY_BOARD "ESP32_GENERIC_S3")
endif()
if(MIMI_ENABLE_MICROPYTHON AND EXISTS "${MICROPY_HELPER_DIR}/mpy.cmake")
# Work around IDF 5.5 + micropython-helper 1.22.1: linking micropy_extmod_btree
# (OBJECT_LIBRARY) breaks ldgen when TARGET_FILE is expanded.
set(_mimi_extmod_cmake "${MICROPY_HELPER_DIR}/micropython/extmod/extmod.cmake")
if(EXISTS "${_mimi_extmod_cmake}")
file(READ "${_mimi_extmod_cmake}" _mimi_extmod_src)
string(REPLACE
"add_library(micropy_extmod_btree OBJECT"
"add_library(micropy_extmod_btree STATIC"
_mimi_extmod_src
"${_mimi_extmod_src}"
)
file(WRITE "${_mimi_extmod_cmake}" "${_mimi_extmod_src}")
endif()
set(_mimi_mpy_common "${MICROPY_HELPER_DIR}/micropython/ports/esp32/esp32_common.cmake")
if(EXISTS "${_mimi_mpy_common}")
file(READ "${_mimi_mpy_common}" _mimi_mpy_common_src)
string(REGEX REPLACE
"[^\n]*target_link_libraries\\([^\n]*micropy_extmod_btree[^\n]*\\)\n"
""
_mimi_mpy_common_src
"${_mimi_mpy_common_src}"
)
file(WRITE "${_mimi_mpy_common}" "${_mimi_mpy_common_src}")
endif()
Comment on lines +26 to +49
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Look for any remaining references to the broken target or generator expression.
rg -n -C2 'micropy_extmod_btree|\$<TARGET_FILE:micropy_extmod_btree>' CMakeLists.txt managed_components || true

Repository: memovai/mimiclaw

Length of output: 1203


🏁 Script executed:

#!/bin/bash
# Search entire repo for micropy_extmod_btree references
rg 'micropy_extmod_btree' --no-heading -n

Repository: memovai/mimiclaw

Length of output: 370


🏁 Script executed:

#!/bin/bash
# Check the structure and find any related cmake files
find . -name "*.cmake" -o -name "CMakeLists.txt" | head -20

Repository: memovai/mimiclaw

Length of output: 98


🏁 Script executed:

#!/bin/bash
# Look at full CMakeLists.txt to understand the complete workaround
wc -l CMakeLists.txt

Repository: memovai/mimiclaw

Length of output: 77


🏁 Script executed:

#!/bin/bash
# Read full CMakeLists.txt to understand the workaround context
cat -n CMakeLists.txt

Repository: memovai/mimiclaw

Length of output: 3383


🏁 Script executed:

#!/bin/bash
# Check if MICROPY_HELPER_DIR is set and what esp32_common.cmake contains
# Also check if there are other cmake files that might reference the target
find . -type f -name "esp32_common.cmake" -o -name "*esp32*.cmake" 2>/dev/null

Repository: memovai/mimiclaw

Length of output: 42


🏁 Script executed:

#!/bin/bash
# Verify the generator expression pattern - check if TARGET_FILE is mentioned elsewhere
rg '\$<TARGET_FILE' --no-heading -C2

Repository: memovai/mimiclaw

Length of output: 42


🏁 Script executed:

#!/bin/bash
# Check for any generator expressions in the codebase
rg '\$<' --no-heading | head -20

Repository: memovai/mimiclaw

Length of output: 173


The $<TARGET_FILE:micropy_extmod_btree> generator expression is not being removed by the current workaround.

The workaround removes $<LINK_ONLY:micropy_extmod_btree> at line 32 and attempts regex removal from source files at line 17, but the error indicates $<TARGET_FILE:micropy_extmod_btree> is still being generated. These are different generator expression patterns—the TARGET_FILE variant is not caught by the current mitigation. This requires either a patched version of micropython-helper that doesn't generate the TARGET_FILE expression, or a deterministic component-level fix after the target graph exists, before merge.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@CMakeLists.txt` around lines 11 - 23, The current regex-only removal in the
string(REGEX REPLACE) step for _mimi_mpy_common_src targets
target_link_libraries(...) lines but misses generator expressions like
$<TARGET_FILE:micropy_extmod_btree>; update the post-read transformations to
also remove or neutralize generator expressions referencing micropy_extmod_btree
(e.g., "$<TARGET_FILE:micropy_extmod_btree>" and
"$<LINK_ONLY:micropy_extmod_btree>") from the _mimi_mpy_common_src string after
reading _mimi_mpy_common so the offending generator expressions are eliminated
before writing the file back; keep references to the existing
variables/functions (_mimi_mpy_common, _mimi_mpy_common_src, string(REGEX
REPLACE), micropy_extmod_btree) when implementing the fix.

Comment on lines +28 to +49
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Modifying files in managed_components/ breaks reproducibility.

Writing to extmod.cmake (Line 33) and esp32_common.cmake (Line 44) mutates files managed by the Component Manager. This causes:

  1. Dirty working tree warnings in CI
  2. Potential conflicts on subsequent idf.py reconfigure when Component Manager updates
  3. Non-reproducible builds if patches silently fail

Prefer a downstream fix: after include(mpy.cmake), adjust target properties rather than patching upstream source files. If upstream patching is unavoidable, consider versioning the patch or contributing the fix upstream.

include(${MICROPY_HELPER_DIR}/mpy.cmake)
# If btree is an OBJECT library, wrap it as STATIC and replace references.
if(TARGET micropy_extmod_btree)
get_target_property(_mimi_btree_type micropy_extmod_btree TYPE)
if(_mimi_btree_type STREQUAL "OBJECT_LIBRARY")
add_library(micropy_extmod_btree_static STATIC $<TARGET_OBJECTS:micropy_extmod_btree>)
get_target_property(_mimi_btree_iface micropy_extmod_btree INTERFACE_LINK_LIBRARIES)
if(_mimi_btree_iface)
target_link_libraries(micropy_extmod_btree_static INTERFACE ${_mimi_btree_iface})
endif()
endif()
endif()
# Remove problematic link entry even if helper CMake layout changes.
get_property(_mimi_all_targets GLOBAL PROPERTY TARGETS)
foreach(_mimi_tgt IN LISTS _mimi_all_targets)
foreach(_mimi_prop IN ITEMS LINK_LIBRARIES INTERFACE_LINK_LIBRARIES)
get_target_property(_mimi_links ${_mimi_tgt} ${_mimi_prop})
if(_mimi_links)
set(_mimi_links_new "${_mimi_links}")
list(REMOVE_ITEM _mimi_links_new micropy_extmod_btree "$<LINK_ONLY:micropy_extmod_btree>")
if(TARGET micropy_extmod_btree_static)
list(REMOVE_ITEM _mimi_links_new micropy_extmod_btree_static "$<LINK_ONLY:micropy_extmod_btree_static>")
list(APPEND _mimi_links_new micropy_extmod_btree_static)
endif()
if(NOT _mimi_links_new STREQUAL _mimi_links)
set_property(TARGET ${_mimi_tgt} PROPERTY ${_mimi_prop} "${_mimi_links_new}")
endif()
endif()
endforeach()
endforeach()
Comment on lines +63 to +79
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

GLOBAL PROPERTY TARGETS is not valid; target cleanup loop is ineffective.

TARGETS is not a standard CMake global property. You likely intended BUILDSYSTEM_TARGETS on a directory scope:

get_property(_mimi_all_targets DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" PROPERTY BUILDSYSTEM_TARGETS)

However, even with this fix, the loop runs before project() is invoked, so ESP-IDF component targets haven't been created yet and won't be cleaned. This cleanup logic needs to execute after the ESP-IDF build system has defined all targets (e.g., via a project_include.cmake or in a component's CMakeLists.txt).

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@CMakeLists.txt` around lines 48 - 64, The loop that tries to clean
micropy_extmod_btree links uses get_property(... GLOBAL PROPERTY TARGETS) which
is invalid and runs too early; change to query directory-level targets via
get_property(_mimi_all_targets DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" PROPERTY
BUILDSYSTEM_TARGETS) and move the entire cleanup block so it executes after
project() / after ESP-IDF has created its component targets (e.g., place it in a
project_include.cmake or a component CMakeLists.txt that is parsed
post-project()); keep the rest of the logic (list REMOVE_ITEM for
micropy_extmod_btree and micropy_extmod_btree_static and the set_property calls)
unchanged but ensure the new location runs when BUILD system targets exist.

endif()
if(EXISTS "${CMAKE_BINARY_DIR}/sdkconfig.combined")
file(READ "${CMAKE_BINARY_DIR}/sdkconfig.combined" _sc)
string(REPLACE "CONFIG_MBEDTLS_SSL_ALPN=n" "CONFIG_MBEDTLS_SSL_ALPN=y" _sc "${_sc}")
string(REPLACE "CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=n" "CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y" _sc "${_sc}")
file(WRITE "${CMAKE_BINARY_DIR}/sdkconfig.combined" "${_sc}")
file(APPEND "${CMAKE_BINARY_DIR}/sdkconfig.combined"
"\nCONFIG_MBEDTLS_SSL_ALPN=y\nCONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y\n")
endif()
Comment on lines +81 to +88
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Redundant patching and timing issue with sdkconfig.combined.

  1. Redundancy: Lines 79-80 replace =n with =y, then Lines 82-83 append the same settings. If the replace succeeded, the append creates duplicates; if the keys didn't exist, the replace was a no-op anyway.

  2. Timing: On a clean configure, ${CMAKE_BINARY_DIR}/sdkconfig.combined typically doesn't exist until ESP-IDF's build system generates it. This block will be skipped, and the intended config won't apply.

Consider moving this logic to a post-configure hook or using SDKCONFIG_DEFAULTS to inject a fragment file with the required settings instead of patching generated files.

Proposed simplification (remove redundant append)
 if(EXISTS "${CMAKE_BINARY_DIR}/sdkconfig.combined")
   file(READ "${CMAKE_BINARY_DIR}/sdkconfig.combined" _sc)
   string(REPLACE "CONFIG_MBEDTLS_SSL_ALPN=n" "CONFIG_MBEDTLS_SSL_ALPN=y" _sc "${_sc}")
   string(REPLACE "CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=n" "CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y" _sc "${_sc}")
   file(WRITE "${CMAKE_BINARY_DIR}/sdkconfig.combined" "${_sc}")
-  file(APPEND "${CMAKE_BINARY_DIR}/sdkconfig.combined"
-    "\nCONFIG_MBEDTLS_SSL_ALPN=y\nCONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y\n")
 endif()
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@CMakeLists.txt` around lines 77 - 84, The current block that reads and then
appends CONFIG_MBEDTLS_SSL_ALPN and CONFIG_MBEDTLS_CERTIFICATE_BUNDLE is
redundant and can race with ESP-IDF generating sdkconfig.combined; remove the
read/replace + append hack and instead inject the settings reliably via
ESP-IDF's SDKCONFIG_DEFAULTS mechanism or a post-configure hook. Concretely:
delete the file(READ)/string(REPLACE)/file(APPEND) sequence operating on
"${CMAKE_BINARY_DIR}/sdkconfig.combined", add a small sdkconfig.defaults
fragment containing CONFIG_MBEDTLS_SSL_ALPN=y and
CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y, and set/export SDKCONFIG_DEFAULTS (or
register that fragment with the build) so the settings are picked up at
configure time; alternatively, if you must patch the generated file, perform the
modification from a custom CMake post-configure/custom command that runs after
ESP-IDF produces sdkconfig.combined to avoid the timing issue.

set(_mimi_sdkconfig_defaults
"sdkconfig.defaults"
"${CMAKE_CURRENT_LIST_DIR}/sdkconfig.defaults.esp32s3"
)
if(MIMI_ENABLE_MICROPYTHON)
list(APPEND _mimi_sdkconfig_defaults
"${CMAKE_CURRENT_LIST_DIR}/sdkconfig.micropython.override"
)
endif()
if(EXISTS "${CMAKE_BINARY_DIR}/sdkconfig.combined")
list(INSERT _mimi_sdkconfig_defaults 1 "${CMAKE_BINARY_DIR}/sdkconfig.combined")
endif()
set(SDKCONFIG_DEFAULTS "${_mimi_sdkconfig_defaults}" CACHE STRING "Kconfig defaults" FORCE)

include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(mimiclaw)

Expand Down
92 changes: 64 additions & 28 deletions main/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,30 +1,66 @@
set(MIMI_MAIN_SRCS
"mimi.c"
"bus/message_bus.c"
"wifi/wifi_manager.c"
"channels/telegram/telegram_bot.c"
"channels/feishu/feishu_bot.c"
"llm/llm_proxy.c"
"agent/agent_loop.c"
"agent/context_builder.c"
"memory/memory_store.c"
"memory/session_mgr.c"
"gateway/ws_server.c"
"compat/esp_tls_stubs.c"
"cli/serial_cli.c"
"proxy/http_proxy.c"
"cron/cron_service.c"
"heartbeat/heartbeat.c"
"tools/tool_registry.c"
"tools/tool_cron.c"
"tools/tool_web_search.c"
"tools/tool_get_time.c"
"tools/tool_files.c"
"skills/skill_loader.c"
)

set(MIMI_MAIN_INCLUDE_DIRS "." "compat")

set(MIMI_MAIN_REQUIRES
nvs_flash esp_wifi esp_netif esp_http_client esp_http_server
esp_https_ota esp_event json spiffs console vfs app_update esp-tls
esp_timer esp_websocket_client tcp_transport
)

if(MIMI_ENABLE_MICROPYTHON)
list(APPEND MIMI_MAIN_SRCS
"micropython/mpy_runner.c"
"micropython/mpy_stubs.c"
"micropython/mpy_uart_stubs.c"
)
list(APPEND MIMI_MAIN_INCLUDE_DIRS
"micropython"
"${CMAKE_BINARY_DIR}"
"${CMAKE_SOURCE_DIR}/third_party/micropython-helper/micropython"
"${CMAKE_SOURCE_DIR}/third_party/micropython-helper/micropython/ports/esp32"
"${CMAKE_SOURCE_DIR}/third_party/micropython-helper/micropython/ports/esp32/boards/${MICROPY_BOARD}"
)
list(APPEND MIMI_MAIN_REQUIRES esp_driver_gpio esp_driver_i2s)
endif()

idf_component_register(
SRCS
"mimi.c"
"bus/message_bus.c"
"wifi/wifi_manager.c"
"channels/telegram/telegram_bot.c"
"channels/feishu/feishu_bot.c"
"llm/llm_proxy.c"
"agent/agent_loop.c"
"agent/context_builder.c"
"memory/memory_store.c"
"memory/session_mgr.c"
"gateway/ws_server.c"
"cli/serial_cli.c"
"proxy/http_proxy.c"
"cron/cron_service.c"
"heartbeat/heartbeat.c"
"tools/tool_registry.c"
"tools/tool_cron.c"
"tools/tool_web_search.c"
"tools/tool_get_time.c"
"tools/tool_files.c"
"skills/skill_loader.c"
INCLUDE_DIRS
"."
REQUIRES
nvs_flash esp_wifi esp_netif esp_http_client esp_http_server
esp_https_ota esp_event json spiffs console vfs app_update esp-tls
esp_timer esp_websocket_client
SRCS ${MIMI_MAIN_SRCS}
INCLUDE_DIRS ${MIMI_MAIN_INCLUDE_DIRS}
REQUIRES ${MIMI_MAIN_REQUIRES}
)

target_compile_options(${COMPONENT_LIB} PRIVATE -Wno-format-truncation)
target_include_directories(${COMPONENT_LIB} PRIVATE ${IDF_PATH}/components/mbedtls/esp_crt_bundle/include)
if(MIMI_ENABLE_MICROPYTHON)
if(DEFINED MICROPY_GENHDR_DIR)
get_filename_component(_mimi_genhdr_parent "${MICROPY_GENHDR_DIR}" DIRECTORY)
target_include_directories(${COMPONENT_LIB} PRIVATE "${_mimi_genhdr_parent}")
endif()
if(DEFINED MICROPY_TARGET)
add_dependencies(${COMPONENT_LIB} ${MICROPY_TARGET})
endif()
endif()
14 changes: 12 additions & 2 deletions main/agent/agent_loop.c
Original file line number Diff line number Diff line change
Expand Up @@ -172,13 +172,23 @@ static void agent_loop_task(void *arg)
{
ESP_LOGI(TAG, "Agent loop started on core %d", xPortGetCoreID());

/* Allocate large buffers from PSRAM */
/* Allocate large buffers from PSRAM, fallback to internal RAM */
char *system_prompt = heap_caps_calloc(1, MIMI_CONTEXT_BUF_SIZE, MALLOC_CAP_SPIRAM);
char *history_json = heap_caps_calloc(1, MIMI_LLM_STREAM_BUF_SIZE, MALLOC_CAP_SPIRAM);
char *tool_output = heap_caps_calloc(1, TOOL_OUTPUT_SIZE, MALLOC_CAP_SPIRAM);

if (!system_prompt) {
system_prompt = heap_caps_calloc(1, MIMI_CONTEXT_BUF_SIZE, MALLOC_CAP_8BIT);
}
if (!history_json) {
history_json = heap_caps_calloc(1, MIMI_LLM_STREAM_BUF_SIZE, MALLOC_CAP_8BIT);
}
if (!tool_output) {
tool_output = heap_caps_calloc(1, TOOL_OUTPUT_SIZE, MALLOC_CAP_8BIT);
}

if (!system_prompt || !history_json || !tool_output) {
ESP_LOGE(TAG, "Failed to allocate PSRAM buffers");
ESP_LOGE(TAG, "Failed to allocate agent buffers");
vTaskDelete(NULL);
Comment on lines +180 to 192
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Free successful allocations before aborting startup.

If one buffer still fails after fallback, Lines 190-192 delete the task without releasing the buffers that already succeeded. On a low-memory boot that leaks tens of KiB permanently and makes recovery harder.

Proposed fix
     if (!system_prompt || !history_json || !tool_output) {
         ESP_LOGE(TAG, "Failed to allocate agent buffers");
+        free(system_prompt);
+        free(history_json);
+        free(tool_output);
         vTaskDelete(NULL);
         return;
     }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@main/agent/agent_loop.c` around lines 180 - 192, If any of the three
allocations (system_prompt, history_json, tool_output via heap_caps_calloc)
fails, free any buffers that were successfully allocated before calling
vTaskDelete; specifically check each pointer (system_prompt, history_json,
tool_output) and call the appropriate free (heap_caps_free or free consistent
with heap_caps_calloc) to release memory, then log the error with ESP_LOGE and
call vTaskDelete(NULL). Update the failure branch around the allocation block in
agent_loop.c so no partial allocations are leaked on startup abort.

return;
}
Expand Down
10 changes: 5 additions & 5 deletions main/channels/feishu/feishu_bot.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
#include "esp_log.h"
#include "esp_http_client.h"
#include "esp_websocket_client.h"
#include "esp_crt_bundle.h"
#include "compat/mbedtls_compat.h"
#include "esp_timer.h"
#include "esp_event.h"
#include "nvs.h"
Expand Down Expand Up @@ -327,7 +327,7 @@ static esp_err_t feishu_get_tenant_token(void)
.timeout_ms = 10000,
.buffer_size = 2048,
.buffer_size_tx = 2048,
.crt_bundle_attach = esp_crt_bundle_attach,
.crt_bundle_attach = MIMI_CRT_BUNDLE_ATTACH,
};

esp_http_client_handle_t client = esp_http_client_init(&config);
Expand Down Expand Up @@ -387,7 +387,7 @@ static char *feishu_api_call(const char *url, const char *method, const char *po
.timeout_ms = 15000,
.buffer_size = 2048,
.buffer_size_tx = 2048,
.crt_bundle_attach = esp_crt_bundle_attach,
.crt_bundle_attach = MIMI_CRT_BUNDLE_ATTACH,
};

esp_http_client_handle_t client = esp_http_client_init(&config);
Expand Down Expand Up @@ -464,7 +464,7 @@ static esp_err_t feishu_pull_ws_config(void)
.timeout_ms = 15000,
.buffer_size = 2048,
.buffer_size_tx = 1024,
.crt_bundle_attach = esp_crt_bundle_attach,
.crt_bundle_attach = MIMI_CRT_BUNDLE_ATTACH,
};
esp_http_client_handle_t client = esp_http_client_init(&config);
if (!client) {
Expand Down Expand Up @@ -620,7 +620,7 @@ static void feishu_ws_task(void *arg)
.reconnect_timeout_ms = s_ws_reconnect_interval_ms,
.network_timeout_ms = 10000,
.disable_auto_reconnect = false,
.crt_bundle_attach = esp_crt_bundle_attach,
.crt_bundle_attach = MIMI_CRT_BUNDLE_ATTACH,
};

s_ws_client = esp_websocket_client_init(&ws_cfg);
Expand Down
4 changes: 2 additions & 2 deletions main/channels/telegram/telegram_bot.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
#include "esp_log.h"
#include "esp_timer.h"
#include "esp_http_client.h"
#include "esp_crt_bundle.h"
#include "compat/mbedtls_compat.h"
#include "nvs.h"
#include "cJSON.h"

Expand Down Expand Up @@ -215,7 +215,7 @@ static char *tg_api_call_direct(const char *method, const char *post_data)
.timeout_ms = (MIMI_TG_POLL_TIMEOUT_S + 5) * 1000,
.buffer_size = 2048,
.buffer_size_tx = 2048,
.crt_bundle_attach = esp_crt_bundle_attach,
.crt_bundle_attach = MIMI_CRT_BUNDLE_ATTACH,
};

esp_http_client_handle_t client = esp_http_client_init(&config);
Expand Down
Loading
Loading