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
748 lines
30 KiB
Python
748 lines
30 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. =========
|
|
|
|
import asyncio
|
|
import copy as _copy
|
|
import json
|
|
import os
|
|
import tempfile
|
|
import uuid
|
|
|
|
from dotenv import load_dotenv
|
|
|
|
from mirage import MountMode, Workspace
|
|
from mirage.commands.config import command
|
|
from mirage.resource.ram import RAMResource
|
|
from mirage.resource.s3 import S3Config, S3Resource
|
|
from mirage.workspace.snapshot import ContentDriftError
|
|
|
|
load_dotenv(".env.development")
|
|
|
|
config = S3Config(
|
|
bucket=os.environ["AWS_S3_BUCKET"],
|
|
region=os.environ.get("AWS_DEFAULT_REGION", "us-east-1"),
|
|
aws_access_key_id=os.environ["AWS_ACCESS_KEY_ID"],
|
|
aws_secret_access_key=os.environ["AWS_SECRET_ACCESS_KEY"],
|
|
)
|
|
|
|
deep_config = S3Config(
|
|
bucket=os.environ["AWS_S3_BUCKET"],
|
|
region=os.environ.get("AWS_DEFAULT_REGION", "us-east-1"),
|
|
aws_access_key_id=os.environ["AWS_ACCESS_KEY_ID"],
|
|
aws_secret_access_key=os.environ["AWS_SECRET_ACCESS_KEY"],
|
|
key_prefix="subdata/subsubdata/",
|
|
)
|
|
|
|
backend = S3Resource(config)
|
|
deep_backend = S3Resource(deep_config)
|
|
ws = Workspace(
|
|
{
|
|
"/s3/": backend,
|
|
"/deep/": deep_backend,
|
|
},
|
|
mode=MountMode.READ,
|
|
)
|
|
|
|
|
|
def ops_summary() -> str:
|
|
ops = ws.ops
|
|
net = ops.network_bytes
|
|
cache = ops.cache_bytes
|
|
return (f"{len(ops.records)} ops, "
|
|
f"{net} net, {cache} cache")
|
|
|
|
|
|
S3_GET_PER_1K_USD = 0.0004
|
|
S3_EGRESS_PER_GB_USD = 0.09
|
|
|
|
|
|
def _price_wrap(original):
|
|
"""Wrap a registered estimator so its bytes/ops become dollars."""
|
|
|
|
async def priced(accessor, paths, *texts, **kwargs):
|
|
result = await original(accessor, paths, *texts, **kwargs)
|
|
egress = result.network_read_high * S3_EGRESS_PER_GB_USD / 1e9
|
|
requests = result.read_ops * S3_GET_PER_1K_USD / 1000
|
|
result.estimated_cost_usd = egress + requests
|
|
return result
|
|
|
|
return priced
|
|
|
|
|
|
_BUILTIN_CAT = ws.mount("/s3/").resolve_command("cat", None)
|
|
|
|
|
|
@command("cat",
|
|
resource="s3",
|
|
spec=_BUILTIN_CAT.spec,
|
|
provision=_price_wrap(_BUILTIN_CAT.provision_fn))
|
|
async def priced_cat(accessor, paths, *texts, **kwargs):
|
|
return await _BUILTIN_CAT.fn(accessor, paths, *texts, **kwargs)
|
|
|
|
|
|
def price_cat_reads(workspace: Workspace, mount_path: str) -> None:
|
|
"""Attach an S3 price model to cat on one mount.
|
|
|
|
The builtin estimator already computes bytes and request counts;
|
|
the @command decorator registers a cat that keeps the builtin
|
|
execution fn but carries a wrapped estimator converting them into
|
|
estimated_cost_usd, which the planner then combines across pipes,
|
|
branches, and loops like any other field (all-or-nothing: a stage
|
|
without a cost drops the total).
|
|
"""
|
|
workspace.mount(mount_path).register_fns([priced_cat])
|
|
|
|
|
|
async def main():
|
|
# ── key_prefix mount: multi-segment subpath scoping ──
|
|
# Mounts the same bucket twice: /s3/ unscoped, /deep/ scoped to
|
|
# subdata/subsubdata/. Every operation against /deep/X resolves
|
|
# to s3://bucket/subdata/subsubdata/X with the prefix transparent
|
|
# to the agent.
|
|
print("=== KEY_PREFIX MOUNT (subdata/subsubdata/) ===\n")
|
|
|
|
print(f" key_prefix = {deep_config.key_prefix!r}")
|
|
print(" /deep/X ←→ s3://bucket/subdata/subsubdata/X\n")
|
|
|
|
async def run(cmd: str, label: str | None = None) -> str:
|
|
r = await ws.execute(cmd)
|
|
out = (await r.stdout_str()).strip()
|
|
tag = label or cmd
|
|
head = out.splitlines()[0] if out else ""
|
|
more = f" (+{len(out.splitlines()) - 1} more)" if "\n" in out else ""
|
|
print(f" $ {tag}\n {head[:110]}{more} [exit={r.exit_code}]")
|
|
return out
|
|
|
|
# ── listings ──
|
|
print("[listings]")
|
|
await run("ls /deep")
|
|
await run("ls -1 /deep")
|
|
await run("ls -la /deep")
|
|
|
|
# ── stat ──
|
|
print("\n[stat]")
|
|
await run("stat /deep/example.jsonl")
|
|
await run("stat /deep/example.json")
|
|
await run("stat /deep")
|
|
|
|
# ── existence ──
|
|
print("\n[exists]")
|
|
await run("test -f /deep/example.jsonl && echo present || echo absent")
|
|
await run("test -f /deep/no-such.txt && echo present || echo absent")
|
|
await run("test -d /deep && echo dir-present")
|
|
|
|
# ── reads ──
|
|
print("\n[read]")
|
|
await run("head -n 1 /deep/example.jsonl")
|
|
await run("tail -n 1 /deep/example.jsonl")
|
|
await run("wc -l /deep/example.jsonl")
|
|
await run("wc -c /deep/example.json")
|
|
|
|
# ── grep variants ──
|
|
print("\n[grep]")
|
|
await run("grep -c mirage /deep/example.jsonl")
|
|
await run("grep -m 1 mirage /deep/example.jsonl")
|
|
await run("grep -i MIRAGE /deep/example.jsonl | wc -l")
|
|
await run("grep -n queue-operation /deep/example.jsonl | head -n 1")
|
|
await run("grep -v queue-operation /deep/example.jsonl | wc -l")
|
|
|
|
# ── rg (the formerly-broken double-prefix case) ──
|
|
print("\n[rg]")
|
|
await run("rg -l mirage /deep")
|
|
await run("rg -c mirage /deep/example.json")
|
|
await run("rg -n queue-operation /deep/example.jsonl | head -n 1")
|
|
|
|
# ── find / du ──
|
|
print("\n[find / du]")
|
|
await run("find /deep -name '*.json'")
|
|
await run("find /deep -name 'example.*' | wc -l")
|
|
await run("find /deep -type f | wc -l")
|
|
await run("du /deep/example.jsonl")
|
|
|
|
# ── glob expansion ──
|
|
print("\n[glob]")
|
|
await run("echo /deep/*.json")
|
|
await run("echo /deep/example.*")
|
|
await run("for f in /deep/*.json; do wc -c $f; done")
|
|
|
|
# ── jq (validates content equivalence) ──
|
|
print("\n[jq]")
|
|
await run("jq .metadata.version /deep/example.json")
|
|
await run("jq '.departments[].teams[].name' /deep/example.json")
|
|
|
|
# ── pipelines / control flow ──
|
|
print("\n[pipelines]")
|
|
await run("cat /deep/example.jsonl | grep mirage | wc -l")
|
|
await run("grep queue-operation /deep/example.jsonl"
|
|
" | head -n 2 | cut -d , -f 1")
|
|
await run("grep -m 1 mirage /deep/example.jsonl && echo found")
|
|
await run("grep ZZZ_NOPE /deep/example.jsonl || echo fallback")
|
|
|
|
# ── parity vs /s3/ (same bucket, same object, different mount) ──
|
|
print("\n[parity vs /s3/]")
|
|
a = await (await
|
|
ws.execute("grep -c mirage /deep/example.jsonl")).stdout_str()
|
|
b = await (await ws.execute(
|
|
"grep -c mirage /s3/subdata/subsubdata/example.jsonl")).stdout_str()
|
|
print(f" /deep/example.jsonl grep -c: {a.strip()}")
|
|
print(f" /s3/subdata/subsubdata/example.jsonl grep -c: {b.strip()}")
|
|
print(f" parity: {a.strip() == b.strip()}")
|
|
|
|
# ── get_state ──
|
|
print("\n[get_state]")
|
|
state = deep_backend.get_state()
|
|
print(f" config.key_prefix = {state['config'].get('key_prefix')!r}")
|
|
print(f" access key = {state['config']['aws_access_key_id']}")
|
|
|
|
# ── root listing (tests stat on directory prefixes) ──
|
|
print("\n=== ROOT LISTING ===\n")
|
|
|
|
print("--- ls /s3/ ---")
|
|
r = await ws.execute("ls /s3/")
|
|
print(f" {(await r.stdout_str()).strip()}")
|
|
|
|
print("\n--- tree -L 1 /s3/ ---")
|
|
r = await ws.execute("tree -L 1 /s3/")
|
|
print(f" {(await r.stdout_str()).strip()}")
|
|
|
|
print("\n--- stat /s3/data ---")
|
|
r = await ws.execute("stat /s3/data")
|
|
print(f" {(await r.stdout_str()).strip()}")
|
|
|
|
# ── plan: estimate before executing ──
|
|
print("\n=== PLAN ESTIMATES ===\n")
|
|
|
|
dr = await ws.execute("grep mirage /s3/data/example.jsonl", provision=True)
|
|
print("--- plan: grep mirage /s3/data/example.jsonl ---")
|
|
print(f" network_read: {dr.network_read}, cache_read: {dr.cache_read}")
|
|
print(f" read_ops: {dr.read_ops}, precision: {dr.precision}")
|
|
|
|
dr = await ws.execute("grep mirage /s3/data/example.jsonl | head -n 3",
|
|
provision=True)
|
|
print("\n--- plan: grep mirage ... | head -n 3 ---")
|
|
print(f" op: {dr.op}, children: {len(dr.children)}")
|
|
print(f" network_read: {dr.network_read}, cache_read: {dr.cache_read}")
|
|
print(f" precision: {dr.precision}")
|
|
for c in dr.children:
|
|
net, cache = c.network_read, c.cache_read
|
|
print(f" {c.command}: net={net}, cache={cache}, {c.precision}")
|
|
|
|
dr = await ws.execute("grep mirage /s3/data/example.jsonl && echo found",
|
|
provision=True)
|
|
print("\n--- plan: grep ... && echo found ---")
|
|
print(f" op: {dr.op}, network_read: {dr.network_read}")
|
|
for c in dr.children:
|
|
print(f" {c.command}: net={c.network_read}, {c.precision}")
|
|
|
|
print(f"\n Stats after plans (should be 0): {ops_summary()}")
|
|
|
|
# ── cache-aware plan ──
|
|
# Read file to populate cache (cat declares cache, wc materializes)
|
|
print("\n--- caching: cat /s3/data/example.jsonl | wc -l ---")
|
|
result = await ws.execute("cat /s3/data/example.jsonl | wc -l")
|
|
print(f" lines: {(await result.stdout_str()).strip()}")
|
|
print(f" Stats after caching: {ops_summary()}")
|
|
|
|
dr = await ws.execute("grep mirage /s3/data/example.jsonl", provision=True)
|
|
print("\n--- plan after cache: grep mirage ... ---")
|
|
print(f" network_read: {dr.network_read}, cache_read: {dr.cache_read}")
|
|
print(f" cache_hits: {dr.cache_hits}, read_ops: {dr.read_ops}")
|
|
|
|
# ── cost model: attach dollars to the byte estimates ──
|
|
print("\n=== PROVISION COST MODEL ===\n")
|
|
price_cat_reads(ws, "/s3/data")
|
|
dr = await ws.execute("cat /s3/data/example.jsonl", provision=True)
|
|
print("--- priced plan: cat /s3/data/example.jsonl ---")
|
|
print(f" network_read: {dr.network_read}, read_ops: {dr.read_ops}")
|
|
print(f" estimated_cost_usd: {dr.estimated_cost_usd:.10f}")
|
|
|
|
dr = await ws.execute(
|
|
"for i in 1 2 3; do cat /s3/data/example.jsonl; done", provision=True)
|
|
print("--- priced plan: for-loop x3 ---")
|
|
print(f" network_read: {dr.network_read}, "
|
|
f"estimated_cost_usd: {dr.estimated_cost_usd:.10f}")
|
|
|
|
dr = await ws.execute("cat /s3/data/example.jsonl | wc -l", provision=True)
|
|
print("--- priced plan: cat | wc (wc has no cost model) ---")
|
|
print(f" estimated_cost_usd: {dr.estimated_cost_usd} "
|
|
"(all-or-nothing: an unpriced stage drops the total)")
|
|
|
|
print("\n=== ACTUAL EXECUTION ===\n")
|
|
|
|
# ── simple grep ──
|
|
print("--- grep mirage /s3/data/example.jsonl ---")
|
|
output = await (
|
|
await ws.execute("grep mirage /s3/data/example.jsonl")).stdout_str()
|
|
lines = output.strip().splitlines() if output.strip() else []
|
|
print(f" Matches: {len(lines)}")
|
|
if lines:
|
|
print(f" First: {lines[0][:80]}...")
|
|
print(f" Stats: {ops_summary()}")
|
|
|
|
# ── grep with limit ──
|
|
print("\n--- grep -m 1 mirage /s3/data/example.jsonl ---")
|
|
output = await (
|
|
await
|
|
ws.execute("grep -m 1 mirage /s3/data/example.jsonl")).stdout_str()
|
|
lines = output.strip().splitlines() if output.strip() else []
|
|
print(f" Matches: {len(lines)}")
|
|
print(f" Stats: {ops_summary()}")
|
|
|
|
# ── pipe: grep | wc -l ──
|
|
print("\n--- grep mirage /s3/data/example.jsonl | wc -l ---")
|
|
result = await ws.execute("grep mirage /s3/data/example.jsonl | wc -l")
|
|
print(f" Count: {(await result.stdout_str()).strip()}")
|
|
print(f" Exit code: {result.exit_code}")
|
|
print(f" Stats: {ops_summary()}")
|
|
|
|
# ── pipe: grep | head ──
|
|
print("\n--- grep mirage /s3/data/example.jsonl | head -n 3 ---")
|
|
result = await ws.execute("grep mirage /s3/data/example.jsonl | head -n 3")
|
|
lines = (await result.stdout_str()).strip().splitlines()
|
|
print(f" Lines: {len(lines)}")
|
|
for ln in lines:
|
|
print(f" {ln[:80]}...")
|
|
print(f" Stats: {ops_summary()}")
|
|
|
|
# ── pipe: cat | grep | sort | uniq ──
|
|
print("\n--- cat /s3/data/example.jsonl"
|
|
" | grep queue-operation | sort | uniq ---")
|
|
result = await ws.execute(
|
|
"cat /s3/data/example.jsonl | grep queue-operation | sort | uniq")
|
|
lines = ((await result.stdout_str()).strip().splitlines() if
|
|
(await result.stdout_str()).strip() else [])
|
|
print(f" Unique lines: {len(lines)}")
|
|
print(f" Stats: {ops_summary()}")
|
|
|
|
# ── pipe: grep | cut (extract field) ──
|
|
print("\n--- rg queue-operation /s3/data/example.jsonl"
|
|
" | head -n 5 | cut -d , -f 2 ---")
|
|
result = await ws.execute(
|
|
"rg queue-operation /s3/data/example.jsonl | head -n 5 | cut -d , -f 2"
|
|
)
|
|
print(f" Fields:\n {(await result.stdout_str()).strip()}")
|
|
print(f" Stats: {ops_summary()}")
|
|
|
|
# ── && chain: grep && echo ──
|
|
print("\n--- grep -m 1 mirage /s3/data/example.jsonl"
|
|
" && echo 'found mirage' ---")
|
|
result = await ws.execute(
|
|
"grep -m 1 mirage /s3/data/example.jsonl && echo found")
|
|
print(f" Exit code: {result.exit_code}")
|
|
print(
|
|
f" Stdout ends with: ...{(await result.stdout_str()).strip()[-30:]}")
|
|
print(f" Stats: {ops_summary()}")
|
|
|
|
# ── || chain: grep nonexistent || echo fallback ──
|
|
print("\n--- grep NONEXISTENT /s3/data/example.jsonl"
|
|
" || echo 'not found' ---")
|
|
result = await ws.execute(
|
|
"grep NONEXISTENT /s3/data/example.jsonl || echo not_found")
|
|
print(f" Exit code: {result.exit_code}")
|
|
print(f" Output: {(await result.stdout_str()).strip()}")
|
|
print(f" Stats: {ops_summary()}")
|
|
|
|
# ── subshell: (grep | sort | uniq) | wc -l ──
|
|
print("\n--- (grep queue-operation /s3/data/example.jsonl"
|
|
" | sort | uniq) | wc -l ---")
|
|
result = await ws.execute(
|
|
"(grep queue-operation /s3/data/example.jsonl | sort | uniq) | wc -l")
|
|
print(f" Unique queue ops: {(await result.stdout_str()).strip()}")
|
|
print(f" Stats: {ops_summary()}")
|
|
|
|
# ── semicolon: multiple independent reads ──
|
|
print("\n--- head -n 1 /s3/data/example.jsonl"
|
|
" ; wc -l /s3/data/example.jsonl ---")
|
|
result = await ws.execute(
|
|
"head -n 1 /s3/data/example.jsonl ; wc -l /s3/data/example.jsonl")
|
|
print(f" Output: {(await result.stdout_str()).strip()}")
|
|
print(f" Stats: {ops_summary()}")
|
|
|
|
# ── lazy multi-pipe: grep | grep | head | cut ──
|
|
# Each pipe stage is an AsyncIterator[bytes]. Data streams lazily
|
|
# from S3 through grep → grep → head → cut. When head -n 2 has
|
|
# emitted 2 lines it stops pulling, which back-pressures upstream:
|
|
# the second grep stops, the first grep stops, and the S3 download
|
|
# is abandoned early — only a fraction of the file is ever read.
|
|
print("\n--- lazy multi-pipe: grep | grep -v | head | cut ---")
|
|
result = await ws.execute("grep queue-operation /s3/data/example.jsonl"
|
|
" | grep -v error | head -n 2 | cut -d , -f 1")
|
|
print(f" Output:\n {(await result.stdout_str()).strip()}")
|
|
|
|
# Compare: same pipeline without head reads the entire file
|
|
result_full = await ws.execute(
|
|
"grep queue-operation /s3/data/example.jsonl"
|
|
" | grep -v error | cut -d , -f 1")
|
|
full_lines = (await result_full.stdout_str()).strip().splitlines()
|
|
print(f" Without head: {len(full_lines)} lines (full S3 download)")
|
|
|
|
# ── recursive search ──
|
|
print("\n--- rg -l mirage /s3/data ---")
|
|
output = await (await ws.execute("rg -l mirage /s3/data")).stdout_str()
|
|
lines = output.strip().splitlines() if output.strip() else []
|
|
print(f" Files: {lines}")
|
|
print(f" Stats: {ops_summary()}")
|
|
|
|
# ── jq: structured JSON queries ──
|
|
print("\n=== JQ QUERIES ===\n")
|
|
|
|
print("--- jq .metadata ---")
|
|
result = await ws.execute("jq .metadata /s3/data/example.json")
|
|
print(f" {(await result.stdout_str()).strip()}")
|
|
|
|
print("\n--- jq: all team names (nested [] iterator) ---")
|
|
result = await ws.execute(
|
|
"jq \".departments[].teams[].name\" /s3/data/example.json")
|
|
print(f" {(await result.stdout_str()).strip()}")
|
|
|
|
print("\n--- jq: all employee names ---")
|
|
result = await ws.execute("jq \".departments[].teams[].members[].name\""
|
|
" /s3/data/example.json")
|
|
print(f" {(await result.stdout_str()).strip()}")
|
|
|
|
print("\n--- jq: senior engineers on platform ---")
|
|
result = await ws.execute("jq \".departments[0].teams[0].members"
|
|
" | map(select(.level == \\\"senior\\\"))"
|
|
" | map(.name)\" /s3/data/example.json")
|
|
print(f" {(await result.stdout_str()).strip()}")
|
|
|
|
print("\n--- jq: all active project names ---")
|
|
result = await ws.execute("jq \".departments[].teams[].projects"
|
|
" | map(select(.status == \\\"active\\\"))"
|
|
" | map(.name)\" /s3/data/example.json")
|
|
print(f" {(await result.stdout_str()).strip()}")
|
|
|
|
print("\n--- jq: mirage project metrics ---")
|
|
result = await ws.execute("jq .departments[0].teams[0].projects[0].metrics"
|
|
" /s3/data/example.json")
|
|
print(f" {(await result.stdout_str()).strip()}")
|
|
|
|
print("\n--- jq: total budget ---")
|
|
result = await ws.execute("jq .metadata.total_budget /s3/data/example.json"
|
|
)
|
|
print(f" Total budget: ${int((await result.stdout_str()).strip()):,}")
|
|
|
|
print("\n--- jq: vendor costs ---")
|
|
result = await ws.execute(
|
|
"jq \".vendor_contracts | map(.annual_cost)\" /s3/data/example.json")
|
|
print(f" {(await result.stdout_str()).strip()}")
|
|
|
|
print("\n--- jq: office locations ---")
|
|
result = await ws.execute(
|
|
"jq \".locations | map(.city)\" /s3/data/example.json")
|
|
print(f" {(await result.stdout_str()).strip()}")
|
|
|
|
print("\n--- jq: all incident titles ---")
|
|
result = await ws.execute("jq \".departments[].teams[].incidents[].title\""
|
|
" /s3/data/example.json")
|
|
print(f" {(await result.stdout_str()).strip()}")
|
|
|
|
print("\n--- jq: OKR key results ---")
|
|
result = await ws.execute("jq \".okrs[0].objectives[0].key_results"
|
|
" | map(.description)\" /s3/data/example.json")
|
|
print(f" {(await result.stdout_str()).strip()}")
|
|
|
|
print("\n--- pipe: cat | jq (from cache) ---")
|
|
result = await ws.execute(
|
|
"cat /s3/data/example.json | jq .metadata.version")
|
|
print(f" Version: {(await result.stdout_str()).strip()}")
|
|
|
|
# ── session: cd + export ──
|
|
print("\n=== SESSION: cd + export ===\n")
|
|
|
|
print("--- cd /s3/data && ls ---")
|
|
await ws.execute("cd /s3/data")
|
|
result = await ws.execute("ls")
|
|
print(f" {(await result.stdout_str()).strip()}")
|
|
|
|
print("\n--- export + variable expansion ---")
|
|
await ws.execute("export SEARCH=mirage")
|
|
result = await ws.execute("grep $SEARCH example.jsonl | head -n 2")
|
|
print(f" {(await result.stdout_str()).strip()[:80]}...")
|
|
|
|
print("\n--- printenv ---")
|
|
result = await ws.execute("printenv")
|
|
print(f" {(await result.stdout_str()).strip()}")
|
|
|
|
print("\n--- plan: cd + grep ---")
|
|
await ws.execute("cd /s3/data")
|
|
dr = await ws.execute("grep mirage example.jsonl", provision=True)
|
|
print(f" network_read: {dr.network_read}, cache_read: {dr.cache_read}")
|
|
|
|
# ── execution history: hidden recorder + GNU views ──
|
|
print("\n=== EXECUTION HISTORY ===\n")
|
|
events = await ws.history()
|
|
print(f" Total commands recorded: {len(events)}")
|
|
|
|
entry = events[-1]
|
|
print(f"\n Last command: {entry['command']}")
|
|
print(f" Agent: {entry['agent']}")
|
|
print(f" Exit code: {entry['exit_code']}")
|
|
|
|
print("\n --- history (shell builtin, this session) ---")
|
|
r = await ws.execute("history 5")
|
|
for line in (await r.stdout_str()).splitlines():
|
|
print(f" {line[:100]}")
|
|
|
|
print("\n --- tail -n 6 /.bash_history (all sessions, GNU file) ---")
|
|
r = await ws.execute("tail -n 6 /.bash_history")
|
|
for line in (await r.stdout_str()).splitlines():
|
|
print(f" {line[:100]}")
|
|
|
|
print("\n --- history as JSONL ---")
|
|
for e in events[-3:]:
|
|
print(json.dumps(e, separators=(",", ":")))
|
|
|
|
# ── background jobs: & operator ──
|
|
print("\n=== BACKGROUND JOBS ===\n")
|
|
|
|
print("--- launch two background greps ---")
|
|
r = await ws.execute(
|
|
"grep mirage /s3/data/example.jsonl &"
|
|
" grep queue-operation /s3/data/example.jsonl &",
|
|
agent_id="demo-agent",
|
|
)
|
|
print(f" Output: {(await r.stdout_str()).strip()}")
|
|
|
|
print("\n--- ps: show running jobs ---")
|
|
r = await ws.execute("ps u")
|
|
print(f" {(await r.stdout_str()).strip()}")
|
|
|
|
print("\n--- jobs: list all ---")
|
|
r = await ws.execute("jobs")
|
|
print(f" {(await r.stdout_str()).strip()}")
|
|
|
|
print("\n--- wait %1: get first grep result ---")
|
|
r = await ws.execute("wait %1")
|
|
lines = (await r.stdout_str()).strip().splitlines() if (
|
|
await r.stdout_str()).strip() else []
|
|
print(f" Matches: {len(lines)}, exit_code: {r.exit_code}")
|
|
if lines:
|
|
print(f" First: {lines[0][:80]}...")
|
|
|
|
print("\n--- wait %2: get second grep result ---")
|
|
r = await ws.execute("wait %2")
|
|
lines = (await r.stdout_str()).strip().splitlines() if (
|
|
await r.stdout_str()).strip() else []
|
|
print(f" Matches: {len(lines)}, exit_code: {r.exit_code}")
|
|
|
|
print("\n--- background pipe: grep | head & ---")
|
|
await ws.execute(
|
|
"grep queue-operation /s3/data/example.jsonl | head -n 3 &")
|
|
r = await ws.execute("wait %3")
|
|
print(f" Output:\n {(await r.stdout_str()).strip()}")
|
|
|
|
print("\n--- kill demo ---")
|
|
await ws.execute("grep mirage /s3/data/example.jsonl &")
|
|
await ws.execute("kill %4")
|
|
r = await ws.execute("wait %4")
|
|
print(f" Exit code after kill: {r.exit_code}")
|
|
|
|
print("\n--- wait || fallback pattern ---")
|
|
await ws.execute("grep NONEXISTENT /s3/data/example.jsonl &")
|
|
await ws.execute("grep mirage /s3/data/example.jsonl &")
|
|
r = await ws.execute("wait %5 || wait %6")
|
|
lines = (await r.stdout_str()).strip().splitlines() if (
|
|
await r.stdout_str()).strip() else []
|
|
print(f" Fallback matches: {len(lines)}")
|
|
|
|
print("\n--- jobs after all done ---")
|
|
r = await ws.execute("jobs")
|
|
print(f" {(await r.stdout_str()).strip() or '(empty)'}")
|
|
|
|
print("\n--- background job history ---")
|
|
bg_entries = [
|
|
e for e in await ws.history()
|
|
if "grep" in e["command"] and "&" not in e["command"]
|
|
]
|
|
print(f" Background job records: {len(bg_entries)}")
|
|
for e in bg_entries[-4:]:
|
|
print(f" {e['command'][:60]} exit={e['exit_code']}")
|
|
|
|
# ── glob expansion ──
|
|
print("\n=== GLOB EXPANSION ===\n")
|
|
|
|
print("--- echo /s3/data/*.jsonl ---")
|
|
r = await ws.execute("echo /s3/data/*.jsonl")
|
|
print(f" {(await r.stdout_str()).strip()}")
|
|
|
|
print("\n--- ls /s3/data/*.json ---")
|
|
r = await ws.execute("ls /s3/data/*.json")
|
|
print(f" {(await r.stdout_str()).strip()}")
|
|
|
|
print("\n--- for f in /s3/data/*.json; do wc -l $f; done ---")
|
|
r = await ws.execute("for f in /s3/data/*.json; do wc -l $f; done")
|
|
print(f" {(await r.stdout_str()).strip()}")
|
|
|
|
print("\n--- grep mirage /s3/data/*.jsonl | head -n 2 ---")
|
|
r = await ws.execute("grep mirage /s3/data/*.jsonl | head -n 2")
|
|
for line in (await r.stdout_str()).strip().splitlines():
|
|
print(f" {line[:100]}")
|
|
|
|
print("\n=== BASH HISTORY ===\n")
|
|
|
|
print("--- ls -a / (dotfile view) ---")
|
|
result = await ws.execute("ls -a /")
|
|
print(f" {(await result.stdout_str()).strip()}")
|
|
|
|
print("\n--- grep glob /.bash_history | head -n 3 ---")
|
|
result = await ws.execute("grep glob /.bash_history | head -n 3")
|
|
for line in (await result.stdout_str()).strip().splitlines():
|
|
print(f" {line[:120]}")
|
|
|
|
# ── cross-mount mv: RAM → S3 (with cleanup) ──────────────────────
|
|
# Builds a fresh workspace with RAM at /local/ and S3 at /s3/ in
|
|
# WRITE mode. Creates a unique a.txt in RAM via tee, mvs it to S3,
|
|
# verifies it landed there, then removes it from S3 so the bucket
|
|
# is left clean.
|
|
print("\n=== CROSS-MOUNT MV: RAM → S3 ===\n")
|
|
mv_ws = Workspace(
|
|
{
|
|
"/local/": (RAMResource(), MountMode.WRITE),
|
|
"/s3/": (S3Resource(config), MountMode.WRITE),
|
|
},
|
|
mode=MountMode.WRITE,
|
|
)
|
|
remote = f"/s3/_mv_test/{uuid.uuid4().hex[:8]}_a.txt"
|
|
payload = "hello from RAM\n"
|
|
print(f" target: {remote}")
|
|
try:
|
|
r = await mv_ws.execute(f'echo "{payload.rstrip()}" | tee /local/a.txt'
|
|
)
|
|
print(f" tee exit={r.exit_code} (created /local/a.txt)")
|
|
|
|
r = await mv_ws.execute(f"mv /local/a.txt {remote}")
|
|
print(f" mv exit={r.exit_code} "
|
|
f"stderr={(await r.stderr_str()).strip()!r}")
|
|
|
|
r = await mv_ws.execute(f"cat {remote}")
|
|
got = await r.stdout_str()
|
|
ok = got == payload
|
|
print(f" S3 read back: {got!r} ({'OK' if ok else 'MISMATCH'})")
|
|
|
|
r = await mv_ws.execute("cat /local/a.txt")
|
|
print(f" RAM source after mv: exit={r.exit_code} "
|
|
f"(expect non-zero — file moved away)")
|
|
finally:
|
|
r = await mv_ws.execute(f"rm {remote}")
|
|
print(f" cleanup rm exit={r.exit_code}")
|
|
r = await mv_ws.execute(f"cat {remote}")
|
|
print(f" S3 read after rm: exit={r.exit_code} (expect non-zero)")
|
|
|
|
# ── persistence: save / load / copy / deepcopy ──────────────────
|
|
# S3 with inline creds has redacted config at save time; caller must
|
|
# re-supply a fresh S3Resource via resources={...}.
|
|
print("\n=== PERSISTENCE ===\n")
|
|
with tempfile.NamedTemporaryFile(suffix=".tar", delete=False) as f:
|
|
snap = f.name
|
|
try:
|
|
await ws.snapshot(snap)
|
|
size = os.path.getsize(snap)
|
|
print(f" saved → {snap} ({size} bytes)")
|
|
|
|
# Verify creds are NOT in the raw tar bytes
|
|
raw = open(snap, "rb").read()
|
|
leaked = config.aws_access_key_id and (
|
|
config.aws_access_key_id.get_secret_value().encode() in raw)
|
|
print(f" creds leaked in tar bytes: {bool(leaked)} "
|
|
f"(expect False)")
|
|
print(f" '<REDACTED>' present in tar: "
|
|
f"{b'<REDACTED>' in raw} (expect True)")
|
|
|
|
# Loading without resources= must fail fast
|
|
try:
|
|
await Workspace.load(snap)
|
|
print(" ✗ load() should have raised without resources=")
|
|
except ValueError as e:
|
|
print(f" ✓ load() w/o resources raises: "
|
|
f"{str(e).splitlines()[0][:70]}…")
|
|
|
|
# Load with fresh creds (both mounts were redacted)
|
|
loaded = await Workspace.load(
|
|
snap,
|
|
resources={
|
|
"/s3/": S3Resource(config),
|
|
"/deep/": S3Resource(deep_config),
|
|
},
|
|
)
|
|
r = await loaded.execute("ls /s3/")
|
|
print(f" loaded ws ls /s3/: "
|
|
f"{(await r.stdout_str()).strip()[:60]}…")
|
|
|
|
# copy(): in-process, reuses the same S3Resource; both copies
|
|
# see the same bucket
|
|
cp = await ws.copy()
|
|
print(f" copy() mounts: {[m.prefix for m in cp.mounts()]}")
|
|
|
|
for op_name, op in (("deepcopy", _copy.deepcopy), ("shallow copy",
|
|
_copy.copy)):
|
|
try:
|
|
op(ws)
|
|
print(f" ✗ {op_name} should have raised")
|
|
except NotImplementedError as e:
|
|
print(f" ✓ {op_name} raises: {str(e)[:60]}…")
|
|
finally:
|
|
os.unlink(snap)
|
|
|
|
print("\n=== DRIFT + VERSION PIN ===\n")
|
|
print(" requires bucket versioning enabled:")
|
|
print(" aws s3api put-bucket-versioning --bucket <bucket> "
|
|
"--versioning-configuration Status=Enabled\n")
|
|
probe = f"/s3/drift-probe-{uuid.uuid4().hex[:8]}.txt"
|
|
drift_ws = Workspace({"/s3/": (S3Resource(config), MountMode.WRITE)},
|
|
mode=MountMode.WRITE)
|
|
with tempfile.NamedTemporaryFile(suffix=".tar", delete=False) as f:
|
|
drift_snap = f.name
|
|
try:
|
|
await drift_ws.execute(f'echo "original" | tee {probe}')
|
|
await drift_ws.execute(f"cat {probe}")
|
|
s = await drift_ws.stat(probe)
|
|
print(f" wrote {probe}")
|
|
print(f" fingerprint={s.fingerprint}")
|
|
print(f" revision ={s.revision} "
|
|
f"({'versioning on' if s.revision else 'no versioning'})")
|
|
|
|
await drift_ws.snapshot(drift_snap)
|
|
snap_size = os.path.getsize(drift_snap)
|
|
print(f" snapshot: {drift_snap} ({snap_size} bytes)")
|
|
|
|
await drift_ws.execute(f'echo "mutated" | tee {probe}')
|
|
s2 = await drift_ws.stat(probe)
|
|
print(f" mutated on bucket: new revision={s2.revision}")
|
|
|
|
loaded = await Workspace.load(drift_snap,
|
|
resources={"/s3/": S3Resource(config)})
|
|
loaded._cache.evict_paths([probe])
|
|
try:
|
|
r = await loaded.execute(f"cat {probe}")
|
|
served = (await r.stdout_str()).strip()
|
|
pinned_ok = s.revision is not None and served == "original"
|
|
label = ("OK pin served original" if pinned_ok else
|
|
"no pin (bucket not versioned?), live fingerprint matched"
|
|
if served == "original" else "UNEXPECTED")
|
|
print(f" STRICT load → served: {served!r} ({label})")
|
|
except ContentDriftError as e:
|
|
print(f" STRICT load raised ContentDriftError as expected: "
|
|
f"{e.path}")
|
|
finally:
|
|
try:
|
|
await drift_ws.execute(f"rm {probe}")
|
|
except Exception:
|
|
pass
|
|
if os.path.exists(drift_snap):
|
|
os.unlink(drift_snap)
|
|
|
|
|
|
asyncio.run(main())
|