📄 themes_db.cpython-312.pyc
/home/palash/git/local-ai/server/features/__pycache__/themes_db.cpython-312.pyc
Language: pyc • Lines: 328
�

�m�j�$����dZddlZddlZddlZddlZddlZddlmZddlmZej�Z
dd�Zdd�Zdd�Z
d�Zdd	�Z									dd
�Zd�Zdd�Zdd
�Zdd�Zd�Zy)uISQLite-backed theme & combination tracker (``track_theme`` tool, /api/themes).

A dedicated ledger that guarantees creative variety across generated content
without polluting per-user contexts or the to-do (``manage_tasks``) system.

Two dimensions are tracked:

* ``scope`` — the user whose content is being generated. Records inside one
  scope are that user's *combination* history: every already-used combination
  of detail fields + mood + genre + role + persona.
* global   — the union of ALL scopes ("vastly keep track of all the users"),
  used to avoid cross-user repetition and to see overall output.

Within a self-chat window every participant (kolpo, kaya, editor, moderator)
shares a single scope (``"self-chat"``) so the theme stays coordinated between
the users of that window while regular per-user chats stay isolated.
�N)�datetime)�Mc�(�t5tjtj�}	|j||�}|j
�|j|j�cddd�S#|j�wxYw#1swYyxYw�N)	�_themes_db_lock�sqlite3�connectr�	THEMES_DB�execute�commit�rowcount�close)�query�params�conn�curs    �6/home/palash/git/local-ai/server/features/themes_db.py�_db_runrsl��	�����q�{�{�+��	��,�,�u�f�-�C��K�K�M��<�<��J�J�L����
�J�J�L����s"�$B�-A3�B�3B�B�Bc�r�t5tjtj�}tj
|_	|j||�}|j�D�cgc]
}t|���c}|j�cddd�Scc}w#|j�wxYw#1swYyxYwr)rrr	rr
�Row�row_factoryr�fetchall�dictr)rrrr�rs     r�	_db_fetchr*s���	�����q�{�{�+��"�;�;���	��,�,�u�f�-�C�%(�\�\�^�4��D��G�4��J�J�L����
5���J�J�L����s5�9B-�$B�%B�7B�9B-�B�B*�*B-�-B6c�,�t||�}|r|dSdS)Nr)r)rr�rowss   r�
_db_fetch_oner5s���U�F�#�D��4��7�$��$�c��td�y)NaA
        CREATE TABLE IF NOT EXISTS theme_log (
            id TEXT PRIMARY KEY,
            scope TEXT NOT NULL,
            user_id TEXT DEFAULT '',
            genre TEXT DEFAULT '',
            mood TEXT DEFAULT '',
            role TEXT DEFAULT '',
            persona TEXT DEFAULT '',
            details TEXT DEFAULT '{}',
            combo_hash TEXT NOT NULL,
            theme TEXT DEFAULT '',
            status TEXT DEFAULT 'active',
            created_at TEXT NOT NULL,
            updated_at TEXT NOT NULL,
            UNIQUE(scope, combo_hash)
        )
        )r�rr�_init_themes_dbr":s���	�rc���|xsd|xsd|xsd|xsd|xsi|xsdd�}tj|dd��}tj|j	d��j�dd	S)
a(Canonical fingerprint of a combination.

    The combination mixes every detail field with mood, genre, role and
    persona, so reusing ANY of them with the same set counts as a duplicate.
    ``level`` separates round-scoped records from per-turn records so they
    never falsely collide.
    ��round��genre�mood�role�persona�details�levelTF)�	sort_keys�ensure_asciizutf-8N�)�json�dumps�hashlib�sha256�encode�	hexdigest)r'r(r)r*r+r,�payload�	canonicals        r�
combo_hashr8Qst����"��
���
���=�b��=�b��!�'�
�G��
�
�7�d��G�I��>�>�)�*�*�7�3�4�>�>�@��"�E�Erc
�z�t|t�rtj|dd��}|dvrd}	tj|�}
t|||||
|	�}td||f�}|r�i}
|r||jd�k7r||
d<|r|jd�|k7r||
d<|
r}tj�jd	�
�|
d<djd
�|
D��}td|�d�t|
j!��|dfz�td|df�}|dfSt#t%j&��}tj�jd	�
�}td|||xsd|xsd|xsd|xsd|xsd|||xsd|xsd||f
�td|f�dfS#t
tf$ri}
Y��twxYw)NFT)r.r-)Nr$z{}�6SELECT * FROM theme_log WHERE scope=? AND combo_hash=?�theme�status�seconds��timespec�
updated_atz, c3�&K�|]	}|�d����y�w)z=?Nr!)�.0�ks  r�	<genexpr>z#theme_log_create.<locals>.<genexpr>�s����"=��a�S��8�"=���zUPDATE theme_log SET z WHERE id=?�id�"SELECT * FROM theme_log WHERE id=?z�INSERT INTO theme_log (id, scope, user_id, genre, mood, role, persona, details, combo_hash, theme, status, created_at, updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)r$�active)�
isinstancerr0r1�loads�	TypeError�
ValueErrorr8r�getr�now�	isoformat�joinr�tuple�values�str�uuid�uuid4)�scope�user_idr'r(r)r*r+r;r<r,�details_obj�h�existing�updates�
set_clause�tidrNs                 r�theme_log_creater^es����'�4� ��*�*�W�5�D�I���*������j�j��)��	�5�$��g�{�E�B�A��@�	��
��H�����U�h�l�l�7�3�3�$�G�G���h�l�l�8�,��6� &�G�H���$,�L�L�N�$<�$<�i�$<�$P�G�L�!����"=�W�"=�=�J��'�
�|�;�?��g�n�n�&�'�8�D�>�*;�;�
�%�4�x��~�6G��H���~��

