@futdevpro/fdp-agent-memory 1.1.21 → 1.1.112

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/build/package.json +2 -2
  2. package/build/src/_cli/_commands/find-duplicates.command.js +41 -16
  3. package/build/src/_cli/_commands/scan-projects.command.js +113 -113
  4. package/build/src/_cli/_commands/scan.command.js +2 -0
  5. package/build/src/_cli/_commands/serve.command.js +110 -10
  6. package/build/src/_cli/_services/fam-client.service.js +25 -1
  7. package/build/src/_cli/register-commands.js +28 -0
  8. package/build/src/_collections/config-catalog.const.js +152 -33
  9. package/build/src/_collections/error-codes.const.js +2 -0
  10. package/build/src/_collections/fam-console.util.js +38 -260
  11. package/build/src/_collections/fam-db-models.const.js +2 -0
  12. package/build/src/_collections/fam-entry-bootstrap.util.js +20 -6
  13. package/build/src/_collections/fam-error-context.util.js +1 -0
  14. package/build/src/_collections/fam-mcp-bridge.util.js +15 -1
  15. package/build/src/_collections/fam-operation-queue.service.js +85 -0
  16. package/build/src/_collections/fam-project-discovery.util.js +148 -0
  17. package/build/src/_collections/fam-request-origin.util.js +41 -0
  18. package/build/src/_collections/fam-retry.util.js +48 -0
  19. package/build/src/_collections/fam-scan-progress-sink.service.js +26 -0
  20. package/build/src/_collections/title.const.js +26 -26
  21. package/build/src/_enums/fam-rule-scope.type-enum.js +25 -0
  22. package/build/src/_models/data-models/fam-entry.data-model.js +29 -0
  23. package/build/src/_models/data-models/fam-memory.data-model.js +5 -0
  24. package/build/src/_models/data-models/fam-rules.data-model.js +24 -0
  25. package/build/src/_models/data-models/fam-scan-job.data-model.js +73 -0
  26. package/build/src/_models/data-models/fam-scope.data-model.js +9 -0
  27. package/build/src/_modules/capture/_services/fam-auto-capture.control-service.js +1 -1
  28. package/build/src/_modules/embedding/_services/fam-dedup-warn.control-service.js +40 -0
  29. package/build/src/_modules/embedding/_services/fam-duplicate-scan.control-service.js +74 -16
  30. package/build/src/_modules/embedding/_services/fam-embedding-bootstrap.control-service.js +50 -0
  31. package/build/src/_modules/embedding/_services/fam-embedding-pipeline.control-service.js +32 -6
  32. package/build/src/_modules/embedding/_services/fam-embedding.control-service.js +142 -9
  33. package/build/src/_modules/embedding/_services/fam-entry.data-service.js +32 -1
  34. package/build/src/_modules/embedding/_services/fam-hydration-coordinator.control-service.js +159 -0
  35. package/build/src/_modules/embedding/_services/fam-lmstudio-embedding.provider.js +41 -4
  36. package/build/src/_modules/embedding/_services/fam-vector-search.control-service.js +67 -12
  37. package/build/src/_modules/embedding/index.js +5 -1
  38. package/build/src/_modules/ingest/_collections/fam-file-routing.util.js +10 -0
  39. package/build/src/_modules/ingest/_collections/fam-frontmatter.util.js +134 -0
  40. package/build/src/_modules/ingest/_collections/fam-project-identity.util.js +30 -0
  41. package/build/src/_modules/ingest/_collections/fam-scan-progress.util.js +5 -2
  42. package/build/src/_modules/ingest/_collections/fam-scan-summary.util.js +55 -29
  43. package/build/src/_modules/ingest/_collections/fam-split-chunker.util.js +139 -0
  44. package/build/src/_modules/ingest/_models/interfaces/fam-scan-job.interface.js +2 -0
  45. package/build/src/_modules/ingest/_services/fam-chunker.control-service.js +10 -0
  46. package/build/src/_modules/ingest/_services/fam-delta-compare.util.js +68 -1
  47. package/build/src/_modules/ingest/_services/fam-ingest-run.data-service.js +1 -1
  48. package/build/src/_modules/ingest/_services/fam-ingest.control-service.js +177 -37
  49. package/build/src/_modules/ingest/_services/fam-scan-job.control-service.js +429 -0
  50. package/build/src/_modules/ingest/_services/fam-scan-job.data-service.js +34 -0
  51. package/build/src/_modules/ingest/_services/fam-scan.control-service.js +6 -4
  52. package/build/src/_modules/ingest/index.js +6 -1
  53. package/build/src/_modules/mcp/_collections/fam-core-tools.const.js +1 -1
  54. package/build/src/_modules/mcp/_services/fam-capability-registry.service.js +264 -41
  55. package/build/src/_modules/mcp/_services/fam-read-tool.service.js +71 -1
  56. package/build/src/_modules/mcp/_services/fam-write-tool.service.js +36 -0
  57. package/build/src/_modules/migration/_services/fam-claude-mem-import.control-service.js +1 -1
  58. package/build/src/_modules/retrieval/_collections/fam-lexical-match.util.js +69 -0
  59. package/build/src/_modules/retrieval/_collections/fam-memory-activation.util.js +66 -0
  60. package/build/src/_modules/retrieval/_collections/fam-rule-injection.util.js +125 -0
  61. package/build/src/_modules/retrieval/_collections/fam-rule-propagation.util.js +95 -0
  62. package/build/src/_modules/retrieval/_collections/fam-rule-scope-context.util.js +74 -0
  63. package/build/src/_modules/retrieval/_services/fam-global-rule.control-service.js +82 -0
  64. package/build/src/_modules/retrieval/_services/fam-memory-cold-search.control-service.js +121 -0
  65. package/build/src/_modules/retrieval/_services/fam-memory-dormancy.control-service.js +99 -0
  66. package/build/src/_modules/retrieval/_services/fam-memory-reactivation.control-service.js +68 -0
  67. package/build/src/_modules/retrieval/_services/fam-retrieval-candidate.data-service.js +15 -2
  68. package/build/src/_modules/retrieval/_services/fam-retrieval.control-service.js +197 -5
  69. package/build/src/_modules/retrieval/_services/fam-rule-injection.control-service.js +102 -0
  70. package/build/src/_modules/retrieval/index.js +12 -1
  71. package/build/src/_modules/scope-reference/_collections/fam-scope-maintenance.util.js +134 -0
  72. package/build/src/_modules/scope-reference/_services/fam-scope-maintenance.control-service.js +423 -0
  73. package/build/src/_modules/scope-reference/_services/fam-scope-resolver.control-service.js +2 -2
  74. package/build/src/_modules/scope-reference/_services/fam-scope.data-service.js +25 -0
  75. package/build/src/_modules/scope-reference/index.js +4 -1
  76. package/build/src/_routes/server/api/api.controller.js +324 -23
  77. package/build/src/_routes/server/api/fam-doctor.control-service.js +156 -0
  78. package/build/src/_routes/server/config/config.control-service.js +2 -2
  79. package/build/src/app.server.js +29 -27
  80. package/client-dist/{chunk-YXHWCJ5O.js → chunk-GF3FJP7E.js} +71 -71
  81. package/client-dist/chunk-NMUCMQY6.js +1 -0
  82. package/client-dist/favicon.ico +0 -0
  83. package/client-dist/index.html +3 -3
  84. package/client-dist/main-YK4YIVAQ.js +2 -0
  85. package/package.json +2 -2
  86. package/build/src/_cli/_collections/fam-project-discovery.util.js +0 -98
  87. package/build/src/_collections/fam-heap-guard.control-service.js +0 -176
  88. package/client-dist/chunk-I77GXVAQ.js +0 -1
  89. package/client-dist/main-PJPEDVJT.js +0 -2
