Skip to content
Merged
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
2 changes: 1 addition & 1 deletion cecli/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from packaging import version

__version__ = "0.96.2.dev"
__version__ = "0.96.3.dev"
safe_version = __version__

try:
Expand Down
2 changes: 0 additions & 2 deletions cecli/coders/agent_coder.py
Original file line number Diff line number Diff line change
Expand Up @@ -799,11 +799,9 @@ async def reply_completed(self):
saved_message = await self.auto_commit(self.files_edited_by_tools)
if not saved_message and hasattr(self.gpt_prompts, "files_content_gpt_edits_no_repo"):
saved_message = self.gpt_prompts.files_content_gpt_edits_no_repo
self.move_back_cur_messages(saved_message)
self.tool_call_count = 0
self.files_added_in_exploration = set()
self.files_edited_by_tools = set()
self.move_back_cur_messages(None)
return False

async def _execute_tool_with_registry(self, norm_tool_name, params):
Expand Down
53 changes: 23 additions & 30 deletions cecli/coders/architect_coder.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,12 +52,8 @@ async def reply_completed(self):

editor_coder = await Coder.create(**new_kwargs)

# Clear ALL messages for editor coder (start fresh)
ConversationManager.reset()

# Re-initialize ConversationManager with editor coder
ConversationManager.initialize(editor_coder)
ConversationManager.clear_cache()
ConversationManager.initialize(editor_coder, reset=True, reformat=True)

if self.verbose:
editor_coder.show_announcements()
Expand All @@ -69,48 +65,45 @@ async def reply_completed(self):
editor_all_messages = ConversationManager.get_messages()

# Clear manager and restore original state
ConversationManager.reset()
ConversationManager.initialize(original_coder or self)
ConversationManager.initialize(original_coder or self, reset=True, reformat=True)

# Restore original messages with all metadata
for msg in original_all_messages:
ConversationManager.add_message(
msg.to_dict(),
MessageTag(msg.tag),
priority=msg.priority,
timestamp=msg.timestamp,
mark_for_delete=msg.mark_for_delete,
hash_key=msg.hash_key,
)
if msg.tag in [MessageTag.DONE.value, MessageTag.CUR.value]:
ConversationManager.add_message(
message_dict=msg.message_dict,
tag=MessageTag(msg.tag),
priority=msg.priority,
mark_for_delete=msg.mark_for_delete,
force=True,
)

# Append editor's DONE and CUR messages (but not other tags like SYSTEM)
for msg in editor_all_messages:
if msg.tag in [MessageTag.DONE.value, MessageTag.CUR.value]:
ConversationManager.add_message(
msg.to_dict(),
MessageTag(msg.tag),
message_dict=msg.message_dict,
tag=MessageTag(msg.tag),
priority=msg.priority,
timestamp=msg.timestamp,
mark_for_delete=msg.mark_for_delete,
hash_key=msg.hash_key,
force=True,
)

self.move_back_cur_messages("I made those changes to the files.")
self.total_cost = editor_coder.total_cost
self.coder_commit_hashes = editor_coder.coder_commit_hashes
except Exception as e:
self.io.tool_error(e)
# Restore original state on error
ConversationManager.reset()
ConversationManager.initialize(original_coder or self)
ConversationManager.initialize(original_coder or self, reset=True, reformat=True)

for msg in original_all_messages:
ConversationManager.add_message(
msg.to_dict(),
MessageTag(msg.tag),
priority=msg.priority,
timestamp=msg.timestamp,
mark_for_delete=msg.mark_for_delete,
hash_key=msg.hash_key,
)
if msg.tag in [MessageTag.DONE.value, MessageTag.CUR.value]:
ConversationManager.add_message(
message_dict=msg.message_dict,
tag=MessageTag(msg.tag),
priority=msg.priority,
mark_for_delete=msg.mark_for_delete,
force=True,
)

raise SwitchCoderSignal(main_model=self.main_model, edit_format="architect")
46 changes: 13 additions & 33 deletions cecli/coders/base_coder.py
Original file line number Diff line number Diff line change
Expand Up @@ -1659,7 +1659,7 @@ def keyboard_interrupt(self):

# Old summarization system removed - using context compaction logic instead

async def compact_context_if_needed(self, force=False):
async def compact_context_if_needed(self, force=False, message=""):
if not self.enable_context_compaction:
return

Expand Down Expand Up @@ -1687,9 +1687,14 @@ async def compact_context_if_needed(self, force=False):
# Check if done_messages alone exceed the limit
if done_tokens > self.context_compaction_max_tokens or done_tokens > cur_tokens:
# Create a summary of the done_messages
# Append custom message to compaction prompt if provided
compaction_prompt = self.gpt_prompts.compaction_prompt
if message:
compaction_prompt = f"{compaction_prompt}\n\n{message}"

summary_text = await self.summarizer.summarize_all_as_text(
done_messages,
self.gpt_prompts.compaction_prompt,
compaction_prompt,
self.context_compaction_summary_tokens,
)

