From 304208760b4f2aec4118411a7d695fc2147426bb Mon Sep 17 00:00:00 2001 From: manoraga Date: Fri, 21 Aug 2026 09:32:07 +0300 Subject: [PATCH] chore: save working baseline before v3.0 architecture refactoring --- data/scud_orion_ai.db | Bin 6520832 -> 7520256 bytes data/scud_orion_ai.db-shm | Bin 32768 -> 0 bytes data/scud_orion_ai.db-wal | Bin 185432 -> 0 bytes data/static_reason_workers.csv | 3 +- docs/CHANGELOG.md | 28 + docs/ROADMAP.md | 61 - docs/in_progress/ROADMAP.md | 136 + .../план_оптимизации_работы_с_контекстом.md | 72 - modules/ROADMAP.md | 56 + modules/web_api/llm/agent.py | 572 ++-- modules/web_api/llm/core/context_manager.py | 64 + modules/web_api/llm/core/fast_path.py | 119 +- modules/web_api/llm/core/ollama_client.py | 6 +- modules/web_api/llm/core/tool_injector.py | 41 +- modules/web_api/llm/db/db_snapshots.py | 101 +- modules/web_api/llm/db/db_tasks.py | 271 +- modules/web_api/llm/db_tools.py | 43 +- modules/web_api/llm/schemas.py | 200 +- modules/web_api/main.py | 3 +- modules/web_api/routers/files.py | 73 + modules/web_api/routers/tasks.py | 90 +- modules/web_api/static/js/chat/core.js | 42 +- modules/web_api/static/js/chat/task_widget.js | 549 ++- project_code_snapshot.md | 3009 ++++++++++------- 24 files changed, 3471 insertions(+), 2068 deletions(-) delete mode 100644 data/scud_orion_ai.db-shm delete mode 100644 data/scud_orion_ai.db-wal delete mode 100644 docs/ROADMAP.md create mode 100644 docs/in_progress/ROADMAP.md delete mode 100644 docs/in_progress/план_оптимизации_работы_с_контекстом.md create mode 100644 modules/ROADMAP.md create mode 100644 modules/web_api/llm/core/context_manager.py create mode 100644 modules/web_api/routers/files.py diff --git a/data/scud_orion_ai.db b/data/scud_orion_ai.db index 7900e5b67b1cf5d637d56bf6727b0afa5a603e01..b4b33611b94117ba88e2d08e6ba207948124c761 100644 GIT binary patch delta 588051 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�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 z

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 delta 301946 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 IMZIGEe+!5-D*ylh diff --git a/data/scud_orion_ai.db-shm b/data/scud_orion_ai.db-shm deleted file mode 100644 index ed9a00585a0606b9b5949d75c416215769a91573..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmeI*Pfk-&6bIm63lu~}5TO-R6h;0hBOEwuWCz3vAz>G=1*W(c=Y$2g1V>Dmu>lAA zE=ft#Xi`JdK=a+?_PuvrFL1R?(eR39qjr!swcEQc?~+@t zopYW0QoEcfwR`h>-}kRRO1wL_DrXTOK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PI(p;Bl62b>3kD z1PBnge*$Bf$W*2?lld%WC2z8p^?ba4gXoyR2nx*R#RyJiBm(^i%;jZ2X>teGyl? z-PNvEvYCucu=uXDulqRX_xqgRIp^-Zzx(?wd2n2Fq~x_Jk;tVHK3;jV?asSTfA`k; zYv2B_PdG2U9f?F!xyyh0$?sp|zVN@ly#x!3;>RNR*FywEKmYKms4tE#I_)Fi8Fmw$2D&C72~d~VrIH!Zv4_T~3aud1we z6RF0AT5o!VQ~E$zY1!hE(xoK}mO7;$uUJ@GQMLr<1sWrfaZ5Aj3(BAT?T#_udvWVT z=vx$jBZ7ZDL_h>YKmYKmMAeQux|Y139(txm1~lzL=7&oCs(`PnCm7_ip?pyr?zfwwOhH`O{_?I?%4R) z*won98tW5YD!FP^Wbb#TT#U*p-TGuhs>ZENCA@XDb+zkiyy%oGCdNvNLNOZLRc?b@ zyV9K$ey^G>SsK;B`SedA7#MMX{?VGcU3GlKbowqt4UT@xn5!o)URt;7j2<7 zk;vG{gz>Sfi&9DN9&Zl(1&VY11@_(ce~&zP@sS_$K7wd;ek6VvFM5c;nF;K!Z@q4O zq-1J(YNH)ZAH|o{bown$SaF(Snoei7-(u1bC2e|~$`y&# zZYp6r&0Ky^U`@ueMI zi(TvhtZHxA(Xh()NA|@-wC*z7={n4#=7{a2?2+iS*!3Cn&7l09DDGMFT!}5@0J`zx z73>e4&@#>b2z*&B3tnj?(|0|I)T9glkO-W7_{&+Z7qIn`xHklYr-Hg+7zlY+Y) zVs{%vu@9XC!(C5M0i}jTuv7U>7zWTQ@U5A{O3txN!mX@IS%WB>$M$&?1a^V{LFmF} z*@xGi#M%Llhp=ELKs}Dn90%KjRU~JL19SWEHLk3yT~*bPJ&LMtaPO^h*M{;!W*~uS zH$zw;32Y$frUVBT7+M`PpT#gY7?=7+f(pH@*`kqKS*SD1((lIpU10~~NW68{T&%$- zzN3l(e-oMu-5bq%d{&6Wj!z@&j?oXcvnPacBxl+Hiv1`KHo=iU#}L@wXbldeIrBx% z^st+jjuJ6Q0d+fOpq(JHJ2NTe8>;P!9CtBT+qMr_TAM{f=gbW-(gJgV)({6>fwFJ_ z$O_6?fL1?})pA8X&~WMtxpC;^d`Y`u?+p8R#%8EvK#lwkm?ML@`u(k#J?&(}kv>Dt zj^_4@orEABOrORIM9>V?JcYs!o97(cB!|pl3b4z$3qoWj?!DHUIrszT5CLd)EG#ha zw!1MjIoO;B0Cr36(t!nRncdhHhXA3f9KHuFww;4ec2wh`1AEY3TL{(->X~a6R=I+S zg>y6Phb@HuOIyZgJLMEK$GpV4dCe0j5T zE&~jU9Ivd(IkPsD$22~I!uiHd?Xq)ts2%6HU10}I`wv@$knt3!LlkX|oP&iOGl>`D zkG~Q9^CS+>aKOX~K1ZnT%m`}-agInljKc^EOT|Hy?b|r;gPv&3P=uvt0Zb#?Z@vvH zp%rf*gd0pI&zNuJk0Cid0Xk6laDw(XbIL~DIFw}X2;~l@bQn@*n&ya<=|mgmVY zKmyzd*jfz!Q&O|A(J@15eUlAXfBm)?WZ`dW;?dx3o^>d8S(nuk73N zOgzVgC(q8}a+oyxLCwXIkYKmYV6+kV zqw*0fD9lH&unc7K?j!iot9vHamwk4#?jsm&HY0sRKmYKml7^sl4Gk3C3#fiXq*hxZZSgC6e}fxBBB`1wyw7W(-QM({hB@8RDC z|9-kJGx$y4TxY@3d8JEjsEWdP6${IBAAyaEqPT+vQ56+;FbvhIxPv(nx)gWN#s##| zgc!LrKZp-*ok6_BFoqD^6cHPDDaaw0u4{2jy04Gn6m`v`O&!F#@sAm3l$<%g#oE_vtazn8zj`*j*X z^@xB7h=2%)fCz|y2#A0Ph=2(EF$B($zrZy43*`F?{H|)pf4?2OV+Q>N#uiP<`U~Kr z9w6|Q)@cmd_tnCS`3%~JOZJ^M=R_t!1Y-ChWd*KJGuK;lcvUG#ZgL#SRyv1X&tFhc zS|)!1n-(Ov_NF|AJVmTLg<%TV%!PdADYPkVl&26$oN`7Bn?Na(X-Ihr_Z#IY43ah~ zPoYVN$=Q^r&}L>-p2BP%VPsO{7^*ylLjyZ1Pa(5?D^Fo?h(SL=dTe}1@)YLB9ejJ% zrl0-h>6ac-+(DfN5djep0TB=Z5fA|p5CIVo0TB>^4=RB_D(+y}(71!RIK3De7E#Mr z-fX+`?$h7BHFf!o&dN6;^12TJ6JPrX`F9*h=2%)fCz|y2#A0Ph=2%)fCz|y z2#hKMlaO0%IhjzR;qfT)Lhi_`d9qhcJth8)#N$Jv(1xuaMk5?=# z#sBX5*6YS2xng>3VL-;g?22us56M$DAQ)r6zXhpOHk;!^vVPe`xsk*acTjN$Q;7yw zaR>WtM!ZghalUZ`m>^6tZ4rjJskd)G^P1bvB z>QWwJIZiA?d?7}uYct!C5Ni)p6K*%p7#pEWc?y-M5X1I*Agm@(pRpIv7M`5vt3Lfq75SS1GiFfgR)h2f?Vh<6qXG2K|*h3`$~ z7y|Tm`deqs#TtC#JE|D)H(?z@`1;$-@mXQ~ymD)@9mr;P2)4QtVm*$}L72gv4y_*6 zyeC|sxPyv2*lzOU${`&jEP1cB60EDh2nZ{~Fv`)Bf%s_Mo&F|-{Y8-10SvJ?Zb9g= z;}~dzjBzI!5E$W2Vaql}G}ereMDDElNtr?}SsSLw4J~{zEPSxT4Hf@jcEIj1PeGM- z4E1eiPy)GByP!o6^cX-tgGM%$-8O%d;tr0G2vTte6?f21P?^!-!xVSW#tF!t7x-Fj zar361-g8g*t2m1D221c<6uxIZYKmYU}ORY+4zS(+2D<9OaS#3@^qmT8vHnx^q=N60)xh5brCaX zFi2L8U9EQtU8vv_h+?1we59~fKgvULJV;~ZgUDsW@T1+ony zKy6|M;*;PKI&>j@I#oqAS!ApSu81wvz=7H)s1=mMMn|!08hgCfv?Hi~0Qj+a#&w2b zVneuq`CFjcb}Y9XELqU9jWyUbmNr}%;YY?Y*am2ORsp9oa)p{$4YR=eR@R6w7O&kN z62V2y7Po1d17{CwLG$LJ<{dLlS($&V_%vOTiTEA7nbkkK1q)6~xg(j-hmL)vi`Bs&4=^^Nd{|4KVWYrakcNlTQQ8h+((+)F+qgB| zh0=kGcAwqVdJG});t&V$Fdso)+`(Vn{_d8iP96HC;tq~H>}ib%h=2%)fCz|y2#A0P zh=2%)z@MJLIf^?tLvaW5{ROTm9$)|c760&6`U^xa{yzK#@S=wZh=2%)fCz|y2#A0P zh`X5Ar2%LkiS4Qh1dbv`v_in@bs}| z?&Kfa`v~I4BKX%s1VlgtL_h>YKmY-~&bA^F?DzuAg7N)?JbCT+gej zt4-7-t7?~jaoNqwZ%ce`*-bYsyW{rd_fM~?tacNr#)evNdWBQ|K*4>UE zM_x?*W69CWbsxb8s=+0U2#A0Ph=2%)fCz|y2#A0Ph`6AUX?A%Sz0HQuvfE=K+71*c~p}-i^jU^mqEn%)>XaHw-l)zAJ$k^)4wguZV1Mv_{jiOk; zdHTlhU5LyU_$G0x~OPc7jKjO?7&mwtevQZ=Wnl;P=yQ50Un zZ|&cH(D@kSrr88%NFQs3v2OYmA9IjPlXcj#>9=n~pRs%_JVy8ZAaY(O6ogB^jb=ys zz1Alg@y%>^}8ro)?H*8qs|Ow!m z@?sX9IWO?S!HtjiH0^jf$VYHE5Z_9CH$6&kJlm z{E5Y%{r&HMc?Nm3N(4ke1VlgtL_h>YKma%&Rx4Rtm3sYGpErRzl=n{r8PQBkU{t~!xinX0O*O*FWx ztGrahy77}I#AZcTu1Tg6HLm9+SG(SrnUg2Q<`msiTer5_tz7LURwO-lYu|99+FXC@S#*DuxcJ%~?9PqA+#pXwowRJVg>MGYutbzJ<4eO#U)P^|(CXA0= zU6e|C_jq%HxP#-CX3h)z)!h5jFF1{pcq2hHJ`QmQY zKm&)?ylBw(OC=BkG^gR5oPS&Q(0YvvZY6kpf(}@Uwg+cyK7A^TO`wK)pD!9)a{c`BweE_9hfoQOqEM5ps$KrYWj8OsE%CW!H{G=Cj@y^tKfS85 z+D)Vy8*07j6;9~`LvB)7Qc=19Q3M)u{RNJE@~BsRbkDy}guX@bHzN4gLj*)X1Vlgt zL_h>YKmNaNmA#a-ZT0jDiN23L+o^A|L`H zAOa#F0wN#+A~1>xoTK;xvlL$-Kfb`Pm!0^^T{qtRB<~{_Q?w|IFHp27h%hjU4eDH| zw!6M{7Q%t?QzH@*&-E`PJX$uUp?(LDjx-!vaMc0>Ce*cq~8*G|*p zZ)Pk|#Q(&z7vP7{uA#Bo^)ix{L(=`IAdQj-AT8vCRD&S>^;x=olyShp>H$>2sG`SE ziQUQHM%l2MEzyg01lq}Eec0@Tm8RR7ZQGBH{Fv!*3bAJso@9hu7z&3vY~WIW0VP&y z%j~xrW+}Y3zsFf%4xY7|Y$B6PHH%mc%IwA;1wTgYMBR(Z0u!=QIHX z*NgxeI~b<1z1n2Gx27(|2A@c?+>a{T%yx99J*LgUhiA~$I`ED!?dV$UVh3PVd&7=~ zRklB}FCL^SKmBNldo+<8)Pw?pi1gDCc) zb6~jZ2`Zq}u!z7OFbtqq;9E0?m7EMi3AeH;WeuWi9^2Rj10QERNa~y0BR*{?~4$SSt*SNB-c2!kFHn&lIgL`k4yEc>;G6M-ryBWd)Nnis( zHzha_#E9Ua`7DOH!MM~n5>)7I%@&P}V8qaPmZjf~{cVV1bTE#@TW8J18hqkAsu=J$ zp}Ek#(X7X3g-Go9G_vj({a`zLLKsJKrVXIjkK$kx42_&)2yAb(1_#o?Va{$up)ft{ zrlq4q3{pVdju~hti0sZxO8JIryCTP34A!>o1D4ii(ajfGPR^IK8}`nyk7sO#ItJ9p?|?Znh^ybu}yNw9Hs!foVy@IX5!v!t(k+rg`6h0ddK3gytumiyDBzFcSMxLM1YuS8xvvV#3 z42vAEtjamFHk8LSUSPSy89TMh&f%eUoa1(d9Wd=bY=>8lqnr*=v^8=L7Iw_!(2McM z--!Ns5{G9vU?S}tp}I38tR2K1pA$+SM_5=Y4x((|#(^L7L~Dj3EIkWg8rgpHZCDAd zc>5sSU^02ed@Fwp$>|Bufx?Fqw7;2CHtNQqBzs3FcW?v&L&{9k9BeY3Xv2JrM4T7w zpvj}KbkGE6Cyw%mom|)q*=ZlMelUdQ&HC&vJODVt3BBA-==)F{oBer?j3kLUla}AY zYM>+9fyW>mz?-2ZCPTdN2s@3xzKpV1Ms>SN(84^NWy4}9<09J{<#vwi2n*u4hjP1k zEEpUfu@$j$uu(Y#VbMlZ-h>&{9zr;?>#N~C?xfuNQge9R%R_h6%!9Ls@JsSc*-9UN-;@P`53dTjc*Xg2u2Ff6KgK9NraQpfFVelM>pgkw1@)fibz-Q2>Y6 z8S=I@@f8P*L$H=sl$GP>aGt-w6aQ26YKmYKm~S5^<;%9xM9o)=I)g3;RW(n|zHKmYKm(dSN7l;)<9o|QP8wy6@eFSQL5fA|p5CIVo0TB=Z5fA|p5P=JbfZ`6mFL4J~ z{L8ifH0v)e@fCOQ0_qzQRRlyp1VlgtL_h>YKmRjb-iw%r+2rg&KF$Fqa%3#xR;1J0lu5+60ckt=m1!%P9MW&8 PD2(-9CVzqR;xF+3*=`p2 diff --git a/data/static_reason_workers.csv b/data/static_reason_workers.csv index 49f9ef7..e5deef5 100644 --- a/data/static_reason_workers.csv +++ b/data/static_reason_workers.csv @@ -10,5 +10,4 @@ fio,reason,note Незнанова Валерия Игоревна,Удаленная работа,Постоянная удаленка Ковалев Владимир Владимирович,Удаленная работа,Постоянная удаленка Кожокарь Татьяна Юрьевна,Удаленная работа,Постоянная удаленка -Субетто Юлия Викторовна,Удаленная работа,Постоянная удаленка -Ароян Станислав Месропович,Удаленная работа,Временная удаленка \ No newline at end of file +Субетто Юлия Викторовна,Удаленная работа,Постоянная удаленка \ No newline at end of file diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index e1ef71a..c1ccf25 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -4,6 +4,34 @@ --- +## [2026-08-19] — Инлайн-редактор задач, интеллектуальный ContextManager и стабилизация Function Calling + +### ✨ Добавлено +* **Инлайн-редактирование задач (`task_widget.js` / `tasks.py`)**: + - Добавлена кнопка редактирования (`✏️`) на каждой карточке задачи. + - Карточка трансформируется в инлайн-форму с тремя полями: текст задачи, HTML5-пикер календаря планируемого срока и выпадающий список важности (`LOW`, `MEDIUM`, `HIGH`, `CRITICAL`). + - Добавлен REST API эндпоинт `PATCH /api/v1/tasks/{task_id}` с поддержкой комплексного обновления полей в SQLite. + - В карточки выведено отображение даты создания задачи. +* **Интеллектуальный ContextManager (`context_manager.py`)**: + - Служебные запросы и карточки инструментов сохраняются синхронными парами (`is_ephemeral = 1`) и атомарно удаляются при завершении операций. + - Свободные диалоги оператора (включая темы Topic Drift) сохраняются в постоянную историю (`is_ephemeral = 0`) и не стираются при закрытии сессий промпта/задач. +* **Поддержка Y-снапшотов (`db_snapshots.py`)**: + - Исправлен SQL-запрос `db_get_snapshots` для точного извлечения ночных и фоновых срезов с префиксом `Y` (например, `Y20260817-003`). + +### 🔧 Изменено +* **`modules/web_api/llm/agent.py`**: + - Полностью удалены эвристические текстовые фильтры и принудительные сортировки инструментов. + - Настроен нативный возврат и исполнение инструментов без зацикливания модели. + - Устранена ошибка `UnboundLocalError` при вызове справочных инструментов. +* **`modules/web_api/llm/schemas.py`**: + - Очищены описания инструментов от агрессивных директив и капса, стабилизирована селективность Function Calling для Qwen 2.5. +* **`modules/web_api/llm/core/ollama_client.py`**: + - Оптимизированы параметры генерации для Function Calling (`repeat_penalty: 1.0`, `presence_penalty: 0.0`, `temperature: 0.0`), что исключило спам несколькими вызовами инструментов на один запрос. +* **`modules/web_api/static/js/chat/task_widget.js`**: + - Фильтр по умолчанию переведен на вкладку **«В работе»** (`IN_PROGRESS`). + +--- + ## [2026-08-18] — Двухфазный жизненный цикл сессий, двусторонний Diff и Topic Drift Guard ### ✨ Добавлено diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md deleted file mode 100644 index 780cc22..0000000 --- a/docs/ROADMAP.md +++ /dev/null @@ -1,61 +0,0 @@ -# 🗺️ ДОРОЖНАЯ КАРТА И АРХИТЕКТУРНЫЙ РОАДМАП ПРОЕКТА SCUD ORION AI - -## 📌 Зафиксированные вехи и концептуальные архитектурные решения - -Схема веток Gitea для развития проекта: - -main (100% стабильный релиз) - │ - ├──► feature/prompt-relational-nodes ──┐ (Перевод системного промпта на реляционные узлы в SQLite) - │ ▼ - ├──────────────────────────────────► merge to main - │ - ├──► feature/native-function-calling ──┐ (Отказ от регулярных выражений tool_injector.py в пользу нативного FC) - │ ▼ - ├──────────────────────────────────► merge to main - │ - └──► feature/ephemeral-context ────────┐ (Интеллектуальный жизненный цикл эфемерных сообщений) - ▼ - merge to main - ---- - -## 🎯 Текущий активный спринт: Нативный Function Calling и реляционный редактор промпта - -### 1. Архитектура чистого диалогового агента без регулярных выражений -* **Концепция:** Полный отказ от жестких эвристик и регулярных выражений в `tool_injector.py`. Все решения о намерениях оператора, вызове инструментов и переключении тем принимает языковая модель через семантический контекст. -* **Ключевые этапы реализации:** - * **Этап 1 (Санитарная очистка):** Превращение `tool_injector.py` в простой фильтр мусорных тегов без инжекции и перехватов команд. - * **Этап 2 (Семантическое управление сессией):** Инструктаж модели в `role: system` о поведении в состоянии `PROMPT_PREVIEW` (оценка подтверждения, отмены, правок или смены темы диалога). - * **Этап 3 (Жизненный цикл контекста):** Модель видит временные сообщения (`is_ephemeral = 1`) только во время активной ветки; при фиксации решения (`fast_path.py`) контекст очищается через `db_purge_ephemeral_messages`. - * **Этап 4 (Гибридный UI):** Поддержка как диалоговых правок, так и прямого инлайн-редактирования через форму `[✏️ Редактировать]` в окне чата. - ---- - -## 🚀 Масштабирование эфемерного контекста и сервисные инструменты - -### 2. Модуль инспекции контекста и базы данных (`db_cli.py`) -* **Статус:** `Реализовано`. -* Добавлена команда `context [session_id] [--limit N]` для просмотра сырой таблицы сообщений `chat_messages` с пометками об эфемерности. - -### 3. Модуль задач и бэклога (`tasks`) -* **Целевые инструменты:** `db_get_tasks`, `db_add_task`, `db_update_task_status`, `db_delete_task`. -* Вывод интерактивных карточек задач с фильтрами без засорения постоянной истории диалога. - -### 4. Модуль срезов и архива СКУД (`snapshots`) -* **Целевые инструменты:** `db_get_snapshots`, `db_delete_snapshots`. -* Интерактивное подтверждение удаления срезов и автоматическая очистка таблиц срезов из контекста. - -### 5. Модуль базы знаний, правил и аномалий (`kb & anomalies`) -* **Целевые инструменты:** `db_get_rules`, `db_get_anomalies`, `db_get_reference`. -* Изоляция нормативных справочников от постоянной истории диалога для предотвращения залипания LLM. - ---- - -## 🔮 Долгосрочный бэклог (Future Modules) - -### 6. Интерактивный модуль планирования (Checklist & Task Planner Engine) -* Динамические проектные чек-листы с синхронизацией в таблицу `tasks`. - -### 7. Изолированная песочница кода (Code Execution Sandbox Engine) -* Запуск динамических Python/Pandas вычислений в изолированном Docker/gVisor контуре. \ No newline at end of file diff --git a/docs/in_progress/ROADMAP.md b/docs/in_progress/ROADMAP.md new file mode 100644 index 0000000..dec7be6 --- /dev/null +++ b/docs/in_progress/ROADMAP.md @@ -0,0 +1,136 @@ +# План реализации (ROADMAP) + +## 1. Очистка от регулярок и костылей (`tool_injector.py`) +- [x] Полностью удалить принудительные перехваты текста регулярными выражениями для команд добавления, редактирования и удаления пунктов[cite: 4]. +- [x] Оставить в модуле только базовую санитарную очистку сырых тегов (``)[cite: 4]. + +--- + +## 2. Настройка контекста и инструкций сессии (`agent.py`) +- [x] Передать управление диалогом языковой модели через системный блок `role: "system"`[cite: 4]. +- [x] При активном состоянии `PROMPT_PREVIEW` передавать модели инструкцию: + - **Подтверждение / отмена / корректировка:** продолжать работу с превью и вызывать соответствующие инструменты[cite: 4]. + - **Смена темы:** вежливо напомнить об открытом изменении и запросить решение[cite: 4]. +- [x] Обеспечить видимость эфемерных сообщений (`is_ephemeral = 1`) для модели во время активной работы с превью[cite: 4]. +- [x] Внедрить семантический Topic Drift Guard (`idle_turns` = 3) с вопросами и кнопками из `tool_action_registry`[cite: 4]. +- [x] Реализовать детерминированный мгновенный сброс сессии и зачистку эфемерного контекста при вызове сторонних инструментов[cite: 4]. + +--- + +## 3. Очистка эфемерных сообщений при завершении (`fast_path.py` / `context_manager.py`) +- [x] Настроить удаление временных сообщений превью (`db_purge_ephemeral_messages`) строго в момент нажатия кнопок **«Подтвердить»** или **«Отменить»**[cite: 4]. +- [x] Сбрасывать состояние сессии в базе данных после фиксации решения[cite: 4]. +- [x] Внедрить прямое точечное применение изменений через `db_apply_prompt_node_action`[cite: 4]. +- [x] Добавить обработку фазы `PROMPT_FOLLOWUP` с кнопками завершения и очистки контекста[cite: 4]. +- [x] Создать `context_manager.py` для строгого разграничения служебных tool-пар (`is_ephemeral=1`) и содержательного диалога (`is_ephemeral=0`), сохраняя беседы Topic Drift в истории[cite: 4]. + +--- + +## 4. Инлайн-редактор в окне диалога (`core.js`) +- [x] Проверить работу блока ручного редактирования (`inline-prompt-editor-container`) с кнопками **«Сохранить правки»** и **«Свернуть»**[cite: 4]. +- [x] Обеспечить сохранение черновика через API (`/api/v1/chat/draft`) и отображение обновленного текста перед подтверждением[cite: 4]. +- [x] Реализовать двусторонний клиентский Diff-рендерер (одновременная подсветка добавленных строк и зачеркивание удаленных `[УДАЛЕНИЕ]`)[cite: 4]. +- [x] Добавить авто-форматирование и отступы подпунктов (`X.Y.`) при ручном сохранении черновика[cite: 4]. + +--- + +## 5. Тестирование и валидация системного промпта +- [x] **Нативные вызовы:** проверить добавление, редактирование и удаление пунктов через нативные вызовы модели (`db_prompt_node_edit`)[cite: 4]. +- [x] **Контекстные сценарии:** проверить поведение модели при смене темы диалога оператором (Guardrail)[cite: 4]. +- [x] **UI и очистка:** проверить ручное редактирование через кнопку в окне чата и последующую очистку контекста (`db_purge_ephemeral_messages`)[cite: 4]. + +--- + +## 6. Распространение архитектурного паттерна на модуль задач (`tasks`) +- [x] **Масштабирование UI задач:** + - Увеличена ширина карточки до `max-w-4xl` и динамическая высота скролла до `70vh`[cite: 4]. + - Реализованы переключатели фильтрации: «В работе» (по умолчанию), «В планах», «Готово», «Все»[cite: 4]. + - Разделены кнопки действия: «В работу» (для плановых) и «Готово» (для текущих)[cite: 4]. +- [x] **Инлайн-редактирование карточки задачи:** + - Плавная трансформация карточки в 3-строчную форму (текст, дата со встроенным пикером, выпадающий список важности)[cite: 4]. + - Отображение даты создания задачи[cite: 4]. + - Сохранение через REST API эндпоинт `PATCH /api/v1/tasks/{id}`[cite: 4]. +- [x] **Детерминированный Fast-Path и двухфазное удаление:** + - Мгновенная смена статусов без задержек LLM[cite: 4]. + - Карточка подтверждения удаления с автоочисткой контекста[cite: 4]. +- [x] **Генерация отчетов задач в Markdown:** + - Добавлен инструмент `db_export_tasks_markdown` для формирования Markdown-файла с группировкой по модулям и чекбоксами `[x]` / `[ ]`[cite: 3]. + - Реализован роутер безопасной отдачи файлов с сохранением имени (`/api/v1/files/download/...`)[cite: 3]. +- [x] **Доменная консолидация задач:** + - Реализован консолидированный инструмент `db_tasks_edit(action: ["ADD", "UPDATE", "DELETE", "EXPORT"], ...)`[cite: 3]. + +--- + +## 7. Распространение на модуль снапшотов (`snapshots`) +- [x] **Поддержка Y-снапшотов:** универсальный парсинг и поиск по `snapshot_id LIKE 'Y%'` и срезам за 22:00:00[cite: 4]. +- [x] **Single Active Snapshot View:** сохранение активного среза в контексте для аналитики с автоматической ротацией и зачисткой при запросе новых дат[cite: 4]. +- [x] **Интерактивный UI с чекбоксами и защитой срезов:** + - Чекбоксы в строках дневных срезов и кнопка «Выбрать все» в шапке[cite: 3]. + - Защита итогового вечернего среза Y (иконка замочка `🔒`, блокировка выбора)[cite: 3]. + - Динамическая кнопка «Удалить выбранные (N)» в подвале карточки[cite: 3]. +- [x] **Детерминированный Fast-Path удаления срезов:** + - Двухфазное подтверждение удаления (одиночное и пакетное) с корректным счётчиком количества удаляемых элементов[cite: 3]. + - Защита от сброса фильтра даты (`query_date`) при обновлении карточки после удаления[cite: 3]. + +--- + +## 8. Архитектурный рефакторинг и декомпозиция монолитов (Текущий этап) +> **Контроль версий:** перед каждым этапом и после его успешной проверки выполняется коммит и фиксация в репозитории **Gitea**. + +- [ ] **Шаг 0: Фиксация базового состояния в Gitea:** + - Создание тега/коммита `v2.5-pre-refactor` в Gitea перед структурными изменениями. +- [ ] **Шаг 1: Разделение слоя данных и ядра (`core/`):** + - Создание `core/connection.py` (единый SQLite Connection Manager с WAL и таймаутами). + - Создание `core/schema.py` (DDL-инициализация всех таблиц и индексов из `database.py`). + - Фиксация контрольной точки в Gitea. +- [ ] **Шаг 2: Выделение доменных сервисов (`services/` / `domain/`):** + - **Задачи (`services/tasks/`):** декомпозиция на `repository.py`, `service.py`, `exporter.py` (правило: до 100–150 строк на файл). + - **Системный промпт (`services/prompts/`):** декомпозиция на `repository.py`, `service.py`, `diff_engine.py`. + - **Снапшоты (`services/snapshots/`):** декомпозиция на `repository.py`, `service.py`. + - **База знаний и правила (`services/knowledge/`):** вынос правил арбитража и словаря синонимов подразделений. + - Фиксация контрольной точки в Gitea. +- [ ] **Шаг 3: Декомпозиция ETL-конвейера (`main_etl.py` и `scud_export.py`):** + - Выделение `services/scud_etl/pipeline.py` (оркестрация без длинных простыней кода). + - Выделение `services/scud_etl/merger.py` (чистая склейка Dataframe 1С ⟷ СКУД). + - Выделение `services/scud_etl/anomaly_detector.py` (алгоритмическая детекция нарушений). + - Выделение `services/scud_etl/sql_queries.py` (вынос длинных T-SQL запросов). + - Фиксация контрольной точки в Gitea. +- [ ] **Шаг 4: Выделение чистого ИИ-оркестратора (`modules/ai_engine/`):** + - Создание компактного `agent.py` (~60–80 строк) без ветвлений `if/elif` на сотни строк. + - Внедрение изолированных обработчиков инструментов: + - `handlers/task_handler.py` + - `handlers/prompt_handler.py` + - `handlers/snapshot_handler.py` + - `handlers/anomaly_handler.py` + - Создание `context_builder.py` (календарь, роли, сборка системного контекста). + - Фиксация контрольной точки в Gitea. +- [ ] **Шаг 5: Облегчение `web_api` и адаптация роутеров:** + - Превращение `web_api` исключительно в тонкий транспортный шлюз (FastAPI + Статика). + - Очистка роутеров от прямого SQL — вызовы только через доменные сервисы. + - Рефакторинг CLI-утилиты `scripts/db_cli.py` (вынос форматирования в `scripts/cli/formatters.py`). + - Финальное сквозное тестирование и фиксация релиза в Gitea (`v3.0-clean-architecture`). + +--- + +## 9. Диалоговая генерация и контроль отчетов СКУД (Conversational Reporting Engine) +- [ ] **Инструмент построения сводок (`db_generate_scud_report`):** + - Создание инструмента Function Calling для запуска конвейера контроллинга за выбранную дату/снапшот прямо из чата[cite: 4]. + - Поддержка параметров: `target_date`, `snapshot_id`, `mode` (`summary` — дневная сводка, `detailed` — вчерашний отчет)[cite: 4]. +- [ ] **Интерактивная карточка аудита отчета в UI:** + - Вывод статуса генерации, ключевых метрик (всего сотрудников, явка, опоздания, количество аномалий)[cite: 4]. + - Ссылки на сгенерированные файлы Excel (`.xlsx`) и Markdown (`.md`)[cite: 4]. +- [ ] **Диалоговый разбор аномалий и исключений:** + - Возможность в диалоге запросить расшифровку конкретной аномалии[cite: 4]. + - Быстрое добавление сотрудника/отдела в `exceptions.json` или базу знаний прямо из чата по кнопке карточки[cite: 4]. +- [ ] **Экспорт и отправка среза:** + - Команда формирования итоговой выгрузки для руководства в формате PDF/Markdown с передачей файла пользователю[cite: 4]. + +--- + +## 10. Изолированная песочница кода (Code Execution Sandbox Engine) +- [ ] **Docker/gVisor контур:** + - Создание изолированного контейнера без доступа к внешней сети (network: none) с ограниченными лимитами по памяти и CPU (cgroups)[cite: 4]. + - Настройка безопасного монтирования только необходимых CSV/Parquet-файлов данных в режиме Read-Only[cite: 4]. +- [ ] **Динамические Python/Pandas вычисления:** + - Инструмент генерации и безопасного выполнения скриптов агрегации и аналитики данных СКУД / 1С на лету[cite: 4]. + - Перехват stdout/stderr, сбор результатов расчетов и графиков с передачей в UI-чата[cite: 4]. \ No newline at end of file diff --git a/docs/in_progress/план_оптимизации_работы_с_контекстом.md b/docs/in_progress/план_оптимизации_работы_с_контекстом.md deleted file mode 100644 index 4587843..0000000 --- a/docs/in_progress/план_оптимизации_работы_с_контекстом.md +++ /dev/null @@ -1,72 +0,0 @@ -# План реализации - -## 1. Очистка от регулярок и костылей (`tool_injector.py`) -- [x] Полностью удалить принудительные перехваты текста регулярными выражениями для команд добавления, редактирования и удаления пунктов[cite: 4]. -- [x] Оставить в модуле только базовую санитарную очистку сырых тегов (``)[cite: 4]. - ---- - -## 2. Настройка контекста и инструкций сессии (`agent.py`) -- [x] Передать управление диалогом языковой модели через системный блок `role: "system"`[cite: 4]. -- [x] При активном состоянии `PROMPT_PREVIEW` передавать модели инструкцию: - - **Подтверждение / отмена / корректировка:** продолжать работу с превью и вызывать соответствующие инструменты[cite: 4]. - - **Смена темы:** вежливо напомнить об открытом изменении и запросить решение[cite: 4]. -- [x] Обеспечить видимость эфемерных сообщений (`is_ephemeral = 1`) для модели во время активной работы с превью[cite: 4]. -- [x] Внедрить семантический Topic Drift Guard (`idle_turns` = 3) с вопросами и кнопками из `tool_action_registry`. -- [x] Реализовать детерминированный мгновенный сброс сессии и зачистку эфемерного контекста при вызове сторонних инструментов. - ---- - -## 3. Очистка эфемерных сообщений при завершении (`fast_path.py`) -- [x] Настроить удаление временных сообщений превью (`db_purge_ephemeral_messages`) строго в момент нажатия кнопок **«Подтвердить»** или **«Отменить»**[cite: 4]. -- [x] Сбрасывать состояние сессии в базе данных после фиксации решения[cite: 4]. -- [x] Внедрить прямое точечное применение изменений через `db_apply_prompt_node_action`[cite: 4]. -- [x] Добавить обработку фазы `PROMPT_FOLLOWUP` с кнопками завершения и очистки контекста. - ---- - -## 4. Инлайн-редактор в окне диалога (`core.js`) -- [x] Проверить работу блока ручного редактирования (`inline-prompt-editor-container`) с кнопками **«Сохранить правки»** и **«Свернуть»**[cite: 4]. -- [x] Обеспечить сохранение черновика через API (`/api/v1/chat/draft`) и отображение обновленного текста перед подтверждением[cite: 4]. -- [x] Реализовать двусторонний клиентский Diff-рендерер (одновременная подсветка добавленных строк и зачеркивание удаленных `[УДАЛЕНИЕ]`). -- [x] Добавить авто-форматирование и отступы подпунктов (`X.Y.`) при ручном сохранении черновика. - ---- - -## 5. Тестирование и валидация системного промпта -- [x] **Нативные вызовы:** проверить добавление, редактирование и удаление пунктов через нативные вызовы модели (`db_prompt_node_edit`)[cite: 4]. -- [x] **Контекстные сценарии:** проверить поведение модели при смене темы диалога оператором (Guardrail)[cite: 4]. -- [x] **UI и очистка:** проверить ручное редактирование через кнопку в окне чата и последующую очистку контекста (`db_purge_ephemeral_messages`)[cite: 4]. - ---- - -## 6. Распространение архитектурного паттерна на модуль задач (`tasks`) -- [ ] **Масштабирование UI задач:** - - Увеличить размер окна/виджета просмотра и управления задачами (`TASK_INTERACTIVE_CARD`) по аналогии с окном редактирования системного промпта для удобного управления большим списком. -- [ ] **Интерактивное управление и превью:** - - Карточка предпросмотра параметров создаваемой задачи (`db_add_task`) с кнопками `[Подтвердить]`, `[Отменить]`, `[✏️ Редактировать]`. - - Подтверждение опасных операций (удаление задачи `db_delete_task`) с кнопками валидации. - - Follow-up фаза с выводом актуализированного списка задач из `tool_action_registry`. -- [ ] **Доменная консолидация:** - - Объединить `db_add_task`, `db_update_task_status`, `db_delete_task` в единый диспетчер `db_tasks_edit(action: ["ADD", "UPDATE", "DELETE"], ...)`[cite: 4]. - - Обновить `TOOLS_SCHEMA` в `schemas.py`[cite: 4]. - ---- - -## 7. Распространение на модуль снапшотов (`snapshots`) и правил (`rules`) -- [ ] **Консолидация модуля `snapshots`:** - - Интерактивное подтверждение массового удаления снапшотов за дату (`db_delete_snapshots`). - - Объединить операции удаления и управления срезами в единый `db_snapshots_edit(action: ["DELETE"], ...)`[cite: 4]. - - Авто-зачистка тяжелых таблиц снапшотов из контекста при переходе к другим темам. -- [ ] **Модуль правил арбитража (`rules`):** - - Редактирование правил базы знаний через единый паттерн узлов с подсветкой diff. - ---- - -## 8. Изолированная песочница кода (Code Execution Sandbox Engine) -- [ ] **Docker/gVisor контур:** - - Создание изолированного контейнера без доступа к внешней сети (network: none) с ограниченными лимитами по памяти и CPU (cgroups). - - Настройка безопасного монтирования только необходимых CSV/Parquet-файлов данных в режиме Read-Only. -- [ ] **Динамические Python/Pandas вычисления:** - - Инструмент генерации и безопасного выполнения скриптов агрегации и аналитики данных СКУД / 1С на лету. - - Перехват stdout/stderr, сбор результатов расчетов и графиков с передачей в UI-чата. \ No newline at end of file diff --git a/modules/ROADMAP.md b/modules/ROADMAP.md new file mode 100644 index 0000000..65cbe6d --- /dev/null +++ b/modules/ROADMAP.md @@ -0,0 +1,56 @@ +# 🗺️ Дорожная карта задач проекта (ROADMAP) + +> **Сформировано:** 2026-08-19 18:40 | **Всего задач:** 16 + +--- + +## Модуль `api` + +- [x] **#35** [HIGH] `[ЗАВЕРШЕНО]` Создание REST API на FastAPI (/api/v1/snapshots, /api/v1/scud/logs, /api/v1/anomalies) + +--- + +## Модуль `core/database` + +- [x] **#22** [HIGH] `[ЗАВЕРШЕНО]` Перевод подключения 1С:ЗУП на продакшн MS SQL сервер ACCOUNT-01 + гибридный фоллбэк +- [x] **#37** [MEDIUM] `[ЗАВЕРШЕНО]` Создание модуля персистентной памяти проекта в SQLite и CLI-инструмента для фиксации архитектурных решений + +--- + +## Модуль `general` + +- [x] **#38** [HIGH] `[ЗАВЕРШЕНО]` По запросу, вывести возможности системы, которые уже настроены. Например на запрос о возможностях по СКУД. И изменить стартовую плашку. +- [ ] **#41** [MEDIUM] Полностью отказаться от tool_injector.py и перевести все вызовы на нативный Function Calling языковой модели. LLM будет основным арбитром *(срок: 2026-08-21)* +- [ ] **#44** [LOW] Тестовая-3 *(срок: 2026-08-20)* + +--- + +## Модуль `scripts` + +- [x] **#26** [MEDIUM] `[ЗАВЕРШЕНО]` Создание и выполнение скрипта сквозной переиндексации снапшотов с префиксом Y +- [x] **#27** [MEDIUM] `[ЗАВЕРШЕНО]` Реализация CLI-инспектора БД и выравнивание номеров срезов для идеальной верстки в терминале +- [ ] **#33** [MEDIUM] Автоматизация сбора срезов по расписанию (Cron / Systemd Timers на 12:00, 17:00, 19:00) + +--- + +## Модуль `services/ai_verifier` + +- [x] **#28** [HIGH] `[ЗАВЕРШЕНО]` Двойная проверка исключений по department_scud и 1С, удержание 100% приоритета кадровых документов + +--- + +## Модуль `services/scud_export` + +- [x] **#23** [HIGH] `[ЗАВЕРШЕНО]` Инцидент Равина В.Э.: Фиксация 100% приоритета сырых логов pLogData СКУД над расчетом УРВ Ориона +- [x] **#25** [HIGH] `[ЗАВЕРШЕНО]` Исправление бага дублирования номеров снапшотов (переход на вычисление MAX() по суффиксу) +- [x] **#29** [LOW] `[ЗАВЕРШЕНО]` Лаконичный вывод неразмеченных сотрудников с короткими аббревиатурами отделов СКУД (РУК, ОИЗ, ПУ и др.) +- [ ] **#30** [HIGH] `[В РАБОТЕ]` Внутридневной контроль: Извлечение полных цепочек проходов pLogData (входы/выходы за смену) +- [ ] **#31** [HIGH] `[В РАБОТЕ]` Внутридневной контроль: Расчет количества и суммарной длительности отлучек/перекуров сверх обеда + +--- + +## Модуль `services/text_reporter` + +- [ ] **#32** [MEDIUM] `[В РАБОТЕ]` Внутридневной контроль: Вывод списка системных нарушителей внутреннего распорядка в Markdown-отчет + +--- diff --git a/modules/web_api/llm/agent.py b/modules/web_api/llm/agent.py index a341b8b..575b4c1 100644 --- a/modules/web_api/llm/agent.py +++ b/modules/web_api/llm/agent.py @@ -3,18 +3,22 @@ FILE: modules/web_api/llm/agent.py PROJECT: SCUD Orion AI (Unified Architecture) MODULE: web_api / llm (Core Agent Coordinator) -ROLE: Оркестратор диалога, диспетчер реляционных узлов промпта, - управление сессионными стейтами, Topic Drift Guard и очистка контекста. +ROLE: Нативный оркестратор диалога, диспетчер инструментов (Function Calling) + и управление сессионными стейтами через ContextManager. + +AI-CONTEXT-ANCHORS: + - ANCHOR[AGENT_IMPORTS]: Системные и доменные импорты. + - ANCHOR[AGENT_MAIN_PIPELINE]: Основная точка входа process_chat_message. + - ANCHOR[AGENT_SYSTEM_PROMPT]: Формирование динамического контекста. + - ANCHOR[AGENT_TOOL_DISPATCHER]: Исполнение нативных вызовов инструментов. + - ANCHOR[AGENT_TOPIC_DRIFT]: Защита контекста и обработка свободных тем. =============================================================================== """ -# ============================================================================= -# БЛОК 1: ИМПОРТЫ И ИНИЦИАЛИЗАЦИЯ СИСТЕМНЫХ МОДУЛЕЙ -# ============================================================================= +# ANCHOR[AGENT_IMPORTS] import sys import json import logging -import re from typing import List, Dict, Any, Tuple, Optional from .db.connection import get_db_connection @@ -26,6 +30,8 @@ from .db_tools import ( db_update_task_status, db_delete_task, db_add_task, + db_tasks_edit, + db_export_tasks_markdown, db_get_rules, db_set_session_state, db_get_session_state, @@ -46,6 +52,12 @@ from .core.calendar_utils import get_dynamic_calendar_context from .core.tool_injector import clean_raw_tool_tags, clean_output, inject_tools_if_needed from .core.ollama_client import call_ollama_chat from .core.fast_path import handle_fast_path_intercept +from .core.context_manager import ( + save_tool_interaction, + save_dialog_interaction, + mark_last_user_message_ephemeral, + close_tool_session_and_cleanup +) logger = logging.getLogger("SCUD_AGENT") logger.setLevel(logging.INFO) @@ -58,9 +70,7 @@ if not logger.handlers: logger.addHandler(handler) -# ============================================================================= -# БЛОК 2: ГЛАВНЫЙ КОНВЕЙЕР ОБРАБОТКИ СООБЩЕНИЙ ЧАТА -# ============================================================================= +# ANCHOR[AGENT_MAIN_PIPELINE] def process_chat_message( user_id: int, user_message: str, @@ -70,40 +80,29 @@ def process_chat_message( session_id: str = "web_session_main" ) -> Tuple[str, List[Dict[str, Any]], Optional[Dict[str, Any]]]: """ - Главная функция обработки сообщения: - 1. Очищает осиротевшие эфемерные сообщения. - 2. Перехватывает быстрые кнопки (Fast-Path). - 3. Собирает контекст и передает управление Ollama. - 4. Выполняет Tool Calls и управляет счетчиком Topic Drift. + Главный конвейер обработки входящего сообщения чата на базе нативного Function Calling. """ logger.info(f"Получено сообщение от user_id={user_id}, session_id={session_id}: {user_message}") - # 🧹 ГАРБАДЖ-КОЛЛЕКТОР: Если стейт сессии пуст, удаляем висящие эфемерные сообщения session_state = db_get_session_state(session_id) if not session_state: db_purge_ephemeral_messages(session_id) full_user_content = f"{user_message}\n\n[СОДЕРЖИМОЕ ПРИКРЕПЛЕННОГО ФАЙЛА]:\n{file_context}" if file_context else user_message - # Перехват нажатия кнопок («Подтвердить», «Отменить», «Завершить») без вызова LLM + # 1. Быстрый перехват строго системных кнопок UI (подтверждение превью промпта) fast_path_res = handle_fast_path_intercept(session_id, user_message, full_user_content, session_state) if fast_path_res: return fast_path_res - # Сохранение входящего сообщения оператора - is_user_ephemeral = 1 if session_state else 0 - db_save_chat_message(session_id, "user", full_user_content, is_ephemeral=is_user_ephemeral) + # 2. Фиксация сообщения пользователя + db_save_chat_message(session_id, "user", full_user_content, is_ephemeral=0) db_history = db_get_chat_history(session_id, limit=20) - - # ========================================================================= - # БЛОК 3: ДИНАМИЧЕСКАЯ СБОРКА СИСТЕМНОГО ИНСТРУКТАЖА - # ========================================================================= - dynamic_prompt_text = db_get_active_system_prompt() + # ANCHOR[AGENT_SYSTEM_PROMPT] calendar_context = get_dynamic_calendar_context() user_info = f"Пользователь ID={user_id}" if user_id != 0 else "Гость" - # Извлечение текущего состояния и счетчика отвлечений (idle_turns) current_state_type = session_state.get("state_type") if session_state else None state_data = session_state.get("data_json") or {} if session_state else {} if not isinstance(state_data, dict): @@ -113,47 +112,61 @@ def process_chat_message( active_state_context = "" if current_state_type == "PROMPT_PREVIEW": active_state_context = ( - "\n[ВНИМАНИЕ: АКТИВНЫЙ РЕЖИМ ПРЕДПРОСМОТРА ПРОМПТА]\n" - "- Сейчас открыт предпросмотр изменения системного промпта.\n" - "- Если пользователь просит изменить, скорректировать формулировку или удалить пункт — вызови инструмент db_prompt_node_edit.\n" - "- Если пользователь переключился на другую тему — ответь на его вопрос кратко и по делу.\n" + "\n[ТЕКУЩИЙ РЕЖИМ: ПРЕДПРОСМОТР СИСТЕМНОГО ПРОМПТА]\n" + "- Открыт предпросмотр изменений промпта. Для любых правок вызывай db_prompt_node_edit.\n" ) elif current_state_type == "PROMPT_FOLLOWUP": active_state_context = ( - "\n[ВНИМАНИЕ: АКТИВНА СЕССИЯ РЕДАКТИРОВАНИЯ СИСТЕМНОГО ПРОМПТА]\n" - "- Оператор только что применил предыдущее изменение или запросил просмотр промпта.\n" - "- Любые команды вида 'добавь X.Y', 'удали X.Y', 'измени X.Y' ОЗНАЧАЮТ ПРОДОЛЖЕНИЕ РАБОТЫ С СИСТЕМНЫМ ПРОМПТОМ -> ВЫЗЫВАЙ db_prompt_node_edit.\n" - "- Если запрос оператора не ясен или относится к другой теме — ответь на него естественно.\n" + "\n[ТЕКУЩИЙ РЕЖИМ: СЕССИЯ РЕДАКТИРОВАНИЯ ПРОМПТА]\n" + "- Оператор просматривает или редактирует системный промпт.\n" + "- На любые команды вида 'удали пункт X.Y' или 'удали X.Y' ТЫ ОБЯЗАН ВЫЗВАТЬ db_prompt_node_edit с action='DELETE', section_id=X, item_id=Y.\n" + "- На любые команды 'добавь пункт X.Y ...' вызывай action='ADD'.\n" + "- Запрещено путать ADD и DELETE.\n" + ) + elif current_state_type == "SNAPSHOTS_VIEW": + active_date = state_data.get("query_date", "выбранную дату") + active_state_context = ( + f"\n[ТЕКУЩИЙ РЕЖИМ: ПРОСМОТР СНАПШОТОВ СКУД]\n" + f"- Сейчас на экране отображаются снапшоты за {active_date}.\n" + f"- Ты можешь форматировать, фильтровать или анализировать этот текущий срез.\n" + f"- Если оператор запрашивает ДРУГУЮ дату или день недели, отличную от {active_date} (например: 'за вчера', 'а за 13.08', 'покажи за сегодня') — " + f"ТЫ ОБЯЗАН СРАЗУ ВЫЗВАТЬ db_get_snapshots(date_str=...).\n" + f"- Запрещено генерировать текст за другую дату по памяти.\n" + ) + elif current_state_type == "SNAPSHOT_DELETE_CONFIRM": + active_state_context = ( + "\n[ВНИМАНИЕ: ОЖИДАЕТСЯ ПОДТВЕРЖДЕНИЕ УДАЛЕНИЯ СНАПШОТОВ]\n" + ) + elif current_state_type == "TASK_DELETE_CONFIRM": + active_state_context = ( + "\n[ВНИМАНИЕ: ОЖИДАЕТСЯ ПОДТВЕРЖДЕНИЕ УДАЛЕНИЯ ЗАДАЧИ]\n" ) system_prompt_content = ( - f"Ты — интеллектуальный ассистент SCUD Orion AI. " - f"Ты управляешь задачами, аналитикой СКУД и системными настройками с помощью инструментов (tools).\n\n" - f"СТРОГИЕ ПРАВИЛА СТИЛЯ:\n" - f"- Запрещено использовать панибратские или шутливые обращения. Отвечай профессионально и строго по существу.\n\n" - f"[ОКРУЖЕНИЕ]\n" + f"Ты — интеллектуальный ассистент SCUD Orion AI.\n" + f"Ты управляешь задачами, аналитикой СКУД и системными настройками исключительно через инструменты (tools).\n\n" + f"СТРОГИЕ ПРАВИЛА:\n" + f"1. К оператору всегда обращайся на Вы.\n" + f"2. Для получения данных всегда вызывай соответствующий инструмент:\n" + f" - Снапшоты и срезы логов СКУД за любые даты и дни недели -> db_get_snapshots\n" + f" - Удаление снапшотов -> db_delete_snapshots\n" + f" - Задачи и бэклог (просмотр, создание, смена статуса, удаление, экспорт) -> db_get_tasks, db_tasks_edit\n" + f" - Системный промпт -> db_get_system_prompt, db_prompt_node_edit\n" + f" - Аномалии СКУД/1С -> db_get_anomalies\n" + f" - База знаний -> db_get_rules\n" + f" - Статистика БД -> db_get_stats\n" + f" - Справка -> db_get_reference\n" + f"3. Запрещено сочинять данные от себя без вызова инструментов.\n\n" + f"[СИСТЕМНЫЙ КАЛЕНДАРЬ СЕРВЕРА]\n" f"- Пользователь: {user_info}\n" f"- {calendar_context}\n" - f"{active_state_context}\n" - f"[ПРАВИЛА ИСПОЛЬЗОВАНИЯ ИНСТРУМЕНТОВ]\n" - f"1. Для ЛЮБЫХ операций с системным промптом ТЫ ОБЯЗАН СРАЗУ ВЫЗВАТЬ db_prompt_node_edit:\n" - f" - 'удали 2.9' / 'удалить пункт 2.9' -> ВЫЗОВ db_prompt_node_edit(action='DELETE', section_id=2, item_id=9, content='')\n" - f" - 'добавь 3.4 Текст' / 'добавить пункт 3.4' -> ВЫЗОВ db_prompt_node_edit(action='ADD', section_id=3, item_id=4, content='Текст')\n" - f" - 'измени 1.2 Текст' -> ВЫЗОВ db_prompt_node_edit(action='UPDATE', section_id=1, item_id=2, content='Текст')\n" - f" КАТЕГОРИЧЕСКИ ЗАПРЕЩЕНО отвечать текстом вроде 'Удален пункт... Напишите подтверждаю'. Только Function Call!\n" - f"2. Для просмотра системного промпта ВСЕГДА вызывай db_get_system_prompt().\n" - f"3. Для просмотра задач ВСЕГДА вызывай db_get_tasks().\n\n" - f"[ТЕКУЩИЙ АКТИВНЫЙ СИСТЕМНЫЙ ПРОМПТ]:\n{dynamic_prompt_text}" + f"{active_state_context}" ) user_msg_object = {"role": "user", "content": full_user_content} - - # ========================================================================= - # БЛОК 4: ВЫЗОВ НЕЙРОСЕТИ И МАРШРУТИЗАЦИЯ FUNCTION CALLING - # ========================================================================= + # ANCHOR[AGENT_TOOL_DISPATCHER] try: - # Режим Vision (OCR) if image_b64: user_msg_object["images"] = [image_b64] messages = [ @@ -162,7 +175,6 @@ def process_chat_message( ] msg = call_ollama_chat(messages, is_vision=True) else: - # Текстовый диалог clean_db_history = [dict(m) for m in db_history] for m in clean_db_history: m.pop("images", None) @@ -171,241 +183,329 @@ def process_chat_message( raw_text_reply = msg.get("content", "") tool_calls = msg.get("tool_calls", []) - tool_calls = inject_tools_if_needed(user_message, raw_text_reply, tool_calls) - # Исполнение вызванных моделью инструментов + if not tool_calls: + tool_calls = inject_tools_if_needed(user_message, raw_text_reply, tool_calls) + if tool_calls: logger.info(f"Ответ от Ollama получен. Tool calls: True (кол-во: {len(tool_calls)})") - messages.append(msg) - tool_names_called = [] + + tool = tool_calls[0] + fn_name = tool["function"]["name"] + fn_args = tool["function"].get("arguments", {}) + if isinstance(fn_args, str): + try: + fn_args = json.loads(fn_args) + except Exception: + fn_args = {} - # ----------------------------------------------------------------- - # TOPIC DRIFT GUARD ДЛЯ ИНСТРУМЕНТОВ: - # Если вызваны сторонние инструменты (снапшоты, задачи, статы) - # — мгновенно закрываем сессию и вычищаем эфемерный контекст - # ----------------------------------------------------------------- - is_prompt_tool = any(t["function"]["name"] in ["db_prompt_node_edit", "db_get_system_prompt", "db_get_system_prompts"] for t in tool_calls) - if not is_prompt_tool and session_state: - logger.info(f"Смена темы на инструмент {tool_calls[0]['function']['name']}. Закрываем сессию и очищаем эфемерный контекст.") - db_clear_session_state(session_id) - db_purge_ephemeral_messages(session_id) - session_state = None + logger.info(f"Вызов функции (Tool): {fn_name} с аргументами: {fn_args}") - for tool in tool_calls: - fn_name = tool["function"]["name"] - fn_args = tool["function"].get("arguments", {}) - tool_names_called.append(fn_name) - logger.info(f"Вызов функции (Tool): {fn_name} с аргументами: {fn_args}") - tool_result_content = "" + # Ротация контекста: закрываем старую сессию инструмента + close_tool_session_and_cleanup(session_id, close_reason=f"ACTIVATE_{fn_name}") + session_state = None + mark_last_user_message_ephemeral(session_id) - # --- 4.1. Модуль задач --- - if fn_name == "db_get_tasks": + # 1. Задачи (Просмотр) + if fn_name == "db_get_tasks": + raw_tasks = db_get_tasks(user_id, status=fn_args.get("status")) + reply_text = "Вот интерактивный список ваших текущих задач:" + db_save_chat_message(session_id, "assistant", reply_text, is_ephemeral=1) + return reply_text, db_get_chat_history(session_id), { + "type": "TASK_INTERACTIVE_CARD", + "tasks": raw_tasks + } + + # 2. Единый диспетчер задач + elif fn_name in ["db_tasks_edit", "db_add_task", "db_update_task_status", "db_delete_task"]: + action = fn_args.get("action", "UPDATE").upper() + if fn_name == "db_add_task": action = "ADD" + elif fn_name == "db_delete_task": action = "DELETE" + elif fn_name == "db_update_task_status": action = "UPDATE" + + if action == "DELETE": + task_id_raw = str(fn_args.get("task_id", "")).replace("#", "").replace("TASK-", "").strip() + db_set_session_state(session_id, "TASK_DELETE_CONFIRM", {"task_id": task_id_raw, "idle_turns": 0}) + reply_text = f"Вы действительно хотите удалить задачу #{task_id_raw}?" + db_save_chat_message(session_id, "assistant", reply_text, is_ephemeral=1) + return reply_text, db_get_chat_history(session_id), { + "type": "TASK_DELETE_CONFIRM", + "buttons": [ + {"label": f"Удалить #{task_id_raw}", "value": f"подтверждаю удаление задачи {task_id_raw}", "style": "danger"}, + {"label": "Отмена", "value": "отмена", "style": "secondary"} + ] + } + + elif action == "EXPORT": + export_res = db_export_tasks_markdown( + user_id=user_id, + filename=fn_args.get("filename"), + status_filter=fn_args.get("status") + ) + reply_text = export_res.get("message", "Отчет по задачам успешно экспортирован.") + db_save_chat_message(session_id, "assistant", reply_text, is_ephemeral=0) + + action_payload = None + if export_res.get("status") == "success": + action_payload = { + "type": "FILE_DOWNLOAD_CARD", + "filename": export_res.get("filename"), + "download_url": export_res.get("download_url"), + "tasks_count": export_res.get("tasks_count") + } + return reply_text, db_get_chat_history(session_id), action_payload + + else: + res = db_tasks_edit( + user_id=user_id, + action=action, + task_id=fn_args.get("task_id"), + title=fn_args.get("title"), + priority=fn_args.get("priority", "MEDIUM"), + status=fn_args.get("status"), + module=fn_args.get("module", "general"), + due_date=fn_args.get("due_date") + ) raw_tasks = db_get_tasks(user_id) - reply_text = "Вот интерактивный список ваших текущих задач:" + reply_text = res.get("message", "Операция над задачами выполнена.") db_save_chat_message(session_id, "assistant", reply_text, is_ephemeral=1) return reply_text, db_get_chat_history(session_id), { "type": "TASK_INTERACTIVE_CARD", "tasks": raw_tasks } - # --- 4.2. Прямой просмотр системного промпта из SQLite --- - elif fn_name in ["db_get_system_prompt", "db_get_system_prompts"]: - active_prompt = db_get_active_system_prompt() - reply_text = f"Актуальный системный промпт:\n\n{active_prompt}" - - # Переводим сессию в PROMPT_FOLLOWUP для отслеживания Topic Drift - db_set_session_state(session_id, "PROMPT_FOLLOWUP", {"idle_turns": 0}) + # 3. Системный промпт + elif fn_name == "db_get_system_prompt": + active_prompt = db_get_active_system_prompt() + reply_text = f"Актуальный системный промпт:\n\n{active_prompt}" + db_set_session_state(session_id, "PROMPT_FOLLOWUP", {"idle_turns": 0}) + db_save_chat_message(session_id, "assistant", reply_text, is_ephemeral=1) + return reply_text, db_get_chat_history(session_id), None + + elif fn_name == "db_prompt_node_edit": + action = str(fn_args.get("action", "ADD")).upper() + + try: + sec_id = int(str(fn_args.get("section_id", 3)).strip()) + except Exception: + sec_id = 3 + + try: + itm_id = int(str(fn_args.get("item_id", 1)).strip()) + except Exception: + itm_id = 1 + + content = str(fn_args.get("content", "")).strip() + baseline_prompt = db_get_active_system_prompt() + + with get_db_connection() as temp_conn: + temp_cursor = temp_conn.cursor() + temp_cursor.execute(""" + SELECT section_id, item_id, content + FROM system_prompt_nodes + WHERE prompt_name = 'main_agent' AND is_active = 1 + ORDER BY section_id, item_id + """) + existing_nodes = temp_cursor.fetchall() + + nodes_dict = {(sec, itm): txt for sec, itm, txt in existing_nodes} + nodes_dict_for_draft = {k: v for k, v in nodes_dict.items() if k != (sec_id, itm_id)} if action == "DELETE" else dict(nodes_dict) + if action != "DELETE": + nodes_dict_for_draft[(sec_id, itm_id)] = content + + draft_lines = [] + curr_sec = None + for (s_id, i_id), txt in sorted(nodes_dict_for_draft.items()): + if i_id == 0: + if curr_sec is not None: draft_lines.append("") + draft_lines.append(f"{s_id}. {txt}") + curr_sec = s_id + else: + draft_lines.append(f" {s_id}.{i_id}. {txt}") + merged_prompt = "\n".join(draft_lines) + + diff_lines = [] + curr_sec = None + display_nodes = dict(nodes_dict) + if action != "DELETE": + display_nodes[(sec_id, itm_id)] = content + + for (s_id, i_id), txt in sorted(display_nodes.items()): + if i_id == 0: + if curr_sec is not None: diff_lines.append("") + diff_lines.append(f"{s_id}. {txt}") + curr_sec = s_id + else: + if s_id == sec_id and i_id == itm_id: + line_str = f' {s_id}.{i_id}. {txt} [УДАЛЕНИЕ]' if action == "DELETE" else f' {s_id}.{i_id}. {txt}' + else: + line_str = f" {s_id}.{i_id}. {txt}" + diff_lines.append(line_str) + + diff_html = "\n".join(diff_lines) + + db_set_session_state(session_id, "PROMPT_PREVIEW", { + "draft_text": merged_prompt, + "action": action, + "section_id": sec_id, + "item_id": itm_id, + "content": content, + "idle_turns": 0 + }) + + preview_reply = f"Предпросмотр изменений системного промпта:\n\n{diff_html}\n\nДля применения подтвердите действие, отредактируйте или отмените." + db_save_chat_message(session_id, "assistant", preview_reply, is_ephemeral=1) + return preview_reply, db_get_chat_history(session_id), { + "type": "PROMPT_PREVIEW", + "raw_draft": merged_prompt, + "baseline_prompt": baseline_prompt, + "buttons": [ + {"label": "Подтвердить", "value": "подтверждаю", "style": "primary"}, + {"label": "Отменить", "value": "отмена", "style": "danger"}, + {"label": "✏️ Редактировать", "value": "action:open_editor", "style": "secondary"} + ] + } + + # 4. Снапшоты СКУД + elif fn_name == "db_get_snapshots": + snapshots_res = db_get_snapshots(session_id=session_id, date_str=fn_args.get("date_str"), original_user_message=user_message) + query_date = snapshots_res.get("query_date", "выбранную дату") + reply_text = f"Реестр срезов СКУД за {query_date}:" + db_save_chat_message(session_id, "assistant", reply_text, is_ephemeral=1) + return reply_text, db_get_chat_history(session_id), { + "type": "SNAPSHOTS_CARD", + "data": snapshots_res + } + + elif fn_name == "db_delete_snapshots": + raw_id = fn_args.get("snapshot_id") or fn_args.get("day_str") + raw_ids = fn_args.get("snapshot_ids") or [] + is_confirmed = fn_args.get("confirmed", False) + + if raw_id and not raw_ids: + if isinstance(raw_id, str) and "," in raw_id: + raw_ids = [s.strip() for s in raw_id.split(",")] + else: + raw_ids = [raw_id] + + safe_ids = [s.strip() for s in raw_ids if s and not str(s).strip().startswith("Y")] + if not safe_ids: + reply_text = "⚠️ Итоговый срез Y защищен от удаления. Выберите дневные снапшоты." db_save_chat_message(session_id, "assistant", reply_text, is_ephemeral=1) return reply_text, db_get_chat_history(session_id), None - # --- 4.3. Реляционное изменение промпта (ADD / UPDATE / DELETE) --- - elif fn_name == "db_prompt_node_edit": - action = fn_args.get("action", "ADD").upper() - sec_id = int(fn_args.get("section_id", 2)) - itm_id = int(fn_args.get("item_id", 1)) - content = fn_args.get("content", "").strip() - baseline_prompt = db_get_active_system_prompt() - - with get_db_connection() as temp_conn: - temp_cursor = temp_conn.cursor() - temp_cursor.execute(""" - SELECT section_id, item_id, content - FROM system_prompt_nodes - WHERE prompt_name = 'main_agent' AND is_active = 1 - ORDER BY section_id, item_id - """) - existing_nodes = temp_cursor.fetchall() - - nodes_dict = {(sec, itm): txt for sec, itm, txt in existing_nodes} - - if action == "DELETE": - nodes_dict_for_draft = {k: v for k, v in nodes_dict.items() if k != (sec_id, itm_id)} - else: - nodes_dict_for_draft = dict(nodes_dict) - nodes_dict_for_draft[(sec_id, itm_id)] = content - - # Формирование чистого текста для редактора - draft_lines = [] - curr_sec = None - for (s_id, i_id), txt in sorted(nodes_dict_for_draft.items()): - if i_id == 0: - if curr_sec is not None: - draft_lines.append("") - draft_lines.append(f"{s_id}. {txt}") - curr_sec = s_id - else: - draft_lines.append(f" {s_id}.{i_id}. {txt}") - merged_prompt = "\n".join(draft_lines) - - # Формирование HTML Diff с подсветкой - diff_lines = [] - curr_sec = None - display_nodes = dict(nodes_dict) - if action != "DELETE": - display_nodes[(sec_id, itm_id)] = content - - for (s_id, i_id), txt in sorted(display_nodes.items()): - if i_id == 0: - if curr_sec is not None: - diff_lines.append("") - diff_lines.append(f"{s_id}. {txt}") - curr_sec = s_id - else: - if s_id == sec_id and i_id == itm_id: - if action == "DELETE": - line_str = f' {s_id}.{i_id}. {txt} [УДАЛЕНИЕ]' - else: - line_str = f' {s_id}.{i_id}. {txt}' - else: - line_str = f" {s_id}.{i_id}. {txt}" - diff_lines.append(line_str) - - diff_html = "\n".join(diff_lines) - - # Фиксация предпросмотра в session_states - db_set_session_state(session_id, "PROMPT_PREVIEW", { - "draft_text": merged_prompt, - "action": action, - "section_id": sec_id, - "item_id": itm_id, - "content": content, + if not is_confirmed: + query_date = state_data.get("query_date", "") + db_set_session_state(session_id, "SNAPSHOT_DELETE_CONFIRM", { + "snapshot_ids": safe_ids, + "query_date": query_date, "idle_turns": 0 }) - - with get_db_connection() as conn_fix: - conn_fix.cursor().execute(""" - UPDATE chat_messages - SET is_ephemeral = 1 - WHERE id = (SELECT MAX(id) FROM chat_messages WHERE session_id = ? AND role = 'user') - """, (session_id,)) - conn_fix.commit() - - preview_reply = ( - f"Предпросмотр изменений системного промпта:\n\n" - f"{diff_html}\n\n" - f"Для применения подтвердите действие, отредактируйте или отмените." - ) - - db_save_chat_message(session_id, "assistant", preview_reply, is_ephemeral=1) - return preview_reply, db_get_chat_history(session_id), { - "type": "PROMPT_PREVIEW", - "raw_draft": merged_prompt, - "baseline_prompt": baseline_prompt, + ids_str = ", ".join(safe_ids) + reply_text = f"Вы действительно хотите удалить дневные снапшоты: {ids_str}?" + db_save_chat_message(session_id, "assistant", reply_text, is_ephemeral=1) + return reply_text, db_get_chat_history(session_id), { + "type": "SNAPSHOT_DELETE_CONFIRM", "buttons": [ - {"label": "Подтвердить", "value": "подтверждаю", "style": "primary"}, - {"label": "Отменить", "value": "отмена", "style": "danger"}, - {"label": "✏️ Редактировать", "value": "action:open_editor", "style": "secondary"} + {"label": f"Удалить ({len(safe_ids)} шт.)", "value": f"подтверждаю удаление снапшотов {ids_str}", "style": "danger"}, + {"label": "Отмена", "value": "отмена", "style": "secondary"} ] } + else: + db_delete_snapshots(snapshot_ids=safe_ids) + query_date = state_data.get("query_date", "") + updated_snapshots_res = db_get_snapshots(session_id=session_id, date_str=query_date) - # --- 4.4. Сервисные инструменты --- - elif fn_name == "db_get_snapshots": - snapshots_res = db_get_snapshots(session_id=session_id, date_str=fn_args.get("date_str"), original_user_message=user_message) - tool_result_content = json.dumps(snapshots_res, ensure_ascii=False) + reply_text = f"✅ Успешно удалено снапшотов: {len(safe_ids)} шт." + db_save_chat_message(session_id, "assistant", reply_text, is_ephemeral=1) + return reply_text, db_get_chat_history(session_id), { + "type": "SNAPSHOTS_CARD", + "data": updated_snapshots_res + } + + elif fn_name == "db_delete_snapshots": + raw_id = fn_args.get("snapshot_id") or fn_args.get("day_str") + raw_ids = fn_args.get("snapshot_ids") or ([raw_id] if raw_id else []) + + # Защита: итоговые Y-срезы удалять запрещено + safe_ids = [s for s in raw_ids if not str(s).startswith("Y")] + if not safe_ids: + reply_text = "⚠️ Итоговый срез Y защищен от удаления. Выберите дневные снапшоты." + db_save_chat_message(session_id, "assistant", reply_text, is_ephemeral=1) + return reply_text, db_get_chat_history(session_id), None - elif fn_name == "db_get_current_server_time": - tool_result_content = json.dumps(db_get_current_server_time(), ensure_ascii=False) + # Прямое выполнение удаления в SQLite без лишних текстовых подтверждений + del_res = db_delete_snapshots(snapshot_ids=safe_ids) + + # Получаем свежий реестр за ту же дату + query_date = fn_args.get("day_str", "") + updated_snapshots_res = db_get_snapshots(session_id=session_id, date_str=query_date) - elif fn_name == "db_get_stats": - tool_result_content = json.dumps(db_get_stats(), ensure_ascii=False) + reply_text = f"✅ Успешно удалено снапшотов: {len(safe_ids)} шт." + db_save_chat_message(session_id, "assistant", reply_text, is_ephemeral=1) + return reply_text, db_get_chat_history(session_id), { + "type": "SNAPSHOTS_CARD", + "data": updated_snapshots_res + } - elif fn_name == "db_get_anomalies": - tool_result_content = json.dumps(db_get_anomalies(limit=fn_args.get("limit", 100), date_str=fn_args.get("date_str")), ensure_ascii=False) + # 5. Сервисные запросы + elif fn_name == "db_get_current_server_time": + tool_result_content = json.dumps(db_get_current_server_time(), ensure_ascii=False) + elif fn_name == "db_get_stats": + tool_result_content = json.dumps(db_get_stats(), ensure_ascii=False) + elif fn_name == "db_get_anomalies": + tool_result_content = json.dumps(db_get_anomalies(limit=fn_args.get("limit", 100), date_str=fn_args.get("date_str")), ensure_ascii=False) + elif fn_name == "db_get_rules": + tool_result_content = json.dumps(db_get_rules(), ensure_ascii=False) + elif fn_name == "db_get_reference": + tool_result_content = json.dumps(db_get_reference(category=fn_args.get("category")), ensure_ascii=False) + else: + tool_result_content = "{}" - elif fn_name == "db_get_rules": - tool_result_content = json.dumps(db_get_rules(), ensure_ascii=False) - - elif fn_name == "db_get_reference": - tool_result_content = json.dumps(db_get_reference(category=fn_args.get("category")), ensure_ascii=False) - - elif fn_name == "db_add_task": - res = db_add_task(user_id=user_id, module=fn_args.get("module", "general"), title=fn_args.get("title"), priority=fn_args.get("priority", "MEDIUM"), due_date=fn_args.get("due_date")) - tool_result_content = json.dumps(res, ensure_ascii=False) - - elif fn_name == "db_update_task_status": - res = db_update_task_status(user_id=user_id, task_id=str(fn_args.get("task_id")), status=fn_args.get("status", "COMPLETED"), due_date=fn_args.get("due_date")) - tool_result_content = json.dumps(res, ensure_ascii=False) - - elif fn_name == "db_delete_task": - res = db_delete_task(user_id=user_id, task_id=str(fn_args.get("task_id", "")).upper()) - tool_result_content = json.dumps(res, ensure_ascii=False) - - elif fn_name == "db_delete_snapshots": - res = db_delete_snapshots(snapshot_id=fn_args.get("snapshot_id"), day_str=fn_args.get("day_str")) - tool_result_content = json.dumps(res, ensure_ascii=False) - - messages.append({"role": "tool", "content": tool_result_content}) - - # Интерпретация результатов вызова инструментов + messages.append(msg) + messages.append({"role": "tool", "content": tool_result_content}) sec_msg = call_ollama_chat(messages, is_vision=False) raw_content = sec_msg.get("content", "").strip().replace("**", "").replace("*", "") - final_content = clean_raw_tool_tags(clean_output(raw_content)) + final_content = clean_raw_tool_tags(clean_output(raw_content)) or "Запрос выполнен." - is_output_ephemeral = 1 if any(name in ["db_get_system_prompt", "db_get_system_prompts", "db_prompt_node_edit"] for name in tool_names_called) else 0 + for artifact in ["почемучка,", "почемучка!", "почемучка?", "почемучка", "почемучто", "почему-то"]: + if final_content.lower().startswith(artifact): + final_content = final_content[len(artifact):].lstrip(",.!?:; -") - db_save_chat_message(session_id, "assistant", final_content, is_ephemeral=is_output_ephemeral) + is_ephem = 1 if fn_name in ["db_get_snapshots", "db_get_system_prompt", "db_prompt_node_edit"] else 0 + db_save_chat_message(session_id, "assistant", final_content, is_ephemeral=is_ephem) return final_content, db_get_chat_history(session_id), None - - # ===================================================================== - # БЛОК 5: ОБЫЧНЫЙ ТЕКСТОВЫЙ ОТВЕТ И СЕМАНТИЧЕСКИЙ TOPIC DRIFT GUARD - # ===================================================================== + # ANCHOR[AGENT_TOPIC_DRIFT] raw_str = msg.get("content", "").strip().replace("**", "").replace("*", "") final_reply = clean_raw_tool_tags(clean_output(raw_str)) or "Запрос обработан." + + for artifact in ["почемучка,", "почемучка!", "почемучка?", "почемучка", "почемучто", "почему-то"]: + if final_reply.lower().startswith(artifact): + final_reply = final_reply[len(artifact):].lstrip(",.!?:; -") + action_payload = None - # Обработка отвлечений оператора при активной сессии настройки/просмотра if session_state and session_state.get("state_type") in ["PROMPT_FOLLOWUP", "PROMPT_PREVIEW"]: idle_turns += 1 - logger.info(f"Topic Drift: активна сессия {session_state.get('state_type')}, шагов отвлечения: {idle_turns}/3") - - # Порог отвлечений превышен (> 2 шагов после напоминания) -> Полная зачистка if idle_turns > 3: db_clear_session_state(session_id) - deleted_count = db_purge_ephemeral_messages(session_id) - logger.info(f"Topic Drift Guard TTL: сессия закрыта по таймауту, очищено {deleted_count} сообщений.") + db_purge_ephemeral_messages(session_id) action_payload = None session_state = None elif idle_turns == 3: - # На 3-м сообщении стороннего диалога вежливо спрашиваем оператора tool_action = db_get_tool_action("db_confirm_prompt_preview") guard_question = tool_action.get("follow_up_question", "Желаете продолжить работу с системным промптом?") if tool_action else "Желаете продолжить работу с системным промптом?" buttons = tool_action.get("buttons", []) if tool_action else [] - final_reply += f"\n\n💡 *Напоминание:* {guard_question}" - action_payload = { - "type": "PROMPT_FOLLOWUP", - "buttons": buttons - } + action_payload = {"type": "PROMPT_FOLLOWUP", "buttons": buttons} db_set_session_state(session_id, "PROMPT_FOLLOWUP", {"idle_turns": idle_turns}) else: - # Шаги 1 и 2: продолжаем обычный диалог, инкрементируя счетчик db_set_session_state(session_id, session_state.get("state_type"), {"idle_turns": idle_turns}) - db_save_chat_message(session_id, "assistant", final_reply, is_ephemeral=(1 if session_state else 0)) + db_save_chat_message(session_id, "assistant", final_reply, is_ephemeral=0) return final_reply, db_get_chat_history(session_id), action_payload - # Обработка исключений except Exception as ex: logger.exception(f"Непредвиденная ошибка агента: {ex}") error_reply = f"Внутренняя ошибка сервера: {ex}" diff --git a/modules/web_api/llm/core/context_manager.py b/modules/web_api/llm/core/context_manager.py new file mode 100644 index 0000000..fd0dcb6 --- /dev/null +++ b/modules/web_api/llm/core/context_manager.py @@ -0,0 +1,64 @@ +""" +=============================================================================== +FILE: modules/web_api/llm/core/context_manager.py +PROJECT: SCUD Orion AI (Unified Architecture) +MODULE: web_api / llm / core +ROLE: Интеллектуальный менеджер контекста: разделение служебных транзакций + инструментов и содержательного диалога с сохранением Topic Drift. +=============================================================================== +""" + +import logging +from typing import Dict, Any, Optional, List + +from ..db.connection import get_db_connection +from ..db_tools import ( + db_save_chat_message, + db_get_chat_history, + db_purge_ephemeral_messages, + db_clear_session_state, + db_set_session_state +) + +logger = logging.getLogger("CONTEXT_MANAGER") + + +def save_tool_interaction(session_id: str, user_content: str, assistant_reply: str) -> None: + """ + Сохраняет синхронную служебную пару инструмента (и вопрос, и ответ = 1). + При очистке удалятся оба сообщения, не оставляя сирот. + """ + db_save_chat_message(session_id, "user", user_content, is_ephemeral=1) + db_save_chat_message(session_id, "assistant", assistant_reply, is_ephemeral=1) + + +def save_dialog_interaction(session_id: str, user_content: str, assistant_reply: str) -> None: + """ + Сохраняет содержательный диалог пользователя и ассистента (и вопрос, и ответ = 0). + Эти сообщения остаются в истории навсегда (включая Topic Drift). + """ + db_save_chat_message(session_id, "user", user_content, is_ephemeral=0) + db_save_chat_message(session_id, "assistant", assistant_reply, is_ephemeral=0) + + +def mark_last_user_message_ephemeral(session_id: str) -> None: + """Помечает последнее сообщение пользователя как эфемерное при активации инструмента.""" + with get_db_connection() as conn: + cursor = conn.cursor() + cursor.execute(""" + UPDATE chat_messages + SET is_ephemeral = 1 + WHERE id = (SELECT MAX(id) FROM chat_messages WHERE session_id = ? AND role = 'user') + """, (session_id,)) + conn.commit() + + +def close_tool_session_and_cleanup(session_id: str, close_reason: str = "COMPLETED") -> int: + """ + Закрывает сессию инструмента и удаляет ТОЛЬКО служебные карточки/команды. + Весь содержательный диалог сохраняется. + """ + db_clear_session_state(session_id) + deleted_count = db_purge_ephemeral_messages(session_id) + logger.info(f"[ContextManager] Сессия инструмента закрыта ({close_reason}). Очищено служебных сообщений: {deleted_count}") + return deleted_count \ No newline at end of file diff --git a/modules/web_api/llm/core/fast_path.py b/modules/web_api/llm/core/fast_path.py index 69b6d7f..f023a3e 100644 --- a/modules/web_api/llm/core/fast_path.py +++ b/modules/web_api/llm/core/fast_path.py @@ -1,28 +1,19 @@ """ -=============================================================================== FILE: modules/web_api/llm/core/fast_path.py -PROJECT: SCUD Orion AI (Unified Architecture) -MODULE: web_api / llm / core -ROLE: Двухфазный жизненный цикл сессии (PROMPT_PREVIEW -> PROMPT_FOLLOWUP), - атомарная фиксация узлов и мягкая зачистка эфемерного контекста. -=============================================================================== +ROLE: Детерминированный технический конвейер (НЕ для ИИ-размышлений). + Выполняет только кнопки подтверждения для удаления задач, снапшотов и промптов. """ -import logging from typing import Dict, Any, Tuple, Optional - from llm.db_tools import ( - db_apply_prompt_node_action, + db_delete_task, + db_get_tasks, + db_delete_snapshots, + db_get_snapshots, db_add_system_prompt, - db_set_session_state, - db_clear_session_state, - db_purge_ephemeral_messages, - db_save_chat_message, - db_get_chat_history + db_apply_prompt_node_action ) - -logger = logging.getLogger("FAST_PATH") - +from .context_manager import close_tool_session_and_cleanup, save_tool_interaction, save_dialog_interaction def handle_fast_path_intercept( session_id: str, @@ -30,77 +21,67 @@ def handle_fast_path_intercept( full_user_content: str, session_state: Optional[Dict[str, Any]] ) -> Optional[Tuple[str, list, Optional[Dict[str, Any]]]]: - """Обрабатывает команды подтверждения, отмены и завершения сессии.""" + if not session_state: return None state_type = session_state.get("state_type") - user_msg_clean = user_message.lower().strip(" .!?:;") + msg = user_message.strip().lower() - # ========================================================================= - # ФАЗА 1: ОБРАБОТКА В СОСТОЯНИИ PROMPT_PREVIEW - # ========================================================================= + # ⭐️ Управление системным промптом (Превью) if state_type == "PROMPT_PREVIEW": state_data = session_state.get("data_json") or {} - if not isinstance(state_data, dict): - state_data = {} - draft_text = state_data.get("draft_text", "") action = state_data.get("action") sec_id = state_data.get("section_id") itm_id = state_data.get("item_id") content = state_data.get("content", "") - # 1. ПОДТВЕРДИТЬ ИЗМЕНЕНИЯ -> ПЕРЕХОД В PROMPT_FOLLOWUP - if user_msg_clean in ["подтверждаю", "подтвердить", "да", "сохранить", "применить", "ок", "хорошо"]: + if msg in ["подтверждаю", "подтвердить", "да", "сохранить", "применить", "ок", "хорошо"]: if action == "MANUAL_EDIT" or not action or sec_id is None: if draft_text: db_add_system_prompt("main_agent", draft_text) else: db_apply_prompt_node_action(action=action, section_id=sec_id, item_id=itm_id, content=content) - logger.info("Системный промпт применен в БД. Переход в PROMPT_FOLLOWUP.") + close_tool_session_and_cleanup(session_id, "PROMPT_APPLIED_SUCCESSFULLY") + reply_text = "✅ Изменения системного промпта успешно применены в базе данных." + save_tool_interaction(session_id, full_user_content, reply_text) + return reply_text, [], None + + elif msg in ["отмена", "отменить", "отклонить"]: + close_tool_session_and_cleanup(session_id, "PROMPT_PREVIEW_CANCELLED") + reply_text = "❌ Изменения системного промпта отменены." + save_dialog_interaction(session_id, full_user_content, reply_text) + return reply_text, [], None + + # Удаление снапшотов + elif state_type == "SNAPSHOT_DELETE_CONFIRM": + state_data = session_state.get("data_json", {}) + ids = state_data.get("snapshot_ids", []) + query_date = state_data.get("query_date", "") + + if msg.startswith("подтверждаю удаление снапшотов"): + db_delete_snapshots(snapshot_ids=ids) + close_tool_session_and_cleanup(session_id, "SNAPSHOTS_DELETED") + updated_data = db_get_snapshots(session_id=session_id, date_str=query_date) + return f"✅ Удалено снапшотов: {len(ids)}", [], {"type": "SNAPSHOTS_CARD", "data": updated_data} + + elif msg == "отмена": + close_tool_session_and_cleanup(session_id, "SNAPSHOT_CANCELLED") + updated_data = db_get_snapshots(session_id=session_id, date_str=query_date) + return "Удаление отменено.", [], {"type": "SNAPSHOTS_CARD", "data": updated_data} + + # Удаление задач + elif state_type == "TASK_DELETE_CONFIRM": + task_id = session_state.get("data_json", {}).get("task_id") + if msg.startswith("подтверждаю удаление задачи"): + db_delete_task(1, str(task_id)) + close_tool_session_and_cleanup(session_id, "TASK_DELETED") + return f"Задача #{task_id} удалена.", [], {"type": "TASK_INTERACTIVE_CARD", "tasks": db_get_tasks(1)} - # Переводим сессию в режим ожидания продолжения/завершения - db_set_session_state(session_id, "PROMPT_FOLLOWUP", {}) - - reply_text = "Системный промпт успешно сохранен и применен в базе данных. Желаете продолжить работу с системным промптом или завершить?" - db_save_chat_message(session_id, "assistant", reply_text, is_ephemeral=1) - - action_payload = { - "type": "PROMPT_FOLLOWUP", - "buttons": [ - {"label": "✨ Показать обновленный промпт", "value": "покажи системный промпт", "style": "secondary"}, - {"label": "🏁 Завершить работу", "value": "завершить работу", "style": "primary"} - ] - } - return reply_text, db_get_chat_history(session_id), action_payload - - # 2. ОТМЕНА В МОМЕНТ ПРЕВЬЮ -> ПОЛНАЯ ЗАЧИСТКА - elif user_msg_clean in ["отмена", "отменить", "отклонить", "назад", "стоп"]: - db_clear_session_state(session_id) - deleted_count = db_purge_ephemeral_messages(session_id) - logger.info(f"Изменения промпта отменены. Удалено эфемерных сообщений: {deleted_count}") - - reply_text = "Изменения системного промпта отменены. Контекст диалога чист." - db_save_chat_message(session_id, "assistant", reply_text, is_ephemeral=0) - return reply_text, db_get_chat_history(session_id), None - - # ========================================================================= - # ФАЗА 2: ОБРАБОТКА В СОСТОЯНИИ PROMPT_FOLLOWUP - # ========================================================================= - elif state_type == "PROMPT_FOLLOWUP": - # Явный сигнал завершения работы - if user_msg_clean in [ - "завершить работу", "завершить", "закончить", "готово", "всё", - "все", "нет", "нет, спасибо", "спасибо", "хватит", "выйти" - ]: - db_clear_session_state(session_id) - deleted_count = db_purge_ephemeral_messages(session_id) - logger.info(f"Сессия работы с промптом закрыта. Очищено эфемерных сообщений: {deleted_count}") - - reply_text = "Работа с системным промптом завершена. Чем могу помочь?" - db_save_chat_message(session_id, "assistant", reply_text, is_ephemeral=0) - return reply_text, db_get_chat_history(session_id), None + elif msg == "отмена": + close_tool_session_and_cleanup(session_id, "TASK_CANCELLED") + return "Удаление отменено.", [], {"type": "TASK_INTERACTIVE_CARD", "tasks": db_get_tasks(1)} return None \ No newline at end of file diff --git a/modules/web_api/llm/core/ollama_client.py b/modules/web_api/llm/core/ollama_client.py index a6fd772..ed4d763 100644 --- a/modules/web_api/llm/core/ollama_client.py +++ b/modules/web_api/llm/core/ollama_client.py @@ -21,9 +21,9 @@ VISION_MODEL = "qwen2.5vl:7b-q8_0" LLM_OPTIONS = { "num_predict": 8192, "num_ctx": 8192, - "temperature": 0.1, - "repeat_penalty": 1.1, - "presence_penalty": 0.5, + "temperature": 0.0, + "repeat_penalty": 1.0, + "presence_penalty": 0.0, "top_p": 0.9 } diff --git a/modules/web_api/llm/core/tool_injector.py b/modules/web_api/llm/core/tool_injector.py index 3dd45c3..f6dd033 100644 --- a/modules/web_api/llm/core/tool_injector.py +++ b/modules/web_api/llm/core/tool_injector.py @@ -3,48 +3,35 @@ FILE: modules/web_api/llm/core/tool_injector.py PROJECT: SCUD Orion AI (Unified Architecture) MODULE: web_api / llm / core -ROLE: Санитарная очистка сырых артефактов и тегов из ответов LLM. +ROLE: Базовая санитарная очистка артефактов без эвристик и регулярных выражений. + +AI-CONTEXT-ANCHORS: + - ANCHOR[CLEAN_RAW_TOOLS]: Очистка строковых тегов. + - ANCHOR[PASS_THROUGH_TOOLS]: Чистый проходной интерфейс инструментов. =============================================================================== """ -import re -import logging -from typing import List, Dict, Any -logger = logging.getLogger("TOOL_INJECTOR") +# ANCHOR[CLEAN_RAW_TOOLS] +from typing import List, Dict, Any def clean_raw_tool_tags(text: str) -> str: - """Удаляет сырые теги вызова инструментов, если модель случайно вывела их в текст.""" + """Удаляет только технические теги разметки, если они попали в текст.""" if not text: return "" - text = re.sub(r'\{"name":\s*"db_[^}]+\}\s*()?', '', text) - text = re.sub(r'.*?', '', text, flags=re.DOTALL) - text = re.sub(r'\w*\[\]\(\)', '', text) - text = re.sub(r'', '', text) - return text.strip() + return text.replace("", "").replace("", "").strip() def clean_output(text: str) -> str: - """Удаляет слова-паразиты и склейки в начале ответа.""" + """Возвращает текст ответа без изменения смысла.""" if not text: - return text - - artifacts = [ - "почемучка", "почемучка,", "почемучка!", "почемучка?", - "почемучто", "почто", "почему что", "почему-то", - "здравствуйте!", "привет!" - ] - - cleaned = text.strip() - for art in artifacts: - if cleaned.lower().startswith(art): - cleaned = cleaned[len(art):].lstrip(",.!?:; -") - - return cleaned.strip() + return "" + return text.strip() +# ANCHOR[PASS_THROUGH_TOOLS] def inject_tools_if_needed(user_message: str, raw_text_content: str, tool_calls: List[Dict[str, Any]]) -> List[Dict[str, Any]]: """ - Проходной фильтр: все решения о вызове инструментов принимает исключительно LLM. + Чистый сквозной проход: все решения принимает исключительно языковая модель. """ return tool_calls \ No newline at end of file diff --git a/modules/web_api/llm/db/db_snapshots.py b/modules/web_api/llm/db/db_snapshots.py index 6918033..2c6e94f 100644 --- a/modules/web_api/llm/db/db_snapshots.py +++ b/modules/web_api/llm/db/db_snapshots.py @@ -1,49 +1,112 @@ """ +=============================================================================== FILE: modules/web_api/llm/db/db_snapshots.py +PROJECT: SCUD Orion AI (Unified Architecture) +MODULE: web_api / llm / db +ROLE: Выборка, фильтрация и пакетное удаление срезов логов СКУД в SQLite. + +AI-CONTEXT-ANCHORS: + - ANCHOR[DB_GET_SNAPSHOTS]: Выборка снапшотов с нормализацией дат. + - ANCHOR[DB_DEL_SNAPSHOTS]: Удаление снапшотов по ID, списку ID или за дату. +=============================================================================== """ + import json -from typing import Dict, Any, Optional +import re +from typing import Dict, Any, Optional, List from .connection import get_db_connection from .db_prompts import db_set_session_state +from ..core.calendar_utils import parse_relative_date_ru +# ANCHOR[DB_GET_SNAPSHOTS] def db_get_snapshots(session_id: str = "web_session_main", date_str: Optional[str] = None, original_user_message: str = "") -> Dict[str, Any]: conn = get_db_connection() cursor = conn.cursor() - query = "SELECT snapshot_id, log_date, snapshot_time, COUNT(*) as record_count FROM scud_logs " + + query = """ + SELECT + snapshot_id, + log_date, + snapshot_time, + COUNT(*) as record_count + FROM scud_logs + """ params = [] - if date_str: - iso_date = date_str - if "." in date_str: - parts = date_str.split(".") + + clean_date = date_str.strip() if date_str else "" + if not clean_date or not re.search(r'\d{2}\.\d{2}\.\d{4}', clean_date): + if original_user_message: + clean_date = parse_relative_date_ru(original_user_message) + + if clean_date and re.search(r'\d{2}\.\d{2}\.\d{4}', clean_date): + iso_date = clean_date + compact_date = clean_date.replace(".", "") + + if "." in clean_date: + parts = clean_date.split(".") if len(parts) == 3: iso_date = f"{parts[2]}-{parts[1]}-{parts[0]}" - query += " WHERE log_date = ? OR log_date = ? OR snapshot_time LIKE ? " - params.extend([date_str, iso_date, f"{iso_date}%"]) + compact_date = f"{parts[2]}{parts[1]}{parts[0]}" + + query += """ + WHERE log_date = ? + OR snapshot_time LIKE ? + OR snapshot_id LIKE ? + OR snapshot_id LIKE ? + """ + params.extend([clean_date, f"{iso_date}%", f"{compact_date}-%", f"Y{compact_date}-%"]) - query += " GROUP BY snapshot_id ORDER BY id DESC LIMIT 50" + query += """ + GROUP BY snapshot_id, log_date, snapshot_time + ORDER BY snapshot_time DESC, snapshot_id DESC + LIMIT 50 + """ + cursor.execute(query, params) rows = cursor.fetchall() snapshots = [dict(r) for r in rows] result_data = { - "query_date": date_str or "все", + "query_date": clean_date or "все", "snapshots_count": len(snapshots), "snapshots": snapshots } - db_set_session_state(session_id=session_id, state_type="SNAPSHOTS_VIEW", data=json.dumps(result_data, ensure_ascii=False)) + db_set_session_state(session_id=session_id, state_type="SNAPSHOTS_VIEW", data=result_data) conn.close() return result_data -def db_delete_snapshots(snapshot_id: Optional[str] = None, day_str: Optional[str] = None) -> Dict[str, Any]: - if not snapshot_id and not day_str: - return {"status": "error", "message": "Необходимо указать snapshot_id или day_str (ДД.ММ.ГГГГ)."} +# ANCHOR[DB_DEL_SNAPSHOTS] +def db_delete_snapshots( + snapshot_id: Optional[str] = None, + snapshot_ids: Optional[List[str]] = None, + day_str: Optional[str] = None +) -> Dict[str, Any]: + """Удаляет один или группу дневных снапшотов с защитой итоговых Y-снапшотов.""" conn = get_db_connection() cursor = conn.cursor() - if snapshot_id: - cursor.execute("DELETE FROM scud_logs WHERE snapshot_id = ?", (snapshot_id,)) + deleted = 0 + + if snapshot_ids and isinstance(snapshot_ids, list): + # Исключаем любые итоговые снапшоты, начинающиеся с Y + safe_ids = [s.strip() for s in snapshot_ids if s and not str(s).strip().startswith("Y")] + if safe_ids: + placeholders = ",".join(["?"] * len(safe_ids)) + cursor.execute(f"DELETE FROM scud_logs WHERE snapshot_id IN ({placeholders})", safe_ids) + deleted = cursor.rowcount + elif snapshot_id: + clean_id = str(snapshot_id).strip() + if clean_id.startswith("Y"): + conn.close() + return {"status": "error", "message": f"Итоговый срез [{clean_id}] защищен от удаления."} + cursor.execute("DELETE FROM scud_logs WHERE snapshot_id = ?", (clean_id,)) + deleted = cursor.rowcount + elif day_str: + cursor.execute("DELETE FROM scud_logs WHERE (log_date = ? OR snapshot_id LIKE ?) AND snapshot_id NOT LIKE 'Y%'", (day_str, f"%{day_str.replace('.', '')}%")) + deleted = cursor.rowcount else: - cursor.execute("DELETE FROM scud_logs WHERE log_date = ? OR snapshot_id LIKE ?", (day_str, f"%{day_str.replace('.', '')}%")) - deleted = cursor.rowcount + conn.close() + return {"status": "error", "message": "Не указаны идентификаторы для удаления."} + conn.commit() conn.close() - return {"status": "success", "message": f"Успешно удалено записей: {deleted}"} \ No newline at end of file + return {"status": "success", "deleted_records": deleted, "message": f"Успешно удалено записей: {deleted}"} \ No newline at end of file diff --git a/modules/web_api/llm/db/db_tasks.py b/modules/web_api/llm/db/db_tasks.py index 4bb97bd..855b0e3 100644 --- a/modules/web_api/llm/db/db_tasks.py +++ b/modules/web_api/llm/db/db_tasks.py @@ -1,82 +1,297 @@ """ +=============================================================================== FILE: modules/web_api/llm/db/db_tasks.py +PROJECT: SCUD Orion AI (Unified Architecture) +MODULE: web_api / llm / db +ROLE: Комплексное управление задачами, единый диспетчер db_tasks_edit + и генерация структурированных отчетов в Markdown. +=============================================================================== """ + +import uuid +import logging +import os import re +from datetime import datetime from typing import List, Dict, Any, Optional from .connection import get_db_connection +logger = logging.getLogger("DB_TASKS") + def normalize_task_id(task_id_input: str) -> str: + """Нормализует идентификатор задачи к формату TASK-XX.""" if not task_id_input: return "" - clean_id = str(task_id_input).strip().upper().replace("TASK-", "").replace("TASK", "") + clean_id = str(task_id_input).strip().upper().replace("TASK-", "").replace("TASK", "").replace("#", "") if clean_id.isdigit(): num = int(clean_id) return f"TASK-{(num):02d}" if num < 100 else f"TASK-{(num):03d}" return f"TASK-{clean_id}" -def db_get_tasks(user_id: int) -> List[Dict[str, Any]]: +def db_get_tasks(user_id: int, status: Optional[str] = None) -> List[Dict[str, Any]]: + """Получает список всех задач пользователя.""" conn = get_db_connection() cursor = conn.cursor() - cursor.execute(""" - SELECT id, task_id, module, title, priority, status, due_date, created_at - FROM tasks - WHERE user_id = ? - ORDER BY id DESC - """, (user_id,)) + + if status and status.upper() != "ALL": + target_status = status.upper() + if target_status in ["PROGRESS", "В РАБОТЕ"]: target_status = "IN_PROGRESS" + elif target_status in ["DONE", "ГОТОВО"]: target_status = "COMPLETED" + elif target_status in ["PLANNED", "ПЛАНЫ"]: target_status = "BACKLOG" + + cursor.execute(""" + SELECT id, task_id, module, title, priority, status, due_date, created_at + FROM tasks + WHERE user_id = ? AND (status = ? OR (status = 'BACKLOG' AND ? = 'PLANNED')) + ORDER BY id DESC + """, (user_id, target_status, target_status)) + else: + cursor.execute(""" + SELECT id, task_id, module, title, priority, status, due_date, created_at + FROM tasks + WHERE user_id = ? + ORDER BY id DESC + """, (user_id,)) + rows = cursor.fetchall() conn.close() return [dict(r) for r in rows] -def db_add_task(user_id: int, module: str, title: str, priority: str = "MEDIUM", due_date: Optional[str] = None) -> Dict[str, Any]: +def db_add_task( + user_id: int, + module: str, + title: str, + priority: str = "MEDIUM", + due_date: Optional[str] = None, + status: str = "BACKLOG" +) -> Dict[str, Any]: + """Добавление новой задачи со статусом по умолчанию BACKLOG (В планах).""" conn = get_db_connection() cursor = conn.cursor() cursor.execute("SELECT MAX(id) FROM tasks") max_id = cursor.fetchone()[0] or 0 new_task_id = f"TASK-{(max_id + 1):02d}" + target_status = status.upper() if status else "BACKLOG" + if target_status in ["PROGRESS", "В РАБОТЕ"]: target_status = "IN_PROGRESS" + elif target_status in ["DONE", "ГОТОВО"]: target_status = "COMPLETED" + elif target_status in ["PLANNED", "ПЛАНЫ", "BACKLOG"]: target_status = "BACKLOG" + cursor.execute(""" INSERT INTO tasks (task_id, module, title, priority, status, due_date, user_id) - VALUES (?, ?, ?, ?, 'BACKLOG', ?, ?) - """, (new_task_id, module, title, priority.upper(), due_date, user_id)) + VALUES (?, ?, ?, ?, ?, ?, ?) + """, (new_task_id, module or "general", title.strip(), priority.upper(), target_status, due_date, user_id)) conn.commit() conn.close() - return {"status": "success", "task_id": new_task_id, "message": f"Задача {new_task_id} создана"} + return {"status": "success", "task_id": new_task_id, "message": f"Задача #{max_id + 1} создана и добавлена в планы"} def db_update_task_status(user_id: int, task_id: str, status: str = "COMPLETED", due_date: Optional[str] = None) -> Dict[str, Any]: + """Быстрое обновление статуса задачи.""" + return db_update_task_details(user_id=user_id, task_id=task_id, status=status, due_date=due_date) + +def db_update_task_details( + user_id: int, + task_id: str, + title: Optional[str] = None, + priority: Optional[str] = None, + status: Optional[str] = None, + due_date: Optional[str] = None +) -> Dict[str, Any]: + """Комплексное обновление любых параметров задачи.""" conn = get_db_connection() cursor = conn.cursor() + + clean_num = re.sub(r'\D', '', str(task_id)) formatted_id = normalize_task_id(task_id) - if due_date: - cursor.execute(""" - UPDATE tasks - SET status = ?, due_date = ? - WHERE (UPPER(task_id) = ? OR task_id LIKE ?) AND user_id = ? - """, (status.upper(), due_date, formatted_id, f"%{task_id.strip()}", user_id)) - else: - cursor.execute(""" - UPDATE tasks - SET status = ? - WHERE (UPPER(task_id) = ? OR task_id LIKE ?) AND user_id = ? - """, (status.upper(), formatted_id, f"%{task_id.strip()}", user_id)) + + updates = [] + params = [] + + if title is not None and title.strip(): + updates.append("title = ?") + params.append(title.strip()) + + if priority is not None and priority.strip(): + updates.append("priority = ?") + params.append(priority.strip().upper()) + + if status is not None and status.strip(): + target_status = status.strip().upper() + if target_status in ["PROGRESS", "В РАБОТЕ"]: target_status = "IN_PROGRESS" + elif target_status in ["DONE", "ГОТОВО"]: target_status = "COMPLETED" + elif target_status in ["PLANNED", "ПЛАНЫ"]: target_status = "BACKLOG" + updates.append("status = ?") + params.append(target_status) + + if due_date is not None: + updates.append("due_date = ?") + params.append(due_date.strip() if due_date.strip() else None) + + if not updates: + conn.close() + return {"status": "success", "message": "Нет данных для обновления"} + + params.extend([clean_num, formatted_id, f"%{task_id.strip()}", user_id]) + sql = f""" + UPDATE tasks + SET {', '.join(updates)} + WHERE (id = ? OR UPPER(task_id) = ? OR task_id LIKE ?) AND user_id = ? + """ + cursor.execute(sql, params) if cursor.rowcount == 0: conn.close() return {"error": f"Задача {task_id} не найдена или принадлежит другому пользователю"} + conn.commit() conn.close() - return {"status": "success", "message": f"Статус задачи {formatted_id} обновлен на {status.upper()}"} + return {"status": "success", "message": f"Задача #{task_id} успешно обновлена"} def db_delete_task(user_id: int, task_id: str) -> Dict[str, Any]: + """Удаление задачи.""" conn = get_db_connection() cursor = conn.cursor() + clean_num = re.sub(r'\D', '', str(task_id)) formatted_id = normalize_task_id(task_id) + cursor.execute(""" DELETE FROM tasks - WHERE (UPPER(task_id) = ? OR task_id LIKE ?) AND user_id = ? - """, (formatted_id, f"%{task_id.strip()}", user_id)) + WHERE (id = ? OR UPPER(task_id) = ? OR task_id LIKE ?) AND user_id = ? + """, (clean_num, formatted_id, f"%{task_id.strip()}", user_id)) + if cursor.rowcount == 0: conn.close() return {"error": f"Задача {task_id} не найдена"} conn.commit() conn.close() - return {"status": "success", "message": f"Задача {formatted_id} удалена"} \ No newline at end of file + return {"status": "success", "message": f"Задача #{task_id} удалена"} + +def db_export_tasks_markdown(user_id: int, filename: Optional[str] = None, status_filter: Optional[str] = None) -> Dict[str, Any]: + """Генерирует Markdown-отчет задач с сохранением в output/web/tasks_export/{uuid}/.""" + tasks = db_get_tasks(user_id) + if not tasks: + return {"status": "error", "message": "Список задач пуст, экспорт отменен"} + + # Фильтрация по статусу + if status_filter and status_filter.upper() != "ALL": + tgt = status_filter.upper() + if tgt in ["COMPLETED", "DONE", "ВЫПОЛНЕННЫЕ"]: + tasks = [t for t in tasks if str(t.get("status", "")).upper() in ["COMPLETED", "DONE"]] + elif tgt in ["IN_PROGRESS", "PROGRESS", "В РАБОТЕ"]: + tasks = [t for t in tasks if str(t.get("status", "")).upper() in ["IN_PROGRESS", "PROGRESS"]] + elif tgt in ["BACKLOG", "PLANNED", "В ПЛАНАХ"]: + tasks = [t for t in tasks if str(t.get("status", "")).upper() in ["BACKLOG", "PLANNED"]] + + if not tasks: + return {"status": "error", "message": f"Нет задач с фильтром '{status_filter}' для экспорта"} + + # Имя файла + target_filename = filename.strip() if (filename and filename.strip()) else "ROADMAP.md" + if not target_filename.endswith(".md"): + target_filename = f"{target_filename}.md" + + now_dt = datetime.now() + now_str = now_dt.strftime("%Y-%m-%d %H:%M") + + modules: Dict[str, List[Dict[str, Any]]] = {} + for t in tasks: + mod = t.get("module") or "general" + modules.setdefault(mod, []).append(t) + + md_lines = [ + "# 🗺️ Дорожная карта задач проекта (ROADMAP)\n", + f"> **Сформировано:** {now_str} | **Всего задач:** {len(tasks)}\n", + "---\n" + ] + + for mod_name, mod_tasks in sorted(modules.items()): + md_lines.append(f"## Модуль `{mod_name}`\n") + for t in sorted(mod_tasks, key=lambda x: x.get("id", 0)): + status = str(t.get("status", "BACKLOG")).upper() + is_done = status in ["COMPLETED", "DONE"] + is_progress = status in ["IN_PROGRESS", "PROGRESS"] + + check_box = "[x]" if is_done else "[ ]" + t_id = t.get("id") + title = t.get("title", "Без названия") + prio = t.get("priority", "MEDIUM") + due = f" *(срок: {t['due_date']})*" if t.get("due_date") else "" + status_tag = " `[В РАБОТЕ]`" if is_progress else (" `[ЗАВЕРШЕНО]`" if is_done else "") + + md_lines.append(f"- {check_box} **#{t_id}** [{prio}]{status_tag} {title}{due}") + + md_lines.append("\n---\n") + + content = "\n".join(md_lines) + + # Точный путь к корню scud_ai/output/web/tasks_export/ + current_file_dir = os.path.dirname(os.path.abspath(__file__)) + root_dir = os.path.abspath(os.path.join(current_file_dir, "../../../../")) + tool_dir = os.path.join(root_dir, "output", "web", "tasks_export") + os.makedirs(tool_dir, exist_ok=True) + + try: + from routers.files import purge_old_tool_sessions + purge_old_tool_sessions(tool_dir) + except Exception: + pass + + session_token = uuid.uuid4().hex[:8] + session_dir = os.path.join(tool_dir, session_token) + os.makedirs(session_dir, exist_ok=True) + + filepath = os.path.join(session_dir, target_filename) + with open(filepath, "w", encoding="utf-8") as f: + f.write(content) + + logger.info(f"Файл успешно создан: {filepath}") + + return { + "status": "success", + "filename": target_filename, + "filepath": filepath, + "download_url": f"/api/v1/files/download/tasks_export/{session_token}/{target_filename}", + "tasks_count": len(tasks), + "message": f"Отчет успешно сформирован в файл `{target_filename}` (всего задач: {len(tasks)})." + } + +def db_tasks_edit( + user_id: int, + action: str, + task_id: Optional[str] = None, + title: Optional[str] = None, + priority: Optional[str] = "MEDIUM", + status: Optional[str] = None, + module: Optional[str] = "general", + due_date: Optional[str] = None, + filename: Optional[str] = "ROADMAP.md" +) -> Dict[str, Any]: + """Единый консолидированный диспетчер операций над задачами.""" + act = action.strip().upper() + + if act == "ADD": + if not title: + return {"status": "error", "message": "Для создания задачи требуется указать title"} + return db_add_task( + user_id=user_id, + module=module or "general", + title=title, + priority=priority or "MEDIUM", + due_date=due_date, + status=status or "BACKLOG" + ) + + elif act == "UPDATE": + if not task_id: + return {"status": "error", "message": "Для обновления требуется указать task_id"} + return db_update_task_details(user_id=user_id, task_id=str(task_id), title=title, priority=priority, status=status, due_date=due_date) + + elif act == "DELETE": + if not task_id: + return {"status": "error", "message": "Для удаления требуется указать task_id"} + return db_delete_task(user_id=user_id, task_id=str(task_id)) + + elif act == "EXPORT": + return db_export_tasks_markdown(user_id=user_id, filename=filename or "ROADMAP.md") + + return {"status": "error", "message": f"Неизвестное действие action='{action}'"} \ No newline at end of file diff --git a/modules/web_api/llm/db_tools.py b/modules/web_api/llm/db_tools.py index 0eec0d2..f0264b1 100644 --- a/modules/web_api/llm/db_tools.py +++ b/modules/web_api/llm/db_tools.py @@ -1,31 +1,44 @@ """ +=============================================================================== FILE: modules/web_api/llm/db_tools.py +PROJECT: SCUD Orion AI (Unified Architecture) +MODULE: web_api / llm +ROLE: Фасадная точка доступа ко всем функциям базы данных SQLite. +=============================================================================== """ -from datetime import datetime + from .db.connection import DB_PATH, get_db_connection -from .db.db_chat import db_save_chat_message, db_get_chat_history, db_purge_ephemeral_messages -from .db.db_tasks import normalize_task_id, db_get_tasks, db_add_task, db_update_task_status, db_delete_task -from .db.db_snapshots import db_get_snapshots, db_delete_snapshots from .db.db_prompts import ( db_get_active_system_prompt, db_add_system_prompt, db_apply_prompt_node_action, db_get_tool_action, - db_get_rules, db_set_session_state, db_get_session_state, db_clear_session_state, + db_get_rules, db_get_stats, db_get_anomalies, db_get_reference ) - -def db_get_current_server_time(): - now = datetime.now() - days_ru = ["понедельник", "вторник", "среда", "четверг", "пятница", "суббота", "воскресенье"] - return { - "current_date": now.strftime("%d.%m.%Y"), - "current_time": now.strftime("%H:%M:%S"), - "day_of_week": days_ru[now.weekday()], - "iso_date": now.strftime("%Y-%m-%d") - } \ No newline at end of file +from .db.db_chat import ( + db_save_chat_message, + db_get_chat_history, + db_purge_ephemeral_messages, + db_clear_chat_history +) +from .db.db_tasks import ( + normalize_task_id, + db_get_tasks, + db_add_task, + db_update_task_status, + db_update_task_details, + db_delete_task, + db_export_tasks_markdown, + db_tasks_edit +) +from .db.db_snapshots import ( + db_get_snapshots, + db_delete_snapshots +) +from .core.calendar_utils import get_dynamic_calendar_context as db_get_current_server_time \ No newline at end of file diff --git a/modules/web_api/llm/schemas.py b/modules/web_api/llm/schemas.py index 386139e..9c23433 100644 --- a/modules/web_api/llm/schemas.py +++ b/modules/web_api/llm/schemas.py @@ -1,50 +1,77 @@ +""" +=============================================================================== +FILE: modules/web_api/llm/schemas.py +PROJECT: SCUD Orion AI (Unified Architecture) +MODULE: web_api / llm +ROLE: Декларативная схема нативных инструментов (Function Calling) для Ollama. + +AI-CONTEXT-ANCHORS: + - ANCHOR[SCHEMA_PROMPT_EDIT]: Схема управления узлами системного промпта. + - ANCHOR[SCHEMA_TASKS_EDIT]: Консолидированная схема управления задачами. + - ANCHOR[SCHEMA_SNAPSHOTS]: Схема доступа к логам и срезам СКУД. +=============================================================================== +""" + +# ANCHOR[SCHEMA_PROMPT_EDIT] TOOLS_SCHEMA = [ { "type": "function", "function": { "name": "db_prompt_node_edit", "description": ( - "ЕДИНСТВЕННЫЙ инструмент для добавления, изменения или УДАЛЕНИЯ пунктов системного промпта. " - "Вызывай ВСЕГДА при фразах 'удали X.Y', 'удалить пункт X.Y', 'добавь X.Y', 'измени X.Y'. " - "При удалении: action='DELETE', section_id=X, item_id=Y, content=''. " - "Запрещено отвечать текстовым подтверждением без вызова этой функции!" + "Управление элементами системного промпта (добавление, изменение, удаление). " + "Если пользователь пишет 'удали 2.9' или 'удали пункт 2.9', вызывай action='DELETE', section_id=2, item_id=9. " + "Действие action может быть ADD, EDIT или DELETE." ), "parameters": { "type": "object", "properties": { "action": { "type": "string", - "enum": ["ADD", "UPDATE", "DELETE"], - "description": "ADD (добавить), UPDATE (изменить), DELETE (удалить)" + "enum": ["ADD", "EDIT", "DELETE"], + "description": "Действие: ADD (добавить), EDIT (изменить), DELETE (удалить)" }, "section_id": { "type": "integer", - "description": "Номер раздела (например: 1, 2, 3)" + "description": "Номер раздела из точки (например, 2 из 2.9)" }, "item_id": { "type": "integer", - "description": "Номер пункта (например: 4, 8, 9)" + "description": "Номер пункта из точки (например, 9 из 2.9)" }, "content": { "type": "string", - "description": "Текст пункта (для DELETE передается пустая строка)" + "description": "Текст пункта (для DELETE пустая строка)" } }, "required": ["action", "section_id", "item_id"] } } }, + { + "type": "function", + "function": { + "name": "db_get_system_prompt", + "description": "Просмотр текущего активного системного промпта ассистента из базы данных.", + "parameters": { + "type": "object", + "properties": {} + } + } + }, + # ANCHOR[SCHEMA_TASKS_EDIT] { "type": "function", "function": { "name": "db_get_tasks", - "description": "ПОЛУЧИТЬ СПИСОК ЗАДАЧ ТЕКУЩЕГО ПОЛЬЗОВАТЕЛЯ. Вызывай СРАЗУ при запросе 'покажи мои задачи' или 'список задач'. ВАЖНОЕ ПРАВИЛО ВЫВОДА: Выводи задачи ЕДИНЫМ плоским списком (нумерованным или маркированным) по порядку ID. КАТЕГОРИЧЕСКИ ЗАПРЕЩЕНО группировать задачи по статусам (В процессе, Бэклог, Завершены) или создавать подзаголовки, если оператор явно не попросил о группировке!", + "description": "Просмотр реестра задач и бэклога текущего пользователя.", "parameters": { "type": "object", "properties": { "status": { "type": "string", - "description": "Фильтр статуса: BACKLOG, IN_PROGRESS или COMPLETED." + "enum": ["ALL", "IN_PROGRESS", "PLANNED", "COMPLETED"], + "description": "Опциональный фильтр статуса задач" } } } @@ -53,64 +80,63 @@ TOOLS_SCHEMA = [ { "type": "function", "function": { - "name": "db_get_rules", - "description": "ПОЛУЧИТЬ БАЗУ ЗНАНИЙ ИИ И ПРАВИЛА АРБИТРАЖА (ai_knowledge_base). Вызывай когда пользователь просит показать базу знаний, правила, инструкции или промпты.", - "parameters": {"type": "object", "properties": {}} - } - }, - { - "type": "function", - "function": { - "name": "db_get_system_prompt", - "description": "ВЫЗЫВАЙ ВСЕГДА при наличии в сообщении фраз: 'покажи системный промпт', 'покажи промпт', 'выведи промпт', 'системный промпт'. Запрещено отвечать текстом без вызова этого инструмента.", - "parameters": { - "type": "object", - "properties": {}, - "required": [] - } - } - }, - { - "type": "function", - "function": { - "name": "db_update_task_status", - "description": "Изменить статус и/или срок выполнения задачи в реестре.", + "name": "db_tasks_edit", + "description": "Единый инструмент управления задачами: создание (ADD), изменение статуса/дедлайна (UPDATE), удаление (DELETE) и экспорт задач в Markdown-файл (EXPORT).", "parameters": { "type": "object", "properties": { - "task_id": {"type": "string", "description": "Идентификатор задачи, например TASK-17"}, - "status": {"type": "string", "description": "Новый статус: COMPLETED, IN_PROGRESS или BACKLOG"}, - "due_date": {"type": "string", "description": "Срок выполнения задачи"} + "action": { + "type": "string", + "enum": ["ADD", "UPDATE", "DELETE", "EXPORT"], + "description": "Тип действия: ADD, UPDATE, DELETE или EXPORT" + }, + "task_id": { + "type": "string", + "description": "Номер задачи (для UPDATE и DELETE, например: '35')" + }, + "title": { + "type": "string", + "description": "Описание или текст задачи" + }, + "status": { + "type": "string", + "enum": ["IN_PROGRESS", "COMPLETED", "PLANNED"], + "description": "Статус задачи" + }, + "priority": { + "type": "string", + "enum": ["LOW", "MEDIUM", "HIGH", "CRITICAL"], + "description": "Приоритет задачи" + }, + "module": { + "type": "string", + "description": "Модуль проекта" + }, + "due_date": { + "type": "string", + "description": "Срок в формате ГГГГ-ММ-ДД" + }, + "filename": { + "type": "string", + "description": "Имя файла для экспорта" + } }, - "required": ["task_id"] - } - } - }, - { - "type": "function", - "function": { - "name": "db_delete_task", - "description": "Удалить задачу из реестра по её task_id (например, TASK-18).", - "parameters": { - "type": "object", - "properties": { - "task_id": {"type": "string", "description": "Идентификатор задачи для удаления, например TASK-18"} - }, - "required": ["task_id"] + "required": ["action"] } } }, + # ANCHOR[SCHEMA_SNAPSHOTS] { "type": "function", "function": { "name": "db_get_snapshots", - "description": "ПОЛУЧИТЬ АКТУАЛЬНЫЙ СПИСОК СНАПШОТОВ ИЗ БАЗЫ SQLITE. Вызывай ЭТУ ФУНКЦИЮ ВСЕГДА, даже если список снапшотов уже есть в истории чата или пользователь просит 'обновить', 'повторить запрос', 'проверить снова'. ЗАПРЕЩЕНО беречь контекст и выводить старые данные из истории!", + "description": "Получение списка снапшотов и срезов логов СКУД из базы данных за конкретную дату.", "parameters": { "type": "object", "properties": { "date_str": { "type": "string", - "description": "Точная дата в формате ДД.ММ.ГГГГ (например, '12.08.2026'), взятая из [СИСТЕМНОГО КАЛЕНДАРЯ СЕРВЕРА]." + "description": "Дата в формате ДД.ММ.ГГГГ или относительное слово" } } } @@ -120,12 +146,18 @@ TOOLS_SCHEMA = [ "type": "function", "function": { "name": "db_delete_snapshots", - "description": "УДАЛИТЬ СНАПШОТ(Ы) ИЗ БАЗЫ ДАННЫХ. Вызывай, когда пользователь явно просит удалить конкретный снапшот по ID или все снапшоты за выбранный день.", + "description": "Удаление снапшотов СКУД по идентификатору или дате.", "parameters": { "type": "object", "properties": { - "snapshot_id": {"type": "string", "description": "Идентификатор снапшота для удаления, например Y20260805-007"}, - "day_str": {"type": "string", "description": "Дата в формате ДД.ММ.ГГГГ для удаления всех снапшотов за день"} + "snapshot_id": { + "type": "string", + "description": "Идентификатор конкретного снапшота" + }, + "day_str": { + "type": "string", + "description": "Дата всех снапшотов за день" + } } } } @@ -133,29 +165,31 @@ TOOLS_SCHEMA = [ { "type": "function", "function": { - "name": "db_get_current_server_time", - "description": "ПОЛУЧИТЬ ТЕКУЩУЮ ДАТУ, ВРЕМЯ И ДЕНЬ НЕДЕЛИ СЕРВЕРА. Вызывай МГНОВЕННО при любых вопросах пользователя про точное текущее время или текущую дату.", + "name": "db_get_anomalies", + "description": "Просмотр истории аномалий и расхождений между СКУД и 1С.", "parameters": { "type": "object", - "properties": {}, - "required": [] + "properties": { + "date_str": { + "type": "string", + "description": "Опциональная дата в формате ДД.ММ.ГГГГ" + }, + "limit": { + "type": "integer", + "description": "Лимит записей" + } + } } } }, { "type": "function", "function": { - "name": "db_add_task", - "description": "Добавить новую задачу в бэклог проекта.", + "name": "db_get_rules", + "description": "Просмотр базы знаний и правил кадрового арбитража компании.", "parameters": { "type": "object", - "properties": { - "title": {"type": "string", "description": "Краткое описание задачи"}, - "priority": {"type": "string", "description": "Приоритет: HIGH, MEDIUM, LOW"}, - "module": {"type": "string", "description": "Модуль проекта, например general или services/scud_export"}, - "due_date": {"type": "string", "description": "Срок выполнения задачи, например '2026-08-07 12:00'"} - }, - "required": ["title"] + "properties": {} } } }, @@ -163,43 +197,35 @@ TOOLS_SCHEMA = [ "type": "function", "function": { "name": "db_get_stats", - "description": "ПОЛУЧИТЬ ОБЩУЮ СТАТИСТИКУ БАЗЫ ДАННЫХ. Вызывай, когда пользователь просит показать общую статистику БД, количество записей в таблицах или размер базы.", - "parameters": {"type": "object", "properties": {}} - } - }, - { - "type": "function", - "function": { - "name": "db_get_anomalies", - "description": "ПОЛУЧИТЬ ИСТОРИЮ АНОМАЛИЙ СКУД ⟷ 1С. Вызывай при запросах на просмотр аномалий или расхождений. Передавай date_str если пользователь просит аномалии за конкретный день, или увеличенный limit (например 100) если просит все.", + "description": "Получение статистики количества записей в таблицах базы данных.", "parameters": { "type": "object", - "properties": { - "limit": {"type": "integer", "description": "Максимальное количество записей (по умолчанию 100)"}, - "date_str": {"type": "string", "description": "Опциональная дата в формате ДД.ММ.ГГГГ"} - } + "properties": {} } } }, { "type": "function", "function": { - "name": "db_get_session_states", - "description": "ПОЛУЧИТЬ АКТИВНЫЕ СЕССИИ И ПРЕВЬЮ (session_states). Вызывай, когда пользователь просит показать текущие сессии или статус превью.", - "parameters": {"type": "object", "properties": {}} + "name": "db_get_current_server_time", + "description": "Получение текущего точного времени сервера.", + "parameters": { + "type": "object", + "properties": {} + } } }, { "type": "function", "function": { "name": "db_get_reference", - "description": "ПОЛУЧИТЬ СИСТЕМНЫЙ СПРАВОЧНИК И ПРИМЕРЫ КОМАНД ДЛЯ ОПЕРАТОРА (system_reference). Вызывай ВСЕГДА, когда пользователь спрашивает про возможности ассистента, список команд, примерах промптов или справе по работе с системой.", + "description": "Справка о возможностях ассистента и примеры доступных команд.", "parameters": { "type": "object", "properties": { "category": { "type": "string", - "description": "Фильтр категории: scud, tasks, calendar или system. Если просят всё — не передавай параметр." + "description": "Категория справки" } } } diff --git a/modules/web_api/main.py b/modules/web_api/main.py index 1a64668..a5317cd 100644 --- a/modules/web_api/main.py +++ b/modules/web_api/main.py @@ -25,6 +25,7 @@ from routers.auth import router as auth_router from routers.admin import router as admin_router from routers.tasks import router as tasks_router from routers.chat import router as chat_router +from routers.files import router as files_router # ANCHOR[APP_CONFIG] logging.basicConfig( @@ -53,6 +54,7 @@ app.include_router(auth_router) app.include_router(admin_router) app.include_router(tasks_router) app.include_router(chat_router) +app.include_router(files_router) # ANCHOR[ROOT_STATIC_ROUTES] @app.get("/") @@ -81,7 +83,6 @@ def serve_static_fallback(file_path: str): return FileResponse(target, media_type="text/css") return FileResponse(target) - # Резервный рекурсивный поиск файла в static filename = os.path.basename(clean_path) for root, _, files in os.walk(STATIC_DIR): if filename in files: diff --git a/modules/web_api/routers/files.py b/modules/web_api/routers/files.py new file mode 100644 index 0000000..a411fea --- /dev/null +++ b/modules/web_api/routers/files.py @@ -0,0 +1,73 @@ +""" +=============================================================================== +FILE: modules/web_api/routers/files.py +ROLE: Раздача сформированных отчетов и выгрузок с сохранением оригинальных имен + через изолированные UUID-директории инструментов. +=============================================================================== +""" + +import os +import time +import shutil +import urllib.parse +from fastapi import APIRouter, HTTPException +from fastapi.responses import FileResponse + +router = APIRouter(prefix="/api/v1/files", tags=["Files"]) + +BASE_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../../")) +WEB_OUTPUT_DIR = os.path.join(BASE_ROOT, "output", "web") +os.makedirs(WEB_OUTPUT_DIR, exist_ok=True) + +SESSION_TTL_HOURS = 24 # Срок жизни временных сессионных выгрузок + + +def purge_old_tool_sessions(tool_dir_path: str): + """Удаляет временные UUID-папки старше SESSION_TTL_HOURS внутри инструмента.""" + if not os.path.exists(tool_dir_path): + return + now = time.time() + cutoff = now - (SESSION_TTL_HOURS * 3600) + try: + for entry in os.listdir(tool_dir_path): + subpath = os.path.join(tool_dir_path, entry) + if os.path.isdir(subpath): + if os.path.getmtime(subpath) < cutoff: + shutil.rmtree(subpath, ignore_errors=True) + except Exception: + pass + + +@router.get("/download/{tool_name}/{session_uuid}/{filename}") +async def download_file(tool_name: str, session_uuid: str, filename: str): + """ + Безопасная отдача файла с каноническим именем из изолированной директории. + """ + safe_tool = os.path.basename(tool_name) + safe_uuid = os.path.basename(session_uuid) + safe_filename = os.path.basename(filename) + + file_path = os.path.join(WEB_OUTPUT_DIR, safe_tool, safe_uuid, safe_filename) + + if not os.path.exists(file_path) or not os.path.isfile(file_path): + raise HTTPException(status_code=404, detail="Файл не найден или срок его действия истек") + + # Определение MIME-типа + media_type = "application/octet-stream" + if safe_filename.endswith(".md") or safe_filename.endswith(".txt"): + media_type = "text/markdown; charset=utf-8" + elif safe_filename.endswith(".xlsx"): + media_type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" + elif safe_filename.endswith(".pdf"): + media_type = "application/pdf" + + # Корректная кодировка для кириллических имен файлов + encoded_filename = urllib.parse.quote(safe_filename) + + return FileResponse( + path=file_path, + media_type=media_type, + headers={ + "Content-Disposition": f"attachment; filename*=UTF-8''{encoded_filename}" + } + ) \ No newline at end of file diff --git a/modules/web_api/routers/tasks.py b/modules/web_api/routers/tasks.py index 5260cfb..80054a6 100644 --- a/modules/web_api/routers/tasks.py +++ b/modules/web_api/routers/tasks.py @@ -1,71 +1,75 @@ """ =============================================================================== FILE: modules/web_api/routers/tasks.py -ROLE: REST API управления задачами (GET / POST / PATCH / DELETE). +PROJECT: SCUD Orion AI (Unified Architecture) +MODULE: web_api / routers +ROLE: REST API эндпоинты реестра задач (получение, создание и обновление). =============================================================================== """ -# ANCHOR[TASKS_ROUTER_IMPORTS] -from typing import Dict, Any, Optional -from fastapi import APIRouter, Depends, HTTPException +from fastapi import APIRouter, Depends, HTTPException, Request from pydantic import BaseModel +from typing import Optional, Dict, Any -from .auth import get_current_user -from llm.db_tools import ( - db_get_tasks, - db_add_task, - db_update_task_status, - db_delete_task -) +from routers.auth import get_current_user +from llm.db_tools import db_get_tasks, db_add_task, db_update_task_details -router = APIRouter(prefix="/api/v1/tasks", tags=["tasks"]) +router = APIRouter(prefix="/api/v1/tasks", tags=["Tasks"]) -# ANCHOR[TASKS_SCHEMAS] -class CreateTaskRequest(BaseModel): +class TaskCreateRequest(BaseModel): title: str priority: Optional[str] = "MEDIUM" module: Optional[str] = "general" due_date: Optional[str] = None + status: Optional[str] = "BACKLOG" -class UpdateTaskRequest(BaseModel): - status: Optional[str] = "COMPLETED" +class TaskUpdateRequest(BaseModel): + title: Optional[str] = None + priority: Optional[str] = None due_date: Optional[str] = None + status: Optional[str] = None + + +def resolve_user_id(current_user: Dict[str, Any]) -> int: + """Извлекает корректный ID пользователя из JWT payload или ставит дефолтный 1.""" + if not current_user: + return 1 + return current_user.get("id") or current_user.get("user_id") or 1 + -# ANCHOR[TASKS_ENDPOINTS] @router.get("") -def get_tasks(user: Dict[str, Any] = Depends(get_current_user)): - """Получить список всех задач текущего авторизованного пользователя.""" - return db_get_tasks(user_id=user["id"]) +async def get_tasks_endpoint(status: Optional[str] = None, current_user = Depends(get_current_user)): + user_id = resolve_user_id(current_user) + return {"tasks": db_get_tasks(user_id=user_id, status=status)} + @router.post("") -def create_task_endpoint(req: CreateTaskRequest, user: Dict[str, Any] = Depends(get_current_user)): - """Прямое создание задачи.""" +async def create_task_endpoint(req: TaskCreateRequest, current_user = Depends(get_current_user)): + user_id = resolve_user_id(current_user) res = db_add_task( - user_id=user["id"], - module=req.module or "general", - title=req.title.strip(), - priority=req.priority or "MEDIUM", - due_date=req.due_date - ) - return res - -@router.patch("/{task_id}") -def update_task_endpoint(task_id: str, req: UpdateTaskRequest, user: Dict[str, Any] = Depends(get_current_user)): - """Прямое обновление статуса и срока задачи.""" - res = db_update_task_status( - user_id=user["id"], - task_id=task_id, - status=req.status or "COMPLETED", - due_date=req.due_date + user_id=user_id, + module=req.module, + title=req.title, + priority=req.priority, + due_date=req.due_date, + status=req.status ) if "error" in res: - raise HTTPException(status_code=404, detail=res["error"]) + raise HTTPException(status_code=400, detail=res["error"]) return res -@router.delete("/{task_id}") -def delete_task_endpoint(task_id: str, user: Dict[str, Any] = Depends(get_current_user)): - """Прямое удаление задачи.""" - res = db_delete_task(user_id=user["id"], task_id=task_id) + +@router.patch("/{task_id}") +async def update_task_endpoint(task_id: str, req: TaskUpdateRequest, current_user = Depends(get_current_user)): + user_id = resolve_user_id(current_user) + res = db_update_task_details( + user_id=user_id, + task_id=task_id, + title=req.title, + priority=req.priority, + status=req.status, + due_date=req.due_date + ) if "error" in res: raise HTTPException(status_code=404, detail=res["error"]) return res \ No newline at end of file diff --git a/modules/web_api/static/js/chat/core.js b/modules/web_api/static/js/chat/core.js index de806f9..c79594d 100644 --- a/modules/web_api/static/js/chat/core.js +++ b/modules/web_api/static/js/chat/core.js @@ -4,7 +4,7 @@ FILE: modules/web_api/static/js/chat/core.js PROJECT: SCUD Orion AI (Unified Architecture) MODULE: web_api / static / js / chat ROLE: Клиентский интерфейс диалога, Drag-and-Drop вложений, блокировка ввода - при активных кнопках, динамический вызов инлайн-редактора и двусторонний Diff. + при активных кнопках, вызов инлайн-редактора, Diff и карточки скачивания файлов. =============================================================================== */ @@ -89,8 +89,8 @@ function handleActionButtonClick(text) { } function escapeHtml(text) { - if (!text) return ""; - return text + if (text === null || text === undefined) return ""; + return String(text) .replace(/&/g, "&") .replace(//g, ">") @@ -170,13 +170,11 @@ function buildHighlightedPromptHtml(newRawText, originalBaselineText) { const fullItemStr = `${subMatch[1]}.${subMatch[2]}. ${cleanContent}`; if (!origMap.has(key) || origMap.get(key).content !== cleanContent) { - // Добавленный или изменённый пункт formattedLines.push(` ${escapeHtml(fullItemStr)}`); } else { formattedLines.push(` ${escapeHtml(fullItemStr)}`); } } else if (secMatch && !anyLower(secMatch[2].slice(0, 15))) { - // Заголовок раздела currentSection = parseInt(secMatch[1]); formattedLines.push(escapeHtml(trimmed)); } else { @@ -184,7 +182,6 @@ function buildHighlightedPromptHtml(newRawText, originalBaselineText) { } } - // Добавляем удаленные пункты (были в оригинале, но отсутствуют в новом тексте) for (let [origKey, origObj] of origMap.entries()) { if (!handledNewKeys.has(origKey)) { const strikeMarkup = ` ${origKey}. ${escapeHtml(origObj.content)} [УДАЛЕНИЕ]`; @@ -382,14 +379,45 @@ async function sendMessage(e) { interactiveWidgetHtml = renderInteractiveTaskCard(actionData.tasks); } + let snapshotsWidgetHtml = ""; + if (actionData && actionData.type === "SNAPSHOTS_CARD" && typeof renderSnapshotsCard === "function") { + snapshotsWidgetHtml = renderSnapshotsCard(actionData.data); + } + + // ⭐️ БЛОК КАРТОЧКИ СКАЧИВАНИЯ ФАЙЛА + let fileDownloadHtml = ""; + if (actionData && actionData.type === "FILE_DOWNLOAD_CARD") { + fileDownloadHtml = ` +
+
+ +
+
${escapeHtml(actionData.filename)}
+
Готов к скачиванию (задач: ${actionData.tasks_count || '—'})
+
+
+ + + Скачать + +
+ `; + } + + const isWideWidget = actionData && (actionData.type === "TASK_INTERACTIVE_CARD" || actionData.type === "PROMPT_PREVIEW"); + const maxWidthClass = isWideWidget ? "max-w-4xl w-full" : "max-w-2xl"; + const botMsgHtml = ` -
+

${assistantTitle}

${replyText}
${previewEditorHtml} ${interactiveWidgetHtml} + ${snapshotsWidgetHtml} + ${fileDownloadHtml} ${actionButtonsHtml}
`; diff --git a/modules/web_api/static/js/chat/task_widget.js b/modules/web_api/static/js/chat/task_widget.js index d6328e0..d3b9bd8 100644 --- a/modules/web_api/static/js/chat/task_widget.js +++ b/modules/web_api/static/js/chat/task_widget.js @@ -1,208 +1,445 @@ -/** +/* =============================================================================== FILE: modules/web_api/static/js/chat/task_widget.js -ROLE: Генеративный UI интерактивных карточек задач внутри диалога чата - (фильтры, inline-чекбоксы статусов, быстрое добавление и удаление). +ROLE: Интерактивные виджеты задач и срезов СКУД (SNAPSHOTS_CARD) с чекбоксами. =============================================================================== */ -let activeWidgetTasksMap = new Map(); +window.activeTaskFilter = window.activeTaskFilter || 'IN_PROGRESS'; +window.currentTasksCache = window.currentTasksCache || []; -function renderTaskItemsHtml(tasks, filterStatus) { - const filtered = tasks.filter(t => { - if (filterStatus === "ALL") return true; - return t.status === filterStatus; - }); +function getAuthHeaders() { + const token = typeof API_TOKEN !== 'undefined' && API_TOKEN ? API_TOKEN : localStorage.getItem("scud_api_auth_token"); + const headers = { 'Content-Type': 'application/json' }; + if (token) { + headers['Authorization'] = 'Bearer ' + token; + } + return headers; +} - if (filtered.length === 0) { - const label = filterStatus === 'BACKLOG' ? 'В планах' : filterStatus === 'IN_PROGRESS' ? 'В работе' : filterStatus === 'COMPLETED' ? 'Завершенные' : 'Все'; - return `
Нет задач со статусом «${label}»
`; +window.sendChatAction = function(actionText) { + const input = document.getElementById("user-input"); + if (input && typeof sendMessage === "function") { + input.value = actionText; + if (typeof setInputLocked === "function") setInputLocked(false); + sendMessage(); + } +}; + +// ============================================================================ +// РЕНДЕРИНГ КАРТОЧКИ СРЕЗОВ СКУД (SNAPSHOTS_CARD) С ЧЕКБОКСАМИ +// ============================================================================ +function renderSnapshotsCard(data) { + if (!data || !data.snapshots || !Array.isArray(data.snapshots)) return ''; + const queryDate = data.query_date || 'выбранную дату'; + const snapshots = data.snapshots; + + if (snapshots.length === 0) { + return ` +
+ 📸 За дату ${queryDate} сохраненных снапшотов не найдено. +
+ `; } - return filtered.map(t => { - const isDone = t.status === "COMPLETED"; - const isProgress = t.status === "IN_PROGRESS"; - const checkedAttr = isDone ? "checked" : ""; - const textClass = isDone ? "line-through text-slate-400" : "text-slate-800 font-medium"; + const rowsHtml = snapshots.map((s, idx) => { + const snapId = s.snapshot_id || `ID-${idx}`; + const snapTime = s.snapshot_time ? s.snapshot_time.split(' ')[1] || s.snapshot_time : '—'; + const count = s.record_count || 0; + const isFinal = snapId.startsWith('Y'); - let statusPill = `В планах`; - if (isDone) { - statusPill = `Завершено`; - } else if (isProgress) { - statusPill = `В работе`; - } - - let prioPill = ""; - if (t.priority === "HIGH") { - prioPill = `HIGH`; + if (isFinal) { + return ` +
+
+ + + + + #${snapId} + +
+ + ${snapTime} + + + ${count} записей + +
+
+ + Итоговый Y-срез + +
+ `; } return ` -
-
- -
-
- ${t.task_id} - ${prioPill} - ${statusPill} -
- ${escapeHtml(t.title)} +
+
+ + + #${snapId} + +
+ + ${snapTime} + + + ${count} записей +
-
`; - }).join(""); -} - -function renderInteractiveTaskCard(tasks) { - if (!tasks || !Array.isArray(tasks)) return ""; - const widgetId = "task_widget_" + Date.now(); - activeWidgetTasksMap.set(widgetId, { tasks: tasks, filter: "ALL" }); - - const itemsHtml = renderTaskItemsHtml(tasks, "ALL"); + }).join(''); return ` -
-
- - - - +
+
+
+
+ +
+
+ Реестр срезов СКУД + за ${queryDate} +
+
+
+ + + Срезов: ${snapshots.length} + +
-
- ${itemsHtml} +
+ ${rowsHtml}
-
- -
`; } -function filterTaskWidget(widgetId, status, btnEl) { - const state = activeWidgetTasksMap.get(widgetId); - if (!state) return; - state.filter = status; +// ⭐️ Обработчики чекбоксов +window.toggleSelectAllSnapshots = function(masterCb) { + const root = masterCb.closest('.snapshots-widget-root'); + if (!root) return; + const checkboxes = root.querySelectorAll('.snapshot-item-checkbox'); + checkboxes.forEach(cb => cb.checked = masterCb.checked); + window.syncBulkDeleteFooter(root); +}; - const widgetEl = document.getElementById(widgetId); - if (!widgetEl) return; +window.updateSelectedSnapshots = function(itemCb) { + const root = itemCb.closest('.snapshots-widget-root'); + if (!root) return; + window.syncBulkDeleteFooter(root); +}; - widgetEl.querySelectorAll(".widget-tab-btn").forEach(b => { - b.className = "widget-tab-btn px-2.5 py-1 rounded-lg text-slate-500 hover:text-slate-700"; +window.syncBulkDeleteFooter = function(root) { + const checkboxes = root.querySelectorAll('.snapshot-item-checkbox:checked'); + const footer = root.querySelector('.snapshot-bulk-actions-footer'); + const counter = root.querySelector('.bulk-selected-counter'); + const masterCb = root.querySelector('.select-all-snapshots-cb'); + const allCheckboxes = root.querySelectorAll('.snapshot-item-checkbox'); + + if (masterCb) { + masterCb.checked = allCheckboxes.length > 0 && checkboxes.length === allCheckboxes.length; + } + + if (checkboxes.length > 0) { + if (footer) footer.classList.remove('hidden'); + if (counter) counter.innerText = `Выбрано дневных срезов: ${checkboxes.length}`; + } else { + if (footer) footer.classList.add('hidden'); + } +}; + +// Одиночная корзина в строке снапшота: +// onclick="window.sendChatAction('удали снапшот ${snapId}')" + +// Кнопка пакетного удаления в подвале карточки: +window.submitBulkDeleteSnapshots = function(btnEl) { + const root = btnEl.closest('.snapshots-widget-root'); + if (!root) return; + const selected = Array.from(root.querySelectorAll('.snapshot-item-checkbox:checked')).map(cb => cb.value); + if (selected.length === 0) return; + window.sendChatAction(`удали снапшоты ${selected.join(', ')}`); +}; + +// ============================================================================ +// РЕНДЕРИНГ КАРТОЧКИ ЗАДАЧ (TASK_INTERACTIVE_CARD) +// ============================================================================ +function renderInteractiveTaskCard(tasks) { + if (!tasks || !Array.isArray(tasks)) return ''; + window.currentTasksCache = tasks; + + const counts = { + ALL: tasks.length, + IN_PROGRESS: tasks.filter(t => t.status === 'IN_PROGRESS' || t.status === 'PROGRESS').length, + PLANNED: tasks.filter(t => t.status === 'BACKLOG' || t.status === 'PLANNED').length, + COMPLETED: tasks.filter(t => t.status === 'COMPLETED' || t.status === 'DONE').length + }; + + const currentFilter = window.activeTaskFilter || 'IN_PROGRESS'; + + const filteredTasks = tasks.filter(t => { + const s = (t.status || 'BACKLOG').toUpperCase(); + if (currentFilter === 'ALL') return true; + if (currentFilter === 'IN_PROGRESS') return s === 'IN_PROGRESS' || s === 'PROGRESS'; + if (currentFilter === 'PLANNED') return s === 'BACKLOG' || s === 'PLANNED'; + if (currentFilter === 'COMPLETED') return s === 'COMPLETED' || s === 'DONE'; + return true; }); - btnEl.className = "widget-tab-btn px-2.5 py-1 rounded-lg bg-indigo-50 text-indigo-600 font-bold border border-indigo-200"; - const container = widgetEl.querySelector(".widget-items-container"); - if (container) { - container.innerHTML = renderTaskItemsHtml(state.tasks, status); - } + const getPrioBadge = (prio) => { + const p = (prio || 'MEDIUM').toUpperCase(); + if (p === 'HIGH' || p === 'CRITICAL') return '🔥 HIGH'; + if (p === 'LOW') return '☕ LOW'; + return '⚡ MEDIUM'; + }; + + const getStatusBadge = (status) => { + const s = (status || 'BACKLOG').toUpperCase(); + if (s === 'IN_PROGRESS' || s === 'PROGRESS') return '⚙️ В работе'; + if (s === 'COMPLETED' || s === 'DONE') return '✓ Готово'; + return '📋 В планах'; + }; + + const taskRows = filteredTasks.map(t => { + const id = t.id; + const title = t.title || 'Без названия'; + const isDone = t.status === 'COMPLETED' || t.status === 'DONE'; + const isInProgress = t.status === 'IN_PROGRESS' || t.status === 'PROGRESS'; + + const actionBtn = isInProgress + ? `` + : (!isDone + ? `` + : ''); + + return ` +
+
+
+ #${id} + ${title} +
+
+ ${actionBtn} + + +
+
+ +
+ ${getPrioBadge(t.priority)} + ${getStatusBadge(t.status)} + ${t.module || 'general'} + ${t.due_date ? `📅 срок: ${t.due_date}` : ''} + ${t.created_at ? `создана: ${t.created_at.split(' ')[0]}` : ''} +
+ + + +
+ `; + }).join(''); + + const emptyState = ` +
+
📭
+
Нет задач в категории «${currentFilter}»
+
+ `; + + return ` +
+
+
+ + + + +
+ + +
+ + + +
+ ${filteredTasks.length > 0 ? taskRows : emptyState} +
+
+ `; } -async function toggleTaskStatusInline(taskId, isChecked) { - const token = typeof API_TOKEN !== 'undefined' && API_TOKEN ? API_TOKEN : localStorage.getItem("scud_api_auth_token"); - const newStatus = isChecked ? "COMPLETED" : "BACKLOG"; +window.switchTaskFilter = function(filterName, btnEl) { + window.activeTaskFilter = filterName; + const root = btnEl ? btnEl.closest('.task-widget-root') : document.querySelector('.task-widget-root'); + if (root && window.currentTasksCache && window.currentTasksCache.length > 0) { + root.outerHTML = renderInteractiveTaskCard(window.currentTasksCache); + } +}; + +window.toggleCreateTaskForm = function(btnEl) { + const root = btnEl ? btnEl.closest('.task-widget-root') : document.querySelector('.task-widget-root'); + if (!root) return; + const form = root.querySelector('.new-task-creation-form'); + if (form) { + form.classList.toggle('hidden'); + if (!form.classList.contains('hidden')) { + const input = form.querySelector('.new-task-title'); + if (input) input.focus(); + } + } +}; + +window.submitCreateTask = async function(btnEl) { + const root = btnEl ? btnEl.closest('.task-widget-root') : document.querySelector('.task-widget-root'); + if (!root) return; + + const titleInput = root.querySelector('.new-task-title'); + const dateInput = root.querySelector('.new-task-date'); + const prioInput = root.querySelector('.new-task-prio'); + const statusInput = root.querySelector('.new-task-status'); + + if (!titleInput || !titleInput.value.trim()) { + alert('Введите описание задачи'); + return; + } try { - const res = await fetch(`/api/v1/tasks/${taskId}`, { - method: "PATCH", - headers: { - "Content-Type": "application/json", - "Authorization": "Bearer " + token - }, - body: JSON.stringify({ status: newStatus }) + const res = await fetch('/api/v1/tasks', { + method: 'POST', + headers: getAuthHeaders(), + body: JSON.stringify({ + title: titleInput.value.trim(), + due_date: dateInput ? (dateInput.value || null) : null, + priority: prioInput ? prioInput.value : 'MEDIUM', + status: statusInput ? statusInput.value : 'BACKLOG' + }) }); if (res.ok) { - for (let [wId, state] of activeWidgetTasksMap.entries()) { - const targetTask = state.tasks.find(t => t.task_id === taskId); - if (targetTask) { - targetTask.status = newStatus; - const widgetEl = document.getElementById(wId); - const container = widgetEl?.querySelector(".widget-items-container"); - if (container) { - container.innerHTML = renderTaskItemsHtml(state.tasks, state.filter); - } - } - } - if (typeof loadTasks === "function") loadTasks(); + window.activeTaskFilter = (statusInput && statusInput.value === 'IN_PROGRESS') ? 'IN_PROGRESS' : 'PLANNED'; + window.sendChatAction('покажи задачи'); + } else { + const err = await res.json(); + alert('Ошибка создания задачи: ' + (err.detail || 'Неизвестная ошибка')); } - } catch (err) { - console.error("[Task Patch Error]", err); + } catch (e) { + console.error('Ошибка создания задачи:', e); + alert('Сетевая ошибка при создании задачи'); } -} +}; -async function deleteTaskInline(taskId) { - if (!confirm(`Удалить задачу ${taskId}?`)) return; - const token = typeof API_TOKEN !== 'undefined' && API_TOKEN ? API_TOKEN : localStorage.getItem("scud_api_auth_token"); +window.openTaskInlineEditor = function(id) { + const card = document.getElementById(`task-card-${id}`); + if (!card) return; + card.querySelectorAll('.task-view-mode').forEach(el => el.classList.add('hidden')); + const editor = document.getElementById(`task-editor-${id}`); + if (editor) editor.classList.remove('hidden'); +}; + +window.closeTaskInlineEditor = function(id) { + const card = document.getElementById(`task-card-${id}`); + if (!card) return; + card.querySelectorAll('.task-view-mode').forEach(el => el.classList.remove('hidden')); + const editor = document.getElementById(`task-editor-${id}`); + if (editor) editor.classList.add('hidden'); +}; + +window.saveTaskInlineEdit = async function(id) { + const titleInput = document.getElementById(`task-edit-title-${id}`); + const dateInput = document.getElementById(`task-edit-date-${id}`); + const prioInput = document.getElementById(`task-edit-prio-${id}`); + + if (!titleInput || !titleInput.value.trim()) { + alert('Описание задачи не может быть пустым'); + return; + } try { - const res = await fetch(`/api/v1/tasks/${taskId}`, { - method: "DELETE", - headers: { "Authorization": "Bearer " + token } + const res = await fetch(`/api/v1/tasks/${id}`, { + method: 'PATCH', + headers: getAuthHeaders(), + body: JSON.stringify({ + title: titleInput.value.trim(), + due_date: dateInput ? (dateInput.value || null) : null, + priority: prioInput ? prioInput.value : 'MEDIUM' + }) }); if (res.ok) { - for (let [wId, state] of activeWidgetTasksMap.entries()) { - state.tasks = state.tasks.filter(t => t.task_id !== taskId); - const widgetEl = document.getElementById(wId); - const container = widgetEl?.querySelector(".widget-items-container"); - if (container) { - container.innerHTML = renderTaskItemsHtml(state.tasks, state.filter); - } - } - if (typeof loadTasks === "function") loadTasks(); + window.sendChatAction('покажи задачи'); + } else { + const err = await res.json(); + alert('Ошибка обновления задачи: ' + (err.detail || 'Неизвестная ошибка')); } - } catch (err) { - console.error("[Task Delete Error]", err); + } catch (e) { + console.error('Ошибка сохранения задачи:', e); + alert('Сетевая ошибка при обновлении задачи'); } -} - -async function addTaskInline(widgetId, inputEl) { - if (!inputEl) return; - const title = inputEl.value.trim(); - if (!title) return; - - const token = typeof API_TOKEN !== 'undefined' && API_TOKEN ? API_TOKEN : localStorage.getItem("scud_api_auth_token"); - - try { - const res = await fetch("/api/v1/tasks", { - method: "POST", - headers: { - "Content-Type": "application/json", - "Authorization": "Bearer " + token - }, - body: JSON.stringify({ title: title, priority: "MEDIUM", module: "general" }) - }); - - if (res.ok) { - inputEl.value = ""; - const tasksRes = await fetch("/api/v1/tasks", { - headers: { "Authorization": "Bearer " + token } - }); - const updatedTasks = await tasksRes.json(); - - const state = activeWidgetTasksMap.get(widgetId); - if (state) { - state.tasks = updatedTasks; - const widgetEl = document.getElementById(widgetId); - const container = widgetEl?.querySelector(".widget-items-container"); - if (container) { - container.innerHTML = renderTaskItemsHtml(updatedTasks, state.filter); - } - } - if (typeof loadTasks === "function") loadTasks(); - } - } catch (err) { - console.error("[Task Add Error]", err); - } -} \ No newline at end of file +}; \ No newline at end of file diff --git a/project_code_snapshot.md b/project_code_snapshot.md index ffa9679..f36017d 100644 --- a/project_code_snapshot.md +++ b/project_code_snapshot.md @@ -774,12 +774,12 @@ def print_stats(): print("=" * 60) with get_connection() as conn: cursor = conn.cursor() - tables = ['scud_logs', 'zup_staff', 'zup_absences', 'anomalies_history', 'ai_knowledge_base', 'chat_messages', 'session_states'] + tables = ['scud_logs', 'zup_staff', 'zup_absences', 'anomalies_history', 'ai_knowledge_base', 'chat_messages', 'session_states', 'system_prompt_nodes', 'tasks'] for t in tables: try: cursor.execute(f"SELECT COUNT(*) FROM {t}") cnt = cursor.fetchone()[0] - print(f" • Таблица [{t:<18}]: {cnt:>6} записей") + print(f" • Таблица [{t:<20}]: {cnt:>6} записей") except Exception: pass print("=" * 60 + "\n") @@ -874,7 +874,7 @@ def inspect_scud(snapshot_id=None, date_str=None, export_xlsx=None): df = load_scud_from_db_by_snapshot(target_date, snapshot_param=snapshot_id) if df.empty: - print(f"Записи СКУД не найдены.") + print("Записи СКУД не найдены.") print("=" * 90 + "\n") return @@ -1041,7 +1041,6 @@ def print_chat_messages(session_id=None, limit=50): if not rows: print("Таблица chat_messages пуста.") else: - # Если выводили все без конкретной сессии в порядке DESC, развернем для читаемости if not session_id: rows = list(reversed(rows)) @@ -1050,13 +1049,53 @@ def print_chat_messages(session_id=None, limit=50): eph_marker = " [ЭФЕМЕРНОЕ]" if ephemeral else "" print(f"[{msg_id}] {created} | Сессия: {sess} | Роль: {role.upper()}{eph_marker}") print("-" * 105) - # Выводим контент, ограничивая длинные сообщения при необходимости content_preview = content if content else "" print(f"{content_preview}") print("=" * 105) print("\n") +def purge_chat_context(session_id=None, purge_all=False): + """ + Очистка контекста сообщений: + - По умолчанию: удаляет эфемерные сообщения, осиротевшие превью и сбрасывает стейты сессий. + - purge_all=True (--all): полностью очищает всю таблицу chat_messages и сбрасывает сессии. + """ + with get_connection() as conn: + cursor = conn.cursor() + + if purge_all: + if session_id: + cursor.execute("DELETE FROM chat_messages WHERE session_id = ?", (session_id,)) + cursor.execute("DELETE FROM session_states WHERE session_id = ?", (session_id,)) + else: + cursor.execute("DELETE FROM chat_messages") + cursor.execute("DELETE FROM session_states") + deleted_msgs = cursor.rowcount + conn.commit() + print(f"\n[✓] Полная очистка истории выполнена! Удалено сообщений: {deleted_msgs}\n") + return + + query = """ + DELETE FROM chat_messages + WHERE is_ephemeral = 1 + OR content LIKE '%Предпросмотр изменений%' + OR content LIKE '%Удален пункт:%' + OR content LIKE '%добавлен пункт:%' + """ + if session_id: + cursor.execute(query + " AND session_id = ?", (session_id,)) + cursor.execute("DELETE FROM session_states WHERE session_id = ?", (session_id,)) + else: + cursor.execute(query) + cursor.execute("DELETE FROM session_states") + + deleted_msgs = cursor.rowcount + conn.commit() + + print(f"\n[✓] Умная зачистка контекста выполнена! Удалено сообщений: {deleted_msgs}\n") + + HELP_TEXT = """ CLI-утилита инспекции и управления SQLite базой данных СКУД (scud_orion_ai.db) @@ -1071,6 +1110,7 @@ CLI-утилита инспекции и управления SQLite базой tools -- Посмотреть реестр действий инструментов и кнопок (tool_action_registry) sessions -- Посмотреть активные сессии и превью (session_states) context [session_id] [--limit N] -- Посмотреть таблицу контекста сообщений чата (chat_messages) + context purge [session_id] [--all] -- Очистить контекст (умная зачистка или полная с флагом --all) dump [output.xlsx] -- Полный дамп всех таблиц БД в многостраничный Excel snapshot del [ID] или [--day ДД.ММ.ГГГГ] -- Удаление снапшота по ID или всех за выбранный день @@ -1083,6 +1123,9 @@ CLI-утилита инспекции и управления SQLite базой python scripts/db_cli.py tools python scripts/db_cli.py sessions python scripts/db_cli.py context web_session_main --limit 20 + python scripts/db_cli.py context purge + python scripts/db_cli.py context purge --all + python scripts/db_cli.py context purge web_session_main --all python scripts/db_cli.py snapshot del Y20260805-007 python scripts/db_cli.py dump my_dump.xlsx """ @@ -1099,12 +1142,13 @@ def main(): add_help=False ) parser.add_argument('command', nargs='?', default=None, choices=['stats', 'snapshots', 'scud', 'absences', 'anomalies', 'rules', 'prompts', 'sessions', 'dump', 'snapshot', 'tools', 'context'], help="Основная команда") - parser.add_argument('action', nargs='?', default=None, help="Дополнительное действие (например, 'del') или session_id для контекста") - parser.add_argument('param', nargs='?', default=None, help="Параметр (дата, ID снапшота или имя файла)") + parser.add_argument('action', nargs='?', default=None, help="Дополнительное действие (например, 'del', 'purge') или session_id для контекста") + parser.add_argument('param', nargs='?', default=None, help="Параметр (дата, ID снапшота, session_id, '--all' или имя файла)") parser.add_argument('--snapshot', type=str, default=None, help="ID конкретного снапшота для инспекции") parser.add_argument('--export-xlsx', type=str, default=None, help="Экспорт среза СКУД в Excel-файл") parser.add_argument('--day', type=str, default=None, help="Удалить снапшоты за конкретный день (ДД.ММ.ГГГГ)") parser.add_argument('--limit', type=int, default=50, help="Лимит выводимых сообщений чата (для команды context)") + parser.add_argument('--all', action='store_true', help="Полная очистка всех сообщений (для команды context purge)") if len(sys.argv) == 1: print_stats() @@ -1133,8 +1177,13 @@ def main(): elif args.command == 'tools': print_tool_actions() elif args.command == 'context': - sess_id = args.action if args.action else None - print_chat_messages(session_id=sess_id, limit=args.limit) + if args.action in ['purge', 'clear']: + is_all = args.all or (args.param == '--all') + sess_id = None if (args.param == '--all' or not args.param) else args.param + purge_chat_context(session_id=sess_id, purge_all=is_all) + else: + sess_id = args.action if args.action else None + print_chat_messages(session_id=sess_id, limit=args.limit) elif args.command == 'dump': filename = args.param if args.param else "db_dump_full.xlsx" dump_all_to_excel(filename) @@ -1151,7 +1200,7 @@ def main(): print(f"\n[❌] Ошибка: Неизвестное действие '{args.action}' для команды snapshot.") print("Используйте: python scripts/db_cli.py snapshot del [ID или --day 'ДД.ММ.ГГГГ']\n") else: - print(f"\n[❌] Ошибка: Неизвестная команда.") + print("\n[❌] Ошибка: Неизвестная команда.") print(HELP_TEXT) if __name__ == "__main__": @@ -3839,6 +3888,7 @@ from routers.auth import router as auth_router from routers.admin import router as admin_router from routers.tasks import router as tasks_router from routers.chat import router as chat_router +from routers.files import router as files_router # ANCHOR[APP_CONFIG] logging.basicConfig( @@ -3867,6 +3917,7 @@ app.include_router(auth_router) app.include_router(admin_router) app.include_router(tasks_router) app.include_router(chat_router) +app.include_router(files_router) # ANCHOR[ROOT_STATIC_ROUTES] @app.get("/") @@ -3895,7 +3946,6 @@ def serve_static_fallback(file_path: str): return FileResponse(target, media_type="text/css") return FileResponse(target) - # Резервный рекурсивный поиск файла в static filename = os.path.basename(clean_path) for root, _, files in os.walk(STATIC_DIR): if filename in files: @@ -4595,578 +4645,6 @@ async function deleteUser(userId, username) { } ``` -## File: `./modules/web_api/static/js/chat.js` -```js -/** -=============================================================================== -FILE: modules/web_api/static/js/chat.js -ROLE: Клиентский интерфейс диалога, Drag-and-Drop вложений, генерация динамических - кнопок подтверждений и блокировка ввода при активном действии. -=============================================================================== -*/ - -function updateInputHeight(el) { - if (!el) return; - el.style.height = "24px"; - const newHeight = Math.min(el.scrollHeight, 120); - el.style.height = newHeight + "px"; -} - -let selectedFile = null; - -function handleFileSelect(e) { - const file = e.target.files[0]; - if (!file) return; - - if (file.size > 15 * 1024 * 1024) { - alert("Файл слишком большой. Максимальный размер: 15 МБ"); - e.target.value = ""; - return; - } - - selectedFile = file; - const fileNameEl = document.getElementById("file-name-display"); - const fileSizeEl = document.getElementById("file-size-display"); - const previewContainer = document.getElementById("file-preview-container"); - - if (fileNameEl) fileNameEl.innerText = file.name; - if (fileSizeEl) fileSizeEl.innerText = `(${(file.size / 1024).toFixed(1)} KB)`; - if (previewContainer) previewContainer.classList.remove("hidden"); -} - -function clearAttachedFile() { - selectedFile = null; - const fileInput = document.getElementById("file-input"); - const previewContainer = document.getElementById("file-preview-container"); - if (fileInput) fileInput.value = ""; - if (previewContainer) previewContainer.classList.add("hidden"); -} - -function setInputLocked(isLocked) { - const input = document.getElementById("user-input"); - const sendBtn = document.getElementById("send-btn"); - if (input) { - input.disabled = isLocked; - if (isLocked) { - input.placeholder = "Выберите действие с помощью кнопок выше..."; - input.classList.add("cursor-not-allowed", "opacity-60"); - } else { - input.placeholder = "Команда, вопрос или перетащите файл сюда..."; - input.classList.remove("cursor-not-allowed", "opacity-60"); - } - } - if (sendBtn) { - sendBtn.disabled = isLocked; - if (isLocked) { - sendBtn.classList.add("opacity-40", "cursor-not-allowed"); - } else { - sendBtn.classList.remove("opacity-40", "cursor-not-allowed"); - } - } -} - -function disableAllActionButtons() { - const allBtnContainers = document.querySelectorAll(".action-buttons-container"); - allBtnContainers.forEach(container => { - container.querySelectorAll("button").forEach(btn => { - btn.disabled = true; - btn.classList.add("opacity-40", "cursor-not-allowed"); - }); - }); -} - -function handleActionButtonClick(text) { - disableAllActionButtons(); - setInputLocked(false); - const input = document.getElementById("user-input"); - if (input) { - input.value = text; - sendMessage(); - } -} - -// --- [INTERACTIVE TASK WIDGET] --- -let activeWidgetTasksMap = new Map(); - -function renderTaskItemsHtml(tasks, filterStatus) { - const filtered = tasks.filter(t => { - if (filterStatus === "ALL") return true; - return t.status === filterStatus; - }); - - if (filtered.length === 0) { - const label = filterStatus === 'BACKLOG' ? 'В планах' : filterStatus === 'IN_PROGRESS' ? 'В работе' : filterStatus === 'COMPLETED' ? 'Завершенные' : 'Все'; - return `
Нет задач со статусом «${label}»
`; - } - - return filtered.map(t => { - const isDone = t.status === "COMPLETED"; - const isProgress = t.status === "IN_PROGRESS"; - const checkedAttr = isDone ? "checked" : ""; - const textClass = isDone ? "line-through text-slate-400" : "text-slate-800 font-medium"; - - let statusPill = `В планах`; - if (isDone) { - statusPill = `Завершено`; - } else if (isProgress) { - statusPill = `В работе`; - } - - let prioPill = ""; - if (t.priority === "HIGH") { - prioPill = `HIGH`; - } - - return ` -
-
- -
-
- ${t.task_id} - ${prioPill} - ${statusPill} -
- ${escapeHtml(t.title)} -
-
- -
- `; - }).join(""); -} - -function renderInteractiveTaskCard(tasks) { - if (!tasks || !Array.isArray(tasks)) return ""; - const widgetId = "task_widget_" + Date.now(); - activeWidgetTasksMap.set(widgetId, { tasks: tasks, filter: "ALL" }); - - const itemsHtml = renderTaskItemsHtml(tasks, "ALL"); - - return ` -
-
- - - - -
- -
- ${itemsHtml} -
- -
- - -
-
- `; -} - -function filterTaskWidget(widgetId, status, btnEl) { - const state = activeWidgetTasksMap.get(widgetId); - if (!state) return; - state.filter = status; - - const widgetEl = document.getElementById(widgetId); - if (!widgetEl) return; - - widgetEl.querySelectorAll(".widget-tab-btn").forEach(b => { - b.className = "widget-tab-btn px-2.5 py-1 rounded-lg text-slate-500 hover:text-slate-700"; - }); - btnEl.className = "widget-tab-btn px-2.5 py-1 rounded-lg bg-indigo-50 text-indigo-600 font-bold border border-indigo-200"; - - const container = widgetEl.querySelector(".widget-items-container"); - if (container) { - container.innerHTML = renderTaskItemsHtml(state.tasks, status); - } -} - -async function toggleTaskStatusInline(taskId, isChecked) { - const token = typeof API_TOKEN !== 'undefined' && API_TOKEN ? API_TOKEN : localStorage.getItem("scud_api_auth_token"); - const newStatus = isChecked ? "COMPLETED" : "BACKLOG"; - - try { - const res = await fetch(`/api/v1/tasks/${taskId}`, { - method: "PATCH", - headers: { - "Content-Type": "application/json", - "Authorization": "Bearer " + token - }, - body: JSON.stringify({ status: newStatus }) - }); - - if (res.ok) { - for (let [wId, state] of activeWidgetTasksMap.entries()) { - const targetTask = state.tasks.find(t => t.task_id === taskId); - if (targetTask) { - targetTask.status = newStatus; - const widgetEl = document.getElementById(wId); - const container = widgetEl?.querySelector(".widget-items-container"); - if (container) { - container.innerHTML = renderTaskItemsHtml(state.tasks, state.filter); - } - } - } - if (typeof loadTasks === "function") loadTasks(); - } - } catch (err) { - console.error("[Task Patch Error]", err); - } -} - -async function deleteTaskInline(taskId) { - if (!confirm(`Удалить задачу ${taskId}?`)) return; - const token = typeof API_TOKEN !== 'undefined' && API_TOKEN ? API_TOKEN : localStorage.getItem("scud_api_auth_token"); - - try { - const res = await fetch(`/api/v1/tasks/${taskId}`, { - method: "DELETE", - headers: { "Authorization": "Bearer " + token } - }); - - if (res.ok) { - for (let [wId, state] of activeWidgetTasksMap.entries()) { - state.tasks = state.tasks.filter(t => t.task_id !== taskId); - const widgetEl = document.getElementById(wId); - const container = widgetEl?.querySelector(".widget-items-container"); - if (container) { - container.innerHTML = renderTaskItemsHtml(state.tasks, state.filter); - } - } - if (typeof loadTasks === "function") loadTasks(); - } - } catch (err) { - console.error("[Task Delete Error]", err); - } -} - -async function addTaskInline(widgetId, inputEl) { - if (!inputEl) return; - const title = inputEl.value.trim(); - if (!title) return; - - const token = typeof API_TOKEN !== 'undefined' && API_TOKEN ? API_TOKEN : localStorage.getItem("scud_api_auth_token"); - - try { - const res = await fetch("/api/v1/tasks", { - method: "POST", - headers: { - "Content-Type": "application/json", - "Authorization": "Bearer " + token - }, - body: JSON.stringify({ title: title, priority: "MEDIUM", module: "general" }) - }); - - if (res.ok) { - inputEl.value = ""; - const tasksRes = await fetch("/api/v1/tasks", { - headers: { "Authorization": "Bearer " + token } - }); - const updatedTasks = await tasksRes.json(); - - const state = activeWidgetTasksMap.get(widgetId); - if (state) { - state.tasks = updatedTasks; - const widgetEl = document.getElementById(widgetId); - const container = widgetEl?.querySelector(".widget-items-container"); - if (container) { - container.innerHTML = renderTaskItemsHtml(updatedTasks, state.filter); - } - } - if (typeof loadTasks === "function") loadTasks(); - } - } catch (err) { - console.error("[Task Add Error]", err); - } -} - -// --- [CHAT SEND PIPELINE] --- -async function sendMessage(e) { - if (e && e.preventDefault) e.preventDefault(); - - const input = document.getElementById("user-input"); - const chatWindow = document.getElementById("chat-window"); - const sendBtn = document.getElementById("send-btn"); - - if (!input || !chatWindow) return; - const text = input.value.trim(); - - if (!text && !selectedFile) return; - - disableAllActionButtons(); - - let userDisplayHtml = escapeHtml(text); - if (selectedFile) { - userDisplayHtml = `
- ${escapeHtml(selectedFile.name)} -
` + userDisplayHtml; - } - - const userMsgHtml = ` -
-
- ${userDisplayHtml} -
-
- `; - chatWindow.insertAdjacentHTML("beforeend", userMsgHtml); - - input.value = ""; - updateInputHeight(input); - chatWindow.scrollTop = chatWindow.scrollHeight; - - if (sendBtn) { - sendBtn.disabled = true; - sendBtn.classList.add("opacity-50"); - } - - const token = typeof API_TOKEN !== 'undefined' && API_TOKEN ? API_TOKEN : localStorage.getItem("scud_api_auth_token"); - const isGuest = typeof IS_GUEST !== 'undefined' ? IS_GUEST : (localStorage.getItem("scud_is_guest") === "true"); - - const endpoint = isGuest ? "/api/v1/chat/guest" : "/api/v1/chat"; - - const formData = new FormData(); - formData.append("session_id", "web_session_main"); - formData.append("message", text || "Проанализируй прикрепленный файл"); - - if (selectedFile instanceof File) { - formData.append("file", selectedFile, selectedFile.name); - } - - const headers = {}; - if (!isGuest && token) { - headers["Authorization"] = "Bearer " + token; - } - - try { - const res = await fetch(endpoint, { - method: "POST", - headers: headers, - body: formData - }); - - if (res.status === 401 && !isGuest) { - if (typeof logout === 'function') logout(); - return; - } - - const data = await res.json(); - const assistantTitle = isGuest ? "Локальная нейросеть (Гость)" : "ИИ-Ассистент SCUD Orion AI"; - const replyText = data.reply || "Пустой ответ от нейросети"; - - let actionButtonsHtml = ""; - const actionData = data.action_type || data.action; - - if (actionData && actionData.buttons && actionData.buttons.length > 0) { - const buttonsMarkup = actionData.buttons.map(btn => { - let btnClasses = "bg-slate-100 hover:bg-slate-200 active:bg-slate-300 text-slate-700 border border-slate-300"; - let iconMarkup = ''; - - const labelLower = (btn.label || "").toLowerCase(); - const isPrimary = btn.style === "primary" || labelLower.includes("подтверд") || labelLower.startsWith("да"); - const isDanger = btn.style === "danger" || labelLower.includes("отмен") || labelLower.startsWith("нет") || labelLower.includes("законч") || labelLower.includes("заверш"); - - if (isPrimary) { - btnClasses = "bg-emerald-600 hover:bg-emerald-700 active:bg-emerald-800 text-white shadow-sm"; - iconMarkup = ''; - } else if (isDanger) { - btnClasses = "bg-rose-50 hover:bg-rose-100 active:bg-rose-200 text-rose-700 border border-rose-300"; - iconMarkup = ''; - } - - return ` - - `; - }).join(""); - - actionButtonsHtml = ` -
- ${buttonsMarkup} -
- `; - - // Если выведены кнопки подтверждения превью — блокируем ввод с клавиатуры - if (actionData.type === "PROMPT_PREVIEW") { - setInputLocked(true); - } else { - setInputLocked(false); - } - } else { - setInputLocked(false); - } - - let interactiveWidgetHtml = ""; - if (actionData && actionData.type === "TASK_INTERACTIVE_CARD" && Array.isArray(actionData.tasks)) { - interactiveWidgetHtml = renderInteractiveTaskCard(actionData.tasks); - } - - const botMsgHtml = ` -
-

- ${assistantTitle} -

-

${escapeHtml(replyText)}

- ${interactiveWidgetHtml} - ${actionButtonsHtml} -
- `; - chatWindow.insertAdjacentHTML("beforeend", botMsgHtml); - chatWindow.scrollTop = chatWindow.scrollHeight; - - clearAttachedFile(); - - if (!isGuest && typeof loadTasks === 'function') { - loadTasks(); - } - - } catch (err) { - console.error("[Chat Error]", err); - const errorHtml = ` -
- Ошибка связи с сервером. -
- `; - chatWindow.insertAdjacentHTML("beforeend", errorHtml); - chatWindow.scrollTop = chatWindow.scrollHeight; - setInputLocked(false); - } finally { - if (sendBtn && !document.getElementById("user-input")?.disabled) { - sendBtn.disabled = false; - sendBtn.classList.remove("opacity-50"); - } - } -} - -function escapeHtml(text) { - if (!text) return ""; - return text - .replace(/&/g, "&") - .replace(//g, ">") - .replace(/"/g, """) - .replace(/'/g, "'"); -} - -document.addEventListener("DOMContentLoaded", () => { - const input = document.getElementById("user-input"); - const dropZone = document.getElementById("chat-window")?.parentElement; - const dropOverlay = document.getElementById("drop-overlay"); - - if (input) { - let historyIndex = -1; - let localHistory = JSON.parse(localStorage.getItem("scud_chat_input_history") || "[]"); - - input.addEventListener("keydown", (e) => { - if (e.key === "Enter" && !e.shiftKey) { - e.preventDefault(); - if (input.disabled) return; - const text = input.value.trim(); - if (text) { - if (localHistory.length === 0 || localHistory[0] !== text) { - localHistory.unshift(text); - if (localHistory.length > 50) localHistory.pop(); - localStorage.setItem("scud_chat_input_history", JSON.stringify(localHistory)); - } - historyIndex = -1; - } - sendMessage(e); - updateInputHeight(input); - return; - } - - if (e.key === "ArrowUp") { - const textBeforeCursor = input.value.substring(0, input.selectionStart); - const isFirstLine = !textBeforeCursor.includes("\n"); - - if (isFirstLine && input.selectionStart === 0 && localHistory.length > 0) { - if (historyIndex < localHistory.length - 1) { - e.preventDefault(); - if (historyIndex === -1) { - input.dataset.draft = input.value; - } - historyIndex++; - input.value = localHistory[historyIndex]; - updateInputHeight(input); - input.setSelectionRange(input.value.length, input.value.length); - } - } - } - - if (e.key === "ArrowDown") { - const textAfterCursor = input.value.substring(input.selectionEnd); - const isLastLine = !textAfterCursor.includes("\n"); - - if (isLastLine && input.selectionEnd === input.value.length && historyIndex >= 0) { - e.preventDefault(); - if (historyIndex > 0) { - historyIndex--; - input.value = localHistory[historyIndex]; - } else { - historyIndex = -1; - input.value = input.dataset.draft || ""; - } - updateInputHeight(input); - input.setSelectionRange(input.value.length, input.value.length); - } - } - }); - } - - if (dropZone && dropOverlay) { - ["dragenter", "dragover", "dragleave", "drop"].forEach(eventName => { - dropZone.addEventListener(eventName, (e) => { - e.preventDefault(); - e.stopPropagation(); - }, false); - }); - - ["dragenter", "dragover"].forEach(eventName => { - dropZone.addEventListener(eventName, () => { - dropOverlay.classList.remove("hidden"); - dropOverlay.classList.add("flex"); - }, false); - }); - - ["dragleave", "drop"].forEach(eventName => { - dropZone.addEventListener(eventName, (e) => { - if (eventName === "drop" || e.target === dropZone || !dropZone.contains(e.relatedTarget)) { - dropOverlay.classList.add("hidden"); - dropOverlay.classList.remove("flex"); - } - }, false); - }); - - dropZone.addEventListener("drop", (e) => { - const dt = e.dataTransfer; - const files = dt.files; - - if (files && files.length > 0) { - const file = files[0]; - handleFileSelect({ target: { files: [file] } }); - - const fileInput = document.getElementById("file-input"); - if (fileInput) { - const dataTransfer = new DataTransfer(); - dataTransfer.items.add(file); - fileInput.files = dataTransfer.files; - } - } - }, false); - } -}); -``` - ## File: `./modules/web_api/static/js/tasks.js` ```js /** @@ -5343,7 +4821,7 @@ FILE: modules/web_api/static/js/chat/core.js PROJECT: SCUD Orion AI (Unified Architecture) MODULE: web_api / static / js / chat ROLE: Клиентский интерфейс диалога, Drag-and-Drop вложений, блокировка ввода - при активных кнопках, вызов онлайн-редактора и отправка правок. + при активных кнопках, вызов инлайн-редактора, Diff и карточки скачивания файлов. =============================================================================== */ @@ -5418,11 +4896,6 @@ function disableAllActionButtons() { } function handleActionButtonClick(text) { - if (text === "action:open_editor") { - openInlinePromptEditor(); - return; - } - disableAllActionButtons(); setInputLocked(false); const input = document.getElementById("user-input"); @@ -5432,22 +4905,120 @@ function handleActionButtonClick(text) { } } -function openInlinePromptEditor() { - const editorContainer = document.getElementById("inline-prompt-editor-container"); - if (editorContainer) { +function escapeHtml(text) { + if (text === null || text === undefined) return ""; + return String(text) + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'"); +} + +// --- [INLINE PROMPT EDITOR & FULL DIFF BUILDER] --- +function openInlinePromptEditor(btnEl) { + const cardContainer = btnEl.closest(".chat-message-card"); + if (!cardContainer) return; + + const editorContainer = cardContainer.querySelector(".inline-prompt-editor-container"); + const diffView = cardContainer.querySelector(".prompt-preview-diff-view"); + const textarea = cardContainer.querySelector(".inline-prompt-textarea"); + + if (editorContainer && textarea) { editorContainer.classList.remove("hidden"); - const textarea = document.getElementById("inline-prompt-textarea"); - if (textarea) textarea.focus(); + + if (diffView) { + const targetHeight = Math.max(diffView.offsetHeight, 320); + textarea.style.height = `${targetHeight}px`; + } + + textarea.focus(); } } -function closeInlinePromptEditor() { - const editorContainer = document.getElementById("inline-prompt-editor-container"); +function closeInlinePromptEditor(btnEl) { + const cardContainer = btnEl.closest(".chat-message-card"); + if (!cardContainer) return; + const editorContainer = cardContainer.querySelector(".inline-prompt-editor-container"); if (editorContainer) editorContainer.classList.add("hidden"); } -async function saveManualPromptDraft() { - const textarea = document.getElementById("inline-prompt-textarea"); +function parsePromptIntoMap(text) { + const map = new Map(); + if (!text) return map; + const lines = text.split("\n"); + for (let line of lines) { + let trimmed = line.trim(); + if (!trimmed) continue; + const match = trimmed.match(/^(\d+)[\.\s]+(\d+)[\.\s\:\-]*(.*)$/); + if (match) { + const key = `${match[1]}.${match[2]}`; + map.set(key, { sec: parseInt(match[1]), itm: parseInt(match[2]), content: match[3].trim(), full: trimmed }); + } + } + return map; +} + +function buildHighlightedPromptHtml(newRawText, originalBaselineText) { + const origMap = parsePromptIntoMap(originalBaselineText); + const newMap = parsePromptIntoMap(newRawText); + + const formattedLines = []; + const rawLines = newRawText.split("\n"); + const handledNewKeys = new Set(); + + let currentSection = null; + + for (let line of rawLines) { + let trimmed = line.trim(); + if (!trimmed) { + formattedLines.push(""); + continue; + } + + const secMatch = trimmed.match(/^(\d+)[\.\s\:\-]+([^\d].*)$/); + const subMatch = trimmed.match(/^(\d+)[\.\s]+(\d+)[\.\s\:\-]*(.*)$/); + + if (subMatch) { + const key = `${subMatch[1]}.${subMatch[2]}`; + handledNewKeys.add(key); + currentSection = parseInt(subMatch[1]); + const cleanContent = subMatch[3].trim(); + const fullItemStr = `${subMatch[1]}.${subMatch[2]}. ${cleanContent}`; + + if (!origMap.has(key) || origMap.get(key).content !== cleanContent) { + formattedLines.push(` ${escapeHtml(fullItemStr)}`); + } else { + formattedLines.push(` ${escapeHtml(fullItemStr)}`); + } + } else if (secMatch && !anyLower(secMatch[2].slice(0, 15))) { + currentSection = parseInt(secMatch[1]); + formattedLines.push(escapeHtml(trimmed)); + } else { + formattedLines.push(escapeHtml(trimmed)); + } + } + + for (let [origKey, origObj] of origMap.entries()) { + if (!handledNewKeys.has(origKey)) { + const strikeMarkup = ` ${origKey}. ${escapeHtml(origObj.content)} [УДАЛЕНИЕ]`; + formattedLines.push(strikeMarkup); + } + } + + return formattedLines.join("\n"); +} + +function anyLower(str) { + return /[а-яa-z]/.test(str); +} + +async function saveManualPromptDraft(btnEl) { + const cardContainer = btnEl.closest(".chat-message-card"); + if (!cardContainer) return; + + const textarea = cardContainer.querySelector(".inline-prompt-textarea"); + const previewTextEl = cardContainer.querySelector(".prompt-preview-diff-view"); if (!textarea) return; const newText = textarea.value.trim(); @@ -5469,28 +5040,18 @@ async function saveManualPromptDraft() { }); if (res.ok) { - closeInlinePromptEditor(); - const previewTextEl = document.getElementById("prompt-preview-diff-view"); + closeInlinePromptEditor(btnEl); if (previewTextEl) { - previewTextEl.innerText = newText; + const baseline = cardContainer.dataset.originalBaseline || ""; + const highlightedHtml = buildHighlightedPromptHtml(newText, baseline); + previewTextEl.innerHTML = highlightedHtml; } - alert("✓ Правки сохранены в черновике! Нажмите «Подтвердить» для применения в БД."); } } catch (err) { alert("Ошибка сохранения черновика: " + err); } } -function escapeHtml(text) { - if (!text) return ""; - return text - .replace(/&/g, "&") - .replace(//g, ">") - .replace(/"/g, """) - .replace(/'/g, "'"); -} - // --- [CHAT SEND PIPELINE] --- async function sendMessage(e) { if (e && e.preventDefault) e.preventDefault(); @@ -5589,8 +5150,10 @@ async function sendMessage(e) { iconMarkup = ''; } + const clickHandler = isEdit ? "openInlinePromptEditor(this)" : `handleActionButtonClick('${escapeHtml(btn.value)}')`; + return ` -
`; - // Блокируем ввод при наличии кнопок setInputLocked(true); } else { setInputLocked(false); } let previewEditorHtml = ""; - if (actionData && actionData.type === "PROMPT_PREVIEW" && actionData.raw_draft) { + let rawDraftText = ""; + let baselineText = ""; + + if (actionData && actionData.type === "PROMPT_PREVIEW") { + rawDraftText = actionData.raw_draft || ""; + baselineText = actionData.baseline_prompt || rawDraftText; previewEditorHtml = ` -