@@ -0,0 +1 @@
1
+ import{$ as be,A as xe,Aa as X,B as Y,C as E,D as $,E as o,F as a,G as W,Ga as J,H as oe,I as T,Ia as de,J as u,K as c,Ka as A,L as re,La as Le,M as s,Ma as G,N as V,O as f,P as z,Q as ee,R as ke,S as v,T as w,U as S,V as B,W as I,X as ae,Y as Fe,Z as j,_ as O,a as R,aa as Ve,b as Q,ba as he,ca as le,d as b,da as Ce,ea as L,i as ge,k as F,l as D,m as fe,n as m,na as ye,o as _,p as Ee,pa as se,qa as q,ra as P,s as l,sa as ve,t as y,ta as Z,u as C,ua as K,v as M,va as H,w as k,wa as Ie,x as $e,xa as we,y as N,ya as Se,z as x,za as Me}from"./chunk-GF3FJP7E.js";var h=function(i){return i.rules="rules",i.documents="documents",i.codebase="codebase",i.knowledge="knowledge",i.codingPatterns="coding_patterns",i.memory="memory",i.reference="reference",i}(h||{});var U={[h.rules]:"Rules",[h.documents]:"Documents",[h.codebase]:"Codebase",[h.knowledge]:"Knowledge",[h.codingPatterns]:"Coding Patterns",[h.memory]:"Memory",[h.reference]:"Reference"},Te={[h.rules]:"glob\xE1lis / projekt-bound",[h.documents]:"projekt-bound",[h.codebase]:"projekt-bound",[h.knowledge]:"glob\xE1lis / domain",[h.codingPatterns]:"glob\xE1lis",[h.memory]:"session / projekt-bound",[h.reference]:"helper (alias \u2192 canonical)"},te=[h.rules,h.documents,h.codebase,h.knowledge,h.codingPatterns,h.memory],Pe={[h.rules]:["coding","architecture","naming","behavior","security","project"],[h.documents]:["spec","feature_request","bug_report","architecture_doc","dev_note","meeting_note","research_note"],[h.codebase]:["source_file","symbol","function","class","interface","config","dataflow","runflow","module_summary"],[h.knowledge]:["fact","concept","definition","relationship","domain_knowledge","company_knowledge","user_knowledge","decision_rationale"],[h.codingPatterns]:["pattern","anti_pattern","recipe","example","template","migration_pattern","debugging_pattern"],[h.memory]:["session_history","development_history","decision_history","incident","lesson_learned","important_note","user_preference","project_event","temporary_context","resolved_issue"]};var De=(i,d)=>d._id,Ge=()=>["/maintenance"];function Ue(i,d){if(i&1&&(o(0,"option",8),s(1),a()),i&2){let e=d.$implicit,t=c();k("value",e),l(),V(t.tableLabel(e))}}function Qe(i,d){i&1&&(o(0,"div",9),s(1,"Loading\u2026"),a())}function Ze(i,d){if(i&1&&s(0),i&2){let e=c().$implicit;ke(" \xB7 new ",e.verdicts.new," / mod ",e.verdicts.modified," / eq ",e.verdicts.equal," / del ",e.verdicts.deleted," ")}}function Je(i,d){if(i&1){let e=T();o(0,"button",25),u("click",function(){m(e);let n=c().$implicit,r=c(2);return _(r.viewRunErrors(n))}),s(1,"errors"),a()}}function Ye(i,d){if(i&1&&(o(0,"div",26),s(1),a()),i&2){let e,t=d.$implicit;l(),ke(" ",(e=t.sourceFilePath)!==null&&e!==void 0?e:"(no path)"," [",t.chunkIndex,"/",t.chunkTotal,"] \u2014 ",t.content==null?null:t.content.slice(0,80),"\u2026 ")}}function et(i,d){i&1&&(o(0,"div",27),s(1,"Nincs chunk ehhez a run-hoz."),a())}function tt(i,d){if(i&1&&(o(0,"div",24),E(1,Ye,2,4,"div",26,De,!1,et,2,0,"div",27),a()),i&2){let e,t=c().$implicit,n=c(2);M("data-testid","ma-ingest-chunks-"+t._id),l(),$(n.chunksFor((e=t._id)!==null&&e!==void 0?e:""))}}function nt(i,d){if(i&1){let e=T();o(0,"div",13)(1,"div",14)(2,"div",15)(3,"span",16),s(4),a(),o(5,"span",17),s(6),j(7,"date"),a(),o(8,"div",18),s(9),C(10,Ze,1,4),s(11),a()(),o(12,"div",19)(13,"span",20),s(14),a(),C(15,Je,2,0,"button",21),o(16,"button",22),u("click",function(){let n=m(e).$implicit,r=c(2);return _(r.toggleRun(n))}),s(17),a(),o(18,"button",23),u("click",function(){let n=m(e).$implicit,r=c(2);return _(r.deleteRun(n))}),s(19,"delete"),a()()(),C(20,tt,4,2,"div",24),a()}if(i&2){let e,t,n,r,p,g=d.$implicit,ie=c(2);N("border-red-700",ie.isFailed(g))("border-neutral-800",!ie.isFailed(g)),M("data-testid","ma-ingest-run-"+g._id),l(4),V((e=g.trigger)!==null&&e!==void 0?e:"\u2014"),l(2),z(" \xB7 ",ie.tableLabel(g.table)," \xB7 ",g.__created?O(7,23,g.__created,"short"):"\u2014",""),l(3),ee(" files ",(t=g.filesProcessed)!==null&&t!==void 0?t:0," (skip ",(t=g.filesSkipped)!==null&&t!==void 0?t:0,") \xB7 chunks ",(t=g.chunkCount)!==null&&t!==void 0?t:0," "),l(),x(g.verdicts?10:-1),l(),f(" \xB7 cost ",g.embedTokenCost!==void 0?g.embedTokenCost:"n/a"," "),l(2),N("bg-emerald-700",g.status==="ok")("bg-red-700",ie.isFailed(g)),M("data-testid","ma-ingest-status-"+g._id),l(),f(" ",(n=g.status)!==null&&n!==void 0?n:"ok"," "),l(),x(ie.isFailed(g)?15:-1),l(),M("data-testid","ma-ingest-expand-"+g._id),l(),f(" ",ie.isExpanded((r=g._id)!==null&&r!==void 0?r:"")?"collapse":"expand"," "),l(3),x(ie.isExpanded((p=g._id)!==null&&p!==void 0?p:"")?20:-1)}}function it(i,d){i&1&&(o(0,"div",12),s(1,"Nincs ingest-run."),a())}function at(i,d){if(i&1&&(o(0,"div",10),E(1,nt,21,26,"div",11,De,!1,it,2,0,"div",12),a()),i&2){let e=c();l(),$(e.runs_$())}}var Be=(()=>{class i{api=F(A);router=F(se);notify=F(J);popup=F(de);mainTables=te;runs_$=y([]);loading_$=y(!0);tableFilter="";expanded_$=y(new Set);runChunks_$=y({});ngOnInit(){return b(this,null,function*(){yield this.load()})}load(){return b(this,null,function*(){this.loading_$.set(!0);let e=yield this.api.getIngestRuns(this.tableFilter||void 0);if(e.error){this.notify.newErrorMessage(`${e.error.errorCode}: ${e.error.message}`),this.loading_$.set(!1);return}this.runs_$.set(e.data?.runs??[]),this.loading_$.set(!1)})}tableLabel(e){return e?Array.isArray(e)?e.map(t=>U[t]).join(", "):U[e]:"\u2014"}isExpanded(e){return this.expanded_$().has(e)}toggleRun(e){return b(this,null,function*(){let t=e._id??"",n=new Set(this.expanded_$());if(n.has(t)){n.delete(t),this.expanded_$.set(n);return}n.add(t),this.expanded_$.set(n);let r=Array.isArray(e.table)?e.table[0]:e.table;if(!r)return;let p=yield this.api.getItems(r,{ingestRunId:t,pageSize:200});p.data&&this.runChunks_$.set(Q(R({},this.runChunks_$()),{[t]:p.data.items}))})}chunksFor(e){return this.runChunks_$()[e]??[]}isFailed(e){return e.status==="failed"||e.status==="partial-failed"}deleteRun(e){return b(this,null,function*(){if(!(yield this.popup.newConfirm({title:"Run csoportos soft-delete",message:`A(z) ${e._id} run minden chunkja t\xF6rl\xE9sre ker\xFCl (soft-delete). Folytatod?`,confirmBtn:"Delete run"})))return;let n=yield this.api.invokeCapability("delete_ingest_run",{ingestRunId:e._id});if(n.error){this.notify.newErrorMessage(`${n.error.errorCode}: ${n.error.message}`);return}this.notify.newSuccessMessage("Run t\xF6r\xF6lve (soft-delete)."),yield this.load()})}viewRunErrors(e){this.router.navigate(["/errors"],{queryParams:{ingestRunId:e._id}})}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=D({type:i,selectors:[["ma-ingest-timeline"]],standalone:!0,features:[B],decls:16,vars:4,consts:[["data-testid","ma-ingest-timeline",1,"mx-auto","max-w-5xl","p-6"],[1,"mb-4","block"],[1,"mb-4","flex","items-center","justify-between"],[1,"text-sm","opacity-60","hover:underline",3,"routerLink"],[1,"text-2xl","font-semibold"],[1,"flex","items-center","gap-2","text-sm"],["data-testid","ma-ingest-table-filter",1,"rounded","border","border-neutral-700","bg-neutral-900","px-2","py-1",3,"ngModelChange","ngModel"],["value",""],[3,"value"],["data-testid","ma-ingest-loading",1,"py-10","text-center","opacity-60"],["data-testid","ma-ingest-list",1,"flex","flex-col","gap-2"],[1,"rounded","border","bg-neutral-900",3,"border-red-700","border-neutral-800"],[1,"py-6","text-center","opacity-50"],[1,"rounded","border","bg-neutral-900"],[1,"flex","items-center","justify-between","px-3","py-2","text-sm"],[1,"flex-1"],[1,"font-medium"],[1,"opacity-50"],[1,"mt-1","text-xs","opacity-60"],[1,"flex","items-center","gap-2"],[1,"rounded","px-2","py-0.5","text-xs"],[1,"rounded","px-2","py-1","text-xs","text-red-300","hover:bg-neutral-800"],[1,"rounded","px-2","py-1","text-xs","hover:bg-neutral-800",3,"click"],[1,"rounded","px-2","py-1","text-xs","text-red-400","hover:bg-neutral-800",3,"click"],[1,"border-t","border-neutral-800","p-2"],[1,"rounded","px-2","py-1","text-xs","text-red-300","hover:bg-neutral-800",3,"click"],[1,"rounded","px-2","py-1","text-xs","opacity-80"],[1,"py-2","text-center","text-xs","opacity-40"]],template:function(t,n){t&1&&(o(0,"div",0),W(1,"ma-banner-host",1),o(2,"div",2)(3,"div")(4,"a",3),s(5,"\u2190 Maintenance"),a(),o(6,"h1",4),s(7,"Ingest timeline"),a()(),o(8,"div",5)(9,"select",6),S("ngModelChange",function(p){return w(n.tableFilter,p)||(n.tableFilter=p),p}),u("ngModelChange",function(){return n.load()}),o(10,"option",7),s(11,"\xF6sszes t\xE1r"),a(),E(12,Ue,2,2,"option",8,Y),a()()(),C(14,Qe,2,0,"div",9)(15,at,4,1,"div",10),a()),t&2&&(l(4),k("routerLink",I(3,Ge)),l(5),v("ngModel",n.tableFilter),l(3),$(n.mainTables),l(2),x(n.loading_$()?14:15))},dependencies:[L,le,X,Se,Me,we,K,H,P,q,G],encapsulation:2})}return i})();var ot=(i,d)=>d.table,rt=()=>["/maintenance/search"],Ae=()=>["/maintenance/scopes"],lt=()=>["/maintenance/ingest"],st=()=>["/maintenance/settings"],dt=()=>["/errors"],ct=i=>["/maintenance",i];function pt(i,d){i&1&&(o(0,"div",7),s(1," A FAM szerver nem el\xE9rhet\u0151 (port 39185). Ind\xEDtsd el a szervert, majd friss\xEDts. "),a())}function mt(i,d){i&1&&(o(0,"div",8),s(1,"Loading\u2026"),a())}function _t(i,d){i&1&&(o(0,"div",19)(1,"span",21),s(2,"Add first entry"),a(),o(3,"span",21),s(4,"Run scan"),a()())}function ut(i,d){i&1&&(o(0,"div",20),s(1,"Configure embedding \u2192 Settings"),a())}function gt(i,d){if(i&1&&(o(0,"a",10)(1,"div",12)(2,"span",13),s(3),a(),o(4,"span",14),s(5),a()(),o(6,"div",15),s(7),a(),o(8,"div",16),s(9),j(10,"date"),a(),o(11,"div",17),s(12),a(),o(13,"div",18),s(14),a(),C(15,_t,5,0,"div",19)(16,ut,2,0,"div",20),a()),i&2){let e=d.$implicit;k("routerLink",ae(20,ct,e.table)),M("data-testid","ma-table-card-"+e.table),l(3),V(e.label),l(),N("bg-neutral-700",e.status==="empty")("bg-red-700",e.status==="bootstrap-skip"||e.status==="config-error")("bg-emerald-700",e.status==="ok"),M("data-testid","ma-table-status-"+e.table),l(),f(" ",e.status," "),l(2),f("",e.count," bejegyz\xE9s"),l(2),f(" utols\xF3 ingest: ",e.lastIngest?O(10,17,e.lastIngest,"short"):"\u2014"," "),l(3),f("embedding: ",e.embeddingState,""),l(2),f("scope: ",e.scopeHint,""),l(),x(e.status==="empty"?15:-1),l(),x(e.status==="bootstrap-skip"?16:-1)}}function ft(i,d){if(i&1&&(o(0,"div",11)(1,"h2",22),s(2,"Helper (nem kereshet\u0151 t\xE1r)"),a(),o(3,"a",23)(4,"div",12)(5,"span",13),s(6),a(),o(7,"span",24),s(8,"helper"),a()(),o(9,"div",15),s(10),a(),o(11,"div",25),s(12,"alias \u2192 canonical felold\xE1s \xB7 scope-fa kezel\xE9s"),a()()()),i&2){let e=d;l(3),k("routerLink",I(3,Ae)),l(3),V(e.label),l(4),f("",e.count," reference-bejegyz\xE9s")}}function xt(i,d){if(i&1&&(o(0,"div",9),E(1,gt,17,22,"a",10,ot),a(),C(3,ft,13,4,"div",11)),i&2){let e,t=c();l(),$(t.cards_$()),l(2),x((e=t.referenceCard_$())?3:-1,e)}}var Re=(()=>{class i{api=F(A);adminState=F(Le);loading_$=y(!0);cards_$=y([]);referenceCard_$=y(null);get serverUnreachable_$(){return this.adminState.serverUnreachable_$}totalEntries_$=Ve(()=>this.cards_$().reduce((e,t)=>e+t.count,0));ngOnInit(){return b(this,null,function*(){this.adminState.startPolling(),yield this.load()})}load(){return b(this,null,function*(){this.loading_$.set(!0);let e=yield this.api.getStats();if(e.error){this.adminState.pushBanner({key:"landing-stats-error",color:"red",title:"T\xE1r-statisztika nem el\xE9rhet\u0151",message:`${e.error.errorCode}: ${e.error.message}`,errorsLink:!0}),this.loading_$.set(!1);return}let t={};for(let r of e.data?.tables??[])t[r.table]=r;let n=[];for(let r of te)n.push(yield this.buildCard(r,t[r]));this.cards_$.set(n),this.referenceCard_$.set(yield this.buildReferenceCard()),this.loading_$.set(!1)})}buildCard(e,t){return b(this,null,function*(){let n=t?.count??0,r=yield this.resolveEmbeddingState(e),p=this.deriveStatus(n,r);return{table:e,label:U[e],scopeHint:Te[e],count:n,lastIngest:t?.lastModified??null,status:p,embeddingState:r}})}buildReferenceCard(){return b(this,null,function*(){let t=(yield this.api.invokeCapability("get_reference_stats")).data??{},n=t.count??t.total??0;return{table:h.reference,label:U[h.reference],scopeHint:Te[h.reference],count:n,lastIngest:null,status:n?"ok":"empty",embeddingState:"helper (alias-resolve)"}})}resolveEmbeddingState(e){return b(this,null,function*(){let t=yield this.api.getConfig(e);if(t.error||!t.data)return"nincs (config nem el\xE9rhet\u0151)";let n=t.data,r=n.effective["embedding.provider"],p=n.effective["embedding.model"];if(!r||r.value===null||r.value==="")return"nincs konfigur\xE1lva";let g=r.resolvedFrom==="builtin"||r.resolvedFrom==="global"?"global default":r.resolvedFrom;return`${r.value}${p?.value?" / "+p.value:""} (${g})`})}deriveStatus(e,t){return t.startsWith("nincs")?"bootstrap-skip":e?"ok":"empty"}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=D({type:i,selectors:[["ma-landing"]],standalone:!0,features:[B],decls:22,vars:13,consts:[["data-testid","ma-landing",1,"mx-auto","max-w-6xl","p-6"],[1,"mb-4","block"],[1,"mb-6","flex","items-end","justify-between"],[1,"text-2xl","font-semibold"],[1,"text-sm","opacity-60"],[1,"flex","gap-2","text-sm"],[1,"rounded","border","border-neutral-700","px-3","py-1","hover:bg-neutral-800",3,"routerLink"],["data-testid","ma-landing-unreachable",1,"mb-4","rounded","border","border-red-600","bg-red-950","px-4","py-3","text-sm","text-red-200"],["data-testid","ma-landing-loading",1,"py-10","text-center","opacity-60"],["data-testid","ma-landing-cards",1,"grid","grid-cols-1","gap-4","sm:grid-cols-2","lg:grid-cols-3"],[1,"block","rounded-lg","border","border-neutral-800","bg-neutral-900","p-4","transition","hover:border-neutral-600",3,"routerLink"],[1,"mt-8"],[1,"flex","items-center","justify-between"],[1,"text-lg","font-medium"],[1,"rounded-full","px-2","py-0.5","text-xs"],[1,"mt-2","text-sm","opacity-70"],[1,"text-xs","opacity-50"],[1,"mt-2","text-xs","opacity-60"],[1,"text-xs","opacity-40"],[1,"mt-3","flex","gap-2","text-xs"],[1,"mt-3","text-xs","text-red-300"],[1,"rounded","border","border-neutral-700","px-2","py-1"],[1,"mb-2","text-sm","uppercase","tracking-wide","opacity-50"],["data-testid","ma-reference-card",1,"block","max-w-sm","rounded-lg","border","border-dashed","border-amber-700/60","bg-neutral-900","p-4","hover:border-amber-500",3,"routerLink"],[1,"rounded-full","bg-amber-800","px-2","py-0.5","text-xs"],[1,"mt-1","text-xs","opacity-50"]],template:function(t,n){t&1&&(o(0,"div",0),W(1,"ma-banner-host",1),o(2,"div",2)(3,"div")(4,"h1",3),s(5,"FDP Agent Memory \u2014 Maintenance"),a(),o(6,"p",4),s(7),a()(),o(8,"div",5)(9,"a",6),s(10,"Search"),a(),o(11,"a",6),s(12,"Scopes"),a(),o(13,"a",6),s(14,"Ingest"),a(),o(15,"a",6),s(16,"Settings"),a(),o(17,"a",6),s(18,"Errors"),a()()(),C(19,pt,2,0,"div",7)(20,mt,2,0,"div",8)(21,xt,4,1),a()),t&2&&(l(7),f("6 f\u0151 RAG-t\xE1r + reference helper \xB7 ",n.totalEntries_$()," bejegyz\xE9s"),l(2),k("routerLink",I(8,rt)),l(2),k("routerLink",I(9,Ae)),l(2),k("routerLink",I(10,lt)),l(2),k("routerLink",I(11,st)),l(2),k("routerLink",I(12,dt)),l(2),x(n.serverUnreachable_$()?19:-1),l(),x(n.loading_$()?20:21))},dependencies:[L,le,P,q,G],encapsulation:2})}return i})();var Ne=(i,d)=>d.scopeId,bt=(i,d)=>d._id,ht=()=>["/maintenance"],Ct=i=>({$implicit:i,depth:0}),yt=()=>[],vt=(i,d)=>({$implicit:i,depth:d});function wt(i,d){i&1&&(o(0,"div",9),s(1,"Loading\u2026"),a())}function St(i,d){if(i&1&&oe(0,13),i&2){let e=d.$implicit;c(2);let t=re(16);k("ngTemplateOutlet",t)("ngTemplateOutletContext",ae(2,Ct,e))}}function Mt(i,d){i&1&&(o(0,"div",14),s(1,"Nincs scope (a write/scan auto-regisztr\xE1lja)."),a())}function kt(i,d){if(i&1&&(o(0,"div",22),s(1),a()),i&2){let e=c();l(),f("aliases: ",e.aliases==null?null:e.aliases.join(", "),"")}}function Tt(i,d){if(i&1){let e=T();o(0,"div",15)(1,"div",20),s(2),a(),o(3,"div",21),s(4),a(),C(5,kt,2,1,"div",22),o(6,"button",23),u("click",function(){let n=m(e),r=c(2);return _(r.viewEntries(n))}),s(7,"View entries"),a()()}if(i&2){let e,t=d;l(2),V(t.canonicalName),l(2),z("layer: ",t.layer," \xB7 ",(e=t.entryCount)!==null&&e!==void 0?e:0," entry"),l(),x(t.aliases!=null&&t.aliases.length?5:-1)}}function Et(i,d){if(i&1&&s(0),i&2){let e=c().$implicit;f(" category: ",e.category," \xB7 ")}}function $t(i,d){if(i&1&&s(0),i&2){let e=c().$implicit;f(" layer: ",e.scopeLayer," \xB7 ")}}function Ft(i,d){if(i&1&&s(0),i&2){let e=c().$implicit;f(" t\xE1rak: ",e.ragScopes==null?null:e.ragScopes.join(", ")," ")}}function Vt(i,d){if(i&1){let e=T();o(0,"div",17)(1,"div",24)(2,"div",25)(3,"div",20)(4,"span",26),s(5),a(),s(6),a(),o(7,"div",27),C(8,Et,1,1)(9,$t,1,1)(10,Ft,1,1),a()(),o(11,"div",28)(12,"button",29),u("click",function(){let n=m(e).$implicit,r=c(2);return _(r.openEditForm(n))}),s(13,"edit"),a(),o(14,"button",29),u("click",function(){let n=m(e).$implicit,r=c(2);return _(r.toggleActive(n))}),s(15),a()()()()}if(i&2){let e,t=d.$implicit;M("data-testid","ma-reference-"+t._id),l(3),N("opacity-40",!t.isActive),l(2),V(((e=t.aliasTerms)!==null&&e!==void 0?e:I(14,yt)).join(" / ")),l(),f(" \u2192 ",t.canonicalTerm," "),l(2),x(t.category?8:-1),l(),x(t.scopeLayer?9:-1),l(),x(t.ragScopes!=null&&t.ragScopes.length?10:-1),l(4),N("text-emerald-400",!t.isActive)("text-amber-400",t.isActive),M("data-testid","ma-reference-toggle-"+t._id),l(),f(" ",t.isActive?"deactivate":"activate"," ")}}function It(i,d){i&1&&(o(0,"div",18),s(1,"Nincs reference-bejegyz\xE9s."),a())}function Lt(i,d){if(i&1){let e=T();o(0,"div",19)(1,"h3",30),s(2),a(),o(3,"input",31),S("ngModelChange",function(n){m(e);let r=c(2);return w(r.formCanonical,n)||(r.formCanonical=n),_(n)}),a(),o(4,"input",32),S("ngModelChange",function(n){m(e);let r=c(2);return w(r.formAliases,n)||(r.formAliases=n),_(n)}),a(),o(5,"textarea",33),S("ngModelChange",function(n){m(e);let r=c(2);return w(r.formDescription,n)||(r.formDescription=n),_(n)}),a(),o(6,"div",34)(7,"input",35),S("ngModelChange",function(n){m(e);let r=c(2);return w(r.formCategory,n)||(r.formCategory=n),_(n)}),a(),o(8,"input",36),S("ngModelChange",function(n){m(e);let r=c(2);return w(r.formScopeLayer,n)||(r.formScopeLayer=n),_(n)}),a()(),o(9,"input",37),S("ngModelChange",function(n){m(e);let r=c(2);return w(r.formRagScopes,n)||(r.formRagScopes=n),_(n)}),a(),o(10,"div",38)(11,"button",39),u("click",function(){m(e);let n=c(2);return _(n.submitForm())}),s(12,"Save"),a(),o(13,"button",40),u("click",function(){m(e);let n=c(2);return _(n.formOpen_$.set(!1))}),s(14,"Cancel"),a()()()}if(i&2){let e=c(2);l(2),V(e.editId?"Edit reference":"New reference"),l(),v("ngModel",e.formCanonical),l(),v("ngModel",e.formAliases),l(),v("ngModel",e.formDescription),l(2),v("ngModel",e.formCategory),l(),v("ngModel",e.formScopeLayer),l(),v("ngModel",e.formRagScopes)}}function Pt(i,d){if(i&1&&(o(0,"div",10)(1,"div")(2,"h2",11),s(3,"Scope tree"),a(),o(4,"div",12),E(5,St,1,4,"ng-container",13,Ne,!1,Mt,2,0,"div",14),a(),C(8,Tt,8,4,"div",15),a(),o(9,"div")(10,"h2",11),s(11,"Reference (alias \u2192 canonical)"),a(),o(12,"div",16),E(13,Vt,16,15,"div",17,bt,!1,It,2,0,"div",18),a()()(),C(16,Lt,15,7,"div",19)),i&2){let e,t=c();l(5),$(t.scopeTree_$()),l(3),x((e=t.selectedNode_$())?8:-1,e),l(5),$(t.references_$()),l(3),x(t.formOpen_$()?16:-1)}}function Dt(i,d){if(i&1&&oe(0,13),i&2){let e=d.$implicit,t=c().depth;c();let n=re(16);k("ngTemplateOutlet",n)("ngTemplateOutletContext",Fe(2,vt,e,t+1))}}function Bt(i,d){if(i&1){let e=T();o(0,"div")(1,"button",41),u("click",function(){let n=m(e).$implicit,r=c();return _(r.selectNode(n))}),o(2,"span",42),s(3),a(),s(4),o(5,"span",43),s(6),a()(),E(7,Dt,1,5,"ng-container",13,Ne),a()}if(i&2){let e,t=d.$implicit,n=d.depth;l(),$e("padding-left",8+n*16,"px"),M("data-testid","ma-scope-node-"+t.scopeId),l(2),f("",t.layer,":"),l(),f(" ",t.canonicalName," "),l(2),f("(",(e=t.entryCount)!==null&&e!==void 0?e:0,")"),l(),$(t.children)}}var We=(()=>{class i{api=F(A);route=F(ye);router=F(se);notify=F(J);popup=F(de);scopeTree_$=y([]);selectedNode_$=y(null);references_$=y([]);loading_$=y(!0);formOpen_$=y(!1);editId=null;formCanonical="";formAliases="";formDescription="";formCategory="";formScopeLayer="";formRagScopes="";focusScopeId=null;ngOnInit(){return b(this,null,function*(){this.focusScopeId=this.route.snapshot.queryParamMap.get("focus"),yield this.load()})}load(){return b(this,null,function*(){this.loading_$.set(!0),yield Promise.all([this.loadScopeTree(),this.loadReferences()]),this.loading_$.set(!1),this.focusScopeId&&this.focusNode(this.focusScopeId)})}loadScopeTree(){return b(this,null,function*(){let e=yield this.api.invokeCapability("get_scope_tree");if(e.error)return;let t=e.data??{};this.scopeTree_$.set(t.tree??t.nodes??[])})}loadReferences(){return b(this,null,function*(){let e=yield this.api.invokeCapability("get_reference_stats");if(e.error)return;let t=e.data??{};this.references_$.set(t.references??t.items??[])})}selectNode(e){this.selectedNode_$.set(e)}focusNode(e){let t=this.findNode(this.scopeTree_$(),e);t&&this.selectedNode_$.set(t)}findNode(e,t){for(let n of e){if(n.scopeId===t)return n;let r=this.findNode(n.children??[],t);if(r)return r}return null}viewEntries(e){this.router.navigate(["/maintenance"],{queryParams:{scope:e.scopeId}})}openNewForm(){this.editId=null,this.formCanonical="",this.formAliases="",this.formDescription="",this.formCategory="",this.formScopeLayer="",this.formRagScopes="",this.formOpen_$.set(!0)}openEditForm(e){this.editId=e._id??null,this.formCanonical=e.canonicalTerm,this.formAliases=(e.aliasTerms??[]).join(", "),this.formDescription=e.description??"",this.formCategory=e.category??"",this.formScopeLayer=e.scopeLayer??"",this.formRagScopes=(e.ragScopes??[]).join(", "),this.formOpen_$.set(!0)}submitForm(){return b(this,null,function*(){if(!this.formCanonical.trim()){this.notify.newErrorMessage("A canonical term k\xF6telez\u0151.");return}let e={canonicalTerm:this.formCanonical,aliasTerms:this.parseCsv(this.formAliases),description:this.formDescription||void 0,category:this.formCategory||void 0,scopeLayer:this.formScopeLayer||void 0,ragScopes:this.parseCsv(this.formRagScopes)},t=yield this.api.invokeCapability(this.editId?"update_reference":"create_reference",R({id:this.editId??void 0},e));if(t.error){this.notify.newErrorMessage(`${t.error.errorCode}: ${t.error.message}`);return}this.notify.newSuccessMessage(this.editId?"Reference friss\xEDtve.":"Reference l\xE9trehozva."),this.formOpen_$.set(!1),yield this.loadReferences(),yield this.suggestRebuild()})}toggleActive(e){return b(this,null,function*(){let t=yield this.api.invokeCapability("toggle_reference",{id:e._id,isActive:!e.isActive});if(t.error){this.notify.newErrorMessage(`${t.error.errorCode}: ${t.error.message}`);return}this.notify.newSuccessMessage(`Reference ${e.isActive?"inaktiv\xE1lva":"aktiv\xE1lva"}.`),yield this.loadReferences(),yield this.suggestRebuild()})}rebuildIndex(){return b(this,null,function*(){let e=yield this.api.invokeCapability("rebuild_reference_index");if(e.error){this.notify.newErrorMessage(`${e.error.errorCode}: ${e.error.message}`);return}this.notify.newSuccessMessage("Reference-index \xFAjra\xE9p\xEDtve.")})}suggestRebuild(){return b(this,null,function*(){(yield this.popup.newConfirm({title:"Reference-index rebuild",message:"A reference-cache TTL-es (60s). Most \xFAjra\xE9p\xEDtsem az indexet, hogy a v\xE1ltoz\xE1s azonnal hasson?",confirmBtn:"Rebuild now"}))&&(yield this.rebuildIndex())})}parseCsv(e){return(e??"").split(",").map(t=>t.trim()).filter(t=>t.length)}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=D({type:i,selectors:[["ma-scopes"]],standalone:!0,features:[B],decls:17,vars:3,consts:[["scopeNode",""],["data-testid","ma-scopes",1,"mx-auto","max-w-6xl","p-6"],[1,"mb-4","block"],[1,"mb-4","flex","items-center","justify-between"],[1,"text-sm","opacity-60","hover:underline",3,"routerLink"],[1,"text-2xl","font-semibold"],[1,"flex","gap-2","text-sm"],["data-testid","ma-scopes-new-ref",1,"rounded","border","border-neutral-700","px-3","py-1","hover:bg-neutral-800",3,"click"],["data-testid","ma-scopes-rebuild",1,"rounded","border","border-neutral-700","px-3","py-1","hover:bg-neutral-800",3,"click"],["data-testid","ma-scopes-loading",1,"py-10","text-center","opacity-60"],[1,"grid","grid-cols-1","gap-6","lg:grid-cols-2"],[1,"mb-2","text-sm","uppercase","tracking-wide","opacity-50"],["data-testid","ma-scope-tree",1,"rounded","border","border-neutral-800","bg-neutral-900","p-3"],[3,"ngTemplateOutlet","ngTemplateOutletContext"],[1,"py-4","text-center","text-sm","opacity-50"],["data-testid","ma-scope-detail",1,"mt-3","rounded","border","border-neutral-800","bg-neutral-900","p-3","text-sm"],["data-testid","ma-reference-list",1,"flex","flex-col","gap-2"],[1,"rounded","border","border-neutral-800","bg-neutral-900","p-3","text-sm"],[1,"py-4","text-center","opacity-50"],["data-testid","ma-reference-form",1,"mt-6","rounded","border","border-neutral-800","bg-neutral-900","p-4"],[1,"font-medium"],[1,"text-xs","opacity-60"],[1,"mt-1","text-xs","opacity-60"],["data-testid","ma-scope-view-entries",1,"mt-2","rounded","border","border-neutral-700","px-2","py-1","text-xs","hover:bg-neutral-800",3,"click"],[1,"flex","items-start","justify-between"],[1,"flex-1"],[1,"opacity-60"],[1,"mt-1","text-xs","opacity-50"],[1,"flex","gap-1"],[1,"rounded","px-2","py-1","text-xs","hover:bg-neutral-800",3,"click"],[1,"mb-3","font-medium"],["placeholder","canonical term","data-testid","ma-ref-canonical",1,"mb-2","w-full","rounded","border","border-neutral-700","bg-neutral-950","p-2","text-sm",3,"ngModelChange","ngModel"],["placeholder","aliases (typo / fonetikus / STT, vessz\u0151vel)","data-testid","ma-ref-aliases",1,"mb-2","w-full","rounded","border","border-neutral-700","bg-neutral-950","p-2","text-sm",3,"ngModelChange","ngModel"],["rows","2","placeholder","description",1,"mb-2","w-full","rounded","border","border-neutral-700","bg-neutral-950","p-2","text-sm",3,"ngModelChange","ngModel"],[1,"mb-2","flex","gap-2"],["placeholder","category",1,"flex-1","rounded","border","border-neutral-700","bg-neutral-950","p-2","text-sm",3,"ngModelChange","ngModel"],["placeholder","scope-layer (opc.)",1,"flex-1","rounded","border","border-neutral-700","bg-neutral-950","p-2","text-sm",3,"ngModelChange","ngModel"],["placeholder","ragScopes \u2014 mely t\xE1rakra (vessz\u0151vel, \xFCres = mind)",1,"mb-3","w-full","rounded","border","border-neutral-700","bg-neutral-950","p-2","text-sm",3,"ngModelChange","ngModel"],[1,"flex","gap-2"],["data-testid","ma-ref-submit",1,"rounded","bg-emerald-700","px-4","py-1","text-sm","hover:bg-emerald-600",3,"click"],[1,"rounded","border","border-neutral-700","px-4","py-1","text-sm","hover:bg-neutral-800",3,"click"],["type","button",1,"block","w-full","rounded","px-2","py-1","text-left","text-sm","hover:bg-neutral-800",3,"click"],[1,"opacity-50"],[1,"opacity-40"]],template:function(t,n){if(t&1){let r=T();o(0,"div",1),W(1,"ma-banner-host",2),o(2,"div",3)(3,"div")(4,"a",4),s(5,"\u2190 Maintenance"),a(),o(6,"h1",5),s(7,"Scopes & Reference"),a()(),o(8,"div",6)(9,"button",7),u("click",function(){return m(r),_(n.openNewForm())}),s(10,"New reference"),a(),o(11,"button",8),u("click",function(){return m(r),_(n.rebuildIndex())}),s(12,"Rebuild index"),a()()(),C(13,wt,2,0,"div",9)(14,Pt,17,4),a(),C(15,Bt,9,6,"ng-template",null,0,be)}t&2&&(l(4),k("routerLink",I(2,ht)),l(9),x(n.loading_$()?13:14))},dependencies:[L,he,X,Z,K,H,P,q,G],encapsulation:2})}return i})();var At=(i,d)=>d.query,Rt=(i,d)=>d.id,Nt=(i,d)=>d.rawToken,Wt=(i,d)=>d.scopeId,zt=()=>["/maintenance"];function jt(i,d){if(i&1){let e=T();o(0,"button",23),u("click",function(){let n=m(e).$implicit,r=c().$index,p=c();return _(p.toggleTable(r,n))}),s(1),a()}if(i&2){let e=d.$implicit,t=c().$index,n=c();N("bg-blue-700",n.isTableSelected(t,e))("bg-neutral-800",!n.isTableSelected(t,e)),M("data-testid","ma-search-table-"+t+"-"+e),l(),f(" ",n.tableLabel(e)," ")}}function Ot(i,d){if(i&1){let e=T();o(0,"div",6)(1,"div",18),E(2,jt,2,6,"button",19,Y),a(),o(4,"div",20)(5,"input",21),u("ngModelChange",function(n){let r=m(e).$index,p=c();return _(p.setQuery(r,n))}),a(),o(6,"button",22),u("click",function(){let n=m(e).$index,r=c();return _(r.removeRow(n))}),s(7,"remove"),a()()()}if(i&2){let e=d.$implicit,t=d.$index,n=c();l(2),$(n.mainTables),l(3),k("ngModel",e.query),M("data-testid","ma-search-query-"+t)}}function qt(i,d){i&1&&(o(0,"div",15),s(1,"Searching\u2026"),a())}function Kt(i,d){i&1&&(s(0," \xB7 "),o(1,"span",25),s(2,"relev\xE1ns elemek lemaradtak (truncated)"),a())}function Ht(i,d){if(i&1){let e=T();o(0,"button",36),u("click",function(){let n=m(e).$implicit,r=c(4);return _(r.applySuggestion(n))}),s(1),a()}if(i&2){let e=d.$implicit;M("data-testid","ma-search-suggestion"),l(),f(" ",e," ")}}function Xt(i,d){if(i&1&&(o(0,"div",34),E(1,Ht,2,2,"button",35,Y),a()),i&2){let e=c(2).$implicit;l(),$(e.suggestions)}}function Gt(i,d){if(i&1&&(o(0,"div",27)(1,"div",32),s(2,"S\u0171r\u0171 eredm\xE9ny \u2014 a query t\xFAl t\xE1g lehet"),a(),o(3,"div",33),s(4),C(5,Kt,3,0,"span",25),a(),C(6,Xt,3,0,"div",34),a()),i&2){let e=c().$implicit;M("data-testid","ma-search-dense-"+e.query),l(4),f(" ",e.totalRelevant," relev\xE1ns elem a minScore felett (topK el\u0151tt) "),l(),x(e.truncated?5:-1),l(),x(e.suggestions.length?6:-1)}}function Ut(i,d){if(i&1&&(o(0,"div"),s(1),j(2,"number"),a()),i&2){let e=d.$implicit;l(),ee('"',e.rawToken,'" \u2192 ',e.resolvedTo," (konfidencia: ",O(2,3,e.confidence,"1.2-2"),")")}}function Qt(i,d){if(i&1&&(o(0,"div",28),E(1,Ut,3,6,"div",null,Nt),a()),i&2){let e=c().$implicit;M("data-testid","ma-search-uncertainty"),l(),$(e.uncertaintyNotes)}}function Zt(i,d){if(i&1&&s(0),i&2){let e=c(2).$implicit;f(" path: ",e.headingPath==null?null:e.headingPath.join(" > ")," \xB7 ")}}function Jt(i,d){if(i&1&&s(0),i&2){let e=c(2).$implicit;z(" chars ",e.position.charStart,"\u2013",e.position.charEnd," \xB7 ")}}function Yt(i,d){if(i&1&&(o(0,"div",43),s(1),a(),o(2,"div",44),C(3,Zt,1,1)(4,Jt,1,2),s(5),a()),i&2){let e,t=c().$implicit;l(),V(t.content),l(2),x(t.headingPath!=null&&t.headingPath.length?3:-1),l(),x(t.position?4:-1),l(),z(" kind: ",(e=t.kind)!==null&&e!==void 0?e:"\u2014"," \xB7 tags: ",t.tags.join(", ")," ")}}function en(i,d){if(i&1&&(o(0,"div",39),s(1),a()),i&2){let e=c().$implicit;l(),V(e.content)}}function tn(i,d){if(i&1&&(o(0,"span",41),s(1),a()),i&2){let e=d.$implicit;l(),z("",e.layer,":",e.canonicalName,"")}}function nn(i,d){if(i&1){let e=T();o(0,"div",30)(1,"div",37)(2,"div",38),C(3,Yt,6,5)(4,en,2,1,"div",39),o(5,"div",40)(6,"span"),s(7),j(8,"number"),a(),o(9,"span"),s(10),a(),o(11,"span"),s(12),j(13,"number"),a(),o(14,"span"),s(15),a(),o(16,"span"),s(17),a(),E(18,tn,2,2,"span",41,Wt),a()(),o(20,"button",42),u("click",function(){let n=m(e).$implicit,r=c(2);return _(r.toggleExpand(n.id))}),s(21),a()()()}if(i&2){let e=d.$implicit,t=c(2);M("data-testid","ma-search-hit-"+e.id),l(3),x(t.isExpanded(e.id)?3:4),l(4),f("score ",O(8,9,e.score,"1.3-3"),""),l(3),f("weight ",e.weight,""),l(2),f("final ",O(13,12,e.finalScore,"1.3-3"),""),l(3),V(t.tableLabel(e.table)),l(2),f("src: ",t.hitSource(e),""),l(),$(e.scopePath),l(2),M("data-testid","ma-search-expand-"+e.id),l(),f(" ",t.isExpanded(e.id)?"collapse":"expand"," ")}}function an(i,d){i&1&&(o(0,"div",31),s(1,"Nincs tal\xE1lat erre a query-re."),a())}function on(i,d){if(i&1&&(o(0,"div",17)(1,"div",24)(2,"span",25),s(3),a(),o(4,"span",26),s(5),a()(),C(6,Gt,7,4,"div",27)(7,Qt,3,1,"div",28),o(8,"div",29),E(9,nn,22,15,"div",30,Rt,!1,an,2,0,"div",31),a()()),i&2){let e=d.$implicit;l(3),f('"',e.query,'"'),l(2),z(" \xB7 ",e.hits.length," hit \xB7 ",e.totalRelevant," relev\xE1ns"),l(),x(e.denseResults?6:-1),l(),x(e.uncertaintyNotes.length?7:-1),l(2),$(e.hits)}}var ze=(()=>{class i{api=F(A);notify=F(J);mainTables=te;rows_$=y([{tables:[h.memory],query:""}]);topK=5;minScore=0;tagFilter="";kindFilter="";results_$=y([]);searching_$=y(!1);expanded_$=y(new Set);ngOnInit(){return b(this,null,function*(){yield this.loadDefaults()})}loadDefaults(){return b(this,null,function*(){let e=yield this.api.getConfig();if(e.data?.effective){let t=e.data.effective["read.topK"],n=e.data.effective["read.minScore"];typeof t?.value=="number"&&(this.topK=t.value),typeof n?.value=="number"&&(this.minScore=n.value)}})}addRow(){this.rows_$.set([...this.rows_$(),{tables:[h.knowledge],query:""}])}removeRow(e){this.rows_$.set(this.rows_$().filter((t,n)=>n!==e))}toggleTable(e,t){let n=[...this.rows_$()],r=n[e].tables.includes(t)?n[e].tables.filter(p=>p!==t):[...n[e].tables,t];n[e]=Q(R({},n[e]),{tables:r}),this.rows_$.set(n)}isTableSelected(e,t){return this.rows_$()[e].tables.includes(t)}setQuery(e,t){let n=[...this.rows_$()];n[e]=Q(R({},n[e]),{query:t}),this.rows_$.set(n)}tableLabel(e){return U[e]}search(){return b(this,null,function*(){let e=this.rows_$().filter(n=>n.query.trim()&&n.tables.length);if(!e.length){this.notify.newErrorMessage("Adj meg legal\xE1bb egy query-t (t\xE1bla + phrase).");return}this.searching_$.set(!0);let t=yield this.api.read({queries:e.map(n=>({tables:n.tables,query:n.query,topK:this.topK,minScore:this.minScore,tagFilter:this.tagFilter?this.parseCsv(this.tagFilter):void 0,kindFilter:this.kindFilter||void 0})),includeContent:!0});if(this.searching_$.set(!1),t.error){this.notify.newErrorMessage(`${t.error.errorCode}: ${t.error.message}`),this.results_$.set([]);return}this.results_$.set(t.data?.results??[])})}toggleExpand(e){let t=new Set(this.expanded_$());t.has(e)?t.delete(e):t.add(e),this.expanded_$.set(t)}isExpanded(e){return this.expanded_$().has(e)}applySuggestion(e){let t=e.toLowerCase(),n=e.match(/tag[:=]\s*([\w-]+)/i),r=e.match(/kind[:=]\s*([\w-]+)/i);n?this.tagFilter=this.tagFilter?`${this.tagFilter},${n[1]}`:n[1]:r?this.kindFilter=r[1]:t.includes("mincore")||t.includes("minscore")?this.minScore=Math.min(this.minScore+.1,1):t.includes("topk")&&(this.topK=Math.max(this.topK-1,1)),this.search()}hitSource(e){return e.sourceFilePath?e.sourceFilePath:e.source?.type??"manual"}parseCsv(e){return(e??"").split(",").map(t=>t.trim()).filter(t=>t.length)}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=D({type:i,selectors:[["ma-search"]],standalone:!0,features:[B],decls:27,vars:7,consts:[["data-testid","ma-search",1,"mx-auto","max-w-5xl","p-6"],[1,"mb-4","block"],[1,"mb-4"],[1,"text-sm","opacity-60","hover:underline",3,"routerLink"],[1,"text-2xl","font-semibold"],["data-testid","ma-search-queries",1,"mb-4","flex","flex-col","gap-3"],[1,"rounded","border","border-neutral-800","bg-neutral-900","p-3"],["data-testid","ma-search-add-query",1,"self-start","rounded","border","border-neutral-700","px-3","py-1","text-sm","hover:bg-neutral-800",3,"click"],[1,"mb-4","flex","flex-wrap","items-center","gap-3","text-sm"],[1,"flex","items-center","gap-1"],["type","number","data-testid","ma-search-topk",1,"w-20","rounded","border","border-neutral-700","bg-neutral-900","px-2","py-1",3,"ngModelChange","ngModel"],["type","number","step","0.05","data-testid","ma-search-minscore",1,"w-24","rounded","border","border-neutral-700","bg-neutral-900","px-2","py-1",3,"ngModelChange","ngModel"],["placeholder","tag filter (vessz\u0151vel)","data-testid","ma-search-tagfilter",1,"w-40","rounded","border","border-neutral-700","bg-neutral-900","px-2","py-1",3,"ngModelChange","ngModel"],["placeholder","kind filter","data-testid","ma-search-kindfilter",1,"w-32","rounded","border","border-neutral-700","bg-neutral-900","px-2","py-1",3,"ngModelChange","ngModel"],["data-testid","ma-search-submit",1,"rounded","bg-blue-700","px-4","py-1","hover:bg-blue-600",3,"click"],["data-testid","ma-search-loading",1,"py-10","text-center","opacity-60"],["data-testid","ma-search-results",1,"flex","flex-col","gap-6"],[1,"rounded","border","border-neutral-800"],[1,"mb-2","flex","flex-wrap","gap-1"],["type","button",1,"rounded","px-2","py-1","text-xs",3,"bg-blue-700","bg-neutral-800"],[1,"flex","items-center","gap-2"],["placeholder","query phrase",1,"flex-1","rounded","border","border-neutral-700","bg-neutral-950","px-2","py-1","text-sm",3,"ngModelChange","ngModel"],[1,"rounded","px-2","py-1","text-sm","text-red-400","hover:bg-neutral-800",3,"click"],["type","button",1,"rounded","px-2","py-1","text-xs",3,"click"],[1,"border-b","border-neutral-800","bg-neutral-900","px-3","py-2","text-sm"],[1,"font-medium"],[1,"opacity-50"],[1,"border-b","border-yellow-700","bg-yellow-950","px-3","py-2","text-sm","text-yellow-200"],[1,"border-b","border-amber-700/60","bg-neutral-900","px-3","py-2","text-xs","text-amber-300"],[1,"flex","flex-col","gap-2","p-2"],[1,"rounded","border","border-neutral-800","bg-neutral-900","p-3","text-sm"],[1,"py-4","text-center","opacity-50"],[1,"font-semibold"],[1,"mt-1"],[1,"mt-2","flex","flex-wrap","gap-2"],["type","button",1,"rounded","bg-yellow-800","px-2","py-1","text-xs","hover:bg-yellow-700"],["type","button",1,"rounded","bg-yellow-800","px-2","py-1","text-xs","hover:bg-yellow-700",3,"click"],[1,"flex","items-start","justify-between","gap-3"],[1,"flex-1"],[1,"line-clamp-2","opacity-90"],[1,"mt-1","flex","flex-wrap","gap-2","text-xs","opacity-60"],[1,"rounded","bg-purple-900","px-1.5","py-0.5"],[1,"rounded","px-2","py-1","text-xs","hover:bg-neutral-800",3,"click"],[1,"whitespace-pre-wrap","opacity-90"],[1,"mt-1","text-xs","opacity-50"]],template:function(t,n){t&1&&(o(0,"div",0),W(1,"ma-banner-host",1),o(2,"div",2)(3,"a",3),s(4,"\u2190 Maintenance"),a(),o(5,"h1",4),s(6,"Search (val\xF3di read-teszt)"),a()(),o(7,"div",5),E(8,Ot,8,2,"div",6,xe),o(10,"button",7),u("click",function(){return n.addRow()}),s(11,"+ add query"),a()(),o(12,"div",8)(13,"label",9),s(14,"topK "),o(15,"input",10),S("ngModelChange",function(p){return w(n.topK,p)||(n.topK=p),p}),a()(),o(16,"label",9),s(17,"minScore "),o(18,"input",11),S("ngModelChange",function(p){return w(n.minScore,p)||(n.minScore=p),p}),a()(),o(19,"input",12),S("ngModelChange",function(p){return w(n.tagFilter,p)||(n.tagFilter=p),p}),a(),o(20,"input",13),S("ngModelChange",function(p){return w(n.kindFilter,p)||(n.kindFilter=p),p}),a(),o(21,"button",14),u("click",function(){return n.search()}),s(22,"Search"),a()(),C(23,qt,2,0,"div",15),o(24,"div",16),E(25,on,12,6,"div",17,At),a()()),t&2&&(l(3),k("routerLink",I(6,zt)),l(5),$(n.rows_$()),l(7),v("ngModel",n.topK),l(3),v("ngModel",n.minScore),l(),v("ngModel",n.tagFilter),l(),v("ngModel",n.kindFilter),l(3),x(n.searching_$()?23:-1),l(2),$(n.results_$()))},dependencies:[L,Ce,X,Z,Ie,K,H,P,q,G],encapsulation:2})}return i})();var rn=(i,d)=>d.key,ln=()=>["/maintenance"];function sn(i,d){if(i&1&&(o(0,"option",7),s(1),a()),i&2){let e=d.$implicit,t=c();k("value",e),l(),f("",t.tableLabel(e)," (table-override)")}}function dn(i,d){i&1&&(o(0,"div",15),s(1,"Loading\u2026"),a())}function cn(i,d){if(i&1){let e=T();o(0,"input",25),u("ngModelChange",function(n){m(e);let r=c().$implicit,p=c(2);return _(p.onValueChange(r.key,n))}),a()}if(i&2){let e=c().$implicit;k("ngModel",e.value),M("data-testid","ma-config-value-"+e.key)}}function pn(i,d){if(i&1){let e=T();o(0,"input",26),u("ngModelChange",function(n){m(e);let r=c().$implicit,p=c(2);return _(p.onValueChange(r.key,n))}),a()}if(i&2){let e=c().$implicit;k("ngModel",e.value),M("data-testid","ma-config-value-"+e.key)}}function mn(i,d){if(i&1){let e=T();o(0,"div",17)(1,"div",19),s(2),a(),o(3,"div",20),C(4,cn,1,2,"input",21)(5,pn,1,2,"input",22),a(),o(6,"span",23),s(7),a(),o(8,"button",24),u("click",function(){let n=m(e).$implicit,r=c(2);return _(r.saveRow(n))}),s(9,"Save"),a()()}if(i&2){let e=d.$implicit,t=c(2);M("data-testid","ma-config-row-"+e.key),l(2),V(e.key),l(2),x(t.isBoolean(e.value)?4:5),l(2),N("bg-neutral-700",e.resolvedFrom==="builtin"||e.resolvedFrom==="global")("bg-blue-800",e.resolvedFrom==="table")("bg-purple-800",e.resolvedFrom==="scope"),M("data-testid","ma-config-source-"+e.key),l(),f(" ",t.sourceLabel(e.resolvedFrom)," "),l(),M("data-testid","ma-config-save-"+e.key)}}function _n(i,d){i&1&&(o(0,"div",18),s(1,"Nincs config-kulcs (a szerver nem el\xE9rhet\u0151?)."),a())}function un(i,d){if(i&1&&(o(0,"div",16),E(1,mn,10,12,"div",17,rn,!1,_n,2,0,"div",18),a()),i&2){let e=c();l(),$(e.rows_$())}}var je=(()=>{class i{api=F(A);notify=F(J);mainTables=te;tableScope="";rows_$=y([]);loading_$=y(!0);ngOnInit(){return b(this,null,function*(){yield this.load()})}load(){return b(this,null,function*(){this.loading_$.set(!0);let e=yield this.api.getConfig(this.tableScope||void 0);if(e.error){this.notify.newErrorMessage(`${e.error.errorCode}: ${e.error.message}`),this.loading_$.set(!1);return}let t=e.data?.effective??{},n=Object.keys(t).sort().map(r=>({key:r,value:t[r].value,resolvedFrom:t[r].resolvedFrom}));this.rows_$.set(n),this.loading_$.set(!1)})}tableLabel(e){return U[e]}sourceLabel(e){switch(e){case"builtin":return"builtin default";case"global":return"\xF6r\xF6kl\xF6tt global default";case"table":return"table-override";case"scope":return"scope-override";default:return e}}isBoolean(e){return typeof e=="boolean"}onValueChange(e,t){let n=this.rows_$().map(r=>r.key===e?Q(R({},r),{value:t}):r);this.rows_$.set(n)}saveRow(e){return b(this,null,function*(){let t=yield this.api.setConfig({key:e.key,value:e.value,table:this.tableScope||void 0});if(t.error){this.notify.newErrorMessage(`${t.error.errorCode}: ${t.error.message}`);return}this.notify.newSuccessMessage(`${e.key} mentve.`),yield this.load()})}applyOpenAiPreset(){return b(this,null,function*(){yield this.applyPreset("openai")})}applyLmStudioPreset(){return b(this,null,function*(){yield this.applyPreset("lmstudio")})}applyPreset(e){return b(this,null,function*(){let t=yield this.api.invokeCapability("apply_preset",{preset:e,table:this.tableScope||void 0});if(t.error){this.notify.newErrorMessage(`${t.error.errorCode}: ${t.error.message}`);return}this.notify.newSuccessMessage(`${e} preset alkalmazva.`),yield this.load()})}testMongo(){this.runTest("test_mongodb_connection","MongoDB")}testEmbedding(){this.runTest("test_embedding_provider","Embedding-provider")}testVectorSearch(){this.runTest("test_vector_search","Vector search")}runTest(e,t){return b(this,null,function*(){let n=yield this.api.invokeCapability(e);if(n.error){this.notify.newErrorMessage(`${t} teszt: ${n.error.errorCode} \u2014 ${n.error.message}`);return}let r=n.data??{};r.ok===!1?this.notify.newErrorMessage(`${t} teszt sikertelen: ${r.message??"ismeretlen ok"}`):this.notify.newSuccessMessage(`${t} teszt OK${r.message?" \u2014 "+r.message:""}.`)})}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=D({type:i,selectors:[["ma-settings"]],standalone:!0,features:[B],decls:28,vars:4,consts:[["data-testid","ma-settings",1,"mx-auto","max-w-4xl","p-6"],[1,"mb-4","block"],[1,"mb-4","flex","items-center","justify-between"],[1,"text-sm","opacity-60","hover:underline",3,"routerLink"],[1,"text-2xl","font-semibold"],["data-testid","ma-settings-scope",1,"rounded","border","border-neutral-700","bg-neutral-900","px-2","py-1","text-sm",3,"ngModelChange","ngModel"],["value",""],[3,"value"],["data-testid","ma-settings-actions",1,"mb-4","flex","flex-wrap","gap-2","text-sm"],["data-testid","ma-preset-openai",1,"rounded","border","border-neutral-700","px-3","py-1","hover:bg-neutral-800",3,"click"],["data-testid","ma-preset-lmstudio",1,"rounded","border","border-neutral-700","px-3","py-1","hover:bg-neutral-800",3,"click"],[1,"mx-1","opacity-30"],["data-testid","ma-test-mongo",1,"rounded","border","border-neutral-700","px-3","py-1","hover:bg-neutral-800",3,"click"],["data-testid","ma-test-embedding",1,"rounded","border","border-neutral-700","px-3","py-1","hover:bg-neutral-800",3,"click"],["data-testid","ma-test-vector",1,"rounded","border","border-neutral-700","px-3","py-1","hover:bg-neutral-800",3,"click"],["data-testid","ma-settings-loading",1,"py-10","text-center","opacity-60"],["data-testid","ma-settings-rows",1,"flex","flex-col","gap-2"],[1,"flex","flex-wrap","items-center","gap-3","rounded","border","border-neutral-800","bg-neutral-900","p-2","text-sm"],[1,"py-6","text-center","opacity-50"],[1,"w-56","font-mono","text-xs"],[1,"flex-1"],["type","checkbox",3,"ngModel"],[1,"w-full","rounded","border","border-neutral-700","bg-neutral-950","px-2","py-1",3,"ngModel"],[1,"rounded","px-2","py-0.5","text-xs"],[1,"rounded","bg-emerald-700","px-3","py-1","text-xs","hover:bg-emerald-600",3,"click"],["type","checkbox",3,"ngModelChange","ngModel"],[1,"w-full","rounded","border","border-neutral-700","bg-neutral-950","px-2","py-1",3,"ngModelChange","ngModel"]],template:function(t,n){t&1&&(o(0,"div",0),W(1,"ma-banner-host",1),o(2,"div",2)(3,"div")(4,"a",3),s(5,"\u2190 Maintenance"),a(),o(6,"h1",4),s(7,"Settings"),a()(),o(8,"select",5),S("ngModelChange",function(p){return w(n.tableScope,p)||(n.tableScope=p),p}),u("ngModelChange",function(){return n.load()}),o(9,"option",6),s(10,"global"),a(),E(11,sn,2,2,"option",7,Y),a()(),o(13,"div",8)(14,"button",9),u("click",function(){return n.applyOpenAiPreset()}),s(15,"Apply OpenAI preset"),a(),o(16,"button",10),u("click",function(){return n.applyLmStudioPreset()}),s(17,"Apply LM Studio preset"),a(),o(18,"span",11),s(19,"|"),a(),o(20,"button",12),u("click",function(){return n.testMongo()}),s(21,"Test MongoDB"),a(),o(22,"button",13),u("click",function(){return n.testEmbedding()}),s(23,"Test embedding"),a(),o(24,"button",14),u("click",function(){return n.testVectorSearch()}),s(25,"Test vector search"),a()(),C(26,dn,2,0,"div",15)(27,un,4,1,"div",16),a()),t&2&&(l(4),k("routerLink",I(3,ln)),l(4),v("ngModel",n.tableScope),l(3),$(n.mainTables),l(15),x(n.loading_$()?26:27))},dependencies:[L,X,Se,Me,Z,ve,we,K,H,P,q,G],encapsulation:2})}return i})();var ce=function(i){return i.create="create",i.update="update",i.delete="delete",i.scanFile="scan-file",i.scanFolder="scan-folder",i.scanProject="scan-project",i.reEmbed="re-embed",i.import="import",i}(ce||{});function gn(i,d){if(i&1&&(o(0,"div",7),s(1),o(2,"span",8),s(3),j(4,"number"),a()()),i&2){let e=c(),t=e.$implicit,n=e.$index;M("data-testid","ma-scope-preview-"+n),l(),f(" \u2192 ",t.resolvedPreview.canonicalName," "),l(2),f("(konfidencia: ",O(4,3,t.resolvedPreview.confidence,"1.2-2"),")")}}function fn(i,d){if(i&1){let e=T();o(0,"div",2)(1,"input",4),u("ngModelChange",function(n){let r=m(e).$index,p=c();return _(p.onLayerChange(r,n))}),a(),o(2,"input",5),u("ngModelChange",function(n){let r=m(e).$index,p=c();return _(p.onRawNameChange(r,n))}),a(),o(3,"button",6),u("click",function(){let n=m(e).$index,r=c();return _(r.removeLayer(n))}),s(4," remove "),a(),C(5,gn,5,6,"div",7),a()}if(i&2){let e=d.$implicit,t=d.$index;l(),k("ngModel",e.layer),M("data-testid","ma-scope-layer-"+t),l(),k("ngModel",e.rawName),M("data-testid","ma-scope-rawname-"+t),l(),M("data-testid","ma-scope-remove-"+t),l(2),x(e.resolvedPreview?5:-1)}}var Oe=(()=>{class i{api=F(A);value=[];valueChange=new Ee;rows_$=y([]);ngOnInit(){let e=(this.value??[]).map(t=>({layer:t.layer,rawName:t.rawName,resolvedPreview:void 0}));this.rows_$.set(e.length?e:[{layer:"project",rawName:"",resolvedPreview:void 0}])}addLayer(){this.rows_$.set([...this.rows_$(),{layer:"",rawName:"",resolvedPreview:void 0}])}removeLayer(e){this.rows_$.set(this.rows_$().filter((t,n)=>n!==e)),this.emit()}onLayerChange(e,t){let n=[...this.rows_$()];n[e]=Q(R({},n[e]),{layer:t}),this.rows_$.set(n),this.emit()}onRawNameChange(e,t){let n=[...this.rows_$()];n[e]=Q(R({},n[e]),{rawName:t}),this.rows_$.set(n),this.emit(),this.loadPreview(e)}loadPreview(e){return b(this,null,function*(){let t=this.rows_$()[e];if(!t?.rawName)return;let n=yield this.api.invokeCapability("trace_reference_expansion",{layer:t.layer,rawName:t.rawName});if(n.error)return;let r=n.data??{};if(r.canonicalName){let p=[...this.rows_$()];p[e]=Q(R({},p[e]),{resolvedPreview:{canonicalName:r.canonicalName,confidence:r.confidence??0}}),this.rows_$.set(p)}})}emit(){let e=this.rows_$().filter(t=>t.layer&&t.rawName).map(t=>({layer:t.layer,rawName:t.rawName}));this.value=e,this.valueChange.emit(e)}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=D({type:i,selectors:[["ma-scope-picker"]],inputs:{value:"value"},outputs:{valueChange:"valueChange"},standalone:!0,features:[B],decls:7,vars:0,consts:[["data-testid","ma-scope-picker",1,"flex","flex-col","gap-2"],[1,"text-xs","uppercase","tracking-wide","opacity-60"],[1,"flex","flex-wrap","items-center","gap-2"],["type","button","data-testid","ma-scope-add-layer",1,"self-start","rounded","border","border-neutral-700","px-3","py-1","text-sm","hover:bg-neutral-800",3,"click"],["type","text","placeholder","layer (pl. project)",1,"w-40","rounded","border","border-neutral-700","bg-neutral-900","px-2","py-1","text-sm",3,"ngModelChange","ngModel"],["type","text","placeholder","n\xE9v (pl. Adventor)",1,"flex-1","rounded","border","border-neutral-700","bg-neutral-900","px-2","py-1","text-sm",3,"ngModelChange","ngModel"],["type","button",1,"rounded","px-2","py-1","text-sm","text-red-400","hover:bg-neutral-800",3,"click"],[1,"basis-full","pl-2","text-xs","text-emerald-400"],[1,"opacity-70"]],template:function(t,n){t&1&&(o(0,"div",0)(1,"div",1),s(2,"Scope (root \u2192 leaf, k\xF6telez\u0151)"),a(),E(3,fn,6,6,"div",2,xe),o(5,"button",3),u("click",function(){return n.addLayer()}),s(6," + add layer "),a()()),t&2&&(l(3),$(n.rows_$()))},dependencies:[L,Ce,X,Z,K,H],encapsulation:2})}return i})();var qe=(i,d)=>d._id,xn=(i,d)=>d.runId,bn=(i,d)=>d.scopeId,hn=()=>["/maintenance"],Ke=i=>({$implicit:i});function Cn(i,d){if(i&1&&(o(0,"div",11)(1,"div")(2,"span",25),s(3,"count:"),a(),s(4),a(),o(5,"div")(6,"span",25),s(7,"pending:"),a(),s(8),a(),o(9,"div")(10,"span",25),s(11,"completed:"),a(),s(12),a(),o(13,"div")(14,"span",25),s(15,"error:"),a(),s(16),a()()),i&2){let e,t,n,r=d;l(4),f(" ",r.count,""),l(4),f(" ",(e=r.embeddingStatus==null?null:r.embeddingStatus.pending)!==null&&e!==void 0?e:0,""),l(4),f(" ",(t=r.embeddingStatus==null?null:r.embeddingStatus.completed)!==null&&t!==void 0?t:0,""),l(4),f(" ",(n=r.embeddingStatus==null?null:r.embeddingStatus.error)!==null&&n!==void 0?n:0,"")}}function yn(i,d){if(i&1){let e=T();o(0,"textarea",35),S("ngModelChange",function(n){m(e);let r=c(2);return w(r.addCode,n)||(r.addCode=n),_(n)}),a()}if(i&2){let e=c(2);v("ngModel",e.addCode)}}function vn(i,d){if(i&1&&(o(0,"div",32),s(1),a()),i&2){let e=c(2);l(),f("aj\xE1nlott tag-ek: ",e.recommendedTags.join(", "),"")}}function wn(i,d){if(i&1){let e=T();o(0,"div",12)(1,"h3",26),s(2,"Manual add"),a(),o(3,"textarea",27),S("ngModelChange",function(n){m(e);let r=c();return w(r.addContent,n)||(r.addContent=n),_(n)}),a(),C(4,yn,1,1,"textarea",28),o(5,"div",29)(6,"input",30),S("ngModelChange",function(n){m(e);let r=c();return w(r.addKind,n)||(r.addKind=n),_(n)}),a(),o(7,"input",31),S("ngModelChange",function(n){m(e);let r=c();return w(r.addTags,n)||(r.addTags=n),_(n)}),a()(),C(8,vn,2,1,"div",32),o(9,"ma-scope-picker",33),S("valueChange",function(n){m(e);let r=c();return w(r.addScope,n)||(r.addScope=n),_(n)}),a(),o(10,"button",34),u("click",function(){m(e);let n=c();return _(n.submitAdd())}),s(11,"Create"),a()()}if(i&2){let e=c();l(3),v("ngModel",e.addContent),l(),x(e.isCodingPatterns?4:-1),l(2),v("ngModel",e.addKind),l(),v("ngModel",e.addTags),l(),x(e.recommendedTags.length?8:-1),l(),v("value",e.addScope)}}function Sn(i,d){if(i&1){let e=T();o(0,"div",13)(1,"h3",26),s(2,"Bulk paste (\xFCres sor v\xE1lasztja el a blokkokat)"),a(),o(3,"textarea",36),S("ngModelChange",function(n){m(e);let r=c();return w(r.bulkText,n)||(r.bulkText=n),_(n)}),a(),o(4,"div",29)(5,"input",37),S("ngModelChange",function(n){m(e);let r=c();return w(r.bulkKind,n)||(r.bulkKind=n),_(n)}),a(),o(6,"input",38),S("ngModelChange",function(n){m(e);let r=c();return w(r.bulkTags,n)||(r.bulkTags=n),_(n)}),a()(),o(7,"ma-scope-picker",33),S("valueChange",function(n){m(e);let r=c();return w(r.bulkScope,n)||(r.bulkScope=n),_(n)}),a(),o(8,"button",39),u("click",function(){m(e);let n=c();return _(n.submitBulk())}),s(9,"Import all"),a()()}if(i&2){let e=c();l(3),v("ngModel",e.bulkText),l(2),v("ngModel",e.bulkKind),l(),v("ngModel",e.bulkTags),l(),v("value",e.bulkScope)}}function Mn(i,d){if(i&1){let e=T();o(0,"div",14)(1,"h3",26),s(2,"Run scan / system-sync"),a(),o(3,"input",40),S("ngModelChange",function(n){m(e);let r=c();return w(r.scanPath,n)||(r.scanPath=n),_(n)}),a(),o(4,"div",29)(5,"input",41),S("ngModelChange",function(n){m(e);let r=c();return w(r.scanInclude,n)||(r.scanInclude=n),_(n)}),a(),o(6,"input",42),S("ngModelChange",function(n){m(e);let r=c();return w(r.scanExclude,n)||(r.scanExclude=n),_(n)}),a()(),o(7,"label",43)(8,"input",44),S("ngModelChange",function(n){m(e);let r=c();return w(r.scanDryRun,n)||(r.scanDryRun=n),_(n)}),a(),s(9," dry-run (csak felder\xEDt\xE9s) "),a(),o(10,"ma-scope-picker",33),S("valueChange",function(n){m(e);let r=c();return w(r.scanScope,n)||(r.scanScope=n),_(n)}),a(),o(11,"button",45),u("click",function(){m(e);let n=c();return _(n.submitScan())}),s(12,"Run"),a()()}if(i&2){let e=c();l(3),v("ngModel",e.scanPath),l(2),v("ngModel",e.scanInclude),l(),v("ngModel",e.scanExclude),l(2),v("ngModel",e.scanDryRun),l(2),v("value",e.scanScope)}}function kn(i,d){i&1&&(o(0,"div",23),s(1,"Loading\u2026"),a())}function Tn(i,d){if(i&1&&oe(0,52),i&2){let e=d.$implicit;c(3);let t=re(34);k("ngTemplateOutlet",t)("ngTemplateOutletContext",ae(2,Ke,e))}}function En(i,d){i&1&&(o(0,"div",53),s(1,"Nincs bejegyz\xE9s."),a())}function $n(i,d){if(i&1&&(o(0,"div",46),E(1,Tn,1,4,"ng-container",52,qe,!1,En,2,0,"div",53),a()),i&2){let e=c(2);l(),$(e.items_$())}}function Fn(i,d){if(i&1&&oe(0,52),i&2){let e=d.$implicit;c(4);let t=re(34);k("ngTemplateOutlet",t)("ngTemplateOutletContext",ae(2,Ke,e))}}function Vn(i,d){if(i&1){let e=T();o(0,"div",54)(1,"div",55)(2,"span",56),s(3),a(),o(4,"button",57),u("click",function(){let n=m(e).$implicit,r=c(3);return _(r.deleteRunGroup(n.runId))}),s(5,"Delete run"),a()(),o(6,"div",58),E(7,Fn,1,4,"ng-container",52,qe),a()()}if(i&2){let e=d.$implicit;l(3),z("run: ",e.runId," (",e.items.length," chunk)"),l(4),$(e.items)}}function In(i,d){if(i&1&&(o(0,"div",47),E(1,Vn,9,2,"div",54,xn),a()),i&2){let e=c(2);l(),$(e.groupedByRun())}}function Ln(i,d){if(i&1){let e=T();C(0,$n,4,1,"div",46)(1,In,3,0,"div",47),o(2,"div",24)(3,"span",48),s(4),a(),o(5,"div",49)(6,"button",50),u("click",function(){m(e);let n=c();return _(n.prevPage())}),s(7,"Prev"),a(),o(8,"button",51),u("click",function(){m(e);let n=c();return _(n.nextPage())}),s(9,"Next"),a()()()}if(i&2){let e=c();x(e.groupByRun?1:0),l(4),ee("\xF6sszesen: ",e.total_$()," \xB7 oldal ",e.page_$()," \xB7 oldalm\xE9ret ",e.pageSize_$(),"")}}function Pn(i,d){if(i&1&&(o(0,"span",64),s(1),a()),i&2){let e=c().$implicit;l(),V(e.kind)}}function Dn(i,d){if(i&1&&(o(0,"span",65),s(1),a()),i&2){let e=d.$implicit;l(),V(e)}}function Bn(i,d){if(i&1){let e=T();o(0,"button",68),u("click",function(){let n=m(e).$implicit,r=c(2);return _(r.openScope(n.scopeId))}),s(1),a()}if(i&2){let e=d.$implicit;l(),z("",e.layer,":",e.canonicalName,"")}}function An(i,d){if(i&1&&s(0),i&2){let e=c().$implicit;ee(" \xB7 ",e.sourceFilePath," (",e.chunkIndex,"/",e.chunkTotal,") ")}}function Rn(i,d){if(i&1){let e=T();o(0,"div",59)(1,"div",60)(2,"div",61)(3,"div",62),s(4),a(),o(5,"div",63),C(6,Pn,2,1,"span",64),E(7,Dn,2,1,"span",65,Y),E(9,Bn,2,2,"button",66,bn),a(),o(11,"div",67),s(12),j(13,"date"),C(14,An,1,3),a()(),o(15,"button",57),u("click",function(){let n=m(e).$implicit,r=c();return _(r.deleteEntry(n))}),s(16,"Delete"),a()()()}if(i&2){let e,t=d.$implicit;M("data-testid","ma-entry-"+t._id),l(4),V(t.content),l(2),x(t.kind?6:-1),l(),$(t.tags),l(2),$(t.scopePath),l(3),ee(" weight ",(e=t.weight)!==null&&e!==void 0?e:1," \xB7 ",(e=t.addedBy)!==null&&e!==void 0?e:"\u2014"," \xB7 ",t.__lastModified?O(13,8,t.__lastModified,"short"):"\u2014"," "),l(2),x(t.sourceFilePath?14:-1),l(),M("data-testid","ma-entry-delete-"+t._id)}}var Nn=50,Wn=500,He=(()=>{class i{api=F(A);route=F(ye);router=F(se);notify=F(J);popup=F(de);table_$=y(h.rules);items_$=y([]);total_$=y(0);page_$=y(1);pageSize_$=y(Nn);loading_$=y(!1);tagFilter="";kindFilter="";textFilter="";ingestRunFilter="";groupByRun=!1;stats_$=y(null);addContent="";addCode="";addKind="";addTags="";addScope=[];addFormOpen_$=y(!1);bulkText="";bulkKind="";bulkTags="";bulkScope=[];bulkOpen_$=y(!1);scanPath="";scanInclude="";scanExclude="";scanDryRun=!0;scanScope=[];scanOpen_$=y(!1);get isCodingPatterns(){return this.table_$()===h.codingPatterns}get tableLabel(){return U[this.table_$()]}get recommendedTags(){return Pe[this.table_$()]??[]}ngOnInit(){this.route.paramMap.subscribe(e=>{let t=e.get("table"),n=Object.values(h).find(r=>r===t);if(!n||n===h.reference){this.router.navigate(["/maintenance"]);return}this.table_$.set(n),this.page_$.set(1),this.reload()})}reload(){return b(this,null,function*(){this.loading_$.set(!0);let e=yield this.api.getItems(this.table_$(),{page:this.page_$(),pageSize:this.pageSize_$(),tag:this.tagFilter||void 0,kind:this.kindFilter||void 0,ingestRunId:this.ingestRunFilter||void 0});if(e.error){this.notify.newErrorMessage(`${e.error.errorCode}: ${e.error.message}`),this.loading_$.set(!1);return}let t=e.data?.items??[];if(this.textFilter){let r=this.textFilter.toLowerCase();t=t.filter(p=>(p.content??"").toLowerCase().includes(r))}this.items_$.set(t),this.total_$.set(e.data?.total??t.length);let n=yield this.api.getTableStats(this.table_$());n.data&&this.stats_$.set(n.data),this.loading_$.set(!1)})}applyFilters(){this.page_$.set(1),this.reload()}nextPage(){this.page_$()*this.pageSize_$()<this.total_$()&&(this.page_$.set(this.page_$()+1),this.reload())}prevPage(){this.page_$()>1&&(this.page_$.set(this.page_$()-1),this.reload())}setPageSize(e){this.pageSize_$.set(Math.min(Math.max(e,1),Wn)),this.page_$.set(1),this.reload()}submitAdd(){return b(this,null,function*(){if(!this.addContent.trim()){this.notify.newErrorMessage("A content k\xF6telez\u0151.");return}if(!this.addScope.length){this.notify.newErrorMessage("A scope k\xF6telez\u0151 (legal\xE1bb egy layer).");return}let e=this.parseCsv(this.addTags),t={};this.isCodingPatterns&&this.addCode&&(t.code=this.addCode);let n=yield this.api.write({table:this.table_$(),operation:ce.create,scopePath:this.addScope,content:this.addContent,tags:e,kind:this.addKind||void 0,fields:Object.keys(t).length?t:void 0});if(n.error){this.notify.newErrorMessage(`${n.error.errorCode}: ${n.error.message}`);return}this.notify.newSuccessMessage("Bejegyz\xE9s l\xE9trehozva."),this.resetAddForm(),this.addFormOpen_$.set(!1),yield this.reload()})}resetAddForm(){this.addContent="",this.addCode="",this.addKind="",this.addTags="",this.addScope=[]}submitBulk(){return b(this,null,function*(){if(!this.bulkScope.length){this.notify.newErrorMessage("A bulk-paste-hez scope k\xF6telez\u0151.");return}let e=this.bulkText.split(/\n\s*\n/).map(p=>p.trim()).filter(p=>p.length);if(!e.length){this.notify.newErrorMessage("Nincs feldolgozhat\xF3 blokk (\xFCres sor v\xE1lasztja el).");return}let t=this.parseCsv(this.bulkTags),n=0,r=[];for(let p of e){let g=yield this.api.write({table:this.table_$(),operation:ce.create,scopePath:this.bulkScope,content:p,tags:t,kind:this.bulkKind||void 0});g.error?r.push(`${g.error.errorCode}: ${p.slice(0,40)}\u2026`):n++}r.length?this.notify.newErrorMessage(`${n} l\xE9trehozva, ${r.length} hiba: ${r[0]}`):(this.notify.newSuccessMessage(`${n} bejegyz\xE9s l\xE9trehozva.`),this.bulkText="",this.bulkOpen_$.set(!1)),yield this.reload()})}deleteEntry(e){return b(this,null,function*(){if(!(yield this.popup.newConfirm({title:"Soft-delete",message:"Biztosan t\xF6rl\xF6d ezt a bejegyz\xE9st? (soft-delete, vissza\xE1ll\xEDthat\xF3)",confirmBtn:"Delete"})))return;let n=yield this.api.write({table:this.table_$(),operation:ce.delete,target:{by:"id",value:e._id??""}});if(n.error){this.notify.newErrorMessage(`${n.error.errorCode}: ${n.error.message}`);return}this.notify.newSuccessMessage("T\xF6r\xF6lve (soft-delete)."),yield this.reload()})}deleteRunGroup(e){return b(this,null,function*(){if(!(yield this.popup.newConfirm({title:"Csoportos soft-delete",message:`A(z) ${e} ingest-run minden chunkja t\xF6rl\xE9sre ker\xFCl (soft-delete). Folytatod?`,confirmBtn:"Delete run"})))return;let n=yield this.api.invokeCapability("delete_ingest_run",{ingestRunId:e});if(n.error){this.notify.newErrorMessage(`${n.error.errorCode}: ${n.error.message}`);return}this.notify.newSuccessMessage("Run t\xF6r\xF6lve (soft-delete)."),yield this.reload()})}reembedTable(){return b(this,null,function*(){let t=this.stats_$()?.count??0;if(!(yield this.popup.newConfirm({title:"Re-embed t\xE1r",message:`${t} elem \xFAjra-embeddel\xE9se \u2014 ez embedding-k\xF6lts\xE9get okozhat. Folytatod?`,confirmBtn:"Re-embed"})))return;let r=yield this.api.invokeCapability("reembed_table",{table:this.table_$()});if(r.error){this.notify.newErrorMessage(`${r.error.errorCode}: ${r.error.message}`);return}this.notify.newSuccessMessage("Re-embed elind\xEDtva."),yield this.reload()})}submitScan(){return b(this,null,function*(){if(!this.scanPath.trim()){this.notify.newErrorMessage("A scan path k\xF6telez\u0151.");return}if(!this.scanScope.length){this.notify.newErrorMessage("A scan-hez scope k\xF6telez\u0151.");return}let e=yield this.api.write({table:this.table_$(),operation:ce.scanFolder,scopePath:this.scanScope,scan:{path:this.scanPath,include:this.parseCsv(this.scanInclude),exclude:this.parseCsv(this.scanExclude),dryRun:this.scanDryRun}});if(e.error){this.notify.newErrorMessage(`${e.error.errorCode}: ${e.error.message}`);return}this.notify.newSuccessMessage(this.scanDryRun?"Dry-run scan k\xE9sz (l\xE1sd ingest id\u0151vonal).":"Scan k\xE9sz."),this.scanOpen_$.set(!1),yield this.reload()})}openScope(e){this.router.navigate(["/maintenance/scopes"],{queryParams:{focus:e}})}groupedByRun(){let e={};for(let t of this.items_$()){let n=t.ingestRunId??"(manual / no run)";(e[n]??=[]).push(t)}return Object.keys(e).map(t=>({runId:t,items:e[t]}))}parseCsv(e){return(e??"").split(",").map(t=>t.trim()).filter(t=>t.length)}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=D({type:i,selectors:[["ma-table-detail"]],standalone:!0,features:[B],decls:35,vars:13,consts:[["entryRow",""],["data-testid","ma-table-detail",1,"mx-auto","max-w-6xl","p-6"],[1,"mb-4","block"],[1,"mb-4","flex","items-center","justify-between"],[1,"text-sm","opacity-60","hover:underline",3,"routerLink"],[1,"text-2xl","font-semibold"],[1,"flex","gap-2","text-sm"],["data-testid","ma-detail-add-toggle",1,"rounded","border","border-neutral-700","px-3","py-1","hover:bg-neutral-800",3,"click"],["data-testid","ma-detail-bulk-toggle",1,"rounded","border","border-neutral-700","px-3","py-1","hover:bg-neutral-800",3,"click"],["data-testid","ma-detail-scan-toggle",1,"rounded","border","border-neutral-700","px-3","py-1","hover:bg-neutral-800",3,"click"],["data-testid","ma-detail-reembed",1,"rounded","border","border-amber-700","px-3","py-1","text-amber-300","hover:bg-neutral-800",3,"click"],["data-testid","ma-detail-stats",1,"mb-4","grid","grid-cols-2","gap-2","rounded","border","border-neutral-800","bg-neutral-900","p-3","text-sm","sm:grid-cols-4"],["data-testid","ma-entry-add-form",1,"mb-4","rounded","border","border-neutral-800","bg-neutral-900","p-4"],["data-testid","ma-bulk-paste",1,"mb-4","rounded","border","border-neutral-800","bg-neutral-900","p-4"],["data-testid","ma-scan-dialog",1,"mb-4","rounded","border","border-neutral-800","bg-neutral-900","p-4"],["data-testid","ma-detail-filters",1,"mb-3","flex","flex-wrap","items-center","gap-2","text-sm"],["placeholder","tag",1,"w-32","rounded","border","border-neutral-700","bg-neutral-900","px-2","py-1",3,"ngModelChange","ngModel"],["placeholder","kind",1,"w-32","rounded","border","border-neutral-700","bg-neutral-900","px-2","py-1",3,"ngModelChange","ngModel"],["placeholder","text (substring)",1,"w-40","rounded","border","border-neutral-700","bg-neutral-900","px-2","py-1",3,"ngModelChange","ngModel"],["placeholder","ingestRunId",1,"w-40","rounded","border","border-neutral-700","bg-neutral-900","px-2","py-1",3,"ngModelChange","ngModel"],[1,"flex","items-center","gap-1"],["type","checkbox","data-testid","ma-detail-groupby",3,"ngModelChange","ngModel"],["data-testid","ma-detail-apply-filters",1,"rounded","border","border-neutral-700","px-3","py-1","hover:bg-neutral-800",3,"click"],["data-testid","ma-detail-loading",1,"py-10","text-center","opacity-60"],["data-testid","ma-detail-pagination",1,"mt-4","flex","items-center","justify-between","text-sm"],[1,"opacity-50"],[1,"mb-3","font-medium"],["rows","4","placeholder","content","data-testid","ma-add-content",1,"mb-2","w-full","rounded","border","border-neutral-700","bg-neutral-950","p-2","text-sm",3,"ngModelChange","ngModel"],["rows","3","placeholder","code (NEM ker\xFCl a vektorba)","data-testid","ma-add-code",1,"mb-2","w-full","rounded","border","border-neutral-700","bg-neutral-950","p-2","text-sm",3,"ngModel"],[1,"mb-2","flex","gap-2"],["placeholder","kind","data-testid","ma-add-kind",1,"w-40","rounded","border","border-neutral-700","bg-neutral-950","p-2","text-sm",3,"ngModelChange","ngModel"],["placeholder","tags (vessz\u0151vel)","data-testid","ma-add-tags",1,"flex-1","rounded","border","border-neutral-700","bg-neutral-950","p-2","text-sm",3,"ngModelChange","ngModel"],[1,"mb-2","text-xs","opacity-50"],[1,"mb-3","block",3,"valueChange","value"],["data-testid","ma-add-submit",1,"rounded","bg-emerald-700","px-4","py-1","text-sm","hover:bg-emerald-600",3,"click"],["rows","3","placeholder","code (NEM ker\xFCl a vektorba)","data-testid","ma-add-code",1,"mb-2","w-full","rounded","border","border-neutral-700","bg-neutral-950","p-2","text-sm",3,"ngModelChange","ngModel"],["rows","6","placeholder","t\xF6bb blokk\u2026","data-testid","ma-bulk-text",1,"mb-2","w-full","rounded","border","border-neutral-700","bg-neutral-950","p-2","text-sm",3,"ngModelChange","ngModel"],["placeholder","k\xF6z\xF6s kind",1,"w-40","rounded","border","border-neutral-700","bg-neutral-950","p-2","text-sm",3,"ngModelChange","ngModel"],["placeholder","k\xF6z\xF6s tags (vessz\u0151vel)",1,"flex-1","rounded","border","border-neutral-700","bg-neutral-950","p-2","text-sm",3,"ngModelChange","ngModel"],["data-testid","ma-bulk-submit",1,"rounded","bg-emerald-700","px-4","py-1","text-sm","hover:bg-emerald-600",3,"click"],["placeholder","path (folder / project)","data-testid","ma-scan-path",1,"mb-2","w-full","rounded","border","border-neutral-700","bg-neutral-950","p-2","text-sm",3,"ngModelChange","ngModel"],["placeholder","include (glob, vessz\u0151vel)",1,"flex-1","rounded","border","border-neutral-700","bg-neutral-950","p-2","text-sm",3,"ngModelChange","ngModel"],["placeholder","exclude (glob, vessz\u0151vel)",1,"flex-1","rounded","border","border-neutral-700","bg-neutral-950","p-2","text-sm",3,"ngModelChange","ngModel"],[1,"mb-2","flex","items-center","gap-2","text-sm"],["type","checkbox","data-testid","ma-scan-dryrun",3,"ngModelChange","ngModel"],["data-testid","ma-scan-submit",1,"rounded","bg-emerald-700","px-4","py-1","text-sm","hover:bg-emerald-600",3,"click"],["data-testid","ma-detail-list",1,"flex","flex-col","gap-2"],["data-testid","ma-detail-grouped",1,"flex","flex-col","gap-4"],[1,"opacity-60"],[1,"flex","gap-2"],["data-testid","ma-detail-prev",1,"rounded","border","border-neutral-700","px-3","py-1","hover:bg-neutral-800",3,"click"],["data-testid","ma-detail-next",1,"rounded","border","border-neutral-700","px-3","py-1","hover:bg-neutral-800",3,"click"],[3,"ngTemplateOutlet","ngTemplateOutletContext"],[1,"py-6","text-center","opacity-50"],[1,"rounded","border","border-neutral-800"],[1,"flex","items-center","justify-between","border-b","border-neutral-800","bg-neutral-900","px-3","py-2","text-sm"],[1,"font-medium"],[1,"rounded","px-2","py-1","text-xs","text-red-400","hover:bg-neutral-800",3,"click"],[1,"flex","flex-col","gap-2","p-2"],[1,"rounded","border","border-neutral-800","bg-neutral-900","p-3","text-sm"],[1,"flex","items-start","justify-between","gap-3"],[1,"flex-1"],[1,"line-clamp-2","opacity-90"],[1,"mt-1","flex","flex-wrap","items-center","gap-1","text-xs","opacity-60"],[1,"rounded","bg-neutral-800","px-1.5","py-0.5"],[1,"rounded","bg-blue-900","px-1.5","py-0.5"],[1,"rounded","bg-purple-900","px-1.5","py-0.5","hover:bg-purple-800"],[1,"mt-1","text-xs","opacity-40"],[1,"rounded","bg-purple-900","px-1.5","py-0.5","hover:bg-purple-800",3,"click"]],template:function(t,n){if(t&1){let r=T();o(0,"div",1),W(1,"ma-banner-host",2),o(2,"div",3)(3,"div")(4,"a",4),s(5,"\u2190 Maintenance"),a(),o(6,"h1",5),s(7),a()(),o(8,"div",6)(9,"button",7),u("click",function(){return m(r),_(n.addFormOpen_$.set(!n.addFormOpen_$()))}),s(10,"Add entry"),a(),o(11,"button",8),u("click",function(){return m(r),_(n.bulkOpen_$.set(!n.bulkOpen_$()))}),s(12,"Bulk paste"),a(),o(13,"button",9),u("click",function(){return m(r),_(n.scanOpen_$.set(!n.scanOpen_$()))}),s(14,"Run scan"),a(),o(15,"button",10),u("click",function(){return m(r),_(n.reembedTable())}),s(16,"Re-embed"),a()()(),C(17,Cn,17,4,"div",11)(18,wn,12,6,"div",12)(19,Sn,10,4,"div",13)(20,Mn,13,5,"div",14),o(21,"div",15)(22,"input",16),S("ngModelChange",function(g){return m(r),w(n.tagFilter,g)||(n.tagFilter=g),_(g)}),a(),o(23,"input",17),S("ngModelChange",function(g){return m(r),w(n.kindFilter,g)||(n.kindFilter=g),_(g)}),a(),o(24,"input",18),S("ngModelChange",function(g){return m(r),w(n.textFilter,g)||(n.textFilter=g),_(g)}),a(),o(25,"input",19),S("ngModelChange",function(g){return m(r),w(n.ingestRunFilter,g)||(n.ingestRunFilter=g),_(g)}),a(),o(26,"label",20)(27,"input",21),S("ngModelChange",function(g){return m(r),w(n.groupByRun,g)||(n.groupByRun=g),_(g)}),a(),s(28," group by run"),a(),o(29,"button",22),u("click",function(){return m(r),_(n.applyFilters())}),s(30,"Apply"),a()(),C(31,kn,2,0,"div",23)(32,Ln,10,4,"div",24),a(),C(33,Rn,17,11,"ng-template",null,0,be)}if(t&2){let r;l(4),k("routerLink",I(12,hn)),l(3),V(n.tableLabel),l(10),x((r=n.stats_$())?17:-1,r),l(),x(n.addFormOpen_$()?18:-1),l(),x(n.bulkOpen_$()?19:-1),l(),x(n.scanOpen_$()?20:-1),l(2),v("ngModel",n.tagFilter),l(),v("ngModel",n.kindFilter),l(),v("ngModel",n.textFilter),l(),v("ngModel",n.ingestRunFilter),l(2),v("ngModel",n.groupByRun),l(4),x(n.loading_$()?31:32)}},dependencies:[L,he,le,X,Z,ve,K,H,P,q,G,Oe],encapsulation:2})}return i})();var pe=function(i){return i.maintenance="maintenance",i.search="search",i.scopes="scopes",i.ingest="ingest",i.settings="settings",i.errors="errors",i}(pe||{});var zn=[{path:"",component:Re},{path:pe.search,component:ze},{path:pe.scopes,component:We},{path:pe.ingest,component:Be},{path:pe.settings,component:je},{path:":table",component:He}];var Xe=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=fe({type:i});static \u0275inj=ge({imports:[P.forChild(zn),P]})}return i})();var Fa=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=fe({type:i});static \u0275inj=ge({imports:[L,Xe]})}return i})();export{Fa as Maintenance_Module};
Binary file
@@ -8,10 +8,10 @@
8
8
  <link rel="icon" type="image/x-icon" href="favicon.ico">
