# Copyright (c) 2025-2026 马建军. All rights reserved. # 专有软件 — 未经授权禁止复制、传播、转售。 # 严禁用于:带单/代客理财、向他人推荐期货品种或买卖建议、融资配资等业务。 # 详见 LICENSE.zh-CN.txt 与 docs/软件购买与使用协议.md """AI 消息存储与展示。""" from __future__ import annotations import json from datetime import datetime from typing import Any, Optional from zoneinfo import ZoneInfo TZ = ZoneInfo("Asia/Shanghai") CREATE_SQL = """ CREATE TABLE IF NOT EXISTS ai_messages ( id INTEGER PRIMARY KEY AUTOINCREMENT, kind TEXT NOT NULL, title TEXT, content TEXT NOT NULL, meta_json TEXT, created_at TEXT NOT NULL ) """ def ensure_ai_messages_table(conn) -> None: conn.execute(CREATE_SQL) conn.execute( "CREATE INDEX IF NOT EXISTS idx_ai_messages_created ON ai_messages(created_at DESC)" ) def insert_ai_message( conn, *, kind: str, title: str, content: str, meta: Optional[dict[str, Any]] = None, ) -> int: ensure_ai_messages_table(conn) now = datetime.now(TZ).strftime("%Y-%m-%d %H:%M:%S") cur = conn.execute( """INSERT INTO ai_messages (kind, title, content, meta_json, created_at) VALUES (?,?,?,?,?) RETURNING id""", (kind, title, content, json.dumps(meta or {}, ensure_ascii=False), now), ) row = cur.fetchone() if row is not None: return int(row["id"] if isinstance(row, dict) else row[0]) return int(cur.lastrowid or 0) def list_ai_messages(conn, *, limit: int = 100) -> list[dict]: ensure_ai_messages_table(conn) rows = conn.execute( "SELECT * FROM ai_messages ORDER BY id DESC LIMIT ?", (max(1, min(500, int(limit))),), ).fetchall() out = [] for r in rows: item = dict(r) try: item["meta"] = json.loads(item.get("meta_json") or "{}") except Exception: item["meta"] = {} out.append(item) return out