daimon 0.8.0 → 0.8.1

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/CHANGELOG.md CHANGED
@@ -4,6 +4,20 @@ All notable changes to Daimon are documented here. The format follows [Keep a Ch
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.8.1] — 2026-05-21
8
+
9
+ Hotfix for three regressions caught running v0.8.0 against a real workspace.
10
+
11
+ ### Fixed
12
+
13
+ - **Dashboard Errors page no longer storms the daemon.** The errors-panel `effect()` was tied to the `api.apps()` signal, which emits a new array reference on every SSE tick even when membership is unchanged — causing N parallel `/api/apps/<name>/errors` fetches per emission (1,690 in-flight requests observed during the post-publish smoke test). Replaced with two narrower effects: one keyed on a membership `computed` (refetches only when the app set changes), and a push-driven effect that watches `api.events()` and only refetches when an `error-new` / `error-recur` / `status` event arrives on the existing SSE stream. The dashboard now consumes the event stream instead of polling it via HTTP.
14
+ - **Parser captures real-world Nx serve failures.** v0.7's M33 patterns required a leading `>` decoration (`^\s*>\s+NX\s+.*failed`) — the actual `nx run …:serve` output omits it. Loosened the regex to `^\s*(?:>\s+)?NX\s+.*failed`, added new patterns for `Failed tasks:` and `Task "…" is continuous but exited with code N`, and updated the nx tool-routing regex to recognize the same shapes. New fixture `test/fixtures/parsers/nx-serve-fail.{log,expected.json}` covers the workspace-realistic case where the failure signal lands without a structured `file/line/col`. Resolves the v0.8.0 status/errors disagreement where an app's status flipped to `error` (via process exit code) but the Errors tab said "No errors".
15
+ - **Nav-rail tooltip dismisses on click.** Material tooltip persisted on the just-clicked rail link because the link kept focus through the route change, leaving a stuck "g l" / "g e" floater after keyboard or mouse navigation. Added `matTooltipHideDelay="0"`, `matTooltipShowDelay="300"`, and an explicit `blur()` on click.
16
+
17
+ ### Changed
18
+
19
+ - `parser-corpus.test.mjs` gains a branch for fixtures whose `expected.errors` is empty — it now asserts the failure signal lands (status flips, at least one error entry is recorded) but does not require a parsed file/line/col.
20
+
7
21
  ## [0.8.0] — 2026-05-20
8
22
 
9
23
  Strategic theme: **Mature daimon.** v0.5–v0.7 added enormous surface; v0.8 turns inward to polish the surface and harden the internals — a big CLI polish, a reliability pass, self-observability, and a plug-in surface for doctor rules, plus a first-class Tests page that finally lands part of the v0.7.1 dashboard-test debt (H3 contrast audit deferred again to v0.8.1).
package/dist/cli.js CHANGED
@@ -49,7 +49,7 @@ var yi=Object.defineProperty;var F=(n,t)=>()=>(n&&(t=n(n=0)),t);var yt=(n,t)=>{f
49
49
  );
50
50
  CREATE INDEX IF NOT EXISTS self_metrics_ts ON self_metrics(ts);
