refactor(envelope): drop the reply counter and the injects line, keep time and vault changes

This commit is contained in:
hh
2026-08-29 02:38:39 +02:00
parent bc4233977d
commit 12728b2eb4
3 changed files with 16 additions and 48 deletions
+4 -10
View File
@@ -591,8 +591,6 @@ class Conversations:
raise ValueError(msg)
if agent is None and kind == "branch" and parent is not None:
agent = parent.agent_name
if kind == "branch" and parent is not None and parent.kind == "master":
await self.set_flags(parent, {"streak": 0})
agent = agent or self.default_agent(kind)
if agent is None:
msg = f"no default agent for kind {kind!r}; pass `agent`"
@@ -1291,7 +1289,7 @@ class Conversations:
if head.priority == "user":
origin = "user"
prompt = head.text
envelope = await self._envelope_for(conv, injects=len(batch) - 1)
envelope = self._envelope_for(conv)
if envelope:
prompt += "\n\n" + envelope
if len(batch) > 1:
@@ -1326,14 +1324,10 @@ class Conversations:
text=text,
)
async def _envelope_for(self, conv: Conversation, *, injects: int) -> str | None:
if conv.kind != "master":
def _envelope_for(self, conv: Conversation) -> str | None:
if conv.kind != "master" or self._envelope is None:
return None
streak = int(conv.flags.get("streak", 0) or 0)
await self.set_flags(conv, {"streak": streak + 1})
if self._envelope is None:
return None
return self._envelope.build(streak=streak, injects=injects)
return self._envelope.build()
def _observer(
self, conv: Conversation, runner: _Runner, turn_id: str, origin: str
+7 -25
View File
@@ -1,10 +1,10 @@
"""The envelope (§3.3): a background block after the user's text.
Assembled when the turn starts, never when the message is queued: the
time, how many replies the master gave in a row without opening a branch,
what changed in the vault since the last envelope (added lines for the
``full`` files, names and counts for the rest) and how many normal
injects ride along below. Ceilings keep it a signal, not a document.
time and what changed in the vault since the last envelope (added lines
for the ``full`` files, names and counts for the rest). Ceilings keep it
a signal, not a document; the injects that ride along are bundled below
it by the queue, with their own header.
"""
from __future__ import annotations
@@ -36,7 +36,7 @@ class Envelope:
names_only_within: float = 600.0
last_at: datetime | None = None
def build(self, *, streak: int, injects: int, now: datetime | None = None) -> str:
def build(self, *, now: datetime | None = None) -> str:
now = now or datetime.now(UTC)
changes = self.watch.take() if self.watch is not None else []
names_only = (
@@ -46,11 +46,9 @@ class Envelope:
text = render(
now=now,
tz=self.tz,
streak=streak,
changes=changes,
since=self.last_at,
names_only=names_only,
injects=injects,
max_lines=self.max_lines,
per_file=self.per_file,
)
@@ -62,30 +60,22 @@ def render(
*,
now: datetime,
tz: str,
streak: int,
changes: Sequence[Change],
since: datetime | None,
names_only: bool,
injects: int,
max_lines: int = 120,
per_file: int = 30,
) -> str:
zone = ZoneInfo(tz)
stamp = now.astimezone(zone)
lines = [
HEADER,
f"время: {stamp:%Y-%m-%d %H:%M} ({_zone_label(tz)})",
f"мастер: {_replies(streak)} подряд без ветки",
]
lines = [HEADER, f"время: {stamp:%Y-%m-%d %H:%M} ({_zone_label(tz)})"]
ordered = sorted(changes, key=lambda c: (not c.full, c.path))
since_label = (
f"с {since.astimezone(zone):%H:%M}" if since is not None else "со старта" # noqa: RUF001
)
if ordered:
names = ", ".join(f"{c.path} (+{c.added_count})" for c in ordered)
lines.append(f"vault, изменено {since_label} (mtime): {names}")
if injects:
lines.append(f"инжекты {since_label}: ({injects}) ниже")
lines.append(f"vault, изменено {since_label}: {names}")
if not names_only:
_append_diffs(lines, ordered, max_lines=max_lines, per_file=per_file)
return "\n".join(lines[:max_lines])
@@ -110,13 +100,5 @@ def _append_diffs(
budget -= 1
def _replies(n: int) -> str:
if n % 10 == 1 and n % 100 != 11:
return f"{n} реплика"
if 2 <= n % 10 <= 4 and not 12 <= n % 100 <= 14:
return f"{n} реплики"
return f"{n} реплик"
def _zone_label(tz: str) -> str:
return tz.rsplit("/", 1)[-1].replace("_", " ")