@purpleraven/hits 0.2.0
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.
- package/AGENTS.md +298 -0
- package/LICENSE +190 -0
- package/README.md +336 -0
- package/bin/hits.js +56 -0
- package/config/schema.json +94 -0
- package/config/settings.yaml +102 -0
- package/data/dev_handover.yaml +143 -0
- package/hits_core/__init__.py +9 -0
- package/hits_core/ai/__init__.py +11 -0
- package/hits_core/ai/compressor.py +86 -0
- package/hits_core/ai/llm_client.py +65 -0
- package/hits_core/ai/slm_filter.py +126 -0
- package/hits_core/api/__init__.py +3 -0
- package/hits_core/api/routes/__init__.py +8 -0
- package/hits_core/api/routes/auth.py +211 -0
- package/hits_core/api/routes/handover.py +117 -0
- package/hits_core/api/routes/health.py +8 -0
- package/hits_core/api/routes/knowledge.py +177 -0
- package/hits_core/api/routes/node.py +121 -0
- package/hits_core/api/routes/work_log.py +174 -0
- package/hits_core/api/server.py +181 -0
- package/hits_core/auth/__init__.py +21 -0
- package/hits_core/auth/dependencies.py +61 -0
- package/hits_core/auth/manager.py +368 -0
- package/hits_core/auth/middleware.py +69 -0
- package/hits_core/collector/__init__.py +18 -0
- package/hits_core/collector/ai_session_collector.py +118 -0
- package/hits_core/collector/base.py +73 -0
- package/hits_core/collector/daemon.py +94 -0
- package/hits_core/collector/git_collector.py +177 -0
- package/hits_core/collector/hits_action_collector.py +110 -0
- package/hits_core/collector/shell_collector.py +178 -0
- package/hits_core/main.py +36 -0
- package/hits_core/mcp/__init__.py +20 -0
- package/hits_core/mcp/server.py +429 -0
- package/hits_core/models/__init__.py +18 -0
- package/hits_core/models/node.py +56 -0
- package/hits_core/models/tree.py +68 -0
- package/hits_core/models/work_log.py +64 -0
- package/hits_core/models/workflow.py +92 -0
- package/hits_core/platform/__init__.py +5 -0
- package/hits_core/platform/actions.py +225 -0
- package/hits_core/service/__init__.py +6 -0
- package/hits_core/service/handover_service.py +382 -0
- package/hits_core/service/knowledge_service.py +172 -0
- package/hits_core/service/tree_service.py +105 -0
- package/hits_core/storage/__init__.py +11 -0
- package/hits_core/storage/base.py +84 -0
- package/hits_core/storage/file_store.py +314 -0
- package/hits_core/storage/redis_store.py +123 -0
- package/hits_web/dist/assets/index-Bgx7F6m6.css +1 -0
- package/hits_web/dist/assets/index-D1B5E67G.js +3 -0
- package/hits_web/dist/index.html +16 -0
- package/package.json +60 -0
- package/requirements-core.txt +7 -0
- package/requirements.txt +1 -0
- package/run.sh +271 -0
- package/server.js +234 -0
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
var Si=Object.defineProperty;var _a=e=>{throw TypeError(e)};var Ei=(e,t,r)=>t in e?Si(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var nt=(e,t,r)=>Ei(e,typeof t!="symbol"?t+"":t,r),On=(e,t,r)=>t.has(e)||_a("Cannot "+r);var f=(e,t,r)=>(On(e,t,"read from private field"),r?r.call(e):t.get(e)),W=(e,t,r)=>t.has(e)?_a("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,r),G=(e,t,r,n)=>(On(e,t,"write to private field"),n?n.call(e,r):t.set(e,r),r),pe=(e,t,r)=>(On(e,t,"access private method"),r);(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const a of document.querySelectorAll('link[rel="modulepreload"]'))n(a);new MutationObserver(a=>{for(const i of a)if(i.type==="childList")for(const s of i.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&n(s)}).observe(document,{childList:!0,subtree:!0});function r(a){const i={};return a.integrity&&(i.integrity=a.integrity),a.referrerPolicy&&(i.referrerPolicy=a.referrerPolicy),a.crossOrigin==="use-credentials"?i.credentials="include":a.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function n(a){if(a.ep)return;a.ep=!0;const i=r(a);fetch(a.href,i)}})();const Pi=!1;var ta=Array.isArray,Ti=Array.prototype.indexOf,Dr=Array.prototype.includes,Nn=Array.from,Ni=Object.defineProperty,Yr=Object.getOwnPropertyDescriptor,Ci=Object.getOwnPropertyDescriptors,Li=Object.prototype,Ai=Array.prototype,Da=Object.getPrototypeOf,pa=Object.isExtensible;const ji=()=>{};function Di(e){for(var t=0;t<e.length;t++)e[t]()}function $a(){var e,t,r=new Promise((n,a)=>{e=n,t=a});return{promise:r,resolve:e,reject:t}}const Ye=2,$r=4,Cn=8,Oa=1<<24,Dt=16,Et=32,yr=64,Hn=128,mt=512,De=1024,Ue=2048,$t=4096,Qe=8192,wt=16384,Sr=32768,ga=1<<25,Or=65536,qn=1<<17,$i=1<<18,zr=1<<19,Oi=1<<20,jt=1<<25,br=65536,Un=1<<21,Xr=1<<22,tr=1<<23,Vr=Symbol("$state"),Mi=Symbol(""),Ft=new class extends Error{constructor(){super(...arguments);nt(this,"name","StaleReactionError");nt(this,"message","The reaction that called `getAbortSignal()` was re-run or destroyed")}};function Ii(e){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function Ri(){throw new Error("https://svelte.dev/e/async_derived_orphan")}function Fi(e,t,r){throw new Error("https://svelte.dev/e/each_key_duplicate")}function zi(e){throw new Error("https://svelte.dev/e/effect_in_teardown")}function Hi(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}function qi(e){throw new Error("https://svelte.dev/e/effect_orphan")}function Ui(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function Wi(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function Bi(){throw new Error("https://svelte.dev/e/state_prototype_fixed")}function Yi(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}function Vi(){throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")}const Ki=1,Ji=2,Ma=4,Gi=8,Qi=16,Xi=1,Zi=2,Ie=Symbol(),Ia="http://www.w3.org/1999/xhtml";function eo(){console.warn("https://svelte.dev/e/derived_inert")}function to(){console.warn("https://svelte.dev/e/select_multiple_invalid_value")}function ro(){console.warn("https://svelte.dev/e/svelte_boundary_reset_noop")}function Ra(e){return e===this.v}function no(e,t){return e!=e?t==t:e!==t||e!==null&&typeof e=="object"||typeof e=="function"}function Fa(e){return!no(e,this.v)}let ao=!1,lt=null;function Mr(e){lt=e}function Er(e,t=!1,r){lt={p:lt,i:!1,c:null,e:null,s:e,x:null,r:re,l:null}}function Pr(e){var t=lt,r=t.e;if(r!==null){t.e=null;for(var n of r)ai(n)}return t.i=!0,lt=t.p,{}}function za(){return!0}let lr=[];function Ha(){var e=lr;lr=[],Di(e)}function rr(e){if(lr.length===0&&!Kr){var t=lr;queueMicrotask(()=>{t===lr&&Ha()})}lr.push(e)}function io(){for(;lr.length>0;)Ha()}function qa(e){var t=re;if(t===null)return Z.f|=tr,e;if((t.f&Sr)===0&&(t.f&$r)===0)throw e;er(e,t)}function er(e,t){for(;t!==null;){if((t.f&Hn)!==0){if((t.f&Sr)===0)throw e;try{t.b.error(e);return}catch(r){e=r}}t=t.parent}throw e}const oo=-7169;function Te(e,t){e.f=e.f&oo|t}function ra(e){(e.f&mt)!==0||e.deps===null?Te(e,De):Te(e,$t)}function Ua(e){if(e!==null)for(const t of e)(t.f&Ye)===0||(t.f&br)===0||(t.f^=br,Ua(t.deps))}function Wa(e,t,r){(e.f&Ue)!==0?t.add(e):(e.f&$t)!==0&&r.add(e),Ua(e.deps),Te(e,De)}const sr=new Set;let D=null,qe=null,Wn=null,Kr=!1,Mn=!1,Tr=null,vn=null;var ma=0;let so=1;var Nr,Cr,cr,zt,Ct,en,it,tn,Xt,Ht,Lt,Lr,Ar,vr,Le,hn,Ba,_n,Bn,pn,lo;const En=class En{constructor(){W(this,Le);nt(this,"id",so++);nt(this,"current",new Map);nt(this,"previous",new Map);W(this,Nr,new Set);W(this,Cr,new Set);W(this,cr,new Set);W(this,zt,new Map);W(this,Ct,new Map);W(this,en,null);W(this,it,[]);W(this,tn,[]);W(this,Xt,new Set);W(this,Ht,new Set);W(this,Lt,new Map);W(this,Lr,new Set);nt(this,"is_fork",!1);W(this,Ar,!1);W(this,vr,new Set)}skip_effect(t){f(this,Lt).has(t)||f(this,Lt).set(t,{d:[],m:[]}),f(this,Lr).delete(t)}unskip_effect(t,r=n=>this.schedule(n)){var n=f(this,Lt).get(t);if(n){f(this,Lt).delete(t);for(var a of n.d)Te(a,Ue),r(a);for(a of n.m)Te(a,$t),r(a)}f(this,Lr).add(t)}capture(t,r,n=!1){t.v!==Ie&&!this.previous.has(t)&&this.previous.set(t,t.v),(t.f&tr)===0&&(this.current.set(t,[r,n]),qe==null||qe.set(t,r)),this.is_fork||(t.v=r)}activate(){D=this}deactivate(){D=null,qe=null}flush(){try{Mn=!0,D=this,pe(this,Le,_n).call(this)}finally{ma=0,Wn=null,Tr=null,vn=null,Mn=!1,D=null,qe=null,gr.clear()}}discard(){for(const t of f(this,Cr))t(this);f(this,Cr).clear(),f(this,cr).clear(),sr.delete(this)}register_created_effect(t){f(this,tn).push(t)}increment(t,r){let n=f(this,zt).get(r)??0;if(f(this,zt).set(r,n+1),t){let a=f(this,Ct).get(r)??0;f(this,Ct).set(r,a+1)}}decrement(t,r,n){let a=f(this,zt).get(r)??0;if(a===1?f(this,zt).delete(r):f(this,zt).set(r,a-1),t){let i=f(this,Ct).get(r)??0;i===1?f(this,Ct).delete(r):f(this,Ct).set(r,i-1)}f(this,Ar)||n||(G(this,Ar,!0),rr(()=>{G(this,Ar,!1),this.flush()}))}transfer_effects(t,r){for(const n of t)f(this,Xt).add(n);for(const n of r)f(this,Ht).add(n);t.clear(),r.clear()}oncommit(t){f(this,Nr).add(t)}ondiscard(t){f(this,Cr).add(t)}on_fork_commit(t){f(this,cr).add(t)}run_fork_commit_callbacks(){for(const t of f(this,cr))t(this);f(this,cr).clear()}settled(){return(f(this,en)??G(this,en,$a())).promise}static ensure(){if(D===null){const t=D=new En;Mn||(sr.add(D),Kr||rr(()=>{D===t&&t.flush()}))}return D}apply(){{qe=null;return}}schedule(t){var a;if(Wn=t,(a=t.b)!=null&&a.is_pending&&(t.f&($r|Cn|Oa))!==0&&(t.f&Sr)===0){t.b.defer_effect(t);return}for(var r=t;r.parent!==null;){r=r.parent;var n=r.f;if(Tr!==null&&r===re&&(Z===null||(Z.f&Ye)===0))return;if((n&(yr|Et))!==0){if((n&De)===0)return;r.f^=De}}f(this,it).push(r)}};Nr=new WeakMap,Cr=new WeakMap,cr=new WeakMap,zt=new WeakMap,Ct=new WeakMap,en=new WeakMap,it=new WeakMap,tn=new WeakMap,Xt=new WeakMap,Ht=new WeakMap,Lt=new WeakMap,Lr=new WeakMap,Ar=new WeakMap,vr=new WeakMap,Le=new WeakSet,hn=function(){return this.is_fork||f(this,Ct).size>0},Ba=function(){for(const n of f(this,vr))for(const a of f(n,Ct).keys()){for(var t=!1,r=a;r.parent!==null;){if(f(this,Lt).has(r)){t=!0;break}r=r.parent}if(!t)return!0}return!1},_n=function(){var u,d;if(ma++>1e3&&(sr.delete(this),fo()),!pe(this,Le,hn).call(this)){for(const v of f(this,Xt))f(this,Ht).delete(v),Te(v,Ue),this.schedule(v);for(const v of f(this,Ht))Te(v,$t),this.schedule(v)}const t=f(this,it);G(this,it,[]),this.apply();var r=Tr=[],n=[],a=vn=[];for(const v of t)try{pe(this,Le,Bn).call(this,v,r,n)}catch(_){throw Ka(v),_}if(D=null,a.length>0){var i=En.ensure();for(const v of a)i.schedule(v)}if(Tr=null,vn=null,pe(this,Le,hn).call(this)||pe(this,Le,Ba).call(this)){pe(this,Le,pn).call(this,n),pe(this,Le,pn).call(this,r);for(const[v,_]of f(this,Lt))Va(v,_)}else{f(this,zt).size===0&&sr.delete(this),f(this,Xt).clear(),f(this,Ht).clear();for(const v of f(this,Nr))v(this);f(this,Nr).clear(),wa(n),wa(r),(u=f(this,en))==null||u.resolve()}var s=D;if(f(this,it).length>0){const v=s??(s=this);f(v,it).push(...f(this,it).filter(_=>!f(v,it).includes(_)))}s!==null&&(sr.add(s),pe(d=s,Le,_n).call(d))},Bn=function(t,r,n){t.f^=De;for(var a=t.first;a!==null;){var i=a.f,s=(i&(Et|yr))!==0,u=s&&(i&De)!==0,d=u||(i&Qe)!==0||f(this,Lt).has(a);if(!d&&a.fn!==null){s?a.f^=De:(i&$r)!==0?r.push(a):ln(a)&&((i&Dt)!==0&&f(this,Ht).add(a),Rr(a));var v=a.first;if(v!==null){a=v;continue}}for(;a!==null;){var _=a.next;if(_!==null){a=_;break}a=a.parent}}},pn=function(t){for(var r=0;r<t.length;r+=1)Wa(t[r],f(this,Xt),f(this,Ht))},lo=function(){var _,S,g;for(const x of sr){var t=x.id<this.id,r=[];for(const[y,[j,w]]of this.current){if(x.current.has(y)){var n=x.current.get(y)[0];if(t&&j!==n)x.current.set(y,[j,w]);else continue}r.push(y)}var a=[...x.current.keys()].filter(y=>!this.current.has(y));if(a.length===0)t&&x.discard();else if(r.length>0){if(t)for(const y of f(this,Lr))x.unskip_effect(y,j=>{var w;(j.f&(Dt|Xr))!==0?x.schedule(j):pe(w=x,Le,pn).call(w,[j])});x.activate();var i=new Set,s=new Map;for(var u of r)Ya(u,a,i,s);s=new Map;var d=[...x.current.keys()].filter(y=>this.current.has(y)?this.current.get(y)[0]!==y:!0);for(const y of f(this,tn))(y.f&(wt|Qe|qn))===0&&na(y,d,s)&&((y.f&(Xr|Dt))!==0?(Te(y,Ue),x.schedule(y)):f(x,Xt).add(y));if(f(x,it).length>0){x.apply();for(var v of f(x,it))pe(_=x,Le,Bn).call(_,v,[],[]);G(x,it,[])}x.deactivate()}}for(const x of sr)f(x,vr).has(this)&&(f(x,vr).delete(this),f(x,vr).size===0&&!pe(S=x,Le,hn).call(S)&&(x.activate(),pe(g=x,Le,_n).call(g)))};let xr=En;function uo(e){var t=Kr;Kr=!0;try{for(var r;;){if(io(),D===null)return r;D.flush()}}finally{Kr=t}}function fo(){try{Ui()}catch(e){er(e,Wn)}}let xt=null;function wa(e){var t=e.length;if(t!==0){for(var r=0;r<t;){var n=e[r++];if((n.f&(wt|Qe))===0&&ln(n)&&(xt=new Set,Rr(n),n.deps===null&&n.first===null&&n.nodes===null&&n.teardown===null&&n.ac===null&&oi(n),(xt==null?void 0:xt.size)>0)){gr.clear();for(const a of xt){if((a.f&(wt|Qe))!==0)continue;const i=[a];let s=a.parent;for(;s!==null;)xt.has(s)&&(xt.delete(s),i.push(s)),s=s.parent;for(let u=i.length-1;u>=0;u--){const d=i[u];(d.f&(wt|Qe))===0&&Rr(d)}}xt.clear()}}xt=null}}function Ya(e,t,r,n){if(!r.has(e)&&(r.add(e),e.reactions!==null))for(const a of e.reactions){const i=a.f;(i&Ye)!==0?Ya(a,t,r,n):(i&(Xr|Dt))!==0&&(i&Ue)===0&&na(a,t,n)&&(Te(a,Ue),aa(a))}}function na(e,t,r){const n=r.get(e);if(n!==void 0)return n;if(e.deps!==null)for(const a of e.deps){if(Dr.call(t,a))return!0;if((a.f&Ye)!==0&&na(a,t,r))return r.set(a,!0),!0}return r.set(e,!1),!1}function aa(e){D.schedule(e)}function Va(e,t){if(!((e.f&Et)!==0&&(e.f&De)!==0)){(e.f&Ue)!==0?t.d.push(e):(e.f&$t)!==0&&t.m.push(e),Te(e,De);for(var r=e.first;r!==null;)Va(r,t),r=r.next}}function Ka(e){Te(e,De);for(var t=e.first;t!==null;)Ka(t),t=t.next}function co(e){let t=0,r=kr(0),n;return()=>{la()&&(o(r),da(()=>(t===0&&(n=An(()=>e(()=>Jr(r)))),t+=1,()=>{rr(()=>{t-=1,t===0&&(n==null||n(),n=void 0,Jr(r))})})))}}var vo=Or|zr;function ho(e,t,r,n){new _o(e,t,r,n)}var ft,ea,ct,hr,Xe,vt,Ge,ot,qt,_r,Zt,jr,rn,nn,Ut,Pn,Se,po,go,mo,Yn,gn,mn,Vn,Kn;class _o{constructor(t,r,n,a){W(this,Se);nt(this,"parent");nt(this,"is_pending",!1);nt(this,"transform_error");W(this,ft);W(this,ea,null);W(this,ct);W(this,hr);W(this,Xe);W(this,vt,null);W(this,Ge,null);W(this,ot,null);W(this,qt,null);W(this,_r,0);W(this,Zt,0);W(this,jr,!1);W(this,rn,new Set);W(this,nn,new Set);W(this,Ut,null);W(this,Pn,co(()=>(G(this,Ut,kr(f(this,_r))),()=>{G(this,Ut,null)})));var i;G(this,ft,t),G(this,ct,r),G(this,hr,s=>{var u=re;u.b=this,u.f|=Hn,n(s)}),this.parent=re.b,this.transform_error=a??((i=this.parent)==null?void 0:i.transform_error)??(s=>s),G(this,Xe,fa(()=>{pe(this,Se,Yn).call(this)},vo))}defer_effect(t){Wa(t,f(this,rn),f(this,nn))}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!f(this,ct).pending}update_pending_count(t,r){pe(this,Se,Vn).call(this,t,r),G(this,_r,f(this,_r)+t),!(!f(this,Ut)||f(this,jr))&&(G(this,jr,!0),rr(()=>{G(this,jr,!1),f(this,Ut)&&Ir(f(this,Ut),f(this,_r))}))}get_effect_pending(){return f(this,Pn).call(this),o(f(this,Ut))}error(t){if(!f(this,ct).onerror&&!f(this,ct).failed)throw t;D!=null&&D.is_fork?(f(this,vt)&&D.skip_effect(f(this,vt)),f(this,Ge)&&D.skip_effect(f(this,Ge)),f(this,ot)&&D.skip_effect(f(this,ot)),D.on_fork_commit(()=>{pe(this,Se,Kn).call(this,t)})):pe(this,Se,Kn).call(this,t)}}ft=new WeakMap,ea=new WeakMap,ct=new WeakMap,hr=new WeakMap,Xe=new WeakMap,vt=new WeakMap,Ge=new WeakMap,ot=new WeakMap,qt=new WeakMap,_r=new WeakMap,Zt=new WeakMap,jr=new WeakMap,rn=new WeakMap,nn=new WeakMap,Ut=new WeakMap,Pn=new WeakMap,Se=new WeakSet,po=function(){try{G(this,vt,ht(()=>f(this,hr).call(this,f(this,ft))))}catch(t){this.error(t)}},go=function(t){const r=f(this,ct).failed;r&&G(this,ot,ht(()=>{r(f(this,ft),()=>t,()=>()=>{})}))},mo=function(){const t=f(this,ct).pending;t&&(this.is_pending=!0,G(this,Ge,ht(()=>t(f(this,ft)))),rr(()=>{var r=G(this,qt,document.createDocumentFragment()),n=Yt();r.append(n),G(this,vt,pe(this,Se,mn).call(this,()=>ht(()=>f(this,hr).call(this,n)))),f(this,Zt)===0&&(f(this,ft).before(r),G(this,qt,null),mr(f(this,Ge),()=>{G(this,Ge,null)}),pe(this,Se,gn).call(this,D))}))},Yn=function(){try{if(this.is_pending=this.has_pending_snippet(),G(this,Zt,0),G(this,_r,0),G(this,vt,ht(()=>{f(this,hr).call(this,f(this,ft))})),f(this,Zt)>0){var t=G(this,qt,document.createDocumentFragment());ha(f(this,vt),t);const r=f(this,ct).pending;G(this,Ge,ht(()=>r(f(this,ft))))}else pe(this,Se,gn).call(this,D)}catch(r){this.error(r)}},gn=function(t){this.is_pending=!1,t.transfer_effects(f(this,rn),f(this,nn))},mn=function(t){var r=re,n=Z,a=lt;Ot(f(this,Xe)),bt(f(this,Xe)),Mr(f(this,Xe).ctx);try{return xr.ensure(),t()}catch(i){return qa(i),null}finally{Ot(r),bt(n),Mr(a)}},Vn=function(t,r){var n;if(!this.has_pending_snippet()){this.parent&&pe(n=this.parent,Se,Vn).call(n,t,r);return}G(this,Zt,f(this,Zt)+t),f(this,Zt)===0&&(pe(this,Se,gn).call(this,r),f(this,Ge)&&mr(f(this,Ge),()=>{G(this,Ge,null)}),f(this,qt)&&(f(this,ft).before(f(this,qt)),G(this,qt,null)))},Kn=function(t){f(this,vt)&&(tt(f(this,vt)),G(this,vt,null)),f(this,Ge)&&(tt(f(this,Ge)),G(this,Ge,null)),f(this,ot)&&(tt(f(this,ot)),G(this,ot,null));var r=f(this,ct).onerror;let n=f(this,ct).failed;var a=!1,i=!1;const s=()=>{if(a){ro();return}a=!0,i&&Vi(),f(this,ot)!==null&&mr(f(this,ot),()=>{G(this,ot,null)}),pe(this,Se,mn).call(this,()=>{pe(this,Se,Yn).call(this)})},u=d=>{try{i=!0,r==null||r(d,s),i=!1}catch(v){er(v,f(this,Xe)&&f(this,Xe).parent)}n&&G(this,ot,pe(this,Se,mn).call(this,()=>{try{return ht(()=>{var v=re;v.b=this,v.f|=Hn,n(f(this,ft),()=>d,()=>s)})}catch(v){return er(v,f(this,Xe).parent),null}}))};rr(()=>{var d;try{d=this.transform_error(t)}catch(v){er(v,f(this,Xe)&&f(this,Xe).parent);return}d!==null&&typeof d=="object"&&typeof d.then=="function"?d.then(u,v=>er(v,f(this,Xe)&&f(this,Xe).parent)):u(d)})};function wo(e,t,r,n){const a=ia;var i=e.filter(g=>!g.settled);if(r.length===0&&i.length===0){n(t.map(a));return}var s=re,u=yo(),d=i.length===1?i[0].promise:i.length>1?Promise.all(i.map(g=>g.promise)):null;function v(g){u();try{n(g)}catch(x){(s.f&wt)===0&&er(x,s)}yn()}if(r.length===0){d.then(()=>v(t.map(a)));return}var _=Ja();function S(){Promise.all(r.map(g=>bo(g))).then(g=>v([...t.map(a),...g])).catch(g=>er(g,s)).finally(()=>_())}d?d.then(()=>{u(),S(),yn()}):S()}function yo(){var e=re,t=Z,r=lt,n=D;return function(i=!0){Ot(e),bt(t),Mr(r),i&&(e.f&wt)===0&&(n==null||n.activate(),n==null||n.apply())}}function yn(e=!0){Ot(null),bt(null),Mr(null),e&&(D==null||D.deactivate())}function Ja(){var e=re,t=e.b,r=D,n=t.is_rendered();return t.update_pending_count(1,r),r.increment(n,e),(a=!1)=>{t.update_pending_count(-1,r),r.decrement(n,e,a)}}function ia(e){var t=Ye|Ue;return re!==null&&(re.f|=zr),{ctx:lt,deps:null,effects:null,equals:Ra,f:t,fn:e,reactions:null,rv:0,v:Ie,wv:0,parent:re,ac:null}}function bo(e,t,r){let n=re;n===null&&Ri();var a=void 0,i=kr(Ie),s=!Z,u=new Map;return Io(()=>{var x;var d=re,v=$a();a=v.promise;try{Promise.resolve(e()).then(v.resolve,v.reject).finally(yn)}catch(y){v.reject(y),yn()}var _=D;if(s){if((d.f&Sr)!==0)var S=Ja();if(n.b.is_rendered())(x=u.get(_))==null||x.reject(Ft),u.delete(_);else{for(const y of u.values())y.reject(Ft);u.clear()}u.set(_,v)}const g=(y,j=void 0)=>{if(S){var w=j===Ft;S(w)}if(!(j===Ft||(d.f&wt)!==0)){if(_.activate(),j)i.f|=tr,Ir(i,j);else{(i.f&tr)!==0&&(i.f^=tr),Ir(i,y);for(const[P,B]of u){if(u.delete(P),P===_)break;B.reject(Ft)}}_.deactivate()}};v.promise.then(g,y=>g(null,y||"unknown"))}),ua(()=>{for(const d of u.values())d.reject(Ft)}),new Promise(d=>{function v(_){function S(){_===a?d(i):v(a)}_.then(S,S)}v(a)})}function bn(e){const t=ia(e);return ui(t),t}function xo(e){const t=ia(e);return t.equals=Fa,t}function ko(e){var t=e.effects;if(t!==null){e.effects=null;for(var r=0;r<t.length;r+=1)tt(t[r])}}function oa(e){var t,r=re,n=e.parent;if(!nr&&n!==null&&(n.f&(wt|Qe))!==0)return eo(),e.v;Ot(n);try{e.f&=~br,ko(e),t=vi(e)}finally{Ot(r)}return t}function Ga(e){var t=oa(e);if(!e.equals(t)&&(e.wv=fi(),(!(D!=null&&D.is_fork)||e.deps===null)&&(D!==null?D.capture(e,t,!0):e.v=t,e.deps===null))){Te(e,De);return}nr||(qe!==null?(la()||D!=null&&D.is_fork)&&qe.set(e,t):ra(e))}function So(e){var t,r;if(e.effects!==null)for(const n of e.effects)(n.teardown||n.ac)&&((t=n.teardown)==null||t.call(n),(r=n.ac)==null||r.abort(Ft),n.teardown=ji,n.ac=null,Zr(n,0),ca(n))}function Qa(e){if(e.effects!==null)for(const t of e.effects)t.teardown&&Rr(t)}let Jn=new Set;const gr=new Map;let Xa=!1;function kr(e,t){var r={f:0,v:e,reactions:null,equals:Ra,rv:0,wv:0};return r}function N(e,t){const r=kr(e);return ui(r),r}function Eo(e,t=!1,r=!0){const n=kr(e);return t||(n.equals=Fa),n}function c(e,t,r=!1){Z!==null&&(!St||(Z.f&qn)!==0)&&za()&&(Z.f&(Ye|Dt|Xr|qn))!==0&&(yt===null||!Dr.call(yt,e))&&Yi();let n=r?Bt(t):t;return Ir(e,n,vn)}function Ir(e,t,r=null){if(!e.equals(t)){gr.set(e,nr?t:e.v);var n=xr.ensure();if(n.capture(e,t),(e.f&Ye)!==0){const a=e;(e.f&Ue)!==0&&oa(a),qe===null&&ra(a)}e.wv=fi(),Za(e,Ue,r),re!==null&&(re.f&De)!==0&&(re.f&(Et|yr))===0&&(dt===null?zo([e]):dt.push(e)),!n.is_fork&&Jn.size>0&&!Xa&&Po()}return t}function Po(){Xa=!1;for(const e of Jn)(e.f&De)!==0&&Te(e,$t),ln(e)&&Rr(e);Jn.clear()}function Jr(e){c(e,e.v+1)}function Za(e,t,r){var n=e.reactions;if(n!==null)for(var a=n.length,i=0;i<a;i++){var s=n[i],u=s.f,d=(u&Ue)===0;if(d&&Te(s,t),(u&Ye)!==0){var v=s;qe==null||qe.delete(v),(u&br)===0&&(u&mt&&(s.f|=br),Za(v,$t,r))}else if(d){var _=s;(u&Dt)!==0&&xt!==null&&xt.add(_),r!==null?r.push(_):aa(_)}}}function Bt(e){if(typeof e!="object"||e===null||Vr in e)return e;const t=Da(e);if(t!==Li&&t!==Ai)return e;var r=new Map,n=ta(e),a=N(0),i=wr,s=u=>{if(wr===i)return u();var d=Z,v=wr;bt(null),Sa(i);var _=u();return bt(d),Sa(v),_};return n&&r.set("length",N(e.length)),new Proxy(e,{defineProperty(u,d,v){(!("value"in v)||v.configurable===!1||v.enumerable===!1||v.writable===!1)&&Wi();var _=r.get(d);return _===void 0?s(()=>{var S=N(v.value);return r.set(d,S),S}):c(_,v.value,!0),!0},deleteProperty(u,d){var v=r.get(d);if(v===void 0){if(d in u){const _=s(()=>N(Ie));r.set(d,_),Jr(a)}}else c(v,Ie),Jr(a);return!0},get(u,d,v){var x;if(d===Vr)return e;var _=r.get(d),S=d in u;if(_===void 0&&(!S||(x=Yr(u,d))!=null&&x.writable)&&(_=s(()=>{var y=Bt(S?u[d]:Ie),j=N(y);return j}),r.set(d,_)),_!==void 0){var g=o(_);return g===Ie?void 0:g}return Reflect.get(u,d,v)},getOwnPropertyDescriptor(u,d){var v=Reflect.getOwnPropertyDescriptor(u,d);if(v&&"value"in v){var _=r.get(d);_&&(v.value=o(_))}else if(v===void 0){var S=r.get(d),g=S==null?void 0:S.v;if(S!==void 0&&g!==Ie)return{enumerable:!0,configurable:!0,value:g,writable:!0}}return v},has(u,d){var g;if(d===Vr)return!0;var v=r.get(d),_=v!==void 0&&v.v!==Ie||Reflect.has(u,d);if(v!==void 0||re!==null&&(!_||(g=Yr(u,d))!=null&&g.writable)){v===void 0&&(v=s(()=>{var x=_?Bt(u[d]):Ie,y=N(x);return y}),r.set(d,v));var S=o(v);if(S===Ie)return!1}return _},set(u,d,v,_){var K;var S=r.get(d),g=d in u;if(n&&d==="length")for(var x=v;x<S.v;x+=1){var y=r.get(x+"");y!==void 0?c(y,Ie):x in u&&(y=s(()=>N(Ie)),r.set(x+"",y))}if(S===void 0)(!g||(K=Yr(u,d))!=null&&K.writable)&&(S=s(()=>N(void 0)),c(S,Bt(v)),r.set(d,S));else{g=S.v!==Ie;var j=s(()=>Bt(v));c(S,j)}var w=Reflect.getOwnPropertyDescriptor(u,d);if(w!=null&&w.set&&w.set.call(_,v),!g){if(n&&typeof d=="string"){var P=r.get("length"),B=Number(d);Number.isInteger(B)&&B>=P.v&&c(P,B+1)}Jr(a)}return!0},ownKeys(u){o(a);var d=Reflect.ownKeys(u).filter(S=>{var g=r.get(S);return g===void 0||g.v!==Ie});for(var[v,_]of r)_.v!==Ie&&!(v in u)&&d.push(v);return d},setPrototypeOf(){Bi()}})}function ya(e){try{if(e!==null&&typeof e=="object"&&Vr in e)return e[Vr]}catch{}return e}function To(e,t){return Object.is(ya(e),ya(t))}var ba,ei,ti,ri;function No(){if(ba===void 0){ba=window,ei=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,r=Text.prototype;ti=Yr(t,"firstChild").get,ri=Yr(t,"nextSibling").get,pa(e)&&(e.__click=void 0,e.__className=void 0,e.__attributes=null,e.__style=void 0,e.__e=void 0),pa(r)&&(r.__t=void 0)}}function Yt(e=""){return document.createTextNode(e)}function xn(e){return ti.call(e)}function sn(e){return ri.call(e)}function l(e,t){return xn(e)}function gt(e,t=!1){{var r=xn(e);return r instanceof Comment&&r.data===""?sn(r):r}}function h(e,t=1,r=!1){let n=e;for(;t--;)n=sn(n);return n}function Co(e){e.textContent=""}function ni(){return!1}function Lo(e,t,r){return document.createElementNS(Ia,e,void 0)}let xa=!1;function Ao(){xa||(xa=!0,document.addEventListener("reset",e=>{Promise.resolve().then(()=>{var t;if(!e.defaultPrevented)for(const r of e.target.elements)(t=r.__on_r)==null||t.call(r)})},{capture:!0}))}function Ln(e){var t=Z,r=re;bt(null),Ot(null);try{return e()}finally{bt(t),Ot(r)}}function sa(e,t,r,n=r){e.addEventListener(t,()=>Ln(r));const a=e.__on_r;a?e.__on_r=()=>{a(),n(!0)}:e.__on_r=()=>n(!0),Ao()}function jo(e){re===null&&(Z===null&&qi(),Hi()),nr&&zi()}function Do(e,t){var r=t.last;r===null?t.last=t.first=e:(r.next=e,e.prev=r,t.last=e)}function Vt(e,t){var r=re;r!==null&&(r.f&Qe)!==0&&(e|=Qe);var n={ctx:lt,deps:null,nodes:null,f:e|Ue|mt,first:null,fn:t,last:null,next:null,parent:r,b:r&&r.b,prev:null,teardown:null,wv:0,ac:null};D==null||D.register_created_effect(n);var a=n;if((e&$r)!==0)Tr!==null?Tr.push(n):xr.ensure().schedule(n);else if(t!==null){try{Rr(n)}catch(s){throw tt(n),s}a.deps===null&&a.teardown===null&&a.nodes===null&&a.first===a.last&&(a.f&zr)===0&&(a=a.first,(e&Dt)!==0&&(e&Or)!==0&&a!==null&&(a.f|=Or))}if(a!==null&&(a.parent=r,r!==null&&Do(a,r),Z!==null&&(Z.f&Ye)!==0&&(e&yr)===0)){var i=Z;(i.effects??(i.effects=[])).push(a)}return n}function la(){return Z!==null&&!St}function ua(e){const t=Vt(Cn,null);return Te(t,De),t.teardown=e,t}function $o(e){jo();var t=re.f,r=!Z&&(t&Et)!==0&&(t&Sr)===0;if(r){var n=lt;(n.e??(n.e=[])).push(e)}else return ai(e)}function ai(e){return Vt($r|Oi,e)}function Oo(e){xr.ensure();const t=Vt(yr|zr,e);return(r={})=>new Promise(n=>{r.outro?mr(t,()=>{tt(t),n(void 0)}):(tt(t),n(void 0))})}function Mo(e){return Vt($r,e)}function Io(e){return Vt(Xr|zr,e)}function da(e,t=0){return Vt(Cn|t,e)}function O(e,t=[],r=[],n=[]){wo(n,t,r,a=>{Vt(Cn,()=>e(...a.map(o)))})}function fa(e,t=0){var r=Vt(Dt|t,e);return r}function ht(e){return Vt(Et|zr,e)}function ii(e){var t=e.teardown;if(t!==null){const r=nr,n=Z;ka(!0),bt(null);try{t.call(null)}finally{ka(r),bt(n)}}}function ca(e,t=!1){var r=e.first;for(e.first=e.last=null;r!==null;){const a=r.ac;a!==null&&Ln(()=>{a.abort(Ft)});var n=r.next;(r.f&yr)!==0?r.parent=null:tt(r,t),r=n}}function Ro(e){for(var t=e.first;t!==null;){var r=t.next;(t.f&Et)===0&&tt(t),t=r}}function tt(e,t=!0){var r=!1;(t||(e.f&$i)!==0)&&e.nodes!==null&&e.nodes.end!==null&&(Fo(e.nodes.start,e.nodes.end),r=!0),Te(e,ga),ca(e,t&&!r),Zr(e,0);var n=e.nodes&&e.nodes.t;if(n!==null)for(const i of n)i.stop();ii(e),e.f^=ga,e.f|=wt;var a=e.parent;a!==null&&a.first!==null&&oi(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function Fo(e,t){for(;e!==null;){var r=e===t?null:sn(e);e.remove(),e=r}}function oi(e){var t=e.parent,r=e.prev,n=e.next;r!==null&&(r.next=n),n!==null&&(n.prev=r),t!==null&&(t.first===e&&(t.first=n),t.last===e&&(t.last=r))}function mr(e,t,r=!0){var n=[];si(e,n,!0);var a=()=>{r&&tt(e),t&&t()},i=n.length;if(i>0){var s=()=>--i||a();for(var u of n)u.out(s)}else a()}function si(e,t,r){if((e.f&Qe)===0){e.f^=Qe;var n=e.nodes&&e.nodes.t;if(n!==null)for(const u of n)(u.is_global||r)&&t.push(u);for(var a=e.first;a!==null;){var i=a.next,s=(a.f&Or)!==0||(a.f&Et)!==0&&(e.f&Dt)!==0;si(a,t,s?r:!1),a=i}}}function va(e){li(e,!0)}function li(e,t){if((e.f&Qe)!==0){e.f^=Qe,(e.f&De)===0&&(Te(e,Ue),xr.ensure().schedule(e));for(var r=e.first;r!==null;){var n=r.next,a=(r.f&Or)!==0||(r.f&Et)!==0;li(r,a?t:!1),r=n}var i=e.nodes&&e.nodes.t;if(i!==null)for(const s of i)(s.is_global||t)&&s.in()}}function ha(e,t){if(e.nodes)for(var r=e.nodes.start,n=e.nodes.end;r!==null;){var a=r===n?null:sn(r);t.append(r),r=a}}let wn=!1,nr=!1;function ka(e){nr=e}let Z=null,St=!1;function bt(e){Z=e}let re=null;function Ot(e){re=e}let yt=null;function ui(e){Z!==null&&(yt===null?yt=[e]:yt.push(e))}let Ze=null,at=0,dt=null;function zo(e){dt=e}let di=1,ur=0,wr=ur;function Sa(e){wr=e}function fi(){return++di}function ln(e){var t=e.f;if((t&Ue)!==0)return!0;if(t&Ye&&(e.f&=~br),(t&$t)!==0){for(var r=e.deps,n=r.length,a=0;a<n;a++){var i=r[a];if(ln(i)&&Ga(i),i.wv>e.wv)return!0}(t&mt)!==0&&qe===null&&Te(e,De)}return!1}function ci(e,t,r=!0){var n=e.reactions;if(n!==null&&!(yt!==null&&Dr.call(yt,e)))for(var a=0;a<n.length;a++){var i=n[a];(i.f&Ye)!==0?ci(i,t,!1):t===i&&(r?Te(i,Ue):(i.f&De)!==0&&Te(i,$t),aa(i))}}function vi(e){var j;var t=Ze,r=at,n=dt,a=Z,i=yt,s=lt,u=St,d=wr,v=e.f;Ze=null,at=0,dt=null,Z=(v&(Et|yr))===0?e:null,yt=null,Mr(e.ctx),St=!1,wr=++ur,e.ac!==null&&(Ln(()=>{e.ac.abort(Ft)}),e.ac=null);try{e.f|=Un;var _=e.fn,S=_();e.f|=Sr;var g=e.deps,x=D==null?void 0:D.is_fork;if(Ze!==null){var y;if(x||Zr(e,at),g!==null&&at>0)for(g.length=at+Ze.length,y=0;y<Ze.length;y++)g[at+y]=Ze[y];else e.deps=g=Ze;if(la()&&(e.f&mt)!==0)for(y=at;y<g.length;y++)((j=g[y]).reactions??(j.reactions=[])).push(e)}else!x&&g!==null&&at<g.length&&(Zr(e,at),g.length=at);if(za()&&dt!==null&&!St&&g!==null&&(e.f&(Ye|$t|Ue))===0)for(y=0;y<dt.length;y++)ci(dt[y],e);if(a!==null&&a!==e){if(ur++,a.deps!==null)for(let w=0;w<r;w+=1)a.deps[w].rv=ur;if(t!==null)for(const w of t)w.rv=ur;dt!==null&&(n===null?n=dt:n.push(...dt))}return(e.f&tr)!==0&&(e.f^=tr),S}catch(w){return qa(w)}finally{e.f^=Un,Ze=t,at=r,dt=n,Z=a,yt=i,Mr(s),St=u,wr=d}}function Ho(e,t){let r=t.reactions;if(r!==null){var n=Ti.call(r,e);if(n!==-1){var a=r.length-1;a===0?r=t.reactions=null:(r[n]=r[a],r.pop())}}if(r===null&&(t.f&Ye)!==0&&(Ze===null||!Dr.call(Ze,t))){var i=t;(i.f&mt)!==0&&(i.f^=mt,i.f&=~br),i.v!==Ie&&ra(i),So(i),Zr(i,0)}}function Zr(e,t){var r=e.deps;if(r!==null)for(var n=t;n<r.length;n++)Ho(e,r[n])}function Rr(e){var t=e.f;if((t&wt)===0){Te(e,De);var r=re,n=wn;re=e,wn=!0;try{(t&(Dt|Oa))!==0?Ro(e):ca(e),ii(e);var a=vi(e);e.teardown=typeof a=="function"?a:null,e.wv=di;var i;Pi&&ao&&(e.f&Ue)!==0&&e.deps}finally{wn=n,re=r}}}async function qo(){await Promise.resolve(),uo()}function o(e){var t=e.f,r=(t&Ye)!==0;if(Z!==null&&!St){var n=re!==null&&(re.f&wt)!==0;if(!n&&(yt===null||!Dr.call(yt,e))){var a=Z.deps;if((Z.f&Un)!==0)e.rv<ur&&(e.rv=ur,Ze===null&&a!==null&&a[at]===e?at++:Ze===null?Ze=[e]:Ze.push(e));else{(Z.deps??(Z.deps=[])).push(e);var i=e.reactions;i===null?e.reactions=[Z]:Dr.call(i,Z)||i.push(Z)}}}if(nr&&gr.has(e))return gr.get(e);if(r){var s=e;if(nr){var u=s.v;return((s.f&De)===0&&s.reactions!==null||_i(s))&&(u=oa(s)),gr.set(s,u),u}var d=(s.f&mt)===0&&!St&&Z!==null&&(wn||(Z.f&mt)!==0),v=(s.f&Sr)===0;ln(s)&&(d&&(s.f|=mt),Ga(s)),d&&!v&&(Qa(s),hi(s))}if(qe!=null&&qe.has(e))return qe.get(e);if((e.f&tr)!==0)throw e.v;return e.v}function hi(e){if(e.f|=mt,e.deps!==null)for(const t of e.deps)(t.reactions??(t.reactions=[])).push(e),(t.f&Ye)!==0&&(t.f&mt)===0&&(Qa(t),hi(t))}function _i(e){if(e.v===Ie)return!0;if(e.deps===null)return!1;for(const t of e.deps)if(gr.has(t)||(t.f&Ye)!==0&&_i(t))return!0;return!1}function An(e){var t=St;try{return St=!0,e()}finally{St=t}}const Uo=["touchstart","touchmove"];function Wo(e){return Uo.includes(e)}const dr=Symbol("events"),pi=new Set,Gn=new Set;function Bo(e,t,r,n={}){function a(i){if(n.capture||Qn.call(t,i),!i.cancelBubble)return Ln(()=>r==null?void 0:r.call(this,i))}return e.startsWith("pointer")||e.startsWith("touch")||e==="wheel"?rr(()=>{t.addEventListener(e,a,n)}):t.addEventListener(e,a,n),a}function Yo(e,t,r,n,a){var i={capture:n,passive:a},s=Bo(e,t,r,i);(t===document.body||t===window||t===document||t instanceof HTMLMediaElement)&&ua(()=>{t.removeEventListener(e,s,i)})}function R(e,t,r){(t[dr]??(t[dr]={}))[e]=r}function un(e){for(var t=0;t<e.length;t++)pi.add(e[t]);for(var r of Gn)r(e)}let Ea=null;function Qn(e){var w,P;var t=this,r=t.ownerDocument,n=e.type,a=((w=e.composedPath)==null?void 0:w.call(e))||[],i=a[0]||e.target;Ea=e;var s=0,u=Ea===e&&e[dr];if(u){var d=a.indexOf(u);if(d!==-1&&(t===document||t===window)){e[dr]=t;return}var v=a.indexOf(t);if(v===-1)return;d<=v&&(s=d)}if(i=a[s]||e.target,i!==t){Ni(e,"currentTarget",{configurable:!0,get(){return i||r}});var _=Z,S=re;bt(null),Ot(null);try{for(var g,x=[];i!==null;){var y=i.assignedSlot||i.parentNode||i.host||null;try{var j=(P=i[dr])==null?void 0:P[n];j!=null&&(!i.disabled||e.target===i)&&j.call(i,e)}catch(B){g?x.push(B):g=B}if(e.cancelBubble||y===t||y===null)break;i=y}if(g){for(let B of x)queueMicrotask(()=>{throw B});throw g}}finally{e[dr]=t,delete e.currentTarget,bt(_),Ot(S)}}}var Aa;const In=((Aa=globalThis==null?void 0:globalThis.window)==null?void 0:Aa.trustedTypes)&&globalThis.window.trustedTypes.createPolicy("svelte-trusted-html",{createHTML:e=>e});function Vo(e){return(In==null?void 0:In.createHTML(e))??e}function Ko(e){var t=Lo("template");return t.innerHTML=Vo(e.replaceAll("<!>","<!---->")),t.content}function kn(e,t){var r=re;r.nodes===null&&(r.nodes={start:e,end:t,a:null,t:null})}function C(e,t){var r=(t&Xi)!==0,n=(t&Zi)!==0,a,i=!e.startsWith("<!>");return()=>{a===void 0&&(a=Ko(i?e:"<!>"+e),r||(a=xn(a)));var s=n||ei?document.importNode(a,!0):a.cloneNode(!0);if(r){var u=xn(s),d=s.lastChild;kn(u,d)}else kn(s,s);return s}}function Jo(e=""){{var t=Yt(e+"");return kn(t,t),t}}function Sn(){var e=document.createDocumentFragment(),t=document.createComment(""),r=Yt();return e.append(t,r),kn(t,r),e}function T(e,t){e!==null&&e.before(t)}function m(e,t){var r=t==null?"":typeof t=="object"?`${t}`:t;r!==(e.__t??(e.__t=e.nodeValue))&&(e.__t=r,e.nodeValue=`${r}`)}function Go(e,t){return Qo(e,t)}const cn=new Map;function Qo(e,{target:t,anchor:r,props:n={},events:a,context:i,intro:s=!0,transformError:u}){No();var d=void 0,v=Oo(()=>{var _=r??t.appendChild(Yt());ho(_,{pending:()=>{}},x=>{Er({});var y=lt;i&&(y.c=i),a&&(n.$$events=a),d=e(x,n)||{},Pr()},u);var S=new Set,g=x=>{for(var y=0;y<x.length;y++){var j=x[y];if(!S.has(j)){S.add(j);var w=Wo(j);for(const K of[t,document]){var P=cn.get(K);P===void 0&&(P=new Map,cn.set(K,P));var B=P.get(j);B===void 0?(K.addEventListener(j,Qn,{passive:w}),P.set(j,1)):P.set(j,B+1)}}}};return g(Nn(pi)),Gn.add(g),()=>{var w;for(var x of S)for(const P of[t,document]){var y=cn.get(P),j=y.get(x);--j==0?(P.removeEventListener(x,Qn),y.delete(x),y.size===0&&cn.delete(P)):y.set(x,j)}Gn.delete(g),_!==r&&((w=_.parentNode)==null||w.removeChild(_))}});return Xo.set(d,v),d}let Xo=new WeakMap;var kt,At,st,pr,an,on,Tn;class Zo{constructor(t,r=!0){nt(this,"anchor");W(this,kt,new Map);W(this,At,new Map);W(this,st,new Map);W(this,pr,new Set);W(this,an,!0);W(this,on,t=>{if(f(this,kt).has(t)){var r=f(this,kt).get(t),n=f(this,At).get(r);if(n)va(n),f(this,pr).delete(r);else{var a=f(this,st).get(r);a&&(f(this,At).set(r,a.effect),f(this,st).delete(r),a.fragment.lastChild.remove(),this.anchor.before(a.fragment),n=a.effect)}for(const[i,s]of f(this,kt)){if(f(this,kt).delete(i),i===t)break;const u=f(this,st).get(s);u&&(tt(u.effect),f(this,st).delete(s))}for(const[i,s]of f(this,At)){if(i===r||f(this,pr).has(i))continue;const u=()=>{if(Array.from(f(this,kt).values()).includes(i)){var v=document.createDocumentFragment();ha(s,v),v.append(Yt()),f(this,st).set(i,{effect:s,fragment:v})}else tt(s);f(this,pr).delete(i),f(this,At).delete(i)};f(this,an)||!n?(f(this,pr).add(i),mr(s,u,!1)):u()}}});W(this,Tn,t=>{f(this,kt).delete(t);const r=Array.from(f(this,kt).values());for(const[n,a]of f(this,st))r.includes(n)||(tt(a.effect),f(this,st).delete(n))});this.anchor=t,G(this,an,r)}ensure(t,r){var n=D,a=ni();if(r&&!f(this,At).has(t)&&!f(this,st).has(t))if(a){var i=document.createDocumentFragment(),s=Yt();i.append(s),f(this,st).set(t,{effect:ht(()=>r(s)),fragment:i})}else f(this,At).set(t,ht(()=>r(this.anchor)));if(f(this,kt).set(n,t),a){for(const[u,d]of f(this,At))u===t?n.unskip_effect(d):n.skip_effect(d);for(const[u,d]of f(this,st))u===t?n.unskip_effect(d.effect):n.skip_effect(d.effect);n.oncommit(f(this,on)),n.ondiscard(f(this,Tn))}else f(this,on).call(this,n)}}kt=new WeakMap,At=new WeakMap,st=new WeakMap,pr=new WeakMap,an=new WeakMap,on=new WeakMap,Tn=new WeakMap;function ee(e,t,r=!1){var n=new Zo(e),a=r?Or:0;function i(s,u){n.ensure(s,u)}fa(()=>{var s=!1;t((u,d=0)=>{s=!0,i(d,u)}),s||i(-1,null)},a)}function _t(e,t){return t}function es(e,t,r){for(var n=[],a=t.length,i,s=t.length,u=0;u<a;u++){let S=t[u];mr(S,()=>{if(i){if(i.pending.delete(S),i.done.add(S),i.pending.size===0){var g=e.outrogroups;Xn(e,Nn(i.done)),g.delete(i),g.size===0&&(e.outrogroups=null)}}else s-=1},!1)}if(s===0){var d=n.length===0&&r!==null;if(d){var v=r,_=v.parentNode;Co(_),_.append(v),e.items.clear()}Xn(e,t,!d)}else i={pending:new Set(t),done:new Set},(e.outrogroups??(e.outrogroups=new Set)).add(i)}function Xn(e,t,r=!0){var n;if(e.pending.size>0){n=new Set;for(const s of e.pending.values())for(const u of s)n.add(e.items.get(u).e)}for(var a=0;a<t.length;a++){var i=t[a];if(n!=null&&n.has(i)){i.f|=jt;const s=document.createDocumentFragment();ha(i,s)}else tt(t[a],r)}}var Pa;function pt(e,t,r,n,a,i=null){var s=e,u=new Map,d=(t&Ma)!==0;if(d){var v=e;s=v.appendChild(Yt())}var _=null,S=xo(()=>{var K=r();return ta(K)?K:K==null?[]:Nn(K)}),g,x=new Map,y=!0;function j(K){(B.effect.f&wt)===0&&(B.pending.delete(K),B.fallback=_,ts(B,g,s,t,n),_!==null&&(g.length===0?(_.f&jt)===0?va(_):(_.f^=jt,Br(_,null,s)):mr(_,()=>{_=null})))}function w(K){B.pending.delete(K)}var P=fa(()=>{g=o(S);for(var K=g.length,ve=new Set,he=D,E=ni(),$=0;$<K;$+=1){var ne=g[$],fe=n(ne,$),te=y?null:u.get(fe);te?(te.v&&Ir(te.v,ne),te.i&&Ir(te.i,$),E&&he.unskip_effect(te.e)):(te=rs(u,y?s:Pa??(Pa=Yt()),ne,fe,$,a,t,r),y||(te.e.f|=jt),u.set(fe,te)),ve.add(fe)}if(K===0&&i&&!_&&(y?_=ht(()=>i(s)):(_=ht(()=>i(Pa??(Pa=Yt()))),_.f|=jt)),K>ve.size&&Fi(),!y)if(x.set(he,ve),E){for(const[de,$e]of u)ve.has(de)||he.skip_effect($e.e);he.oncommit(j),he.ondiscard(w)}else j(he);o(S)}),B={effect:P,items:u,pending:x,outrogroups:null,fallback:_};y=!1}function Wr(e){for(;e!==null&&(e.f&Et)===0;)e=e.next;return e}function ts(e,t,r,n,a){var te,de,$e,Oe,Ve,Ke,We,F,Y;var i=(n&Gi)!==0,s=t.length,u=e.items,d=Wr(e.effect.first),v,_=null,S,g=[],x=[],y,j,w,P;if(i)for(P=0;P<s;P+=1)y=t[P],j=a(y,P),w=u.get(j).e,(w.f&jt)===0&&((de=(te=w.nodes)==null?void 0:te.a)==null||de.measure(),(S??(S=new Set)).add(w));for(P=0;P<s;P+=1){if(y=t[P],j=a(y,P),w=u.get(j).e,e.outrogroups!==null)for(const U of e.outrogroups)U.pending.delete(w),U.done.delete(w);if((w.f&Qe)!==0&&(va(w),i&&((Oe=($e=w.nodes)==null?void 0:$e.a)==null||Oe.unfix(),(S??(S=new Set)).delete(w))),(w.f&jt)!==0)if(w.f^=jt,w===d)Br(w,null,r);else{var B=_?_.next:d;w===e.effect.last&&(e.effect.last=w.prev),w.prev&&(w.prev.next=w.next),w.next&&(w.next.prev=w.prev),Qt(e,_,w),Qt(e,w,B),Br(w,B,r),_=w,g=[],x=[],d=Wr(_.next);continue}if(w!==d){if(v!==void 0&&v.has(w)){if(g.length<x.length){var K=x[0],ve;_=K.prev;var he=g[0],E=g[g.length-1];for(ve=0;ve<g.length;ve+=1)Br(g[ve],K,r);for(ve=0;ve<x.length;ve+=1)v.delete(x[ve]);Qt(e,he.prev,E.next),Qt(e,_,he),Qt(e,E,K),d=K,_=E,P-=1,g=[],x=[]}else v.delete(w),Br(w,d,r),Qt(e,w.prev,w.next),Qt(e,w,_===null?e.effect.first:_.next),Qt(e,_,w),_=w;continue}for(g=[],x=[];d!==null&&d!==w;)(v??(v=new Set)).add(d),x.push(d),d=Wr(d.next);if(d===null)continue}(w.f&jt)===0&&g.push(w),_=w,d=Wr(w.next)}if(e.outrogroups!==null){for(const U of e.outrogroups)U.pending.size===0&&(Xn(e,Nn(U.done)),(Ve=e.outrogroups)==null||Ve.delete(U));e.outrogroups.size===0&&(e.outrogroups=null)}if(d!==null||v!==void 0){var $=[];if(v!==void 0)for(w of v)(w.f&Qe)===0&&$.push(w);for(;d!==null;)(d.f&Qe)===0&&d!==e.fallback&&$.push(d),d=Wr(d.next);var ne=$.length;if(ne>0){var fe=(n&Ma)!==0&&s===0?r:null;if(i){for(P=0;P<ne;P+=1)(We=(Ke=$[P].nodes)==null?void 0:Ke.a)==null||We.measure();for(P=0;P<ne;P+=1)(Y=(F=$[P].nodes)==null?void 0:F.a)==null||Y.fix()}es(e,$,fe)}}i&&rr(()=>{var U,Ee;if(S!==void 0)for(w of S)(Ee=(U=w.nodes)==null?void 0:U.a)==null||Ee.apply()})}function rs(e,t,r,n,a,i,s,u){var d=(s&Ki)!==0?(s&Qi)===0?Eo(r,!1,!1):kr(r):null,v=(s&Ji)!==0?kr(a):null;return{v:d,i:v,e:ht(()=>(i(t,d??r,v??a,u),()=>{e.delete(n)}))}}function Br(e,t,r){if(e.nodes)for(var n=e.nodes.start,a=e.nodes.end,i=t&&(t.f&jt)===0?t.nodes.start:r;n!==null;){var s=sn(n);if(i.before(n),n===a)return;n=s}}function Qt(e,t,r){t===null?e.effect.first=r:t.next=r,r===null?e.effect.last=t:r.prev=t}const Ta=[...`
|
|
2
|
+
\r\f \v\uFEFF`];function ns(e,t,r){var n=e==null?"":""+e;if(t&&(n=n?n+" "+t:t),r){for(var a of Object.keys(r))if(r[a])n=n?n+" "+a:a;else if(n.length)for(var i=a.length,s=0;(s=n.indexOf(a,s))>=0;){var u=s+i;(s===0||Ta.includes(n[s-1]))&&(u===n.length||Ta.includes(n[u]))?n=(s===0?"":n.substring(0,s))+n.substring(u+1):s=u}}return n===""?null:n}function fr(e,t,r,n,a,i){var s=e.__className;if(s!==r||s===void 0){var u=ns(r,n,i);u==null?e.removeAttribute("class"):e.className=u,e.__className=r}else if(i&&a!==i)for(var d in i){var v=!!i[d];(a==null||v!==!!a[d])&&e.classList.toggle(d,v)}return i}function gi(e,t,r=!1){if(e.multiple){if(t==null)return;if(!ta(t))return to();for(var n of e.options)n.selected=t.includes(Gr(n));return}for(n of e.options){var a=Gr(n);if(To(a,t)){n.selected=!0;return}}(!r||t!==void 0)&&(e.selectedIndex=-1)}function as(e){var t=new MutationObserver(()=>{gi(e,e.__value)});t.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),ua(()=>{t.disconnect()})}function Zn(e,t,r=t){var n=new WeakSet,a=!0;sa(e,"change",i=>{var s=i?"[selected]":":checked",u;if(e.multiple)u=[].map.call(e.querySelectorAll(s),Gr);else{var d=e.querySelector(s)??e.querySelector("option:not([disabled])");u=d&&Gr(d)}r(u),e.__value=u,D!==null&&n.add(D)}),Mo(()=>{var i=t();if(e===document.activeElement){var s=D;if(n.has(s))return}if(gi(e,i,a),a&&i===void 0){var u=e.querySelector(":checked");u!==null&&(i=Gr(u),r(i))}e.__value=i,a=!1}),as(e)}function Gr(e){return"__value"in e?e.__value:e.value}const is=Symbol("is custom element"),os=Symbol("is html");function be(e,t,r,n){var a=ss(e);a[t]!==(a[t]=r)&&(t==="loading"&&(e[Mi]=r),r==null?e.removeAttribute(t):typeof r!="string"&&ls(e).includes(t)?e[t]=r:e.setAttribute(t,r))}function ss(e){return e.__attributes??(e.__attributes={[is]:e.nodeName.includes("-"),[os]:e.namespaceURI===Ia})}var Na=new Map;function ls(e){var t=e.getAttribute("is")||e.nodeName,r=Na.get(t);if(r)return r;Na.set(t,r=[]);for(var n,a=e,i=Element.prototype;i!==a;){n=Ci(a);for(var s in n)n[s].set&&r.push(s);a=Da(a)}return r}function et(e,t,r=t){var n=new WeakSet;sa(e,"input",async a=>{var i=a?e.defaultValue:e.value;if(i=Rn(e)?Fn(i):i,r(i),D!==null&&n.add(D),await qo(),i!==(i=t())){var s=e.selectionStart,u=e.selectionEnd,d=e.value.length;if(e.value=i??"",u!==null){var v=e.value.length;s===u&&u===d&&v>d?(e.selectionStart=v,e.selectionEnd=v):(e.selectionStart=s,e.selectionEnd=Math.min(u,v))}}}),An(t)==null&&e.value&&(r(Rn(e)?Fn(e.value):e.value),D!==null&&n.add(D)),da(()=>{var a=t();if(e===document.activeElement){var i=D;if(n.has(i))return}Rn(e)&&a===Fn(e.value)||e.type==="date"&&!a&&!e.value||a!==e.value&&(e.value=a??"")})}function us(e,t,r=t){sa(e,"change",n=>{var a=n?e.defaultChecked:e.checked;r(a)}),An(t)==null&&r(e.checked),da(()=>{var n=t();e.checked=!!n})}function Rn(e){var t=e.type;return t==="number"||t==="range"}function Fn(e){return e===""?null:+e}function dn(e){lt===null&&Ii(),$o(()=>{const t=An(e);if(typeof t=="function")return t})}const ds="5";var ja;typeof window<"u"&&((ja=window.__svelte??(window.__svelte={})).v??(ja.v=new Set)).add(ds);const mi="/api";async function ke(e,t={}){const r=`${mi}${e}`,n={...t.headers||{}};t.body&&typeof t.body=="string"&&(n["Content-Type"]="application/json");try{const a=await fetch(r,{...t,headers:n,credentials:"include"});return a.status===401?await fs()?(await fetch(r,{...t,headers:n,credentials:"include"})).json():{success:!1,error:"Authentication required"}:a.status===429?{success:!1,error:"Too many requests. Please wait."}:a.json()}catch{return{success:!1,error:"Network error"}}}async function fs(){try{return(await(await fetch(`${mi}/auth/refresh`,{method:"POST",credentials:"include"})).json()).success===!0}catch{return!1}}const Ce={auth:{status:()=>ke("/auth/status"),register:(e,t)=>ke("/auth/register",{method:"POST",body:JSON.stringify({username:e,password:t})}),login:(e,t)=>ke("/auth/login",{method:"POST",body:JSON.stringify({username:e,password:t})}),logout:()=>ke("/auth/logout",{method:"POST"}),me:()=>ke("/auth/me"),changePassword:(e,t)=>ke("/auth/password",{method:"PUT",body:JSON.stringify({old_password:e,new_password:t})})},workLogs:{list:e=>{const t=new URLSearchParams;e!=null&&e.project_path&&t.set("project_path",e.project_path),e!=null&&e.limit&&t.set("limit",String(e.limit));const r=t.toString();return ke(`/work-logs${r?"?"+r:""}`)},get:e=>ke(`/work-log/${e}`),create:e=>ke("/work-log",{method:"POST",body:JSON.stringify(e)}),update:(e,t)=>ke(`/work-log/${e}`,{method:"PUT",body:JSON.stringify(t)}),delete:e=>ke(`/work-log/${e}`,{method:"DELETE"}),search:(e,t)=>{const r=new URLSearchParams({q:e});return t&&r.set("project_path",t),ke(`/work-logs/search?${r}`)}},handover:{get:e=>ke(`/handover?project_path=${encodeURIComponent(e)}`),projects:()=>ke("/handover/projects"),projectStats:e=>ke(`/handover/project-stats?project_path=${encodeURIComponent(e)}`)},knowledge:{list:()=>ke("/knowledge/categories"),createCategory:(e,t)=>ke("/knowledge/category",{method:"POST",body:JSON.stringify({name:e,icon:t})}),updateCategory:(e,t,r)=>ke(`/knowledge/category/${encodeURIComponent(e)}`,{method:"PUT",body:JSON.stringify({name:t,icon:r})}),deleteCategory:e=>ke(`/knowledge/category/${encodeURIComponent(e)}`,{method:"DELETE"}),addNode:(e,t)=>ke(`/knowledge/category/${encodeURIComponent(e)}/nodes`,{method:"POST",body:JSON.stringify(t)}),updateNode:(e,t,r)=>ke(`/knowledge/category/${encodeURIComponent(e)}/nodes/${t}`,{method:"PUT",body:JSON.stringify(r)}),deleteNode:(e,t)=>ke(`/knowledge/category/${encodeURIComponent(e)}/nodes/${t}`,{method:"DELETE"})}},Ca={en:{"app.title":"HITS","app.subtitle":"Hybrid Intel Trace System",loading:"Loading...",save:"Save",cancel:"Cancel",delete:"Delete",edit:"Edit",add:"Add",refresh:"Refresh",close:"Close",search:"Search...",copy:"Copy",copied:"Copied to clipboard","auth.login":"Login","auth.register":"Create Account","auth.username":"Username","auth.password":"Password","auth.confirmPassword":"Confirm Password","auth.passwordMin":"Password must be at least 8 characters","auth.passwordMismatch":"Passwords do not match","auth.loginFailed":"Login failed","auth.registerFailed":"Registration failed","auth.processing":"Processing...","auth.firstAccount":"First account will be set as admin","auth.hasAccount":"Already have an account?","auth.noAccount":"Create new account","auth.changePassword":"Change Password","auth.currentPassword":"Current Password","auth.newPassword":"New Password","auth.newPasswordConfirm":"Confirm New Password","auth.passwordChanged":"Password changed","auth.changeFailed":"Failed to change password","auth.logout":"Logout","auth.wrongPassword":"Invalid current password","header.projects":"Projects","header.knowledge":"Knowledge Tree","header.timeline":"Timeline","header.handover":"Handover","header.toggleSidebar":"Toggle sidebar","header.refresh":"Refresh","header.admin":"Admin","sidebar.noProjects":"No projects recorded","knowledge.title":"Knowledge Tree","knowledge.addCategory":"+ Category","knowledge.noCategories":"No categories","knowledge.createCategory":"Create category","knowledge.editCategory":"Edit category","knowledge.categoryName":"Category name","knowledge.categoryIcon":"Icon","knowledge.addedNode":"Node added","knowledge.editNode":"Edit node","knowledge.newNode":"New node","knowledge.nodeName":"Name","knowledge.nodeLayer":"Layer","knowledge.layerWhy":"WHY (Intent)","knowledge.layerHow":"HOW (Logic)","knowledge.layerWhat":"WHAT (Execution)","knowledge.nodeType":"Action type","knowledge.typeUrl":"URL","knowledge.typeShell":"Shell command","knowledge.nodeAction":"Action","knowledge.negativePath":"Negative Path (failure route)","knowledge.confirmDeleteCategory":"Delete category and all nodes?","knowledge.confirmDeleteNode":"Delete this node?","knowledge.saving":"Saving...","timeline.title":"Timeline","timeline.addLog":"+ Record","timeline.noLogs":"No work logs","timeline.createLog":"Record work","timeline.today":"Today","timeline.yesterday":"Yesterday","timeline.editLog":"Edit work log","timeline.newLog":"New work log","timeline.summary":"What did you do?","timeline.context":"Details, decisions","timeline.performer":"Performer","timeline.tags":"Tags (comma separated)","timeline.confirmDelete":"Delete this work log?","timeline.allProjects":"All projects","handover.title":"Handover","handover.selectProject":"Select a project from the sidebar","handover.noData":"No handover data","handover.sessionHistory":"Session History","handover.keyDecisions":"Key Decisions","handover.pendingItems":"Pending / Follow-up","handover.filesModified":"Files Modified","handover.recentWork":"Recent Work","handover.more":"more","handover.noProject":"Select project","empty.noData":"(No data)"},ko:{"app.title":"HITS","app.subtitle":"Hybrid Intel Trace System",loading:"로딩 중...",save:"저장",cancel:"취소",delete:"삭제",edit:"편집",add:"추가",refresh:"새로고침",close:"닫기",search:"검색...",copy:"복사",copied:"클립보드에 복사되었습니다","auth.login":"로그인","auth.register":"계정 생성","auth.username":"사용자명","auth.password":"비밀번호","auth.confirmPassword":"비밀번호 확인","auth.passwordMin":"비밀번호는 8자 이상이어야 합니다","auth.passwordMismatch":"비밀번호가 일치하지 않습니다","auth.loginFailed":"로그인 실패","auth.registerFailed":"회원가입 실패","auth.processing":"처리 중...","auth.firstAccount":"첫 번째 계정이 관리자로 설정됩니다","auth.hasAccount":"이미 계정이 있으신가요?","auth.noAccount":"새 계정 만들기","auth.changePassword":"비밀번호 변경","auth.currentPassword":"현재 비밀번호","auth.newPassword":"새 비밀번호","auth.newPasswordConfirm":"새 비밀번호 확인","auth.passwordChanged":"비밀번호가 변경되었습니다","auth.changeFailed":"비밀번호 변경 실패","auth.logout":"로그아웃","auth.wrongPassword":"현재 비밀번호가 틀립니다","header.projects":"프로젝트","header.knowledge":"지식 트리","header.timeline":"타임라인","header.handover":"인수인계","header.toggleSidebar":"사이드바 토글","header.refresh":"새로고침","header.admin":"관리자","sidebar.noProjects":"기록된 프로젝트가 없습니다","knowledge.title":"지식 트리","knowledge.addCategory":"+ 카테고리","knowledge.noCategories":"카테고리가 없습니다","knowledge.createCategory":"카테고리 만들기","knowledge.editCategory":"카테고리 편집","knowledge.categoryName":"카테고리 이름","knowledge.categoryIcon":"아이콘","knowledge.addedNode":"노드 추가","knowledge.editNode":"노드 편집","knowledge.newNode":"새 노드","knowledge.nodeName":"이름","knowledge.nodeLayer":"계층","knowledge.layerWhy":"WHY (의도)","knowledge.layerHow":"HOW (방법)","knowledge.layerWhat":"WHAT (실행)","knowledge.nodeType":"실행 유형","knowledge.typeUrl":"URL","knowledge.typeShell":"Shell 명령","knowledge.nodeAction":"실행 내용","knowledge.negativePath":"실패 경로 (Negative Path)","knowledge.confirmDeleteCategory":"카테고리와 모든 노드를 삭제하시겠습니까?","knowledge.confirmDeleteNode":"이 노드를 삭제하시겠습니까?","knowledge.saving":"저장 중...","timeline.title":"타임라인","timeline.addLog":"+ 기록","timeline.noLogs":"작업 기록이 없습니다","timeline.createLog":"작업 기록하기","timeline.today":"오늘","timeline.yesterday":"어제","timeline.editLog":"작업 기록 편집","timeline.newLog":"새 작업 기록","timeline.summary":"무엇을 했나요?","timeline.context":"상세 내용, 결정 사항","timeline.performer":"수행자","timeline.tags":"태그 (콤마로 구분)","timeline.confirmDelete":"이 작업 기록을 삭제하시겠습니까?","timeline.allProjects":"전체 프로젝트","handover.title":"인수인계","handover.selectProject":"좌측 사이드바에서 프로젝트를 선택하세요","handover.noData":"인수인계 데이터가 없습니다","handover.sessionHistory":"작업 이력","handover.keyDecisions":"주요 결정 사항","handover.pendingItems":"미완료 / 후속 작업","handover.filesModified":"수정된 파일","handover.recentWork":"최근 작업","handover.more":"더 보기","handover.noProject":"프로젝트 선택","empty.noData":"(데이터 없음)"}};let Fr="ko";function cs(){if(typeof window>"u")return"ko";const e=localStorage.getItem("hits-locale");return e==="en"||e==="ko"?e:(navigator.language||"").startsWith("ko")?"ko":"en"}function vs(){return Fr=cs(),Fr}function hs(e){Fr=e,typeof window<"u"&&localStorage.setItem("hits-locale",e)}function p(e){var t,r;return((t=Ca[Fr])==null?void 0:t[e])||((r=Ca.en)==null?void 0:r[e])||e}function _s(){return Fr==="ko"?"en":"ko"}function La(){return Fr==="ko"?"EN":"한"}class fn{constructor(t){nt(this,"_value");nt(this,"_listeners",new Set);this._value=t}get value(){return this._value}set value(t){this._value=t,this._listeners.forEach(r=>r())}subscribe(t){return this._listeners.add(t),()=>this._listeners.delete(t)}update(t){this.value=t(this._value)}}const Qr=new fn({initialized:!1,authenticated:!1,username:null,role:null,loading:!0}),Wt=new fn({activeTab:"knowledge",selectedProject:"",sidebarOpen:!0,searchQuery:"",showAddDialog:!1,editingItem:null}),zn=new fn([]),ps=new fn([]),gs=new fn([]);var ms=C('<div class="form-group"><label for="confirm"> </label> <input id="confirm" class="input" type="password" autocomplete="new-password" required=""/></div>'),ws=C('<div class="error-msg"> </div>'),ys=C('<div class="spinner" style="width:14px;height:14px;"></div> ',1),bs=C(' <button style="background:none;border:none;color:var(--accent-secondary);cursor:pointer;font-size:12px;font-family:var(--font-sans);"> </button>',1),xs=C('<button style="background:none;border:none;color:var(--accent-secondary);cursor:pointer;font-size:12px;font-family:var(--font-sans);"> </button>'),ks=C('<p style="text-align:center; margin-top:16px; font-size:12px;"><!></p>'),Ss=C('<p style="text-align:center; margin-top:16px; font-size:12px; color:var(--text-muted);"> </p>'),Es=C('<div class="login-container"><div class="login-card"><h1>🌳 HITS</h1> <p class="subtitle"> </p> <form><div class="form-group"><label for="username"> </label> <input id="username" class="input" type="text" autocomplete="username" required=""/></div> <div class="form-group"><label for="password"> </label> <input id="password" class="input" type="password" required=""/></div> <!> <!> <button class="btn btn-primary w-full" type="submit" style="margin-top: 16px; justify-content: center;"><!></button></form> <!></div></div>');function Ps(e,t){Er(t,!0);let r=N(!t.initialized),n=N(""),a=N(""),i=N(""),s=N(""),u=N(!1);async function d(F){if(F.preventDefault(),c(s,""),o(r)){if(o(a)!==o(i)){c(s,p("auth.passwordMismatch"),!0);return}if(o(a).length<8){c(s,p("auth.passwordMin"),!0);return}c(u,!0);const Y=await Ce.auth.register(o(n),o(a));if(c(u,!1),Y.success){const U=await Ce.auth.login(o(n),o(a));U.success&&U.data&&t.onLogin(U.data)}else c(s,Y.error||p("auth.registerFailed"),!0)}else{c(u,!0);const Y=await Ce.auth.login(o(n),o(a));c(u,!1),Y.success&&Y.data?t.onLogin(Y.data):c(s,Y.error||p("auth.loginFailed"),!0)}}var v=Es(),_=l(v),S=h(l(_),2),g=l(S),x=h(S,2),y=l(x),j=l(y),w=l(j),P=h(j,2);be(P,"minlength",3),be(P,"maxlength",32);var B=h(y,2),K=l(B),ve=l(K),he=h(K,2);be(he,"minlength",8);var E=h(B,2);{var $=F=>{var Y=ms(),U=l(Y),Ee=l(U),Re=h(U,2);be(Re,"minlength",8),O((Pe,L)=>{m(Ee,Pe),be(Re,"placeholder",L),Re.disabled=o(u)},[()=>p("auth.confirmPassword"),()=>p("auth.confirmPassword")]),et(Re,()=>o(i),Pe=>c(i,Pe)),T(F,Y)};ee(E,F=>{o(r)&&F($)})}var ne=h(E,2);{var fe=F=>{var Y=ws(),U=l(Y);O(()=>m(U,o(s))),T(F,Y)};ee(ne,F=>{o(s)&&F(fe)})}var te=h(ne,2),de=l(te);{var $e=F=>{var Y=ys(),U=h(gt(Y));O(Ee=>m(U,` ${Ee??""}`),[()=>p("auth.processing")]),T(F,Y)},Oe=F=>{var Y=Jo();O(U=>m(Y,U),[()=>o(r)?p("auth.register"):p("auth.login")]),T(F,Y)};ee(de,F=>{o(u)?F($e):F(Oe,-1)})}var Ve=h(x,2);{var Ke=F=>{var Y=ks(),U=l(Y);{var Ee=Pe=>{var L=bs(),q=gt(L),ae=h(q),Fe=l(ae);O((b,k)=>{m(q,`${b??""} `),m(Fe,k)},[()=>p("auth.hasAccount"),()=>p("auth.login")]),R("click",ae,()=>{c(r,!1),c(s,"")}),T(Pe,L)},Re=Pe=>{var L=xs(),q=l(L);O(ae=>m(q,ae),[()=>p("auth.noAccount")]),R("click",L,()=>{c(r,!0),c(s,"")}),T(Pe,L)};ee(U,Pe=>{o(r)?Pe(Ee):Pe(Re,-1)})}T(F,Y)},We=F=>{var Y=Ss(),U=l(Y);O(Ee=>m(U,Ee),[()=>p("auth.firstAccount")]),T(F,Y)};ee(Ve,F=>{t.initialized?F(Ke):F(We,-1)})}O((F,Y,U,Ee,Re)=>{m(g,F),m(w,Y),be(P,"placeholder",U),P.disabled=o(u),m(ve,Ee),be(he,"placeholder",Re),be(he,"autocomplete",o(r)?"new-password":"current-password"),he.disabled=o(u),te.disabled=o(u)},[()=>p("app.subtitle"),()=>p("auth.username"),()=>p("auth.username"),()=>p("auth.password"),()=>p("auth.password")]),Yo("submit",x,d),et(P,()=>o(n),F=>c(n,F)),et(he,()=>o(a),F=>c(a,F)),T(e,v),Pr()}un(["click"]);var Ts=C('<div class="loading"><div class="spinner"></div></div>'),Ns=C('<div class="empty-state"><div class="icon">📋</div> <div class="message"> </div> <button class="btn btn-primary btn-sm"> </button></div>'),Cs=C('<div><span> </span> <span class="node-name"> </span> <span class="node-action"> </span> <button class="btn-icon" style="width:20px;height:20px;font-size:10px;opacity:0.5;">✏</button> <button class="btn-icon" style="width:20px;height:20px;font-size:10px;opacity:0.5;color:var(--danger);">✕</button></div>'),Ls=C('<div style="margin-bottom:8px;"><div class="category-header" role="button" tabindex="0"><span class="icon"> </span> <span class="name"> </span> <span class="count"> </span> <div class="actions"><button class="btn-icon" style="width:24px;height:24px;font-size:12px;">+</button> <button class="btn-icon" style="width:24px;height:24px;font-size:10px;">✏</button> <button class="btn-icon" style="width:24px;height:24px;font-size:10px;color:var(--danger);">✕</button></div> <span style="font-size:10px;color:var(--text-muted);"> </span></div> <!></div>'),As=C('<div class="error-msg"> </div>'),js=C('<div class="modal-overlay"><div class="modal"><h2> </h2> <div class="form-group"><label> </label> <input class="input"/></div> <div class="form-group"><label> </label> <input class="input" placeholder="📁" style="width:80px;"/></div> <!> <div class="flex gap-sm" style="margin-top:16px; justify-content:flex-end;"><button class="btn btn-secondary"> </button> <button class="btn btn-primary"> </button></div></div></div>'),Ds=C('<div class="error-msg"> </div>'),$s=C('<div class="modal-overlay"><div class="modal"><h2> </h2> <div class="form-group"><label> </label> <input class="input"/></div> <div class="form-group"><label> </label> <select class="input"><option> </option><option> </option><option> </option></select></div> <div class="form-group"><label> </label> <select class="input"><option> </option><option> </option></select></div> <div class="form-group"><label> </label> <input class="input" placeholder="https://... "/></div> <div class="form-group"><label style="display:flex;align-items:center;gap:8px;"><input type="checkbox"/> </label></div> <!> <div class="flex gap-sm" style="margin-top:16px; justify-content:flex-end;"><button class="btn btn-secondary"> </button> <button class="btn btn-primary"> </button></div></div></div>'),Os=C('<div><div class="flex items-center" style="margin-bottom:16px;"><h2 style="font-size:16px; flex:1;"> </h2> <button class="btn btn-primary btn-sm"> </button></div> <!></div> <!> <!>',1);function Ms(e,t){Er(t,!0);let r=N(Bt([])),n=N(Bt(new Set)),a=N(!0),i=N(!1),s=N(!1),u=N(null),d=N(null),v=N(""),_=N("📁"),S=N(""),g=N("what"),x=N("url"),y=N(""),j=N(!1),w=N(""),P=N(!1);p("knowledge.layerWhy"),p("knowledge.layerHow"),p("knowledge.layerWhat"),dn(async()=>{await B()});async function B(){c(a,!0);const b=await Ce.knowledge.list();b.success&&b.data&&(c(r,b.data,!0),ps.value=b.data,c(n,new Set(o(r).map(k=>k.name)),!0)),c(a,!1)}function K(b){const k=new Set(o(n));k.has(b)?k.delete(b):k.add(b),c(n,k,!0)}function ve(){c(v,""),c(_,"📁"),c(w,""),c(s,!0)}function he(b){c(u,b.name,!0),c(v,b.name,!0),c(_,b.icon,!0),c(w,""),c(s,!0)}function E(b){c(u,b,!0),c(d,null),c(S,""),c(g,"what"),c(x,"url"),c(y,""),c(j,!1),c(w,""),c(i,!0)}function $(b,k,I){c(u,b,!0),c(d,k,!0),c(S,I.name,!0),c(g,I.layer,!0),c(x,I.type,!0),c(y,I.action,!0),c(j,I.negative_path||!1,!0),c(w,""),c(i,!0)}async function ne(){c(w,""),c(P,!0);let b;o(u)?b=await Ce.knowledge.updateCategory(o(u),o(v),o(_)):b=await Ce.knowledge.createCategory(o(v),o(_)),c(P,!1),b.success?(c(s,!1),c(u,null),await B()):c(w,b.error||"Save failed",!0)}async function fe(){if(c(w,""),!o(u))return;c(P,!0);let b;o(d)!==null?b=await Ce.knowledge.updateNode(o(u),o(d),{name:o(S),layer:o(g),type:o(x),action:o(y),negative_path:o(j)}):b=await Ce.knowledge.addNode(o(u),{name:o(S),layer:o(g),type:o(x),action:o(y),negative_path:o(j)}),c(P,!1),b.success?(c(i,!1),c(u,null),c(d,null),await B()):c(w,b.error||"Save failed",!0)}async function te(b){confirm(p("knowledge.confirmDeleteCategory"))&&(await Ce.knowledge.deleteCategory(b),await B())}async function de(b,k){confirm(p("knowledge.confirmDeleteNode"))&&(await Ce.knowledge.deleteNode(b,k),await B())}var $e=Os(),Oe=gt($e),Ve=l(Oe),Ke=l(Ve),We=l(Ke),F=h(Ke,2),Y=l(F),U=h(Ve,2);{var Ee=b=>{var k=Ts();T(b,k)},Re=b=>{var k=Ns(),I=h(l(k),2),ie=l(I),V=h(I,2),Q=l(V);O((M,J)=>{m(ie,M),m(Q,J)},[()=>p("knowledge.noCategories"),()=>p("knowledge.createCategory")]),R("click",V,ve),T(b,k)},Pe=b=>{var k=Sn(),I=gt(k);pt(I,17,()=>o(r),_t,(ie,V)=>{var Q=Ls(),M=l(Q),J=l(M),oe=l(J),ge=h(J,2),ce=l(ge),ze=h(ge,2),Me=l(ze),me=h(ze,2),He=l(me),Ne=h(He,2),xe=h(Ne,2),we=h(me,2),Be=l(we),A=h(M,2);{var z=H=>{var X=Sn(),ye=gt(X);pt(ye,17,()=>o(V).items,_t,(le,se,Je)=>{var rt=Cs();let _e;var ut=l(rt),Pt=l(ut),Mt=h(ut,2),It=l(Mt),Kt=h(Mt,2),Jt=l(Kt),Tt=h(Kt,2),Gt=h(Tt,2);O((Nt,Hr,ar)=>{_e=fr(rt,1,`node-item layer-${o(se).layer??""}`,null,_e,{"negative-path":o(se).negative_path}),fr(ut,1,`badge badge-${o(se).layer??""}`),m(Pt,Nt),m(It,o(se).name),m(Jt,o(se).action),be(Tt,"title",Hr),be(Gt,"title",ar)},[()=>o(se).layer.toUpperCase(),()=>p("edit"),()=>p("delete")]),R("click",Tt,()=>$(o(V).name,Je,o(se))),R("click",Gt,()=>de(o(V).name,Je)),T(le,rt)}),T(H,X)},ue=bn(()=>o(n).has(o(V).name)&&o(V).items);ee(A,H=>{o(ue)&&H(z)})}O((H,X,ye,le)=>{var se;m(oe,o(V).icon),m(ce,o(V).name),m(Me,((se=o(V).items)==null?void 0:se.length)||0),be(He,"title",H),be(Ne,"title",X),be(xe,"title",ye),m(Be,le)},[()=>p("knowledge.newNode"),()=>p("knowledge.editCategory"),()=>p("delete"),()=>o(n).has(o(V).name)?"▼":"▶"]),R("click",M,()=>K(o(V).name)),R("click",He,H=>{H.stopPropagation(),E(o(V).name)}),R("click",Ne,H=>{H.stopPropagation(),he(o(V))}),R("click",xe,H=>{H.stopPropagation(),te(o(V).name)}),T(ie,Q)}),T(b,k)};ee(U,b=>{o(a)?b(Ee):o(r).length===0?b(Re,1):b(Pe,-1)})}var L=h(Oe,2);{var q=b=>{var k=js(),I=l(k),ie=l(I),V=l(ie),Q=h(ie,2),M=l(Q),J=l(M),oe=h(M,2),ge=h(Q,2),ce=l(ge),ze=l(ce),Me=h(ce,2),me=h(ge,2);{var He=z=>{var ue=As(),H=l(ue);O(()=>m(H,o(w))),T(z,ue)};ee(me,z=>{o(w)&&z(He)})}var Ne=h(me,2),xe=l(Ne),we=l(xe),Be=h(xe,2),A=l(Be);O((z,ue,H,X,ye,le)=>{m(V,z),m(J,ue),be(oe,"placeholder",H),m(ze,X),m(we,ye),Be.disabled=o(P),m(A,le)},[()=>o(u)?p("knowledge.editCategory"):p("knowledge.createCategory"),()=>p("knowledge.categoryName"),()=>p("knowledge.categoryName"),()=>p("knowledge.categoryIcon"),()=>p("cancel"),()=>o(P)?p("knowledge.saving"):p("save")]),R("click",k,()=>c(s,!1)),R("click",I,z=>z.stopPropagation()),et(oe,()=>o(v),z=>c(v,z)),et(Me,()=>o(_),z=>c(_,z)),R("click",xe,()=>c(s,!1)),R("click",Be,ne),T(b,k)};ee(L,b=>{o(s)&&b(q)})}var ae=h(L,2);{var Fe=b=>{var k=$s(),I=l(k),ie=l(I),V=l(ie),Q=h(ie,2),M=l(Q),J=l(M),oe=h(M,2),ge=h(Q,2),ce=l(ge),ze=l(ce),Me=h(ce,2),me=l(Me),He=l(me);me.value=me.__value="why";var Ne=h(me),xe=l(Ne);Ne.value=Ne.__value="how";var we=h(Ne),Be=l(we);we.value=we.__value="what";var A=h(ge,2),z=l(A),ue=l(z),H=h(z,2),X=l(H),ye=l(X);X.value=X.__value="url";var le=h(X),se=l(le);le.value=le.__value="shell";var Je=h(A,2),rt=l(Je),_e=l(rt),ut=h(rt,2),Pt=h(Je,2),Mt=l(Pt),It=l(Mt),Kt=h(It),Jt=h(Pt,2);{var Tt=Ae=>{var ir=Ds(),Ur=l(ir);O(()=>m(Ur,o(w))),T(Ae,ir)};ee(Jt,Ae=>{o(w)&&Ae(Tt)})}var Gt=h(Jt,2),Nt=l(Gt),Hr=l(Nt),ar=h(Nt,2),qr=l(ar);O((Ae,ir,Ur,je,Rt,or,jn,Dn,$n,wi,yi,bi,xi,ki)=>{m(V,Ae),m(J,ir),be(oe,"placeholder",Ur),m(ze,je),m(He,Rt),m(xe,or),m(Be,jn),m(ue,Dn),m(ye,$n),m(se,wi),m(_e,yi),m(Kt,` ${bi??""}`),m(Hr,xi),ar.disabled=o(P),m(qr,ki)},[()=>o(d)!==null?p("knowledge.editNode"):p("knowledge.newNode"),()=>p("knowledge.nodeName"),()=>p("knowledge.nodeName"),()=>p("knowledge.nodeLayer"),()=>p("knowledge.layerWhy"),()=>p("knowledge.layerHow"),()=>p("knowledge.layerWhat"),()=>p("knowledge.nodeType"),()=>p("knowledge.typeUrl"),()=>p("knowledge.typeShell"),()=>p("knowledge.nodeAction"),()=>p("knowledge.negativePath"),()=>p("cancel"),()=>o(P)?p("knowledge.saving"):p("save")]),R("click",k,()=>c(i,!1)),R("click",I,Ae=>Ae.stopPropagation()),et(oe,()=>o(S),Ae=>c(S,Ae)),Zn(Me,()=>o(g),Ae=>c(g,Ae)),Zn(H,()=>o(x),Ae=>c(x,Ae)),et(ut,()=>o(y),Ae=>c(y,Ae)),us(It,()=>o(j),Ae=>c(j,Ae)),R("click",Nt,()=>c(i,!1)),R("click",ar,fe),T(b,k)};ee(ae,b=>{o(i)&&b(Fe)})}O((b,k)=>{m(We,`📋 ${b??""}`),m(Y,`+ ${k??""}`)},[()=>p("knowledge.title"),()=>p("knowledge.addCategory")]),R("click",F,ve),T(e,$e),Pr()}un(["click"]);var Is=C('<div class="loading"><div class="spinner"></div></div>'),Rs=C('<div class="empty-state"><div class="icon">📝</div> <div class="message"> </div> <button class="btn btn-primary btn-sm"> </button></div>'),Fs=C('<span>·</span> <span class="text-xs" style="color:var(--accent-secondary);"> </span>',1),zs=C('<span class="tag"> </span>'),Hs=C('<div class="tags"></div>'),qs=C('<div class="timeline-item"><div class="summary"> </div> <div class="meta"><span> </span> <span>·</span> <span> </span> <!></div> <!> <div style="position:absolute;right:16px;top:50%;transform:translateY(-50%);display:flex;gap:2px;opacity:0.3;"><button class="btn-icon" style="width:20px;height:20px;font-size:9px;">✏</button> <button class="btn-icon" style="width:20px;height:20px;font-size:9px;color:var(--danger);">✕</button></div></div>'),Us=C('<div class="timeline-date"> </div> <!>',1),Ws=C('<div class="error-msg"> </div>'),Bs=C('<div class="modal-overlay"><div class="modal"><h2> </h2> <div class="form-group"><label> </label> <input class="input"/></div> <div class="form-group"><label> </label> <textarea class="input"></textarea></div> <div class="form-group"><label> </label> <select class="input"><option>manual</option><option>opencode</option><option>claude</option><option>cursor</option><option>copilot</option></select></div> <div class="form-group"><label> </label> <input class="input"/></div> <!> <div class="flex gap-sm" style="margin-top:16px; justify-content:flex-end;"><button class="btn btn-secondary"> </button> <button class="btn btn-primary"> </button></div></div></div>'),Ys=C('<div><div class="flex items-center gap-sm" style="margin-bottom:16px;"><h2 style="font-size:16px; flex:1;"> </h2> <div class="flex gap-sm" style="flex:1; max-width:300px;"><input class="input" type="text"/> <button class="btn btn-secondary btn-sm">🔍</button></div> <button class="btn btn-primary btn-sm"> </button></div> <!></div> <!>',1);function Vs(e,t){Er(t,!0);let r=N(Bt([])),n=N(!0),a=N(""),i=N(!1),s=N(null),u=N(""),d=N(""),v=N("manual"),_=N(""),S=N(""),g=N(!1);dn(async()=>{await x()});async function x(){c(n,!0);const L={limit:100},q=Wt.value.selectedProject;q&&(L.project_path=q);const ae=await Ce.workLogs.list(L);ae.success&&ae.data&&(c(r,ae.data,!0),gs.value=ae.data),c(n,!1)}async function y(){if(!o(a).trim()){await x();return}c(n,!0),o(a);const L=Wt.value.selectedProject,q=await Ce.workLogs.search(o(a),L);q.success&&q.data&&c(r,q.data,!0),c(n,!1)}function j(L){const q={},ae=new Date().toISOString().slice(0,10),Fe=new Date(Date.now()-864e5).toISOString().slice(0,10);for(const b of L){const k=(b.performed_at||"").slice(0,10)||"unknown";q[k]||(q[k]=[]),q[k].push(b)}return Object.entries(q).sort(([b],[k])=>k.localeCompare(b)).map(([b,k])=>({label:b===ae?p("timeline.today"):b===Fe?p("timeline.yesterday"):b,items:k}))}function w(L){try{return new Date(L).toLocaleTimeString("ko-KR",{hour:"2-digit",minute:"2-digit"})}catch{return""}}function P(){c(s,null),c(u,""),c(d,""),c(v,"manual"),c(_,""),c(S,""),c(i,!0)}function B(L){c(s,L,!0),c(u,L.request_text||"",!0),c(d,L.context||"",!0),c(v,L.performed_by||"manual",!0),c(_,(L.tags||[]).join(", "),!0),c(S,""),c(i,!0)}async function K(){c(S,""),c(g,!0);const L={request_text:o(u),context:o(d),performed_by:o(v),source:"manual",tags:o(_).split(",").map(ae=>ae.trim()).filter(Boolean),project_path:Wt.value.selectedProject||void 0};let q;o(s)?q=await Ce.workLogs.update(o(s).id,L):q=await Ce.workLogs.create(L),c(g,!1),q.success?(c(i,!1),await x()):c(S,q.error||"Save failed",!0)}async function ve(L){confirm(p("timeline.confirmDelete"))&&(await Ce.workLogs.delete(L),await x())}let he=bn(()=>j(o(r))),E=bn(()=>Wt.value.selectedProject?Wt.value.selectedProject.split("/").pop():p("timeline.allProjects"));var $=Ys(),ne=gt($),fe=l(ne),te=l(fe),de=l(te),$e=h(te,2),Oe=l($e),Ve=h(Oe,2),Ke=h($e,2),We=l(Ke),F=h(fe,2);{var Y=L=>{var q=Is();T(L,q)},U=L=>{var q=Rs(),ae=h(l(q),2),Fe=l(ae),b=h(ae,2),k=l(b);O((I,ie)=>{m(Fe,I),m(k,ie)},[()=>p("timeline.noLogs"),()=>p("timeline.createLog")]),R("click",b,P),T(L,q)},Ee=L=>{var q=Sn(),ae=gt(q);pt(ae,17,()=>o(he),_t,(Fe,b)=>{var k=Us(),I=gt(k),ie=l(I),V=h(I,2);pt(V,17,()=>o(b).items,_t,(Q,M)=>{var J=qs(),oe=l(J),ge=l(oe),ce=h(oe,2),ze=l(ce),Me=l(ze),me=h(ze,4),He=l(me),Ne=h(me,2);{var xe=H=>{var X=Fs(),ye=h(gt(X),2),le=l(ye);O(se=>m(le,se),[()=>o(M).project_path.split("/").pop()]),T(H,X)};ee(Ne,H=>{o(M).project_path&&H(xe)})}var we=h(ce,2);{var Be=H=>{var X=Hs();pt(X,21,()=>o(M).tags,_t,(ye,le)=>{var se=zs(),Je=l(se);O(()=>m(Je,o(le))),T(ye,se)}),T(H,X)};ee(we,H=>{var X;(X=o(M).tags)!=null&&X.length&&H(Be)})}var A=h(we,2),z=l(A),ue=h(z,2);O((H,X)=>{m(ge,H),m(Me,X),m(He,o(M).performed_by)},[()=>o(M).request_text||o(M).context||`(${p("empty.noData")})`,()=>w(o(M).performed_at)]),R("click",z,()=>B(o(M))),R("click",ue,()=>ve(o(M).id)),T(Q,J)}),O(()=>m(ie,o(b).label)),T(Fe,k)}),T(L,q)};ee(F,L=>{o(n)?L(Y):o(r).length===0?L(U,1):L(Ee,-1)})}var Re=h(ne,2);{var Pe=L=>{var q=Bs(),ae=l(q),Fe=l(ae),b=l(Fe),k=h(Fe,2),I=l(k),ie=l(I),V=h(I,2),Q=h(k,2),M=l(Q),J=l(M),oe=h(M,2),ge=h(Q,2),ce=l(ge),ze=l(ce),Me=h(ce,2),me=l(Me);me.value=me.__value="manual";var He=h(me);He.value=He.__value="opencode";var Ne=h(He);Ne.value=Ne.__value="claude";var xe=h(Ne);xe.value=xe.__value="cursor";var we=h(xe);we.value=we.__value="copilot";var Be=h(ge,2),A=l(Be),z=l(A),ue=h(A,2),H=h(Be,2);{var X=_e=>{var ut=Ws(),Pt=l(ut);O(()=>m(Pt,o(S))),T(_e,ut)};ee(H,_e=>{o(S)&&_e(X)})}var ye=h(H,2),le=l(ye),se=l(le),Je=h(le,2),rt=l(Je);O((_e,ut,Pt,Mt,It,Kt,Jt,Tt,Gt,Nt)=>{m(b,_e),m(ie,ut),be(V,"placeholder",Pt),m(J,Mt),be(oe,"placeholder",It),m(ze,Kt),m(z,Jt),be(ue,"placeholder",Tt),m(se,Gt),Je.disabled=o(g),m(rt,Nt)},[()=>o(s)?p("timeline.editLog"):p("timeline.newLog"),()=>p("timeline.summary"),()=>p("timeline.summary"),()=>p("timeline.context"),()=>p("timeline.context"),()=>p("timeline.performer"),()=>p("timeline.tags"),()=>p("timeline.tags"),()=>p("cancel"),()=>o(g)?p("knowledge.saving"):p("save")]),R("click",q,()=>c(i,!1)),R("click",ae,_e=>_e.stopPropagation()),et(V,()=>o(u),_e=>c(u,_e)),et(oe,()=>o(d),_e=>c(d,_e)),Zn(Me,()=>o(v),_e=>c(v,_e)),et(ue,()=>o(_),_e=>c(_,_e)),R("click",le,()=>c(i,!1)),R("click",Je,K),T(L,q)};ee(Re,L=>{o(i)&&L(Pe)})}O((L,q,ae)=>{m(de,`📝 ${L??""} — ${o(E)??""}`),be(Oe,"placeholder",q),m(We,`+ ${ae??""}`)},[()=>p("timeline.title"),()=>p("search")+"...",()=>p("timeline.addLog")]),R("keydown",Oe,L=>L.key==="Enter"&&y()),et(Oe,()=>o(a),L=>c(a,L)),R("click",Ve,y),R("click",Ke,P),T(e,$),Pr()}un(["keydown","click"]);var Ks=C('<button class="btn btn-secondary btn-sm"> </button>'),Js=C('<div class="empty-state"><div class="icon">🔄</div> <div class="message"> </div></div>'),Gs=C('<div class="loading"><div class="spinner"></div></div>'),Qs=C('<div class="card" style="text-align:center; color:var(--danger);"> </div>'),Xs=C('<div class="empty-state"><div class="icon">🔄</div> <div class="message"> </div></div>'),Zs=C('<div style="margin-left:auto;" class="badge badge-what"> </div>'),el=C('<div class="handover-item"><strong> </strong> <span class="text-xs text-muted" style="margin-left:8px;"> </span></div>'),tl=C('<div class="handover-section"><h3> </h3> <!></div>'),rl=C('<div class="handover-item" style="border-left-color:var(--warning);"> </div>'),nl=C('<div class="handover-section"><h3> </h3> <!></div>'),al=C('<div class="handover-item" style="border-left-color:var(--danger);"> </div>'),il=C('<div class="handover-section"><h3> </h3> <!></div>'),ol=C('<div class="handover-item" style="font-family:var(--font-mono); font-size:12px;"> </div>'),sl=C('<div class="text-xs text-muted" style="margin-top:4px;"> </div>'),ll=C('<div class="handover-section"><h3> </h3> <!> <!></div>'),ul=C('<span class="tag"> </span>'),dl=C('<div class="tags" style="display:inline-flex; margin-left:4px;"></div>'),fl=C('<div class="handover-item"><span class="text-xs text-muted"> </span> <span style="margin-left:8px;"> </span> <span style="margin-left:8px;"> </span> <!></div>'),cl=C('<div class="handover-section"><h3> </h3> <!></div>'),vl=C('<div class="card" style="margin-bottom:16px;"><div class="flex items-center gap-sm"><span style="font-size:24px;">📂</span> <div><div style="font-weight:600;"> </div> <div class="text-sm text-muted"> </div></div> <!></div></div> <!> <!> <!> <!> <!>',1),hl=C('<div><div class="flex items-center" style="margin-bottom:16px;"><h2 style="font-size:16px; flex:1;"> </h2> <!> <button class="btn btn-secondary btn-sm" style="margin-left:4px;">🔄</button></div> <!></div>');function _l(e,t){Er(t,!0);let r=N(null),n=N(!0),a=N(""),i=bn(()=>Wt.value.selectedProject?Wt.value.selectedProject.split("/").pop():null);dn(async()=>{await s()});async function s(){c(n,!0),c(a,""),c(r,null);const E=Wt.value.selectedProject;if(!E){c(n,!1);return}const $=await Ce.handover.get(E);$.success&&$.data?c(r,$.data,!0):c(a,$.error||p("handover.noData"),!0),c(n,!1)}function u(){if(!o(r))return;const E=d();navigator.clipboard.writeText(E).then(()=>{alert("Copied to clipboard")})}function d(){var $,ne,fe,te;if(!o(r))return"";const E=[];if(E.push(`📋 ${p("handover.title")}: ${o(r).project_name}`),E.push("=".repeat(40)),E.push(`${o(r).project_path}`),o(r).git_branch&&E.push(`${o(r).git_branch} (${o(r).git_status||"?"})`),E.push(""),($=o(r).session_history)!=null&&$.length){E.push(`👥 ${p("handover.sessionHistory")}`),E.push("-".repeat(30));for(const de of o(r).session_history)E.push(` ${de.performed_by}: ${de.log_count} (${(de.last_activity||"").slice(0,16)})`);E.push("")}if((ne=o(r).key_decisions)!=null&&ne.length){E.push(`★ ${p("handover.keyDecisions")}`),E.push("-".repeat(30));for(const de of o(r).key_decisions)E.push(` • ${de}`);E.push("")}if((fe=o(r).pending_items)!=null&&fe.length){E.push(`⚠ ${p("handover.pendingItems")}`),E.push("-".repeat(30));for(const de of o(r).pending_items)E.push(` • ${de}`);E.push("")}if((te=o(r).recent_logs)!=null&&te.length){E.push(`📝 ${p("handover.recentWork")}`),E.push("-".repeat(30));for(const de of o(r).recent_logs.slice(0,10)){const $e=(de.performed_at||"").slice(5,16),Oe=de.performed_by,Ve=de.request_text||`(${p("empty.noData")})`;E.push(` [${$e}] ${Oe}: ${Ve.slice(0,80)}`)}}return E.join(`
|
|
3
|
+
`)}var v=hl(),_=l(v),S=l(_),g=l(S),x=h(S,2);{var y=E=>{var $=Ks(),ne=l($);O(fe=>m(ne,`📋 ${fe??""}`),[()=>p("copy")]),R("click",$,u),T(E,$)};ee(x,E=>{o(r)&&E(y)})}var j=h(x,2),w=h(_,2);{var P=E=>{var $=Js(),ne=h(l($),2),fe=l(ne);O(te=>m(fe,te),[()=>p("handover.noProject")]),T(E,$)},B=E=>{var $=Gs();T(E,$)},K=E=>{var $=Qs(),ne=l($);O(()=>m(ne,o(a))),T(E,$)},ve=E=>{var $=Xs(),ne=h(l($),2),fe=l(ne);O(te=>m(fe,te),[()=>p("handover.noData")]),T(E,$)},he=E=>{var $=vl(),ne=gt($),fe=l(ne),te=h(l(fe),2),de=l(te),$e=l(de),Oe=h(de,2),Ve=l(Oe),Ke=h(te,2);{var We=b=>{var k=Zs(),I=l(k);O(()=>m(I,`🔀 ${o(r).git_branch??""}`)),T(b,k)};ee(Ke,b=>{o(r).git_branch&&b(We)})}var F=h(ne,2);{var Y=b=>{var k=tl(),I=l(k),ie=l(I),V=h(I,2);pt(V,17,()=>o(r).session_history,_t,(Q,M)=>{var J=el(),oe=l(J),ge=l(oe),ce=h(oe),ze=h(ce),Me=l(ze);O(me=>{m(ge,o(M).performed_by),m(ce,`: ${o(M).log_count??""} `),m(Me,me)},[()=>(o(M).last_activity||"").slice(0,16)]),T(Q,J)}),O(Q=>m(ie,`👥 ${Q??""}`),[()=>p("handover.sessionHistory")]),T(b,k)};ee(F,b=>{var k;(k=o(r).session_history)!=null&&k.length&&b(Y)})}var U=h(F,2);{var Ee=b=>{var k=nl(),I=l(k),ie=l(I),V=h(I,2);pt(V,17,()=>o(r).key_decisions,_t,(Q,M)=>{var J=rl(),oe=l(J);O(()=>m(oe,o(M))),T(Q,J)}),O(Q=>m(ie,`★ ${Q??""}`),[()=>p("handover.keyDecisions")]),T(b,k)};ee(U,b=>{var k;(k=o(r).key_decisions)!=null&&k.length&&b(Ee)})}var Re=h(U,2);{var Pe=b=>{var k=il(),I=l(k),ie=l(I),V=h(I,2);pt(V,17,()=>o(r).pending_items,_t,(Q,M)=>{var J=al(),oe=l(J);O(()=>m(oe,o(M))),T(Q,J)}),O(Q=>m(ie,`⚠ ${Q??""}`),[()=>p("handover.pendingItems")]),T(b,k)};ee(Re,b=>{var k;(k=o(r).pending_items)!=null&&k.length&&b(Pe)})}var L=h(Re,2);{var q=b=>{var k=ll(),I=l(k),ie=l(I),V=h(I,2);pt(V,17,()=>o(r).files_modified.slice(0,15),_t,(J,oe)=>{var ge=ol(),ce=l(ge);O(()=>m(ce,o(oe))),T(J,ge)});var Q=h(V,2);{var M=J=>{var oe=sl(),ge=l(oe);O(ce=>m(ge,`... +${o(r).files_modified.length-15} ${ce??""}`),[()=>p("handover.more")]),T(J,oe)};ee(Q,J=>{o(r).files_modified.length>15&&J(M)})}O(J=>m(ie,`📄 ${J??""} (${o(r).files_modified.length??""})`),[()=>p("handover.filesModified")]),T(b,k)};ee(L,b=>{var k;(k=o(r).files_modified)!=null&&k.length&&b(q)})}var ae=h(L,2);{var Fe=b=>{var k=cl(),I=l(k),ie=l(I),V=h(I,2);pt(V,17,()=>o(r).recent_logs.slice(0,10),_t,(Q,M)=>{var J=fl(),oe=l(J),ge=l(oe),ce=h(oe,2),ze=l(ce),Me=h(ce,2),me=l(Me),He=h(Me,2);{var Ne=xe=>{var we=dl();pt(we,21,()=>o(M).tags,_t,(Be,A)=>{var z=ul(),ue=l(z);O(()=>m(ue,o(A))),T(Be,z)}),T(xe,we)};ee(He,xe=>{var we;(we=o(M).tags)!=null&&we.length&&xe(Ne)})}O((xe,we)=>{m(ge,xe),fr(ce,1,`badge badge-${o(M).performed_by==="opencode"?"what":"how"}`),m(ze,o(M).performed_by),m(me,we)},[()=>(o(M).performed_at||"").slice(5,16),()=>(o(M).request_text||`(${p("empty.noData")})`).slice(0,80)]),T(Q,J)}),O(Q=>m(ie,`📝 ${Q??""}`),[()=>p("handover.recentWork")]),T(b,k)};ee(ae,b=>{var k;(k=o(r).recent_logs)!=null&&k.length&&b(Fe)})}O(()=>{m($e,o(r).project_name),m(Ve,o(r).project_path)}),T(E,$)};ee(w,E=>{Wt.value.selectedProject?o(n)?E(B,1):o(a)?E(K,2):o(r)?E(he,-1):E(ve,3):E(P)})}O((E,$)=>m(g,`🔄 ${E??""} — ${$??""}`),[()=>p("handover.title"),()=>o(i)||p("handover.selectProject")]),R("click",j,s),T(e,v),Pr()}un(["click"]);var pl=C('<div class="p-md text-muted text-sm" style="text-align:center;"> </div>'),gl=C('<div class="project-item" role="button" tabindex="0"><span>📂</span> <span style="flex:1; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;"> </span> <span class="text-xs"> </span></div>'),ml=C('<span class="text-xs" style="color:var(--warning);">★</span>'),wl=C('<div class="user-dropdown"><button> </button> <button> </button></div>'),yl=C('<div class="error-msg"> </div>'),bl=C('<div style="color:var(--success); font-size:12px; margin-top:8px;"> </div>'),xl=C('<div class="modal-overlay"><div class="modal"><h2> </h2> <div class="form-group"><label> </label> <input class="input" type="password" autocomplete="current-password"/></div> <div class="form-group"><label> </label> <input class="input" type="password" autocomplete="new-password"/></div> <div class="form-group"><label> </label> <input class="input" type="password" autocomplete="new-password"/></div> <!> <!> <div class="flex gap-sm" style="margin-top:16px; justify-content:flex-end;"><button class="btn btn-secondary"> </button> <button class="btn btn-primary"> </button></div></div></div>'),kl=C('<div class="app-layout"><div><div style="padding:16px; border-bottom: 1px solid var(--border-color);"><h2 style="font-size:14px; color:var(--text-primary);"> </h2></div> <div class="overflow-y" style="flex:1;"><!></div></div> <div class="main-content"><div class="header"><button class="btn-icon"> </button> <h1>HITS</h1> <div class="tabs" style="margin-left:12px;"><button> </button> <button> </button> <button> </button></div> <div style="flex:1;"></div> <button class="btn-icon" title="Switch language" aria-label="Switch language"> </button> <button class="btn-icon"> </button> <div class="user-menu"><button class="user-menu-toggle"> <!> ▾</button> <!></div></div> <div class="content-area"><!></div></div></div> <!>',1);function Sl(e,t){Er(t,!0);let r=N(!1),n=N(!1),a=N(""),i=N(""),s=N(""),u=N(""),d=N(""),v=N(!1),_=N("knowledge"),S=N(!0),g=N(Bt(La()));dn(async()=>(await x(),document.addEventListener("click",y),()=>document.removeEventListener("click",y)));async function x(){const A=await Ce.handover.projects();A.success&&A.data&&(zn.value=A.data)}function y(A){A.target.closest(".user-menu")||c(r,!1)}async function j(){c(v,!0),await x(),setTimeout(()=>{c(v,!1)},300)}function w(){const A=_s();hs(A),c(g,La(),!0),c(_,o(_),!0)}async function P(){if(c(u,""),c(d,""),o(i)!==o(s)){c(u,p("auth.passwordMismatch"),!0);return}if(o(i).length<8){c(u,p("auth.passwordMin"),!0);return}const A=await Ce.auth.changePassword(o(a),o(i));A.success?(c(d,p("auth.passwordChanged"),!0),c(a,""),c(i,""),c(s,""),setTimeout(()=>{c(n,!1),c(d,"")},1500)):c(u,A.error||p("auth.wrongPassword"),!0)}function B(A){c(_,A,!0)}var K=kl(),ve=gt(K),he=l(ve);let E;var $=l(he),ne=l($),fe=l(ne),te=h($,2),de=l(te);{var $e=A=>{var z=pl(),ue=l(z);O(H=>m(ue,H),[()=>p("sidebar.noProjects")]),T(A,z)},Oe=A=>{var z=Sn(),ue=gt(z);pt(ue,17,()=>zn.value,_t,(H,X)=>{var ye=gl(),le=h(l(ye),2),se=l(le),Je=h(le,2),rt=l(Je);O(_e=>{m(se,_e),m(rt,o(X).total_logs)},[()=>o(X).project_path.split("/").pop()||o(X).project_path]),T(H,ye)}),T(A,z)};ee(de,A=>{zn.value.length===0?A($e):A(Oe,-1)})}var Ve=h(he,2),Ke=l(Ve),We=l(Ke),F=l(We),Y=h(We,4),U=l(Y);let Ee;var Re=l(U),Pe=h(U,2);let L;var q=l(Pe),ae=h(Pe,2);let Fe;var b=l(ae),k=h(Y,4),I=l(k),ie=h(k,2),V=l(ie),Q=h(ie,2),M=l(Q),J=l(M),oe=h(J);{var ge=A=>{var z=ml();T(A,z)};ee(oe,A=>{Qr.value.role==="admin"&&A(ge)})}var ce=h(M,2);{var ze=A=>{var z=wl(),ue=l(z),H=l(ue),X=h(ue,2),ye=l(X);O((le,se)=>{m(H,`🔑 ${le??""}`),m(ye,`🚪 ${se??""}`)},[()=>p("auth.changePassword"),()=>p("auth.logout")]),R("click",ue,()=>{c(n,!0),c(r,!1)}),R("click",X,function(...le){var se;(se=t.onLogout)==null||se.apply(this,le)}),T(A,z)};ee(ce,A=>{o(r)&&A(ze)})}var Me=h(Ke,2),me=l(Me);{var He=A=>{Ms(A,{})},Ne=A=>{Vs(A,{})},xe=A=>{_l(A,{})};ee(me,A=>{o(_)==="knowledge"?A(He):o(_)==="timeline"?A(Ne,1):o(_)==="handover"&&A(xe,2)})}var we=h(ve,2);{var Be=A=>{var z=xl(),ue=l(z),H=l(ue),X=l(H),ye=h(H,2),le=l(ye),se=l(le),Je=h(le,2),rt=h(ye,2),_e=l(rt),ut=l(_e),Pt=h(_e,2),Mt=h(rt,2),It=l(Mt),Kt=l(It),Jt=h(It,2),Tt=h(Mt,2);{var Gt=je=>{var Rt=yl(),or=l(Rt);O(()=>m(or,o(u))),T(je,Rt)};ee(Tt,je=>{o(u)&&je(Gt)})}var Nt=h(Tt,2);{var Hr=je=>{var Rt=bl(),or=l(Rt);O(()=>m(or,o(d))),T(je,Rt)};ee(Nt,je=>{o(d)&&je(Hr)})}var ar=h(Nt,2),qr=l(ar),Ae=l(qr),ir=h(qr,2),Ur=l(ir);O((je,Rt,or,jn,Dn,$n)=>{m(X,`🔑 ${je??""}`),m(se,Rt),m(ut,or),m(Kt,jn),m(Ae,Dn),m(Ur,$n)},[()=>p("auth.changePassword"),()=>p("auth.currentPassword"),()=>p("auth.newPassword"),()=>p("auth.newPasswordConfirm"),()=>p("cancel"),()=>p("save")]),R("click",z,()=>c(n,!1)),R("click",ue,je=>je.stopPropagation()),et(Je,()=>o(a),je=>c(a,je)),et(Pt,()=>o(i),je=>c(i,je)),et(Jt,()=>o(s),je=>c(s,je)),R("click",qr,()=>c(n,!1)),R("click",ir,P),T(A,z)};ee(we,A=>{o(n)&&A(Be)})}O((A,z,ue,H,X,ye,le,se)=>{E=fr(he,1,"sidebar",null,E,{collapsed:!o(S)}),m(fe,`📁 ${A??""}`),be(We,"title",z),be(We,"aria-label",ue),m(F,o(S)?"◀":"▶"),Ee=fr(U,1,"tab",null,Ee,{active:o(_)==="knowledge"}),m(Re,`📋 ${H??""}`),L=fr(Pe,1,"tab",null,L,{active:o(_)==="timeline"}),m(q,`📝 ${X??""}`),Fe=fr(ae,1,"tab",null,Fe,{active:o(_)==="handover"}),m(b,`🔄 ${ye??""}`),m(I,`🌐 ${o(g)??""}`),be(ie,"title",le),be(ie,"aria-label",se),m(V,o(v)?"⏳":"🔄"),m(J,`👤 ${Qr.value.username??""} `)},[()=>p("header.projects"),()=>p("header.toggleSidebar"),()=>p("header.toggleSidebar"),()=>p("header.knowledge"),()=>p("header.timeline"),()=>p("header.handover"),()=>p("header.refresh"),()=>p("header.refresh")]),R("click",We,()=>c(S,!o(S))),R("click",U,()=>B("knowledge")),R("click",Pe,()=>B("timeline")),R("click",ae,()=>B("handover")),R("click",k,w),R("click",ie,j),R("click",M,()=>c(r,!o(r))),T(e,K),Pr()}un(["click"]);var El=C('<div class="login-container"><div class="loading"><div class="spinner" style="width:32px;height:32px;margin-right:12px;"></div> <span>HITS...</span></div></div>'),Pl=C('<main class="app-layout"><!></main>');function Tl(e,t){Er(t,!0);let r=N(!1),n=N(!1),a=N(!0);dn(async()=>{vs();const g=await Ce.auth.status();g.success&&g.data&&(c(n,g.data.initialized,!0),c(r,g.data.authenticated,!0),o(r)&&(Qr.value={initialized:!0,authenticated:!0,username:g.data.username||null,role:g.data.role||null,loading:!1})),c(a,!1)});function i(g){c(r,!0),c(n,!0),Qr.value={initialized:!0,authenticated:!0,username:g.username,role:g.role,loading:!1}}async function s(){await Ce.auth.logout(),c(r,!1),Qr.value={initialized:!0,authenticated:!1,username:null,role:null,loading:!1}}var u=Pl(),d=l(u);{var v=g=>{var x=El();T(g,x)},_=g=>{Ps(g,{get initialized(){return o(n)},onLogin:i})},S=g=>{Sl(g,{onLogout:s})};ee(d,g=>{o(a)?g(v):o(r)?g(S,-1):g(_,1)})}T(e,u),Pr()}Go(Tl,{target:document.getElementById("app")});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="ko">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<meta http-equiv="X-Content-Type-Options" content="nosniff" />
|
|
7
|
+
<meta name="referrer" content="strict-origin-when-cross-origin" />
|
|
8
|
+
<title>HITS - Hybrid Intel Trace System</title>
|
|
9
|
+
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🌳</text></svg>" />
|
|
10
|
+
<script type="module" crossorigin src="/assets/index-D1B5E67G.js"></script>
|
|
11
|
+
<link rel="stylesheet" crossorigin href="/assets/index-Bgx7F6m6.css">
|
|
12
|
+
</head>
|
|
13
|
+
<body>
|
|
14
|
+
<div id="app"></div>
|
|
15
|
+
</body>
|
|
16
|
+
</html>
|
package/package.json
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@purpleraven/hits",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "HITS - Hybrid Intel Trace System. AI session handover with secure web UI.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"knowledge-management",
|
|
7
|
+
"ai",
|
|
8
|
+
"session-handover",
|
|
9
|
+
"mcp"
|
|
10
|
+
],
|
|
11
|
+
"license": "Apache-2.0",
|
|
12
|
+
"author": "HITS Team",
|
|
13
|
+
"type": "module",
|
|
14
|
+
"bin": {
|
|
15
|
+
"hits": "bin/hits.js"
|
|
16
|
+
},
|
|
17
|
+
"scripts": {
|
|
18
|
+
"start": "node bin/hits.js",
|
|
19
|
+
"dev": "node bin/hits.js --dev",
|
|
20
|
+
"build": "cd hits_web && npm run build",
|
|
21
|
+
"setup": "node bin/hits.js --setup",
|
|
22
|
+
"test": "cd hits_web && npm run build"
|
|
23
|
+
},
|
|
24
|
+
"engines": {
|
|
25
|
+
"node": ">=18.0.0"
|
|
26
|
+
},
|
|
27
|
+
"files": [
|
|
28
|
+
"bin/",
|
|
29
|
+
"server.js",
|
|
30
|
+
"hits_core/**/*.py",
|
|
31
|
+
"hits_core/**/__init__.py",
|
|
32
|
+
"!hits_core/**/__pycache__",
|
|
33
|
+
"!hits_core/**/*.pyc",
|
|
34
|
+
"!hits_core/**/*.pyo",
|
|
35
|
+
"hits_web/dist/",
|
|
36
|
+
"config/",
|
|
37
|
+
"data/dev_handover.yaml",
|
|
38
|
+
"requirements.txt",
|
|
39
|
+
"requirements-core.txt",
|
|
40
|
+
"run.sh",
|
|
41
|
+
"AGENTS.md"
|
|
42
|
+
],
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"express": "^4.21.0",
|
|
45
|
+
"http-proxy-middleware": "^3.0.0"
|
|
46
|
+
},
|
|
47
|
+
"main": "server.js",
|
|
48
|
+
"directories": {
|
|
49
|
+
"test": "tests"
|
|
50
|
+
},
|
|
51
|
+
"devDependencies": {},
|
|
52
|
+
"repository": {
|
|
53
|
+
"type": "git",
|
|
54
|
+
"url": "git+https://lhjnano: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@github.com/lhjnano/hits.git"
|
|
55
|
+
},
|
|
56
|
+
"bugs": {
|
|
57
|
+
"url": "https://github.com/lhjnano/hits/issues"
|
|
58
|
+
},
|
|
59
|
+
"homepage": "https://github.com/lhjnano/hits#readme"
|
|
60
|
+
}
|
package/requirements.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
-r requirements-core.txt
|
package/run.sh
ADDED
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# HITS Launcher
|
|
3
|
+
# Primary: Node.js server (Express + Python backend)
|
|
4
|
+
# Fallback: Python-only mode (FastAPI serves everything)
|
|
5
|
+
|
|
6
|
+
cd "$(dirname "$0")"
|
|
7
|
+
|
|
8
|
+
RED='\033[0;31m'
|
|
9
|
+
GREEN='\033[0;32m'
|
|
10
|
+
YELLOW='\033[1;33m'
|
|
11
|
+
CYAN='\033[0;36m'
|
|
12
|
+
NC='\033[0m'
|
|
13
|
+
|
|
14
|
+
echo -e "${GREEN}HITS - Hybrid Intel Trace System${NC}"
|
|
15
|
+
echo ""
|
|
16
|
+
|
|
17
|
+
VENV_PATH="$PWD/venv"
|
|
18
|
+
WEB_DIR="$PWD/hits_web"
|
|
19
|
+
PORT="${HITS_PORT:-8765}"
|
|
20
|
+
|
|
21
|
+
setup_venv() {
|
|
22
|
+
echo -e "${CYAN}Setting up virtual environment...${NC}"
|
|
23
|
+
python3 -m venv "$VENV_PATH"
|
|
24
|
+
source "$VENV_PATH/bin/activate"
|
|
25
|
+
|
|
26
|
+
echo -e "${CYAN}Installing Python dependencies...${NC}"
|
|
27
|
+
pip install --upgrade pip -q
|
|
28
|
+
pip install -r requirements.txt -q
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
activate_venv() {
|
|
32
|
+
if [ -d "$VENV_PATH" ]; then
|
|
33
|
+
source "$VENV_PATH/bin/activate"
|
|
34
|
+
echo -e "${GREEN}Virtual environment activated${NC}"
|
|
35
|
+
return 0
|
|
36
|
+
fi
|
|
37
|
+
return 1
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
check_python() {
|
|
41
|
+
if ! command -v python3 &> /dev/null; then
|
|
42
|
+
echo -e "${RED}Error: Python 3 is not installed${NC}"
|
|
43
|
+
echo "Please install Python 3.10 or later"
|
|
44
|
+
exit 1
|
|
45
|
+
fi
|
|
46
|
+
echo -e "${GREEN}Python: $(python3 --version)${NC}"
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
check_node() {
|
|
50
|
+
if ! command -v node &> /dev/null; then
|
|
51
|
+
echo -e "${YELLOW}Node.js not found. Falling back to Python-only mode.${NC}"
|
|
52
|
+
return 1
|
|
53
|
+
fi
|
|
54
|
+
echo -e "${GREEN}Node.js: $(node --version)${NC}"
|
|
55
|
+
return 0
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
build_frontend() {
|
|
59
|
+
if [ ! -d "$WEB_DIR/node_modules" ]; then
|
|
60
|
+
echo -e "${CYAN}Installing frontend dependencies...${NC}"
|
|
61
|
+
(cd "$WEB_DIR" && npm install)
|
|
62
|
+
fi
|
|
63
|
+
|
|
64
|
+
if [ ! -f "$WEB_DIR/dist/index.html" ] || [ "$HITS_REBUILD" = "1" ]; then
|
|
65
|
+
echo -e "${CYAN}Building frontend...${NC}"
|
|
66
|
+
(cd "$WEB_DIR" && npm run build)
|
|
67
|
+
fi
|
|
68
|
+
|
|
69
|
+
if [ -f "$WEB_DIR/dist/index.html" ]; then
|
|
70
|
+
echo -e "${GREEN}Frontend built OK${NC}"
|
|
71
|
+
else
|
|
72
|
+
echo -e "${YELLOW}Warning: Frontend not built. Run: cd hits_web && npm run build${NC}"
|
|
73
|
+
fi
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
preflight_checks() {
|
|
77
|
+
echo -e "${CYAN}Running pre-flight checks...${NC}"
|
|
78
|
+
echo ""
|
|
79
|
+
|
|
80
|
+
if [ -d "$VENV_PATH" ]; then
|
|
81
|
+
source "$VENV_PATH/bin/activate"
|
|
82
|
+
else
|
|
83
|
+
echo -e "${RED}Virtual environment not found. Run: ./run.sh --setup${NC}"
|
|
84
|
+
return 1
|
|
85
|
+
fi
|
|
86
|
+
|
|
87
|
+
local failed=0
|
|
88
|
+
|
|
89
|
+
echo " [1/3] Checking core imports..."
|
|
90
|
+
if ! python -c "
|
|
91
|
+
from hits_core.models import Node, KnowledgeTree
|
|
92
|
+
from hits_core.storage import FileStorage
|
|
93
|
+
from hits_core.auth import AuthManager
|
|
94
|
+
from hits_core.api.server import APIServer
|
|
95
|
+
print('OK')
|
|
96
|
+
" 2>/dev/null; then
|
|
97
|
+
echo -e "${RED} ✗ Core imports failed${NC}"
|
|
98
|
+
echo " Run: ./run.sh --setup"
|
|
99
|
+
failed=1
|
|
100
|
+
else
|
|
101
|
+
echo -e "${GREEN} ✓ Core imports OK${NC}"
|
|
102
|
+
fi
|
|
103
|
+
|
|
104
|
+
echo " [2/3] Checking config..."
|
|
105
|
+
if [ ! -f "config/settings.yaml" ]; then
|
|
106
|
+
echo -e "${RED} ✗ config/settings.yaml not found${NC}"
|
|
107
|
+
failed=1
|
|
108
|
+
else
|
|
109
|
+
echo -e "${GREEN} ✓ Config OK${NC}"
|
|
110
|
+
fi
|
|
111
|
+
|
|
112
|
+
echo " [3/3] Checking frontend..."
|
|
113
|
+
if [ -f "$WEB_DIR/dist/index.html" ]; then
|
|
114
|
+
echo -e "${GREEN} ✓ Frontend OK${NC}"
|
|
115
|
+
else
|
|
116
|
+
echo -e "${YELLOW} ⚠ Frontend not built${NC}"
|
|
117
|
+
echo " Run: cd hits_web && npm install && npm run build"
|
|
118
|
+
fi
|
|
119
|
+
|
|
120
|
+
echo ""
|
|
121
|
+
return $failed
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
check_redis() {
|
|
125
|
+
if command -v redis-cli &> /dev/null; then
|
|
126
|
+
if redis-cli ping 2>/dev/null | grep -q "PONG"; then
|
|
127
|
+
echo -e "${GREEN}Redis: Connected${NC}"
|
|
128
|
+
return 0
|
|
129
|
+
fi
|
|
130
|
+
fi
|
|
131
|
+
echo -e "${YELLOW}Redis: Not available (using file storage)${NC}"
|
|
132
|
+
echo " To start Redis: cd scripts && ./setup_redis.sh --apt"
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
# ─── Node.js Server Mode (primary) ──────────────────────────────
|
|
136
|
+
|
|
137
|
+
run_node_server() {
|
|
138
|
+
if [ ! -d "$VENV_PATH" ]; then
|
|
139
|
+
setup_venv
|
|
140
|
+
fi
|
|
141
|
+
|
|
142
|
+
build_frontend
|
|
143
|
+
check_redis
|
|
144
|
+
echo ""
|
|
145
|
+
|
|
146
|
+
if [ ! -f "$WEB_DIR/dist/index.html" ]; then
|
|
147
|
+
echo -e "${RED}Error: Frontend not built.${NC}"
|
|
148
|
+
echo "Run: cd hits_web && npm install && npm run build"
|
|
149
|
+
exit 1
|
|
150
|
+
fi
|
|
151
|
+
|
|
152
|
+
echo -e "${CYAN}Starting HITS via Node.js server...${NC}"
|
|
153
|
+
echo -e "${GREEN}http://127.0.0.1:${PORT}${NC}"
|
|
154
|
+
echo -e "${CYAN}Press Ctrl+C to stop${NC}"
|
|
155
|
+
echo ""
|
|
156
|
+
|
|
157
|
+
node bin/hits.js --port "$PORT" "$@"
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
# ─── Python-Only Mode (fallback) ────────────────────────────────
|
|
161
|
+
|
|
162
|
+
run_python_server() {
|
|
163
|
+
if [ ! -d "$VENV_PATH" ]; then
|
|
164
|
+
setup_venv
|
|
165
|
+
elif ! activate_venv; then
|
|
166
|
+
setup_venv
|
|
167
|
+
fi
|
|
168
|
+
|
|
169
|
+
if ! preflight_checks; then
|
|
170
|
+
echo -e "${RED}Pre-flight checks failed. Fix errors above.${NC}"
|
|
171
|
+
exit 1
|
|
172
|
+
fi
|
|
173
|
+
|
|
174
|
+
check_redis
|
|
175
|
+
echo ""
|
|
176
|
+
echo -e "${GREEN}Starting HITS web server on http://127.0.0.1:${PORT}${NC}"
|
|
177
|
+
echo -e "${CYAN}Press Ctrl+C to stop${NC}"
|
|
178
|
+
echo ""
|
|
179
|
+
|
|
180
|
+
python -m hits_core.main --port "$PORT"
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
run_dev() {
|
|
184
|
+
if [ ! -d "$VENV_PATH" ]; then
|
|
185
|
+
setup_venv
|
|
186
|
+
else
|
|
187
|
+
activate_venv
|
|
188
|
+
fi
|
|
189
|
+
|
|
190
|
+
pip install -r requirements.txt -q 2>/dev/null
|
|
191
|
+
|
|
192
|
+
echo -e "${CYAN}Starting backend API on port ${PORT} (dev mode)...${NC}"
|
|
193
|
+
python -m hits_core.main --port "$PORT" --dev &
|
|
194
|
+
BACKEND_PID=$!
|
|
195
|
+
|
|
196
|
+
sleep 2
|
|
197
|
+
|
|
198
|
+
if check_node; then
|
|
199
|
+
if [ ! -d "$WEB_DIR/node_modules" ]; then
|
|
200
|
+
echo -e "${CYAN}Installing frontend dependencies...${NC}"
|
|
201
|
+
(cd "$WEB_DIR" && npm install)
|
|
202
|
+
fi
|
|
203
|
+
echo -e "${GREEN}Starting Vite dev server on http://localhost:5173${NC}"
|
|
204
|
+
echo -e "${CYAN}Backend API proxy at http://localhost:${PORT}${NC}"
|
|
205
|
+
(cd "$WEB_DIR" && npm run dev)
|
|
206
|
+
fi
|
|
207
|
+
|
|
208
|
+
kill $BACKEND_PID 2>/dev/null
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
# ─── Main ───────────────────────────────────────────────────────
|
|
212
|
+
|
|
213
|
+
check_python
|
|
214
|
+
|
|
215
|
+
case "${1:-}" in
|
|
216
|
+
--test|-t)
|
|
217
|
+
if [ -d "$VENV_PATH" ]; then activate_venv; else setup_venv; fi
|
|
218
|
+
pip install pytest pytest-asyncio -q 2>/dev/null
|
|
219
|
+
python -m pytest tests/core/ -v --tb=short
|
|
220
|
+
;;
|
|
221
|
+
--setup|-s)
|
|
222
|
+
setup_venv
|
|
223
|
+
if check_node; then build_frontend; fi
|
|
224
|
+
echo -e "${GREEN}Setup complete! Run './run.sh' to start HITS.${NC}"
|
|
225
|
+
;;
|
|
226
|
+
--check|-c)
|
|
227
|
+
if activate_venv; then preflight_checks; fi
|
|
228
|
+
;;
|
|
229
|
+
--dev|-d)
|
|
230
|
+
run_dev
|
|
231
|
+
;;
|
|
232
|
+
--build|-b)
|
|
233
|
+
if check_node; then build_frontend; fi
|
|
234
|
+
;;
|
|
235
|
+
--python-only)
|
|
236
|
+
run_python_server
|
|
237
|
+
;;
|
|
238
|
+
--help|-h)
|
|
239
|
+
echo "Usage: $0 [OPTIONS]"
|
|
240
|
+
echo ""
|
|
241
|
+
echo "Options:"
|
|
242
|
+
echo " --test, -t Run tests"
|
|
243
|
+
echo " --setup, -s Setup environment (Python + frontend)"
|
|
244
|
+
echo " --check, -c Run pre-flight checks"
|
|
245
|
+
echo " --dev, -d Start in development mode (Vite HMR)"
|
|
246
|
+
echo " --build, -b Build frontend only"
|
|
247
|
+
echo " --python-only Use Python-only mode (no Node.js)"
|
|
248
|
+
echo " --help, -h Show this help"
|
|
249
|
+
echo ""
|
|
250
|
+
echo "Without options, HITS starts the production server."
|
|
251
|
+
echo " - With Node.js: uses Express server + Python backend"
|
|
252
|
+
echo " - Without Node.js: falls back to Python-only mode"
|
|
253
|
+
echo ""
|
|
254
|
+
echo "Environment variables:"
|
|
255
|
+
echo " HITS_PORT Server port (default: 8765)"
|
|
256
|
+
echo " HITS_REBUILD Set to '1' to force frontend rebuild"
|
|
257
|
+
;;
|
|
258
|
+
*)
|
|
259
|
+
# Primary: Node.js mode if available, fallback to Python-only
|
|
260
|
+
NODE_ARGS=""
|
|
261
|
+
if [ "${1:-}" = "--dev" ]; then
|
|
262
|
+
NODE_ARGS="--dev"
|
|
263
|
+
fi
|
|
264
|
+
|
|
265
|
+
if check_node; then
|
|
266
|
+
run_node_server $NODE_ARGS
|
|
267
|
+
else
|
|
268
|
+
run_python_server
|
|
269
|
+
fi
|
|
270
|
+
;;
|
|
271
|
+
esac
|