Qjs(XdZddlZddlZddlZddlZddlmZmZddlmZddl Z edZ ee jdz Z dZdZd efd Zd ed efd Zd eded efdZded edzfdZdedefdZdefdZdeded efdZdeded efdZdeded efdZd edzfdZddedzd efdZy)uroundtable.py — Gestione sessioni roundtable Adrian↔Mauro↔Elon. Stato in vault.db (type='os'): id: rt-{ts} meta: { tipo, cycles_total, cycle_current, turn, status, topic, transcript } Protocollo notifiche: rt-notify-{rt_id} → form_watch notifica Adrian [RT NEW] msg-a2e con subject=roundtable-{rt_id} → Elon riceve turno msg-e2a con subject=roundtable-{rt_id} → form_watch notifica [RT ELON] N)datetimetimezone)Pathz(/mnt/ssd/data/vault-secondbrain/vault.dbz elon_pull.pyu── ROUNDTABLE {rt_id} · Ciclo {cycle}/{total} · Turno: ELON ── REGOLE: 1. I partecipanti parlano a turno nell'ordine: MAURO → ADRIAN → ELON 2. Se in un turno non hai nulla da aggiungere, scrivi solo: PASSO 3. PASSO non interrompe il roundtable — il turno passa al successivo 4. Se tutti e tre fanno PASSO nello stesso ciclo, il roundtable si chiude 5. Rispondi via msg-e2a con subject='roundtable-{rt_id}' 6. Cicli totali: {total}. Dopo il tuo turno Adrian gestisce il flusso. ARGOMENTO: {topic} ────────────────────────────────────────── TRASCRITTO: {transcript} → Ora tocca a te (ELON). Scrivi il tuo contributo oppure PASSO. ── Adriancbtjt}tj|_|SN)sqlite3connectDB_PATHRow row_factory)conns //mnt/ssd/adrian/vault-secondbrain/roundtable.py_dbr.s! ??7 #D{{D Kreturncftjtjj dS)Nz%Y%m%dT%H%M%S%fZ)rnowrutcstrftimerr_tsr4s! << % . ./A BBr transcriptcg}d}|D]_}|jdd}||k7r|}|jd|d|dj}|d}|jd|d|ad j|j S) Ncyclez [Ciclo ]agenttextz z:  )getappendupperjoinstrip)rlines cur_cycletcrrs r_format_transcriptr)8s EI + EE'1  >I LL9QCq) *'   "&  r%4&)*+ 99U  ! ! ##rn_cyclestopicc tjtjj d}d|}dd|t dg}t jd|ddd||d }t j|||t d }t}|jd |d t||f|jd d |d |d||f|j|j|S)z2Crea una nuova sessione roundtable. Ritorna rt_id.z %Y%m%dT%H%M%Szrt-rmaurorrrts roundtableadrianactive)tipo cycles_total cycle_currentturnstatusr+r)rt_idr+cyclesr/NINSERT OR REPLACE INTO items(id, type, body, file, meta) VALUES (?,?,?,NULL,?)os rt-notify-u cicli — ) rrrrrrjsondumpsrexecuter)commitclose)r*r+r/r8rmeta notify_metar s r create_rtrDFs hll # , ,_ =B"JEceLMJ ::   D**uuX[X]^_K 5DLLX (4d; LLX eW tzUG%DkR KKMJJL Lrr8ct}|jd|fj}|j|syt j |dxsdS)Nz!SELECT meta FROM items WHERE id=?rB{})rr?fetchonerAr=loads)r8r rows rload_rtrJfsL 5D ,,:UH E N N PCJJL  ::c&k)T **rstatect|d|d<tj|}t}|j d|d||f|j |j y)Nrtranscript_formattedz*UPDATE items SET body=?, meta=? WHERE id=?)r)r=r>rr?r@rA)r8rKrBr s r_save_rtrNos]$6u\7J$KE ! ::e D 5DLL=./u=?KKMJJLrrc~t}|jd|f|j|jy)Nz4UPDATE items SET body=? WHERE id='da-adrian-a-mauro')rr?r@rA)rr s r_write_cockpitrPys, 5DLLG$QKKMJJLrresponsec t|}|sd|dS|ddk7r d|ddSt}|dj|dd||d t|d}d |d |dd |d d|d }t |t j ||d|d |d|}t}d|}tjddd|d|d} t} | jd|d|| f| j| jd|d<t||itjddi} t!j"t$j&t)t*dg| t j,t j,d|dS)zRAdrian invia il suo turno. Aggiorna stato, triggera Elon. Ritorna messaggio esito.RT non trovato.r6r1u+Non è il turno di Adrian (turno corrente: ).rr5r.[RT- · Ciclo /r4z] u ⏳ In attesa di Elon...r+)r8rtotalr+rzmsg-a2e- agent_memoryelonz roundtable-)r3fromtor/subjectr:r;DISPLAYz:0z--fire-and-forget)envstdoutstderru/✅ Turno Adrian inviato. Elon triggerato (msg )rJrr!r)rPRT_RULESformatr=r>rr?r@rArNr;environ subprocessPopensys executablestr ELON_PULLDEVNULL) r8rQrKr/fmt cockpit_textmsg_bodymsg_tsmsg_idmsg_metar r`s r submit_adrianrss ENE UG=)) V} zsubmit_elon..s)MQAfIOO%++-8Ms.0completer7rVu · COMPLETATO]  z (Roundtable chiuso: tutti PASSO)(z cicli completati)u✅ Roundtable completato.rr-r6rWrXu — trascritto] u ── Ciclo uB ── Mauro, vuoi commentare? /rt mauro oppure /rt passou3✅ Turno Elon acquisito. Ora tocca a Mauro (ciclo rU)rJrr?rGr=r>rr@rAr!r)allrPrN)r8rtrKr rI elon_textack_idack_metar/rm cycles_doner4r' this_cycle all_passorns r submit_elonrs ENE UG=)) 5D ,,:[N K T T VC"F (:I+ab/ )Fzz;ceLMHLLW r8$ KKMJJL B ,)?&Zckmno U<0 1C(K(L#<0NAgJ+4M!NJNM*MMIK</$h5',e4 5>1a ~UgDh j  |$+ o!#f 5'K=,?Se!/231\NCI J  |$DU?E[D\\]^j]kkmnn3Os , F:Fc Ht|}|sd|dS|jddk(ryt}|jj dk7r|nd}|dj |dd ||d d |d <t j||d |d|dd}t}|jdd|d|ddd|dd|d |f|j|jt||t|d}d|dd|d|dd|dd|d S)z4Mauro aggiunge il suo commento nel ciclo successivo.rSrTr7ru!Il roundtable è già completato.r|rr5r-r.r1r6r+r4T)r8r+r9r/resumer:r<z-cr;zCiclo u — u✅ Contributo Mauro (ciclo z) registrato. [RT-rWrXz] u ⏳ In attesa di Adrian...)rJr rr$r"r!r=r>rr?r@rArNr))r8rrKr/ stato_textrCr rms r submit_maurorsn ENE UG=)) yyj(2 B++-8gJ ,)?'[emopqE&M**uuW~).~)>bTXZ[K 5DLLX eWBu_56 7 %()uW~.> ? N  KKMJJL UE U<0 1C &u_'=&>?gZo 67q~9N8Os %- /rct}|jdj}|j|syt |d}t j |dxsd}|d|d<|S)z3Ritorna lo stato del roundtable attivo (se esiste).z SELECT id, meta FROM items WHERE id LIKE 'rt-%' AND type = 'os' AND json_extract(meta,'$.tipo') = 'roundtable' AND json_extract(meta,'$.status') = 'active' ORDER BY id DESC LIMIT 1 NrrBrFidr8)rr?fetchallrAdictr=rH)r rowsrrKs r active_rtrso 5D <<    JJL  T!W A JJqy(D )EtWE'N Lrc |st}|sy|d}nt|}|sd|dSt|jdg}|jdd}|jdd}d |d |jd d |d |d| S)NzNessun roundtable attivo.r8rSrTrr7?r6rVu · r4u cicli · z] Turno corrente: r)rrJr)r )r8rKrmr7r6s rshow_rtr(s  .g}- - UYY|R8 9C YYx %F 99VS !D ugT%))N34JvhG& % rr)__doc__r=r;rfrhrrpathlibrrr __file__parentrkrcrrjrlistr)intrDrrJrNrPrsrrrrrrrrs>   ' : ; N ! !N 2  * CSC $4 $C $CC@+3+4$;+C5H5H5H5Hp6os6o6o6or  3 3 F4$;(3:r