Expand Down Expand Up @@ -1719,9 +1724,14 @@ async def compact_context_if_needed(self, force=False):
# Check if cur_messages alone exceed the limit (after potentially compacting done_messages)
if cur_tokens > self.context_compaction_max_tokens or cur_tokens > done_tokens:
# Create a summary of the cur_messages
# Append custom message to compaction prompt if provided
compaction_prompt = self.gpt_prompts.compaction_prompt
if message:
compaction_prompt = f"{compaction_prompt}\n\n{message}"

cur_summary_text = await self.summarizer.summarize_all_as_text(
cur_messages,
self.gpt_prompts.compaction_prompt,
compaction_prompt,
self.context_compaction_summary_tokens,
)

Expand Down Expand Up @@ -1774,32 +1784,6 @@ async def compact_context_if_needed(self, force=False):
self.io.tool_warning("Proceeding with full history for now.")
return

def move_back_cur_messages(self, message):
# Move CUR messages to DONE in ConversationManager
# Get current CUR messages
cur_messages = ConversationManager.get_messages_dict(MessageTag.CUR)

# Clear CUR messages from ConversationManager
ConversationManager.clear_tag(MessageTag.CUR)

# Add them back as DONE messages
for msg in cur_messages:
ConversationManager.add_message(
message_dict=msg,
tag=MessageTag.DONE,
)

# TODO check for impact on image messages
if message:
ConversationManager.add_message(
message_dict=dict(role="user", content=message),
tag=MessageTag.DONE,
)
ConversationManager.add_message(
message_dict=dict(role="assistant", content="Ok."),
tag=MessageTag.DONE,
)

