# ========= 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 json import os import re import sys from dotenv import load_dotenv from mirage import MountMode, Workspace from mirage.resource.discord import DiscordConfig, DiscordResource load_dotenv(".env.development") config = DiscordConfig(token=os.environ["DISCORD_BOT_TOKEN"]) resource = DiscordResource(config=config) async def main(): with Workspace({"/discord/": resource}, mode=MountMode.READ) as ws: vos = sys.modules["os"] print("=== VFS MODE: open() reads from Discord transparently ===\n") print("--- os.listdir() guilds ---") guilds = vos.listdir("/discord") for g in guilds: print(f" {g}") if not guilds: return guild = guilds[0] guild_dir = f"/discord/{guild}" print(f"\n--- os.listdir() {guild_dir} ---") for s in vos.listdir(guild_dir): print(f" {s}") ch_root = f"{guild_dir}/channels" print(f"\n--- os.listdir() {ch_root} ---") channels = vos.listdir(ch_root) for ch in channels[:5]: print(f" {ch}") if not channels: return ch = channels[0] ch_dir = f"{ch_root}/{ch}" print(f"\n--- os.listdir() {ch_dir} (last 5 dates) ---") dates = vos.listdir(ch_dir) for d in dates[-5:]: print(f" {d}") if dates: for d in reversed(dates): chat_path = f"{ch_dir}/{d}/chat.jsonl" try: with open(chat_path) as f: content = f.read() except FileNotFoundError: continue lines = [ line_text for line_text in content.strip().split("\n") if line_text.strip() ] if lines: print(f"\n--- open() + read {d}/chat.jsonl ---") print(f" messages: {len(lines)}") for line in lines[:3]: rec = json.loads(line) author = rec.get("author", {}).get("username", "?") text = rec.get("content", "")[:80] print(f" [{author}] {text}") # also list attachments in that day's files dir files_dir = f"{ch_dir}/{d}/files" try: atts = vos.listdir(files_dir) except FileNotFoundError: atts = [] if atts: print(f"\n--- os.listdir() {d}/files ---") for a in atts[:5]: print(f" {a}") print("\n--- os.path.isfile / isdir / exists ---") print(f" isfile(chat.jsonl): " f"{vos.path.isfile(chat_path)}") print(f" isdir(files/): " f"{vos.path.isdir(files_dir)}") print(f" exists(bogus): " f"{vos.path.exists(f'{ch_dir}/{d}/nope.txt')}") print(f"\n--- os.stat {d}/chat.jsonl ---") st = vos.stat(chat_path) print(f" type={st.type} size={st.size}") if atts: att_path = f"{files_dir}/{atts[0]}" print(f"\n--- os.stat {atts[0]} ---") ast = vos.stat(att_path) print(f" type={ast.type} size={ast.size}") print(f"\n--- open({atts[0]}, 'rb') ---") with open(att_path, "rb") as f: blob = f.read() print(f" bytes={len(blob)} expected={ast.size} " f"match={len(blob) == ast.size}") if ast.size is not None and len(blob) != ast.size: raise AssertionError( f"regression: open('rb') got {len(blob)} " f"bytes, expected {ast.size}") print("\n--- json.loads + regex search on chat.jsonl ---") pattern = re.compile(r"\S+") matches = 0 for raw in lines: rec = json.loads(raw) text = rec.get("content", "") or "" if pattern.search(text): matches += 1 print(f" messages with non-whitespace content: " f"{matches}/{len(lines)}") break else: print("\n (no messages found in recent dates)") print("\n--- bash history ---") with open("/.bash_history") as f: for i, line in enumerate(f): if i >= 6: break print(f" {line.rstrip()[:120]}") records = ws.ops.records total = sum(r.bytes for r in records) print(f"\nStats: {len(records)} ops, {total} bytes transferred") asyncio.run(main())