chasm-cli 1.5.4

Universal chat session manager - harvest, merge, and analyze AI chat history from VS Code, Cursor, and other editors
Documentation
import sqlite3, json, os, base64

WS_STORAGE = r"C:\Users\adamm\AppData\Roaming\Code\User\workspaceStorage"
BROKEN_HASH = "5ec71800c69c79b96b06a37e38537907"
WORKING_HASH = "82cdabb21413f2ff42168423e82c8bdf"

def get_db_value(ws_hash, key):
    db_path = os.path.join(WS_STORAGE, ws_hash, "state.vscdb")
    conn = sqlite3.connect(db_path)
    cursor = conn.cursor()
    cursor.execute("SELECT value FROM ItemTable WHERE key = ?", (key,))
    row = cursor.fetchone()
    conn.close()
    return row[0] if row else None

for ws_hash, label in [(BROKEN_HASH, "BROKEN"), (WORKING_HASH, "WORKING")]:
    print(f"\n=== {label} ===")
    
    raw = get_db_value(ws_hash, "chat.ChatSessionStore.index")
    if raw:
        data = json.loads(raw)
        print(f"\nchat.ChatSessionStore.index: type={type(data).__name__}, len={len(data)}")
        if isinstance(data, list):
            for i, entry in enumerate(data[:5]):
                print(f"  [{i}] type={type(entry).__name__}: {json.dumps(entry)[:200]}")
        elif isinstance(data, dict):
            for k in list(data.keys())[:5]:
                v = data[k]
                print(f"  {k}: type={type(v).__name__}, value={json.dumps(v)[:200]}")
    
    raw = get_db_value(ws_hash, "agentSessions.model.cache")
    if raw:
        data = json.loads(raw)
        print(f"\nagentSessions.model.cache: type={type(data).__name__}, len={len(data)}")
        if isinstance(data, list):
            for i, entry in enumerate(data[:3]):
                if isinstance(entry, dict):
                    resource = entry.get("resource", "?")
                    label_val = entry.get("label", "?")
                    # Decode b64 if vscode-chat-session://
                    decoded = ""
                    if "vscode-chat-session://" in str(resource):
                        b64part = str(resource).split("/")[-1]
                        try:
                            decoded = f" -> {base64.b64decode(b64part).decode()}"
                        except:
                            pass
                    print(f"  [{i}] resource={resource}{decoded}")
                    print(f"       label={label_val}")
                else:
                    print(f"  [{i}] type={type(entry).__name__}: {json.dumps(entry)[:200]}")
    
    # Session files
    sessions_dir = os.path.join(WS_STORAGE, ws_hash, "chatSessions")
    if os.path.isdir(sessions_dir):
        files = [f for f in os.listdir(sessions_dir) if f.endswith('.jsonl')]
        print(f"\nchatSessions/ files: {len(files)}")
        for f in sorted(files):
            sid = f.replace('.jsonl', '')
            size = os.path.getsize(os.path.join(sessions_dir, f))
            print(f"  {sid}: {size}b")