def normalize_language(self, lang_code):
"""
Convert a locale code such as ``en_US`` or ``fr`` into a readable
Expand Down Expand Up @@ -2277,8 +2261,6 @@ async def send_message(self, inp):
if not saved_message and hasattr(self.gpt_prompts, "files_content_gpt_edits_no_repo"):
saved_message = self.gpt_prompts.files_content_gpt_edits_no_repo

self.move_back_cur_messages(saved_message)

if not interrupted:
add_rel_files_message = await self.check_for_file_mentions(content)
if add_rel_files_message:
Expand Down Expand Up @@ -3783,8 +3765,6 @@ async def dirty_commit(self):

await self.repo.commit(fnames=self.need_commit_before_edits, coder=self)

# files changed, move cur messages back behind the files messages
# self.move_back_cur_messages(self.gpt_prompts.files_content_local_edits)
return True

def get_edits(self, mode="update"):
Expand Down
4 changes: 3 additions & 1 deletion cecli/commands/compact.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ class CompactCommand(BaseCommand):

@classmethod
async def execute(cls, io, coder, args, **kwargs):
await coder.compact_context_if_needed(force=True)
# Pass args as message parameter if it's not empty
message = args.strip() if args else ""
await coder.compact_context_if_needed(force=True, message=message)

@classmethod
def get_help(cls) -> str:
Expand Down
37 changes: 13 additions & 24 deletions cecli/commands/editor_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,12 +62,8 @@ async def execute(cls, io, coder, args, **kwargs):

temp_coder = await Coder.create(**new_kwargs)

# Clear ALL messages for temp coder (start fresh)
ConversationManager.reset()

# Re-initialize ConversationManager with temp coder
ConversationManager.initialize(temp_coder)
ConversationManager.clear_cache()
ConversationManager.initialize(temp_coder, reset=True, reformat=True)

verbose = kwargs.get("verbose", False)
if verbose:
Expand All @@ -82,37 +78,30 @@ async def execute(cls, io, coder, args, **kwargs):
temp_all_messages = ConversationManager.get_messages()

# Clear manager and restore original state
ConversationManager.reset()
ConversationManager.initialize(original_coder)
ConversationManager.initialize(original_coder, reset=True, reformat=True)

# Restore original messages with all metadata
for msg in original_all_messages:
ConversationManager.add_message(
msg.to_dict(),
MessageTag(msg.tag),
priority=msg.priority,
timestamp=msg.timestamp,
mark_for_delete=msg.mark_for_delete,
hash_key=msg.hash_key,
)
if msg.tag in [MessageTag.DONE.value, MessageTag.CUR.value]:
ConversationManager.add_message(
message_dict=msg.message_dict,
tag=MessageTag(msg.tag),
priority=msg.priority,
mark_for_delete=msg.mark_for_delete,
force=True,
)

# Append temp coder's DONE and CUR messages (but not other tags like SYSTEM)
for msg in temp_all_messages:
if msg.tag in [MessageTag.DONE.value, MessageTag.CUR.value]:
ConversationManager.add_message(
msg.to_dict(),
MessageTag(msg.tag),
message_dict=msg.message_dict,
tag=MessageTag(msg.tag),
priority=msg.priority,
timestamp=msg.timestamp,
mark_for_delete=msg.mark_for_delete,
hash_key=msg.hash_key,
force=True,
)

# Move back cur messages with appropriate message
coder.move_back_cur_messages(
f"Editor model {model_name} made those changes to the files."
)

# Restore the original model configuration
from cecli.commands import SwitchCoderSignal

Expand Down
35 changes: 13 additions & 22 deletions cecli/commands/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,12 +67,8 @@ async def execute(cls, io, coder, args, **kwargs):

temp_coder = await Coder.create(**new_kwargs)

# Clear ALL messages for temp coder (start fresh)
ConversationManager.reset()

# Re-initialize ConversationManager with temp coder
ConversationManager.initialize(temp_coder)
ConversationManager.clear_cache()
ConversationManager.initialize(temp_coder, reset=True, reformat=True)

verbose = kwargs.get("verbose", False)
if verbose:
Expand All @@ -87,35 +83,30 @@ async def execute(cls, io, coder, args, **kwargs):
temp_all_messages = ConversationManager.get_messages()

# Clear manager and restore original state
ConversationManager.reset()
ConversationManager.initialize(original_coder)
ConversationManager.initialize(original_coder, reset=True, reformat=True)

# Restore original messages with all metadata
for msg in original_all_messages:
ConversationManager.add_message(
msg.to_dict(),
MessageTag(msg.tag),
priority=msg.priority,
timestamp=msg.timestamp,
mark_for_delete=msg.mark_for_delete,
hash_key=msg.hash_key,
)
if msg.tag in [MessageTag.DONE.value, MessageTag.CUR.value]:
ConversationManager.add_message(
message_dict=msg.message_dict,
tag=MessageTag(msg.tag),
priority=msg.priority,
mark_for_delete=msg.mark_for_delete,
force=True,
)

# Append temp coder's DONE and CUR messages (but not other tags like SYSTEM)
for msg in temp_all_messages:
if msg.tag in [MessageTag.DONE.value, MessageTag.CUR.value]:
ConversationManager.add_message(
msg.to_dict(),
MessageTag(msg.tag),
message_dict=msg.message_dict,
tag=MessageTag(msg.tag),
priority=msg.priority,
timestamp=msg.timestamp,
mark_for_delete=msg.mark_for_delete,
hash_key=msg.hash_key,
force=True,
)

# Move back cur messages with appropriate message
coder.move_back_cur_messages(f"Model {model_name} made those changes to the files.")

# Restore the original model configuration
from cecli.commands import SwitchCoderSignal

Expand Down
2 changes: 1 addition & 1 deletion cecli/commands/reset.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ async def execute(cls, io, coder, args, **kwargs):
ConversationFiles.reset() # Clear all file caches

# Re-initialize ConversationManager with current coder
ConversationManager.initialize(coder)
ConversationManager.initialize(coder, reformat=True)
ConversationFiles.initialize(coder)

# Clear TUI output if available
Expand Down
32 changes: 13 additions & 19 deletions cecli/commands/utils/base_command.py
Original file line number Diff line number Diff line change
Expand Up @@ -150,12 +150,8 @@ async def _generic_chat_command(cls, io, coder, args, edit_format, placeholder=N

new_coder = await Coder.create(**kwargs)

# Clear ALL messages for new coder (start fresh)
ConversationManager.reset()

# Re-initialize ConversationManager with new coder
ConversationManager.initialize(new_coder)
ConversationManager.clear_cache()
ConversationManager.initialize(new_coder, reset=True, reformat=True)

await new_coder.generate(user_message=user_msg, preproc=False)
coder.coder_commit_hashes = new_coder.coder_commit_hashes
Expand All @@ -164,30 +160,28 @@ async def _generic_chat_command(cls, io, coder, args, edit_format, placeholder=N
new_all_messages = ConversationManager.get_messages()

# Clear manager and restore original state
ConversationManager.reset()
ConversationManager.initialize(original_coder)
ConversationManager.initialize(original_coder, reset=True, reformat=True)

# Restore original messages with all metadata
for msg in original_all_messages:
ConversationManager.add_message(
msg.to_dict(),
MessageTag(msg.tag),
priority=msg.priority,
timestamp=msg.timestamp,
mark_for_delete=msg.mark_for_delete,
hash_key=msg.hash_key,
)
if msg.tag in [MessageTag.DONE.value, MessageTag.CUR.value]:
ConversationManager.add_message(
message_dict=msg.message_dict,
tag=MessageTag(msg.tag),
priority=msg.priority,
mark_for_delete=msg.mark_for_delete,
force=True,
)

# Append new coder's DONE and CUR messages (but not other tags like SYSTEM)
for msg in new_all_messages:
if msg.tag in [MessageTag.DONE.value, MessageTag.CUR.value]:
ConversationManager.add_message(
msg.to_dict(),
MessageTag(msg.tag),
message_dict=msg.message_dict,
tag=MessageTag(msg.tag),
priority=msg.priority,
timestamp=msg.timestamp,
mark_for_delete=msg.mark_for_delete,
hash_key=msg.hash_key,
force=True,
)

from cecli.commands import SwitchCoderSignal
Expand Down
Loading
Loading