From b988d318176c8edb4fbcedec943052fc3b4c3380 Mon Sep 17 00:00:00 2001 From: Aly Raffauf Date: Sun, 28 Jun 2026 12:01:07 -0400 Subject: [PATCH] extract constants.py --- tartarus/agent_loop.py | 2 +- tartarus/audit.py | 6 ++++-- tartarus/background.py | 2 +- tartarus/broker.py | 3 +-- tartarus/config.py | 5 ++--- tartarus/constants.py | 11 +++++++++++ tartarus/jail.py | 10 +++++----- tartarus/manifest.py | 14 ++++++++------ tartarus/policy.py | 6 ++---- 9 files changed, 35 insertions(+), 24 deletions(-) create mode 100644 tartarus/constants.py diff --git a/tartarus/agent_loop.py b/tartarus/agent_loop.py index 2edba09..6576d76 100644 --- a/tartarus/agent_loop.py +++ b/tartarus/agent_loop.py @@ -136,7 +136,7 @@ class AgentLoop: worker.cancel() try: await asyncio.shield(worker) - except (asyncio.CancelledError, Exception): + except asyncio.CancelledError: pass raise finally: diff --git a/tartarus/audit.py b/tartarus/audit.py index 34c5c03..b0b1b3d 100644 --- a/tartarus/audit.py +++ b/tartarus/audit.py @@ -7,7 +7,9 @@ import os from datetime import UTC, datetime from typing import Any, Protocol -from pydantic import BaseModel, ConfigDict, Field +from pydantic import BaseModel, Field + +from tartarus.constants import STRICT_CONFIG from tartarus.jail import ExecResult from tartarus.manifest import Capability, Grant @@ -22,7 +24,7 @@ class AuditError(Exception): class AuditEvent(BaseModel): """A single brokered tool call, recorded to the audit log as JSONL.""" - model_config = ConfigDict(frozen=True, extra="forbid", strict=True) + model_config = STRICT_CONFIG call_id: str tool_name: str diff --git a/tartarus/background.py b/tartarus/background.py index c349ff7..dcc98cb 100644 --- a/tartarus/background.py +++ b/tartarus/background.py @@ -19,10 +19,10 @@ from dataclasses import dataclass from datetime import UTC, datetime from tartarus.audit import AuditEvent, AuditSink, NullAuditLog +from tartarus.constants import DEFAULT_OUTPUT_TRUNCATE_CHARS from tartarus.jail import BackgroundHandle, ExecResult from tartarus.models import ToolResult -DEFAULT_OUTPUT_TRUNCATE_CHARS = 10_000 MAX_UTF8_BYTES_PER_CHAR = 4 diff --git a/tartarus/broker.py b/tartarus/broker.py index 3df1672..d83fad4 100644 --- a/tartarus/broker.py +++ b/tartarus/broker.py @@ -12,13 +12,12 @@ from collections.abc import Callable from tartarus.audit import AuditEvent, AuditSink, NullAuditLog from tartarus.background import BackgroundError, BackgroundRegistry +from tartarus.constants import DEFAULT_OUTPUT_TRUNCATE_CHARS from tartarus.jail import JailBuilder, JailError from tartarus.manifest import Capability, Manifest, Param from tartarus.models import ToolCall, ToolResult from tartarus.policy import Decision, PolicyEngine -DEFAULT_OUTPUT_TRUNCATE_CHARS = 10_000 - # Declared param type -> the Python type a valid argument must be an instance of. _JSON_TYPE_TO_PYTHON = { "string": str, diff --git a/tartarus/config.py b/tartarus/config.py index 115d7b4..e343020 100644 --- a/tartarus/config.py +++ b/tartarus/config.py @@ -12,7 +12,6 @@ import os from pydantic import ( AliasChoices, BaseModel, - ConfigDict, Field, ValidationError, model_validator, @@ -20,6 +19,7 @@ from pydantic import ( from pydantic_settings import BaseSettings, SettingsConfigDict from typing_extensions import Self +from tartarus.constants import DEFAULT_OUTPUT_TRUNCATE_CHARS, STRICT_CONFIG from tartarus.manifest import Manifest, Sampling DEFAULT_BASE_URL = "https://opencode.ai/zen/v1" @@ -32,7 +32,6 @@ DEFAULT_STATE_DIR = ".tartarus" # Leaf names under /.tartarus, shared by every path-deriving call site. AUDIT_LOG_LEAF = "audit.jsonl" SESSIONS_LEAF = "sessions" -DEFAULT_OUTPUT_TRUNCATE_CHARS = 10_000 # `path:` copies the directory regardless of git tracking, which keeps local # capability edits visible before they are committed. DEFAULT_FLAKE_REF = "path:." @@ -165,7 +164,7 @@ class ResolvedRuntime(BaseModel): otherwise the built-in default. api_key is env-only (a secret) and required. """ - model_config = ConfigDict(frozen=True, extra="forbid", strict=True) + model_config = STRICT_CONFIG provider_type: str base_url: str diff --git a/tartarus/constants.py b/tartarus/constants.py new file mode 100644 index 0000000..6e6b7a8 --- /dev/null +++ b/tartarus/constants.py @@ -0,0 +1,11 @@ +"""Cross-cutting constants shared across the harness. + +This is a leaf module — it imports nothing from other tartarus modules, so it +can be imported anywhere without circular-dependency risk. +""" + +from pydantic import ConfigDict + +STRICT_CONFIG = ConfigDict(frozen=True, extra="forbid", strict=True) + +DEFAULT_OUTPUT_TRUNCATE_CHARS = 10_000 diff --git a/tartarus/jail.py b/tartarus/jail.py index c093086..7cc4ce6 100644 --- a/tartarus/jail.py +++ b/tartarus/jail.py @@ -22,7 +22,9 @@ from collections.abc import Callable from dataclasses import dataclass, field from typing import Literal -from pydantic import ConfigDict, ValidationError, field_validator +from pydantic import ValidationError, field_validator + +from tartarus.constants import STRICT_CONFIG from pydantic.dataclasses import dataclass as strict_dataclass from tartarus.manifest import Grant @@ -32,14 +34,12 @@ DEFAULT_JAIL_TIMEOUT_SECONDS = 30 TIMEOUT_EXIT_CODE = 124 # matches coreutils `timeout` OUTPUT_READ_CHUNK_BYTES = 16 * 1024 -_STRICT = ConfigDict(frozen=True, extra="forbid", strict=True) - class JailError(Exception): """Raised when a jail cannot be built or run as requested.""" -@strict_dataclass(config=_STRICT) +@strict_dataclass(config=STRICT_CONFIG) class ExecResult: code: int stdout: str @@ -64,7 +64,7 @@ class BackgroundHandle: proxy: FilteringProxy | None = None -@strict_dataclass(config=_STRICT) +@strict_dataclass(config=STRICT_CONFIG) class JailSpec: work_tree: str shell_path: str diff --git a/tartarus/manifest.py b/tartarus/manifest.py index 1c5f12f..9150bdc 100644 --- a/tartarus/manifest.py +++ b/tartarus/manifest.py @@ -10,7 +10,9 @@ from __future__ import annotations import string from typing import Any, Literal -from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator +from pydantic import BaseModel, Field, field_validator, model_validator + +from tartarus.constants import STRICT_CONFIG from typing_extensions import Self @@ -20,7 +22,7 @@ from typing_extensions import Self class Grant(BaseModel): """The host reach a capability opens. Empty means "nothing beyond the shell".""" - model_config = ConfigDict(frozen=True, extra="forbid", strict=True) + model_config = STRICT_CONFIG package_bins: list[str] = Field(default_factory=list) allowed_hosts: list[str] = Field(default_factory=list) @@ -75,7 +77,7 @@ class Grant(BaseModel): class Param(BaseModel): - model_config = ConfigDict(frozen=True, extra="forbid", strict=True) + model_config = STRICT_CONFIG type: Literal["string", "integer", "boolean", "array"] description: str = "" @@ -103,7 +105,7 @@ class Param(BaseModel): class Capability(BaseModel): - model_config = ConfigDict(frozen=True, extra="forbid", strict=True) + model_config = STRICT_CONFIG name: str description: str = "" @@ -202,7 +204,7 @@ class ModelConfig(BaseModel): Nix store. """ - model_config = ConfigDict(frozen=True, extra="forbid", strict=True) + model_config = STRICT_CONFIG base_url: str | None = None name: str | None = None @@ -247,7 +249,7 @@ class ModelConfig(BaseModel): class Manifest(BaseModel): - model_config = ConfigDict(frozen=True, extra="forbid", strict=True) + model_config = STRICT_CONFIG tools: list[dict] capabilities: dict[str, Capability] diff --git a/tartarus/policy.py b/tartarus/policy.py index 5afdf9f..c3304e5 100644 --- a/tartarus/policy.py +++ b/tartarus/policy.py @@ -15,18 +15,16 @@ import sys from collections.abc import Callable from typing import Literal -from pydantic import ConfigDict from pydantic.dataclasses import dataclass +from tartarus.constants import STRICT_CONFIG from tartarus.manifest import Capability, Grant # Decides one prompt: (capability, arguments, interpolated command) -> approved? PromptFn = Callable[[Capability, dict, str], bool] -_STRICT = ConfigDict(frozen=True, extra="forbid", strict=True) - -@dataclass(config=_STRICT) +@dataclass(config=STRICT_CONFIG) class Decision: allowed: bool reason: str -- 2.51.2