rWj~W dZddlZddlZddlZddlZddlZddlZddlmZmZm Z m Z ddl Z ddl m Z ddlmZmZmZmZmZmZddlmZmZmZddlmZddlmZdd lmZee d e d Ze d Z d Z!hdZ"dZ#dZ$ejJddZ&ejJddZ'ejJddZ(dZ)de*fdZ+e dZ,de*fdZ-e-Z.eZ/e/jaedgdgdgde*de*fdZ1de*d e*fd!Z2de*de*fd"Z3d#e*dzde4fd$Z5d%Z6d&Z7e/jqd'dRd(e*fd)Z9e/jqd*e+d,Z:e/jwd*d-ed.efd/ZdSd4e?de*fd5Z@de*fd6ZAd7e*de*fd8ZBd7e*de*fd9ZCde*fd:ZDd;eEdZGe/jd?d@dAgBded1fd-ede*d#e*dzfdCZIe/jqdDed1fd#e*dzfdEZJe/jwdFedGed1fd-edHed#e*dzfdIZKGdJdKeZLeMdLk(rddlNZNeNjdMdNdOdPQyy)Tu webapp.py — Cockpit Adrian↔Mauro via browser (iPhone/desktop). Accesso: https://cockpit.privcloud.dev Auth: cookie di sessione (30 giorni) — login una volta sola. Canali DB: da-mauro-a-adrian : Mauro → Adrian da-adrian-a-mauro : Adrian → Mauro (SSE) N)datetimetimezonedate timedelta)Path)FastAPICookieResponseRequest UploadFileFile) HTMLResponseStreamingResponseRedirectResponse)CORSMiddleware) BaseModel) load_dotenvz/mnt/ssd/adrian/.envz"/mnt/ssd/data/adrian-ops/adrian.dbz/mnt/ssd/data/adrian-ops/inboxi@>.md.doc.pdf.txt.docxzda-mauro-a-adrianzda-adrian-a-mauroCOCKPIT_PASSWORDPrisma26ADRIAN_BOT_TOKENTELEGRAM_CHAT_IDzhttps://cockpit.privcloud.devtextctrtsy tjdtdt|dddy#t$rYywxYw)Nzhttps://api.telegram.org/botz /sendMessageHTML)chat_idr parse_mode)jsontimeout)TG_TOKEN TG_CHAT_IDhttpxpost Exception)rs +/mnt/ssd/adrian/vault-secondbrain/webapp.py tg_notifyr,*sH :  *8*L A'VL    s(8 AAz./mnt/ssd/data/vault-secondbrain/.session_tokenreturnctjr"tjjSt j d}tj ||S)N ) TOKEN_FILEexists read_textstripsecrets token_hex write_text)tokens r+ _load_tokenr87sI##%++--   b !E% L*) allow_origins allow_methods allow_headerskeyctjt}|jd|fj }|j |r|dxsdj SdS)Nz!SELECT body FROM items WHERE id=?rr)sqlite3connectDB_PATHexecutefetchonecloser3)r>connrows r+db_readrHDsS ??7 #D ,,:SF C L L NCJJL%(CFLb   !0b0r9valuectjt}|jd||f|j |j y)Nz"UPDATE items SET body=? WHERE id=?)r@rArBrCcommitrE)r>rIrFs r+db_writerLKs5 ??7 #DLL5s|DKKMJJLr9cFtjtjj d}d|}t j ddd|d}tjt}|jd|d||f|j|j|S) uDScrive msg-m2a-{ts} nel DB (coda Mauro→Adrian). Ritorna il msg_id.%Y%m%dT%H%M%S%fZzmsg-m2a- agent_memorymauroadrian)tipofromtotsNINSERT OR REPLACE INTO items(id, type, body, file, meta) VALUES (?,?,?,NULL,?)os) rnowrutcstrftimer$dumpsr@rArBrCrKrE)rrUmsg_idmetarFs r+db_enqueue_msgr^Rs hll # , ,-? @Bt_F ::~whVXY ZD ??7 #DLLX tT" KKMJJL Mr9sessionc|tk(S)N) SESSION_TOKENr_s r+is_authrcas m ##r9u Cockpit — Accesso

