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.3.dev"
__version__ = "0.96.4.dev"
safe_version = __version__

try:
Expand Down
56 changes: 17 additions & 39 deletions cecli/coders/architect_coder.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,68 +42,46 @@ async def reply_completed(self):
kwargs["cache_prompts"] = False
kwargs["num_cache_warming_pings"] = 0
kwargs["summarize_from_coder"] = False
kwargs["done_messages"] = []
kwargs["cur_messages"] = []

new_kwargs = dict(io=self.io, from_coder=self)
new_kwargs.update(kwargs)

# Save current conversation state
original_all_messages = ConversationManager.get_messages()
original_coder = self

editor_coder = await Coder.create(**new_kwargs)

# Re-initialize ConversationManager with editor coder
ConversationManager.initialize(editor_coder, reset=True, reformat=True)
ConversationManager.initialize(
editor_coder, reset=True, reformat=True, preserve_tags=[MessageTag.DONE, MessageTag.CUR]
)

if self.verbose:
editor_coder.show_announcements()

try:
await editor_coder.generate(user_message=content, preproc=False)

# Save editor's ALL messages
editor_all_messages = ConversationManager.get_messages()

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

# Restore original messages with all metadata
for msg in original_all_messages:
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(
message_dict=msg.message_dict,
tag=MessageTag(msg.tag),
priority=msg.priority,
mark_for_delete=msg.mark_for_delete,
force=True,
)
ConversationManager.initialize(
original_coder or self,
reset=True,
reformat=True,
preserve_tags=[MessageTag.DONE, MessageTag.CUR],
)

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.initialize(original_coder or self, reset=True, reformat=True)

for msg in original_all_messages:
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,
)
ConversationManager.initialize(
original_coder or self,
reset=True,
reformat=True,
preserve_tags=[MessageTag.DONE, MessageTag.CUR],
)

raise SwitchCoderSignal(main_model=self.main_model, edit_format="architect")
2 changes: 1 addition & 1 deletion cecli/coders/base_coder.py
Original file line number Diff line number Diff line change
Expand Up @@ -2096,7 +2096,7 @@ async def send_message(self, inp):
ConversationManager.add_message(
message_dict=dict(role="user", content=inp),
tag=MessageTag.CUR,
hash_key=("user_message", inp, str(time.time_ns())),
hash_key=("user_message", inp, str(time.monotonic_ns())),
)

loop = asyncio.get_running_loop()
Expand Down
42 changes: 14 additions & 28 deletions cecli/commands/editor_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,18 +52,24 @@ async def execute(cls, io, coder, args, **kwargs):
kwargs["total_cost"] = coder.total_cost
kwargs["num_cache_warming_pings"] = 0
kwargs["summarize_from_coder"] = False
kwargs["done_messages"] = []
kwargs["cur_messages"] = []

new_kwargs = dict(io=io, from_coder=coder)
new_kwargs.update(kwargs)

# Save current conversation state
original_all_messages = ConversationManager.get_messages()
original_coder = coder

temp_coder = await Coder.create(**new_kwargs)

# Re-initialize ConversationManager with temp coder
ConversationManager.initialize(temp_coder, reset=True, reformat=True)
ConversationManager.initialize(
temp_coder,
reset=True,
reformat=True,
preserve_tags=[MessageTag.DONE, MessageTag.CUR],
)

verbose = kwargs.get("verbose", False)
if verbose:
Expand All @@ -74,33 +80,13 @@ async def execute(cls, io, coder, args, **kwargs):
coder.total_cost = temp_coder.total_cost
coder.coder_commit_hashes = temp_coder.coder_commit_hashes

# Save temp coder's ALL messages
temp_all_messages = ConversationManager.get_messages()

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

# Restore original messages with all metadata
for msg in original_all_messages:
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(
message_dict=msg.message_dict,
tag=MessageTag(msg.tag),
priority=msg.priority,
mark_for_delete=msg.mark_for_delete,
force=True,
)
ConversationManager.initialize(
original_coder,
reset=True,
reformat=True,
preserve_tags=[MessageTag.DONE, MessageTag.CUR],
)

# Restore the original model configuration
from cecli.commands import SwitchCoderSignal
Expand Down
42 changes: 14 additions & 28 deletions cecli/commands/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,18 +57,24 @@ async def execute(cls, io, coder, args, **kwargs):
kwargs["total_cost"] = coder.total_cost
kwargs["num_cache_warming_pings"] = 0
kwargs["summarize_from_coder"] = False
kwargs["done_messages"] = []
kwargs["cur_messages"] = []

new_kwargs = dict(io=io, from_coder=coder)
new_kwargs.update(kwargs)

# Save current conversation state
original_all_messages = ConversationManager.get_messages()
original_coder = coder

temp_coder = await Coder.create(**new_kwargs)

# Re-initialize ConversationManager with temp coder
ConversationManager.initialize(temp_coder, reset=True, reformat=True)
ConversationManager.initialize(
temp_coder,
reset=True,
reformat=True,
preserve_tags=[MessageTag.DONE, MessageTag.CUR],
)

