| 4517 | } |
| 4518 | |
| 4519 | static int cbm_remove_hermes_context_hook(const char *config_path, const char *binary_path) { |
| 4520 | static const char *const sequence_path[] = {"hooks", "pre_llm_call"}; |
| 4521 | static const char identity[] = "\"" CMM_HERMES_HOOK_ID "\""; |
| 4522 | char item[CLI_BUF_8K]; |
| 4523 | if (cbm_build_hermes_context_hook_item(binary_path, item, sizeof(item)) != CLI_OK) { |
| 4524 | return CBM_YAML_IDENTITY_EDIT_ERROR; |
| 4525 | } |
| 4526 | size_t before_len = 0U; |
| 4527 | char *before = read_file_str(config_path, &before_len); |
| 4528 | int result = cbm_yaml_remove_mapping_sequence_item( |
| 4529 | config_path, sequence_path, sizeof(sequence_path) / sizeof(sequence_path[0]), "id", |
| 4530 | identity, item); |
| 4531 | if (result != CBM_YAML_IDENTITY_EDIT_OK || !before) { |
| 4532 | free(before); |
| 4533 | return result; |
| 4534 | } |
| 4535 | size_t after_len = 0U; |
| 4536 | char *after = read_file_str(config_path, &after_len); |
| 4537 | if (!after) { |
| 4538 | free(before); |
| 4539 | return CBM_YAML_IDENTITY_EDIT_ERROR; |
| 4540 | } |
| 4541 | bool exact_removed = before_len != after_len || memcmp(before, after, before_len) != 0; |
| 4542 | bool remove_empty_sequence = exact_removed && cbm_hermes_pre_llm_sequence_is_empty(after); |
| 4543 | free(before); |
| 4544 | free(after); |
| 4545 | if (remove_empty_sequence && |
| 4546 | cbm_yaml_remove_mapping_entry(config_path, "hooks", "pre_llm_call") != CLI_OK) { |
| 4547 | return CBM_YAML_IDENTITY_EDIT_ERROR; |
| 4548 | } |
| 4549 | return CBM_YAML_IDENTITY_EDIT_OK; |
| 4550 | } |
| 4551 | |
| 4552 | int cbm_upsert_claude_hooks(const char *settings_path) { |
| 4553 | char command[CLI_BUF_8K]; |
no test coverage detected