-
Notifications
You must be signed in to change notification settings - Fork 937
Expand file tree
/
Copy pathsession_state.py
More file actions
49 lines (33 loc) · 1.46 KB
/
session_state.py
File metadata and controls
49 lines (33 loc) · 1.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
from __future__ import annotations
import json
from pathlib import Path
from pydantic import BaseModel, Field, ValidationError
from kimi_cli.utils.io import atomic_json_write
from kimi_cli.utils.logging import logger
STATE_FILE_NAME = "state.json"
class ApprovalStateData(BaseModel):
yolo: bool = False
auto_approve_actions: set[str] = Field(default_factory=set)
class DynamicSubagentSpec(BaseModel):
name: str
system_prompt: str
def _default_dynamic_subagents() -> list[DynamicSubagentSpec]:
return []
class SessionState(BaseModel):
version: int = 1
approval: ApprovalStateData = Field(default_factory=ApprovalStateData)
dynamic_subagents: list[DynamicSubagentSpec] = Field(default_factory=_default_dynamic_subagents)
additional_dirs: list[str] = Field(default_factory=list)
def load_session_state(session_dir: Path) -> SessionState:
state_file = session_dir / STATE_FILE_NAME
if not state_file.exists():
return SessionState()
try:
with open(state_file, encoding="utf-8") as f:
return SessionState.model_validate(json.load(f))
except (json.JSONDecodeError, ValidationError, UnicodeDecodeError):
logger.warning("Corrupted state file, using defaults: {path}", path=state_file)
return SessionState()
def save_session_state(state: SessionState, session_dir: Path) -> None:
state_file = session_dir / STATE_FILE_NAME
atomic_json_write(state.model_dump(mode="json"), state_file)