simbiot-harness/venv/lib/python3.12/site-packages/strands/_identifier.py
Simbiot Harness b60439152b Simbiot Harness v0.1: тактовая лестница на Strands + CQRS/ES-спина
- 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 первым)
2026-09-29 15:28:50 +00:00

94 lines
3.2 KiB
Python

"""Strands identifier utilities."""
import enum
import os
import re
import threading
import time
import uuid
class Identifier(enum.Enum):
"""Strands identifier types."""
AGENT = "agent"
SESSION = "session"
def validate(id_: str, type_: Identifier) -> str:
"""Validate strands id.
Args:
id_: Id to validate.
type_: Type of the identifier (e.g., session id, agent id, etc.)
Returns:
Validated id.
Raises:
ValueError: If id contains path separators.
"""
if os.path.basename(id_) != id_:
raise ValueError(f"{type_.value}_id={id_} | id cannot contain path separators")
return id_
# UUIDv7 monotonic counter state (RFC 9562 method 2), persisted across calls so that ids minted
# inside the same millisecond are still ordered by an incrementing counter.
_uuid7_state_lock = threading.Lock()
_uuid7_last_timestamp_ms = -1
_uuid7_intra_ms_counter = 0
def new_uuid7() -> str:
"""Return a fresh, monotonic UUID version 7 (RFC 9562).
The 48-bit millisecond timestamp in the high bits makes lexicographic order equal creation
order, so a set of these ids can be listed oldest-first by sorting alone — no separate index.
Monotonic across calls, including bursts that mint more than 4096 ids inside one millisecond.
``uuid.uuid7`` is only available in Python 3.14+, below the SDK's floor, hence this
implementation.
"""
global _uuid7_last_timestamp_ms, _uuid7_intra_ms_counter
with _uuid7_state_lock:
now_ms = int(time.time() * 1000)
if now_ms > _uuid7_last_timestamp_ms:
_uuid7_last_timestamp_ms = now_ms
# Seed in the low half of the 12-bit field (fresh randomness for uniqueness) so at
# least 2048 increments fit before overflow.
_uuid7_intra_ms_counter = int.from_bytes(os.urandom(2), "big") & 0x07FF
else:
_uuid7_intra_ms_counter += 1
if _uuid7_intra_ms_counter > 0x0FFF:
# Counter exhausted within this millisecond: borrow from the clock by advancing
# the timestamp 1ms (RFC 9562 method 1), keeping ids strictly increasing rather
# than wrapping the counter field backwards.
_uuid7_last_timestamp_ms += 1
_uuid7_intra_ms_counter = int.from_bytes(os.urandom(2), "big") & 0x07FF
counter = _uuid7_intra_ms_counter
timestamp_ms = _uuid7_last_timestamp_ms
# Layout: 48-bit ms timestamp | version(7) | 12-bit counter | variant(0b10) | 62 random bits.
value = (timestamp_ms & ((1 << 48) - 1)) << 80
value |= 0x7 << 76
value |= (counter & 0x0FFF) << 64
value |= 0b10 << 62
value |= int.from_bytes(os.urandom(8), "big") & ((1 << 62) - 1)
return str(uuid.UUID(int=value))
# ``\A...\Z`` (not ``^...$``) so a trailing newline cannot slip past into a value derived from
# the id, such as a storage key.
_UUID7_PATTERN = re.compile(r"\A[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\Z")
def is_uuid7(value: str) -> bool:
"""Return True if the string is a canonical lowercase UUID version 7.
Args:
value: The string to check.
"""
return _UUID7_PATTERN.match(value) is not None