Cockpit — Adrian

{error}
u Cockpit — Adrian

Cockpit — Adrian

● pronto
z/notifymsgc4td|dtddiS)zIAdrian chiama questo endpoint per mandare un campanello Telegram a Mauro.u🔔  okT)r, COCKPIT_URL)rds r+notifyri0s#cU"[M*+ $<r9/login)response_classc.tjddS)N{error}r) LOGIN_HTMLreplacer9r+ login_pagerq7s   i ,,r9requestresponsecK|jd{}|jdd}|tk(r)tdd}|j dt ddd |St tjd d S7gw) Npasswordr/i/ status_coder_i'Tlax)max_agehttponlysamesitermz#

Password errata.

) formgetPASSWORDr set_cookierarrnro)rrrsr}pwds r+loginr<su D ((:r "C h#CS9I}jSWbgh  **96[\ ]] sBA>A(Brv)defaultc:t|s tdStS)Nrj)rcr CHAT_HTMLrbs r+indexrGs 7 )) r9c y)Nu(Comandi disponibili: /c [N] — calendario prossimi N giorni (default 7) /t — todo aperti /n — [disabilitato] /ne — [disabilitato] /p — leggi il Protocollo Mauro /rt — [disabilitato] /h — questo helprprpr9r+ _cmd_helprNs  * r9giornictj}|t|z}tjt }|j dt|t|fj}|j|sd|dSd|dg}d}|D]}tj|d}|jdd } |jd xsd } |d } | |k7rg| } tj| d } gd } gd}| | jd| j d|| j"}|j'd|| r d| dddnd}|j'|| dj)|S#t$$r| }YVwxYw)N)dayszSELECT body, meta FROM items WHERE type='event' AND json_extract(meta,'$.date') >= ? AND json_extract(meta,'$.date') <= ? ORDER BY json_extract(meta,'$.date'), json_extract(meta,'$.start_time')zNessun evento nei prossimi z giorni.zCalendario prossimi z giorni: rr start_timer%Y-%m-%d)LunMarMerGioVenSabDom) rGenFebrAprMagGiuLugAgoSetOttNovDic rfz r#z )rtodayrr@rArBrCstrfetchallrEr$loadsr~rstrptimeweekdaydaymonthr*appendjoin)roggifinerFrowslines current_dayrmdttitolodt GIORNI_ITMESI_ITlabeloras r+_cmd_calendarior[s ::O=PQ LL2eW & !1Ra5'n{ uVH%&!'" 99U    s#AE<< F  F cdtjt}|jdj }|j |syt tj}ggggf\}}}}|D]}tj|d}|jdxsd} d|d| rd| d ndz} | s|j| W| |kr|j| n| |k(r|j| |j| d g} |r"| jd | j||r"| jd | j||r"| jd | j||r"| jd| j|dj| S)Nz[SELECT body, meta FROM items WHERE type='todo' ORDER BY json_extract(meta,'$.due_date') ASCzNessun todo aperto.rdue_dateru• rz []z Todo aperti: u⚠️ Scaduti:u 📅 Oggi:z In scadenza:z Senza scadenza:rf)r@rArBrCrrErrrr$rr~rextendr) rFrrscaduti oggi_listfuturisenzarrdueentryrs r+ _cmd_todors ??7 #D << 8 hj  JJL $ tzz| D(*BB%GY  ! JJqt eeJ%2qtf 3se1"= LL  4Z NN5 ! D[   U # MM%  ! E &' W ^$ Y  %& V  () U 99U r9testoc |jsytjtj}d|j dz}t j|dddddd|j dd }t j||j d d }tjt}|jd |d ||f|jd d|d||f|j|jd|dS)Nz'Uso: /nota nota-cockpit- %Y%m%dT%H%M%S<limbopendingcockpitr)nomerR limbo_statofontesourcedatarN)node_idrUrVnodo nota-notify-rWu✅ Nota in limbo (u7) Elon la distillerà nel grafo alla prossima sessione.r3rrXrrYrZr$r[r@rArBrCrKrErrUrr] notify_metarFs r+ _cmd_notars ;;=8 hll #B O <rrNrrrrz elon-firstr)rrRrrrroutingrrN)rrrUrVrrrWu✅ Nota elon-first (z) Elon valuta, Adrian legge.rrs r+_cmd_nota_elonrs ;;=* hll #B O <zLUso: /rt Esempio: /rt 2 Quale approccio preferite per X?u✅ Roundtable avviato (z) u cicli · argomento: uA Turno 1: ADRIAN Adrian sta leggendo... risponderà nel cockpit.)syspathinsertrr__file__parent roundtablerrrrlenlowerrr3int ValueError) rr_sysrrrrsubstaterntopicrs r+_cmd_rtrsDIIQDN1123FF"%j1n%(.. "C #-y g~ .E'NG44 g~qr#))++ .E'NE22_ H HHU12Y  % % 'E ^ a E "5' # "5'*: ; _^_s D D+*D+c|jj}|r|djnd}|dvr tS|dk(r5d}t |dkDr t |d}t|St|S|dk(r tS|dvry |d vr tS|d k(ry y #t $r Yt|SwxYw)uUProcessa comandi /c /t /h /n /p /rt. Ritorna la risposta o None se non è un comando.rr)z/hz/helpz/crz/t)z/nz/notaz/nez%Comando disabilitato temporaneamente.)z/pz /protocolloz/rtz(Roundtable disabilitato temporaneamente.N) r3splitrrrrrrrr)rrcmdrs r+_handle_commandrs JJL   E#%(.. C o{ d{ u:> U1Xv&&v&& d{{ $$6 ##   e|9  v&& sB'' B=<B=z/sendGETPOST)methodscNKt|s tdS|jdk(r8|jd{}|j ddj }|rz (iu KB) — pipeline avviata)rgfilename)rcr rrsuffixr ALLOWED_EXTrsortedreadrMAX_UPLOAD_BYTESINBOXmkdirr1stemrrXrZ write_bytesr,name)rrr r_rcontentdestrrUs r+uploadr VsF 7 C(( $-- ' ' - - /F [ (=fX]SWS\S\]cdo]pSqRr&sttIIKG 7|&&(FHH KKtK, 4== D {{}DMM"'' \\^ $ $X .$qVH--W 7 {&WW[I[H\\uvwDII .. sBE; E9 C0E;ceZdZUeed<y)MessagerN)__name__ __module__ __qualname__r__annotations__rpr9r+r"r"qs Ir9r"__main__z webapp:appz0.0.0.0i>"F)hostportreload)zHai un messaggio nel cockpit.)r)P__doc__r$rWr4r@rtimerrrrr(pathlibrfastapirr r r r r fastapi.responsesrrrfastapi.middleware.corsrpydanticrdotenvrrBrrrrrgetenvrr&r'rhrr,r0r8raappadd_middlewarerHrLr^boolrcrnrr~rirqr)rrrrrrrrrlistrr api_router r r r"r#uvicornrunrpr9r+r;s  88 HHOO2 D' ()9:56#8 ## ,j9 ,b1 ,b1 /   C  B C S  i>#se\_[`a111#c   $S4Z$D$  Bc P ,/-0-(^^H^^\* &t 43:+ 3 !C!!H$3$NcScSc>J#J#JDGG.4.C.C.b##*2w0-/vVZG[s#*1$%d3#*)6:3iW]fjWk/'//#PT*//4i zGKK 94Fr9