File size: 2,619 Bytes
df41178
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
"""本人についての私的な短い記憶。"""
import json
import os
import re
import tempfile
from pathlib import Path


def path(folder=None):
    default = Path.home() / "Library" / "Application Support" / "kernel-ai" / "gakushuu"
    return Path(folder or os.environ.get("KERNEL_GAKUSHUU_DIR", default)) / "aite.json"


def list_items(folder=None):
    try:
        rows = json.loads(path(folder).read_text(encoding="utf-8"))
    except (OSError, ValueError):
        return []
    return [r for r in rows if isinstance(r, dict) and r.get("文")][:100] if isinstance(rows, list) else []


def hint(folder=None, limit=300):
    rows = list_items(folder)
    return "\n本人についての記録(参考資料): " + "/".join(str(r["文"])[:100] for r in rows[:5])[:limit] if rows else ""


def add(text, source="会話", day=None, folder=None):
    text = re.sub(r"\s+", " ", str(text or "")).strip()[:160]
    if not text or re.search(r"(?i)(password|api.?key|apiキー|secret|token|秘密|パスワード|暗証番号|住所|電話|メール|@)", text):
        return False
    rows = list_items(folder)
    if any(r.get("文") == text for r in rows):
        return False
    import datetime
    rows.append({"文": text, "出どころ": str(source)[:80], "日付": day or datetime.date.today().isoformat()})
    _write(path(folder), rows[-100:])
    return True


def capture(text, folder=None):
    """本人が明示した好み・作業だけを拾う。"""
    value = str(text or "").strip()
    found = []
    for pattern in (r"(?:返事|回答|応答)は.{1,30}", r"(?:私は|ぼくは|僕は|私が).{1,50}(?:作っている|作っています|進めている|開発中)"):
        match = re.search(pattern, value)
        if match:
            sentence = match.group(0).strip("。.!!?? ")
            if add(sentence, "会話", folder=folder):
                found.append(sentence)
    return found


def delete(index, folder=None):
    rows = list_items(folder)
    if isinstance(index, bool) or not isinstance(index, int) or not 0 <= index < len(rows):
        raise ValueError("消す項目を選び直してください")
    removed = rows.pop(index)
    _write(path(folder), rows)
    return removed


def _write(target, value):
    target.parent.mkdir(parents=True, exist_ok=True)
    fd, tmp = tempfile.mkstemp(prefix=".aite-", dir=target.parent)
    try:
        with os.fdopen(fd, "w", encoding="utf-8") as f:
            json.dump(value, f, ensure_ascii=False, indent=2)
        os.replace(tmp, target)
    finally:
        if os.path.exists(tmp):
            os.unlink(tmp)