�d�j�j�l�
�C�
�,�,�.�
"�
"�I�
"�
6�C��	p����M�r��K�R��J�B��J�B��M�r��
��K�R���h���	
��$�=��v�F��M�M��]
�z�"�����s�F%�%F:�9F:c��td|f�}|sytdtj�j	d��|f�td|f�S)NrGz@UPDATE theme_log SET status='completed', updated_at=? WHERE id=?r=r>)rrrrNrO)r]rZs  r�theme_log_completer`�sP���A�C�6�J�H����J�	����	!�	!�9�	!�	5�s�;���=��v�F�Frc�j�g}g}|s$|r"|jd�|j|�|r"|jd�|j|�|rddj|�znd}	tdt|��}|j|�t
d|�d	�|�S#tt
f$rd}Y�4wxYw)
N�scope=?zstatus=?�WHERE � AND r$��2zSELECT * FROM theme_log z! ORDER BY created_at DESC LIMIT ?)�appendrP�max�intrKrLr)rV�
all_scopesr<�limit�wherer�clauses       r�theme_log_listrn�s����E�
�F��%�
���Y���
�
�e��
�
���Z� ��
�
�f��16�h����e�,�,�B�F���A�s�5�z�"���M�M�%���
"�6�(�*K�L�����
�z�"�����s�(B�B2�1B2c���t|t�r	tj|�}t
|||||xsi|�}td||f�S#tt
f$ri}Y�5wxYw)Nr:)rIrSr0rJrKrLr8r)rVr'r(r)r*r+r,rYs        r�theme_log_checkrp�sk���'�3��	��j�j��)�G�	�5�$��g�w�}�"�e�D�A��@�	��
�����:�&�	��G�	�s�A	�	A�Ac�:�g}g}|s$|r"|jd�|j|�|rddj|�znd}td|�d�|�}i}|D].}|j|di�||d<|d||d|d	<�0t	d
�|D��|d�S)Nrbrcrdr$z7SELECT scope, status, COUNT(*) AS count FROM theme_log z& GROUP BY scope, status ORDER BY scoperV�countr<c3�&K�|]	}|d���y�w)rrNr!)rBrs  rrDz"theme_log_stats.<locals>.<genexpr>�s����.�A�Q�w�Z�.�rE)�total�	per_scope)rgrPrrM�sum)rVrjrlrrmr�totalsrs        r�theme_log_statsrx�s����E�
�F��%�
���Y���
�
�e��16�h����e�,�,�B�F��
A�&��Io�p���D��F�
�5��#�Z�Z��'�
�B�7��q��z��*+�G�*��q��z��1�X�;�'�5��.��.�.���rc��|jdd�}|jd�xsdj�xsd}|dk(r�|stjddd��St	|||jd�|jd	�|jd
�|jd�|jd�|jd
�|jd�|jdd���
\}}tjd||d��S|dk(rh|jd�}|stjddd��St|�}|rtjd|d��Stjddd��S|dk(r�|stjddd��St
||jd�|jd	�|jd
�|jd�|jd�|jdd���}tjdt|�|d��S|dk(r^t|t|jd��|jd�|jdd�� �}tjd|d!��S|d"k(r<tjd#dit|t|jd���$���Stjdd%|��d��S)&N�	operationr$rV�logFz Missing required argument: scope)�ok�errorr'r(r)r*r+r;r<r,r%)	rWr'r(r)r*r+r;r<r,T)r|�	duplicater;�complete�theme_idz#Missing required argument: theme_id)r|r;zTheme not found�checkr&)r|�usedr;�list�globalrkrf)rVrjr<rk)r|�themes�statsr|)rVrjzUnknown operation: )
rM�stripr0r1r^r`rp�boolrnrx)rW�args�oprV�recordr~r]�recordss        r�handle_theme_toolr��s���	
���+�r�	"�B�
�X�X�g�
�
$�"�+�+�-�5��E�	�U�{���:�:�U�5W�X�Y�Y�,����(�(�7�#����&�!����&�!��H�H�Y�'��H�H�Y�'��(�(�7�#��8�8�H�%��(�(�7�G�,�
���	��z�z��I��O�P�P�	�z�	��h�h�z�"����:�:�U�5Z�[�\�\�#�C�(����:�:�T�F�;�<�<��z�z��1B�C�D�D�	�w����:�:�U�5W�X�Y�Y� ���(�(�7�#����&�!����&�!��H�H�Y�'��H�H�Y�'��(�(�7�G�,�
���z�z���V���
�
�	
�
�v�� ���D�H�H�X�.�/��8�8�H�%��(�(�7�B�'�	
���z�z���9�:�:�	�w���z�z�
�4�]�?��4����QY�HZ�C[�\�]�
�	
��:�:�U�/B�2�$�-G�H�I�Ir)r!)Nr%)	r$r$r$r$r$Nr$rHr%)NFNrf)r$r$r$r$Nr%)NF)�__doc__r2r0r�	threadingrTr�server.features.stater�Lockrrrrr"r8r^r`rnrprxr�r!rr�<module>r�s����$������#� �)�.�.�"����%�
�.F�,
�
�	�	���
��
�@N�FG��*
��*;Jr