chasm-cli 1.5.4

Universal chat session manager - harvest, merge, and analyze AI chat history from VS Code, Cursor, and other editors
Documentation
"""Compare ALL database keys between working (chasm) and a broken workspace where Chat History is empty."""
import json, sqlite3
from pathlib import Path

WS = Path(r"C:\Users\adamm\AppData\Roaming\Code\User\workspaceStorage")
WORKING = "82cdabb21413f2ff42168423e82c8bdf"
BROKEN = "5ec71800c69c79b96b06a37e38537907"  # Agentic

def get_all_values(h):
    db = WS / h / "state.vscdb"
    conn = sqlite3.connect(str(db))
    cur = conn.cursor()
    cur.execute("SELECT key, value FROM ItemTable")
    data = {}
    for k, v in cur.fetchall():
        data[k] = v
    conn.close()
    return data

working = get_all_values(WORKING)
broken = get_all_values(BROKEN)

# Show all chat/agent/copilot related keys with their values
print("=" * 70)
print("WORKING (chasm) - Chat/Agent related keys")
print("=" * 70)

for k in sorted(working.keys()):
    if any(x in k.lower() for x in ['chat', 'agent', 'copilot', 'interactive', 'panel.chat']):
        v = working[k]
        try:
            parsed = json.loads(v)
            v_str = json.dumps(parsed, indent=2)
        except:
            v_str = v
        
        # Truncate very long values
        if len(v_str) > 2000:
            v_str = v_str[:2000] + f"\n... ({len(v_str)} chars total)"
        
        print(f"\n{k}:")
        print(f"  {v_str}")


print("\n" + "=" * 70)
print("BROKEN (Agentic) - Chat/Agent related keys")
print("=" * 70)

for k in sorted(broken.keys()):
    if any(x in k.lower() for x in ['chat', 'agent', 'copilot', 'interactive', 'panel.chat']):
        v = broken[k]
        try:
            parsed = json.loads(v)
            v_str = json.dumps(parsed, indent=2)
        except:
            v_str = v
        
        if len(v_str) > 2000:
            v_str = v_str[:2000] + f"\n... ({len(v_str)} chars total)"
        
        print(f"\n{k}:")
        print(f"  {v_str}")


print("\n" + "=" * 70)
print("KEY DIFF")
print("=" * 70)

w_keys = {k for k in working if any(x in k.lower() for x in ['chat', 'agent', 'copilot', 'interactive', 'panel.chat'])}
b_keys = {k for k in broken if any(x in k.lower() for x in ['chat', 'agent', 'copilot', 'interactive', 'panel.chat'])}

w_only = w_keys - b_keys
b_only = b_keys - w_keys
common = w_keys & b_keys

print(f"\nKeys only in WORKING: {sorted(w_only)}")
print(f"Keys only in BROKEN: {sorted(b_only)}")
print(f"Common keys: {sorted(common)}")

# For common keys, check if values differ significantly
print("\nValue differences for common keys:")
for k in sorted(common):
    wv = working[k]
    bv = broken[k]
    if wv != bv:
        wl = len(wv)
        bl = len(bv)
        print(f"\n  {k}: working={wl}b broken={bl}b")
        try:
            wp = json.loads(wv)
            bp = json.loads(bv)
            if isinstance(wp, dict) and isinstance(bp, dict):
                wks = set(wp.keys())
                bks = set(bp.keys())
                if wks != bks:
                    print(f"    Key diff: working_only={wks-bks} broken_only={bks-wks}")
                # Compare values for shared keys
                for sk in sorted(wks & bks):
                    if wp[sk] != bp[sk]:
                        ws = json.dumps(wp[sk])[:100]
                        bs = json.dumps(bp[sk])[:100]
                        print(f"    {sk}: W={ws} B={bs}")
        except:
            pass

print("\n=== DONE ===")