- harness/es.py: append-only event store + проекции (образец — кооп-портал) - harness/levels.py: уровни 1с/1м/1ч/1д, контекст ∝ масштабу - harness/scheduler.py: уровневые потоки, идемпотентные тики, absorbed-стабы - harness/isolated_runner.py + _llm_worker.py: LLM-тик в сабпроцессе (глобальный asyncio-рантайм Strands не переживает 2+ create_harness) - cli.py: init/task/tasks/status/events + requeue (написан самим минутным агентом) - 9router: отдельный ключ sk-simbiot, модель auto (glm-5.3 первым)
43 lines
1.2 KiB
Python
43 lines
1.2 KiB
Python
from __future__ import annotations
|
|
|
|
import secrets
|
|
import threading
|
|
|
|
import anyio
|
|
|
|
|
|
class PingManagerBase:
|
|
def _generate_id(self) -> bytes:
|
|
return secrets.token_bytes()
|
|
|
|
|
|
class PingManager(PingManagerBase):
|
|
def __init__(self) -> None:
|
|
self._pings: dict[bytes, threading.Event] = {}
|
|
|
|
def create(self, ping_id: bytes | None = None) -> tuple[bytes, threading.Event]:
|
|
ping_id = self._generate_id() if not ping_id else ping_id
|
|
event = threading.Event()
|
|
self._pings[ping_id] = event
|
|
return ping_id, event
|
|
|
|
def ack(self, ping_id: bytes | bytearray) -> None:
|
|
event = self._pings.pop(bytes(ping_id), None)
|
|
if event is not None:
|
|
event.set()
|
|
|
|
|
|
class AsyncPingManager(PingManagerBase):
|
|
def __init__(self) -> None:
|
|
self._pings: dict[bytes, anyio.Event] = {}
|
|
|
|
def create(self, ping_id: bytes | None = None) -> tuple[bytes, anyio.Event]:
|
|
ping_id = self._generate_id() if not ping_id else ping_id
|
|
event = anyio.Event()
|
|
self._pings[ping_id] = event
|
|
return ping_id, event
|
|
|
|
def ack(self, ping_id: bytes | bytearray) -> None:
|
|
event = self._pings.pop(bytes(ping_id), None)
|
|
if event is not None:
|
|
event.set()
|