bcbd1bdb22
Integ / changes (push) Has been skipped
Pre-commit / pre-commit (push) Failing after 1s
CLI exit codes / changes (push) Has been skipped
Test (Install) / changes (push) Has been skipped
Test (Python) / changes (push) Has been skipped
Test (TypeScript) / changes (push) Has been skipped
CLI exit codes / cli-gate (push) Has been cancelled
Test (Install) / test-install-gate (push) Has been cancelled
Integ / integ-gate (push) Has been cancelled
Test (Python) / test-python-gate (push) Has been cancelled
Test (TypeScript) / test-typescript-gate (push) Has been cancelled
Test (Install) / python-minimal (3.12) (push) Has been cancelled
Test (Install) / python-minimal (3.11) (push) Has been cancelled
Test (Install) / python-extra (agno, mirage.agents.agno) (push) Has been cancelled
Test (Install) / python-extra (chroma, mirage.resource.chroma) (push) Has been cancelled
Test (Install) / python-extra (pdf, mirage.core.filetype.pdf) (push) Has been cancelled
Integ / integ (push) Has been cancelled
Integ / integ-database (push) Has been cancelled
Integ / integ-database-ts (push) Has been cancelled
Integ / integ-data (push) Has been cancelled
Integ / integ-ssh (push) Has been cancelled
Integ / integ-ssh-ts (push) Has been cancelled
Test (Python) / audit (push) Has been cancelled
Test (TypeScript) / test (push) Has been cancelled
Test (TypeScript) / python-fs-shim (push) Has been cancelled
CLI exit codes / Python CLI (push) Has been cancelled
CLI exit codes / TypeScript CLI (push) Has been cancelled
CLI exit codes / Cross-language snapshot interop (push) Has been cancelled
Test (Python) / test (push) Has been cancelled
Test (Python) / import-isolation (deepagents, openai, mirage.agents.openai_agents) (push) Has been cancelled
Test (Python) / import-isolation (deepagents, pydantic-ai, mirage.agents.pydantic_ai) (push) Has been cancelled
Integ / integ-ts (push) Has been cancelled
Integ / integ-fuse (push) Has been cancelled
Test (Install) / python-extra (databricks, mirage.resource.databricks_volume) (push) Has been cancelled
Test (Install) / python-extra (deepagents, mirage.agents.langchain) (push) Has been cancelled
Test (Install) / python-extra (email, mirage.resource.email) (push) Has been cancelled
Test (Install) / python-extra (fuse, mirage.fuse.mount) (push) Has been cancelled
Test (Install) / python-extra (hdf5, mirage.core.filetype.hdf5) (push) Has been cancelled
Test (Install) / python-extra (hf, mirage.resource.hf_buckets) (push) Has been cancelled
Test (Install) / python-extra (lancedb, mirage.resource.lancedb) (push) Has been cancelled
Test (Install) / python-extra (langfuse, mirage.resource.langfuse) (push) Has been cancelled
Test (Install) / python-extra (mongodb, mirage.resource.mongodb) (push) Has been cancelled
Test (Install) / python-extra (nextcloud, mirage.resource.nextcloud) (push) Has been cancelled
Test (Install) / python-extra (openai, mirage.agents.openai_agents) (push) Has been cancelled
Test (Install) / python-extra (openhands, mirage.agents.openhands, 3.12) (push) Has been cancelled
Test (Install) / python-extra (parquet, mirage.core.filetype.parquet) (push) Has been cancelled
Test (Install) / python-extra (postgres, mirage.resource.postgres) (push) Has been cancelled
Test (Install) / python-extra (pydantic-ai, mirage.agents.pydantic_ai) (push) Has been cancelled
Test (Install) / python-extra (qdrant, mirage.resource.qdrant) (push) Has been cancelled
Test (Install) / python-extra (redis, mirage.resource.redis) (push) Has been cancelled
Test (Install) / python-extra (s3, mirage.resource.s3) (push) Has been cancelled
Test (Install) / python-extra (ssh, mirage.resource.ssh) (push) Has been cancelled
Test (Install) / ts-minimal (push) Has been cancelled
69 lines
2.9 KiB
Python
69 lines
2.9 KiB
Python
# ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
# ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========
|
|
|
|
from dataclasses import dataclass, field
|
|
|
|
|
|
@dataclass
|
|
class OpRecord:
|
|
"""A single observed I/O operation.
|
|
|
|
Args:
|
|
op (str): Operation type ("read", "write", "stat", "readdir", etc.).
|
|
path (str): Virtual path (mount_prefix + rel_path).
|
|
source (str): Resource name ("s3", "ram", "disk").
|
|
bytes (int): Bytes transferred (0 for metadata ops).
|
|
timestamp (int): UTC epoch milliseconds.
|
|
duration_ms (int): Wall-clock duration.
|
|
mount_prefix (str): The mount prefix this op was served through
|
|
(e.g. "/s3"). Empty when recorded outside any mount frame.
|
|
Stored explicitly so consumers don't have to re-derive it
|
|
from the virtual path.
|
|
fingerprint (str | None): For read ops on a backend that supports
|
|
snapshot+replay, the content-derived identifier the backend
|
|
returned (e.g. S3 ``ETag``, md5). Used to detect drift at
|
|
replay time. Captured at read time so the snapshot reflects
|
|
what the agent actually saw. None for writes, metadata ops,
|
|
and backends without snapshot support.
|
|
revision (str | None): For read ops on a backend that exposes
|
|
stable revision handles (S3 ``VersionId``, Drive
|
|
``revisionId``, Git commit SHA), the value the backend
|
|
returned. Used to pin reads at replay time so the original
|
|
bytes can be re-fetched even if the live object has moved on.
|
|
Strictly stronger than ``fingerprint`` — populated only by
|
|
backends that can guarantee revision durability.
|
|
"""
|
|
|
|
op: str
|
|
path: str
|
|
source: str
|
|
bytes: int
|
|
timestamp: int
|
|
duration_ms: int
|
|
mount_prefix: str = field(default="")
|
|
fingerprint: str | None = field(default=None)
|
|
revision: str | None = field(default=None)
|
|
|
|
@property
|
|
def is_cache(self) -> bool:
|
|
"""Whether this op was served from the in-memory cache."""
|
|
return self.source == "ram"
|
|
|
|
@property
|
|
def rel_path(self) -> str:
|
|
"""Path relative to the mount root (strips mount_prefix)."""
|
|
if self.mount_prefix and self.path.startswith(self.mount_prefix):
|
|
return self.path[len(self.mount_prefix):] or "/"
|
|
return self.path
|