9
9
  <style>@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3GUBGEe.woff2) format('woff2');unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3iUBGEe.woff2) format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3CUBGEe.woff2) format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3-UBGEe.woff2) format('woff2');unicode-range:U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMawCUBGEe.woff2) format('woff2');unicode-range:U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMaxKUBGEe.woff2) format('woff2');unicode-range:U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3OUBGEe.woff2) format('woff2');unicode-range:U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3KUBGEe.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBA.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3GUBGEe.woff2) format('woff2');unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3iUBGEe.woff2) format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3CUBGEe.woff2) format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3-UBGEe.woff2) format('woff2');unicode-range:U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMawCUBGEe.woff2) format('woff2');unicode-range:U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMaxKUBGEe.woff2) format('woff2');unicode-range:U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3OUBGEe.woff2) format('woff2');unicode-range:U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3KUBGEe.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBA.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3GUBGEe.woff2) format('woff2');unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3iUBGEe.woff2) format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3CUBGEe.woff2) format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3-UBGEe.woff2) format('woff2');unicode-range:U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMawCUBGEe.woff2) format('woff2');unicode-range:U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMaxKUBGEe.woff2) format('woff2');unicode-range:U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3OUBGEe.woff2) format('woff2');unicode-range:U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3KUBGEe.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBA.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}</style>
