| 4573 | } |
| 4574 | |
| 4575 | static int cbm_remove_hermes_context_hook(const char *config_path, const char *binary_path) { |
| 4576 | static const char *const sequence_path[] = {"hooks", "pre_llm_call"}; |
| 4577 | static const char identity[] = "\"" CMM_HERMES_HOOK_ID "\""; |
| 4578 | char item[CLI_BUF_8K]; |
| 4579 | if (cbm_build_hermes_context_hook_item(binary_path, item, sizeof(item)) != CLI_OK) { |
| 4580 | return CBM_YAML_IDENTITY_EDIT_ERROR; |
| 4581 | } |
| 4582 | size_t before_len = 0U; |
| 4583 | char *before = read_file_str(config_path, &before_len); |
| 4584 | int result = cbm_yaml_remove_mapping_sequence_item( |
| 4585 | config_path, sequence_path, sizeof(sequence_path) / sizeof(sequence_path[0]), "id", |
| 4586 | identity, item); |
| 4587 | if (result != CBM_YAML_IDENTITY_EDIT_OK || !before) { |
| 4588 | free(before); |
| 4589 | return result; |
| 4590 | } |
| 4591 | size_t after_len = 0U; |
| 4592 | char *after = read_file_str(config_path, &after_len); |
| 4593 | if (!after) { |
| 4594 | free(before); |
| 4595 | return CBM_YAML_IDENTITY_EDIT_ERROR; |
| 4596 | } |
| 4597 | bool exact_removed = before_len != after_len || memcmp(before, after, before_len) != 0; |
| 4598 | bool remove_empty_sequence = exact_removed && cbm_hermes_pre_llm_sequence_is_empty(after); |
| 4599 | free(before); |
| 4600 | free(after); |
| 4601 | if (remove_empty_sequence && |
| 4602 | cbm_yaml_remove_mapping_entry(config_path, "hooks", "pre_llm_call") != CLI_OK) { |
| 4603 | return CBM_YAML_IDENTITY_EDIT_ERROR; |
| 4604 | } |
| 4605 | return CBM_YAML_IDENTITY_EDIT_OK; |
| 4606 | } |
| 4607 | |
| 4608 | int cbm_upsert_claude_hooks(const char *settings_path) { |
| 4609 | char command[CLI_BUF_8K]; |
no test coverage detected