verbose = kwargs.get("verbose", False)
if verbose:
Expand All @@ -79,33 +85,13 @@ async def execute(cls, io, coder, args, **kwargs):
coder.total_cost = temp_coder.total_cost
coder.coder_commit_hashes = temp_coder.coder_commit_hashes

# Save temp coder's ALL messages
temp_all_messages = ConversationManager.get_messages()

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

# Restore original messages with all metadata
for msg in original_all_messages:
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(
message_dict=msg.message_dict,
tag=MessageTag(msg.tag),
priority=msg.priority,
mark_for_delete=msg.mark_for_delete,
force=True,
)
ConversationManager.initialize(
original_coder,
reset=True,
reformat=True,
preserve_tags=[MessageTag.DONE, MessageTag.CUR],
)

# Restore the original model configuration
from cecli.commands import SwitchCoderSignal
Expand Down
39 changes: 11 additions & 28 deletions cecli/commands/utils/base_command.py
Original file line number Diff line number Diff line change
Expand Up @@ -142,47 +142,30 @@ async def _generic_chat_command(cls, io, coder, args, edit_format, placeholder=N
"num_cache_warming_pings": 0,
"coder_commit_hashes": coder.coder_commit_hashes,
"args": coder.args,
"done_messages": [],
"cur_messages": [],
}

# Save current conversation state
original_all_messages = ConversationManager.get_messages()
original_coder = coder

new_coder = await Coder.create(**kwargs)

# Re-initialize ConversationManager with new coder
ConversationManager.initialize(new_coder, reset=True, reformat=True)
ConversationManager.initialize(
new_coder, reset=True, reformat=True, preserve_tags=[MessageTag.DONE, MessageTag.CUR]
)

await new_coder.generate(user_message=user_msg, preproc=False)
coder.coder_commit_hashes = new_coder.coder_commit_hashes

# Save new coder's ALL messages
new_all_messages = ConversationManager.get_messages()

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

# Restore original messages with all metadata
for msg in original_all_messages:
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(
message_dict=msg.message_dict,
tag=MessageTag(msg.tag),
priority=msg.priority,
mark_for_delete=msg.mark_for_delete,
force=True,
)
ConversationManager.initialize(
original_coder,
reset=True,
reformat=True,
preserve_tags=[MessageTag.DONE, MessageTag.CUR],
)

from cecli.commands import SwitchCoderSignal

Expand Down
42 changes: 14 additions & 28 deletions cecli/commands/weak_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,18 +52,24 @@ async def execute(cls, io, coder, args, **kwargs):
kwargs["total_cost"] = coder.total_cost
kwargs["num_cache_warming_pings"] = 0
kwargs["summarize_from_coder"] = False
kwargs["done_messages"] = []
kwargs["cur_messages"] = []

new_kwargs = dict(io=io, from_coder=coder)
new_kwargs.update(kwargs)

# Save current conversation state
original_all_messages = ConversationManager.get_messages()
original_coder = coder

temp_coder = await Coder.create(**new_kwargs)

# Re-initialize ConversationManager with temp coder
ConversationManager.initialize(temp_coder, reset=True, reformat=True)
ConversationManager.initialize(
temp_coder,
reset=True,
reformat=True,
preserve_tags=[MessageTag.DONE, MessageTag.CUR],
)

verbose = kwargs.get("verbose", False)
if verbose:
Expand All @@ -74,33 +80,13 @@ async def execute(cls, io, coder, args, **kwargs):
coder.total_cost = temp_coder.total_cost
coder.coder_commit_hashes = temp_coder.coder_commit_hashes

# Save temp coder's ALL messages
temp_all_messages = ConversationManager.get_messages()

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

# Restore original messages with all metadata
for msg in original_all_messages:
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(
message_dict=msg.message_dict,
tag=MessageTag(msg.tag),
priority=msg.priority,
mark_for_delete=msg.mark_for_delete,
force=True,
)
ConversationManager.initialize(
original_coder,
reset=True,
reformat=True,
preserve_tags=[MessageTag.DONE, MessageTag.CUR],
)

# Restore the original model configuration
from cecli.commands import SwitchCoderSignal
Expand Down
6 changes: 3 additions & 3 deletions cecli/helpers/conversation/base_message.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ class BaseMessage:
message_dict: Dict[str, Any]
tag: str
priority: int = field(default=0)
timestamp: int = field(default_factory=lambda: time.time_ns())
timestamp: int = field(default_factory=lambda: time.monotonic_ns())
mark_for_delete: Optional[int] = field(default=None)
hash_key: Optional[Tuple[str, ...]] = field(default=None)
message_id: str = field(init=False)
Expand Down Expand Up @@ -136,6 +136,6 @@ def __repr__(self) -> str:
content_preview = str(self.message_dict.get("content", ""))[:50]
return (
f"BaseMessage(id={self.message_id[:8]}..., "
f"tag={self.tag}, priority={self.priority}, "
f"role={role}, content='{content_preview}...')"
f"tag={self.tag}, priority={self.priority}, timestamp={self.timestamp}, "
f"role={role}, content='{content_preview}...', )"
)
Loading
Loading