| 4737 | } |
| 4738 | |
| 4739 | static int cbm_remove_hermes_context_hook(const char *config_path, const char *binary_path) { |
| 4740 | static const char *const sequence_path[] = {"hooks", "pre_llm_call"}; |
| 4741 | static const char identity[] = "\"" CMM_HERMES_HOOK_ID "\""; |
| 4742 | char item[CLI_BUF_8K]; |
| 4743 | if (cbm_build_hermes_context_hook_item(binary_path, item, sizeof(item)) != CLI_OK) { |
| 4744 | return CBM_YAML_IDENTITY_EDIT_ERROR; |
| 4745 | } |
| 4746 | size_t before_len = 0U; |
| 4747 | char *before = read_file_str(config_path, &before_len); |
| 4748 | int result = cbm_yaml_remove_mapping_sequence_item( |
| 4749 | config_path, sequence_path, sizeof(sequence_path) / sizeof(sequence_path[0]), "id", |
| 4750 | identity, item); |
| 4751 | if (result != CBM_YAML_IDENTITY_EDIT_OK || !before) { |
| 4752 | free(before); |
| 4753 | return result; |
| 4754 | } |
| 4755 | size_t after_len = 0U; |
| 4756 | char *after = read_file_str(config_path, &after_len); |
| 4757 | if (!after) { |
| 4758 | free(before); |
| 4759 | return CBM_YAML_IDENTITY_EDIT_ERROR; |
| 4760 | } |
| 4761 | bool exact_removed = before_len != after_len || memcmp(before, after, before_len) != 0; |
| 4762 | bool remove_empty_sequence = exact_removed && cbm_hermes_pre_llm_sequence_is_empty(after); |
| 4763 | free(before); |
| 4764 | free(after); |
| 4765 | if (remove_empty_sequence && |
| 4766 | cbm_yaml_remove_mapping_entry(config_path, "hooks", "pre_llm_call") != CLI_OK) { |
| 4767 | return CBM_YAML_IDENTITY_EDIT_ERROR; |
| 4768 | } |
| 4769 | return CBM_YAML_IDENTITY_EDIT_OK; |
| 4770 | } |
| 4771 | |
| 4772 | int cbm_upsert_claude_hooks(const char *settings_path) { |
| 4773 | char command[CLI_BUF_8K]; |
no test coverage detected