51
51
  `)}recordSelfMetric(t,e,r,s,o=Date.now()){if(this.db)try{this.db.prepare("INSERT INTO self_metrics (ts,rssMB,heapUsedMB,eventLoopLagMs,historyQueryP95Ms) VALUES (?,?,?,?,?)").run(o,t,e,r,s)}catch(i){this.warnOnce(`self_metrics write failed: ${i?.message||i}`)}}querySelfMetrics(t={}){if(!this.db)return[];let e=[],r=[];t.since!=null&&(e.push("ts >= ?"),r.push(t.since));let s=`SELECT ts, rssMB, heapUsedMB, eventLoopLagMs, historyQueryP95Ms FROM self_metrics ${e.length?"WHERE "+e.join(" AND "):""} ORDER BY ts DESC LIMIT ?`;return r.push(t.limit??60),this.db.prepare(s).all(...r)}recordEvent(t){this.db&&this.queue.push({kind:"event",row:{ts:t.ts,app:t.app,type:t.type,from_state:t.from??null,to_state:t.to??null,message:t.message??null}})}recordCompile(t,e,r=Date.now()){this.db&&this.queue.push({kind:"compile",row:{ts:r,app:t,ms:e}})}recordBundle(t,e,r,s,o=Date.now()){this.db&&this.queue.push({kind:"bundle",row:{ts:o,app:t,initialKB:e,lazyKB:r,fileCount:s}})}recordTaskRun(t,e,r,s,o,i=Date.now()){this.db&&this.queue.push({kind:"task",row:{ts:i,app:t,task:e,exit_code:r,duration_ms:s,summary:o==null?null:JSON.stringify(o)}})}flush(){if(!this.db||this.queue.length===0)return;let t=this.queue;this.queue=[];try{let e=this.db.prepare("INSERT INTO events (ts,app,type,from_state,to_state,message) VALUES (?,?,?,?,?,?)"),r=this.db.prepare("INSERT INTO compile_times (ts,app,ms) VALUES (?,?,?)"),s=this.db.prepare("INSERT INTO task_runs (ts,app,task,exit_code,duration_ms,summary) VALUES (?,?,?,?,?,?)"),o=this.db.prepare("INSERT INTO bundles (ts,app,initialKB,lazyKB,fileCount) VALUES (?,?,?,?,?)");this.db.transaction(a=>{for(let l of a)l.kind==="event"?e.run(l.row.ts,l.row.app,l.row.type,l.row.from_state,l.row.to_state,l.row.message):l.kind==="compile"?r.run(l.row.ts,l.row.app,l.row.ms):l.kind==="bundle"?o.run(l.row.ts,l.row.app,l.row.initialKB,l.row.lazyKB,l.row.fileCount):s.run(l.row.ts,l.row.app,l.row.task,l.row.exit_code,l.row.duration_ms,l.row.summary)})(t)}catch(e){this.warnOnce(`history write failed: ${e?.message||e}`)}}runRetention(){if(this.db)try{let t=Date.now()-this.cfg.retentionDays*864e5;this.db.prepare("DELETE FROM events WHERE ts < ?").run(t),this.db.prepare("DELETE FROM compile_times WHERE ts < ?").run(t),this.db.prepare("DELETE FROM task_runs WHERE ts < ?").run(t),this.db.prepare("DELETE FROM bundles WHERE ts < ?").run(t),this.db.prepare("DELETE FROM self_metrics WHERE ts < ?").run(t)}catch(t){this.warnOnce(`retention failed: ${t?.message||t}`)}}queryEvents(t){if(!this.db)return[];let e=[],r=[];t.app&&(e.push("app = ?"),r.push(t.app)),t.since!=null&&(e.push("ts >= ?"),r.push(t.since)),t.until!=null&&(e.push("ts <= ?"),r.push(t.until)),t.type&&(e.push("type = ?"),r.push(t.type));let s=`SELECT * FROM events ${e.length?"WHERE "+e.join(" AND "):""} ORDER BY ts DESC LIMIT ?`;return r.push(t.limit??500),this.db.prepare(s).all(...r)}queryCompiles(t){if(!this.db)return[];let e=[],r=[];t.app&&(e.push("app = ?"),r.push(t.app)),t.since!=null&&(e.push("ts >= ?"),r.push(t.since)),t.until!=null&&(e.push("ts <= ?"),r.push(t.until));let s=`SELECT * FROM compile_times ${e.length?"WHERE "+e.join(" AND "):""} ORDER BY ts DESC LIMIT ?`;return r.push(t.limit??1e3),this.db.prepare(s).all(...r)}queryBundles(t){if(!this.db)return[];let e=[],r=[];t.app&&(e.push("app = ?"),r.push(t.app)),t.since!=null&&(e.push("ts >= ?"),r.push(t.since)),t.until!=null&&(e.push("ts <= ?"),r.push(t.until));let s=`SELECT * FROM bundles ${e.length?"WHERE "+e.join(" AND "):""} ORDER BY ts DESC LIMIT ?`;return r.push(t.limit??1e3),this.db.prepare(s).all(...r)}trends(t){if(!this.db)return{points:[],count:0};let e=Date.now()-t.sinceMs,r=t.bucketMs,s=new Map,o=(d,u)=>{let g=Math.floor(d/r)*r,y=s.get(g)??{sum:0,n:0};y.sum+=u,y.n+=1,s.set(g,y)},i=d=>{let u=Math.floor(d/r)*r,g=s.get(u)??{sum:0,n:0};g.sum+=1,g.n+=1,s.set(u,g)},a=0;if(t.metric==="compile"){let d=this.queryCompiles({app:t.app,since:e,limit:1e4});a=d.length;for(let u of d)o(u.ts,u.ms)}else if(t.metric==="bundle"){let d=this.queryBundles({app:t.app,since:e,limit:1e4});a=d.length;for(let u of d){let g=Math.floor(u.ts/r)*r,y=s.get(g)??{sum:0,n:0,sum2:0};y.sum+=u.initialKB,y.sum2=(y.sum2??0)+u.lazyKB,y.n+=1,s.set(g,y)}}else if(t.metric==="errors"){let d=this.queryEvents({app:t.app,since:e,limit:1e4});for(let u of d)(u.type==="error-new"||u.type==="error-recur")&&(i(u.ts),a++)}else{let d=this.queryEvents({app:t.app,since:e,limit:1e4});for(let u of d)u.type==="status"&&u.to_state==="starting"&&(u.from_state==="error"||u.from_state==="serving"||u.from_state==="compiling")&&(i(u.ts),a++)}let l=[],c=[...s.entries()].sort((d,u)=>d[0]-u[0]);for(let[d,u]of c)t.metric==="compile"||t.metric==="bundle"?l.push({t:d,v:Math.round(u.sum/u.n),...u.sum2!=null?{v2:Math.round(u.sum2/u.n)}:{}}):l.push({t:d,v:u.sum});return{points:l,count:a}}queryTasks(t){if(!this.db)return[];let e=[],r=[];t.app&&(e.push("app = ?"),r.push(t.app)),t.task&&(e.push("task = ?"),r.push(t.task)),t.since!=null&&(e.push("ts >= ?"),r.push(t.since));let s=`SELECT * FROM task_runs ${e.length?"WHERE "+e.join(" AND "):""} ORDER BY ts DESC LIMIT ?`;return r.push(t.limit??200),this.db.prepare(s).all(...r)}summary(t){if(!this.db)return{uptimePct24h:0,restartCount24h:0,compileP50:null,compileP95:null,topErrors:[]};let e=Date.now()-24*3600*1e3,r=this.queryEvents({app:t,since:e,limit:5e3}),s=0,o=e,i=!1,a=null,l=[...r].sort((f,w)=>f.ts-w.ts);for(let f of l)f.type==="status"&&(f.to_state==="serving"&&!i?(i=!0,a=f.ts):i&&f.to_state!=="serving"&&a!=null&&(s+=f.ts-a,i=!1,a=null));i&&a!=null&&(s+=Date.now()-a);let c=Math.round(s/(24*3600*1e3)*1e3)/10,d=r.filter(f=>f.type==="status"&&f.to_state==="starting"&&(f.from_state==="serving"||f.from_state==="error"||f.from_state==="compiling")).length,u=this.queryCompiles({app:t,since:e,limit:1e3}).map(f=>f.ms).sort((f,w)=>f-w),g=(f,w)=>{if(f.length===0)return null;let T=Math.min(f.length-1,Math.floor((f.length-1)*w));return f[T]},y=g(u,.5),p=g(u,.95),m=new Map;for(let f of r)if(f.type==="error-new"||f.type==="error-recur"){let w=f.message??"";if(!w)continue;m.set(w,(m.get(w)??0)+1)}let h=[...m.entries()].sort((f,w)=>w[1]-f[1]).slice(0,5).map(([f,w])=>({message:f,count:w}));return{uptimePct24h:c,restartCount24h:d,compileP50:y,compileP95:p,topErrors:h}}why(t){let e=this.queryEvents({app:t,limit:200}),r=e.find(a=>a.type==="status"&&(a.to_state==="error"||a.from_state==="error"||a.to_state==="serving")),s=r?{ts:r.ts,app:r.app,type:r.type,from:r.from_state??void 0,to:r.to_state??void 0,message:r.message??void 0}:null,o=s?s.ts:Date.now(),i=e.filter(a=>a.ts<o).slice(0,5);return{trigger:s,preceding:i.map(a=>({ts:a.ts,app:a.app,type:a.type,from:a.from_state??void 0,to:a.to_state??void 0,message:a.message??void 0}))}}_flushForTest(){this.flush()}quickCheck(){if(!this.db)return!1;try{return this.db.prepare("PRAGMA quick_check").get()?.quick_check==="ok"}catch{return!1}}close(){if(this.flushTimer&&clearInterval(this.flushTimer),this.retentionTimer&&clearInterval(this.retentionTimer),this.retentionStart&&clearTimeout(this.retentionStart),this.flush(),this.db){try{this.db.close()}catch{}this.db=null}}}});import{spawnSync as gn}from"node:child_process";import Tr from"tree-kill";function Ce(n){if(process.platform==="win32"){let o=gn("powershell",["-NoProfile","-Command",`Get-NetTCPConnection -LocalPort ${n} -State Listen -ErrorAction SilentlyContinue | Select-Object -First 1 -ExpandProperty OwningProcess`],{encoding:"utf8",windowsHide:!0});if(o.status!==0)return null;let i=Number((o.stdout||"").trim().split(/\s+/)[0]);if(!Number.isFinite(i)||i<=0)return null;let a=gn("powershell",["-NoProfile","-Command",`Get-CimInstance Win32_Process -Filter "ProcessId=${i}" | Select-Object -Property Name,CommandLine | ConvertTo-Json -Compress`],{encoding:"utf8",windowsHide:!0}),l,c;try{let d=JSON.parse((a.stdout||"").trim()||"{}");l=typeof d.Name=="string"?d.Name:void 0,c=typeof d.CommandLine=="string"?d.CommandLine:void 0}catch{}return{pid:i,name:l,cmd:c}}let t=gn("lsof",["-nP","-iTCP:"+n,"-sTCP:LISTEN"],{encoding:"utf8"});if(t.status!==0)return null;let e=(t.stdout||"").split(/\r?\n/).filter(o=>o.trim()&&!o.startsWith("COMMAND"));if(!e.length)return null;let r=e[0].split(/\s+/);return{pid:Number(r[1]),name:r[0]}}function Cr(n,t){if(!t)return`port ${n} already in use`;let e=[`port ${n} in use by`];return t.name&&e.push(t.name),e.push(`(pid ${t.pid}`),t.cmd&&(e[e.length-1]+=`, cmd: ${t.cmd.slice(0,120)}`),e[e.length-1]+=")",e.join(" ")}function Er(n){return new Promise(t=>{if(!n.pid||n.pid===process.pid){t(!1);return}Tr(n.pid,"SIGTERM",e=>{if(e){setTimeout(()=>Tr(n.pid,"SIGKILL",r=>t(!r)),500);return}t(!0)})})}var yn=F(()=>{"use strict"});import Ee from"node:fs";import Oi from"node:os";import Pr from"node:path";function Rr(n){return Ee.readFileSync(n,"utf8").split(/\r?\n/).filter(e=>e.trim()).map(e=>JSON.parse(e))}var Pe,wn=F(()=>{"use strict";Pe=class{file=null;startTs=0;isRecording(){return this.file!=null}start(){if(this.file)return{path:this.file};let t=Pr.join(Oi.homedir(),".daimon","sessions");Ee.mkdirSync(t,{recursive:!0});let e=Pr.join(t,`${new Date().toISOString().replace(/[:.]/g,"-")}.jsonl`);return Ee.writeFileSync(e,""),this.file=e,this.startTs=Date.now(),{path:e}}stop(){let t={path:this.file};return this.file=null,this.startTs=0,t}append(t){if(!this.file)return;let e=JSON.stringify({ts:Date.now()-this.startTs,...t})+`
52
- `;try{Ee.appendFileSync(this.file,e)}catch{}}}});import Ni from"node:fs";import bn from"node:path";import{fileURLToPath as Mi}from"node:url";function $i(){let n=[bn.resolve(Ar,"..","package.json"),bn.resolve(Ar,"..","..","package.json")];for(let t of n)try{return JSON.parse(Ni.readFileSync(t,"utf8"))}catch{}return{}}var Ar,Z,Et=F(()=>{"use strict";Ar=bn.dirname(Mi(import.meta.url));Z=$i().version||"0.0.0"});import Zt from"node:fs";import Re from"node:path";import ji from"node:os";import{spawn as _i}from"node:child_process";import{fileURLToPath as Di}from"node:url";function ut(){return Sn}function Ae(){return Qt}function vn(n){try{return process.kill(n,0),!0}catch(t){return t&&t.code==="EPERM"}}function ot(){try{let n=Zt.readFileSync(Qt,"utf8"),t=JSON.parse(n);if(!t||typeof t.pid!="number")return null;if(!vn(t.pid)){try{Zt.unlinkSync(Qt)}catch{}return null}return t}catch{return null}}function Or(n){Zt.mkdirSync(Sn,{recursive:!0});let t=Qt+"."+process.pid+".tmp";Zt.writeFileSync(t,JSON.stringify(n)),Zt.renameSync(t,Qt)}function wt(){try{Zt.unlinkSync(Qt)}catch{}}function Li(){let n=Re.dirname(Di(import.meta.url));return Re.join(n,"main.js")}async function Pt(n={}){let t={...process.env};n.port&&(t.DAIMON_PORT=String(n.port)),_i(process.execPath,[Li(),"--headless"],{detached:!0,stdio:"ignore",env:t,windowsHide:!0}).unref();let r=Date.now();for(;Date.now()-r<5e3;){let s=ot();if(s&&(!n.port||s.apiPort===n.port))return s;await new Promise(o=>setTimeout(o,100))}throw new Error("daemon failed to start within 5s")}async function Bt(n,t){let e=Date.now();for(;Date.now()-e<t;){if(!vn(n))return!0;await new Promise(r=>setTimeout(r,100))}return!vn(n)}function Nr(n,t,e){return{pid:process.pid,apiPort:n,version:Z,startedAt:Date.now(),headless:t,cwd:process.cwd(),configPath:e}}var Sn,Qt,bt=F(()=>{"use strict";Et();Sn=Re.join(ji.homedir(),".daimon"),Qt=Re.join(Sn,"daemon.lock")});var Qr={};yt(Qr,{promptClaudeInstall:()=>Zi});import Jt,{useState as Vr}from"react";import{Box as Zr,render as Ki,Text as $e,useApp as zi,useInput as Yi}from"ink";function Vi({onDone:n}){let{exit:t}=zi(),[e,r]=Vr(0),[s,o]=Vr({skill:!0,commands:!1,agent:!0}),i=[{key:"skill",label:"Skill (~/.claude/skills/daimon/SKILL.md)"},{key:"agent",label:"Subagent (~/.claude/agents/daimon-runner.md)"}];return Yi((a,l)=>{if(l.escape||a==="q"&&!l.shift){n(null),t();return}if(l.upArrow)r(c=>Math.max(0,c-1));else if(l.downArrow)r(c=>Math.min(i.length-1,c+1));else if(a===" "){let c=i[e].key;o(d=>({...d,[c]:!d[c]}))}else l.return&&(n(s),t())}),Jt.createElement(Zr,{flexDirection:"column",paddingX:1},Jt.createElement($e,{bold:!0,color:"cyan"},"Install Claude Code integration artifacts"),Jt.createElement($e,{dimColor:!0},"Space toggles \xB7 Enter confirms \xB7 Esc cancels"),i.map((a,l)=>Jt.createElement(Zr,{key:a.key},Jt.createElement($e,{color:l===e?"cyan":void 0},l===e?"\u25B8 ":" "),Jt.createElement($e,null,"[",s[a.key]?"x":" ","] ",a.label))))}async function Zi(){return new Promise(n=>{let t=!1;Ki(Jt.createElement(Vi,{onDone:r=>{t||(t=!0,n(r))}})).waitUntilExit().then(()=>{t||(t=!0,n(null))})})}var ts=F(()=>{"use strict"});import Qi from"node:crypto";function da(n){for(let{tool:t,rx:e}of pa)if(e.test(n))return t}function Sa(n){return Qi.createHash("sha1").update(n).digest("hex").slice(0,16)}function ka(n){let t={message:n},e=n.match(sa)||n.match(ra);e&&(t.code=`TS${e[1]}`);let r=n.match(ia)||n.match(es)||n.match(oa);if(r)t.file=r[1],t.line=Number(r[2]),t.col=Number(r[3]);else{let o=n.match(la);if(o)t.file=o[1],o[2]&&(t.line=Number(o[2])),o[3]&&(t.col=Number(o[3]));else{let i=n.match(ca);if(i)t.file=i[1];else{let a=n.match(rs);if(a)t.file=a[1],t.line=Number(a[2]),t.col=Number(a[3]);else{let l=n.match(ns);l&&(t.file=l[1],t.line=Number(l[2]))}}}}let s=da(n);return s&&(t.tool=s),t}function xa(n,t){try{let e=new URL(n);return e.hostname==="0.0.0.0"||e.hostname==="[::]"?(e.hostname=t.includes(":")?`[${t}]`:t,e.toString().replace(/\/$/,"")):n.replace(/\/$/,"")}catch{return n}}function Ta(n,t="127.0.0.1"){let e=n.match(fa)||n.match(ma)||n.match(ha)||n.match(ga);if(!e)return null;let r=e[1].replace(/[),.;]+$/,"");return xa(r,t)}function Ca(n,t){if(ya.test(t))return n.bundle||(n.bundle={initialKB:0,lazyKB:0,files:[]}),n._bundleSection="initial",!1;if(wa.test(t))return n.bundle||(n.bundle={initialKB:0,lazyKB:0,files:[]}),n._bundleSection="lazy",!1;let e=t.match(ba);if(e&&n.bundle){let s=parseFloat(e[2]),o=e[3].toUpperCase(),i=Math.round(o==="MB"?s*1024:o==="B"?s/1024:s);return/Initial/i.test(e[1])?n.bundle.initialKB=i:n.bundle.lazyKB=i,!0}let r=t.match(va);if(r&&n.bundle){let s=r[1].trim();if(/^(Initial|Lazy)\s+(total|chunk)/i.test(s))return!1;let o=r[4].toUpperCase(),i=parseFloat(r[3]),a=o==="MB"?i*1024:o==="B"?i/1024:i;return n.bundle.files.push({name:s,sizeKB:Math.round(a*10)/10}),!1}return!1}function ss(n,t){let e=t.match(ua),r=e?null:t.match(es),s=!e&&!r?t.match(rs):null,o=e??r??s;if(o&&n.lastErrorHash){let p=n.errors.get(n.lastErrorHash);p&&!p.parsed?.file&&(p.parsed={...p.parsed??{message:p.message},file:o[1],line:Number(o[2]),col:Number(o[3])})}else if(n.lastErrorHash){let p=t.match(ns),m=p?null:t.match(aa);if(p||m){let h=n.errors.get(n.lastErrorHash);if(h&&!h.parsed?.file){let f=p??m;h.parsed={...h.parsed??{message:h.message},file:f[1],line:Number(f[2])}}}}let i=t.trim();if(!i)return null;let a=n.status,l=!1,c,d=Ta(i);d&&!n.announcedUrl&&(n.announcedUrl=d,c=d);let u=Ca(n,i),g;if(ta.some(p=>p.test(i))){let p=n.status==="error"||!!n.recoveringFromError;if(n.status==="compiling"||n.status==="starting"||n.status==="error"){let m=Date.now();n.compileStartedAt!=null?(g=m-n.compileStartedAt,n.lastCompileMs=g,n.lastCompileAt=m,n.compileStartedAt=null,n.compileHistory.push(g),n.compileHistory.length>20&&n.compileHistory.splice(0,n.compileHistory.length-20)):n.lastCompileAt=m}n.status="serving",p&&(n.errors.clear(),n.recoveringFromError=!1)}else ea.some(p=>p.test(i))&&(n.status==="starting"||n.status==="serving"||n.status==="error")&&(n.status==="error"&&(n.recoveringFromError=!0),n.compileStartedAt=Date.now(),n.status="compiling");let y;if(na.some(p=>p.test(i))){let p=Sa(i),m=Date.now(),h=n.errors.get(p),f=!1,w;h?(h.count+=1,h.lastSeen=m,w=h):(w={message:i,count:1,firstSeen:m,lastSeen:m,parsed:ka(i)},n.errors.set(p,w),f=!0),n.lastErrorHash=p,y={entry:w,isNew:f},n.status="error"}return l=n.status!==a,{statusChanged:l,error:y,announcedUrl:c,bundleUpdated:u,compileMs:g}}var ta,ea,na,ra,sa,oa,es,ia,ns,rs,aa,ca,la,ua,pa,fa,ma,ha,ga,ya,wa,ba,va,os=F(()=>{"use strict";ta=[/Local:\s+http/i,/Application bundle generation complete/i,/compiled successfully/i,/webpack compiled\s+(?:successfully|in\b)/i,/Angular Live Development Server is listening/i,/Storybook\s+[\d.]+\s+(?:for\s+\S+\s+)?started/i,/VITE\s+v[\d.]+\s+ready/i,/Quit the server with CONTROL-C/i,/Uvicorn running on http/i,/Application startup complete/i,/Puma starting in single mode/i,/Use Ctrl-C to stop/i,/Listening on tcp:\/\//i,/running on http/i,/serving HTTP on/i,/trunk serve.*at/i],ea=[/Building\.\.\./i,/Compilation started/i,/Initial chunk files/i,/Compiling/i,/Watching for file changes with StatReloader/i,/Performing system checks/i,/watching files for changes/i,/building\.{3}/i,/Compiling \(/i],na=[/^\s*ERROR\b/,/\berror TS\d+/,/✘/,/\[ERROR\]/,/Cannot find module/i,/^FAIL\s+\S+/,/^\s*●\s+/,/^\s*>\s+NX\s+.*failed/i,/\bModule not found:/,/\[vite\]\s+(?:Internal server error|Pre-transform error)/i,/\[plugin:[^\]]+\]/i,/^\s*ERR!\s+/,/^\s*(?:Uncaught\s+)?(?:Error|TypeError|SyntaxError|ReferenceError|RangeError):\s+/,/^Traceback \(most recent call last\):/,/^\s*[A-Z][a-zA-Z]*Error:\s+/,/^\s*\[error\]\s+/i,/^panic:\s+/,/^thread\s+'[^']+'\s+panicked at/,/^error\[E\d+\]:/,/^\S+\.(?:go|rb|py|rs):\d+:\d+:/,/^\s*[A-Z][a-zA-Z]*\.[A-Z][a-zA-Z]*:\s+/,/^[A-Z][a-zA-Z]+(?:::[A-Z][a-zA-Z]+)+\s*[(:]/,/^[A-Z][a-zA-Z]*Error\s*\(/],ra=/\berror TS(\d+)/,sa=/✘\s*\[ERROR\]\s*TS(\d+)/,oa=/([A-Z]:[\\/][^\s:()]+|[^\s:()]+\.(?:tsx?|jsx?|mjs|cjs|vue|svelte|py|rb|go|rs)):(\d+):(\d+)/,es=/\(([A-Z]:[\\/][^\s:()]+|[^\s:()]+\.(?:tsx?|jsx?|mjs|cjs|vue|svelte|py|rb|go|rs)):(\d+):(\d+)\)/,ia=/([A-Z]:[\\/][^\s:()]+|[^\s:()]+\.(?:tsx?|jsx?|mjs|cjs|vue|svelte))\((\d+),(\d+)\)\s*:/,ns=/File\s+"([^"]+\.py)",\s+line\s+(\d+)/,rs=/^\s*-->\s+([^\s:]+\.rs):(\d+):(\d+)/,aa=/^([^\s:()]+\.rb):(\d+):in\b/,ca=/^FAIL\s+(\S+\.(?:tsx?|jsx?|mjs|cjs))(?:\s|$)/,la=/^ERROR in\s+(\S+\.(?:tsx?|jsx?|mjs|cjs|vue|svelte))(?:[:\s](\d+):(\d+))?/,ua=/^\s+([A-Z]:[\\/][^\s:()]+|[^\s:()]+\.(?:tsx?|jsx?|mjs|cjs|vue|svelte)):(\d+):(\d+):?\s*$/,pa=[{tool:"vite",rx:/\[vite\]|\[plugin:vite:|transformWithEsbuild/i},{tool:"storybook",rx:/\bstorybook\b|^\s*ERR!\s|builder-vite/i},{tool:"jest",rx:/^FAIL\s|^\s*●\s+|\bjest\b/i},{tool:"nx",rx:/>\s+NX\s+|Failed tasks:|Nx errored/i},{tool:"webpack",rx:/\bModule not found:|webpack compiled|webpack-dev-server/i},{tool:"esbuild",rx:/✘\s*\[ERROR\]|esbuild/i},{tool:"typescript",rx:/\berror TS\d+/},{tool:"django",rx:/\bdjango\b|StatReloader|manage\.py runserver/i},{tool:"rails",rx:/\brails\b|Puma starting|Booting (?:Puma|Rails)|ActionController|NameError\s*\(|\.rb:\d+:in/i},{tool:"fastapi",rx:/\buvicorn\b|fastapi|ASGI/i},{tool:"go-air",rx:/\bair v\d|building\.{3}|\.go:\d+:\d+/i},{tool:"rust-trunk",rx:/\btrunk\b|^error\[E\d+\]|^\s*-->\s+\S+\.rs:/i},{tool:"python",rx:/^Traceback \(most recent call last\):|^\s*File "[^"]+\.py"|[A-Z][a-zA-Z]*Error:\s/},{tool:"node",rx:/^\s*(?:Uncaught\s+)?(?:Error|TypeError|SyntaxError|ReferenceError|RangeError):/}];fa=/Local:\s+(https?:\/\/\S+)/i,ma=/Server running at\s+(https?:\/\/\S+)/i,ha=/listening on\s+(https?:\/\/\S+)/i,ga=/(?:listening|listen)\s+(https?:\/\/\S+)/i,ya=/Initial chunk files/i,wa=/Lazy chunk files/i,ba=/(Initial total|Lazy total)\s*\|?\s*([\d.]+)\s*(kB|MB|B)\b/i,va=/^\s*\|?\s*([^\s|][^|]*?)\s*\|\s*([^|]+?)\s*\|\s*([\d.]+)\s*(kB|MB|B)\b/i});import{spawn as Ea}from"node:child_process";import is from"tree-kill";import Pa from"strip-ansi";var as,je,cs=F(()=>{"use strict";os();as=500,je=class{child=null;stdoutBuf="";stderrBuf="";deps;stopping=!1;constructor(t){this.deps=t}isRunning(){return this.child!==null&&this.child.exitCode===null&&!this.stopping}start(){if(this.isRunning())return;let{app:t,port:e,state:r}=this.deps,s=Date.now();r.status="starting",r.startedAt=s,r.compileStartedAt=s,r.lastCompileMs=null,r.lastCompileAt=null,r.errors.clear(),r.logBuffer.length=0,r.lastStatusMessage=void 0;let i=`${this.deps.commandOverride||t.command} --port ${e}`,a={...process.env,...t.env||{},...this.deps.envOverride||{},PORT:String(e),FORCE_COLOR:"0"},l=Ea(i,[],{cwd:t.workspaceRoot,shell:!0,env:a,windowsHide:!0});this.child=l,r.pid=l.pid??null,r.port=e,l.stdout?.on("data",c=>this.handleChunk(c,"stdout")),l.stderr?.on("data",c=>this.handleChunk(c,"stderr")),l.on("exit",(c,d)=>{let u=r.status,g=this.stopping;g?(r.status="stopped",r.lastStatusMessage=`stopped (code=${c??"null"}${d?`, ${d}`:""})`):c!==0?(r.status="error",r.lastStatusMessage=`process exited with code ${c}${d?` (${d})`:""}`):r.status="stopped",r.pid=null,r.health="unknown",this.child=null,this.stopping=!1,u!==r.status&&this.deps.onStatusChange?.(u,r.status,r.lastStatusMessage),this.deps.onExit?.(c,d,g),this.deps.onStateChange()}),l.on("error",c=>{r.status="error",r.lastStatusMessage=`spawn error: ${c.message}`,this.deps.onStateChange()}),this.deps.onStateChange()}handleChunk(t,e){let r=t.toString("utf8"),s=this[e==="stdout"?"stdoutBuf":"stderrBuf"]+=r,o=s.lastIndexOf(`
52
+ `;try{Ee.appendFileSync(this.file,e)}catch{}}}});import Ni from"node:fs";import bn from"node:path";import{fileURLToPath as Mi}from"node:url";function $i(){let n=[bn.resolve(Ar,"..","package.json"),bn.resolve(Ar,"..","..","package.json")];for(let t of n)try{return JSON.parse(Ni.readFileSync(t,"utf8"))}catch{}return{}}var Ar,Z,Et=F(()=>{"use strict";Ar=bn.dirname(Mi(import.meta.url));Z=$i().version||"0.0.0"});import Zt from"node:fs";import Re from"node:path";import ji from"node:os";import{spawn as _i}from"node:child_process";import{fileURLToPath as Di}from"node:url";function ut(){return Sn}function Ae(){return Qt}function vn(n){try{return process.kill(n,0),!0}catch(t){return t&&t.code==="EPERM"}}function ot(){try{let n=Zt.readFileSync(Qt,"utf8"),t=JSON.parse(n);if(!t||typeof t.pid!="number")return null;if(!vn(t.pid)){try{Zt.unlinkSync(Qt)}catch{}return null}return t}catch{return null}}function Or(n){Zt.mkdirSync(Sn,{recursive:!0});let t=Qt+"."+process.pid+".tmp";Zt.writeFileSync(t,JSON.stringify(n)),Zt.renameSync(t,Qt)}function wt(){try{Zt.unlinkSync(Qt)}catch{}}function Li(){let n=Re.dirname(Di(import.meta.url));return Re.join(n,"main.js")}async function Pt(n={}){let t={...process.env};n.port&&(t.DAIMON_PORT=String(n.port)),_i(process.execPath,[Li(),"--headless"],{detached:!0,stdio:"ignore",env:t,windowsHide:!0}).unref();let r=Date.now();for(;Date.now()-r<5e3;){let s=ot();if(s&&(!n.port||s.apiPort===n.port))return s;await new Promise(o=>setTimeout(o,100))}throw new Error("daemon failed to start within 5s")}async function Bt(n,t){let e=Date.now();for(;Date.now()-e<t;){if(!vn(n))return!0;await new Promise(r=>setTimeout(r,100))}return!vn(n)}function Nr(n,t,e){return{pid:process.pid,apiPort:n,version:Z,startedAt:Date.now(),headless:t,cwd:process.cwd(),configPath:e}}var Sn,Qt,bt=F(()=>{"use strict";Et();Sn=Re.join(ji.homedir(),".daimon"),Qt=Re.join(Sn,"daemon.lock")});var Qr={};yt(Qr,{promptClaudeInstall:()=>Zi});import Jt,{useState as Vr}from"react";import{Box as Zr,render as Ki,Text as $e,useApp as zi,useInput as Yi}from"ink";function Vi({onDone:n}){let{exit:t}=zi(),[e,r]=Vr(0),[s,o]=Vr({skill:!0,commands:!1,agent:!0}),i=[{key:"skill",label:"Skill (~/.claude/skills/daimon/SKILL.md)"},{key:"agent",label:"Subagent (~/.claude/agents/daimon-runner.md)"}];return Yi((a,l)=>{if(l.escape||a==="q"&&!l.shift){n(null),t();return}if(l.upArrow)r(c=>Math.max(0,c-1));else if(l.downArrow)r(c=>Math.min(i.length-1,c+1));else if(a===" "){let c=i[e].key;o(d=>({...d,[c]:!d[c]}))}else l.return&&(n(s),t())}),Jt.createElement(Zr,{flexDirection:"column",paddingX:1},Jt.createElement($e,{bold:!0,color:"cyan"},"Install Claude Code integration artifacts"),Jt.createElement($e,{dimColor:!0},"Space toggles \xB7 Enter confirms \xB7 Esc cancels"),i.map((a,l)=>Jt.createElement(Zr,{key:a.key},Jt.createElement($e,{color:l===e?"cyan":void 0},l===e?"\u25B8 ":" "),Jt.createElement($e,null,"[",s[a.key]?"x":" ","] ",a.label))))}async function Zi(){return new Promise(n=>{let t=!1;Ki(Jt.createElement(Vi,{onDone:r=>{t||(t=!0,n(r))}})).waitUntilExit().then(()=>{t||(t=!0,n(null))})})}var ts=F(()=>{"use strict"});import Qi from"node:crypto";function da(n){for(let{tool:t,rx:e}of pa)if(e.test(n))return t}function Sa(n){return Qi.createHash("sha1").update(n).digest("hex").slice(0,16)}function ka(n){let t={message:n},e=n.match(sa)||n.match(ra);e&&(t.code=`TS${e[1]}`);let r=n.match(ia)||n.match(es)||n.match(oa);if(r)t.file=r[1],t.line=Number(r[2]),t.col=Number(r[3]);else{let o=n.match(la);if(o)t.file=o[1],o[2]&&(t.line=Number(o[2])),o[3]&&(t.col=Number(o[3]));else{let i=n.match(ca);if(i)t.file=i[1];else{let a=n.match(rs);if(a)t.file=a[1],t.line=Number(a[2]),t.col=Number(a[3]);else{let l=n.match(ns);l&&(t.file=l[1],t.line=Number(l[2]))}}}}let s=da(n);return s&&(t.tool=s),t}function xa(n,t){try{let e=new URL(n);return e.hostname==="0.0.0.0"||e.hostname==="[::]"?(e.hostname=t.includes(":")?`[${t}]`:t,e.toString().replace(/\/$/,"")):n.replace(/\/$/,"")}catch{return n}}function Ta(n,t="127.0.0.1"){let e=n.match(fa)||n.match(ma)||n.match(ha)||n.match(ga);if(!e)return null;let r=e[1].replace(/[),.;]+$/,"");return xa(r,t)}function Ca(n,t){if(ya.test(t))return n.bundle||(n.bundle={initialKB:0,lazyKB:0,files:[]}),n._bundleSection="initial",!1;if(wa.test(t))return n.bundle||(n.bundle={initialKB:0,lazyKB:0,files:[]}),n._bundleSection="lazy",!1;let e=t.match(ba);if(e&&n.bundle){let s=parseFloat(e[2]),o=e[3].toUpperCase(),i=Math.round(o==="MB"?s*1024:o==="B"?s/1024:s);return/Initial/i.test(e[1])?n.bundle.initialKB=i:n.bundle.lazyKB=i,!0}let r=t.match(va);if(r&&n.bundle){let s=r[1].trim();if(/^(Initial|Lazy)\s+(total|chunk)/i.test(s))return!1;let o=r[4].toUpperCase(),i=parseFloat(r[3]),a=o==="MB"?i*1024:o==="B"?i/1024:i;return n.bundle.files.push({name:s,sizeKB:Math.round(a*10)/10}),!1}return!1}function ss(n,t){let e=t.match(ua),r=e?null:t.match(es),s=!e&&!r?t.match(rs):null,o=e??r??s;if(o&&n.lastErrorHash){let p=n.errors.get(n.lastErrorHash);p&&!p.parsed?.file&&(p.parsed={...p.parsed??{message:p.message},file:o[1],line:Number(o[2]),col:Number(o[3])})}else if(n.lastErrorHash){let p=t.match(ns),m=p?null:t.match(aa);if(p||m){let h=n.errors.get(n.lastErrorHash);if(h&&!h.parsed?.file){let f=p??m;h.parsed={...h.parsed??{message:h.message},file:f[1],line:Number(f[2])}}}}let i=t.trim();if(!i)return null;let a=n.status,l=!1,c,d=Ta(i);d&&!n.announcedUrl&&(n.announcedUrl=d,c=d);let u=Ca(n,i),g;if(ta.some(p=>p.test(i))){let p=n.status==="error"||!!n.recoveringFromError;if(n.status==="compiling"||n.status==="starting"||n.status==="error"){let m=Date.now();n.compileStartedAt!=null?(g=m-n.compileStartedAt,n.lastCompileMs=g,n.lastCompileAt=m,n.compileStartedAt=null,n.compileHistory.push(g),n.compileHistory.length>20&&n.compileHistory.splice(0,n.compileHistory.length-20)):n.lastCompileAt=m}n.status="serving",p&&(n.errors.clear(),n.recoveringFromError=!1)}else ea.some(p=>p.test(i))&&(n.status==="starting"||n.status==="serving"||n.status==="error")&&(n.status==="error"&&(n.recoveringFromError=!0),n.compileStartedAt=Date.now(),n.status="compiling");let y;if(na.some(p=>p.test(i))){let p=Sa(i),m=Date.now(),h=n.errors.get(p),f=!1,w;h?(h.count+=1,h.lastSeen=m,w=h):(w={message:i,count:1,firstSeen:m,lastSeen:m,parsed:ka(i)},n.errors.set(p,w),f=!0),n.lastErrorHash=p,y={entry:w,isNew:f},n.status="error"}return l=n.status!==a,{statusChanged:l,error:y,announcedUrl:c,bundleUpdated:u,compileMs:g}}var ta,ea,na,ra,sa,oa,es,ia,ns,rs,aa,ca,la,ua,pa,fa,ma,ha,ga,ya,wa,ba,va,os=F(()=>{"use strict";ta=[/Local:\s+http/i,/Application bundle generation complete/i,/compiled successfully/i,/webpack compiled\s+(?:successfully|in\b)/i,/Angular Live Development Server is listening/i,/Storybook\s+[\d.]+\s+(?:for\s+\S+\s+)?started/i,/VITE\s+v[\d.]+\s+ready/i,/Quit the server with CONTROL-C/i,/Uvicorn running on http/i,/Application startup complete/i,/Puma starting in single mode/i,/Use Ctrl-C to stop/i,/Listening on tcp:\/\//i,/running on http/i,/serving HTTP on/i,/trunk serve.*at/i],ea=[/Building\.\.\./i,/Compilation started/i,/Initial chunk files/i,/Compiling/i,/Watching for file changes with StatReloader/i,/Performing system checks/i,/watching files for changes/i,/building\.{3}/i,/Compiling \(/i],na=[/^\s*ERROR\b/,/\berror TS\d+/,/✘/,/\[ERROR\]/,/Cannot find module/i,/^FAIL\s+\S+/,/^\s*●\s+/,/^\s*(?:>\s+)?NX\s+.*failed/i,/^\s*Failed tasks:/,/^\s*Task\s+"[^"]+"\s+is continuous but exited with code\s+\d+/,/\bModule not found:/,/\[vite\]\s+(?:Internal server error|Pre-transform error)/i,/\[plugin:[^\]]+\]/i,/^\s*ERR!\s+/,/^\s*(?:Uncaught\s+)?(?:Error|TypeError|SyntaxError|ReferenceError|RangeError):\s+/,/^Traceback \(most recent call last\):/,/^\s*[A-Z][a-zA-Z]*Error:\s+/,/^\s*\[error\]\s+/i,/^panic:\s+/,/^thread\s+'[^']+'\s+panicked at/,/^error\[E\d+\]:/,/^\S+\.(?:go|rb|py|rs):\d+:\d+:/,/^\s*[A-Z][a-zA-Z]*\.[A-Z][a-zA-Z]*:\s+/,/^[A-Z][a-zA-Z]+(?:::[A-Z][a-zA-Z]+)+\s*[(:]/,/^[A-Z][a-zA-Z]*Error\s*\(/],ra=/\berror TS(\d+)/,sa=/✘\s*\[ERROR\]\s*TS(\d+)/,oa=/([A-Z]:[\\/][^\s:()]+|[^\s:()]+\.(?:tsx?|jsx?|mjs|cjs|vue|svelte|py|rb|go|rs)):(\d+):(\d+)/,es=/\(([A-Z]:[\\/][^\s:()]+|[^\s:()]+\.(?:tsx?|jsx?|mjs|cjs|vue|svelte|py|rb|go|rs)):(\d+):(\d+)\)/,ia=/([A-Z]:[\\/][^\s:()]+|[^\s:()]+\.(?:tsx?|jsx?|mjs|cjs|vue|svelte))\((\d+),(\d+)\)\s*:/,ns=/File\s+"([^"]+\.py)",\s+line\s+(\d+)/,rs=/^\s*-->\s+([^\s:]+\.rs):(\d+):(\d+)/,aa=/^([^\s:()]+\.rb):(\d+):in\b/,ca=/^FAIL\s+(\S+\.(?:tsx?|jsx?|mjs|cjs))(?:\s|$)/,la=/^ERROR in\s+(\S+\.(?:tsx?|jsx?|mjs|cjs|vue|svelte))(?:[:\s](\d+):(\d+))?/,ua=/^\s+([A-Z]:[\\/][^\s:()]+|[^\s:()]+\.(?:tsx?|jsx?|mjs|cjs|vue|svelte)):(\d+):(\d+):?\s*$/,pa=[{tool:"vite",rx:/\[vite\]|\[plugin:vite:|transformWithEsbuild/i},{tool:"storybook",rx:/\bstorybook\b|^\s*ERR!\s|builder-vite/i},{tool:"jest",rx:/^FAIL\s|^\s*●\s+|\bjest\b/i},{tool:"nx",rx:/(?:>\s+)?NX\s+(?:\w|.*failed)|Failed tasks:|Nx errored|exited with code\s+\d+/i},{tool:"webpack",rx:/\bModule not found:|webpack compiled|webpack-dev-server/i},{tool:"esbuild",rx:/✘\s*\[ERROR\]|esbuild/i},{tool:"typescript",rx:/\berror TS\d+/},{tool:"django",rx:/\bdjango\b|StatReloader|manage\.py runserver/i},{tool:"rails",rx:/\brails\b|Puma starting|Booting (?:Puma|Rails)|ActionController|NameError\s*\(|\.rb:\d+:in/i},{tool:"fastapi",rx:/\buvicorn\b|fastapi|ASGI/i},{tool:"go-air",rx:/\bair v\d|building\.{3}|\.go:\d+:\d+/i},{tool:"rust-trunk",rx:/\btrunk\b|^error\[E\d+\]|^\s*-->\s+\S+\.rs:/i},{tool:"python",rx:/^Traceback \(most recent call last\):|^\s*File "[^"]+\.py"|[A-Z][a-zA-Z]*Error:\s/},{tool:"node",rx:/^\s*(?:Uncaught\s+)?(?:Error|TypeError|SyntaxError|ReferenceError|RangeError):/}];fa=/Local:\s+(https?:\/\/\S+)/i,ma=/Server running at\s+(https?:\/\/\S+)/i,ha=/listening on\s+(https?:\/\/\S+)/i,ga=/(?:listening|listen)\s+(https?:\/\/\S+)/i,ya=/Initial chunk files/i,wa=/Lazy chunk files/i,ba=/(Initial total|Lazy total)\s*\|?\s*([\d.]+)\s*(kB|MB|B)\b/i,va=/^\s*\|?\s*([^\s|][^|]*?)\s*\|\s*([^|]+?)\s*\|\s*([\d.]+)\s*(kB|MB|B)\b/i});import{spawn as Ea}from"node:child_process";import is from"tree-kill";import Pa from"strip-ansi";var as,je,cs=F(()=>{"use strict";os();as=500,je=class{child=null;stdoutBuf="";stderrBuf="";deps;stopping=!1;constructor(t){this.deps=t}isRunning(){return this.child!==null&&this.child.exitCode===null&&!this.stopping}start(){if(this.isRunning())return;let{app:t,port:e,state:r}=this.deps,s=Date.now();r.status="starting",r.startedAt=s,r.compileStartedAt=s,r.lastCompileMs=null,r.lastCompileAt=null,r.errors.clear(),r.logBuffer.length=0,r.lastStatusMessage=void 0;let i=`${this.deps.commandOverride||t.command} --port ${e}`,a={...process.env,...t.env||{},...this.deps.envOverride||{},PORT:String(e),FORCE_COLOR:"0"},l=Ea(i,[],{cwd:t.workspaceRoot,shell:!0,env:a,windowsHide:!0});this.child=l,r.pid=l.pid??null,r.port=e,l.stdout?.on("data",c=>this.handleChunk(c,"stdout")),l.stderr?.on("data",c=>this.handleChunk(c,"stderr")),l.on("exit",(c,d)=>{let u=r.status,g=this.stopping;g?(r.status="stopped",r.lastStatusMessage=`stopped (code=${c??"null"}${d?`, ${d}`:""})`):c!==0?(r.status="error",r.lastStatusMessage=`process exited with code ${c}${d?` (${d})`:""}`):r.status="stopped",r.pid=null,r.health="unknown",this.child=null,this.stopping=!1,u!==r.status&&this.deps.onStatusChange?.(u,r.status,r.lastStatusMessage),this.deps.onExit?.(c,d,g),this.deps.onStateChange()}),l.on("error",c=>{r.status="error",r.lastStatusMessage=`spawn error: ${c.message}`,this.deps.onStateChange()}),this.deps.onStateChange()}handleChunk(t,e){let r=t.toString("utf8"),s=this[e==="stdout"?"stdoutBuf":"stderrBuf"]+=r,o=s.lastIndexOf(`
53
53
  `);if(o<0)return;let i=s.slice(0,o),a=s.slice(o+1);e==="stdout"?this.stdoutBuf=a:this.stderrBuf=a;let{state:l}=this.deps,c=!1;for(let d of i.split(/\r?\n/)){if(!d.length)continue;let u=Pa(d),g=Date.now();l.lastLogTs=g,l.stale&&(l.stale=!1),l.logBuffer.push({ts:g,line:u}),l.logBuffer.length>as&&l.logBuffer.splice(0,l.logBuffer.length-as),this.deps.onLogLine?.(u);let y=l.status,p=ss(l,u);p?.statusChanged&&(c=!0,this.deps.onStatusChange?.(y,l.status)),p?.error&&this.deps.onErrorRecorded?.(p.error.entry,p.error.isNew),p?.compileMs!=null&&this.deps.onCompile?.(p.compileMs),p?.bundleUpdated&&this.deps.onBundleUpdate?.()}(c||i.length>0)&&this.deps.onStateChange()}async stop(){if(!this.child||this.stopping)return;this.stopping=!0;let t=this.child.pid;if(!t){this.child=null,this.stopping=!1;return}await new Promise(e=>{let r=!1,s=()=>{r||(r=!0,e())},o=()=>s();this.child?.once("exit",o),is(t,"SIGTERM",()=>{});let i=setTimeout(()=>{is(t,"SIGKILL",()=>{})},2e3),a=setTimeout(()=>{clearTimeout(i),s()},3e3);this.child?.once("exit",()=>{clearTimeout(i),clearTimeout(a),s()})})}}});import vt from"node:fs";import Ra from"node:path";var _e,ls=F(()=>{"use strict";_e=class{constructor(t,e){this.appName=t;this.cfg=e;this.filePath=Ra.join(e.dir,`${t}.log`),this.open()}appName;cfg;fd=null;bytes=0;warned=!1;filePath;open(){try{vt.mkdirSync(this.cfg.dir,{recursive:!0});try{this.bytes=vt.statSync(this.filePath).size}catch{this.bytes=0}this.fd=vt.openSync(this.filePath,"a")}catch(t){this.warn(`open failed: ${t.message}`),this.fd=null}}write(t){if(this.fd!=null)try{let e=`${new Date().toISOString()} ${t}
54
54
  `,r=Buffer.from(e,"utf8");vt.writeSync(this.fd,r),this.bytes+=r.length,this.bytes>=this.cfg.maxBytesPerFile&&this.rotate()}catch(e){this.warn(`write failed: ${e.message}`)}}close(){if(this.fd!=null){try{vt.closeSync(this.fd)}catch{}this.fd=null}}rotate(){try{this.close();for(let t=this.cfg.maxFiles-1;t>=1;t--){let e=`${this.filePath}.${t}`,r=`${this.filePath}.${t+1}`;if(t+1>this.cfg.maxFiles-1){try{vt.rmSync(e,{force:!0})}catch{}continue}try{vt.existsSync(e)&&vt.renameSync(e,r)}catch{}}try{let t=`${this.filePath}.1`;vt.existsSync(this.filePath)&&vt.renameSync(this.filePath,t)}catch{}this.open()}catch(t){this.warn(`rotate failed: ${t.message}`)}}warn(t){this.warned||(this.warned=!0,process.stderr.write(`[daimon] warning: diskLogger(${this.appName}) ${t}
55
55
  `))}}});import{spawn as ps}from"node:child_process";import us from"tree-kill";import ds from"strip-ansi";function En(n){let t=[],e;for(let r of n.split(/\r?\n/)){let s=r.match(Ba);if(s){e=s[1];continue}let o=r.match(Fa);if(o){t.push({name:o[1].trim(),file:e});continue}let i=r.match(Ua);if(i){t.push({name:i[2],file:i[1]});continue}}return t.slice(0,50)}function Ha(n){let t=n.match(Aa);if(t){let g=t[1]?Number(t[1]):0,y=Number(t[3]),p=t[4]?Number(t[4]):y+g,m=n.match(Oa);return{passed:y,failed:g,total:p,suites:m?Number(m[3]??m[2]):void 0,framework:"jest",failedTests:g>0?En(n):void 0}}let e=n.match($a);if(e){let g=e[1]?Number(e[1]):0,y=Number(e[2]),p=e[3]?Number(e[3]):y+g,m=n.match(ja);return{passed:y,failed:g,total:p,suites:m?Number(m[3]??m[2]):void 0,framework:"vitest",failedTests:g>0?En(n):void 0}}let r=n.match(Na);if(r){let g=Number(r[1]),y=Number(r[2]),p=r[3]?Number(r[3]):0;return{passed:g-p,failed:p,total:y,framework:"karma"}}let s=n.match(Ma);if(s&&/playwright/i.test(n)){let g=Number(s[1]),y=s[2]?Number(s[2]):0;return{passed:g,failed:y,total:g+y,framework:"playwright"}}let o=n.match(_a);if(o){let g=o[1]?Number(o[1]):0,y=Number(o[2]);return{passed:y,failed:g,total:y+g,durationMs:Math.round(Number(o[3])*1e3),framework:"pytest",failedTests:g>0?En(n):void 0}}let i=n.match(Da);if(i){let g=Number(i[1]),y=Number(i[2]);return{passed:g-y,failed:y,total:g,framework:"rspec"}}let a=n.match(Ia);if(a){let g=Number(a[1]),y=Number(a[2]);return{passed:g,failed:y,total:g+y,framework:"cargo"}}let l=0,c=0,d=0,u=!1;for(let g of n.split(/\r?\n/)){let y=g.match(La);y&&(u=!0,d+=Math.round(Number(y[2])*1e3),y[1]==="ok"?l++:c++)}if(u)return{passed:l,failed:c,total:l+c,durationMs:d,framework:"go"};if(s){let g=Number(s[1]),y=s[2]?Number(s[2]):0;return{passed:g,failed:y,total:g+y,framework:"playwright"}}return null}function fs(n,t,e){let r=e.length?" -- "+e.join(" "):"";return n.workspaceType==="nx"?`npx nx run ${n.name}:${t}${r}`:n.workspaceType==="angular"?`npx ng run ${n.name}:${t}${r}`:`npx ${t}${r}`}function ms(n,t,e=[]){return new Promise(r=>{let s=Date.now(),o=fs(n,t,e),i=ps(o,[],{cwd:n.workspaceRoot,shell:!0,env:{...process.env,...n.env||{},FORCE_COLOR:"0"},windowsHide:!0}),a=[],l="",c=d=>{l+=d.toString("utf8");let u=l.lastIndexOf(`
@@ -0,0 +1 @@
1
+ import{a as J,b as X,c as Z,d as ee,e as te}from"./chunk-3WKRVGPT.js";import{a as Y}from"./chunk-WAN7TQQW.js";import"./chunk-NDSAQ2HK.js";import{b as H,c as W,d as K,e as Q}from"./chunk-Q772THBA.js";import{a as G,b as U}from"./chunk-K7S4ITPJ.js";import"./chunk-YNQPX5G6.js";import"./chunk-7C772RJ3.js";import"./chunk-6WZJCF24.js";import"./chunk-KLH6B22T.js";import{c as z}from"./chunk-EIWOTZT3.js";import{i as j,j as q}from"./chunk-LBL7Z5BE.js";import"./chunk-Y6B6X4Y6.js";import{Db as O,Eb as p,Fb as d,Gb as F,Hb as B,Ib as v,Jb as h,Kb as u,Lb as r,Mb as l,Nb as P,Sb as b,Ub as f,Wa as M,Wb as c,Ya as R,_a as o,ea as $,fc as L,gc as T,ic as s,ja as x,jc as m,ka as g,kc as y,mc as A,pa as V,pb as N,sc as S,ta as k,xc as E,yc as D}from"./chunk-K43KW4K2.js";var I=t=>["/apps",t],w=(t,n)=>n.key;function oe(t,n){t&1&&P(0,"dm-skeleton",3)}function re(t,n){if(t&1&&(s(0," \xB7 workspace "),r(1,"dm-mono"),s(2),l()),t&2){let e=c(2);o(2),m(e.workspace())}}function ae(t,n){if(t&1&&(s(0),p(1,re,3,1)),t&2){let e=c();A(" ",e.totalErrors()," ",e.totalErrors()===1?"error":"errors"," across ",e.appsWithErrors()," ",e.appsWithErrors()===1?"app":"apps"," "),o(),d(e.workspace()?1:-1)}}function le(t,n){if(t&1){let e=b();r(0,"button",20),f("click",function(){x(e);let a=c();return g(a.onQuery(""))}),r(1,"span",6),s(2,"close"),l()()}}function se(t,n){if(t&1){let e=b();r(0,"button",21),f("click",function(){let a=x(e).$implicit,_=c();return g(_.setSeverity(a.key))}),s(1),l()}if(t&2){let e=n.$implicit,i=c();T("active",i.severity()===e.key),O("aria-selected",i.severity()===e.key),o(),m(e.label)}}function ce(t,n){if(t&1){let e=b();r(0,"button",21),f("click",function(){let a=x(e).$implicit,_=c();return g(_.setGroupBy(a.key))}),s(1),l()}if(t&2){let e=n.$implicit,i=c();T("active",i.groupBy()===e.key),O("aria-selected",i.groupBy()===e.key),o(),m(e.label)}}function pe(t,n){t&1&&(r(0,"article",22),P(1,"div",23),r(2,"div",24),P(3,"dm-skeleton",25)(4,"dm-skeleton",26)(5,"dm-skeleton",27),l()())}function de(t,n){if(t&1&&(r(0,"div",16),v(1,pe,6,0,"article",22,B),l()),t&2){let e=c();o(),h(e.skeletonItems)}}function me(t,n){t&1&&(r(0,"dm-empty",17)(1,"div",28)(2,"a",29)(3,"span",6),s(4,"home"),l(),s(5,"Go home "),l()()())}function _e(t,n){if(t&1&&P(0,"dm-empty",18),t&2){let e=c();u("title","Clean \u2014 0 errors across "+e.api.apps().length+" apps")}}function ue(t,n){t&1&&P(0,"dm-empty",19)}function Ce(t,n){if(t&1){let e=b();r(0,"div",30)(1,"span",6),s(2,"info"),l(),r(3,"span"),s(4,"None of these errors include a file path on the same line as the error. Try "),r(5,"button",31),f("click",function(){x(e);let a=c(2);return g(a.setGroupBy("app"))}),s(6,"group by app"),l(),s(7,"."),l()()}}function fe(t,n){if(t&1&&P(0,"dm-status-pill",35),t&2){let e=c().$implicit;u("status",e.app.status)("health",e.app.health)}}function xe(t,n){if(t&1&&s(0),t&2){let e=c(3).$implicit;y(":",e.col)}}function ge(t,n){if(t&1&&(r(0,"span",46),s(1),p(2,xe,1,1),l()),t&2){let e=c(2).$implicit;o(),y(":",e.line),o(),d(e.col?2:-1)}}function ye(t,n){if(t&1){let e=b();r(0,"a",45),f("click",function(a){x(e);let _=c().$implicit,C=c(4);return g(C.openEditor(a,_))}),r(1,"dm-mono"),s(2),p(3,ge,3,2,"span",46),l()()}if(t&2){let e=c().$implicit,i=c(4);u("href",i.editorUrl(e),M)("matTooltip",e.file),o(2),m(i.shortPath(e.file)),o(),d(e.line?3:-1)}}function ve(t,n){t&1&&(r(0,"span",41)(1,"dm-mono"),s(2,"\u2014"),l()())}function he(t,n){if(t&1&&(r(0,"span",42)(1,"dm-mono"),s(2),l()()),t&2){let e=c().$implicit;o(2),m(e.code)}}function be(t,n){if(t&1&&(r(0,"span",44),s(1),l()),t&2){let e=c().$implicit;o(),y("\xD7",e.count)}}function Ee(t,n){if(t&1&&(r(0,"div",39),p(1,ye,4,4,"a",40)(2,ve,3,0,"span",41),p(3,he,3,1,"span",42),r(4,"span",43),s(5),l(),p(6,be,2,1,"span",44),l()),t&2){let e=n.$implicit,i=c().$implicit;o(),d(e.file?1:i.allMissingFile?-1:2),o(2),d(e.code?3:-1),o(),u("matTooltip",e.message),o(),m(e.message),o(),d(e.count>1?6:-1)}}function Pe(t,n){if(t&1){let e=b();r(0,"mat-expansion-panel",32)(1,"mat-expansion-panel-header")(2,"mat-panel-title"),P(3,"div",33),r(4,"span",34)(5,"dm-mono"),s(6),l()(),p(7,fe,1,2,"dm-status-pill",35),r(8,"span",36),s(9),l()(),r(10,"mat-panel-description")(11,"a",37),f("click",function(a){return x(e),g(a.stopPropagation())}),s(12," Open app"),r(13,"span",6),s(14,"chevron_right"),l()()()(),r(15,"div",38),v(16,Ee,7,5,"div",39,F),l()()}if(t&2){let e=n.$implicit,i=c(3);o(3),L("background",i.tone(e.workspaceLabel)),o(3),m(e.key),o(),d(e.app?7:-1),o(2),m(e.errors.length),o(2),u("routerLink",S(8,I,e.key)),o(4),T("rows-nofile",e.allMissingFile),o(),h(e.errors)}}function ke(t,n){if(t&1&&v(0,Pe,18,10,"mat-expansion-panel",32,w),t&2){let e=c(2);h(e.byApp())}}function we(t,n){if(t&1&&(r(0,"span",42)(1,"dm-mono"),s(2),l()()),t&2){let e=c().$implicit;o(2),m(e.code)}}function Me(t,n){if(t&1&&s(0),t&2){let e=c(2).$implicit;y(":",e.col)}}function Fe(t,n){if(t&1){let e=b();r(0,"a",49),f("click",function(a){x(e);let _=c().$implicit,C=c(4);return g(C.openEditor(a,_))}),r(1,"dm-mono"),s(2),p(3,Me,1,1),l()()}if(t&2){let e=c().$implicit,i=c(4);u("href",i.editorUrl(e),M),o(2),y(":",e.line),o(),d(e.col?3:-1)}}function Te(t,n){if(t&1&&(r(0,"span",44),s(1),l()),t&2){let e=c().$implicit;o(),y("\xD7",e.count)}}function Se(t,n){if(t&1){let e=b();r(0,"div",39)(1,"a",47),f("click",function(a){return x(e),g(a.stopPropagation())}),r(2,"dm-mono"),s(3),l()(),p(4,we,3,1,"span",42),r(5,"span",43),s(6),l(),p(7,Fe,4,3,"a",48),p(8,Te,2,1,"span",44),l()}if(t&2){let e=n.$implicit;o(),u("routerLink",S(7,I,e.app)),o(2),m(e.app),o(),d(e.code?4:-1),o(),u("matTooltip",e.message),o(),m(e.message),o(),d(e.line?7:-1),o(),d(e.count>1?8:-1)}}function Oe(t,n){if(t&1&&(r(0,"mat-expansion-panel",32)(1,"mat-expansion-panel-header")(2,"mat-panel-title")(3,"span",34)(4,"dm-mono"),s(5),l()(),r(6,"span",36),s(7),l()()(),r(8,"div",38),v(9,Se,9,9,"div",39,F),l()()),t&2){let e=n.$implicit,i=c(3);o(5),m(i.shortPath(e.key)),o(2),m(e.errors.length),o(2),h(e.errors)}}function Ie(t,n){if(t&1&&v(0,Oe,11,2,"mat-expansion-panel",32,w),t&2){let e=c(2);h(e.byFile())}}function $e(t,n){t&1&&(r(0,"span",50),s(1),l()),t&2&&(o(),m(n))}function De(t,n){if(t&1&&s(0),t&2){let e=c(2).$implicit;y(":",e.col)}}function Ve(t,n){if(t&1&&(r(0,"span",46),s(1),p(2,De,1,1),l()),t&2){let e=c().$implicit;o(),y(":",e.line),o(),d(e.col?2:-1)}}function Re(t,n){if(t&1&&(r(0,"span",44),s(1),l()),t&2){let e=c().$implicit;o(),y("\xD7",e.count)}}function Ne(t,n){if(t&1){let e=b();r(0,"div",39)(1,"a",47),f("click",function(a){return x(e),g(a.stopPropagation())}),r(2,"dm-mono"),s(3),l()(),r(4,"a",45),f("click",function(a){let _=x(e).$implicit,C=c(4);return g(C.openEditor(a,_))}),r(5,"dm-mono"),s(6),p(7,Ve,3,2,"span",46),l()(),r(8,"span",43),s(9),l(),p(10,Re,2,1,"span",44),l()}if(t&2){let e=n.$implicit,i=c(4);o(),u("routerLink",S(9,I,e.app)),o(2),m(e.app),o(),u("href",i.editorUrl(e),M)("matTooltip",e.file),o(2),m(i.shortPath(e.file)),o(),d(e.line?7:-1),o(),u("matTooltip",e.message),o(),m(e.message),o(),d(e.count>1?10:-1)}}function Be(t,n){if(t&1&&(r(0,"mat-expansion-panel",32)(1,"mat-expansion-panel-header")(2,"mat-panel-title")(3,"span",34)(4,"dm-mono"),s(5),l()(),p(6,$e,2,1,"span",50),r(7,"span",36),s(8),l()()(),r(9,"div",38),v(10,Ne,11,11,"div",39,F),l()()),t&2){let e,i=n.$implicit,a=c(3);o(5),m(i.key),o(),d((e=a.codeHint(i.key))?6:-1,e),o(2),m(i.errors.length),o(2),h(i.errors)}}function Le(t,n){if(t&1&&v(0,Be,12,3,"mat-expansion-panel",32,w),t&2){let e=c(2);h(e.byCode())}}function Ae(t,n){if(t&1&&s(0),t&2){let e=c(3).$implicit;y(":",e.col)}}function ze(t,n){if(t&1&&(r(0,"span",46),s(1),p(2,Ae,1,1),l()),t&2){let e=c(2).$implicit;o(),y(":",e.line),o(),d(e.col?2:-1)}}function je(t,n){if(t&1){let e=b();r(0,"a",45),f("click",function(a){x(e);let _=c().$implicit,C=c(4);return g(C.openEditor(a,_))}),r(1,"dm-mono"),s(2),p(3,ze,3,2,"span",46),l()()}if(t&2){let e=c().$implicit,i=c(4);u("href",i.editorUrl(e),M)("matTooltip",e.file),o(2),m(i.shortPath(e.file)),o(),d(e.line?3:-1)}}function Ge(t,n){t&1&&(r(0,"span",41)(1,"dm-mono"),s(2,"\u2014"),l()())}function Ue(t,n){if(t&1&&(r(0,"span",42)(1,"dm-mono"),s(2),l()()),t&2){let e=c().$implicit;o(2),m(e.code)}}function qe(t,n){if(t&1&&(r(0,"span",44),s(1),l()),t&2){let e=c().$implicit;o(),y("\xD7",e.count)}}function He(t,n){if(t&1){let e=b();r(0,"div",39)(1,"a",47),f("click",function(a){return x(e),g(a.stopPropagation())}),r(2,"dm-mono"),s(3),l()(),p(4,je,4,4,"a",40)(5,Ge,3,0,"span",41),p(6,Ue,3,1,"span",42),r(7,"span",43),s(8),l(),p(9,qe,2,1,"span",44),l()}if(t&2){let e=n.$implicit;o(),u("routerLink",S(7,I,e.app)),o(2),m(e.app),o(),d(e.file?4:5),o(2),d(e.code?6:-1),o(),u("matTooltip",e.message),o(),m(e.message),o(),d(e.count>1?9:-1)}}function We(t,n){if(t&1&&(r(0,"mat-expansion-panel",32)(1,"mat-expansion-panel-header")(2,"mat-panel-title")(3,"span",51),s(4),l(),r(5,"span",36),s(6),l()()(),r(7,"div",38),v(8,He,10,9,"div",39,F),l()()),t&2){let e=n.$implicit;o(3),O("data-tool",e.key),o(),m(e.key),o(2),m(e.errors.length),o(2),h(e.errors)}}function Ke(t,n){if(t&1&&v(0,We,10,3,"mat-expansion-panel",32,w),t&2){let e=c(2);h(e.byTool())}}function Qe(t,n){if(t&1&&(p(0,Ce,8,0,"div",30),r(1,"div",16),p(2,ke,2,0)(3,Ie,2,0)(4,Le,2,0)(5,Ke,2,0),l()),t&2){let e,i=c();d(i.groupBy()==="file"&&i.allFilesMissing()?0:-1),o(2),d((e=i.groupBy())==="app"?2:e==="file"?3:e==="code"?4:e==="tool"?5:-1)}}var ne="daimon.workspace",Ye={TS2322:"Type is not assignable to target type",TS2345:"Argument type mismatch",TS2339:"Property does not exist on type",TS18046:"Variable is of type unknown",TS2304:"Cannot find name",TS7006:"Parameter implicitly has an any type",TS6133:"Declared but never used",TS2769:"No overload matches this call"},ie=class t{api=$(q);destroyRef=$(V);raw=k(new Map);loading=k(!1);query=k("");severity=k("with-errors");groupBy=k("app");workspace=k(null);skeletonItems=[0,1,2];severityFilters=[{key:"all",label:"all"},{key:"with-errors",label:"with-errors"},{key:"code:TS",label:"code:TS*"},{key:"code:other",label:"code:other"}];groupOptions=[{key:"app",label:"app"},{key:"file",label:"file"},{key:"code",label:"code"},{key:"tool",label:"tool"}];tone=Y;appsByName=E(()=>{let n=new Map;for(let e of this.api.apps())n.set(e.name,e);return n});flat=E(()=>{let n=[],e=this.appsByName();for(let[i,a]of this.raw()){let _=e.get(i);for(let C of a)n.push({app:i,workspaceLabel:_?.workspaceLabel??null,file:C.parsed?.file??"",line:C.parsed?.line??null,col:C.parsed?.col??null,code:C.parsed?.code??"",message:C.parsed?.message??C.message??"",count:C.count??1,tool:C.parsed?.tool??""})}return n});totalErrors=E(()=>this.flat().reduce((n,e)=>n+e.count,0));appsWithErrors=E(()=>{let n=new Set;for(let e of this.flat())n.add(e.app);return n.size});filteredFlat=E(()=>{let n=this.query().trim().toLowerCase(),e=this.severity(),i=this.workspace();return this.flat().filter(a=>!(i&&a.workspaceLabel!==i||(e==="with-errors"&&!a.code&&a.file,e==="code:TS"&&!/^TS\d+/i.test(a.code))||e==="code:other"&&/^TS\d+/i.test(a.code)||n&&!`${a.file} ${a.code} ${a.message}`.toLowerCase().includes(n)))});byApp=E(()=>{let n=new Map;for(let i of this.filteredFlat()){let a=n.get(i.app);a?a.push(i):n.set(i.app,[i])}let e=this.appsByName();return Array.from(n.entries()).map(([i,a])=>({key:i,app:e.get(i)??null,workspaceLabel:e.get(i)?.workspaceLabel??null,errors:a,allMissingFile:a.every(_=>!_.file)})).sort((i,a)=>a.errors.length-i.errors.length)});byFile=E(()=>{let n=new Map;for(let e of this.filteredFlat()){let i=e.file||"(no file detected)",a=n.get(i);a?a.push(e):n.set(i,[e])}return Array.from(n.entries()).map(([e,i])=>({key:e,errors:i})).sort((e,i)=>i.errors.length-e.errors.length)});allFilesMissing=E(()=>{let n=this.filteredFlat();return n.length?n.every(e=>!e.file):!1});byCode=E(()=>{let n=new Map;for(let e of this.filteredFlat()){let i=e.code||"(no-code)",a=n.get(i);a?a.push(e):n.set(i,[e])}return Array.from(n.entries()).map(([e,i])=>({key:e,errors:i})).sort((e,i)=>i.errors.length-e.errors.length)});byTool=E(()=>{let n=new Map;for(let e of this.filteredFlat()){let i=e.tool||"(unknown)",a=n.get(i);a?a.push(e):n.set(i,[e])}return Array.from(n.entries()).map(([e,i])=>({key:e,errors:i})).sort((e,i)=>i.errors.length-e.errors.length)});appsKey=E(()=>this.api.apps().map(n=>n.name).sort().join("|"));lastEventCount=0;busy=!1;constructor(){this.workspace.set(localStorage.getItem(ne));let n=e=>this.workspace.set(e.detail??null);window.addEventListener("daimon:workspace",n),this.destroyRef.onDestroy(()=>window.removeEventListener("daimon:workspace",n)),D(()=>{this.appsKey()&&this.fetchAll()}),D(()=>{let e=this.api.events(),i=e.slice(this.lastEventCount);this.lastEventCount=e.length,i.some(a=>a.type==="error-new"||a.type==="error-recur"||a.type==="status")&&this.fetchAll()})}async ngOnInit(){this.api.apps().length===0&&!this.api.ready()?await this.api.refresh():await this.fetchAll()}ngOnDestroy(){}onStorage(n){n.key===ne&&this.workspace.set(n.newValue)}refresh(){this.fetchAll()}onQuery(n){this.query.set(n)}setSeverity(n){this.severity.set(n)}setGroupBy(n){this.groupBy.set(n)}codeHint(n){return Ye[n]??""}shortPath(n){if(!n)return"\u2014";let e=n.split(/[\\/]/);return e.length<=3?n:"\u2026/"+e.slice(-2).join("/")}editorUrl(n){if(!n.file)return"#";let e=n.line??1,i=n.col??1;return`vscode://file/${n.file}:${e}:${i}`}openEditor(n,e){if(!e.file){n.preventDefault();return}n.preventDefault(),window.open(this.editorUrl(e),"_self")}async fetchAll(){if(!this.busy){this.busy=!0,this.loading.set(!0);try{let n=this.api.apps(),e=await Promise.all(n.map(async a=>[a.name,await this.api.appErrors(a.name)])),i=new Map;for(let[a,_]of e)i.set(a,_);this.raw.set(i)}finally{this.busy=!1,this.loading.set(!1)}}}static \u0275fac=function(e){return new(e||t)};static \u0275cmp=N({type:t,selectors:[["dm-errors-panel"]],hostBindings:function(e,i){e&1&&f("storage",function(_){return i.onStorage(_)},R)},decls:31,vars:7,consts:[[1,"dm-page"],[1,"dm-page-header"],[1,"dm-page-sub"],["width","14rem","height",".875rem"],[1,"dm-header-actions"],["type","button","matTooltip","Refresh","aria-label","Refresh",1,"ib",3,"click","disabled"],[1,"material-symbols-outlined"],[1,"dm-filterbar"],[1,"dm-search"],[1,"material-symbols-outlined","dm-search-icon"],["type","search","placeholder","Filter by file, code, or message\u2026","aria-label","Filter errors",3,"input","value"],["type","button","aria-label","Clear",1,"dm-search-clear"],["role","tablist","aria-label","Severity filter",1,"dm-chips"],["type","button","role","tab",1,"dm-chip",3,"active"],["role","tablist","aria-label","Group by",1,"dm-chips"],[1,"dm-chips-label"],[1,"dm-cards"],["icon","error","title","No apps to scan","hint","Discover some apps first"],["icon","check_circle","hint","The last build was clean. Keep going.",3,"title"],["icon","filter_alt_off","title","No matches","hint","Try clearing the search or severity filter"],["type","button","aria-label","Clear",1,"dm-search-clear",3,"click"],["type","button","role","tab",1,"dm-chip",3,"click"],[1,"dm-card-sk"],[1,"dm-sk-accent"],[1,"dm-sk-body"],["width","40%","height","1.125rem"],["width","70%","height",".875rem"],["width","55%","height",".875rem"],[1,"dm-empty-actions"],["routerLink","/",1,"dm-link-btn"],[1,"dm-hint"],["type","button",1,"dm-link",3,"click"],["expanded","",1,"dm-panel"],[1,"ac"],[1,"ttl"],[3,"status","health"],[1,"eb"],[1,"lnk",3,"click","routerLink"],[1,"rows"],[1,"row"],[1,"loc",3,"href","matTooltip"],[1,"loc","dim"],[1,"code"],[1,"msg",3,"matTooltip"],[1,"cnt"],[1,"loc",3,"click","href","matTooltip"],[1,"dim"],[1,"loc",3,"click","routerLink"],[1,"dim","ln",3,"href"],[1,"dim","ln",3,"click","href"],[1,"hint"],[1,"tool-chip"]],template:function(e,i){e&1&&(r(0,"div",0)(1,"header",1)(2,"div")(3,"h1"),s(4,"Errors"),l(),r(5,"div",2),p(6,oe,1,0,"dm-skeleton",3)(7,ae,2,5),l()(),r(8,"div",4)(9,"button",5),f("click",function(){return i.refresh()}),r(10,"span",6),s(11,"refresh"),l()()()(),r(12,"div",7)(13,"div",8)(14,"span",9),s(15,"search"),l(),r(16,"input",10),f("input",function(_){return i.onQuery(_.target.value)}),l(),p(17,le,3,0,"button",11),l(),r(18,"div",12),v(19,se,2,4,"button",13,w),l(),r(21,"div",14)(22,"span",15),s(23,"Group by"),l(),v(24,ce,2,4,"button",13,w),l()(),p(26,de,3,0,"div",16)(27,me,6,0,"dm-empty",17)(28,_e,1,1,"dm-empty",18)(29,ue,1,0,"dm-empty",19)(30,Qe,6,2),l()),e&2&&(o(6),d(i.loading()?6:7),o(3),u("disabled",i.loading()),o(),T("spin",i.loading()),o(6),u("value",i.query()),o(),d(i.query()?17:-1),o(2),h(i.severityFilters),o(5),h(i.groupOptions),o(2),d(i.loading()&&!i.raw().size?26:i.api.apps().length===0?27:i.totalErrors()===0?28:i.filteredFlat().length===0?29:30))},dependencies:[z,te,J,X,ee,Z,j,U,G,H,W,K,Q],styles:["[_nghost-%COMP%]{display:block}.dm-page[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:1rem}.dm-page-header[_ngcontent-%COMP%]{display:flex;align-items:flex-end;justify-content:space-between;gap:1rem}.dm-page-header[_ngcontent-%COMP%] h1[_ngcontent-%COMP%]{margin:0;font:400 1.5rem/2rem Roboto}.dm-page-sub[_ngcontent-%COMP%]{font:400 .8125rem/1.25rem Roboto;color:var(--mat-sys-on-surface-variant);margin-top:.25rem;display:flex;gap:.25rem;flex-wrap:wrap;align-items:center}.dm-header-actions[_ngcontent-%COMP%]{display:flex;gap:.5rem}.ib[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;background:transparent;border:1px solid var(--mat-sys-outline-variant);border-radius:10px;color:var(--mat-sys-on-surface-variant);cursor:pointer}.ib[_ngcontent-%COMP%]:hover:not(:disabled){background:var(--mat-sys-surface-container-high);color:var(--mat-sys-on-surface)}.ib[_ngcontent-%COMP%]:disabled{opacity:.55;cursor:not-allowed}.ib[_ngcontent-%COMP%] .material-symbols-outlined[_ngcontent-%COMP%]{font-size:20px}.spin[_ngcontent-%COMP%]{animation:_ngcontent-%COMP%_dm-spin 1s linear infinite}@keyframes _ngcontent-%COMP%_dm-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.spin[_ngcontent-%COMP%]{animation:none}}.dm-filterbar[_ngcontent-%COMP%]{position:sticky;top:0;z-index:2;display:flex;align-items:center;gap:.75rem;flex-wrap:wrap;padding:.5rem;background:var(--mat-sys-surface);border:1px solid var(--mat-sys-outline-variant);border-radius:12px}.dm-search[_ngcontent-%COMP%]{position:relative;flex:1;min-width:220px;display:inline-flex;align-items:center;background:var(--mat-sys-surface-container);border:1px solid var(--mat-sys-outline-variant);border-radius:10px}.dm-search[_ngcontent-%COMP%]:focus-within{border-color:var(--mat-sys-primary)}.dm-search[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{flex:1;border:0;outline:0;background:transparent;padding:8px 36px;font:400 .875rem/1.25rem Roboto;color:var(--mat-sys-on-surface)}.dm-search[_ngcontent-%COMP%] input[_ngcontent-%COMP%]::placeholder{color:var(--mat-sys-on-surface-variant)}.dm-search-icon[_ngcontent-%COMP%]{position:absolute;left:10px;pointer-events:none;font-size:18px;color:var(--mat-sys-on-surface-variant)}.dm-search-clear[_ngcontent-%COMP%]{position:absolute;right:6px;background:transparent;border:0;cursor:pointer;color:var(--mat-sys-on-surface-variant);width:24px;height:24px;border-radius:999px;display:inline-flex;align-items:center;justify-content:center}.dm-search-clear[_ngcontent-%COMP%]:hover{background:var(--mat-sys-surface-container-high)}.dm-search-clear[_ngcontent-%COMP%] .material-symbols-outlined[_ngcontent-%COMP%]{font-size:16px}.dm-chips[_ngcontent-%COMP%]{display:inline-flex;align-items:center;padding:2px;border-radius:10px;background:var(--mat-sys-surface-container);border:1px solid var(--mat-sys-outline-variant);gap:2px}.dm-chips-label[_ngcontent-%COMP%]{font:500 .6875rem/1rem Roboto;text-transform:uppercase;letter-spacing:.04rem;color:var(--mat-sys-on-surface-variant);padding:0 .5rem 0 .25rem}.dm-chip[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:.375rem;padding:5px 10px;border-radius:8px;background:transparent;border:0;color:var(--mat-sys-on-surface-variant);cursor:pointer;font:500 .8125rem/1rem Roboto}.dm-chip[_ngcontent-%COMP%]:hover{color:var(--mat-sys-on-surface)}.dm-chip.active[_ngcontent-%COMP%]{background:var(--mat-sys-surface);color:var(--mat-sys-primary);box-shadow:var(--mat-sys-level1)}.dm-cards[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:.75rem}.dm-hint[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;border-radius:10px;background:color-mix(in oklch,var(--mat-sys-tertiary) 10%,transparent);border:1px solid color-mix(in oklch,var(--mat-sys-tertiary) 24%,transparent);color:var(--mat-sys-on-surface);font:400 .8125rem/1.25rem Roboto}.dm-hint[_ngcontent-%COMP%] .material-symbols-outlined[_ngcontent-%COMP%]{font-size:18px;color:var(--mat-sys-tertiary)}.dm-hint[_ngcontent-%COMP%] .dm-link[_ngcontent-%COMP%]{background:transparent;border:0;padding:0;color:var(--mat-sys-primary);cursor:pointer;font:500 .8125rem/1.25rem Roboto;text-decoration:underline}.dm-panel[_ngcontent-%COMP%]{background:var(--mat-sys-surface-container-low)!important;border:1px solid var(--mat-sys-outline-variant);border-radius:14px!important;overflow:hidden;box-shadow:none!important}.dm-panel.mat-expanded[_ngcontent-%COMP%]{box-shadow:var(--mat-sys-level1)!important} .dm-panel .mat-expansion-panel-header{padding:0 1rem;height:56px;background:var(--mat-sys-surface-container-low)} .dm-panel .mat-expansion-panel-header:hover{background:var(--mat-sys-surface-container)!important} .dm-panel .mat-expansion-panel-body{padding:0 1rem 1rem} .dm-panel .mat-expansion-panel-content{background:var(--mat-sys-surface-container-low)}.ac[_ngcontent-%COMP%]{width:4px;height:24px;border-radius:2px;margin-right:.5rem}.ttl[_ngcontent-%COMP%]{font:500 .9375rem/1.25rem Roboto;display:inline-flex;align-items:center;gap:.5rem}.hint[_ngcontent-%COMP%]{font:400 .75rem/1rem Roboto;color:var(--mat-sys-on-surface-variant);margin-left:.5rem}mat-panel-title[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;flex:1;min-width:0}mat-panel-description[_ngcontent-%COMP%]{justify-content:flex-end;color:var(--mat-sys-on-surface-variant)}.eb[_ngcontent-%COMP%]{display:inline-flex;align-items:center;padding:1px 8px;border-radius:999px;font:600 .75rem/1rem Roboto;background:color-mix(in oklch,var(--mat-sys-error) 14%,transparent);color:var(--mat-sys-error);border:1px solid color-mix(in oklch,var(--mat-sys-error) 30%,transparent);margin-left:.25rem}.lnk[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:.125rem;color:var(--mat-sys-primary);text-decoration:none;font:500 .8125rem/1.25rem Roboto}.lnk[_ngcontent-%COMP%]:hover{text-decoration:underline}.lnk[_ngcontent-%COMP%] .material-symbols-outlined[_ngcontent-%COMP%]{font-size:16px}.rows[_ngcontent-%COMP%]{display:flex;flex-direction:column}.row[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(0,1.4fr) auto minmax(0,2fr) auto;align-items:center;gap:.75rem;padding:.5rem .25rem;border-bottom:1px solid var(--mat-sys-outline-variant)}.rows-nofile[_ngcontent-%COMP%] .row[_ngcontent-%COMP%]{grid-template-columns:auto minmax(0,1fr) auto}.row[_ngcontent-%COMP%]:last-child{border-bottom:0}.row[_ngcontent-%COMP%]:hover{background:var(--mat-sys-surface-container)}.loc[_ngcontent-%COMP%]{color:var(--mat-sys-primary);text-decoration:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.loc[_ngcontent-%COMP%]:hover{text-decoration:underline}.dim[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant)}.ln[_ngcontent-%COMP%]{justify-self:end}.code[_ngcontent-%COMP%]{display:inline-flex;align-items:center;padding:1px 8px;border-radius:6px;background:color-mix(in oklch,var(--mat-sys-tertiary) 14%,transparent);color:var(--mat-sys-tertiary);border:1px solid color-mix(in oklch,var(--mat-sys-tertiary) 28%,transparent);font-weight:500}.tool-chip[_ngcontent-%COMP%]{display:inline-flex;align-items:center;padding:2px 10px;border-radius:6px;background:var(--mat-sys-surface-container-high);color:var(--mat-sys-on-surface);border:1px solid var(--mat-sys-outline-variant);font:600 .8125rem/1.125rem Roboto;text-transform:lowercase;letter-spacing:.02rem}.tool-chip[data-tool=esbuild][_ngcontent-%COMP%], .tool-chip[data-tool=vite][_ngcontent-%COMP%]{color:var(--mat-sys-primary);border-color:color-mix(in oklch,var(--mat-sys-primary) 36%,transparent)}.tool-chip[data-tool=jest][_ngcontent-%COMP%], .tool-chip[data-tool=nx][_ngcontent-%COMP%]{color:var(--mat-sys-secondary);border-color:color-mix(in oklch,var(--mat-sys-secondary) 36%,transparent)}.tool-chip[data-tool=storybook][_ngcontent-%COMP%], .tool-chip[data-tool=webpack][_ngcontent-%COMP%]{color:var(--mat-sys-tertiary);border-color:color-mix(in oklch,var(--mat-sys-tertiary) 36%,transparent)}.tool-chip[data-tool=node][_ngcontent-%COMP%], .tool-chip[data-tool=typescript][_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant)}.msg[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface);font-size:.875rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.cnt[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);font:500 .75rem/1rem Roboto;justify-self:end}.dm-card-sk[_ngcontent-%COMP%]{background:var(--mat-sys-surface-container-low);border:1px solid var(--mat-sys-outline-variant);border-radius:14px;overflow:hidden}.dm-sk-accent[_ngcontent-%COMP%]{height:4px;background:var(--mat-sys-surface-container)}.dm-sk-body[_ngcontent-%COMP%]{padding:1rem;display:flex;flex-direction:column;gap:.5rem}.dm-empty-actions[_ngcontent-%COMP%]{margin-top:.75rem}.dm-link-btn[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:.375rem;padding:6px 14px;border-radius:10px;background:var(--mat-sys-primary);color:var(--mat-sys-on-primary);text-decoration:none;font:500 .875rem/1.25rem Roboto}.dm-link-btn[_ngcontent-%COMP%] .material-symbols-outlined[_ngcontent-%COMP%]{font-size:18px}@media(max-width:760px){.row[_ngcontent-%COMP%]{grid-template-columns:1fr;gap:.25rem}.ln[_ngcontent-%COMP%], .cnt[_ngcontent-%COMP%]{justify-self:start}}"],changeDetection:0})};export{ie as ErrorsPanelComponent};
@@ -11,5 +11,5 @@
11
11
  <style>html{color-scheme:light dark}html{--mat-sys-background:light-dark(#faf9fd, #121316);--mat-sys-error:light-dark(#ba1a1a, #ffb4ab);--mat-sys-error-container:light-dark(#ffdad6, #93000a);--mat-sys-inverse-on-surface:light-dark(#f2f0f4, #2f3033);--mat-sys-inverse-primary:light-dark(#abc7ff, #005cbb);--mat-sys-inverse-surface:light-dark(#2f3033, #e3e2e6);--mat-sys-on-background:light-dark(#1a1b1f, #e3e2e6);--mat-sys-on-error:light-dark(#ffffff, #690005);--mat-sys-on-error-container:light-dark(#93000a, #ffdad6);--mat-sys-on-primary:light-dark(#ffffff, #002f65);--mat-sys-on-primary-container:light-dark(#00458f, #d7e3ff);--mat-sys-on-primary-fixed:light-dark(#001b3f, #001b3f);--mat-sys-on-primary-fixed-variant:light-dark(#00458f, #00458f);--mat-sys-on-secondary:light-dark(#ffffff, #283041);--mat-sys-on-secondary-container:light-dark(#3e4759, #dae2f9);--mat-sys-on-secondary-fixed:light-dark(#131c2b, #131c2b);--mat-sys-on-secondary-fixed-variant:light-dark(#3e4759, #3e4759);--mat-sys-on-surface:light-dark(#1a1b1f, #e3e2e6);--mat-sys-on-surface-variant:light-dark(#44474e, #e0e2ec);--mat-sys-on-tertiary:light-dark(#ffffff, #0001ac);--mat-sys-on-tertiary-container:light-dark(#0000ef, #e0e0ff);--mat-sys-on-tertiary-fixed:light-dark(#00006e, #00006e);--mat-sys-on-tertiary-fixed-variant:light-dark(#0000ef, #0000ef);--mat-sys-outline:light-dark(#74777f, #8e9099);--mat-sys-outline-variant:light-dark(#c4c6d0, #44474e);--mat-sys-primary:light-dark(#005cbb, #abc7ff);--mat-sys-primary-container:light-dark(#d7e3ff, #00458f);--mat-sys-primary-fixed:light-dark(#d7e3ff, #d7e3ff);--mat-sys-primary-fixed-dim:light-dark(#abc7ff, #abc7ff);--mat-sys-scrim:light-dark(#000000, #000000);--mat-sys-secondary:light-dark(#565e71, #bec6dc);--mat-sys-secondary-container:light-dark(#dae2f9, #3e4759);--mat-sys-secondary-fixed:light-dark(#dae2f9, #dae2f9);--mat-sys-secondary-fixed-dim:light-dark(#bec6dc, #bec6dc);--mat-sys-shadow:light-dark(#000000, #000000);--mat-sys-surface:light-dark(#faf9fd, #121316);--mat-sys-surface-bright:light-dark(#faf9fd, #38393c);--mat-sys-surface-container:light-dark(#efedf0, #1f2022);--mat-sys-surface-container-high:light-dark(#e9e7eb, #292a2c);--mat-sys-surface-container-highest:light-dark(#e3e2e6, #343537);--mat-sys-surface-container-low:light-dark(#f4f3f6, #1a1b1f);--mat-sys-surface-container-lowest:light-dark(#ffffff, #0d0e11);--mat-sys-surface-dim:light-dark(#dbd9dd, #121316);--mat-sys-surface-tint:light-dark(#005cbb, #abc7ff);--mat-sys-surface-variant:light-dark(#e0e2ec, #44474e);--mat-sys-tertiary:light-dark(#343dff, #bec2ff);--mat-sys-tertiary-container:light-dark(#e0e0ff, #0000ef);--mat-sys-tertiary-fixed:light-dark(#e0e0ff, #e0e0ff);--mat-sys-tertiary-fixed-dim:light-dark(#bec2ff, #bec2ff);--mat-sys-neutral-variant20:#2d3038;--mat-sys-neutral10:#1a1b1f;--mat-sys-level0:0px 0px 0px 0px rgba(0, 0, 0, .2), 0px 0px 0px 0px rgba(0, 0, 0, .14), 0px 0px 0px 0px rgba(0, 0, 0, .12);--mat-sys-level1:0px 2px 1px -1px rgba(0, 0, 0, .2), 0px 1px 1px 0px rgba(0, 0, 0, .14), 0px 1px 3px 0px rgba(0, 0, 0, .12);--mat-sys-level2:0px 3px 3px -2px rgba(0, 0, 0, .2), 0px 3px 4px 0px rgba(0, 0, 0, .14), 0px 1px 8px 0px rgba(0, 0, 0, .12);--mat-sys-level3:0px 3px 5px -1px rgba(0, 0, 0, .2), 0px 6px 10px 0px rgba(0, 0, 0, .14), 0px 1px 18px 0px rgba(0, 0, 0, .12);--mat-sys-level4:0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12);--mat-sys-level5:0px 7px 8px -4px rgba(0, 0, 0, .2), 0px 12px 17px 2px rgba(0, 0, 0, .14), 0px 5px 22px 4px rgba(0, 0, 0, .12);--mat-sys-body-large:400 1rem / 1.5rem Roboto;--mat-sys-body-large-font:Roboto;--mat-sys-body-large-line-height:1.5rem;--mat-sys-body-large-size:1rem;--mat-sys-body-large-tracking:.031rem;--mat-sys-body-large-weight:400;--mat-sys-body-medium:400 .875rem / 1.25rem Roboto;--mat-sys-body-medium-font:Roboto;--mat-sys-body-medium-line-height:1.25rem;--mat-sys-body-medium-size:.875rem;--mat-sys-body-medium-tracking:.016rem;--mat-sys-body-medium-weight:400;--mat-sys-body-small:400 .75rem / 1rem Roboto;--mat-sys-body-small-font:Roboto;--mat-sys-body-small-line-height:1rem;--mat-sys-body-small-size:.75rem;--mat-sys-body-small-tracking:.025rem;--mat-sys-body-small-weight:400;--mat-sys-display-large:400 3.562rem / 4rem Roboto;--mat-sys-display-large-font:Roboto;--mat-sys-display-large-line-height:4rem;--mat-sys-display-large-size:3.562rem;--mat-sys-display-large-tracking:-.016rem;--mat-sys-display-large-weight:400;--mat-sys-display-medium:400 2.812rem / 3.25rem Roboto;--mat-sys-display-medium-font:Roboto;--mat-sys-display-medium-line-height:3.25rem;--mat-sys-display-medium-size:2.812rem;--mat-sys-display-medium-tracking:0;--mat-sys-display-medium-weight:400;--mat-sys-display-small:400 2.25rem / 2.75rem Roboto;--mat-sys-display-small-font:Roboto;--mat-sys-display-small-line-height:2.75rem;--mat-sys-display-small-size:2.25rem;--mat-sys-display-small-tracking:0;--mat-sys-display-small-weight:400;--mat-sys-headline-large:400 2rem / 2.5rem Roboto;--mat-sys-headline-large-font:Roboto;--mat-sys-headline-large-line-height:2.5rem;--mat-sys-headline-large-size:2rem;--mat-sys-headline-large-tracking:0;--mat-sys-headline-large-weight:400;--mat-sys-headline-medium:400 1.75rem / 2.25rem Roboto;--mat-sys-headline-medium-font:Roboto;--mat-sys-headline-medium-line-height:2.25rem;--mat-sys-headline-medium-size:1.75rem;--mat-sys-headline-medium-tracking:0;--mat-sys-headline-medium-weight:400;--mat-sys-headline-small:400 1.5rem / 2rem Roboto;--mat-sys-headline-small-font:Roboto;--mat-sys-headline-small-line-height:2rem;--mat-sys-headline-small-size:1.5rem;--mat-sys-headline-small-tracking:0;--mat-sys-headline-small-weight:400;--mat-sys-label-large:500 .875rem / 1.25rem Roboto;--mat-sys-label-large-font:Roboto;--mat-sys-label-large-line-height:1.25rem;--mat-sys-label-large-size:.875rem;--mat-sys-label-large-tracking:.006rem;--mat-sys-label-large-weight:500;--mat-sys-label-large-weight-prominent:700;--mat-sys-label-medium:500 .75rem / 1rem Roboto;--mat-sys-label-medium-font:Roboto;--mat-sys-label-medium-line-height:1rem;--mat-sys-label-medium-size:.75rem;--mat-sys-label-medium-tracking:.031rem;--mat-sys-label-medium-weight:500;--mat-sys-label-medium-weight-prominent:700;--mat-sys-label-small:500 .688rem / 1rem Roboto;--mat-sys-label-small-font:Roboto;--mat-sys-label-small-line-height:1rem;--mat-sys-label-small-size:.688rem;--mat-sys-label-small-tracking:.031rem;--mat-sys-label-small-weight:500;--mat-sys-title-large:400 1.375rem / 1.75rem Roboto;--mat-sys-title-large-font:Roboto;--mat-sys-title-large-line-height:1.75rem;--mat-sys-title-large-size:1.375rem;--mat-sys-title-large-tracking:0;--mat-sys-title-large-weight:400;--mat-sys-title-medium:500 1rem / 1.5rem Roboto;--mat-sys-title-medium-font:Roboto;--mat-sys-title-medium-line-height:1.5rem;--mat-sys-title-medium-size:1rem;--mat-sys-title-medium-tracking:.009rem;--mat-sys-title-medium-weight:500;--mat-sys-title-small:500 .875rem / 1.25rem Roboto;--mat-sys-title-small-font:Roboto;--mat-sys-title-small-line-height:1.25rem;--mat-sys-title-small-size:.875rem;--mat-sys-title-small-tracking:.006rem;--mat-sys-title-small-weight:500;--mat-checkbox-touch-target-display:none;--mat-checkbox-state-layer-size:32px;--mat-chip-container-height:24px;--mat-expansion-header-collapsed-state-height:40px;--mat-expansion-header-expanded-state-height:56px;--mat-fab-small-touch-target-display: ;--mat-fab-touch-target-display:none;--mat-button-filled-touch-target-display:none;--mat-button-filled-container-height:32px;--mat-button-outlined-container-height:32px;--mat-button-outlined-touch-target-display:none;--mat-button-protected-touch-target-display:none;--mat-button-protected-container-height:32px;--mat-button-text-touch-target-display:none;--mat-button-text-container-height:32px;--mat-button-tonal-container-height:32px;--mat-button-tonal-touch-target-display:none;--mat-form-field-container-height:48px;--mat-form-field-filled-label-display:none;--mat-form-field-container-vertical-padding:12px;--mat-form-field-filled-with-label-container-padding-top:12px;--mat-form-field-filled-with-label-container-padding-bottom:12px;--mat-icon-button-touch-target-display:none;--mat-icon-button-state-layer-size:32px;--mat-list-list-item-leading-icon-start-space:8px;--mat-list-list-item-leading-icon-end-space:8px;--mat-list-list-item-one-line-container-height:40px;--mat-list-list-item-two-line-container-height:56px;--mat-list-list-item-three-line-container-height:80px;--mat-paginator-container-size:48px;--mat-paginator-form-field-container-height:40px;--mat-paginator-form-field-container-vertical-padding:8px;--mat-paginator-touch-target-display:none;--mat-radio-touch-target-display:none;--mat-radio-state-layer-size:32px;--mat-tab-container-height:40px;--mat-select-arrow-transform:none;--mat-button-toggle-height:40px;--mat-stepper-header-height:64px;--mat-table-header-container-height:48px;--mat-table-footer-container-height:44px;--mat-table-row-item-container-height:44px;--mat-toolbar-standard-height:56px;--mat-toolbar-mobile-height:48px;--mat-tree-node-min-height:40px;--mat-sys-corner-extra-large:28px;--mat-sys-corner-extra-large-top:28px 28px 0 0;--mat-sys-corner-extra-small:4px;--mat-sys-corner-extra-small-top:4px 4px 0 0;--mat-sys-corner-full:9999px;--mat-sys-corner-large:16px;--mat-sys-corner-large-end:0 16px 16px 0;--mat-sys-corner-large-start:16px 0 0 16px;--mat-sys-corner-large-top:16px 16px 0 0;--mat-sys-corner-medium:12px;--mat-sys-corner-none:0;--mat-sys-corner-small:8px;--mat-sys-dragged-state-layer-opacity:.16;--mat-sys-focus-state-layer-opacity:.12;--mat-sys-hover-state-layer-opacity:.08;--mat-sys-pressed-state-layer-opacity:.12}html,body{height:100%}body{margin:0;font-family:Roboto,system-ui,-apple-system,sans-serif;background:var(--mat-sys-surface);color:var(--mat-sys-on-surface)}:root{--dm-motion-easing:cubic-bezier(.2, 0, 0, 1);--dm-motion-easing-emphasized:cubic-bezier(.05, .7, .1, 1);--dm-motion-short:.2s;--dm-motion-medium:.3s;--dm-mono:"Roboto Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}}</style><link rel="stylesheet" href="styles-SIPYJLMG.css" media="print" onload="this.media='all'"><noscript><link rel="stylesheet" href="styles-SIPYJLMG.css"></noscript></head>
12
12
  <body class="mat-typography">
13
13
  <dm-root>Loading daimon...</dm-root>
14
- <link rel="modulepreload" href="chunk-K7S4ITPJ.js"><link rel="modulepreload" href="chunk-YNQPX5G6.js"><link rel="modulepreload" href="chunk-7C772RJ3.js"><link rel="modulepreload" href="chunk-6WZJCF24.js"><link rel="modulepreload" href="chunk-KLH6B22T.js"><link rel="modulepreload" href="chunk-EIWOTZT3.js"><link rel="modulepreload" href="chunk-LBL7Z5BE.js"><link rel="modulepreload" href="chunk-Y6B6X4Y6.js"><link rel="modulepreload" href="chunk-K43KW4K2.js"><script src="main-4CQTBXSB.js" type="module"></script></body>
14
+ <link rel="modulepreload" href="chunk-K7S4ITPJ.js"><link rel="modulepreload" href="chunk-YNQPX5G6.js"><link rel="modulepreload" href="chunk-7C772RJ3.js"><link rel="modulepreload" href="chunk-6WZJCF24.js"><link rel="modulepreload" href="chunk-KLH6B22T.js"><link rel="modulepreload" href="chunk-EIWOTZT3.js"><link rel="modulepreload" href="chunk-LBL7Z5BE.js"><link rel="modulepreload" href="chunk-Y6B6X4Y6.js"><link rel="modulepreload" href="chunk-K43KW4K2.js"><script src="main-O76X7RMS.js" type="module"></script></body>
15
15
  </html>
@@ -0,0 +1 @@
1
+ import{a as ke,b as Se}from"./chunk-K7S4ITPJ.js";import"./chunk-YNQPX5G6.js";import"./chunk-7C772RJ3.js";import"./chunk-6WZJCF24.js";import"./chunk-KLH6B22T.js";import{a as he,b as fe,c as ve,d as ye,e as xe,f as be}from"./chunk-EIWOTZT3.js";import{a as pe,b as ce,d as ue,e as ge,g as Ee,h as _e,i as Ce,j as N}from"./chunk-LBL7Z5BE.js";import"./chunk-Y6B6X4Y6.js";import{$ as D,Ab as ae,Bb as se,Ca as I,Db as S,Eb as b,Fb as E,Hb as B,Ia as ee,Ib as M,Jb as w,Kb as T,Lb as d,Mb as l,Nb as _,Ob as r,Pb as s,Sb as C,Ub as g,Vb as P,Wb as u,Y as W,Za as R,_a as m,ca as Y,cb as te,ea as c,eb as ne,fa as q,gc as A,ha as X,hb as oe,ia as Z,ic as i,ja as v,jc as f,ka as y,kb as ie,na as G,oa as J,pb as x,sc as de,ta as h,ua as Q,vb as re,vc as le,xc as me}from"./chunk-K43KW4K2.js";var Ie="@",Re=(()=>{class n{doc;delegate;zone;animationType;moduleImpl;_rendererFactoryPromise=null;scheduler=null;injector=c(G);loadingSchedulerFn=c(Ae,{optional:!0});_engine;constructor(t,o,a,p,k){this.doc=t,this.delegate=o,this.zone=a,this.animationType=p,this.moduleImpl=k}ngOnDestroy(){this._engine?.flush()}loadImpl(){let t=()=>this.moduleImpl??import("./chunk-UC3XMN2Y.js").then(a=>a),o;return this.loadingSchedulerFn?o=this.loadingSchedulerFn(t):o=t(),o.catch(a=>{throw new W(5300,!1)}).then(({\u0275createEngine:a,\u0275AnimationRendererFactory:p})=>{this._engine=a(this.animationType,this.doc);let k=new p(this.delegate,this._engine,this.zone);return this.delegate=k,k})}createRenderer(t,o){let a=this.delegate.createRenderer(t,o);if(a.\u0275type===0)return a;typeof a.throwOnSyntheticProps=="boolean"&&(a.throwOnSyntheticProps=!1);let p=new z(a);return o?.data?.animation&&!this._rendererFactoryPromise&&(this._rendererFactoryPromise=this.loadImpl()),this._rendererFactoryPromise?.then(k=>{let De=k.createRenderer(t,o);p.use(De),this.scheduler??=this.injector.get(Q,null,{optional:!0}),this.scheduler?.notify(10)}).catch(k=>{p.use(a)}),p}begin(){this.delegate.begin?.()}end(){this.delegate.end?.()}whenRenderingDone(){return this.delegate.whenRenderingDone?.()??Promise.resolve()}componentReplaced(t){this._engine?.flush(),this.delegate.componentReplaced?.(t)}static \u0275fac=function(o){ie()};static \u0275prov=D({token:n,factory:n.\u0275fac})}return n})(),z=class{delegate;replay=[];\u0275type=1;constructor(e){this.delegate=e}use(e){if(this.delegate=e,this.replay!==null){for(let t of this.replay)t(e);this.replay=null}}get data(){return this.delegate.data}destroy(){this.replay=null,this.delegate.destroy()}createElement(e,t){return this.delegate.createElement(e,t)}createComment(e){return this.delegate.createComment(e)}createText(e){return this.delegate.createText(e)}get destroyNode(){return this.delegate.destroyNode}appendChild(e,t){this.delegate.appendChild(e,t)}insertBefore(e,t,o,a){this.delegate.insertBefore(e,t,o,a)}removeChild(e,t,o,a){this.delegate.removeChild(e,t,o,a)}selectRootElement(e,t){return this.delegate.selectRootElement(e,t)}parentNode(e){return this.delegate.parentNode(e)}nextSibling(e){return this.delegate.nextSibling(e)}setAttribute(e,t,o,a){this.delegate.setAttribute(e,t,o,a)}removeAttribute(e,t,o){this.delegate.removeAttribute(e,t,o)}addClass(e,t){this.delegate.addClass(e,t)}removeClass(e,t){this.delegate.removeClass(e,t)}setStyle(e,t,o,a){this.delegate.setStyle(e,t,o,a)}removeStyle(e,t,o){this.delegate.removeStyle(e,t,o)}setProperty(e,t,o){this.shouldReplay(t)&&this.replay.push(a=>a.setProperty(e,t,o)),this.delegate.setProperty(e,t,o)}setValue(e,t){this.delegate.setValue(e,t)}listen(e,t,o,a){return this.shouldReplay(t)&&this.replay.push(p=>p.listen(e,t,o,a)),this.delegate.listen(e,t,o,a)}shouldReplay(e){return this.replay!==null&&e.startsWith(Ie)}},Ae=new Y("");function Te(n="animations"){return te("NgAsyncAnimations"),q([{provide:oe,useFactory:(e,t,o)=>new Re(e,t,o,n),deps:[J,pe,ne]},{provide:ee,useValue:n==="noop"?"NoopAnimations":"BrowserAnimations"}])}var Ne=n=>({exact:n}),Fe=(n,e)=>e.path;function Le(n,e){n&1&&(d(0,"span"),i(1,"daimon"),l())}function Ke(n,e){if(n&1&&(d(0,"span",7),i(1),l()),n&2){let t=u().$implicit;m(),f(t.label)}}function je(n,e){if(n&1){let t=C();d(0,"a",6),g("click",function(a){v(t);let p=u();return y(p.dismissTooltip(a))}),d(1,"mat-icon",2),i(2),l(),b(3,Ke,2,1,"span",7),l()}if(n&2){let t=e.$implicit,o=u();T("routerLink",t.path)("routerLinkActiveOptions",de(7,Ne,t.path==="/"))("matTooltip",o.expanded()?t.shortcut:t.label+" \xB7 "+t.shortcut)("matTooltipShowDelay",300)("matTooltipHideDelay",0),m(2),f(t.icon),m(),E(o.expanded()?3:-1)}}var He=[{path:"/",icon:"apps",label:"Apps",shortcut:"g a"},{path:"/errors",icon:"error",label:"Errors",shortcut:"g e"},{path:"/logs",icon:"terminal",label:"Logs",shortcut:"g l"},{path:"/config",icon:"tune",label:"Settings",shortcut:"g s"},{path:"/doctor",icon:"medical_services",label:"Doctor",shortcut:"g d"},{path:"/events",icon:"timeline",label:"Events",shortcut:"g v"},{path:"/history",icon:"query_stats",label:"History",shortcut:"g h"},{path:"/trends",icon:"show_chart",label:"Trends",shortcut:"g t"},{path:"/tests",icon:"science",label:"Tests",shortcut:"g x"},{path:"/sessions",icon:"radio_button_checked",label:"Sessions",shortcut:"g n"}],Me="daimon.nav.expanded",F=class n{entries=He;expanded=h(!0);ngOnInit(){let e=localStorage.getItem(Me);e!==null&&this.expanded.set(e==="1")}toggle(){this.expanded.update(e=>!e),localStorage.setItem(Me,this.expanded()?"1":"0")}dismissTooltip(e){e.currentTarget?.blur()}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=x({type:n,selectors:[["dm-nav-rail"]],decls:11,vars:5,consts:[[1,"dm-rail"],[1,"dm-rail-toggle",3,"click"],["fontSet","material-symbols-outlined"],[1,"dm-rail-brand"],[1,"dm-rail-items"],["routerLinkActive","active","matTooltipPosition","right",1,"dm-rail-item",3,"routerLink","routerLinkActiveOptions","matTooltip","matTooltipShowDelay","matTooltipHideDelay"],["routerLinkActive","active","matTooltipPosition","right",1,"dm-rail-item",3,"click","routerLink","routerLinkActiveOptions","matTooltip","matTooltipShowDelay","matTooltipHideDelay"],[1,"dm-rail-label"]],template:function(t,o){t&1&&(d(0,"nav",0)(1,"button",1),g("click",function(){return o.toggle()}),d(2,"mat-icon",2),i(3),l()(),d(4,"div",3)(5,"mat-icon",2),i(6,"developer_board"),l(),b(7,Le,2,0,"span"),l(),d(8,"div",4),M(9,je,4,9,"a",5,Fe),l()()),t&2&&(A("expanded",o.expanded()),m(),S("aria-label",o.expanded()?"Collapse":"Expand"),m(2),f(o.expanded()?"menu_open":"menu"),m(4),E(o.expanded()?7:-1),m(2),w(o.entries))},dependencies:[ve,ye,Ce,_e,Se,ke],styles:["[_nghost-%COMP%]{display:contents}.dm-rail[_ngcontent-%COMP%]{grid-area:rail;display:flex;flex-direction:column;background:var(--mat-sys-surface-container);border-right:1px solid var(--mat-sys-outline-variant);width:64px;transition:width var(--dm-motion-medium) var(--dm-motion-easing-emphasized);overflow:hidden;-webkit-user-select:none;user-select:none}.dm-rail.expanded[_ngcontent-%COMP%]{width:240px}.dm-rail-toggle[_ngcontent-%COMP%]{border:none;background:transparent;color:var(--mat-sys-on-surface-variant);padding:12px;cursor:pointer;align-self:flex-end;display:flex;align-items:center;justify-content:center}.dm-rail-toggle[_ngcontent-%COMP%]:hover{color:var(--mat-sys-on-surface)}.dm-rail-brand[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;padding:0 16px 12px 20px;color:var(--mat-sys-primary);font:500 1rem/1.5rem Roboto;letter-spacing:.009rem}.dm-rail-items[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:2px;padding:8px}.dm-rail-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.75rem;padding:10px 12px;border-radius:12px;color:var(--mat-sys-on-surface-variant);text-decoration:none;font:500 .875rem/1.25rem Roboto;transition:background var(--dm-motion-short) var(--dm-motion-easing),color var(--dm-motion-short) var(--dm-motion-easing);white-space:nowrap}.dm-rail-item[_ngcontent-%COMP%]:hover{background:var(--mat-sys-surface-container-high);color:var(--mat-sys-on-surface)}.dm-rail-item.active[_ngcontent-%COMP%]{background:color-mix(in oklch,var(--mat-sys-primary) 14%,transparent);color:var(--mat-sys-primary)}.dm-rail-label[_ngcontent-%COMP%]{flex:1}"],changeDetection:0})};function Ve(n,e){if(n&1){let t=C();r(0,"div",2)(1,"button",3),P("click",function(){v(t);let a=u();return y(a.set("auto"))}),i(2,"Auto"),s(),r(3,"button",3),P("click",function(){v(t);let a=u();return y(a.set("light"))}),i(4,"Light"),s(),r(5,"button",3),P("click",function(){v(t);let a=u();return y(a.set("dark"))}),i(6,"Dark"),s()()}}var we="daimon.theme",K=class n{theme=h("auto");host=c(I);open=h(!1);icon=()=>this.theme()==="dark"?"dark_mode":this.theme()==="light"?"light_mode":"contrast";ngOnInit(){let e=localStorage.getItem(we)||"auto";this.set(e,!1)}set(e,t=!0){this.theme.set(e),localStorage.setItem(we,e);let o=document.documentElement;e==="auto"?o.style.removeProperty("color-scheme"):o.style.setProperty("color-scheme",e),t&&this.open.set(!1)}onDocClick(e){this.open()&&(this.host.nativeElement.contains(e.target)||this.open.set(!1))}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=x({type:n,selectors:[["dm-theme-toggle"]],hostBindings:function(t,o){t&1&&g("click",function(p){return o.onDocClick(p)},R)},decls:4,vars:3,consts:[["type","button","aria-label","Theme","aria-haspopup","true",1,"tt-btn",3,"click"],[1,"material-symbols-outlined"],["role","menu",1,"tt-pop"],["type","button","role","menuitem",3,"click"]],template:function(t,o){t&1&&(r(0,"button",0),P("click",function(){return o.open.set(!o.open())}),r(1,"span",1),i(2),s()(),b(3,Ve,7,0,"div",2)),t&2&&(S("aria-expanded",o.open()),m(2),f(o.icon()),m(),E(o.open()?3:-1))},styles:["[_nghost-%COMP%]{position:relative;display:inline-block}.tt-btn[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center;width:40px;height:40px;border:0;background:transparent;border-radius:999px;color:var(--mat-sys-on-surface-variant);cursor:pointer}.tt-btn[_ngcontent-%COMP%]:hover{background:var(--mat-sys-surface-container-high);color:var(--mat-sys-on-surface)}.tt-btn[_ngcontent-%COMP%] .material-symbols-outlined[_ngcontent-%COMP%]{font-size:20px}.tt-pop[_ngcontent-%COMP%]{position:absolute;right:0;top:calc(100% + 4px);min-width:140px;background:var(--mat-sys-surface-container-high);border:1px solid var(--mat-sys-outline-variant);border-radius:10px;padding:4px;box-shadow:var(--mat-sys-level2);z-index:50;display:flex;flex-direction:column;gap:1px}.tt-pop[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{display:flex;align-items:center;padding:8px 12px;background:transparent;border:0;border-radius:6px;text-align:left;color:var(--mat-sys-on-surface);font:500 .8125rem/1.25rem Roboto;cursor:pointer}.tt-pop[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:hover{background:var(--mat-sys-surface-container-highest)}"],changeDetection:0})};function Be(n,e){if(n&1){let t=C();d(0,"button",13),g("click",function(){let a=v(t).$implicit,p=u(2);return y(p.setWorkspace(a))}),i(1),l()}if(n&2){let t=e.$implicit;m(),f(t)}}function ze(n,e){if(n&1){let t=C();d(0,"div",5)(1,"button",13),g("click",function(){v(t);let a=u();return y(a.setWorkspace(null))}),i(2,"All workspaces"),l(),M(3,Be,2,1,"button",14,B),l()}if(n&2){let t=u();m(3),w(t.api.workspaces())}}function $e(n,e){n&1&&(d(0,"div",15),i(1,"No profiles configured"),l())}function Ue(n,e){if(n&1){let t=C();d(0,"div",16)(1,"span",17),i(2),l(),d(3,"button",18),g("click",function(){let a=v(t).$implicit,p=u(2);return y(p.runProfile(a))}),d(4,"span",3),i(5,"rocket_launch"),l()()()}if(n&2){let t=e.$implicit;m(2),f(t)}}function We(n,e){if(n&1&&(d(0,"div",5),b(1,$e,2,0,"div",15),M(2,Ue,6,1,"div",16,B),l()),n&2){let t=u();m(),E(t.profiles().length?-1:1),m(),w(t.profiles())}}var $="daimon.workspace",Pe="daimon.profile",j=class n{api=c(N);host=c(I);workspace=h(null);profile=h(null);profiles=h([]);openMenu=h(null);filteredCount=me(()=>{let e=this.workspace();return e?this.api.apps().filter(t=>t.workspaceLabel===e).length:this.api.apps().length});ngOnInit(){this.workspace.set(localStorage.getItem($)),this.profile.set(localStorage.getItem(Pe)),this.loadProfiles()}toggle(e){this.openMenu.update(t=>t===e?null:e)}onDocClick(e){if(!this.openMenu())return;let t=e.target;this.host.nativeElement.contains(t)||this.openMenu.set(null)}async loadProfiles(){try{let e=await fetch("/api/config");if(!e.ok)return;let t=await e.json(),o=t?.config?.profiles?Object.keys(t.config.profiles):[];this.profiles.set(o)}catch{}}setWorkspace(e){this.workspace.set(e),e?localStorage.setItem($,e):localStorage.removeItem($),window.dispatchEvent(new CustomEvent("daimon:workspace",{detail:e})),this.openMenu.set(null)}toast(e,t=3e3){let o=document.getElementById("dm-toast-host");o||(o=document.createElement("div"),o.id="dm-toast-host",o.style.cssText="position:fixed;left:50%;bottom:24px;transform:translateX(-50%);z-index:9999;display:flex;flex-direction:column;gap:8px;pointer-events:none",document.body.appendChild(o));let a=document.createElement("div");a.textContent=e,a.style.cssText="pointer-events:auto;padding:10px 16px;background:var(--mat-sys-inverse-surface,#322f35);color:var(--mat-sys-inverse-on-surface,#f5eff4);border-radius:8px;font:500 .8125rem/1.25rem Roboto;box-shadow:var(--mat-sys-level3,0 4px 12px rgba(0,0,0,.25))",o.appendChild(a),setTimeout(()=>{try{a.remove()}catch{}},t)}async runProfile(e){this.profile.set(e),localStorage.setItem(Pe,e),this.openMenu.set(null),this.toast(`Bringing up profile "${e}"\u2026`,2e3);try{let t=await this.api.ensureUp(e),o=Array.isArray(t?.apps)?`${t.apps.length} apps ready`:"done";this.toast(`Profile "${e}": ${o}`,3e3)}catch(t){this.toast(`Profile "${e}" failed: ${t?.message??"error"}`,5e3)}}onCmdK(){window.dispatchEvent(new CustomEvent("daimon:cmdk"))}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=x({type:n,selectors:[["dm-topbar"]],hostBindings:function(t,o){t&1&&g("click",function(p){return o.onDocClick(p)},R)},decls:32,vars:12,consts:[[1,"dm-topbar"],[1,"dm-popwrap"],["type","button","aria-haspopup","true",1,"dm-chip",3,"click","title"],[1,"material-symbols-outlined"],[1,"material-symbols-outlined","dm-chip-caret"],["role","menu",1,"dm-pop"],[1,"dm-topbar-spacer"],[1,"dm-conn",3,"title"],[1,"dm-conn-dot"],[1,"dm-conn-text"],["type","button","title","Command palette",1,"dm-cmdk",3,"click"],[2,"margin","0 .5rem"],[1,"dm-kbd"],["type","button","role","menuitem",3,"click"],["type","button","role","menuitem"],[1,"dm-pop-empty"],["role","menuitem",1,"dm-pop-row"],[1,"dm-pop-label"],["type","button","title","ensure-up",1,"dm-pop-go",3,"click"]],template:function(t,o){t&1&&(d(0,"header",0)(1,"div",1)(2,"button",2),g("click",function(){return o.toggle("ws")}),d(3,"span",3),i(4,"folder_open"),l(),d(5,"span"),i(6),l(),d(7,"span",4),i(8,"expand_more"),l()(),b(9,ze,5,0,"div",5),l(),d(10,"div",1)(11,"button",2),g("click",function(){return o.toggle("profile")}),d(12,"span",3),i(13,"play_circle"),l(),d(14,"span"),i(15),l(),d(16,"span",4),i(17,"expand_more"),l()(),b(18,We,4,1,"div",5),l(),_(19,"span",6),d(20,"span",7),_(21,"span",8),d(22,"span",9),i(23),l()(),d(24,"button",10),g("click",function(){return o.onCmdK()}),d(25,"span",3),i(26,"search"),l(),d(27,"span",11),i(28,"Jump to\u2026"),l(),d(29,"kbd",12),i(30,"\u2318K"),l()(),_(31,"dm-theme-toggle"),l()),t&2&&(m(2),T("title","Filter by workspace"),S("aria-expanded",o.openMenu()==="ws"),m(4),f(o.workspace()||"All workspaces"),m(3),E(o.openMenu()==="ws"?9:-1),m(2),T("title","Run profile: ensure-up"),S("aria-expanded",o.openMenu()==="profile"),m(4),f(o.profile()||"No profile"),m(3),E(o.openMenu()==="profile"?18:-1),m(2),A("up",o.api.connected()),T("title",o.api.connected()?"Live event stream connected":"Reconnecting\u2026"),m(3),f(o.api.connected()?"live":"offline"))},dependencies:[K],styles:["[_nghost-%COMP%]{display:contents}.dm-topbar[_ngcontent-%COMP%]{grid-area:topbar;display:flex;align-items:center;gap:.5rem;padding:10px 16px;background:var(--mat-sys-surface);border-bottom:1px solid var(--mat-sys-outline-variant);min-height:56px}.dm-topbar-spacer[_ngcontent-%COMP%]{flex:1}.dm-chip[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:.5rem;padding:6px 10px;border-radius:999px;background:var(--mat-sys-surface-container);border:1px solid var(--mat-sys-outline-variant);color:var(--mat-sys-on-surface);font:500 .8125rem/1.25rem Roboto;cursor:pointer;transition:background var(--dm-motion-short) var(--dm-motion-easing)}.dm-chip[_ngcontent-%COMP%]:hover{background:var(--mat-sys-surface-container-high)}.dm-chip[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px}.dm-chip-caret[_ngcontent-%COMP%]{opacity:.7}.dm-cmdk[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:.25rem;border-radius:12px!important}.dm-cmdk[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px}.dm-kbd[_ngcontent-%COMP%]{font-family:Roboto Mono,ui-monospace,monospace;font-size:.6875rem;padding:2px 6px;border-radius:4px;background:var(--mat-sys-surface-container);border:1px solid var(--mat-sys-outline-variant);color:var(--mat-sys-on-surface-variant)}.dm-conn[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:.375rem;padding:4px 10px;border-radius:999px;font:500 .75rem/1rem Roboto;color:var(--mat-sys-on-surface-variant);background:var(--mat-sys-surface-container)}.dm-conn-dot[_ngcontent-%COMP%]{width:8px;height:8px;border-radius:999px;background:var(--mat-sys-outline)}.dm-conn.up[_ngcontent-%COMP%] .dm-conn-dot[_ngcontent-%COMP%]{background:var(--mat-sys-primary);box-shadow:0 0 0 4px color-mix(in oklch,var(--mat-sys-primary) 25%,transparent)}.dm-conn.up[_ngcontent-%COMP%] .dm-conn-text[_ngcontent-%COMP%]{color:var(--mat-sys-primary)}.dm-popwrap[_ngcontent-%COMP%]{position:relative;display:inline-block}.dm-pop[_ngcontent-%COMP%]{position:absolute;left:0;top:calc(100% + 4px);min-width:200px;max-height:60vh;overflow-y:auto;background:var(--mat-sys-surface-container-high);border:1px solid var(--mat-sys-outline-variant);border-radius:10px;padding:4px;box-shadow:var(--mat-sys-level2);z-index:50;display:flex;flex-direction:column;gap:1px}.dm-pop[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{display:flex;align-items:center;padding:8px 12px;background:transparent;border:0;border-radius:6px;text-align:left;color:var(--mat-sys-on-surface);font:500 .8125rem/1.25rem Roboto;cursor:pointer}.dm-pop[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:hover{background:var(--mat-sys-surface-container-highest)}.dm-pop-empty[_ngcontent-%COMP%]{padding:.5rem 1rem;color:var(--mat-sys-on-surface-variant)}.dm-pop-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;padding:4px 8px}.dm-pop-label[_ngcontent-%COMP%]{flex:1;font:500 .8125rem/1.25rem Roboto;color:var(--mat-sys-on-surface)}.dm-pop-go[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;background:transparent;border:0;border-radius:999px;color:var(--mat-sys-primary);cursor:pointer}.dm-pop-go[_ngcontent-%COMP%]:hover{background:var(--mat-sys-surface-container-highest)}.dm-pop-go[_ngcontent-%COMP%] .material-symbols-outlined[_ngcontent-%COMP%]{font-size:18px}.dm-cmdk[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:.25rem;padding:8px 14px;border-radius:12px;background:transparent;border:1px solid var(--mat-sys-outline);color:var(--mat-sys-on-surface);cursor:pointer}.dm-cmdk[_ngcontent-%COMP%]:hover{background:var(--mat-sys-surface-container)}.dm-cmdk[_ngcontent-%COMP%] .material-symbols-outlined[_ngcontent-%COMP%]{font-size:18px}"],changeDetection:0})};var U=class n{static \u0275fac=function(t){return new(t||n)};static \u0275cmp=x({type:n,selectors:[["dm-shortcuts-help"]],decls:138,vars:0,consts:[["mat-dialog-title",""],["mat-dialog-content",""],[1,"dm-keys"]],template:function(t,o){t&1&&(r(0,"h2",0),i(1,"Keyboard shortcuts"),s(),r(2,"div",1)(3,"table",2)(4,"tr")(5,"td")(6,"kbd"),i(7,"\u2318K"),s(),i(8," / "),r(9,"kbd"),i(10,"Ctrl+K"),s()(),r(11,"td"),i(12,"Command palette"),s()(),r(13,"tr")(14,"td")(15,"kbd"),i(16,"?"),s()(),r(17,"td"),i(18,"This help"),s()(),r(19,"tr")(20,"td")(21,"kbd"),i(22,"/"),s()(),r(23,"td"),i(24,"Focus filter"),s()(),r(25,"tr")(26,"td")(27,"kbd"),i(28,"g"),s(),r(29,"kbd"),i(30,"a"),s()(),r(31,"td"),i(32,"Apps"),s()(),r(33,"tr")(34,"td")(35,"kbd"),i(36,"g"),s(),r(37,"kbd"),i(38,"e"),s()(),r(39,"td"),i(40,"Errors"),s()(),r(41,"tr")(42,"td")(43,"kbd"),i(44,"g"),s(),r(45,"kbd"),i(46,"l"),s()(),r(47,"td"),i(48,"Logs"),s()(),r(49,"tr")(50,"td")(51,"kbd"),i(52,"g"),s(),r(53,"kbd"),i(54,"s"),s()(),r(55,"td"),i(56,"Settings"),s()(),r(57,"tr")(58,"td")(59,"kbd"),i(60,"g"),s(),r(61,"kbd"),i(62,"d"),s()(),r(63,"td"),i(64,"Doctor"),s()(),r(65,"tr")(66,"td")(67,"kbd"),i(68,"g"),s(),r(69,"kbd"),i(70,"v"),s()(),r(71,"td"),i(72,"Events"),s()(),r(73,"tr")(74,"td")(75,"kbd"),i(76,"g"),s(),r(77,"kbd"),i(78,"h"),s()(),r(79,"td"),i(80,"History"),s()(),r(81,"tr")(82,"td")(83,"kbd"),i(84,"g"),s(),r(85,"kbd"),i(86,"t"),s()(),r(87,"td"),i(88,"Trends"),s()(),r(89,"tr")(90,"td")(91,"kbd"),i(92,"g"),s(),r(93,"kbd"),i(94,"x"),s()(),r(95,"td"),i(96,"Tests"),s()(),r(97,"tr")(98,"td")(99,"kbd"),i(100,"g"),s(),r(101,"kbd"),i(102,"n"),s()(),r(103,"td"),i(104,"Sessions"),s()(),r(105,"tr")(106,"td")(107,"kbd"),i(108,"j"),s(),i(109," / "),r(110,"kbd"),i(111,"k"),s()(),r(112,"td"),i(113,"Next / prev item"),s()(),r(114,"tr")(115,"td")(116,"kbd"),i(117,"s"),s()(),r(118,"td"),i(119,"Start focused app"),s()(),r(120,"tr")(121,"td")(122,"kbd"),i(123,"r"),s()(),r(124,"td"),i(125,"Restart focused app"),s()(),r(126,"tr")(127,"td")(128,"kbd"),i(129,"x"),s()(),r(130,"td"),i(131,"Stop focused app"),s()(),r(132,"tr")(133,"td")(134,"kbd"),i(135,"."),s()(),r(136,"td"),i(137,"Toggle list / cards"),s()()()())},styles:[".dm-keys[_ngcontent-%COMP%]{width:100%;border-collapse:collapse}.dm-keys[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{padding:.375rem .5rem;vertical-align:middle}.dm-keys[_ngcontent-%COMP%] td[_ngcontent-%COMP%]:first-child{width:9rem}kbd[_ngcontent-%COMP%]{font-family:Roboto Mono,ui-monospace,monospace;font-size:.75rem;padding:2px 6px;border-radius:4px;background:var(--mat-sys-surface-container);border:1px solid var(--mat-sys-outline-variant)}"],changeDetection:0})},H=class n{router=c(fe);envInjector=c(X);pending=null;pendingTimer;handler=e=>this.onKey(e);async openShortcutsDialog(){let{MatDialog:e}=await import("./chunk-2BXIFQGQ.js");Z(this.envInjector,()=>{c(e).open(U,{width:"420px"})})}install(){window.addEventListener("keydown",this.handler)}uninstall(){window.removeEventListener("keydown",this.handler)}onKey(e){let t=e.target;if(!(t&&(t.tagName==="INPUT"||t.tagName==="TEXTAREA"||t.isContentEditable))){if((e.metaKey||e.ctrlKey)&&e.key.toLowerCase()==="k"){e.preventDefault(),window.dispatchEvent(new CustomEvent("daimon:cmdk"));return}if(!(e.metaKey||e.ctrlKey||e.altKey)){if(this.pending==="g"){this.pending=null,this.pendingTimer&&clearTimeout(this.pendingTimer);let a={a:"/",e:"/errors",l:"/logs",s:"/config",d:"/doctor",v:"/events",h:"/history",t:"/trends",x:"/tests",n:"/sessions",r:"/errors",c:"/config"}[e.key.toLowerCase()];a&&(e.preventDefault(),this.router.navigateByUrl(a));return}if(e.key==="?"){e.preventDefault(),this.openShortcutsDialog();return}if(e.key==="/"){e.preventDefault(),window.dispatchEvent(new CustomEvent("daimon:focus-filter"));return}if(e.key==="g"){this.pending="g",this.pendingTimer=setTimeout(()=>this.pending=null,1200);return}if(e.key==="."){e.preventDefault(),window.dispatchEvent(new CustomEvent("daimon:toggle-density"));return}["j","k","s","r","x"].includes(e.key)&&window.dispatchEvent(new CustomEvent("daimon:key",{detail:e.key}))}}}static \u0275fac=function(t){return new(t||n)};static \u0275prov=D({token:n,factory:n.\u0275fac,providedIn:"root"})};var Ye=()=>[import("./chunk-VM2FOT77.js").then(n=>n.CommandPaletteComponent)];function qe(n,e){n&1&&_(0,"dm-command-palette")}var V=class n{api=c(N);keys=c(H);paletteActivated=h(!1);onCmdK=()=>{this.paletteActivated()||(this.paletteActivated.set(!0),setTimeout(()=>window.dispatchEvent(new CustomEvent("daimon:cmdk")),50))};ngOnInit(){this.api.start(),this.keys.install(),window.addEventListener("daimon:cmdk",this.onCmdK)}ngOnDestroy(){this.api.stop(),this.keys.uninstall(),window.removeEventListener("daimon:cmdk",this.onCmdK)}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=x({type:n,selectors:[["dm-root"]],decls:8,vars:1,consts:[[1,"dm-shell"],[1,"dm-main"]],template:function(t,o){t&1&&(d(0,"div",0),_(1,"dm-nav-rail")(2,"dm-topbar"),d(3,"main",1),_(4,"router-outlet"),l()(),re(5,qe,1,0),ae(6,5,Ye)),t&2&&(m(6),se(o.paletteActivated()))},dependencies:[he,F,j],styles:['[_nghost-%COMP%]{display:block;height:100vh}.dm-shell[_ngcontent-%COMP%]{display:grid;grid-template-columns:auto 1fr;grid-template-rows:auto 1fr;grid-template-areas:"rail topbar" "rail main";height:100vh;min-height:100vh}.dm-main[_ngcontent-%COMP%]{grid-area:main;overflow-y:auto;padding:1.5rem;background:var(--mat-sys-surface)}'],changeDetection:0})};var Oe=[{path:"",loadComponent:()=>import("./chunk-LHAMBNO6.js").then(n=>n.AppsListComponent)},{path:"apps/:name",loadComponent:()=>import("./chunk-V2KNRAE4.js").then(n=>n.AppDetailComponent)},{path:"events",loadComponent:()=>import("./chunk-NX6DTO32.js").then(n=>n.EventsFeedComponent)},{path:"logs",loadComponent:()=>import("./chunk-P5IE6DI6.js").then(n=>n.LogsPageComponent)},{path:"logs/:name",loadComponent:()=>import("./chunk-P5IE6DI6.js").then(n=>n.LogsPageComponent)},{path:"errors",loadComponent:()=>import("./chunk-PMAG4W5W.js").then(n=>n.ErrorsPanelComponent)},{path:"doctor",loadComponent:()=>import("./chunk-4BAKWDAV.js").then(n=>n.DoctorPageComponent)},{path:"config",loadComponent:()=>import("./chunk-QSBOKS53.js").then(n=>n.ConfigEditorComponent)},{path:"history",loadComponent:()=>import("./chunk-4OCNYL7T.js").then(n=>n.HistoryPageComponent)},{path:"history/:name",loadComponent:()=>import("./chunk-4OCNYL7T.js").then(n=>n.HistoryPageComponent)},{path:"trends",loadComponent:()=>import("./chunk-H2N3RBHF.js").then(n=>n.TrendsPageComponent)},{path:"tests",loadComponent:()=>import("./chunk-44JIQO3X.js").then(n=>n.TestsPageComponent)},{path:"sessions",loadComponent:()=>import("./chunk-KL6X73FV.js").then(n=>n.SessionsPageComponent)},{path:"requests/:name",loadComponent:()=>import("./chunk-CY5YRTQK.js").then(n=>n.RequestsPageComponent)},{path:"**",redirectTo:""}];ce(V,{providers:[le(),Te(),ue(ge()),xe(Oe,be()),{provide:Ee,useValue:{fontSet:"material-symbols-outlined"}}]}).catch(n=>console.error(n));
package/dist/main.js CHANGED
@@ -49,7 +49,7 @@ var qn=Object.defineProperty;var rt=(r,t)=>()=>(r&&(t=r(r=0)),t);var Ft=(r,t)=>{
49
49
  CREATE INDEX IF NOT EXISTS self_metrics_ts ON self_metrics(ts);
50
50
  `)}recordSelfMetric(t,e,n,s,i=Date.now()){if(this.db)try{this.db.prepare("INSERT INTO self_metrics (ts,rssMB,heapUsedMB,eventLoopLagMs,historyQueryP95Ms) VALUES (?,?,?,?,?)").run(i,t,e,n,s)}catch(o){this.warnOnce(`self_metrics write failed: ${o?.message||o}`)}}querySelfMetrics(t={}){if(!this.db)return[];let e=[],n=[];t.since!=null&&(e.push("ts >= ?"),n.push(t.since));let s=`SELECT ts, rssMB, heapUsedMB, eventLoopLagMs, historyQueryP95Ms FROM self_metrics ${e.length?"WHERE "+e.join(" AND "):""} ORDER BY ts DESC LIMIT ?`;return n.push(t.limit??60),this.db.prepare(s).all(...n)}recordEvent(t){this.db&&this.queue.push({kind:"event",row:{ts:t.ts,app:t.app,type:t.type,from_state:t.from??null,to_state:t.to??null,message:t.message??null}})}recordCompile(t,e,n=Date.now()){this.db&&this.queue.push({kind:"compile",row:{ts:n,app:t,ms:e}})}recordBundle(t,e,n,s,i=Date.now()){this.db&&this.queue.push({kind:"bundle",row:{ts:i,app:t,initialKB:e,lazyKB:n,fileCount:s}})}recordTaskRun(t,e,n,s,i,o=Date.now()){this.db&&this.queue.push({kind:"task",row:{ts:o,app:t,task:e,exit_code:n,duration_ms:s,summary:i==null?null:JSON.stringify(i)}})}flush(){if(!this.db||this.queue.length===0)return;let t=this.queue;this.queue=[];try{let e=this.db.prepare("INSERT INTO events (ts,app,type,from_state,to_state,message) VALUES (?,?,?,?,?,?)"),n=this.db.prepare("INSERT INTO compile_times (ts,app,ms) VALUES (?,?,?)"),s=this.db.prepare("INSERT INTO task_runs (ts,app,task,exit_code,duration_ms,summary) VALUES (?,?,?,?,?,?)"),i=this.db.prepare("INSERT INTO bundles (ts,app,initialKB,lazyKB,fileCount) VALUES (?,?,?,?,?)");this.db.transaction(a=>{for(let c of a)c.kind==="event"?e.run(c.row.ts,c.row.app,c.row.type,c.row.from_state,c.row.to_state,c.row.message):c.kind==="compile"?n.run(c.row.ts,c.row.app,c.row.ms):c.kind==="bundle"?i.run(c.row.ts,c.row.app,c.row.initialKB,c.row.lazyKB,c.row.fileCount):s.run(c.row.ts,c.row.app,c.row.task,c.row.exit_code,c.row.duration_ms,c.row.summary)})(t)}catch(e){this.warnOnce(`history write failed: ${e?.message||e}`)}}runRetention(){if(this.db)try{let t=Date.now()-this.cfg.retentionDays*864e5;this.db.prepare("DELETE FROM events WHERE ts < ?").run(t),this.db.prepare("DELETE FROM compile_times WHERE ts < ?").run(t),this.db.prepare("DELETE FROM task_runs WHERE ts < ?").run(t),this.db.prepare("DELETE FROM bundles WHERE ts < ?").run(t),this.db.prepare("DELETE FROM self_metrics WHERE ts < ?").run(t)}catch(t){this.warnOnce(`retention failed: ${t?.message||t}`)}}queryEvents(t){if(!this.db)return[];let e=[],n=[];t.app&&(e.push("app = ?"),n.push(t.app)),t.since!=null&&(e.push("ts >= ?"),n.push(t.since)),t.until!=null&&(e.push("ts <= ?"),n.push(t.until)),t.type&&(e.push("type = ?"),n.push(t.type));let s=`SELECT * FROM events ${e.length?"WHERE "+e.join(" AND "):""} ORDER BY ts DESC LIMIT ?`;return n.push(t.limit??500),this.db.prepare(s).all(...n)}queryCompiles(t){if(!this.db)return[];let e=[],n=[];t.app&&(e.push("app = ?"),n.push(t.app)),t.since!=null&&(e.push("ts >= ?"),n.push(t.since)),t.until!=null&&(e.push("ts <= ?"),n.push(t.until));let s=`SELECT * FROM compile_times ${e.length?"WHERE "+e.join(" AND "):""} ORDER BY ts DESC LIMIT ?`;return n.push(t.limit??1e3),this.db.prepare(s).all(...n)}queryBundles(t){if(!this.db)return[];let e=[],n=[];t.app&&(e.push("app = ?"),n.push(t.app)),t.since!=null&&(e.push("ts >= ?"),n.push(t.since)),t.until!=null&&(e.push("ts <= ?"),n.push(t.until));let s=`SELECT * FROM bundles ${e.length?"WHERE "+e.join(" AND "):""} ORDER BY ts DESC LIMIT ?`;return n.push(t.limit??1e3),this.db.prepare(s).all(...n)}trends(t){if(!this.db)return{points:[],count:0};let e=Date.now()-t.sinceMs,n=t.bucketMs,s=new Map,i=(h,p)=>{let y=Math.floor(h/n)*n,v=s.get(y)??{sum:0,n:0};v.sum+=p,v.n+=1,s.set(y,v)},o=h=>{let p=Math.floor(h/n)*n,y=s.get(p)??{sum:0,n:0};y.sum+=1,y.n+=1,s.set(p,y)},a=0;if(t.metric==="compile"){let h=this.queryCompiles({app:t.app,since:e,limit:1e4});a=h.length;for(let p of h)i(p.ts,p.ms)}else if(t.metric==="bundle"){let h=this.queryBundles({app:t.app,since:e,limit:1e4});a=h.length;for(let p of h){let y=Math.floor(p.ts/n)*n,v=s.get(y)??{sum:0,n:0,sum2:0};v.sum+=p.initialKB,v.sum2=(v.sum2??0)+p.lazyKB,v.n+=1,s.set(y,v)}}else if(t.metric==="errors"){let h=this.queryEvents({app:t.app,since:e,limit:1e4});for(let p of h)(p.type==="error-new"||p.type==="error-recur")&&(o(p.ts),a++)}else{let h=this.queryEvents({app:t.app,since:e,limit:1e4});for(let p of h)p.type==="status"&&p.to_state==="starting"&&(p.from_state==="error"||p.from_state==="serving"||p.from_state==="compiling")&&(o(p.ts),a++)}let c=[],u=[...s.entries()].sort((h,p)=>h[0]-p[0]);for(let[h,p]of u)t.metric==="compile"||t.metric==="bundle"?c.push({t:h,v:Math.round(p.sum/p.n),...p.sum2!=null?{v2:Math.round(p.sum2/p.n)}:{}}):c.push({t:h,v:p.sum});return{points:c,count:a}}queryTasks(t){if(!this.db)return[];let e=[],n=[];t.app&&(e.push("app = ?"),n.push(t.app)),t.task&&(e.push("task = ?"),n.push(t.task)),t.since!=null&&(e.push("ts >= ?"),n.push(t.since));let s=`SELECT * FROM task_runs ${e.length?"WHERE "+e.join(" AND "):""} ORDER BY ts DESC LIMIT ?`;return n.push(t.limit??200),this.db.prepare(s).all(...n)}summary(t){if(!this.db)return{uptimePct24h:0,restartCount24h:0,compileP50:null,compileP95:null,topErrors:[]};let e=Date.now()-24*3600*1e3,n=this.queryEvents({app:t,since:e,limit:5e3}),s=0,i=e,o=!1,a=null,c=[...n].sort((d,g)=>d.ts-g.ts);for(let d of c)d.type==="status"&&(d.to_state==="serving"&&!o?(o=!0,a=d.ts):o&&d.to_state!=="serving"&&a!=null&&(s+=d.ts-a,o=!1,a=null));o&&a!=null&&(s+=Date.now()-a);let u=Math.round(s/(24*3600*1e3)*1e3)/10,h=n.filter(d=>d.type==="status"&&d.to_state==="starting"&&(d.from_state==="serving"||d.from_state==="error"||d.from_state==="compiling")).length,p=this.queryCompiles({app:t,since:e,limit:1e3}).map(d=>d.ms).sort((d,g)=>d-g),y=(d,g)=>{if(d.length===0)return null;let x=Math.min(d.length-1,Math.floor((d.length-1)*g));return d[x]},v=y(p,.5),l=y(p,.95),f=new Map;for(let d of n)if(d.type==="error-new"||d.type==="error-recur"){let g=d.message??"";if(!g)continue;f.set(g,(f.get(g)??0)+1)}let m=[...f.entries()].sort((d,g)=>g[1]-d[1]).slice(0,5).map(([d,g])=>({message:d,count:g}));return{uptimePct24h:u,restartCount24h:h,compileP50:v,compileP95:l,topErrors:m}}why(t){let e=this.queryEvents({app:t,limit:200}),n=e.find(a=>a.type==="status"&&(a.to_state==="error"||a.from_state==="error"||a.to_state==="serving")),s=n?{ts:n.ts,app:n.app,type:n.type,from:n.from_state??void 0,to:n.to_state??void 0,message:n.message??void 0}:null,i=s?s.ts:Date.now(),o=e.filter(a=>a.ts<i).slice(0,5);return{trigger:s,preceding:o.map(a=>({ts:a.ts,app:a.app,type:a.type,from:a.from_state??void 0,to:a.to_state??void 0,message:a.message??void 0}))}}_flushForTest(){this.flush()}quickCheck(){if(!this.db)return!1;try{return this.db.prepare("PRAGMA quick_check").get()?.quick_check==="ok"}catch{return!1}}close(){if(this.flushTimer&&clearInterval(this.flushTimer),this.retentionTimer&&clearInterval(this.retentionTimer),this.retentionStart&&clearTimeout(this.retentionStart),this.flush(),this.db){try{this.db.close()}catch{}this.db=null}}}});var jt={};Ft(jt,{ALL_AUTO_FIX:()=>sn,runAutoFix:()=>Bo});import L from"node:fs";import H from"node:path";function So(){let r=wt();if(!r)return{detected:!1,description:"no daemon running"};let t=process.cwd(),e=H.join(t,"daimon.config.json");if(!L.existsSync(e))return{detected:!1,description:"no local daimon.config.json in cwd"};let n=r.cwd,s=r.configPath,i=n&&H.resolve(n)===H.resolve(t),o=s&&H.resolve(s)===H.resolve(e);return i||o?{detected:!1,description:"daemon already running from this cwd/config"}:{detected:!0,description:`daemon (pid ${r.pid}) is running from ${n??"(unknown)"} but local daimon.config.json exists at ${t}`,lockCwd:n}}async function ko(){let r=wt();if(!r)return"no daemon running; nothing to do";try{await fetch(`http://127.0.0.1:${r.apiPort}/api/snapshot-state`,{method:"POST"})}catch{}try{await fetch(`http://127.0.0.1:${r.apiPort}/api/shutdown`,{method:"POST"})}catch{}return await Lr(r.pid,5e3),Mt(),`respawned daemon at pid ${(await Me({})).pid} from ${process.cwd()}; previous pid ${r.pid} (cwd ${r.cwd??"unknown"}) was shut down with state handoff. To undo: stop with 'daimon daemon stop' and start from the prior directory.`}function xo(){let r;try{r=L.readFileSync(Xt(),"utf8")}catch{return{detected:!1,description:"no lock file present"}}let t;try{t=JSON.parse(r)}catch{return{detected:!0,description:"lock file is malformed JSON"}}if(!t||typeof t.pid!="number")return{detected:!0,description:"lock file has no pid"};try{return process.kill(t.pid,0),{detected:!1,description:`lock file owner pid ${t.pid} is alive`}}catch(e){return e?.code==="EPERM"?{detected:!1,description:`lock file owner pid ${t.pid} alive (EPERM)`}:{detected:!0,description:`lock file claims pid ${t.pid} but the process is gone`}}}async function To(){let r="(unknown)";try{let e=JSON.parse(L.readFileSync(Xt(),"utf8"));r=String(e?.pid??"?")}catch{}Mt();let t=await Me({});return`removed stale ${Xt()} (prior pid ${r} was dead); spawned fresh daemon at pid ${t.pid}.`}function Eo(){let r=process.cwd(),e=["nx.json","angular.json","vite.config.ts","vite.config.js","vite.config.mjs","vite.config.cjs",".storybook"].filter(o=>L.existsSync(H.join(r,o)));if(!e.length)return{detected:!1,description:"no nx.json/angular.json/vite.config.*/.storybook in cwd"};let n=Q();return n.kind!=="loaded"?{detected:!0,description:`${e.join(", ")} present but no config is loaded`,markerFiles:e}:n.config.searchRoots.map(o=>H.resolve(typeof o=="string"?o:o.path)).some(o=>r.startsWith(o))?{detected:!1,description:`${e.join(", ")} present and a configured searchRoot covers ${r}`}:{detected:!0,description:`${e.join(", ")} present in ${r} but no searchRoot covers it`,markerFiles:e}}function Ro(){let r=process.cwd(),{local:t,user:e}=dt(),n=L.existsSync(t)?t:e,s={};try{s=JSON.parse(L.readFileSync(n,"utf8"))}catch{}if(s.searchRoots=Array.isArray(s.searchRoots)?s.searchRoots:[],!s.searchRoots.some(o=>(typeof o=="string"?o:o?.path)===r)){let o;try{let a=JSON.parse(L.readFileSync(H.join(r,"package.json"),"utf8"));typeof a.name=="string"&&(o=a.name)}catch{}s.searchRoots.push(o?{path:r,label:o}:r)}L.mkdirSync(H.dirname(n),{recursive:!0}),L.writeFileSync(n,JSON.stringify(s,null,2)+`
51
51
  `,"utf8");let i=wt();if(i)try{fetch(`http://127.0.0.1:${i.apiPort}/api/config/reload`,{method:"POST"})}catch{}return`appended ${r} as a searchRoot in ${n}; triggered soft-reload of the running daemon.`}function Ao(){let r=Q();if(r.kind!=="loaded"||!r.config.history.enabled)return{detected:!1,description:"history disabled"};let t=r.config.history.path;if(!L.existsSync(t))return{detected:!1,description:"history db does not exist (will be created on next start)"};try{let e=new St(r.config.history),n=e.quickCheck();return e.close(),n?{detected:!1,description:"history db quick_check passed"}:{detected:!0,description:`quick_check failed on ${t}`,dbPath:t}}catch(e){return{detected:!0,description:`cannot open ${t}: ${e?.message??String(e)}`,dbPath:t}}}function Po(){let r=Q();if(r.kind!=="loaded")return"no config; cannot determine history path";let t=r.config.history.path,e=`${t}.corrupt-${Date.now()}`;for(let n of["","-wal","-shm"])try{L.renameSync(t+n,e+n)}catch{}return`rotated ${t} \u2192 ${e} (and -wal/-shm siblings). The daemon will rebuild an empty history db on next start.`}async function Co(){let r=Q();if(r.kind!=="loaded")return{detected:!1,description:"no config loaded"};let[t,e]=r.config.portRange??[4200,4299],n=r.config.overrides??{},s=Object.values(n).map(a=>a.port).filter(a=>typeof a=="number"),i=Array.from(new Set([...s,t,e])),o=[];for(let a of i)if(!(!Number.isFinite(a)||a<=0))try{await yt(a)||o.push(a)}catch{}return o.length?{detected:!0,description:`ports already LISTEN: ${o.join(", ")} (range ${t}-${e} + pinned overrides)`,conflicts:o}:{detected:!1,description:`all checked ports free (range ${t}-${e} + pinned)`}}function Mo(){return"no automated fix \u2014 predictive rule only. Run `daimon free-port <port>` to inspect the holder, or pick a different port in daimon.config.json. To undo: nothing was changed."}function Oo(){let r=process.cwd(),t=process.versions.node,e=H.join(r,".nvmrc");if(L.existsSync(e)){let s=L.readFileSync(e,"utf8").trim().replace(/^v/i,"");if(s&&!t.startsWith(s))return{detected:!0,description:`.nvmrc requires ${s}, running ${t}`,expected:s,actual:t}}let n=H.join(r,"package.json");if(L.existsSync(n))try{let i=JSON.parse(L.readFileSync(n,"utf8"))?.engines?.node;if(typeof i=="string"&&i.trim()){let o=i.match(/(\d+)(?:\.(\d+))?/);if(o){let a=Number(o[1]),c=Number(t.split(".")[0]);if(Number.isFinite(a)&&Number.isFinite(c)&&c<a)return{detected:!0,description:`package.json engines.node = "${i}" but running ${t}`,expected:i,actual:t}}}}catch{}return{detected:!1,description:`node ${t} satisfies .nvmrc / engines.node (or neither is present)`}}function No(){return"no automated fix \u2014 switching Node versions touches the user environment. Run `nvm use` (or your version manager equivalent) in this directory, then re-run daimon. To undo: nothing was changed."}function jo(){let r=Q();if(r.kind!=="loaded")return[];let t=[],e=new Set;for(let n of r.config.searchRoots){let s=typeof n=="string"?n:n.path;if(!s||!L.existsSync(s)||e.has(s))continue;e.add(s);let i=H.join(s,"package.json");if(!L.existsSync(i))continue;let o=null;for(let a of["package-lock.json","pnpm-lock.yaml","yarn.lock"]){let c=H.join(s,a);if(L.existsSync(c)){o=c;break}}t.push({name:H.basename(s),root:s,pkgPath:i,lockPath:o,nmPath:H.join(s,"node_modules")})}return t}function on(){let r=jo();if(!r.length)return{detected:!1,description:"no searchRoots with package.json found"};let t=[];for(let n of r){if(!L.existsSync(n.nmPath)){t.push({root:n.root,reason:"missing"});continue}if(n.lockPath)try{let s=L.statSync(n.lockPath).mtimeMs,i=L.statSync(n.nmPath).mtimeMs;s>i+1e3&&t.push({root:n.root,reason:"stale"})}catch{}}return t.length?{detected:!0,description:`node_modules issues \u2014 ${t.map(n=>`${n.reason}: ${n.root}`).join(" \xB7 ")}`,entries:t}:{detected:!1,description:"every searchRoot package.json has a fresh node_modules"}}function _o(){let r=on();return!r.detected||!r.entries?"nothing to suggest":`would suggest: ${r.entries.map(e=>`(cd "${e.root}" && npm install)`).join(" && ")}. Daimon does not run package managers on your behalf \u2014 run the command(s) yourself. To undo: nothing was changed.`}function Ie(){let r=Q();if(r.kind!=="loaded")return[];let t=[],e=new Set;for(let n of r.config.searchRoots){let s=typeof n=="string"?n:n?.path;!s||!L.existsSync(s)||e.has(s)||(e.add(s),t.push(s))}return t}function an(){let r=Ie();if(!r.length)return{detected:!1,description:"no searchRoots resolved on disk"};let t=[];for(let n of r){let s=H.join(n,"pyproject.toml"),i=H.join(n,"requirements.txt"),o=H.join(n,"manage.py");if(!(L.existsSync(s)||L.existsSync(i)||L.existsSync(o)))continue;let c=[".venv","venv","env"].map(h=>H.join(n,h)).find(h=>L.existsSync(h));if(!c){t.push({root:n,reason:"missing"});continue}let u=[];for(let h of[s,i])if(L.existsSync(h))try{u.push(L.statSync(h).mtimeMs)}catch{}if(u.length)try{let h=L.statSync(c).mtimeMs;Math.max(...u)>h+1e3&&t.push({root:n,reason:"stale"})}catch{}}return t.length?{detected:!0,description:`venv issues \u2014 ${t.map(n=>`${n.reason}: ${n.root}`).join(" \xB7 ")}`,entries:t}:{detected:!1,description:"every Python searchRoot has a fresh venv (or no Python markers)"}}function $o(){let r=an();return!r.detected||!r.entries?"nothing to suggest":`would suggest: ${r.entries.map(e=>`(cd "${e.root}" && python -m venv .venv && .venv/Scripts/pip install -r requirements.txt)`).join(" && ")}. Daimon does not run pip on your behalf \u2014 run the command(s) yourself. To undo: nothing was changed.`}function cn(){let r=Ie();if(!r.length)return{detected:!1,description:"no searchRoots resolved on disk"};let t=[];for(let n of r){let s=H.join(n,"Gemfile");if(!L.existsSync(s))continue;let i=H.join(n,"Gemfile.lock"),o=H.join(n,"vendor","bundle"),a=H.join(n,".bundle"),c=L.existsSync(o)?o:L.existsSync(a)?a:null;if(!c){t.push({root:n,reason:"missing"});continue}if(L.existsSync(i))try{let u=L.statSync(i).mtimeMs,h=L.statSync(c).mtimeMs;u>h+1e3&&t.push({root:n,reason:"stale"})}catch{}}return t.length?{detected:!0,description:`bundler cache issues \u2014 ${t.map(n=>`${n.reason}: ${n.root}`).join(" \xB7 ")}`,entries:t}:{detected:!1,description:"every Ruby searchRoot has a fresh bundle cache (or no Gemfile)"}}function Lo(){let r=cn();return!r.detected||!r.entries?"nothing to suggest":`would suggest: ${r.entries.map(e=>`(cd "${e.root}" && bundle install)`).join(" && ")}. Daimon does not run bundle install on your behalf \u2014 run the command(s) yourself. To undo: nothing was changed.`}function ln(){let r=Ie();if(!r.length)return{detected:!1,description:"no searchRoots resolved on disk"};let t=[];for(let n of r){let s=H.join(n,"Cargo.toml");if(!L.existsSync(s))continue;let i=H.join(n,"Cargo.lock"),o=H.join(n,"target");if(!L.existsSync(o)){t.push({root:n,reason:"missing"});continue}if(L.existsSync(i))try{let a=L.statSync(i).mtimeMs,c=L.statSync(o).mtimeMs;a>c+1e3&&t.push({root:n,reason:"stale"})}catch{}}return t.length?{detected:!0,description:`cargo target issues \u2014 ${t.map(n=>`${n.reason}: ${n.root}`).join(" \xB7 ")}`,entries:t}:{detected:!1,description:"every Rust searchRoot has a fresh target/ (or no Cargo.toml)"}}function Do(){let r=ln();return!r.detected||!r.entries?"nothing to suggest":`would suggest: ${r.entries.map(e=>`(cd "${e.root}" && cargo build)`).join(" && ")}. Daimon does not run cargo on your behalf \u2014 run the command(s) yourself. To undo: nothing was changed.`}function un(){let r=Q();if(r.kind!=="loaded")return{detected:!1,description:"no config loaded"};let t=[];for(let e of r.config.searchRoots){let n=typeof e=="string"?e:e.path;n&&(L.existsSync(n)||t.push(n))}return t.length?{detected:!0,description:`searchRoots no longer on disk: ${t.join(", ")}`,dead:t}:{detected:!1,description:"every configured searchRoot resolves on disk"}}function Fo(){let r=un();if(!r.detected||!r.dead||!r.dead.length)return"nothing to remove";let{local:t,user:e}=dt(),n=L.existsSync(t)?t:e,s={};try{s=JSON.parse(L.readFileSync(n,"utf8"))}catch{}if(!Array.isArray(s.searchRoots))return"config has no searchRoots array; nothing removed";let i=new Set(r.dead),o=s.searchRoots.length;s.searchRoots=s.searchRoots.filter(u=>{let h=typeof u=="string"?u:u?.path;return!i.has(h)});let a=o-s.searchRoots.length;L.writeFileSync(n,JSON.stringify(s,null,2)+`
52
- `,"utf8");let c=wt();if(c)try{fetch(`http://127.0.0.1:${c.apiPort}/api/config/reload`,{method:"POST"})}catch{}return`removed ${a} dead searchRoot entr${a===1?"y":"ies"} from ${n} (${[...i].join(", ")}); triggered soft-reload. To undo: edit ${n} and re-add the path(s).`}async function Bo(r){let t={ran:[],skipped:[],errors:[]};for(let e of sn){if(!r.permitted.includes(e))continue;let n=Io[e],s;try{s=await n.detect()}catch(i){t.errors.push({name:e,error:i?.message??String(i)});continue}if(!s.detected){t.skipped.push({name:e,detected:!1,description:s.description});continue}if(r.dryRun){t.ran.push({name:e,detected:!0,description:`(dry-run) would fix: ${s.description}`});continue}try{let i=await n.fix();t.ran.push({name:e,detected:!0,description:`${s.description} \u2014 ${i}`})}catch(i){t.errors.push({name:e,error:i?.message??String(i)})}}return t}var sn,Io,_t=rt(()=>{"use strict";ft();Rt();Fe();Ht();sn=["orphan-daemon","stale-lock","missing-search-root","corrupt-history-db","port-conflict-pred","node-version-mismatch","orphan-node-modules","orphan-venv","orphan-bundler-cache","orphan-cargo-target","dead-search-root"];Io={"orphan-daemon":{detect:So,fix:ko},"stale-lock":{detect:xo,fix:To},"missing-search-root":{detect:Eo,fix:Ro},"corrupt-history-db":{detect:Ao,fix:Po},"port-conflict-pred":{detect:Co,fix:Mo},"node-version-mismatch":{detect:Oo,fix:No},"orphan-node-modules":{detect:on,fix:_o},"orphan-venv":{detect:an,fix:$o},"orphan-bundler-cache":{detect:cn,fix:Lo},"orphan-cargo-target":{detect:ln,fix:Do},"dead-search-root":{detect:un,fix:Fo}}});var Be={};Ft(Be,{orchestrateProfile:()=>Wo});function pn(r,t,e,n,s){let i=r.summary(t);if(!i)return!1;if(e==="serving")return i.status==="serving";if(e==="healthy")return i.status==="serving"&&i.health==="healthy";let o=Date.now()-n;return i.status==="serving"&&i.health==="healthy"&&o>=s}async function dn(r,t,e,n,s){let i=Date.now();if(e!=="stable"){let c=await r.waitFor(t,e==="serving"?"serving":"healthy",n);return{reached:!c.timedOut,waitedMs:c.waitedMs}}let o=Date.now(),a=c=>{c?.app===t&&(o=Date.now())};r.on("event",a);try{for(;Date.now()-i<n;){if(pn(r,t,e,o,s))return{reached:!0,waitedMs:Date.now()-i};await new Promise(c=>setTimeout(c,500))}return{reached:pn(r,t,e,o,s),waitedMs:Date.now()-i}}finally{r.off("event",a)}}async function Wo(r,t,e){let n=Date.now(),s=t.profiles?.[e.profile];if(!s)return{error:`unknown profile: ${e.profile}`};let i=s.filter(m=>r.summary(m)!=null),o=Array.from(new Set(i.flatMap(m=>Wt(t.depends??{},m)))).filter(m=>r.summary(m)!=null),a=Gt(t.depends??{},o),c=[];for(let m of o){let d=r.summary(m);d&&(e.goal==="serving"&&d.status==="serving"||(e.goal==="healthy"||e.goal==="stable")&&d.status==="serving"&&d.health==="healthy")&&c.push(m)}if(e.dryRun){let m=o.filter(d=>!c.includes(d));return{profile:e.profile,goal:e.goal,perApp:m.map(d=>({name:d,reached:!1,tries:0})),totalMs:Date.now()-n,allReached:m.length===0,dryRun:!0,plannedOrder:a,alreadyHealthy:c}}let u=Math.max(5e3,Math.floor(e.timeoutMs/2)),h=e.stableMs??5e3,p=new Map;for(let m of o)p.set(m,{name:m,reached:!1,tries:0});for(let m of a)await Promise.all(m.map(async d=>{let g=r.summary(d);if(!g){p.set(d,{name:d,reached:!1,tries:0,error:"unknown app"});return}if(c.includes(d)){p.set(d,{name:d,reached:!0,tries:0});return}g.status!=="starting"&&g.status!=="compiling"&&g.status!=="serving"&&await r.start(d)})),await Promise.all(m.map(async d=>{if(p.get(d)?.reached)return;let g=await dn(r,d,e.goal,u,h),x=p.get(d);x.tries=1,x.waitedMs=g.waitedMs,x.reached=g.reached,p.set(d,x)}));let y=[...p.values()].filter(m=>!m.reached);if(y.length>0){let{runAutoFix:m,ALL_AUTO_FIX:d}=await Promise.resolve().then(()=>(_t(),jt)),g=t.doctor?.autoFix?.permitted??d,x=Math.max(5e3,e.timeoutMs-(Date.now()-n)),E=Math.max(5e3,Math.floor(x/Math.max(y.length,1))),w={ran:[]};try{w=await m({permitted:g,dryRun:!1})}catch{}let _=(w.ran??[]).map(A=>A.name);await Promise.all(y.map(async A=>{let C=p.get(A.name);C.tries=2;try{let $=await r.restart(A.name);$?.ok||(C.error=$?.error??"restart failed")}catch($){C.error=$?.message??String($)}let P=await dn(r,A.name,e.goal,E,h);if(C.waitedMs=(C.waitedMs??0)+P.waitedMs,C.reached=P.reached,!C.reached){let $=r.errors(A.name)??[];C.stillFailing=$.slice(0,3).map(T=>({file:T.parsed?.file??null,line:T.parsed?.line??null,code:T.parsed?.code??null,tool:T.parsed?.tool??null,message:T.parsed?.message??T.message}))}C.fixed=_,p.set(A.name,C)}))}let v=[...p.values()],l=v.every(m=>m.reached),f={profile:e.profile,goal:e.goal,perApp:v,totalMs:Date.now()-n,allReached:l};if(typeof e.budgetTokens=="number"&&e.budgetTokens>0){let m=e.budgetTokens,d=0,g=0;for(let x of v)if(x.stillFailing){let E=x.stillFailing.length*Ho;E>m?(d+=x.stillFailing.length,delete x.stillFailing):m-=E}for(;m<0||v.length*Uo>Math.max(m,e.budgetTokens/4);){let x=v.findIndex(E=>E.reached);if(x===-1)break;v.splice(x,1),g++}(d||g)&&(f._meta={omitted:{}},d&&(f._meta.omitted.stillFailing=d),g&&(f._meta.omitted.perApp=g))}return f}var Ho,Uo,He=rt(()=>{"use strict";qt();Ho=60,Uo=25});Rt();Pt();import Ji from"react";import Xi from"node:path";import{render as Ki}from"ink";import{pathToFileURL as zi}from"node:url";import{EventEmitter as Vs}from"node:events";import{spawn as ks}from"node:child_process";import br from"tree-kill";import xs from"strip-ansi";import zn from"node:crypto";var Yn=[/Local:\s+http/i,/Application bundle generation complete/i,/compiled successfully/i,/webpack compiled\s+(?:successfully|in\b)/i,/Angular Live Development Server is listening/i,/Storybook\s+[\d.]+\s+(?:for\s+\S+\s+)?started/i,/VITE\s+v[\d.]+\s+ready/i,/Quit the server with CONTROL-C/i,/Uvicorn running on http/i,/Application startup complete/i,/Puma starting in single mode/i,/Use Ctrl-C to stop/i,/Listening on tcp:\/\//i,/running on http/i,/serving HTTP on/i,/trunk serve.*at/i],Vn=[/Building\.\.\./i,/Compilation started/i,/Initial chunk files/i,/Compiling/i,/Watching for file changes with StatReloader/i,/Performing system checks/i,/watching files for changes/i,/building\.{3}/i,/Compiling \(/i],Zn=[/^\s*ERROR\b/,/\berror TS\d+/,/✘/,/\[ERROR\]/,/Cannot find module/i,/^FAIL\s+\S+/,/^\s*●\s+/,/^\s*>\s+NX\s+.*failed/i,/\bModule not found:/,/\[vite\]\s+(?:Internal server error|Pre-transform error)/i,/\[plugin:[^\]]+\]/i,/^\s*ERR!\s+/,/^\s*(?:Uncaught\s+)?(?:Error|TypeError|SyntaxError|ReferenceError|RangeError):\s+/,/^Traceback \(most recent call last\):/,/^\s*[A-Z][a-zA-Z]*Error:\s+/,/^\s*\[error\]\s+/i,/^panic:\s+/,/^thread\s+'[^']+'\s+panicked at/,/^error\[E\d+\]:/,/^\S+\.(?:go|rb|py|rs):\d+:\d+:/,/^\s*[A-Z][a-zA-Z]*\.[A-Z][a-zA-Z]*:\s+/,/^[A-Z][a-zA-Z]+(?:::[A-Z][a-zA-Z]+)+\s*[(:]/,/^[A-Z][a-zA-Z]*Error\s*\(/],Qn=/\berror TS(\d+)/,ts=/✘\s*\[ERROR\]\s*TS(\d+)/,es=/([A-Z]:[\\/][^\s:()]+|[^\s:()]+\.(?:tsx?|jsx?|mjs|cjs|vue|svelte|py|rb|go|rs)):(\d+):(\d+)/,hr=/\(([A-Z]:[\\/][^\s:()]+|[^\s:()]+\.(?:tsx?|jsx?|mjs|cjs|vue|svelte|py|rb|go|rs)):(\d+):(\d+)\)/,rs=/([A-Z]:[\\/][^\s:()]+|[^\s:()]+\.(?:tsx?|jsx?|mjs|cjs|vue|svelte))\((\d+),(\d+)\)\s*:/,gr=/File\s+"([^"]+\.py)",\s+line\s+(\d+)/,yr=/^\s*-->\s+([^\s:]+\.rs):(\d+):(\d+)/,ns=/^([^\s:()]+\.rb):(\d+):in\b/,ss=/^FAIL\s+(\S+\.(?:tsx?|jsx?|mjs|cjs))(?:\s|$)/,os=/^ERROR in\s+(\S+\.(?:tsx?|jsx?|mjs|cjs|vue|svelte))(?:[:\s](\d+):(\d+))?/,is=/^\s+([A-Z]:[\\/][^\s:()]+|[^\s:()]+\.(?:tsx?|jsx?|mjs|cjs|vue|svelte)):(\d+):(\d+):?\s*$/,as=[{tool:"vite",rx:/\[vite\]|\[plugin:vite:|transformWithEsbuild/i},{tool:"storybook",rx:/\bstorybook\b|^\s*ERR!\s|builder-vite/i},{tool:"jest",rx:/^FAIL\s|^\s*●\s+|\bjest\b/i},{tool:"nx",rx:/>\s+NX\s+|Failed tasks:|Nx errored/i},{tool:"webpack",rx:/\bModule not found:|webpack compiled|webpack-dev-server/i},{tool:"esbuild",rx:/✘\s*\[ERROR\]|esbuild/i},{tool:"typescript",rx:/\berror TS\d+/},{tool:"django",rx:/\bdjango\b|StatReloader|manage\.py runserver/i},{tool:"rails",rx:/\brails\b|Puma starting|Booting (?:Puma|Rails)|ActionController|NameError\s*\(|\.rb:\d+:in/i},{tool:"fastapi",rx:/\buvicorn\b|fastapi|ASGI/i},{tool:"go-air",rx:/\bair v\d|building\.{3}|\.go:\d+:\d+/i},{tool:"rust-trunk",rx:/\btrunk\b|^error\[E\d+\]|^\s*-->\s+\S+\.rs:/i},{tool:"python",rx:/^Traceback \(most recent call last\):|^\s*File "[^"]+\.py"|[A-Z][a-zA-Z]*Error:\s/},{tool:"node",rx:/^\s*(?:Uncaught\s+)?(?:Error|TypeError|SyntaxError|ReferenceError|RangeError):/}];function cs(r){for(let{tool:t,rx:e}of as)if(e.test(r))return t}var ls=/Local:\s+(https?:\/\/\S+)/i,us=/Server running at\s+(https?:\/\/\S+)/i,ps=/listening on\s+(https?:\/\/\S+)/i,ds=/(?:listening|listen)\s+(https?:\/\/\S+)/i,fs=/Initial chunk files/i,ms=/Lazy chunk files/i,hs=/(Initial total|Lazy total)\s*\|?\s*([\d.]+)\s*(kB|MB|B)\b/i,gs=/^\s*\|?\s*([^\s|][^|]*?)\s*\|\s*([^|]+?)\s*\|\s*([\d.]+)\s*(kB|MB|B)\b/i;function ys(r){return zn.createHash("sha1").update(r).digest("hex").slice(0,16)}function vs(r){let t={message:r},e=r.match(ts)||r.match(Qn);e&&(t.code=`TS${e[1]}`);let n=r.match(rs)||r.match(hr)||r.match(es);if(n)t.file=n[1],t.line=Number(n[2]),t.col=Number(n[3]);else{let i=r.match(os);if(i)t.file=i[1],i[2]&&(t.line=Number(i[2])),i[3]&&(t.col=Number(i[3]));else{let o=r.match(ss);if(o)t.file=o[1];else{let a=r.match(yr);if(a)t.file=a[1],t.line=Number(a[2]),t.col=Number(a[3]);else{let c=r.match(gr);c&&(t.file=c[1],t.line=Number(c[2]))}}}}let s=cs(r);return s&&(t.tool=s),t}function bs(r,t){try{let e=new URL(r);return e.hostname==="0.0.0.0"||e.hostname==="[::]"?(e.hostname=t.includes(":")?`[${t}]`:t,e.toString().replace(/\/$/,"")):r.replace(/\/$/,"")}catch{return r}}function ws(r,t="127.0.0.1"){let e=r.match(ls)||r.match(us)||r.match(ps)||r.match(ds);if(!e)return null;let n=e[1].replace(/[),.;]+$/,"");return bs(n,t)}function Ss(r,t){if(fs.test(t))return r.bundle||(r.bundle={initialKB:0,lazyKB:0,files:[]}),r._bundleSection="initial",!1;if(ms.test(t))return r.bundle||(r.bundle={initialKB:0,lazyKB:0,files:[]}),r._bundleSection="lazy",!1;let e=t.match(hs);if(e&&r.bundle){let s=parseFloat(e[2]),i=e[3].toUpperCase(),o=Math.round(i==="MB"?s*1024:i==="B"?s/1024:s);return/Initial/i.test(e[1])?r.bundle.initialKB=o:r.bundle.lazyKB=o,!0}let n=t.match(gs);if(n&&r.bundle){let s=n[1].trim();if(/^(Initial|Lazy)\s+(total|chunk)/i.test(s))return!1;let i=n[4].toUpperCase(),o=parseFloat(n[3]),a=i==="MB"?o*1024:i==="B"?o/1024:o;return r.bundle.files.push({name:s,sizeKB:Math.round(a*10)/10}),!1}return!1}function vr(r,t){let e=t.match(is),n=e?null:t.match(hr),s=!e&&!n?t.match(yr):null,i=e??n??s;if(i&&r.lastErrorHash){let l=r.errors.get(r.lastErrorHash);l&&!l.parsed?.file&&(l.parsed={...l.parsed??{message:l.message},file:i[1],line:Number(i[2]),col:Number(i[3])})}else if(r.lastErrorHash){let l=t.match(gr),f=l?null:t.match(ns);if(l||f){let m=r.errors.get(r.lastErrorHash);if(m&&!m.parsed?.file){let d=l??f;m.parsed={...m.parsed??{message:m.message},file:d[1],line:Number(d[2])}}}}let o=t.trim();if(!o)return null;let a=r.status,c=!1,u,h=ws(o);h&&!r.announcedUrl&&(r.announcedUrl=h,u=h);let p=Ss(r,o),y;if(Yn.some(l=>l.test(o))){let l=r.status==="error"||!!r.recoveringFromError;if(r.status==="compiling"||r.status==="starting"||r.status==="error"){let f=Date.now();r.compileStartedAt!=null?(y=f-r.compileStartedAt,r.lastCompileMs=y,r.lastCompileAt=f,r.compileStartedAt=null,r.compileHistory.push(y),r.compileHistory.length>20&&r.compileHistory.splice(0,r.compileHistory.length-20)):r.lastCompileAt=f}r.status="serving",l&&(r.errors.clear(),r.recoveringFromError=!1)}else Vn.some(l=>l.test(o))&&(r.status==="starting"||r.status==="serving"||r.status==="error")&&(r.status==="error"&&(r.recoveringFromError=!0),r.compileStartedAt=Date.now(),r.status="compiling");let v;if(Zn.some(l=>l.test(o))){let l=ys(o),f=Date.now(),m=r.errors.get(l),d=!1,g;m?(m.count+=1,m.lastSeen=f,g=m):(g={message:o,count:1,firstSeen:f,lastSeen:f,parsed:vs(o)},r.errors.set(l,g),d=!0),r.lastErrorHash=l,v={entry:g,isNew:d},r.status="error"}return c=r.status!==a,{statusChanged:c,error:v,announcedUrl:u,bundleUpdated:p,compileMs:y}}var wr=500,Bt=class{child=null;stdoutBuf="";stderrBuf="";deps;stopping=!1;constructor(t){this.deps=t}isRunning(){return this.child!==null&&this.child.exitCode===null&&!this.stopping}start(){if(this.isRunning())return;let{app:t,port:e,state:n}=this.deps,s=Date.now();n.status="starting",n.startedAt=s,n.compileStartedAt=s,n.lastCompileMs=null,n.lastCompileAt=null,n.errors.clear(),n.logBuffer.length=0,n.lastStatusMessage=void 0;let o=`${this.deps.commandOverride||t.command} --port ${e}`,a={...process.env,...t.env||{},...this.deps.envOverride||{},PORT:String(e),FORCE_COLOR:"0"},c=ks(o,[],{cwd:t.workspaceRoot,shell:!0,env:a,windowsHide:!0});this.child=c,n.pid=c.pid??null,n.port=e,c.stdout?.on("data",u=>this.handleChunk(u,"stdout")),c.stderr?.on("data",u=>this.handleChunk(u,"stderr")),c.on("exit",(u,h)=>{let p=n.status,y=this.stopping;y?(n.status="stopped",n.lastStatusMessage=`stopped (code=${u??"null"}${h?`, ${h}`:""})`):u!==0?(n.status="error",n.lastStatusMessage=`process exited with code ${u}${h?` (${h})`:""}`):n.status="stopped",n.pid=null,n.health="unknown",this.child=null,this.stopping=!1,p!==n.status&&this.deps.onStatusChange?.(p,n.status,n.lastStatusMessage),this.deps.onExit?.(u,h,y),this.deps.onStateChange()}),c.on("error",u=>{n.status="error",n.lastStatusMessage=`spawn error: ${u.message}`,this.deps.onStateChange()}),this.deps.onStateChange()}handleChunk(t,e){let n=t.toString("utf8"),s=this[e==="stdout"?"stdoutBuf":"stderrBuf"]+=n,i=s.lastIndexOf(`
52
+ `,"utf8");let c=wt();if(c)try{fetch(`http://127.0.0.1:${c.apiPort}/api/config/reload`,{method:"POST"})}catch{}return`removed ${a} dead searchRoot entr${a===1?"y":"ies"} from ${n} (${[...i].join(", ")}); triggered soft-reload. To undo: edit ${n} and re-add the path(s).`}async function Bo(r){let t={ran:[],skipped:[],errors:[]};for(let e of sn){if(!r.permitted.includes(e))continue;let n=Io[e],s;try{s=await n.detect()}catch(i){t.errors.push({name:e,error:i?.message??String(i)});continue}if(!s.detected){t.skipped.push({name:e,detected:!1,description:s.description});continue}if(r.dryRun){t.ran.push({name:e,detected:!0,description:`(dry-run) would fix: ${s.description}`});continue}try{let i=await n.fix();t.ran.push({name:e,detected:!0,description:`${s.description} \u2014 ${i}`})}catch(i){t.errors.push({name:e,error:i?.message??String(i)})}}return t}var sn,Io,_t=rt(()=>{"use strict";ft();Rt();Fe();Ht();sn=["orphan-daemon","stale-lock","missing-search-root","corrupt-history-db","port-conflict-pred","node-version-mismatch","orphan-node-modules","orphan-venv","orphan-bundler-cache","orphan-cargo-target","dead-search-root"];Io={"orphan-daemon":{detect:So,fix:ko},"stale-lock":{detect:xo,fix:To},"missing-search-root":{detect:Eo,fix:Ro},"corrupt-history-db":{detect:Ao,fix:Po},"port-conflict-pred":{detect:Co,fix:Mo},"node-version-mismatch":{detect:Oo,fix:No},"orphan-node-modules":{detect:on,fix:_o},"orphan-venv":{detect:an,fix:$o},"orphan-bundler-cache":{detect:cn,fix:Lo},"orphan-cargo-target":{detect:ln,fix:Do},"dead-search-root":{detect:un,fix:Fo}}});var Be={};Ft(Be,{orchestrateProfile:()=>Wo});function pn(r,t,e,n,s){let i=r.summary(t);if(!i)return!1;if(e==="serving")return i.status==="serving";if(e==="healthy")return i.status==="serving"&&i.health==="healthy";let o=Date.now()-n;return i.status==="serving"&&i.health==="healthy"&&o>=s}async function dn(r,t,e,n,s){let i=Date.now();if(e!=="stable"){let c=await r.waitFor(t,e==="serving"?"serving":"healthy",n);return{reached:!c.timedOut,waitedMs:c.waitedMs}}let o=Date.now(),a=c=>{c?.app===t&&(o=Date.now())};r.on("event",a);try{for(;Date.now()-i<n;){if(pn(r,t,e,o,s))return{reached:!0,waitedMs:Date.now()-i};await new Promise(c=>setTimeout(c,500))}return{reached:pn(r,t,e,o,s),waitedMs:Date.now()-i}}finally{r.off("event",a)}}async function Wo(r,t,e){let n=Date.now(),s=t.profiles?.[e.profile];if(!s)return{error:`unknown profile: ${e.profile}`};let i=s.filter(m=>r.summary(m)!=null),o=Array.from(new Set(i.flatMap(m=>Wt(t.depends??{},m)))).filter(m=>r.summary(m)!=null),a=Gt(t.depends??{},o),c=[];for(let m of o){let d=r.summary(m);d&&(e.goal==="serving"&&d.status==="serving"||(e.goal==="healthy"||e.goal==="stable")&&d.status==="serving"&&d.health==="healthy")&&c.push(m)}if(e.dryRun){let m=o.filter(d=>!c.includes(d));return{profile:e.profile,goal:e.goal,perApp:m.map(d=>({name:d,reached:!1,tries:0})),totalMs:Date.now()-n,allReached:m.length===0,dryRun:!0,plannedOrder:a,alreadyHealthy:c}}let u=Math.max(5e3,Math.floor(e.timeoutMs/2)),h=e.stableMs??5e3,p=new Map;for(let m of o)p.set(m,{name:m,reached:!1,tries:0});for(let m of a)await Promise.all(m.map(async d=>{let g=r.summary(d);if(!g){p.set(d,{name:d,reached:!1,tries:0,error:"unknown app"});return}if(c.includes(d)){p.set(d,{name:d,reached:!0,tries:0});return}g.status!=="starting"&&g.status!=="compiling"&&g.status!=="serving"&&await r.start(d)})),await Promise.all(m.map(async d=>{if(p.get(d)?.reached)return;let g=await dn(r,d,e.goal,u,h),x=p.get(d);x.tries=1,x.waitedMs=g.waitedMs,x.reached=g.reached,p.set(d,x)}));let y=[...p.values()].filter(m=>!m.reached);if(y.length>0){let{runAutoFix:m,ALL_AUTO_FIX:d}=await Promise.resolve().then(()=>(_t(),jt)),g=t.doctor?.autoFix?.permitted??d,x=Math.max(5e3,e.timeoutMs-(Date.now()-n)),E=Math.max(5e3,Math.floor(x/Math.max(y.length,1))),w={ran:[]};try{w=await m({permitted:g,dryRun:!1})}catch{}let _=(w.ran??[]).map(A=>A.name);await Promise.all(y.map(async A=>{let C=p.get(A.name);C.tries=2;try{let $=await r.restart(A.name);$?.ok||(C.error=$?.error??"restart failed")}catch($){C.error=$?.message??String($)}let P=await dn(r,A.name,e.goal,E,h);if(C.waitedMs=(C.waitedMs??0)+P.waitedMs,C.reached=P.reached,!C.reached){let $=r.errors(A.name)??[];C.stillFailing=$.slice(0,3).map(T=>({file:T.parsed?.file??null,line:T.parsed?.line??null,code:T.parsed?.code??null,tool:T.parsed?.tool??null,message:T.parsed?.message??T.message}))}C.fixed=_,p.set(A.name,C)}))}let v=[...p.values()],l=v.every(m=>m.reached),f={profile:e.profile,goal:e.goal,perApp:v,totalMs:Date.now()-n,allReached:l};if(typeof e.budgetTokens=="number"&&e.budgetTokens>0){let m=e.budgetTokens,d=0,g=0;for(let x of v)if(x.stillFailing){let E=x.stillFailing.length*Ho;E>m?(d+=x.stillFailing.length,delete x.stillFailing):m-=E}for(;m<0||v.length*Uo>Math.max(m,e.budgetTokens/4);){let x=v.findIndex(E=>E.reached);if(x===-1)break;v.splice(x,1),g++}(d||g)&&(f._meta={omitted:{}},d&&(f._meta.omitted.stillFailing=d),g&&(f._meta.omitted.perApp=g))}return f}var Ho,Uo,He=rt(()=>{"use strict";qt();Ho=60,Uo=25});Rt();Pt();import Ji from"react";import Xi from"node:path";import{render as Ki}from"ink";import{pathToFileURL as zi}from"node:url";import{EventEmitter as Vs}from"node:events";import{spawn as ks}from"node:child_process";import br from"tree-kill";import xs from"strip-ansi";import zn from"node:crypto";var Yn=[/Local:\s+http/i,/Application bundle generation complete/i,/compiled successfully/i,/webpack compiled\s+(?:successfully|in\b)/i,/Angular Live Development Server is listening/i,/Storybook\s+[\d.]+\s+(?:for\s+\S+\s+)?started/i,/VITE\s+v[\d.]+\s+ready/i,/Quit the server with CONTROL-C/i,/Uvicorn running on http/i,/Application startup complete/i,/Puma starting in single mode/i,/Use Ctrl-C to stop/i,/Listening on tcp:\/\//i,/running on http/i,/serving HTTP on/i,/trunk serve.*at/i],Vn=[/Building\.\.\./i,/Compilation started/i,/Initial chunk files/i,/Compiling/i,/Watching for file changes with StatReloader/i,/Performing system checks/i,/watching files for changes/i,/building\.{3}/i,/Compiling \(/i],Zn=[/^\s*ERROR\b/,/\berror TS\d+/,/✘/,/\[ERROR\]/,/Cannot find module/i,/^FAIL\s+\S+/,/^\s*●\s+/,/^\s*(?:>\s+)?NX\s+.*failed/i,/^\s*Failed tasks:/,/^\s*Task\s+"[^"]+"\s+is continuous but exited with code\s+\d+/,/\bModule not found:/,/\[vite\]\s+(?:Internal server error|Pre-transform error)/i,/\[plugin:[^\]]+\]/i,/^\s*ERR!\s+/,/^\s*(?:Uncaught\s+)?(?:Error|TypeError|SyntaxError|ReferenceError|RangeError):\s+/,/^Traceback \(most recent call last\):/,/^\s*[A-Z][a-zA-Z]*Error:\s+/,/^\s*\[error\]\s+/i,/^panic:\s+/,/^thread\s+'[^']+'\s+panicked at/,/^error\[E\d+\]:/,/^\S+\.(?:go|rb|py|rs):\d+:\d+:/,/^\s*[A-Z][a-zA-Z]*\.[A-Z][a-zA-Z]*:\s+/,/^[A-Z][a-zA-Z]+(?:::[A-Z][a-zA-Z]+)+\s*[(:]/,/^[A-Z][a-zA-Z]*Error\s*\(/],Qn=/\berror TS(\d+)/,ts=/✘\s*\[ERROR\]\s*TS(\d+)/,es=/([A-Z]:[\\/][^\s:()]+|[^\s:()]+\.(?:tsx?|jsx?|mjs|cjs|vue|svelte|py|rb|go|rs)):(\d+):(\d+)/,hr=/\(([A-Z]:[\\/][^\s:()]+|[^\s:()]+\.(?:tsx?|jsx?|mjs|cjs|vue|svelte|py|rb|go|rs)):(\d+):(\d+)\)/,rs=/([A-Z]:[\\/][^\s:()]+|[^\s:()]+\.(?:tsx?|jsx?|mjs|cjs|vue|svelte))\((\d+),(\d+)\)\s*:/,gr=/File\s+"([^"]+\.py)",\s+line\s+(\d+)/,yr=/^\s*-->\s+([^\s:]+\.rs):(\d+):(\d+)/,ns=/^([^\s:()]+\.rb):(\d+):in\b/,ss=/^FAIL\s+(\S+\.(?:tsx?|jsx?|mjs|cjs))(?:\s|$)/,os=/^ERROR in\s+(\S+\.(?:tsx?|jsx?|mjs|cjs|vue|svelte))(?:[:\s](\d+):(\d+))?/,is=/^\s+([A-Z]:[\\/][^\s:()]+|[^\s:()]+\.(?:tsx?|jsx?|mjs|cjs|vue|svelte)):(\d+):(\d+):?\s*$/,as=[{tool:"vite",rx:/\[vite\]|\[plugin:vite:|transformWithEsbuild/i},{tool:"storybook",rx:/\bstorybook\b|^\s*ERR!\s|builder-vite/i},{tool:"jest",rx:/^FAIL\s|^\s*●\s+|\bjest\b/i},{tool:"nx",rx:/(?:>\s+)?NX\s+(?:\w|.*failed)|Failed tasks:|Nx errored|exited with code\s+\d+/i},{tool:"webpack",rx:/\bModule not found:|webpack compiled|webpack-dev-server/i},{tool:"esbuild",rx:/✘\s*\[ERROR\]|esbuild/i},{tool:"typescript",rx:/\berror TS\d+/},{tool:"django",rx:/\bdjango\b|StatReloader|manage\.py runserver/i},{tool:"rails",rx:/\brails\b|Puma starting|Booting (?:Puma|Rails)|ActionController|NameError\s*\(|\.rb:\d+:in/i},{tool:"fastapi",rx:/\buvicorn\b|fastapi|ASGI/i},{tool:"go-air",rx:/\bair v\d|building\.{3}|\.go:\d+:\d+/i},{tool:"rust-trunk",rx:/\btrunk\b|^error\[E\d+\]|^\s*-->\s+\S+\.rs:/i},{tool:"python",rx:/^Traceback \(most recent call last\):|^\s*File "[^"]+\.py"|[A-Z][a-zA-Z]*Error:\s/},{tool:"node",rx:/^\s*(?:Uncaught\s+)?(?:Error|TypeError|SyntaxError|ReferenceError|RangeError):/}];function cs(r){for(let{tool:t,rx:e}of as)if(e.test(r))return t}var ls=/Local:\s+(https?:\/\/\S+)/i,us=/Server running at\s+(https?:\/\/\S+)/i,ps=/listening on\s+(https?:\/\/\S+)/i,ds=/(?:listening|listen)\s+(https?:\/\/\S+)/i,fs=/Initial chunk files/i,ms=/Lazy chunk files/i,hs=/(Initial total|Lazy total)\s*\|?\s*([\d.]+)\s*(kB|MB|B)\b/i,gs=/^\s*\|?\s*([^\s|][^|]*?)\s*\|\s*([^|]+?)\s*\|\s*([\d.]+)\s*(kB|MB|B)\b/i;function ys(r){return zn.createHash("sha1").update(r).digest("hex").slice(0,16)}function vs(r){let t={message:r},e=r.match(ts)||r.match(Qn);e&&(t.code=`TS${e[1]}`);let n=r.match(rs)||r.match(hr)||r.match(es);if(n)t.file=n[1],t.line=Number(n[2]),t.col=Number(n[3]);else{let i=r.match(os);if(i)t.file=i[1],i[2]&&(t.line=Number(i[2])),i[3]&&(t.col=Number(i[3]));else{let o=r.match(ss);if(o)t.file=o[1];else{let a=r.match(yr);if(a)t.file=a[1],t.line=Number(a[2]),t.col=Number(a[3]);else{let c=r.match(gr);c&&(t.file=c[1],t.line=Number(c[2]))}}}}let s=cs(r);return s&&(t.tool=s),t}function bs(r,t){try{let e=new URL(r);return e.hostname==="0.0.0.0"||e.hostname==="[::]"?(e.hostname=t.includes(":")?`[${t}]`:t,e.toString().replace(/\/$/,"")):r.replace(/\/$/,"")}catch{return r}}function ws(r,t="127.0.0.1"){let e=r.match(ls)||r.match(us)||r.match(ps)||r.match(ds);if(!e)return null;let n=e[1].replace(/[),.;]+$/,"");return bs(n,t)}function Ss(r,t){if(fs.test(t))return r.bundle||(r.bundle={initialKB:0,lazyKB:0,files:[]}),r._bundleSection="initial",!1;if(ms.test(t))return r.bundle||(r.bundle={initialKB:0,lazyKB:0,files:[]}),r._bundleSection="lazy",!1;let e=t.match(hs);if(e&&r.bundle){let s=parseFloat(e[2]),i=e[3].toUpperCase(),o=Math.round(i==="MB"?s*1024:i==="B"?s/1024:s);return/Initial/i.test(e[1])?r.bundle.initialKB=o:r.bundle.lazyKB=o,!0}let n=t.match(gs);if(n&&r.bundle){let s=n[1].trim();if(/^(Initial|Lazy)\s+(total|chunk)/i.test(s))return!1;let i=n[4].toUpperCase(),o=parseFloat(n[3]),a=i==="MB"?o*1024:i==="B"?o/1024:o;return r.bundle.files.push({name:s,sizeKB:Math.round(a*10)/10}),!1}return!1}function vr(r,t){let e=t.match(is),n=e?null:t.match(hr),s=!e&&!n?t.match(yr):null,i=e??n??s;if(i&&r.lastErrorHash){let l=r.errors.get(r.lastErrorHash);l&&!l.parsed?.file&&(l.parsed={...l.parsed??{message:l.message},file:i[1],line:Number(i[2]),col:Number(i[3])})}else if(r.lastErrorHash){let l=t.match(gr),f=l?null:t.match(ns);if(l||f){let m=r.errors.get(r.lastErrorHash);if(m&&!m.parsed?.file){let d=l??f;m.parsed={...m.parsed??{message:m.message},file:d[1],line:Number(d[2])}}}}let o=t.trim();if(!o)return null;let a=r.status,c=!1,u,h=ws(o);h&&!r.announcedUrl&&(r.announcedUrl=h,u=h);let p=Ss(r,o),y;if(Yn.some(l=>l.test(o))){let l=r.status==="error"||!!r.recoveringFromError;if(r.status==="compiling"||r.status==="starting"||r.status==="error"){let f=Date.now();r.compileStartedAt!=null?(y=f-r.compileStartedAt,r.lastCompileMs=y,r.lastCompileAt=f,r.compileStartedAt=null,r.compileHistory.push(y),r.compileHistory.length>20&&r.compileHistory.splice(0,r.compileHistory.length-20)):r.lastCompileAt=f}r.status="serving",l&&(r.errors.clear(),r.recoveringFromError=!1)}else Vn.some(l=>l.test(o))&&(r.status==="starting"||r.status==="serving"||r.status==="error")&&(r.status==="error"&&(r.recoveringFromError=!0),r.compileStartedAt=Date.now(),r.status="compiling");let v;if(Zn.some(l=>l.test(o))){let l=ys(o),f=Date.now(),m=r.errors.get(l),d=!1,g;m?(m.count+=1,m.lastSeen=f,g=m):(g={message:o,count:1,firstSeen:f,lastSeen:f,parsed:vs(o)},r.errors.set(l,g),d=!0),r.lastErrorHash=l,v={entry:g,isNew:d},r.status="error"}return c=r.status!==a,{statusChanged:c,error:v,announcedUrl:u,bundleUpdated:p,compileMs:y}}var wr=500,Bt=class{child=null;stdoutBuf="";stderrBuf="";deps;stopping=!1;constructor(t){this.deps=t}isRunning(){return this.child!==null&&this.child.exitCode===null&&!this.stopping}start(){if(this.isRunning())return;let{app:t,port:e,state:n}=this.deps,s=Date.now();n.status="starting",n.startedAt=s,n.compileStartedAt=s,n.lastCompileMs=null,n.lastCompileAt=null,n.errors.clear(),n.logBuffer.length=0,n.lastStatusMessage=void 0;let o=`${this.deps.commandOverride||t.command} --port ${e}`,a={...process.env,...t.env||{},...this.deps.envOverride||{},PORT:String(e),FORCE_COLOR:"0"},c=ks(o,[],{cwd:t.workspaceRoot,shell:!0,env:a,windowsHide:!0});this.child=c,n.pid=c.pid??null,n.port=e,c.stdout?.on("data",u=>this.handleChunk(u,"stdout")),c.stderr?.on("data",u=>this.handleChunk(u,"stderr")),c.on("exit",(u,h)=>{let p=n.status,y=this.stopping;y?(n.status="stopped",n.lastStatusMessage=`stopped (code=${u??"null"}${h?`, ${h}`:""})`):u!==0?(n.status="error",n.lastStatusMessage=`process exited with code ${u}${h?` (${h})`:""}`):n.status="stopped",n.pid=null,n.health="unknown",this.child=null,this.stopping=!1,p!==n.status&&this.deps.onStatusChange?.(p,n.status,n.lastStatusMessage),this.deps.onExit?.(u,h,y),this.deps.onStateChange()}),c.on("error",u=>{n.status="error",n.lastStatusMessage=`spawn error: ${u.message}`,this.deps.onStateChange()}),this.deps.onStateChange()}handleChunk(t,e){let n=t.toString("utf8"),s=this[e==="stdout"?"stdoutBuf":"stderrBuf"]+=n,i=s.lastIndexOf(`
53
53
  `);if(i<0)return;let o=s.slice(0,i),a=s.slice(i+1);e==="stdout"?this.stdoutBuf=a:this.stderrBuf=a;let{state:c}=this.deps,u=!1;for(let h of o.split(/\r?\n/)){if(!h.length)continue;let p=xs(h),y=Date.now();c.lastLogTs=y,c.stale&&(c.stale=!1),c.logBuffer.push({ts:y,line:p}),c.logBuffer.length>wr&&c.logBuffer.splice(0,c.logBuffer.length-wr),this.deps.onLogLine?.(p);let v=c.status,l=vr(c,p);l?.statusChanged&&(u=!0,this.deps.onStatusChange?.(v,c.status)),l?.error&&this.deps.onErrorRecorded?.(l.error.entry,l.error.isNew),l?.compileMs!=null&&this.deps.onCompile?.(l.compileMs),l?.bundleUpdated&&this.deps.onBundleUpdate?.()}(u||o.length>0)&&this.deps.onStateChange()}async stop(){if(!this.child||this.stopping)return;this.stopping=!0;let t=this.child.pid;if(!t){this.child=null,this.stopping=!1;return}await new Promise(e=>{let n=!1,s=()=>{n||(n=!0,e())},i=()=>s();this.child?.once("exit",i),br(t,"SIGTERM",()=>{});let o=setTimeout(()=>{br(t,"SIGKILL",()=>{})},2e3),a=setTimeout(()=>{clearTimeout(o),s()},3e3);this.child?.once("exit",()=>{clearTimeout(o),clearTimeout(a),s()})})}};Ht();import tt from"node:fs";import Es from"node:path";var Ut=class{constructor(t,e){this.appName=t;this.cfg=e;this.filePath=Es.join(e.dir,`${t}.log`),this.open()}appName;cfg;fd=null;bytes=0;warned=!1;filePath;open(){try{tt.mkdirSync(this.cfg.dir,{recursive:!0});try{this.bytes=tt.statSync(this.filePath).size}catch{this.bytes=0}this.fd=tt.openSync(this.filePath,"a")}catch(t){this.warn(`open failed: ${t.message}`),this.fd=null}}write(t){if(this.fd!=null)try{let e=`${new Date().toISOString()} ${t}
54
54
  `,n=Buffer.from(e,"utf8");tt.writeSync(this.fd,n),this.bytes+=n.length,this.bytes>=this.cfg.maxBytesPerFile&&this.rotate()}catch(e){this.warn(`write failed: ${e.message}`)}}close(){if(this.fd!=null){try{tt.closeSync(this.fd)}catch{}this.fd=null}}rotate(){try{this.close();for(let t=this.cfg.maxFiles-1;t>=1;t--){let e=`${this.filePath}.${t}`,n=`${this.filePath}.${t+1}`;if(t+1>this.cfg.maxFiles-1){try{tt.rmSync(e,{force:!0})}catch{}continue}try{tt.existsSync(e)&&tt.renameSync(e,n)}catch{}}try{let t=`${this.filePath}.1`;tt.existsSync(this.filePath)&&tt.renameSync(this.filePath,t)}catch{}this.open()}catch(t){this.warn(`rotate failed: ${t.message}`)}}warn(t){this.warned||(this.warned=!0,process.stderr.write(`[daimon] warning: diskLogger(${this.appName}) ${t}
55
55
  `))}};qt();import{spawn as Tr}from"node:child_process";import xr from"tree-kill";import Er from"strip-ansi";var Rs=/Tests:\s+(?:(\d+)\s+failed,\s+)?(?:(\d+)\s+skipped,\s+)?(\d+)\s+passed(?:,\s+(\d+)\s+total)?/,As=/Test Suites:\s+(?:(\d+)\s+failed,\s+)?(\d+)\s+passed(?:,\s+(\d+)\s+total)?/,Ps=/Executed (\d+) of (\d+)(?:\s*\((\d+)\s*FAILED\))?/,Cs=/(\d+)\s+passed(?:.*?(\d+)\s+failed)?/i,Ms=/Tests\s+(?:(\d+)\s+failed\s*\|\s*)?(\d+)\s+passed(?:\s*\((\d+)\))?/,Os=/Test Files\s+(?:(\d+)\s+failed\s*\|\s*)?(\d+)\s+passed(?:\s*\((\d+)\))?/,Ns=/(?:(\d+)\s+failed,\s+)?(\d+)\s+passed(?:,\s+\d+\s+skipped)?\s+in\s+([\d.]+)s/,js=/(\d+)\s+examples?,\s+(\d+)\s+failures?/,_s=/^(ok|FAIL|---\s+FAIL)\s+\S+\s+([\d.]+)s/,$s=/test result:\s*(?:ok|FAILED)\.\s+(\d+)\s+passed;\s+(\d+)\s+failed/,Ls=/^\s*✕\s+(.+?)(?:\s+\((\d+)\s*ms\))?$/,Ds=/^\s*FAIL\s+(\S+\.(?:tsx?|jsx?|mjs|cjs|spec\.[a-z]+))/,Fs=/^FAILED\s+(\S+)::([^\s]+)/;function xe(r){let t=[],e;for(let n of r.split(/\r?\n/)){let s=n.match(Ds);if(s){e=s[1];continue}let i=n.match(Ls);if(i){t.push({name:i[1].trim(),file:e});continue}let o=n.match(Fs);if(o){t.push({name:o[2],file:o[1]});continue}}return t.slice(0,50)}function Is(r){let t=r.match(Rs);if(t){let y=t[1]?Number(t[1]):0,v=Number(t[3]),l=t[4]?Number(t[4]):v+y,f=r.match(As);return{passed:v,failed:y,total:l,suites:f?Number(f[3]??f[2]):void 0,framework:"jest",failedTests:y>0?xe(r):void 0}}let e=r.match(Ms);if(e){let y=e[1]?Number(e[1]):0,v=Number(e[2]),l=e[3]?Number(e[3]):v+y,f=r.match(Os);return{passed:v,failed:y,total:l,suites:f?Number(f[3]??f[2]):void 0,framework:"vitest",failedTests:y>0?xe(r):void 0}}let n=r.match(Ps);if(n){let y=Number(n[1]),v=Number(n[2]),l=n[3]?Number(n[3]):0;return{passed:y-l,failed:l,total:v,framework:"karma"}}let s=r.match(Cs);if(s&&/playwright/i.test(r)){let y=Number(s[1]),v=s[2]?Number(s[2]):0;return{passed:y,failed:v,total:y+v,framework:"playwright"}}let i=r.match(Ns);if(i){let y=i[1]?Number(i[1]):0,v=Number(i[2]);return{passed:v,failed:y,total:v+y,durationMs:Math.round(Number(i[3])*1e3),framework:"pytest",failedTests:y>0?xe(r):void 0}}let o=r.match(js);if(o){let y=Number(o[1]),v=Number(o[2]);return{passed:y-v,failed:v,total:y,framework:"rspec"}}let a=r.match($s);if(a){let y=Number(a[1]),v=Number(a[2]);return{passed:y,failed:v,total:y+v,framework:"cargo"}}let c=0,u=0,h=0,p=!1;for(let y of r.split(/\r?\n/)){let v=y.match(_s);v&&(p=!0,h+=Math.round(Number(v[2])*1e3),v[1]==="ok"?c++:u++)}if(p)return{passed:c,failed:u,total:c+u,durationMs:h,framework:"go"};if(s){let y=Number(s[1]),v=s[2]?Number(s[2]):0;return{passed:y,failed:v,total:y+v,framework:"playwright"}}return null}function Rr(r,t,e){let n=e.length?" -- "+e.join(" "):"";return r.workspaceType==="nx"?`npx nx run ${r.name}:${t}${n}`:r.workspaceType==="angular"?`npx ng run ${r.name}:${t}${n}`:`npx ${t}${n}`}function Ar(r,t,e=[]){return new Promise(n=>{let s=Date.now(),i=Rr(r,t,e),o=Tr(i,[],{cwd:r.workspaceRoot,shell:!0,env:{...process.env,...r.env||{},FORCE_COLOR:"0"},windowsHide:!0}),a=[],c="",u=h=>{c+=h.toString("utf8");let p=c.lastIndexOf(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "daimon",
3
- "version": "0.8.0",
3
+ "version": "0.8.1",
4
4
  "description": "Local dev-server manager for Angular/Nx/Vite/Storybook — TUI, loopback HTTP API, JSON CLI, and MCP server for Claude Code",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "author": "Yosi Azulay (https://flycotech.com)",
@@ -1 +0,0 @@
1
- import{a as J,b as X,c as Z,d as ee,e as te}from"./chunk-3WKRVGPT.js";import{a as Y}from"./chunk-WAN7TQQW.js";import"./chunk-NDSAQ2HK.js";import{b as H,c as W,d as Q,e as K}from"./chunk-Q772THBA.js";import{a as G,b as U}from"./chunk-K7S4ITPJ.js";import"./chunk-YNQPX5G6.js";import"./chunk-7C772RJ3.js";import"./chunk-6WZJCF24.js";import"./chunk-KLH6B22T.js";import{c as z}from"./chunk-EIWOTZT3.js";import{i as j,j as q}from"./chunk-LBL7Z5BE.js";import"./chunk-Y6B6X4Y6.js";import{Db as O,Eb as p,Fb as d,Gb as F,Hb as B,Ib as v,Jb as h,Kb as u,Lb as r,Mb as a,Nb as E,Sb as b,Ub as x,Wa as M,Wb as c,Ya as V,_a as o,ea as $,fc as N,gc as T,ic as s,ja as f,jc as m,ka as g,kc as y,mc as L,pa as D,pb as R,sc as S,ta as k,xc as P,yc as A}from"./chunk-K43KW4K2.js";var I=t=>["/apps",t],w=(t,n)=>n.key;function oe(t,n){t&1&&E(0,"dm-skeleton",3)}function re(t,n){if(t&1&&(s(0," \xB7 workspace "),r(1,"dm-mono"),s(2),a()),t&2){let e=c(2);o(2),m(e.workspace())}}function ae(t,n){if(t&1&&(s(0),p(1,re,3,1)),t&2){let e=c();L(" ",e.totalErrors()," ",e.totalErrors()===1?"error":"errors"," across ",e.appsWithErrors()," ",e.appsWithErrors()===1?"app":"apps"," "),o(),d(e.workspace()?1:-1)}}function le(t,n){if(t&1){let e=b();r(0,"button",20),x("click",function(){f(e);let l=c();return g(l.onQuery(""))}),r(1,"span",6),s(2,"close"),a()()}}function se(t,n){if(t&1){let e=b();r(0,"button",21),x("click",function(){let l=f(e).$implicit,_=c();return g(_.setSeverity(l.key))}),s(1),a()}if(t&2){let e=n.$implicit,i=c();T("active",i.severity()===e.key),O("aria-selected",i.severity()===e.key),o(),m(e.label)}}function ce(t,n){if(t&1){let e=b();r(0,"button",21),x("click",function(){let l=f(e).$implicit,_=c();return g(_.setGroupBy(l.key))}),s(1),a()}if(t&2){let e=n.$implicit,i=c();T("active",i.groupBy()===e.key),O("aria-selected",i.groupBy()===e.key),o(),m(e.label)}}function pe(t,n){t&1&&(r(0,"article",22),E(1,"div",23),r(2,"div",24),E(3,"dm-skeleton",25)(4,"dm-skeleton",26)(5,"dm-skeleton",27),a()())}function de(t,n){if(t&1&&(r(0,"div",16),v(1,pe,6,0,"article",22,B),a()),t&2){let e=c();o(),h(e.skeletonItems)}}function me(t,n){t&1&&(r(0,"dm-empty",17)(1,"div",28)(2,"a",29)(3,"span",6),s(4,"home"),a(),s(5,"Go home "),a()()())}function _e(t,n){if(t&1&&E(0,"dm-empty",18),t&2){let e=c();u("title","Clean \u2014 0 errors across "+e.api.apps().length+" apps")}}function ue(t,n){t&1&&E(0,"dm-empty",19)}function Ce(t,n){if(t&1){let e=b();r(0,"div",30)(1,"span",6),s(2,"info"),a(),r(3,"span"),s(4,"None of these errors include a file path on the same line as the error. Try "),r(5,"button",31),x("click",function(){f(e);let l=c(2);return g(l.setGroupBy("app"))}),s(6,"group by app"),a(),s(7,"."),a()()}}function xe(t,n){if(t&1&&E(0,"dm-status-pill",35),t&2){let e=c().$implicit;u("status",e.app.status)("health",e.app.health)}}function fe(t,n){if(t&1&&s(0),t&2){let e=c(3).$implicit;y(":",e.col)}}function ge(t,n){if(t&1&&(r(0,"span",46),s(1),p(2,fe,1,1),a()),t&2){let e=c(2).$implicit;o(),y(":",e.line),o(),d(e.col?2:-1)}}function ye(t,n){if(t&1){let e=b();r(0,"a",45),x("click",function(l){f(e);let _=c().$implicit,C=c(4);return g(C.openEditor(l,_))}),r(1,"dm-mono"),s(2),p(3,ge,3,2,"span",46),a()()}if(t&2){let e=c().$implicit,i=c(4);u("href",i.editorUrl(e),M)("matTooltip",e.file),o(2),m(i.shortPath(e.file)),o(),d(e.line?3:-1)}}function ve(t,n){t&1&&(r(0,"span",41)(1,"dm-mono"),s(2,"\u2014"),a()())}function he(t,n){if(t&1&&(r(0,"span",42)(1,"dm-mono"),s(2),a()()),t&2){let e=c().$implicit;o(2),m(e.code)}}function be(t,n){if(t&1&&(r(0,"span",44),s(1),a()),t&2){let e=c().$implicit;o(),y("\xD7",e.count)}}function Pe(t,n){if(t&1&&(r(0,"div",39),p(1,ye,4,4,"a",40)(2,ve,3,0,"span",41),p(3,he,3,1,"span",42),r(4,"span",43),s(5),a(),p(6,be,2,1,"span",44),a()),t&2){let e=n.$implicit,i=c().$implicit;o(),d(e.file?1:i.allMissingFile?-1:2),o(2),d(e.code?3:-1),o(),u("matTooltip",e.message),o(),m(e.message),o(),d(e.count>1?6:-1)}}function Ee(t,n){if(t&1){let e=b();r(0,"mat-expansion-panel",32)(1,"mat-expansion-panel-header")(2,"mat-panel-title"),E(3,"div",33),r(4,"span",34)(5,"dm-mono"),s(6),a()(),p(7,xe,1,2,"dm-status-pill",35),r(8,"span",36),s(9),a()(),r(10,"mat-panel-description")(11,"a",37),x("click",function(l){return f(e),g(l.stopPropagation())}),s(12," Open app"),r(13,"span",6),s(14,"chevron_right"),a()()()(),r(15,"div",38),v(16,Pe,7,5,"div",39,F),a()()}if(t&2){let e=n.$implicit,i=c(3);o(3),N("background",i.tone(e.workspaceLabel)),o(3),m(e.key),o(),d(e.app?7:-1),o(2),m(e.errors.length),o(2),u("routerLink",S(8,I,e.key)),o(4),T("rows-nofile",e.allMissingFile),o(),h(e.errors)}}function ke(t,n){if(t&1&&v(0,Ee,18,10,"mat-expansion-panel",32,w),t&2){let e=c(2);h(e.byApp())}}function we(t,n){if(t&1&&(r(0,"span",42)(1,"dm-mono"),s(2),a()()),t&2){let e=c().$implicit;o(2),m(e.code)}}function Me(t,n){if(t&1&&s(0),t&2){let e=c(2).$implicit;y(":",e.col)}}function Fe(t,n){if(t&1){let e=b();r(0,"a",49),x("click",function(l){f(e);let _=c().$implicit,C=c(4);return g(C.openEditor(l,_))}),r(1,"dm-mono"),s(2),p(3,Me,1,1),a()()}if(t&2){let e=c().$implicit,i=c(4);u("href",i.editorUrl(e),M),o(2),y(":",e.line),o(),d(e.col?3:-1)}}function Te(t,n){if(t&1&&(r(0,"span",44),s(1),a()),t&2){let e=c().$implicit;o(),y("\xD7",e.count)}}function Se(t,n){if(t&1){let e=b();r(0,"div",39)(1,"a",47),x("click",function(l){return f(e),g(l.stopPropagation())}),r(2,"dm-mono"),s(3),a()(),p(4,we,3,1,"span",42),r(5,"span",43),s(6),a(),p(7,Fe,4,3,"a",48),p(8,Te,2,1,"span",44),a()}if(t&2){let e=n.$implicit;o(),u("routerLink",S(7,I,e.app)),o(2),m(e.app),o(),d(e.code?4:-1),o(),u("matTooltip",e.message),o(),m(e.message),o(),d(e.line?7:-1),o(),d(e.count>1?8:-1)}}function Oe(t,n){if(t&1&&(r(0,"mat-expansion-panel",32)(1,"mat-expansion-panel-header")(2,"mat-panel-title")(3,"span",34)(4,"dm-mono"),s(5),a()(),r(6,"span",36),s(7),a()()(),r(8,"div",38),v(9,Se,9,9,"div",39,F),a()()),t&2){let e=n.$implicit,i=c(3);o(5),m(i.shortPath(e.key)),o(2),m(e.errors.length),o(2),h(e.errors)}}function Ie(t,n){if(t&1&&v(0,Oe,11,2,"mat-expansion-panel",32,w),t&2){let e=c(2);h(e.byFile())}}function $e(t,n){t&1&&(r(0,"span",50),s(1),a()),t&2&&(o(),m(n))}function De(t,n){if(t&1&&s(0),t&2){let e=c(2).$implicit;y(":",e.col)}}function Ve(t,n){if(t&1&&(r(0,"span",46),s(1),p(2,De,1,1),a()),t&2){let e=c().$implicit;o(),y(":",e.line),o(),d(e.col?2:-1)}}function Re(t,n){if(t&1&&(r(0,"span",44),s(1),a()),t&2){let e=c().$implicit;o(),y("\xD7",e.count)}}function Be(t,n){if(t&1){let e=b();r(0,"div",39)(1,"a",47),x("click",function(l){return f(e),g(l.stopPropagation())}),r(2,"dm-mono"),s(3),a()(),r(4,"a",45),x("click",function(l){let _=f(e).$implicit,C=c(4);return g(C.openEditor(l,_))}),r(5,"dm-mono"),s(6),p(7,Ve,3,2,"span",46),a()(),r(8,"span",43),s(9),a(),p(10,Re,2,1,"span",44),a()}if(t&2){let e=n.$implicit,i=c(4);o(),u("routerLink",S(9,I,e.app)),o(2),m(e.app),o(),u("href",i.editorUrl(e),M)("matTooltip",e.file),o(2),m(i.shortPath(e.file)),o(),d(e.line?7:-1),o(),u("matTooltip",e.message),o(),m(e.message),o(),d(e.count>1?10:-1)}}function Ne(t,n){if(t&1&&(r(0,"mat-expansion-panel",32)(1,"mat-expansion-panel-header")(2,"mat-panel-title")(3,"span",34)(4,"dm-mono"),s(5),a()(),p(6,$e,2,1,"span",50),r(7,"span",36),s(8),a()()(),r(9,"div",38),v(10,Be,11,11,"div",39,F),a()()),t&2){let e,i=n.$implicit,l=c(3);o(5),m(i.key),o(),d((e=l.codeHint(i.key))?6:-1,e),o(2),m(i.errors.length),o(2),h(i.errors)}}function Le(t,n){if(t&1&&v(0,Ne,12,3,"mat-expansion-panel",32,w),t&2){let e=c(2);h(e.byCode())}}function Ae(t,n){if(t&1&&s(0),t&2){let e=c(3).$implicit;y(":",e.col)}}function ze(t,n){if(t&1&&(r(0,"span",46),s(1),p(2,Ae,1,1),a()),t&2){let e=c(2).$implicit;o(),y(":",e.line),o(),d(e.col?2:-1)}}function je(t,n){if(t&1){let e=b();r(0,"a",45),x("click",function(l){f(e);let _=c().$implicit,C=c(4);return g(C.openEditor(l,_))}),r(1,"dm-mono"),s(2),p(3,ze,3,2,"span",46),a()()}if(t&2){let e=c().$implicit,i=c(4);u("href",i.editorUrl(e),M)("matTooltip",e.file),o(2),m(i.shortPath(e.file)),o(),d(e.line?3:-1)}}function Ge(t,n){t&1&&(r(0,"span",41)(1,"dm-mono"),s(2,"\u2014"),a()())}function Ue(t,n){if(t&1&&(r(0,"span",42)(1,"dm-mono"),s(2),a()()),t&2){let e=c().$implicit;o(2),m(e.code)}}function qe(t,n){if(t&1&&(r(0,"span",44),s(1),a()),t&2){let e=c().$implicit;o(),y("\xD7",e.count)}}function He(t,n){if(t&1){let e=b();r(0,"div",39)(1,"a",47),x("click",function(l){return f(e),g(l.stopPropagation())}),r(2,"dm-mono"),s(3),a()(),p(4,je,4,4,"a",40)(5,Ge,3,0,"span",41),p(6,Ue,3,1,"span",42),r(7,"span",43),s(8),a(),p(9,qe,2,1,"span",44),a()}if(t&2){let e=n.$implicit;o(),u("routerLink",S(7,I,e.app)),o(2),m(e.app),o(),d(e.file?4:5),o(2),d(e.code?6:-1),o(),u("matTooltip",e.message),o(),m(e.message),o(),d(e.count>1?9:-1)}}function We(t,n){if(t&1&&(r(0,"mat-expansion-panel",32)(1,"mat-expansion-panel-header")(2,"mat-panel-title")(3,"span",51),s(4),a(),r(5,"span",36),s(6),a()()(),r(7,"div",38),v(8,He,10,9,"div",39,F),a()()),t&2){let e=n.$implicit;o(3),O("data-tool",e.key),o(),m(e.key),o(2),m(e.errors.length),o(2),h(e.errors)}}function Qe(t,n){if(t&1&&v(0,We,10,3,"mat-expansion-panel",32,w),t&2){let e=c(2);h(e.byTool())}}function Ke(t,n){if(t&1&&(p(0,Ce,8,0,"div",30),r(1,"div",16),p(2,ke,2,0)(3,Ie,2,0)(4,Le,2,0)(5,Qe,2,0),a()),t&2){let e,i=c();d(i.groupBy()==="file"&&i.allFilesMissing()?0:-1),o(2),d((e=i.groupBy())==="app"?2:e==="file"?3:e==="code"?4:e==="tool"?5:-1)}}var ne="daimon.workspace",Ye={TS2322:"Type is not assignable to target type",TS2345:"Argument type mismatch",TS2339:"Property does not exist on type",TS18046:"Variable is of type unknown",TS2304:"Cannot find name",TS7006:"Parameter implicitly has an any type",TS6133:"Declared but never used",TS2769:"No overload matches this call"},ie=class t{api=$(q);destroyRef=$(D);raw=k(new Map);loading=k(!1);query=k("");severity=k("with-errors");groupBy=k("app");workspace=k(null);skeletonItems=[0,1,2];severityFilters=[{key:"all",label:"all"},{key:"with-errors",label:"with-errors"},{key:"code:TS",label:"code:TS*"},{key:"code:other",label:"code:other"}];groupOptions=[{key:"app",label:"app"},{key:"file",label:"file"},{key:"code",label:"code"},{key:"tool",label:"tool"}];tone=Y;appsByName=P(()=>{let n=new Map;for(let e of this.api.apps())n.set(e.name,e);return n});flat=P(()=>{let n=[],e=this.appsByName();for(let[i,l]of this.raw()){let _=e.get(i);for(let C of l)n.push({app:i,workspaceLabel:_?.workspaceLabel??null,file:C.parsed?.file??"",line:C.parsed?.line??null,col:C.parsed?.col??null,code:C.parsed?.code??"",message:C.parsed?.message??C.message??"",count:C.count??1,tool:C.parsed?.tool??""})}return n});totalErrors=P(()=>this.flat().reduce((n,e)=>n+e.count,0));appsWithErrors=P(()=>{let n=new Set;for(let e of this.flat())n.add(e.app);return n.size});filteredFlat=P(()=>{let n=this.query().trim().toLowerCase(),e=this.severity(),i=this.workspace();return this.flat().filter(l=>!(i&&l.workspaceLabel!==i||(e==="with-errors"&&!l.code&&l.file,e==="code:TS"&&!/^TS\d+/i.test(l.code))||e==="code:other"&&/^TS\d+/i.test(l.code)||n&&!`${l.file} ${l.code} ${l.message}`.toLowerCase().includes(n)))});byApp=P(()=>{let n=new Map;for(let i of this.filteredFlat()){let l=n.get(i.app);l?l.push(i):n.set(i.app,[i])}let e=this.appsByName();return Array.from(n.entries()).map(([i,l])=>({key:i,app:e.get(i)??null,workspaceLabel:e.get(i)?.workspaceLabel??null,errors:l,allMissingFile:l.every(_=>!_.file)})).sort((i,l)=>l.errors.length-i.errors.length)});byFile=P(()=>{let n=new Map;for(let e of this.filteredFlat()){let i=e.file||"(no file detected)",l=n.get(i);l?l.push(e):n.set(i,[e])}return Array.from(n.entries()).map(([e,i])=>({key:e,errors:i})).sort((e,i)=>i.errors.length-e.errors.length)});allFilesMissing=P(()=>{let n=this.filteredFlat();return n.length?n.every(e=>!e.file):!1});byCode=P(()=>{let n=new Map;for(let e of this.filteredFlat()){let i=e.code||"(no-code)",l=n.get(i);l?l.push(e):n.set(i,[e])}return Array.from(n.entries()).map(([e,i])=>({key:e,errors:i})).sort((e,i)=>i.errors.length-e.errors.length)});byTool=P(()=>{let n=new Map;for(let e of this.filteredFlat()){let i=e.tool||"(unknown)",l=n.get(i);l?l.push(e):n.set(i,[e])}return Array.from(n.entries()).map(([e,i])=>({key:e,errors:i})).sort((e,i)=>i.errors.length-e.errors.length)});constructor(){this.workspace.set(localStorage.getItem(ne));let n=e=>this.workspace.set(e.detail??null);window.addEventListener("daimon:workspace",n),this.destroyRef.onDestroy(()=>window.removeEventListener("daimon:workspace",n)),A(()=>{this.api.apps().map(i=>i.name).sort().join("|")&&this.fetchAll()})}async ngOnInit(){this.api.apps().length===0&&!this.api.ready()?await this.api.refresh():await this.fetchAll()}ngOnDestroy(){}onStorage(n){n.key===ne&&this.workspace.set(n.newValue)}refresh(){this.fetchAll()}onQuery(n){this.query.set(n)}setSeverity(n){this.severity.set(n)}setGroupBy(n){this.groupBy.set(n)}codeHint(n){return Ye[n]??""}shortPath(n){if(!n)return"\u2014";let e=n.split(/[\\/]/);return e.length<=3?n:"\u2026/"+e.slice(-2).join("/")}editorUrl(n){if(!n.file)return"#";let e=n.line??1,i=n.col??1;return`vscode://file/${n.file}:${e}:${i}`}openEditor(n,e){if(!e.file){n.preventDefault();return}n.preventDefault(),window.open(this.editorUrl(e),"_self")}async fetchAll(){if(!this.loading()){this.loading.set(!0);try{let n=this.api.apps(),e=await Promise.all(n.map(async l=>[l.name,await this.api.appErrors(l.name)])),i=new Map;for(let[l,_]of e)i.set(l,_);this.raw.set(i)}finally{this.loading.set(!1)}}}static \u0275fac=function(e){return new(e||t)};static \u0275cmp=R({type:t,selectors:[["dm-errors-panel"]],hostBindings:function(e,i){e&1&&x("storage",function(_){return i.onStorage(_)},V)},decls:31,vars:7,consts:[[1,"dm-page"],[1,"dm-page-header"],[1,"dm-page-sub"],["width","14rem","height",".875rem"],[1,"dm-header-actions"],["type","button","matTooltip","Refresh","aria-label","Refresh",1,"ib",3,"click","disabled"],[1,"material-symbols-outlined"],[1,"dm-filterbar"],[1,"dm-search"],[1,"material-symbols-outlined","dm-search-icon"],["type","search","placeholder","Filter by file, code, or message\u2026","aria-label","Filter errors",3,"input","value"],["type","button","aria-label","Clear",1,"dm-search-clear"],["role","tablist","aria-label","Severity filter",1,"dm-chips"],["type","button","role","tab",1,"dm-chip",3,"active"],["role","tablist","aria-label","Group by",1,"dm-chips"],[1,"dm-chips-label"],[1,"dm-cards"],["icon","error","title","No apps to scan","hint","Discover some apps first"],["icon","check_circle","hint","The last build was clean. Keep going.",3,"title"],["icon","filter_alt_off","title","No matches","hint","Try clearing the search or severity filter"],["type","button","aria-label","Clear",1,"dm-search-clear",3,"click"],["type","button","role","tab",1,"dm-chip",3,"click"],[1,"dm-card-sk"],[1,"dm-sk-accent"],[1,"dm-sk-body"],["width","40%","height","1.125rem"],["width","70%","height",".875rem"],["width","55%","height",".875rem"],[1,"dm-empty-actions"],["routerLink","/",1,"dm-link-btn"],[1,"dm-hint"],["type","button",1,"dm-link",3,"click"],["expanded","",1,"dm-panel"],[1,"ac"],[1,"ttl"],[3,"status","health"],[1,"eb"],[1,"lnk",3,"click","routerLink"],[1,"rows"],[1,"row"],[1,"loc",3,"href","matTooltip"],[1,"loc","dim"],[1,"code"],[1,"msg",3,"matTooltip"],[1,"cnt"],[1,"loc",3,"click","href","matTooltip"],[1,"dim"],[1,"loc",3,"click","routerLink"],[1,"dim","ln",3,"href"],[1,"dim","ln",3,"click","href"],[1,"hint"],[1,"tool-chip"]],template:function(e,i){e&1&&(r(0,"div",0)(1,"header",1)(2,"div")(3,"h1"),s(4,"Errors"),a(),r(5,"div",2),p(6,oe,1,0,"dm-skeleton",3)(7,ae,2,5),a()(),r(8,"div",4)(9,"button",5),x("click",function(){return i.refresh()}),r(10,"span",6),s(11,"refresh"),a()()()(),r(12,"div",7)(13,"div",8)(14,"span",9),s(15,"search"),a(),r(16,"input",10),x("input",function(_){return i.onQuery(_.target.value)}),a(),p(17,le,3,0,"button",11),a(),r(18,"div",12),v(19,se,2,4,"button",13,w),a(),r(21,"div",14)(22,"span",15),s(23,"Group by"),a(),v(24,ce,2,4,"button",13,w),a()(),p(26,de,3,0,"div",16)(27,me,6,0,"dm-empty",17)(28,_e,1,1,"dm-empty",18)(29,ue,1,0,"dm-empty",19)(30,Ke,6,2),a()),e&2&&(o(6),d(i.loading()?6:7),o(3),u("disabled",i.loading()),o(),T("spin",i.loading()),o(6),u("value",i.query()),o(),d(i.query()?17:-1),o(2),h(i.severityFilters),o(5),h(i.groupOptions),o(2),d(i.loading()&&!i.raw().size?26:i.api.apps().length===0?27:i.totalErrors()===0?28:i.filteredFlat().length===0?29:30))},dependencies:[z,te,J,X,ee,Z,j,U,G,H,W,Q,K],styles:["[_nghost-%COMP%]{display:block}.dm-page[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:1rem}.dm-page-header[_ngcontent-%COMP%]{display:flex;align-items:flex-end;justify-content:space-between;gap:1rem}.dm-page-header[_ngcontent-%COMP%] h1[_ngcontent-%COMP%]{margin:0;font:400 1.5rem/2rem Roboto}.dm-page-sub[_ngcontent-%COMP%]{font:400 .8125rem/1.25rem Roboto;color:var(--mat-sys-on-surface-variant);margin-top:.25rem;display:flex;gap:.25rem;flex-wrap:wrap;align-items:center}.dm-header-actions[_ngcontent-%COMP%]{display:flex;gap:.5rem}.ib[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;background:transparent;border:1px solid var(--mat-sys-outline-variant);border-radius:10px;color:var(--mat-sys-on-surface-variant);cursor:pointer}.ib[_ngcontent-%COMP%]:hover:not(:disabled){background:var(--mat-sys-surface-container-high);color:var(--mat-sys-on-surface)}.ib[_ngcontent-%COMP%]:disabled{opacity:.55;cursor:not-allowed}.ib[_ngcontent-%COMP%] .material-symbols-outlined[_ngcontent-%COMP%]{font-size:20px}.spin[_ngcontent-%COMP%]{animation:_ngcontent-%COMP%_dm-spin 1s linear infinite}@keyframes _ngcontent-%COMP%_dm-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.spin[_ngcontent-%COMP%]{animation:none}}.dm-filterbar[_ngcontent-%COMP%]{position:sticky;top:0;z-index:2;display:flex;align-items:center;gap:.75rem;flex-wrap:wrap;padding:.5rem;background:var(--mat-sys-surface);border:1px solid var(--mat-sys-outline-variant);border-radius:12px}.dm-search[_ngcontent-%COMP%]{position:relative;flex:1;min-width:220px;display:inline-flex;align-items:center;background:var(--mat-sys-surface-container);border:1px solid var(--mat-sys-outline-variant);border-radius:10px}.dm-search[_ngcontent-%COMP%]:focus-within{border-color:var(--mat-sys-primary)}.dm-search[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{flex:1;border:0;outline:0;background:transparent;padding:8px 36px;font:400 .875rem/1.25rem Roboto;color:var(--mat-sys-on-surface)}.dm-search[_ngcontent-%COMP%] input[_ngcontent-%COMP%]::placeholder{color:var(--mat-sys-on-surface-variant)}.dm-search-icon[_ngcontent-%COMP%]{position:absolute;left:10px;pointer-events:none;font-size:18px;color:var(--mat-sys-on-surface-variant)}.dm-search-clear[_ngcontent-%COMP%]{position:absolute;right:6px;background:transparent;border:0;cursor:pointer;color:var(--mat-sys-on-surface-variant);width:24px;height:24px;border-radius:999px;display:inline-flex;align-items:center;justify-content:center}.dm-search-clear[_ngcontent-%COMP%]:hover{background:var(--mat-sys-surface-container-high)}.dm-search-clear[_ngcontent-%COMP%] .material-symbols-outlined[_ngcontent-%COMP%]{font-size:16px}.dm-chips[_ngcontent-%COMP%]{display:inline-flex;align-items:center;padding:2px;border-radius:10px;background:var(--mat-sys-surface-container);border:1px solid var(--mat-sys-outline-variant);gap:2px}.dm-chips-label[_ngcontent-%COMP%]{font:500 .6875rem/1rem Roboto;text-transform:uppercase;letter-spacing:.04rem;color:var(--mat-sys-on-surface-variant);padding:0 .5rem 0 .25rem}.dm-chip[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:.375rem;padding:5px 10px;border-radius:8px;background:transparent;border:0;color:var(--mat-sys-on-surface-variant);cursor:pointer;font:500 .8125rem/1rem Roboto}.dm-chip[_ngcontent-%COMP%]:hover{color:var(--mat-sys-on-surface)}.dm-chip.active[_ngcontent-%COMP%]{background:var(--mat-sys-surface);color:var(--mat-sys-primary);box-shadow:var(--mat-sys-level1)}.dm-cards[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:.75rem}.dm-hint[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;border-radius:10px;background:color-mix(in oklch,var(--mat-sys-tertiary) 10%,transparent);border:1px solid color-mix(in oklch,var(--mat-sys-tertiary) 24%,transparent);color:var(--mat-sys-on-surface);font:400 .8125rem/1.25rem Roboto}.dm-hint[_ngcontent-%COMP%] .material-symbols-outlined[_ngcontent-%COMP%]{font-size:18px;color:var(--mat-sys-tertiary)}.dm-hint[_ngcontent-%COMP%] .dm-link[_ngcontent-%COMP%]{background:transparent;border:0;padding:0;color:var(--mat-sys-primary);cursor:pointer;font:500 .8125rem/1.25rem Roboto;text-decoration:underline}.dm-panel[_ngcontent-%COMP%]{background:var(--mat-sys-surface-container-low)!important;border:1px solid var(--mat-sys-outline-variant);border-radius:14px!important;overflow:hidden;box-shadow:none!important}.dm-panel.mat-expanded[_ngcontent-%COMP%]{box-shadow:var(--mat-sys-level1)!important} .dm-panel .mat-expansion-panel-header{padding:0 1rem;height:56px;background:var(--mat-sys-surface-container-low)} .dm-panel .mat-expansion-panel-header:hover{background:var(--mat-sys-surface-container)!important} .dm-panel .mat-expansion-panel-body{padding:0 1rem 1rem} .dm-panel .mat-expansion-panel-content{background:var(--mat-sys-surface-container-low)}.ac[_ngcontent-%COMP%]{width:4px;height:24px;border-radius:2px;margin-right:.5rem}.ttl[_ngcontent-%COMP%]{font:500 .9375rem/1.25rem Roboto;display:inline-flex;align-items:center;gap:.5rem}.hint[_ngcontent-%COMP%]{font:400 .75rem/1rem Roboto;color:var(--mat-sys-on-surface-variant);margin-left:.5rem}mat-panel-title[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;flex:1;min-width:0}mat-panel-description[_ngcontent-%COMP%]{justify-content:flex-end;color:var(--mat-sys-on-surface-variant)}.eb[_ngcontent-%COMP%]{display:inline-flex;align-items:center;padding:1px 8px;border-radius:999px;font:600 .75rem/1rem Roboto;background:color-mix(in oklch,var(--mat-sys-error) 14%,transparent);color:var(--mat-sys-error);border:1px solid color-mix(in oklch,var(--mat-sys-error) 30%,transparent);margin-left:.25rem}.lnk[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:.125rem;color:var(--mat-sys-primary);text-decoration:none;font:500 .8125rem/1.25rem Roboto}.lnk[_ngcontent-%COMP%]:hover{text-decoration:underline}.lnk[_ngcontent-%COMP%] .material-symbols-outlined[_ngcontent-%COMP%]{font-size:16px}.rows[_ngcontent-%COMP%]{display:flex;flex-direction:column}.row[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(0,1.4fr) auto minmax(0,2fr) auto;align-items:center;gap:.75rem;padding:.5rem .25rem;border-bottom:1px solid var(--mat-sys-outline-variant)}.rows-nofile[_ngcontent-%COMP%] .row[_ngcontent-%COMP%]{grid-template-columns:auto minmax(0,1fr) auto}.row[_ngcontent-%COMP%]:last-child{border-bottom:0}.row[_ngcontent-%COMP%]:hover{background:var(--mat-sys-surface-container)}.loc[_ngcontent-%COMP%]{color:var(--mat-sys-primary);text-decoration:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.loc[_ngcontent-%COMP%]:hover{text-decoration:underline}.dim[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant)}.ln[_ngcontent-%COMP%]{justify-self:end}.code[_ngcontent-%COMP%]{display:inline-flex;align-items:center;padding:1px 8px;border-radius:6px;background:color-mix(in oklch,var(--mat-sys-tertiary) 14%,transparent);color:var(--mat-sys-tertiary);border:1px solid color-mix(in oklch,var(--mat-sys-tertiary) 28%,transparent);font-weight:500}.tool-chip[_ngcontent-%COMP%]{display:inline-flex;align-items:center;padding:2px 10px;border-radius:6px;background:var(--mat-sys-surface-container-high);color:var(--mat-sys-on-surface);border:1px solid var(--mat-sys-outline-variant);font:600 .8125rem/1.125rem Roboto;text-transform:lowercase;letter-spacing:.02rem}.tool-chip[data-tool=esbuild][_ngcontent-%COMP%], .tool-chip[data-tool=vite][_ngcontent-%COMP%]{color:var(--mat-sys-primary);border-color:color-mix(in oklch,var(--mat-sys-primary) 36%,transparent)}.tool-chip[data-tool=jest][_ngcontent-%COMP%], .tool-chip[data-tool=nx][_ngcontent-%COMP%]{color:var(--mat-sys-secondary);border-color:color-mix(in oklch,var(--mat-sys-secondary) 36%,transparent)}.tool-chip[data-tool=storybook][_ngcontent-%COMP%], .tool-chip[data-tool=webpack][_ngcontent-%COMP%]{color:var(--mat-sys-tertiary);border-color:color-mix(in oklch,var(--mat-sys-tertiary) 36%,transparent)}.tool-chip[data-tool=node][_ngcontent-%COMP%], .tool-chip[data-tool=typescript][_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant)}.msg[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface);font-size:.875rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.cnt[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);font:500 .75rem/1rem Roboto;justify-self:end}.dm-card-sk[_ngcontent-%COMP%]{background:var(--mat-sys-surface-container-low);border:1px solid var(--mat-sys-outline-variant);border-radius:14px;overflow:hidden}.dm-sk-accent[_ngcontent-%COMP%]{height:4px;background:var(--mat-sys-surface-container)}.dm-sk-body[_ngcontent-%COMP%]{padding:1rem;display:flex;flex-direction:column;gap:.5rem}.dm-empty-actions[_ngcontent-%COMP%]{margin-top:.75rem}.dm-link-btn[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:.375rem;padding:6px 14px;border-radius:10px;background:var(--mat-sys-primary);color:var(--mat-sys-on-primary);text-decoration:none;font:500 .875rem/1.25rem Roboto}.dm-link-btn[_ngcontent-%COMP%] .material-symbols-outlined[_ngcontent-%COMP%]{font-size:18px}@media(max-width:760px){.row[_ngcontent-%COMP%]{grid-template-columns:1fr;gap:.25rem}.ln[_ngcontent-%COMP%], .cnt[_ngcontent-%COMP%]{justify-self:start}}"],changeDetection:0})};export{ie as ErrorsPanelComponent};
@@ -1 +0,0 @@
1
- import{a as ke,b as Se}from"./chunk-K7S4ITPJ.js";import"./chunk-YNQPX5G6.js";import"./chunk-7C772RJ3.js";import"./chunk-6WZJCF24.js";import"./chunk-KLH6B22T.js";import{a as he,b as fe,c as ve,d as ye,e as xe,f as be}from"./chunk-EIWOTZT3.js";import{a as pe,b as ce,d as ue,e as ge,g as Ee,h as Ce,i as _e,j as N}from"./chunk-LBL7Z5BE.js";import"./chunk-Y6B6X4Y6.js";import{$ as D,Ab as ae,Bb as de,Ca as I,Db as k,Eb as y,Fb as x,Hb as B,Ia as ee,Ib as T,Jb as w,Kb as S,Lb as s,Mb as l,Nb as C,Ob as r,Pb as a,Sb as M,Ub as h,Vb as P,Wb as u,Y as W,Za as R,_a as m,ca as Y,cb as te,ea as c,eb as ne,fa as q,gc as A,ha as X,hb as oe,ia as Z,ic as i,ja as b,jc as f,ka as E,kb as ie,na as G,oa as J,pb as v,sc as se,ta as g,ua as Q,vb as re,vc as le,xc as me}from"./chunk-K43KW4K2.js";var Ie="@",Re=(()=>{class n{doc;delegate;zone;animationType;moduleImpl;_rendererFactoryPromise=null;scheduler=null;injector=c(G);loadingSchedulerFn=c(Ae,{optional:!0});_engine;constructor(t,o,d,p,_){this.doc=t,this.delegate=o,this.zone=d,this.animationType=p,this.moduleImpl=_}ngOnDestroy(){this._engine?.flush()}loadImpl(){let t=()=>this.moduleImpl??import("./chunk-UC3XMN2Y.js").then(d=>d),o;return this.loadingSchedulerFn?o=this.loadingSchedulerFn(t):o=t(),o.catch(d=>{throw new W(5300,!1)}).then(({\u0275createEngine:d,\u0275AnimationRendererFactory:p})=>{this._engine=d(this.animationType,this.doc);let _=new p(this.delegate,this._engine,this.zone);return this.delegate=_,_})}createRenderer(t,o){let d=this.delegate.createRenderer(t,o);if(d.\u0275type===0)return d;typeof d.throwOnSyntheticProps=="boolean"&&(d.throwOnSyntheticProps=!1);let p=new z(d);return o?.data?.animation&&!this._rendererFactoryPromise&&(this._rendererFactoryPromise=this.loadImpl()),this._rendererFactoryPromise?.then(_=>{let De=_.createRenderer(t,o);p.use(De),this.scheduler??=this.injector.get(Q,null,{optional:!0}),this.scheduler?.notify(10)}).catch(_=>{p.use(d)}),p}begin(){this.delegate.begin?.()}end(){this.delegate.end?.()}whenRenderingDone(){return this.delegate.whenRenderingDone?.()??Promise.resolve()}componentReplaced(t){this._engine?.flush(),this.delegate.componentReplaced?.(t)}static \u0275fac=function(o){ie()};static \u0275prov=D({token:n,factory:n.\u0275fac})}return n})(),z=class{delegate;replay=[];\u0275type=1;constructor(e){this.delegate=e}use(e){if(this.delegate=e,this.replay!==null){for(let t of this.replay)t(e);this.replay=null}}get data(){return this.delegate.data}destroy(){this.replay=null,this.delegate.destroy()}createElement(e,t){return this.delegate.createElement(e,t)}createComment(e){return this.delegate.createComment(e)}createText(e){return this.delegate.createText(e)}get destroyNode(){return this.delegate.destroyNode}appendChild(e,t){this.delegate.appendChild(e,t)}insertBefore(e,t,o,d){this.delegate.insertBefore(e,t,o,d)}removeChild(e,t,o,d){this.delegate.removeChild(e,t,o,d)}selectRootElement(e,t){return this.delegate.selectRootElement(e,t)}parentNode(e){return this.delegate.parentNode(e)}nextSibling(e){return this.delegate.nextSibling(e)}setAttribute(e,t,o,d){this.delegate.setAttribute(e,t,o,d)}removeAttribute(e,t,o){this.delegate.removeAttribute(e,t,o)}addClass(e,t){this.delegate.addClass(e,t)}removeClass(e,t){this.delegate.removeClass(e,t)}setStyle(e,t,o,d){this.delegate.setStyle(e,t,o,d)}removeStyle(e,t,o){this.delegate.removeStyle(e,t,o)}setProperty(e,t,o){this.shouldReplay(t)&&this.replay.push(d=>d.setProperty(e,t,o)),this.delegate.setProperty(e,t,o)}setValue(e,t){this.delegate.setValue(e,t)}listen(e,t,o,d){return this.shouldReplay(t)&&this.replay.push(p=>p.listen(e,t,o,d)),this.delegate.listen(e,t,o,d)}shouldReplay(e){return this.replay!==null&&e.startsWith(Ie)}},Ae=new Y("");function Me(n="animations"){return te("NgAsyncAnimations"),q([{provide:oe,useFactory:(e,t,o)=>new Re(e,t,o,n),deps:[J,pe,ne]},{provide:ee,useValue:n==="noop"?"NoopAnimations":"BrowserAnimations"}])}var Ne=n=>({exact:n}),Fe=(n,e)=>e.path;function Le(n,e){n&1&&(s(0,"span"),i(1,"daimon"),l())}function Ke(n,e){if(n&1&&(s(0,"span",6),i(1),l()),n&2){let t=u().$implicit;m(),f(t.label)}}function je(n,e){if(n&1&&(s(0,"a",5)(1,"mat-icon",2),i(2),l(),y(3,Ke,2,1,"span",6),l()),n&2){let t=e.$implicit,o=u();S("routerLink",t.path)("routerLinkActiveOptions",se(5,Ne,t.path==="/"))("matTooltip",o.expanded()?t.shortcut:t.label+" \xB7 "+t.shortcut),m(2),f(t.icon),m(),x(o.expanded()?3:-1)}}var He=[{path:"/",icon:"apps",label:"Apps",shortcut:"g a"},{path:"/errors",icon:"error",label:"Errors",shortcut:"g e"},{path:"/logs",icon:"terminal",label:"Logs",shortcut:"g l"},{path:"/config",icon:"tune",label:"Settings",shortcut:"g s"},{path:"/doctor",icon:"medical_services",label:"Doctor",shortcut:"g d"},{path:"/events",icon:"timeline",label:"Events",shortcut:"g v"},{path:"/history",icon:"query_stats",label:"History",shortcut:"g h"},{path:"/trends",icon:"show_chart",label:"Trends",shortcut:"g t"},{path:"/tests",icon:"science",label:"Tests",shortcut:"g x"},{path:"/sessions",icon:"radio_button_checked",label:"Sessions",shortcut:"g n"}],Te="daimon.nav.expanded",F=class n{entries=He;expanded=g(!0);ngOnInit(){let e=localStorage.getItem(Te);e!==null&&this.expanded.set(e==="1")}toggle(){this.expanded.update(e=>!e),localStorage.setItem(Te,this.expanded()?"1":"0")}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=v({type:n,selectors:[["dm-nav-rail"]],decls:11,vars:5,consts:[[1,"dm-rail"],[1,"dm-rail-toggle",3,"click"],["fontSet","material-symbols-outlined"],[1,"dm-rail-brand"],[1,"dm-rail-items"],["routerLinkActive","active","matTooltipPosition","right",1,"dm-rail-item",3,"routerLink","routerLinkActiveOptions","matTooltip"],[1,"dm-rail-label"]],template:function(t,o){t&1&&(s(0,"nav",0)(1,"button",1),h("click",function(){return o.toggle()}),s(2,"mat-icon",2),i(3),l()(),s(4,"div",3)(5,"mat-icon",2),i(6,"developer_board"),l(),y(7,Le,2,0,"span"),l(),s(8,"div",4),T(9,je,4,7,"a",5,Fe),l()()),t&2&&(A("expanded",o.expanded()),m(),k("aria-label",o.expanded()?"Collapse":"Expand"),m(2),f(o.expanded()?"menu_open":"menu"),m(4),x(o.expanded()?7:-1),m(2),w(o.entries))},dependencies:[ve,ye,_e,Ce,Se,ke],styles:["[_nghost-%COMP%]{display:contents}.dm-rail[_ngcontent-%COMP%]{grid-area:rail;display:flex;flex-direction:column;background:var(--mat-sys-surface-container);border-right:1px solid var(--mat-sys-outline-variant);width:64px;transition:width var(--dm-motion-medium) var(--dm-motion-easing-emphasized);overflow:hidden;-webkit-user-select:none;user-select:none}.dm-rail.expanded[_ngcontent-%COMP%]{width:240px}.dm-rail-toggle[_ngcontent-%COMP%]{border:none;background:transparent;color:var(--mat-sys-on-surface-variant);padding:12px;cursor:pointer;align-self:flex-end;display:flex;align-items:center;justify-content:center}.dm-rail-toggle[_ngcontent-%COMP%]:hover{color:var(--mat-sys-on-surface)}.dm-rail-brand[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;padding:0 16px 12px 20px;color:var(--mat-sys-primary);font:500 1rem/1.5rem Roboto;letter-spacing:.009rem}.dm-rail-items[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:2px;padding:8px}.dm-rail-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.75rem;padding:10px 12px;border-radius:12px;color:var(--mat-sys-on-surface-variant);text-decoration:none;font:500 .875rem/1.25rem Roboto;transition:background var(--dm-motion-short) var(--dm-motion-easing),color var(--dm-motion-short) var(--dm-motion-easing);white-space:nowrap}.dm-rail-item[_ngcontent-%COMP%]:hover{background:var(--mat-sys-surface-container-high);color:var(--mat-sys-on-surface)}.dm-rail-item.active[_ngcontent-%COMP%]{background:color-mix(in oklch,var(--mat-sys-primary) 14%,transparent);color:var(--mat-sys-primary)}.dm-rail-label[_ngcontent-%COMP%]{flex:1}"],changeDetection:0})};function Ve(n,e){if(n&1){let t=M();r(0,"div",2)(1,"button",3),P("click",function(){b(t);let d=u();return E(d.set("auto"))}),i(2,"Auto"),a(),r(3,"button",3),P("click",function(){b(t);let d=u();return E(d.set("light"))}),i(4,"Light"),a(),r(5,"button",3),P("click",function(){b(t);let d=u();return E(d.set("dark"))}),i(6,"Dark"),a()()}}var we="daimon.theme",K=class n{theme=g("auto");host=c(I);open=g(!1);icon=()=>this.theme()==="dark"?"dark_mode":this.theme()==="light"?"light_mode":"contrast";ngOnInit(){let e=localStorage.getItem(we)||"auto";this.set(e,!1)}set(e,t=!0){this.theme.set(e),localStorage.setItem(we,e);let o=document.documentElement;e==="auto"?o.style.removeProperty("color-scheme"):o.style.setProperty("color-scheme",e),t&&this.open.set(!1)}onDocClick(e){this.open()&&(this.host.nativeElement.contains(e.target)||this.open.set(!1))}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=v({type:n,selectors:[["dm-theme-toggle"]],hostBindings:function(t,o){t&1&&h("click",function(p){return o.onDocClick(p)},R)},decls:4,vars:3,consts:[["type","button","aria-label","Theme","aria-haspopup","true",1,"tt-btn",3,"click"],[1,"material-symbols-outlined"],["role","menu",1,"tt-pop"],["type","button","role","menuitem",3,"click"]],template:function(t,o){t&1&&(r(0,"button",0),P("click",function(){return o.open.set(!o.open())}),r(1,"span",1),i(2),a()(),y(3,Ve,7,0,"div",2)),t&2&&(k("aria-expanded",o.open()),m(2),f(o.icon()),m(),x(o.open()?3:-1))},styles:["[_nghost-%COMP%]{position:relative;display:inline-block}.tt-btn[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center;width:40px;height:40px;border:0;background:transparent;border-radius:999px;color:var(--mat-sys-on-surface-variant);cursor:pointer}.tt-btn[_ngcontent-%COMP%]:hover{background:var(--mat-sys-surface-container-high);color:var(--mat-sys-on-surface)}.tt-btn[_ngcontent-%COMP%] .material-symbols-outlined[_ngcontent-%COMP%]{font-size:20px}.tt-pop[_ngcontent-%COMP%]{position:absolute;right:0;top:calc(100% + 4px);min-width:140px;background:var(--mat-sys-surface-container-high);border:1px solid var(--mat-sys-outline-variant);border-radius:10px;padding:4px;box-shadow:var(--mat-sys-level2);z-index:50;display:flex;flex-direction:column;gap:1px}.tt-pop[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{display:flex;align-items:center;padding:8px 12px;background:transparent;border:0;border-radius:6px;text-align:left;color:var(--mat-sys-on-surface);font:500 .8125rem/1.25rem Roboto;cursor:pointer}.tt-pop[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:hover{background:var(--mat-sys-surface-container-highest)}"],changeDetection:0})};function Be(n,e){if(n&1){let t=M();s(0,"button",13),h("click",function(){let d=b(t).$implicit,p=u(2);return E(p.setWorkspace(d))}),i(1),l()}if(n&2){let t=e.$implicit;m(),f(t)}}function ze(n,e){if(n&1){let t=M();s(0,"div",5)(1,"button",13),h("click",function(){b(t);let d=u();return E(d.setWorkspace(null))}),i(2,"All workspaces"),l(),T(3,Be,2,1,"button",14,B),l()}if(n&2){let t=u();m(3),w(t.api.workspaces())}}function $e(n,e){n&1&&(s(0,"div",15),i(1,"No profiles configured"),l())}function Ue(n,e){if(n&1){let t=M();s(0,"div",16)(1,"span",17),i(2),l(),s(3,"button",18),h("click",function(){let d=b(t).$implicit,p=u(2);return E(p.runProfile(d))}),s(4,"span",3),i(5,"rocket_launch"),l()()()}if(n&2){let t=e.$implicit;m(2),f(t)}}function We(n,e){if(n&1&&(s(0,"div",5),y(1,$e,2,0,"div",15),T(2,Ue,6,1,"div",16,B),l()),n&2){let t=u();m(),x(t.profiles().length?-1:1),m(),w(t.profiles())}}var $="daimon.workspace",Pe="daimon.profile",j=class n{api=c(N);host=c(I);workspace=g(null);profile=g(null);profiles=g([]);openMenu=g(null);filteredCount=me(()=>{let e=this.workspace();return e?this.api.apps().filter(t=>t.workspaceLabel===e).length:this.api.apps().length});ngOnInit(){this.workspace.set(localStorage.getItem($)),this.profile.set(localStorage.getItem(Pe)),this.loadProfiles()}toggle(e){this.openMenu.update(t=>t===e?null:e)}onDocClick(e){if(!this.openMenu())return;let t=e.target;this.host.nativeElement.contains(t)||this.openMenu.set(null)}async loadProfiles(){try{let e=await fetch("/api/config");if(!e.ok)return;let t=await e.json(),o=t?.config?.profiles?Object.keys(t.config.profiles):[];this.profiles.set(o)}catch{}}setWorkspace(e){this.workspace.set(e),e?localStorage.setItem($,e):localStorage.removeItem($),window.dispatchEvent(new CustomEvent("daimon:workspace",{detail:e})),this.openMenu.set(null)}toast(e,t=3e3){let o=document.getElementById("dm-toast-host");o||(o=document.createElement("div"),o.id="dm-toast-host",o.style.cssText="position:fixed;left:50%;bottom:24px;transform:translateX(-50%);z-index:9999;display:flex;flex-direction:column;gap:8px;pointer-events:none",document.body.appendChild(o));let d=document.createElement("div");d.textContent=e,d.style.cssText="pointer-events:auto;padding:10px 16px;background:var(--mat-sys-inverse-surface,#322f35);color:var(--mat-sys-inverse-on-surface,#f5eff4);border-radius:8px;font:500 .8125rem/1.25rem Roboto;box-shadow:var(--mat-sys-level3,0 4px 12px rgba(0,0,0,.25))",o.appendChild(d),setTimeout(()=>{try{d.remove()}catch{}},t)}async runProfile(e){this.profile.set(e),localStorage.setItem(Pe,e),this.openMenu.set(null),this.toast(`Bringing up profile "${e}"\u2026`,2e3);try{let t=await this.api.ensureUp(e),o=Array.isArray(t?.apps)?`${t.apps.length} apps ready`:"done";this.toast(`Profile "${e}": ${o}`,3e3)}catch(t){this.toast(`Profile "${e}" failed: ${t?.message??"error"}`,5e3)}}onCmdK(){window.dispatchEvent(new CustomEvent("daimon:cmdk"))}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=v({type:n,selectors:[["dm-topbar"]],hostBindings:function(t,o){t&1&&h("click",function(p){return o.onDocClick(p)},R)},decls:32,vars:12,consts:[[1,"dm-topbar"],[1,"dm-popwrap"],["type","button","aria-haspopup","true",1,"dm-chip",3,"click","title"],[1,"material-symbols-outlined"],[1,"material-symbols-outlined","dm-chip-caret"],["role","menu",1,"dm-pop"],[1,"dm-topbar-spacer"],[1,"dm-conn",3,"title"],[1,"dm-conn-dot"],[1,"dm-conn-text"],["type","button","title","Command palette",1,"dm-cmdk",3,"click"],[2,"margin","0 .5rem"],[1,"dm-kbd"],["type","button","role","menuitem",3,"click"],["type","button","role","menuitem"],[1,"dm-pop-empty"],["role","menuitem",1,"dm-pop-row"],[1,"dm-pop-label"],["type","button","title","ensure-up",1,"dm-pop-go",3,"click"]],template:function(t,o){t&1&&(s(0,"header",0)(1,"div",1)(2,"button",2),h("click",function(){return o.toggle("ws")}),s(3,"span",3),i(4,"folder_open"),l(),s(5,"span"),i(6),l(),s(7,"span",4),i(8,"expand_more"),l()(),y(9,ze,5,0,"div",5),l(),s(10,"div",1)(11,"button",2),h("click",function(){return o.toggle("profile")}),s(12,"span",3),i(13,"play_circle"),l(),s(14,"span"),i(15),l(),s(16,"span",4),i(17,"expand_more"),l()(),y(18,We,4,1,"div",5),l(),C(19,"span",6),s(20,"span",7),C(21,"span",8),s(22,"span",9),i(23),l()(),s(24,"button",10),h("click",function(){return o.onCmdK()}),s(25,"span",3),i(26,"search"),l(),s(27,"span",11),i(28,"Jump to\u2026"),l(),s(29,"kbd",12),i(30,"\u2318K"),l()(),C(31,"dm-theme-toggle"),l()),t&2&&(m(2),S("title","Filter by workspace"),k("aria-expanded",o.openMenu()==="ws"),m(4),f(o.workspace()||"All workspaces"),m(3),x(o.openMenu()==="ws"?9:-1),m(2),S("title","Run profile: ensure-up"),k("aria-expanded",o.openMenu()==="profile"),m(4),f(o.profile()||"No profile"),m(3),x(o.openMenu()==="profile"?18:-1),m(2),A("up",o.api.connected()),S("title",o.api.connected()?"Live event stream connected":"Reconnecting\u2026"),m(3),f(o.api.connected()?"live":"offline"))},dependencies:[K],styles:["[_nghost-%COMP%]{display:contents}.dm-topbar[_ngcontent-%COMP%]{grid-area:topbar;display:flex;align-items:center;gap:.5rem;padding:10px 16px;background:var(--mat-sys-surface);border-bottom:1px solid var(--mat-sys-outline-variant);min-height:56px}.dm-topbar-spacer[_ngcontent-%COMP%]{flex:1}.dm-chip[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:.5rem;padding:6px 10px;border-radius:999px;background:var(--mat-sys-surface-container);border:1px solid var(--mat-sys-outline-variant);color:var(--mat-sys-on-surface);font:500 .8125rem/1.25rem Roboto;cursor:pointer;transition:background var(--dm-motion-short) var(--dm-motion-easing)}.dm-chip[_ngcontent-%COMP%]:hover{background:var(--mat-sys-surface-container-high)}.dm-chip[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px}.dm-chip-caret[_ngcontent-%COMP%]{opacity:.7}.dm-cmdk[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:.25rem;border-radius:12px!important}.dm-cmdk[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px}.dm-kbd[_ngcontent-%COMP%]{font-family:Roboto Mono,ui-monospace,monospace;font-size:.6875rem;padding:2px 6px;border-radius:4px;background:var(--mat-sys-surface-container);border:1px solid var(--mat-sys-outline-variant);color:var(--mat-sys-on-surface-variant)}.dm-conn[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:.375rem;padding:4px 10px;border-radius:999px;font:500 .75rem/1rem Roboto;color:var(--mat-sys-on-surface-variant);background:var(--mat-sys-surface-container)}.dm-conn-dot[_ngcontent-%COMP%]{width:8px;height:8px;border-radius:999px;background:var(--mat-sys-outline)}.dm-conn.up[_ngcontent-%COMP%] .dm-conn-dot[_ngcontent-%COMP%]{background:var(--mat-sys-primary);box-shadow:0 0 0 4px color-mix(in oklch,var(--mat-sys-primary) 25%,transparent)}.dm-conn.up[_ngcontent-%COMP%] .dm-conn-text[_ngcontent-%COMP%]{color:var(--mat-sys-primary)}.dm-popwrap[_ngcontent-%COMP%]{position:relative;display:inline-block}.dm-pop[_ngcontent-%COMP%]{position:absolute;left:0;top:calc(100% + 4px);min-width:200px;max-height:60vh;overflow-y:auto;background:var(--mat-sys-surface-container-high);border:1px solid var(--mat-sys-outline-variant);border-radius:10px;padding:4px;box-shadow:var(--mat-sys-level2);z-index:50;display:flex;flex-direction:column;gap:1px}.dm-pop[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{display:flex;align-items:center;padding:8px 12px;background:transparent;border:0;border-radius:6px;text-align:left;color:var(--mat-sys-on-surface);font:500 .8125rem/1.25rem Roboto;cursor:pointer}.dm-pop[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:hover{background:var(--mat-sys-surface-container-highest)}.dm-pop-empty[_ngcontent-%COMP%]{padding:.5rem 1rem;color:var(--mat-sys-on-surface-variant)}.dm-pop-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;padding:4px 8px}.dm-pop-label[_ngcontent-%COMP%]{flex:1;font:500 .8125rem/1.25rem Roboto;color:var(--mat-sys-on-surface)}.dm-pop-go[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;background:transparent;border:0;border-radius:999px;color:var(--mat-sys-primary);cursor:pointer}.dm-pop-go[_ngcontent-%COMP%]:hover{background:var(--mat-sys-surface-container-highest)}.dm-pop-go[_ngcontent-%COMP%] .material-symbols-outlined[_ngcontent-%COMP%]{font-size:18px}.dm-cmdk[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:.25rem;padding:8px 14px;border-radius:12px;background:transparent;border:1px solid var(--mat-sys-outline);color:var(--mat-sys-on-surface);cursor:pointer}.dm-cmdk[_ngcontent-%COMP%]:hover{background:var(--mat-sys-surface-container)}.dm-cmdk[_ngcontent-%COMP%] .material-symbols-outlined[_ngcontent-%COMP%]{font-size:18px}"],changeDetection:0})};var U=class n{static \u0275fac=function(t){return new(t||n)};static \u0275cmp=v({type:n,selectors:[["dm-shortcuts-help"]],decls:138,vars:0,consts:[["mat-dialog-title",""],["mat-dialog-content",""],[1,"dm-keys"]],template:function(t,o){t&1&&(r(0,"h2",0),i(1,"Keyboard shortcuts"),a(),r(2,"div",1)(3,"table",2)(4,"tr")(5,"td")(6,"kbd"),i(7,"\u2318K"),a(),i(8," / "),r(9,"kbd"),i(10,"Ctrl+K"),a()(),r(11,"td"),i(12,"Command palette"),a()(),r(13,"tr")(14,"td")(15,"kbd"),i(16,"?"),a()(),r(17,"td"),i(18,"This help"),a()(),r(19,"tr")(20,"td")(21,"kbd"),i(22,"/"),a()(),r(23,"td"),i(24,"Focus filter"),a()(),r(25,"tr")(26,"td")(27,"kbd"),i(28,"g"),a(),r(29,"kbd"),i(30,"a"),a()(),r(31,"td"),i(32,"Apps"),a()(),r(33,"tr")(34,"td")(35,"kbd"),i(36,"g"),a(),r(37,"kbd"),i(38,"e"),a()(),r(39,"td"),i(40,"Errors"),a()(),r(41,"tr")(42,"td")(43,"kbd"),i(44,"g"),a(),r(45,"kbd"),i(46,"l"),a()(),r(47,"td"),i(48,"Logs"),a()(),r(49,"tr")(50,"td")(51,"kbd"),i(52,"g"),a(),r(53,"kbd"),i(54,"s"),a()(),r(55,"td"),i(56,"Settings"),a()(),r(57,"tr")(58,"td")(59,"kbd"),i(60,"g"),a(),r(61,"kbd"),i(62,"d"),a()(),r(63,"td"),i(64,"Doctor"),a()(),r(65,"tr")(66,"td")(67,"kbd"),i(68,"g"),a(),r(69,"kbd"),i(70,"v"),a()(),r(71,"td"),i(72,"Events"),a()(),r(73,"tr")(74,"td")(75,"kbd"),i(76,"g"),a(),r(77,"kbd"),i(78,"h"),a()(),r(79,"td"),i(80,"History"),a()(),r(81,"tr")(82,"td")(83,"kbd"),i(84,"g"),a(),r(85,"kbd"),i(86,"t"),a()(),r(87,"td"),i(88,"Trends"),a()(),r(89,"tr")(90,"td")(91,"kbd"),i(92,"g"),a(),r(93,"kbd"),i(94,"x"),a()(),r(95,"td"),i(96,"Tests"),a()(),r(97,"tr")(98,"td")(99,"kbd"),i(100,"g"),a(),r(101,"kbd"),i(102,"n"),a()(),r(103,"td"),i(104,"Sessions"),a()(),r(105,"tr")(106,"td")(107,"kbd"),i(108,"j"),a(),i(109," / "),r(110,"kbd"),i(111,"k"),a()(),r(112,"td"),i(113,"Next / prev item"),a()(),r(114,"tr")(115,"td")(116,"kbd"),i(117,"s"),a()(),r(118,"td"),i(119,"Start focused app"),a()(),r(120,"tr")(121,"td")(122,"kbd"),i(123,"r"),a()(),r(124,"td"),i(125,"Restart focused app"),a()(),r(126,"tr")(127,"td")(128,"kbd"),i(129,"x"),a()(),r(130,"td"),i(131,"Stop focused app"),a()(),r(132,"tr")(133,"td")(134,"kbd"),i(135,"."),a()(),r(136,"td"),i(137,"Toggle list / cards"),a()()()())},styles:[".dm-keys[_ngcontent-%COMP%]{width:100%;border-collapse:collapse}.dm-keys[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{padding:.375rem .5rem;vertical-align:middle}.dm-keys[_ngcontent-%COMP%] td[_ngcontent-%COMP%]:first-child{width:9rem}kbd[_ngcontent-%COMP%]{font-family:Roboto Mono,ui-monospace,monospace;font-size:.75rem;padding:2px 6px;border-radius:4px;background:var(--mat-sys-surface-container);border:1px solid var(--mat-sys-outline-variant)}"],changeDetection:0})},H=class n{router=c(fe);envInjector=c(X);pending=null;pendingTimer;handler=e=>this.onKey(e);async openShortcutsDialog(){let{MatDialog:e}=await import("./chunk-2BXIFQGQ.js");Z(this.envInjector,()=>{c(e).open(U,{width:"420px"})})}install(){window.addEventListener("keydown",this.handler)}uninstall(){window.removeEventListener("keydown",this.handler)}onKey(e){let t=e.target;if(!(t&&(t.tagName==="INPUT"||t.tagName==="TEXTAREA"||t.isContentEditable))){if((e.metaKey||e.ctrlKey)&&e.key.toLowerCase()==="k"){e.preventDefault(),window.dispatchEvent(new CustomEvent("daimon:cmdk"));return}if(!(e.metaKey||e.ctrlKey||e.altKey)){if(this.pending==="g"){this.pending=null,this.pendingTimer&&clearTimeout(this.pendingTimer);let d={a:"/",e:"/errors",l:"/logs",s:"/config",d:"/doctor",v:"/events",h:"/history",t:"/trends",x:"/tests",n:"/sessions",r:"/errors",c:"/config"}[e.key.toLowerCase()];d&&(e.preventDefault(),this.router.navigateByUrl(d));return}if(e.key==="?"){e.preventDefault(),this.openShortcutsDialog();return}if(e.key==="/"){e.preventDefault(),window.dispatchEvent(new CustomEvent("daimon:focus-filter"));return}if(e.key==="g"){this.pending="g",this.pendingTimer=setTimeout(()=>this.pending=null,1200);return}if(e.key==="."){e.preventDefault(),window.dispatchEvent(new CustomEvent("daimon:toggle-density"));return}["j","k","s","r","x"].includes(e.key)&&window.dispatchEvent(new CustomEvent("daimon:key",{detail:e.key}))}}}static \u0275fac=function(t){return new(t||n)};static \u0275prov=D({token:n,factory:n.\u0275fac,providedIn:"root"})};var Ye=()=>[import("./chunk-VM2FOT77.js").then(n=>n.CommandPaletteComponent)];function qe(n,e){n&1&&C(0,"dm-command-palette")}var V=class n{api=c(N);keys=c(H);paletteActivated=g(!1);onCmdK=()=>{this.paletteActivated()||(this.paletteActivated.set(!0),setTimeout(()=>window.dispatchEvent(new CustomEvent("daimon:cmdk")),50))};ngOnInit(){this.api.start(),this.keys.install(),window.addEventListener("daimon:cmdk",this.onCmdK)}ngOnDestroy(){this.api.stop(),this.keys.uninstall(),window.removeEventListener("daimon:cmdk",this.onCmdK)}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=v({type:n,selectors:[["dm-root"]],decls:8,vars:1,consts:[[1,"dm-shell"],[1,"dm-main"]],template:function(t,o){t&1&&(s(0,"div",0),C(1,"dm-nav-rail")(2,"dm-topbar"),s(3,"main",1),C(4,"router-outlet"),l()(),re(5,qe,1,0),ae(6,5,Ye)),t&2&&(m(6),de(o.paletteActivated()))},dependencies:[he,F,j],styles:['[_nghost-%COMP%]{display:block;height:100vh}.dm-shell[_ngcontent-%COMP%]{display:grid;grid-template-columns:auto 1fr;grid-template-rows:auto 1fr;grid-template-areas:"rail topbar" "rail main";height:100vh;min-height:100vh}.dm-main[_ngcontent-%COMP%]{grid-area:main;overflow-y:auto;padding:1.5rem;background:var(--mat-sys-surface)}'],changeDetection:0})};var Oe=[{path:"",loadComponent:()=>import("./chunk-LHAMBNO6.js").then(n=>n.AppsListComponent)},{path:"apps/:name",loadComponent:()=>import("./chunk-V2KNRAE4.js").then(n=>n.AppDetailComponent)},{path:"events",loadComponent:()=>import("./chunk-NX6DTO32.js").then(n=>n.EventsFeedComponent)},{path:"logs",loadComponent:()=>import("./chunk-P5IE6DI6.js").then(n=>n.LogsPageComponent)},{path:"logs/:name",loadComponent:()=>import("./chunk-P5IE6DI6.js").then(n=>n.LogsPageComponent)},{path:"errors",loadComponent:()=>import("./chunk-CNSXWFDX.js").then(n=>n.ErrorsPanelComponent)},{path:"doctor",loadComponent:()=>import("./chunk-4BAKWDAV.js").then(n=>n.DoctorPageComponent)},{path:"config",loadComponent:()=>import("./chunk-QSBOKS53.js").then(n=>n.ConfigEditorComponent)},{path:"history",loadComponent:()=>import("./chunk-4OCNYL7T.js").then(n=>n.HistoryPageComponent)},{path:"history/:name",loadComponent:()=>import("./chunk-4OCNYL7T.js").then(n=>n.HistoryPageComponent)},{path:"trends",loadComponent:()=>import("./chunk-H2N3RBHF.js").then(n=>n.TrendsPageComponent)},{path:"tests",loadComponent:()=>import("./chunk-44JIQO3X.js").then(n=>n.TestsPageComponent)},{path:"sessions",loadComponent:()=>import("./chunk-KL6X73FV.js").then(n=>n.SessionsPageComponent)},{path:"requests/:name",loadComponent:()=>import("./chunk-CY5YRTQK.js").then(n=>n.RequestsPageComponent)},{path:"**",redirectTo:""}];ce(V,{providers:[le(),Me(),ue(ge()),xe(Oe,be()),{provide:Ee,useValue:{fontSet:"material-symbols-outlined"}}]}).catch(n=>console.error(n));