81 """Convert a legacy session JSON (full conversation) to lightweight metadata format."""
83 with open(old_path,
"r", encoding=
"utf-8")
as f:
85 except (json.JSONDecodeError, OSError)
as e:
86 print(f
" [warn] Could not read {old_path.name}: {e}")
89 messages = data.get(
"messages", [])
90 msg_count = sum(1
for m
in messages
if m.get(
"role")
in (
"user",
"assistant"))
91 tool_count = sum(1
for m
in messages
if m.get(
"role") ==
"tool")
98 usage = m.get(
"usage")
100 total_prompt += usage.get(
"prompt_tokens", 0)
101 total_completion += usage.get(
"completion_tokens", 0)
102 total_tokens += usage.get(
"total_tokens", 0)
105 session_name = data.get(
"session_name", old_path.stem)
108 "session_name": session_name,
109 "created": data.get(
"timestamp", session_name.split(
"_", 1)[1]
if "_" in session_name
else "unknown"),
110 "last_modified": data.get(
"timestamp",
"unknown"),
111 "model": data.get(
"model",
"unknown"),
112 "reasoning_effort": data.get(
"reasoning_effort",
"high"),
113 "system_prompt": messages[0][
"content"]
if messages
and messages[0].get(
"role") ==
"system" else "",
115 "message_count": msg_count,
116 "tool_call_count": tool_count,
117 "total_prompt_tokens": total_prompt,
118 "total_completion_tokens": total_completion,
119 "total_tokens": total_tokens,
122 f
"Chat_logs/{session_name}_log.json"
129 """Convert old ``sessions/*.json`` → new lightweight metadata in ``oc_chat/sessions/`` and move messages as chat logs."""
130 func =
"_migrate_old_sessions_dir"
131 if not OLD_SESSIONS_DIR.is_dir():
132 print(
" [info] No old sessions/ directory found — nothing to migrate.")
136 for f
in sorted(OLD_SESSIONS_DIR.glob(
"*.json")):
142 meta_path = NEW_SESSIONS_DIR / f.name
143 with open(meta_path,
"w", encoding=
"utf-8")
as mf:
144 json.dump(metadata, mf, indent=2, ensure_ascii=
False)
145 print(f
" [meta] {f.name} → oc_chat/sessions/{f.name} (lightweight metadata)")
149 with open(f,
"r", encoding=
"utf-8")
as of:
150 old_data = json.load(of)
151 except (json.JSONDecodeError, OSError)
as e:
153 _dbg(
"OC_CHAT.TOOLS", func, f
"VALIDATION_ERROR: {f.name}: {type(e).__name__}: {e}", 3)
156 log_name = f
"{metadata['session_name']}_log.json"
157 log_path = NEW_CHAT_LOGS_DIR / log_name
161 "session_name": metadata[
"session_name"],
163 "timestamp": metadata[
"created"],
164 "model": metadata[
"model"],
165 "reasoning_effort": metadata[
"reasoning_effort"],
166 "messages": old_data.get(
"messages", []),
168 "prompt_tokens": metadata[
"stats"][
"total_prompt_tokens"],
169 "completion_tokens": metadata[
"stats"][
"total_completion_tokens"],
170 "total_tokens": metadata[
"stats"][
"total_tokens"],
174 with open(log_path,
"w", encoding=
"utf-8")
as lf:
175 json.dump(log_data, lf, indent=2, ensure_ascii=
False)
176 print(f
" [log] {f.name} → oc_chat/sessions/Chat_logs/{log_name}")
178 migrated.append(meta_path)