10
10
  <style>@font-face{font-family:'Material Icons';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/materialicons/v145/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2) format('woff2');}.material-icons{font-family:'Material Icons';font-weight:normal;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:'liga';-webkit-font-smoothing:antialiased;}</style>
11
- <style>@font-face{font-family:'Material Symbols Outlined';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/materialsymbolsoutlined/v351/kJF4BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzBwG-RpA6RzaxHMPdY40KH8nGzv3fzfVJU22ZZLsYEpzC_1hCs5Y0.woff2) format('woff2');}.material-symbols-outlined{font-family:'Material Symbols Outlined';font-weight:normal;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:'liga';-webkit-font-smoothing:antialiased;}</style>
12
- <style>@font-face{font-family:'Material Symbols Rounded';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/materialsymbolsrounded/v352/syl7-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvLgyidOK7BDB_Qb9vUdV6_gjDK-P3JuF_Zs-obHph2-jOcZTKPqw.woff2) format('woff2');}.material-symbols-rounded{font-family:'Material Symbols Rounded';font-weight:normal;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:'liga';-webkit-font-smoothing:antialiased;}</style>
11
+ <style>@font-face{font-family:'Material Symbols Outlined';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/materialsymbolsoutlined/v362/kJF4BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzBwG-RpA6RzaxHMPdY40KH8nGzv3fzfVJU22ZZLsYEpzC_1hCs5Y0.woff2) format('woff2');}.material-symbols-outlined{font-family:'Material Symbols Outlined';font-weight:normal;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:'liga';-webkit-font-smoothing:antialiased;}</style>
12
+ <style>@font-face{font-family:'Material Symbols Rounded';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/materialsymbolsrounded/v363/syl7-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvLgyidOK7BDB_Qb9vUdV6_gjDK-P3JuF_Zs-obHph2-jOcZTKPqw.woff2) format('woff2');}.material-symbols-rounded{font-family:'Material Symbols Rounded';font-weight:normal;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:'liga';-webkit-font-smoothing:antialiased;}</style>
13
13
  <style>*,:before,:after{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgb(59 130 246 / .5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}html,body{height:100%;background-color:#0f0f0f}body{margin:0;font-family:Roboto,Helvetica Neue,sans-serif;color:#c8c8c8}</style><link rel="stylesheet" href="styles-3J7JD5YE.css" media="print" onload="this.media='all'"><noscript><link rel="stylesheet" href="styles-3J7JD5YE.css"></noscript></head>
14
14
  <body class="mat-typography">
15
15
  <a-root-root></a-root-root>
16
- <link rel="modulepreload" href="chunk-YXHWCJ5O.js"><script src="polyfills-HGDOEU5L.js" type="module"></script><script src="main-PJPEDVJT.js" type="module"></script></body>
16
+ <link rel="modulepreload" href="chunk-GF3FJP7E.js"><script src="polyfills-HGDOEU5L.js" type="module"></script><script src="main-YK4YIVAQ.js" type="module"></script></body>
17
17
  </html>
@@ -0,0 +1,2 @@
1
+ import{Ba as fe,Ca as q,Da as J,E as l,Ea as Q,F as d,Fa as E,G as M,Ga as c,Ha as A,Ja as s,K as X,M as f,Na as W,V as D,c as v,d as N,e as j,f as P,fa as U,g as L,ga as $,h as i,ha as Z,i as y,ia as G,j as w,ja as x,k as r,ka as K,l as p,la as z,m as h,ma as V,oa as Y,pa as u,q as S,r as B,ra as T,s as H,t as m,u as F,w as k,z as O}from"./chunk-GF3FJP7E.js";var de=v(x());var ee=(()=>{class e{static \u0275fac=function(o){return new(o||e)};static \u0275cmp=p({type:e,selectors:[["a-error"]],standalone:!0,features:[D],decls:5,vars:0,consts:[[1,"p-6"],[1,"text-xl"],[1,"mt-2"]],template:function(o,n){o&1&&(l(0,"section",0)(1,"h2",1),f(2,"Error"),d(),l(3,"p",2),f(4,"TODO: Error page"),d()())},styles:["[_nghost-%COMP%]{display:block}"]})}return e})();var te=(()=>{class e{static \u0275fac=function(o){return new(o||e)};static \u0275cmp=p({type:e,selectors:[["a-page-not-found"]],standalone:!0,features:[D],decls:5,vars:0,consts:[[1,"p-6"],[1,"text-xl"],[1,"mt-2"]],template:function(o,n){o&1&&(l(0,"section",0)(1,"h2",1),f(2,"PageNotFound"),d(),l(3,"p",2),f(4,"TODO: PageNotFound page"),d()())},styles:["[_nghost-%COMP%]{display:block}"]})}return e})();var oe=v(x());var R=v(x());var _=(()=>{class e extends q{router=r(u);loading_$=m(!0);currentRoute;isDarkModeOn_$=m(!0);get isDarkModeOn(){return this.isDarkModeOn_$()}_noServerConnection_BS=new j(!0);noServerConnection$=this._noServerConnection_BS.asObservable();_noServerConnection_$=m(!0);serverConnectionInprogress_$=m(!1);get noServerConnection_$(){return this._noServerConnection_$}constructor(){super(),this.createSubscriptions(),this.initDarkMode()}setNoServerConnection(t){this._noServerConnection_BS.next(t)}waitForServerConnection(){return N(this,null,function*(){this._noServerConnection_$()&&(yield R.DyFM_Async.takeUntil(this.noServerConnection$,t=>!t))})}createSubscriptions(){this.addSubscriptions([this._noServerConnection_BS.subscribe(t=>{this._noServerConnection_$.set(t)}),this.router.events.subscribe(t=>{t instanceof z?this.setLoading(!0):t instanceof V&&(this.setLoading(!1),window.scroll({top:0,behavior:"smooth"}),this.currentRoute=t.url)})])}setLoading(t){return N(this,null,function*(){yield R.DyFM_Async.delay(1),this.loading_$.set(t)})}toggleDarkMode(){this.isDarkModeOn_$.set(!this.isDarkModeOn),this.setDarkMode()}setDarkMode(){let t=document.getElementsByTagName("html")[0];this.isDarkModeOn?t.classList.add("dark"):t.classList.remove("dark")}initDarkMode(){this.isDarkModeOn_$.set(!0),this.setDarkMode()}static \u0275fac=function(o){return new(o||e)};static \u0275prov=i({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})();var ne=(()=>{class e{router=r(u);messageControlService=r(c);render_CS=r(_);intercept(t,o){return o.handle(t).pipe(P(n=>{if(n.status===0&&this.render_CS.setNoServerConnection(!0),n.status===403||n.status===401||n.status===504)throw n;if(n?.error?.flag?.includes(oe.DyFM_errorFlag)){let C=n.error;throw C?.__userMessage?this.messageControlService.newErrorMessage(C.__userMessage):this.messageControlService.newErrorMessage(C._message),C._errorCodes?.includes("FAS-ACS-VRL7")&&this.router.navigate(["/email-verification"]),C.___handled=!0,n}throw this.messageControlService.newErrorMessage(`Unexpected error. (${n?.status}: ${n?.statusText})`),n}))}static \u0275fac=function(o){return new(o||e)};static \u0275prov=i({token:e,factory:e.\u0275fac})}return e})();var re=(()=>{class e{render_CS=r(_);intercept(t,o){return o.handle(t).pipe(L(n=>{n instanceof U&&this.render_CS.setNoServerConnection(!1)}))}static \u0275fac=function(o){return new(o||e)};static \u0275prov=i({token:e,factory:e.\u0275fac})}return e})();var ie=(()=>{class e{notify_CS;ngZone;constructor(t,o){this.notify_CS=t,this.ngZone=o}handleError(t){console.error("[GlobalErrorHandler]",t);let o=t instanceof Error?t.message:String(t);this.ngZone.run(()=>this.notify_CS.newErrorMessage(`V\xE1ratlan hiba: ${o}`))}static \u0275fac=function(o){return new(o||e)(w(c),w(S))};static \u0275prov=i({token:e,factory:e.\u0275fac})}return e})();var me=v(x()),b=v(fe());var _e={common:{loading:"Loading...",save:"Save",cancel:"Cancel",confirm:"Confirm",login:"Login",logout:"Logout",error:"Error"}},se={common:{loading:"T\xF6lt\xE9s...",save:"Ment\xE9s",cancel:"M\xE9gse",confirm:"Meger\u0151s\xEDt\xE9s",login:"Bejelentkez\xE9s",logout:"Kijelentkez\xE9s",error:"Hiba"}},ge={en:_e,hu:se},ae=(()=>{class e{activeLanguage_$=m("hu");dict_$=m(se);setLanguage(t){this.activeLanguage_$.set(t),this.dict_$.set(ge[t])}static \u0275fac=function(o){return new(o||e)};static \u0275prov=i({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})();function Ce(e,I){e&1&&M(0,"dynamo-loading-overlay",0),e&2&&k("message","connecting to server...")}function ve(e,I){e&1&&M(0,"dynamo-blocker",1),e&2&&k("message","Server not available!")("messageRotationDegree",-15)}function ye(e,I){if(e&1&&F(0,Ce,1,1,"dynamo-loading-overlay",0)(1,ve,1,2,"dynamo-blocker",1),e&2){let t=X();O(t.serverConnectionInprogress_$()?0:1)}}var ce=(()=>{class e{render_CS=r(_);ls=r(ae);title="fdp-agent-memory";get noServerConnection_$(){return this.render_CS.noServerConnection_$}get serverConnectionInprogress_$(){return this.render_CS.serverConnectionInprogress_$}constructor(){me.DyFM_global_settings.envOverrides={DyNM_STORAGE_ENCRYPTION_KEY:s.storageEncryptionKey},b.DyFM_uiGlobal_settings.fieldAppearance=b.DyFM_FieldAppearance.outline}static \u0275fac=function(o){return new(o||e)};static \u0275cmp=p({type:e,selectors:[["a-root-root"]],decls:2,vars:1,consts:[[3,"message"],[3,"message","messageRotationDegree"]],template:function(o,n){o&1&&(M(0,"router-outlet"),F(1,ye,2,1)),o&2&&(H(),O(n.noServerConnection_$()?1:-1))},dependencies:[Y,E,A],styles:["[_nghost-%COMP%]{display:block;width:100%;height:100%}"]})}return e})();var he=[{path:"",redirectTo:"maintenance",pathMatch:"full"},{path:"maintenance",loadChildren:()=>import("./chunk-NMUCMQY6.js").then(e=>e.Maintenance_Module)},{path:"errors",component:W},{path:"error",component:ee},{path:"not-found",component:te},{path:"**",redirectTo:"not-found"}],pe=(()=>{class e{static \u0275fac=function(o){return new(o||e)};static \u0275mod=h({type:e});static \u0275inj=y({imports:[T.forRoot(he),T]})}return e})();var le=(()=>{class e{static \u0275fac=function(o){return new(o||e)};static \u0275mod=h({type:e,bootstrap:[ce]});static \u0275inj=y({providers:[{provide:$,useClass:re,multi:!0},{provide:$,useClass:ne,multi:!0,deps:[u,c]},{provide:B,useClass:ie,deps:[c,S]}],imports:[G,K,pe,Q,E,A,J]})}return e})();var g=new URL(window.location.href);s.baseUrl=g.origin;s.api.baseUrl=g.origin+"/api";s.socketAddress=`${g.origin.replace("https","wss").replace("http","ws")}/notifications`;g.hostname==="fdp-agent-memory.hu"||g.hostname==="fdp-agent-memory.com"?s.production=!0:g.hostname.includes("localhost")?console.log("environment",{environment:s}):console.log("environment",{environment:s});Z().bootstrapModule(le).catch(e=>{de.DyFM_Log.H_error(`INIT ERROR
2
+ `,e)});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@futdevpro/fdp-agent-memory",
3
- "version": "1.1.21",
3
+ "version": "1.1.112",
4
4
  "description": "Local-first, vector-backed multi-table agent memory exposed as an MCP server (read/write/capabilities). Public, FDP-Templates-free, no auth.",
5
5
  "private": false,
6
6
  "publishConfig": {
@@ -55,7 +55,7 @@
55
55
  "license": "FDP",
56
56
  "dependencies": {
57
57
  "@futdevpro/fsm-dynamo": "^1.16.7",
58
- "@futdevpro/nts-dynamo": "^1.15.72",
58
+ "@futdevpro/nts-dynamo": "^1.15.74",
59
59
  "@modelcontextprotocol/sdk": "^1.12.0",
60
60
  "axios": "~1.8.1",
61
61
  "better-sqlite3": "^12.4.1",
@@ -1,98 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FAM_ProjectDiscovery_Util = void 0;
4
- const fs_1 = require("fs");
5
- const path_1 = require("path");
6
- /**
7
- * `FAM_ProjectDiscovery_Util` (a `fam scan-projects` magja) — projekt-gyökerek **auto-felderítése** egy mappa
8
- * alatt + a `--config` JSON-lista parse-je. PURE (fs-olvasás, nincs hálózat). A scope-nevet a `package.json`
9
- * `name`-jéből deriválja (a user-kérte „package.json-ből olvas projekt-elnevezéseket"), fallback a dir-név.
10
- *
11
- * **Felderítés-szabály:** egy könyvtár PROJEKT-GYÖKÉR, ha van `package.json` VAGY `.git`. Ott MEGÁLLUNK (nem
12
- * megyünk beljebb — egy monorepo gyökere egy projektnek számít). A `node_modules` + rejtett mappák kihagyva.
13
- */
14
- class FAM_ProjectDiscovery_Util {
15
- /** A projekt-gyökér markerek (bármelyik megléte → projekt). */
16
- static MARKERS = ['package.json', '.git'];
17
- /** Projekt-gyökér-e a könyvtár (van `package.json` vagy `.git`). */
18
- static isProjectRoot(dir) {
19
- return FAM_ProjectDiscovery_Util.MARKERS.some((marker) => (0, fs_1.existsSync)((0, path_1.join)(dir, marker)));
20
- }
21
- /** A scope leaf-név: a `package.json` `name` bare alakja (`@scope/x` → `x`), vagy a dir-név. */
22
- static projectName(dir) {
23
- try {
24
- const pkgPath = (0, path_1.join)(dir, 'package.json');
25
- if ((0, fs_1.existsSync)(pkgPath)) {
26
- const name = JSON.parse((0, fs_1.readFileSync)(pkgPath, 'utf-8')).name;
27
- if (typeof name === 'string' && name.trim()) {
28
- return name.trim().replace(/^@[^/]+\//, '');
29
- }
30
- }
31
- }
32
- catch {
33
- // fallback a dir-névre
34
- }
35
- return (0, path_1.basename)(dir);
36
- }
37
- /**
38
- * Projekt-gyökerek felderítése `root` alatt `maxDepth`-ig. Ha a `root` maga projekt → csak az. Egyébként
39
- * rekurzívan a nem-rejtett alkönyvtárakban (egy projekt-gyökérnél MEGÁLL). Determinisztikus (név szerint rendezett).
40
- */
41
- static discover(root, maxDepth, defaults) {
42
- const result = [];
43
- const visit = (dir, depth) => {
44
- if (depth > maxDepth) {
45
- return;
46
- }
47
- if (FAM_ProjectDiscovery_Util.isProjectRoot(dir)) {
48
- result.push({
49
- path: dir, project: FAM_ProjectDiscovery_Util.projectName(dir),
50
- org: defaults?.org, table: defaults?.table,
51
- });
52
- return; // egy projektbe NEM megyünk beljebb
53
- }
54
- let entries;
55
- try {
56
- entries = (0, fs_1.readdirSync)(dir).sort();
57
- }
58
- catch {
59
- return;
60
- }
61
- for (const name of entries) {
62
- if (name.startsWith('.') || name === 'node_modules') {
63
- continue;
64
- }
65
- const child = (0, path_1.join)(dir, name);
66
- try {
67
- if ((0, fs_1.statSync)(child).isDirectory()) {
68
- visit(child, depth + 1);
69
- }
70
- }
71
- catch {
72
- // olvashatatlan bejegyzés → kihagyjuk
73
- }
74
- }
75
- };
76
- visit(root, 0);
77
- return result;
78
- }
79
- /** A `--config` JSON-lista → projekt-spec-ek (validálva: `path` + `project` kötelező soronként). */
80
- static parseConfig(content) {
81
- const parsed = JSON.parse(content);
82
- if (!Array.isArray(parsed)) {
83
- throw new Error('A scan-projects config egy JSON-tömb legyen: [{ "path": "...", "project": "..." }, ...]');
84
- }
85
- return parsed.map((raw, index) => {
86
- const entry = (raw && typeof raw === 'object') ? raw : {};
87
- if (typeof entry.path !== 'string' || typeof entry.project !== 'string') {
88
- throw new Error(`A config[${index}] hiányos: a 'path' és a 'project' (string) kötelező.`);
89
- }
90
- return {
91
- path: entry.path, project: entry.project,
92
- org: typeof entry.org === 'string' ? entry.org : undefined,
93
- table: typeof entry.table === 'string' ? entry.table : undefined,
94
- };
95
- });
96
- }
97
- }
98
- exports.FAM_ProjectDiscovery_Util = FAM_ProjectDiscovery_Util;
@@ -1,176 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FAM_HeapGuard_ControlService = void 0;
4
- const tslib_1 = require("tslib");
5
- const v8 = tslib_1.__importStar(require("v8"));
6
- const perf_hooks_1 = require("perf_hooks");
7
- const fsm_dynamo_1 = require("@futdevpro/fsm-dynamo");
8
- /**
9
- * `FAM_HeapGuard_ControlService` (user-FR 2026-06-21) — **OOM-hibakezelés**. A FAM-szerver V8-heapje a nagy korpuszon
10
- * (126k vektor) + nehéz műveletekkor (scan/import/re-embed) a plafonhoz érhet → „Ineffective mark-compacts near heap
11
- * limit" → FATAL exit 134 (nem catch-elhető). Ez a guard:
12
- *
13
- * 1. **Watchdog**: periodikusan méri a heap-arányt (`v8.getHeapStatistics`) ÉS a GC-hányadot (`perf_hooks` 'gc'
14
- * observer — a thrash valódi jele: a trace-ben `mu = 0.306`, azaz a futás 70%-a GC). A szint-váltásokat logolja
15
- * (a `/api/logs`-on az agent IS látja jönni a nyomást).
16
- * 2. **Load-shed**: `shouldShedLoad()` → a NEHÉZ write-ek (scan/import/re-embed) `critical` nyomásnál 503-mal
17
- * elutasítva, MIELŐTT egy újabb nagy allokáció átlöki a plafont (a könnyű read/create/update fut tovább).
18
- * 3. **Graceful exit**: ha a nyomás a `exitRatio` fölött tartós (GC-vel sem csökken), strukturált diagnosztika +
19
- * tiszta `process.exit` → a `fam serve` ps1-wrapper PREDIKTÍVAN újraindít (a kriptikus exit-134 helyett).
20
- * 4. **Crash-handler**: `uncaughtException` / `unhandledRejection` → strukturált log + tiszta exit (eddig néma volt).
21
- *
22
- * Lokális, single-user (ADR-004) → a load-shed a saját gépet védi, nem multi-tenant fairness. A küszöbök
23
- * config-/env-kapcsolósak; a tiszta szint-számítás (`computeLevel`) pure + külön tesztelt.
24
- */
25
- class FAM_HeapGuard_ControlService {
26
- static _instance;
27
- /** GC-hányad-küszöb a `warn`/`critical` szinthez (a thrash-jelhez; a ratio MELLETT). */
28
- static GC_WARN_FRACTION = 0.40;
29
- static GC_CRITICAL_FRACTION = 0.60;
30
- thresholds = {
31
- warnRatio: 0.70, shedRatio: 0.82, exitRatio: 0.92, pollMs: 3000, enabled: true,
32
- };
33
- installed = false;
34
- timer;
35
- gcObserver;
36
- lastLevel = 'ok';
37
- /** A GC-ben töltött ms gördülő ablaka (timestamp + duration párok az utolsó ~pollMs-re). */
38
- gcEvents = [];
39
- static getInstance() {
40
- if (!FAM_HeapGuard_ControlService._instance) {
41
- FAM_HeapGuard_ControlService._instance = new FAM_HeapGuard_ControlService();
42
- }
43
- return FAM_HeapGuard_ControlService._instance;
44
- }
45
- /** A küszöbök beállítása (install ELŐTT) — clamp `[0..1]` (a pollMs `[500..60000]`). Hiányzó mező → marad a default. */
46
- configure(partial) {
47
- const clampRatio = (value, fallback) => (typeof value === 'number' && value > 0 && value <= 1) ? value : fallback;
48
- this.thresholds = {
49
- warnRatio: clampRatio(partial.warnRatio, this.thresholds.warnRatio),
50
- shedRatio: clampRatio(partial.shedRatio, this.thresholds.shedRatio),
51
- exitRatio: clampRatio(partial.exitRatio, this.thresholds.exitRatio),
52
- pollMs: typeof partial.pollMs === 'number' && partial.pollMs >= 500
53
- ? Math.min(partial.pollMs, 60000) : this.thresholds.pollMs,
54
- enabled: typeof partial.enabled === 'boolean' ? partial.enabled : this.thresholds.enabled,
55
- };
56
- }
57
- /** A crash-handlerek + (ha enabled) a watchdog + GC-observer telepítése. Idempotens (egyszer fut). Best-effort. */
58
- install() {
59
- if (this.installed) {
60
- return;
61
- }
62
- this.installed = true;
63
- process.on('uncaughtException', (error) => this.onFatal('uncaughtException', error));
64
- process.on('unhandledRejection', (reason) => this.onFatal('unhandledRejection', reason));
65
- if (!this.thresholds.enabled) {
66
- fsm_dynamo_1.DyFM_Log.info('[heap-guard] disabled (memory.guardEnabled=false) — csak a crash-handlerek aktívak.');
67
- return;
68
- }
69
- this.installGcObserver();
70
- this.timer = setInterval(() => this.tick(), this.thresholds.pollMs);
71
- // A timer NE tartsa életben a process-t (a graceful shutdownt ne blokkolja).
72
- this.timer.unref?.();
73
- fsm_dynamo_1.DyFM_Log.info(`[heap-guard] aktív (poll ${this.thresholds.pollMs}ms; shed@${Math.round(this.thresholds.shedRatio * 100)}%, `
74
- + `exit@${Math.round(this.thresholds.exitRatio * 100)}%).`);
75
- }
76
- /** Pure szint-számítás (külön tesztelhető): a ratio ÉS a GC-hányad közül a ROSSZABB dönt. */
77
- static computeLevel(ratio, gcFraction, thresholds) {
78
- if (ratio >= thresholds.shedRatio || gcFraction >= FAM_HeapGuard_ControlService.GC_CRITICAL_FRACTION) {
79
- return 'critical';
80
- }
81
- if (ratio >= thresholds.warnRatio || gcFraction >= FAM_HeapGuard_ControlService.GC_WARN_FRACTION) {
82
- return 'warn';
83
- }
84
- return 'ok';
85
- }
86
- /** A pillanatnyi heap-nyomás (ratio + GC-hányad → szint). Observability + load-shed forrása. */
87
- pressure() {
88
- const stats = v8.getHeapStatistics();
89
- const usedMb = Math.round(stats.used_heap_size / 1048576);
90
- const limitMb = Math.round(stats.heap_size_limit / 1048576);
91
- const ratio = stats.heap_size_limit ? stats.used_heap_size / stats.heap_size_limit : 0;
92
- const gcFraction = this.recentGcFraction();
93
- const level = FAM_HeapGuard_ControlService.computeLevel(ratio, gcFraction, this.thresholds);
94
- return { level: level, usedMb: usedMb, limitMb: limitMb, ratio: ratio, gcFraction: gcFraction };
95
- }
96
- /** `true` → a NEHÉZ write-eket (scan/import/re-embed) le kell shed-elni (critical nyomás). Disabled → soha. */
97
- shouldShedLoad() {
98
- return this.thresholds.enabled && this.pressure().level === 'critical';
99
- }
100
- /** A GC-hányad az utolsó `pollMs` ablakban (GC-ms / ablak-ms; clamp [0..1]). */
101
- recentGcFraction() {
102
- const windowMs = this.thresholds.pollMs;
103
- const cutoff = Date.now() - windowMs;
104
- this.gcEvents = this.gcEvents.filter((event) => event.at >= cutoff);
105
- const gcMs = this.gcEvents.reduce((sum, event) => sum + event.ms, 0);
106
- return Math.min(gcMs / windowMs, 1);
107
- }
108
- /** A 'gc' perf-entry-k figyelése — a GC-ben töltött időt gyűjti a gördülő ablakhoz. */
109
- installGcObserver() {
110
- try {
111
- this.gcObserver = new perf_hooks_1.PerformanceObserver((list) => {
112
- const now = Date.now();
113
- for (const entry of list.getEntries()) {
114
- this.gcEvents.push({ at: now, ms: entry.duration });
115
- }
116
- });
117
- this.gcObserver.observe({ entryTypes: ['gc'] });
118
- }
119
- catch {
120
- // A GC-observer nem kritikus (a ratio-jel marad) — best-effort.
121
- }
122
- }
123
- /** A watchdog-tick: szint-váltás logolása + a tartós veszély-zóna graceful-exit-je. */
124
- tick() {
125
- const pressure = this.pressure();
126
- if (pressure.level !== this.lastLevel) {
127
- const line = `[heap-guard] ${this.lastLevel}→${pressure.level} `
128
- + `(${pressure.usedMb}/${pressure.limitMb} MB ${Math.round(pressure.ratio * 100)}%, GC ${Math.round(pressure.gcFraction * 100)}%)`;
129
- if (pressure.level === 'critical') {
130
- fsm_dynamo_1.DyFM_Log.warn(`${line} — a nehéz write-ek (scan/import/re-embed) load-shed (503).`);
131
- }
132
- else if (pressure.level === 'warn') {
133
- fsm_dynamo_1.DyFM_Log.warn(line);
134
- }
135
- else {
136
- fsm_dynamo_1.DyFM_Log.info(`${line} — nyomás enyhült.`);
137
- }
138
- this.lastLevel = pressure.level;
139
- }
140
- // Tartós veszély-zóna: GC-kísérlet, majd ha nem csökken → tiszta, logolt exit (a ps1 újraindít).
141
- if (pressure.ratio >= this.thresholds.exitRatio) {
142
- this.attemptGcReclaim();
143
- const after = this.pressure();
144
- if (after.ratio >= this.thresholds.exitRatio) {
145
- fsm_dynamo_1.DyFM_Log.error(`[heap-guard] HEAP-VÉSZ ${after.usedMb}/${after.limitMb} MB (${Math.round(after.ratio * 100)}%) — `
146
- + 'graceful exit, hogy a `fam serve` TISZTÁN újraindítson (a kriptikus OOM exit-134 elkerülése).');
147
- // Egy tick haladékot adunk a log flush-nek, majd restartolható kóddal kilépünk.
148
- setTimeout(() => process.exit(137), 250).unref?.();
149
- }
150
- }
151
- }
152
- /** Best-effort GC-kényszerítés (csak ha `--expose-gc`). A near-limit utolsó esély a tiszta-exit ELŐTT. */
153
- attemptGcReclaim() {
154
- try {
155
- const maybeGc = global.gc;
156
- if (maybeGc) {
157
- maybeGc();
158
- }
159
- }
160
- catch {
161
- // nincs --expose-gc → nincs mit tenni; a tiszta-exit a fallback.
162
- }
163
- }
164
- /** Strukturált crash-log + tiszta exit (a `fam serve` ps1 újraindít). Az OOM-fatal NEM ide jön (nem catch-elhető). */
165
- onFatal(kind, error) {
166
- try {
167
- const message = error instanceof Error ? `${error.message}\n${error.stack ?? ''}` : String(error);
168
- fsm_dynamo_1.DyFM_Log.error(`[heap-guard] FATAL ${kind}: ${message}`);
169
- }
170
- catch {
171
- // a log se buktasson — best-effort.
172
- }
173
- setTimeout(() => process.exit(1), 250).unref?.();
174
- }
175
- }
176
- exports.FAM_HeapGuard_ControlService = FAM_HeapGuard_ControlService;