openfox 2.0.23 → 2.0.24
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/dist/{chunk-ZMR2ULLL.js → chunk-4EDH3ZXL.js} +2 -2
- package/dist/{chunk-FUNQXQ7X.js → chunk-INRKWEOH.js} +2 -2
- package/dist/cli/dev.js +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/package.json +1 -1
- package/dist/{serve-MDNCOVQU.js → serve-ABSUHKT3.js} +2 -2
- package/dist/server/index.js +1 -1
- package/dist/web/assets/{index-CXXGAW1N.js → index-Bi5R_oF2.js} +1 -1
- package/dist/web/index.html +1 -1
- package/dist/web/sw.js +1 -1
- package/package.json +1 -1
|
@@ -196,7 +196,7 @@ async function runCli(options) {
|
|
|
196
196
|
if (!configExists) {
|
|
197
197
|
await runNetworkSetup(mode);
|
|
198
198
|
}
|
|
199
|
-
const { runServe } = await import("./serve-
|
|
199
|
+
const { runServe } = await import("./serve-ABSUHKT3.js");
|
|
200
200
|
const serveOptions = { mode };
|
|
201
201
|
if (values.port) serveOptions.port = parseInt(values.port);
|
|
202
202
|
if (values["no-browser"] === true) serveOptions.openBrowser = false;
|
|
@@ -208,4 +208,4 @@ async function runCli(options) {
|
|
|
208
208
|
export {
|
|
209
209
|
runCli
|
|
210
210
|
};
|
|
211
|
-
//# sourceMappingURL=chunk-
|
|
211
|
+
//# sourceMappingURL=chunk-4EDH3ZXL.js.map
|
|
@@ -3443,7 +3443,7 @@ import { Router as Router6 } from "express";
|
|
|
3443
3443
|
import { spawn as spawn2 } from "child_process";
|
|
3444
3444
|
|
|
3445
3445
|
// src/constants.ts
|
|
3446
|
-
var VERSION = "2.0.
|
|
3446
|
+
var VERSION = "2.0.24";
|
|
3447
3447
|
|
|
3448
3448
|
// src/server/routes/auto-update.ts
|
|
3449
3449
|
var updateInProgress = false;
|
|
@@ -4843,4 +4843,4 @@ export {
|
|
|
4843
4843
|
createServerHandle,
|
|
4844
4844
|
createServer
|
|
4845
4845
|
};
|
|
4846
|
-
//# sourceMappingURL=chunk-
|
|
4846
|
+
//# sourceMappingURL=chunk-INRKWEOH.js.map
|
package/dist/cli/dev.js
CHANGED
package/dist/cli/index.js
CHANGED
package/dist/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
VERSION,
|
|
3
3
|
createServer
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-INRKWEOH.js";
|
|
5
5
|
import "./chunk-RYHCYZQ7.js";
|
|
6
6
|
import "./chunk-CDIYCGCO.js";
|
|
7
7
|
import "./chunk-QK6TYNUN.js";
|
|
@@ -193,4 +193,4 @@ async function runServe(options) {
|
|
|
193
193
|
export {
|
|
194
194
|
runServe
|
|
195
195
|
};
|
|
196
|
-
//# sourceMappingURL=serve-
|
|
196
|
+
//# sourceMappingURL=serve-ABSUHKT3.js.map
|
package/dist/server/index.js
CHANGED
|
@@ -86,7 +86,7 @@ WARNING: This link could potentially be dangerous`)){const S=window.open();if(S)
|
|
|
86
86
|
w-[300px] bg-secondary border-r border-border flex flex-col
|
|
87
87
|
transition-all duration-300 ease-in-out
|
|
88
88
|
${t?"translate-x-0":"-translate-x-full"}
|
|
89
|
-
`,children:[o.jsxs("div",{className:"p-4 border-b border-border flex gap-2",children:[o.jsx(qn,{href:`/p/${e}/new`,className:"flex-1 block text-center rounded font-medium transition-colors bg-accent-primary/25 text-text-primary hover:bg-accent-primary/40 px-3 py-1.5 text-sm","data-testid":"sidebar-new-session-button",children:"+ New Session"}),o.jsx(yl,{items:[{label:"Edit project settings",onClick:()=>l(!0)},{label:"Delete all sessions",onClick:E,danger:!0}],trigger:o.jsx("button",{className:"flex-shrink-0 p-2.5 rounded hover:bg-bg-tertiary text-text-muted hover:text-text-primary transition-colors",title:"Options",children:o.jsx(mp,{})})}),n&&o.jsx(bl,{onClick:n,className:"md:hidden",variant:"sidebar",size:"md"})]}),w&&o.jsx(IN,{isOpen:a,onClose:()=>l(!1),project:w}),o.jsx("div",{className:"flex-1 overflow-y-auto",children:S.length===0?o.jsx("div",{className:"p-4 text-center text-text-muted text-xs",children:"No sessions"}):o.jsxs(o.Fragment,{children:[o.jsx("div",{className:"divide-y divide-border",children:zN(S,c,d,b,y,e)}),x&&o.jsx("div",{className:"p-4 text-center text-text-muted text-xs",children:"Loading more..."}),o.jsx("div",{ref:C,className:"h-px"})]})})]})]})}function zN(e,t,n,s,a,l){const u=WS(e);return Array.from(u).map(([c,d])=>{const f=d[0];return f?o.jsxs("div",{children:[o.jsx("div",{className:"px-4 py-2 bg-bg-tertiary/30 text-text-muted text-xs font-medium",children:VS(f.updatedAt)}),d.map(m=>{const p=(t==null?void 0:t.id)===m.id,_=n.includes(m.id),x=m.isRunning;return o.jsx("div",{className:`w-full px-4 py-3 text-left hover:bg-bg-tertiary/50 transition-colors group ${p?"bg-bg-tertiary":""}`,children:o.jsxs(qn,{href:`/p/${l}/s/${m.id}`,className:`block ${p?"text-accent-primary":"text-text-primary"} hover:text-accent-primary`,children:[o.jsxs("div",{className:"flex justify-between items-center mb-1",children:[o.jsx("span",{className:`font-medium truncate text-sm ${p?"text-accent-primary":"text-text-primary"}`,children:m.title??m.id.slice(0,6)}),o.jsx(yl,{items:[{label:"Rename session",onClick:w=>a(m.id,w)},{label:"Delete session",onClick:w=>s(m.id,w),danger:!0}],trigger:o.jsx("button",{onClick:w=>w.preventDefault(),className:"p-1.5 rounded hover:bg-bg-tertiary text-text-muted hover:text-text-primary transition-all",title:"Options",children:o.jsx(mp,{})})})]}),o.jsxs("div",{className:"flex items-center gap-2 mt-1",children:[x?o.jsx(Bj,{}):_&&!p?o.jsx("span",{"aria-label":"Unread activity",title:"Unread activity",className:"w-2 h-2 rounded-full bg-amber-400 flex-shrink-0"}):null,o.jsx("span",{className:"text-text-muted text-xs flex-shrink-0",children:qu(m.updatedAt)}),o.jsxs("span",{className:"text-text-muted text-xs flex-shrink-0",children:[m.messageCount," messages"]})]})]})},m.id)})]},c):null})}const Kv=["⠋","⠙","⠹","⠸","⠼","⠴"];function $N(){var c;const e=Rt(d=>d.currentProject),t=Ne(d=>d.currentSession),n=$u(),s=!1,a=D.useRef(0),l=D.useRef(null);D.useEffect(()=>(n?(l.current=window.setInterval(()=>{a.current=(a.current+1)%Kv.length,u()},150),u()):(l.current&&(clearInterval(l.current),l.current=null),u()),()=>{l.current&&(clearInterval(l.current),l.current=null)}),[n,e,t,s]);const u=()=>{var p;const f=(p=t==null?void 0:t.metadata)==null?void 0:p.title,m=n?`${Kv[a.current]} `:"";e&&f?document.title=`${m}${e.name} - ${f} | OpenFox`:e?document.title=`${m}${e.name} | OpenFox`:document.title=`${m}OpenFox`};return typeof window<"u"&&((c=t==null?void 0:t.metadata)!=null&&c.title)&&window.document.documentElement.setAttribute("data-session-title",t.metadata.title),null}function KS(e,t=28){if(e.length<=t)return e;const n=e.split("/").filter(Boolean);if(n.length<=2)return e;const s=n[0],a=n[n.length-1],l=n.slice(1,-1).join("/"),u=t-s.length-a.length-3;if(u<0)return e;const c=l.slice(0,Math.floor(u/2)),d=l.slice(-Math.ceil(u/2));return`/${s}/${c}...${d}/${a}`}function YS({isOpen:e,onClose:t,projectName:n,onConfirm:s}){const a=()=>{s(),t()};return o.jsx(Ot,{isOpen:e,onClose:t,title:"Delete Project",size:"sm",children:o.jsxs("div",{className:"space-y-4",children:[o.jsxs("p",{className:"text-text-secondary",children:["This will permanently delete the project"," ",o.jsx("span",{className:"font-semibold text-text-primary",children:n})," and all its sessions from OpenFox. The project files on disk will remain untouched."]}),o.jsxs("div",{className:"flex justify-end gap-2",children:[o.jsx(tt,{variant:"secondary",onClick:t,children:"Cancel"}),o.jsx(tt,{variant:"danger",onClick:a,children:"Delete"})]})]})})}function HN({isOpen:e,onClose:t}){const[,n]=hr(),[s,a]=D.useState(!1),l=FS(),[u,c]=D.useState(!1),d=Rt(A=>A.projects),f=Rt(A=>A.createProject),m=Rt(A=>A.listProjects),p=Rt(A=>A.deleteProject),[_,x]=D.useState(null),[w,C]=D.useState(null);D.useEffect(()=>{e&&m()},[e,m]);const v=A=>{n(`/p/${A}`),t()},S=(A,R)=>{R.stopPropagation(),x(A)},b=()=>{_&&(p(_.id),x(null))},y=async A=>N(A);function E(A){return A!=null&&typeof A=="object"&&"error"in A&&A.error!=null&&typeof A.error=="object"&&"code"in A.error&&A.error.code==="EACCES"}async function N(A){const R=A.split("/").filter(Boolean).pop()??"",M=await f(R,A);return m(),E(M)?(C(M.error.path||A),!1):M&&"id"in M?(n(`/p/${M.id}`),t(),!0):!1}const T=D.useCallback(()=>{C(null)},[]),L=D.useCallback(async()=>{const A=w;C(null),A&&await N(A)},[w]);return e?o.jsxs(Ot,{isOpen:e,onClose:t,title:"Open Project",size:"xl",footer:o.jsx("div",{className:"flex justify-end gap-2",children:o.jsx(tt,{variant:"secondary",onClick:t,children:"Close"})}),children:[o.jsxs("div",{className:"flex flex-col sm:flex-row flex-1 -m-4",children:[o.jsxs("div",{className:"w-full sm:w-1/2 border-b sm:border-b-0 sm:border-r border-border flex flex-col max-h-[40vh] sm:max-h-[50vh]",children:[o.jsx("div",{className:"p-3 border-b border-border bg-bg-tertiary/30 shrink-0",children:o.jsx("h3",{className:"font-medium text-sm text-text-secondary",children:"Recent Projects"})}),o.jsx("div",{className:"flex-1 overflow-y-auto",children:d.length===0?o.jsxs("div",{className:"p-6 text-center text-text-muted text-sm",children:[o.jsx("p",{className:"mb-2",children:"No recent projects"}),o.jsx("p",{className:"text-xs",children:'Click "Create new project" to add one'})]}):o.jsx("div",{className:"divide-y divide-border",children:d.map(A=>o.jsxs("div",{className:"group flex items-center gap-3 p-3 hover:bg-bg-tertiary/50 transition-colors",children:[o.jsxs("button",{onClick:()=>v(A.id),className:"flex-1 flex items-center gap-3 text-left",children:[o.jsx(Hu,{className:"w-5 h-5 text-accent-primary"}),o.jsxs("div",{className:"flex-1 min-w-0",children:[o.jsx("div",{className:"font-medium truncate",children:A.name}),o.jsx("div",{className:"text-xs text-text-muted truncate",children:KS(A.workdir,32)})]})]}),o.jsx("button",{onClick:R=>S(A,R),className:"text-accent-error/70 hover:text-accent-error p-1",title:"Delete project",children:o.jsx(xl,{className:"w-4 h-4"})})]},A.id))})})]}),o.jsx("div",{className:"w-full sm:w-1/2 flex flex-col items-center justify-center p-6 sm:p-8 text-center",children:o.jsxs("div",{className:"flex flex-col gap-3 w-full max-w-sm",children:[o.jsx(tt,{variant:"primary",onClick:()=>c(!0),children:"Select existing project"}),o.jsx(tt,{variant:"secondary",onClick:()=>a(!0),"data-testid":"open-project-create-button",children:"Create new project"})]})})]}),s&&o.jsx(US,{isOpen:s,onClose:()=>a(!1)}),_&&o.jsx(YS,{isOpen:!0,onClose:()=>x(null),projectName:_.name,onConfirm:b}),u&&o.jsx(Cp,{initialPath:l??void 0,onSelect:A=>{y(A)},onClose:()=>c(!1)}),w&&o.jsx(HS,{isOpen:!0,onClose:T,path:w,onRetry:L})]}):null}function UN(){const[e,t]=D.useState(!1),[n,s]=D.useState(null),a=Ne(w=>w.sessions),l=Rt(w=>w.projects),u=Rt(w=>w.loading),c=Rt(w=>w.listProjects),d=Ne(w=>w.listSessions),f=Rt(w=>w.deleteProject),m=Ne(w=>w.connectionStatus);D.useEffect(()=>{m==="connected"&&(c(),d())},[m,c,d]);const p=[...l].sort((w,C)=>{const v=a.filter(E=>E.workdir.startsWith(w.workdir)),S=a.filter(E=>E.workdir.startsWith(C.workdir)),b=v.length>0?new Date(v.reduce((E,N)=>new Date(N.updatedAt)>new Date(E.updatedAt)?N:E).updatedAt).getTime():new Date(w.updatedAt).getTime();return(S.length>0?new Date(S.reduce((E,N)=>new Date(N.updatedAt)>new Date(E.updatedAt)?N:E).updatedAt).getTime():new Date(C.updatedAt).getTime())-b}),_=w=>{const C=l.find(v=>v.id===w);return C?a.filter(v=>v.workdir.startsWith(C.workdir)).sort((v,S)=>new Date(S.updatedAt).getTime()-new Date(v.updatedAt).getTime()).slice(0,5):[]},x=()=>{t(!0)};return o.jsxs("div",{className:"flex-1 flex flex-col overflow-y-auto bg-primary",children:[o.jsxs("div",{className:"max-w-5xl mx-auto w-full p-4 md:p-8",children:[o.jsxs("div",{className:"mb-6 md:mb-8 flex items-center justify-between",children:[o.jsxs("div",{children:[o.jsx("h1",{className:"text-3xl font-bold text-accent-primary",children:"OpenFox"}),o.jsx("p",{className:"text-text-secondary",children:"Local LLM-powered coding assistant with contract-driven execution"})]}),o.jsx(tt,{variant:"primary",onClick:x,children:"Open Project"})]}),p.map(w=>{const C=_(w.id);return o.jsx("div",{className:"mb-6 md:mb-8",children:o.jsxs("div",{className:"bg-bg-secondary border border-border rounded-lg overflow-hidden",children:[o.jsxs("div",{className:"p-3 md:p-4 border-b border-border flex items-center justify-between gap-2",children:[o.jsxs(qn,{href:`/p/${w.id}`,className:"flex items-center gap-2 cursor-pointer hover:opacity-80 transition-opacity flex-1",children:[o.jsx(Hu,{className:"w-5 h-5 text-accent-primary flex-shrink-0"}),o.jsx("span",{className:"text-text-primary font-semibold",children:w.name})]}),o.jsx(qn,{href:`/p/${w.id}/new`,className:"rounded font-medium transition-colors bg-accent-primary/25 text-text-primary hover:bg-accent-primary/40 px-1.5 py-1 text-xs",children:"+ New Session"}),o.jsx("button",{type:"button",onClick:()=>s({id:w.id,name:w.name}),className:"p-1.5 rounded text-text-muted hover:text-accent-error hover:bg-accent-error/10 transition-colors",title:"Delete project",children:o.jsx(xl,{className:"w-4 h-4"})})]}),o.jsx("div",{className:"divide-y divide-border",children:C.length>0?C.map(v=>{const S=l.find(y=>v.workdir.startsWith(y.workdir)),b=S?`/p/${S.id}/s/${v.id}`:"#";return o.jsx(qn,{href:b,className:"block p-3 md:p-4 hover:bg-bg-tertiary/50 cursor-pointer transition-colors",children:o.jsxs("div",{className:"flex items-center justify-between gap-2",children:[o.jsx("div",{className:"flex items-center gap-3 flex-1 min-w-0",children:o.jsx("div",{className:"flex-1 min-w-0",children:o.jsx("div",{className:"text-sm text-text-muted truncate",children:v.title??v.id.slice(0,8)})})}),o.jsxs("div",{className:"flex items-center gap-2 flex-shrink-0",children:[o.jsx("span",{className:"text-text-muted text-xs",children:TN(v.updatedAt)}),o.jsxs("span",{className:"text-text-muted text-xs",children:[v.messageCount," msgs"]})]})]})},v.id)}):o.jsx("div",{className:"p-3 md:p-4 text-text-muted text-sm",children:"No sessions yet"})})]})},w.id)}),p.length===0&&!u&&o.jsx("div",{className:"text-center py-12 text-text-muted",children:"No projects yet. Open a project to get started."}),u&&o.jsx("div",{className:"flex justify-center py-12",children:o.jsx(vl,{})})]}),e&&o.jsx(HN,{isOpen:e,onClose:()=>t(!1)}),n&&o.jsx(YS,{isOpen:!0,onClose:()=>s(null),projectName:n.name,onConfirm:()=>f(n.id)})]})}function FN(){const[,e]=up("/p/:projectId/new"),[,t]=hr(),n=e==null?void 0:e.projectId,s=Ne(u=>u.createSession),a=Ne(u=>u.resetPendingSessionCreate),l=D.useCallback(async()=>{if(!n)return;const u=await s(n);u?(t(`/p/${n}/s/${u.id}`),a()):(t(`/p/${n}`),a())},[n,s,t,a]);return D.useEffect(()=>{l()},[l]),o.jsx("div",{className:"flex-1 flex items-center justify-center",children:o.jsx(vl,{})})}function VN(){const e=Rt(t=>t.currentProject);return o.jsx("div",{className:"h-full flex flex-col items-center justify-center p-8 text-center",children:o.jsxs("div",{className:"max-w-md",children:[o.jsx("h2",{className:"text-xl font-semibold text-text-primary mb-2",children:(e==null?void 0:e.name)??"Project"}),o.jsx("p",{className:"text-text-secondary mb-6",children:"No session selected"}),o.jsxs("div",{className:"flex flex-col gap-3",children:[e&&o.jsx(qn,{href:`/p/${e.id}/new`,"data-testid":"create-new-session-button",className:"block w-full rounded font-medium transition-colors bg-accent-primary/25 text-text-primary hover:bg-accent-primary/40 px-3 py-2 text-center",children:"Create New Session"}),o.jsx("p",{className:"text-sm text-text-muted",children:"Or select an existing session from the sidebar"})]})]})})}const Uo=e=>Math.round(e*10)/10;function GN(e){return typeof e.totalTime=="number"&&!Number.isNaN(e.totalTime)}function Am(e){return{providerId:e.providerId,providerName:e.providerName,backend:e.backend,model:e.model}}function WN(e){return`${e.providerId}::${e.model}`}function qN(e){return`${e.providerName} > ${e.model}`}function Yv(e){let t=0,n=0,s=0,a=0,l=0,u=0;const c=[],d=[];let f=0;for(const[_,x]of e.entries()){const w=x.stats,C=Am(w);t+=w.totalTime,n+=w.toolTime,s+=w.prefillTokens,a+=w.generationTokens;const v=w.prefillSpeed>0?w.prefillTokens/w.prefillSpeed:0,S=w.generationSpeed>0?w.generationTokens/w.generationSpeed:0;l+=v,u+=S,c.push({messageId:x.id,timestamp:x.timestamp,...C,mode:w.mode,responseIndex:_+1,prefillTokens:w.prefillTokens,generationTokens:w.generationTokens,prefillSpeed:w.prefillSpeed,generationSpeed:w.generationSpeed,totalTime:w.totalTime,aiTime:w.totalTime-w.toolTime,toolTime:w.toolTime});const b=w.llmCalls??[];for(const y of b)f+=1,d.push({messageId:x.id,timestamp:y.timestamp??x.timestamp,providerId:y.providerId,providerName:y.providerName,backend:y.backend,model:y.model,mode:w.mode,responseIndex:_+1,sessionCallIndex:f,callIndex:y.callIndex,promptTokens:y.promptTokens,completionTokens:y.completionTokens,ttft:y.ttft,completionTime:y.completionTime,prefillSpeed:y.prefillSpeed,generationSpeed:y.generationSpeed,totalTime:y.totalTime,...y.temperature!==void 0&&{temperature:y.temperature},...y.topP!==void 0&&{topP:y.topP},...y.topK!==void 0&&{topK:y.topK},...y.maxTokens!==void 0&&{maxTokens:y.maxTokens}})}const m=l>0?Uo(s/l):0,p=u>0?Uo(a/u):0;return{totalTime:Uo(t),aiTime:Uo(t-n),toolTime:Uo(n),prefillTokens:s,generationTokens:a,avgPrefillSpeed:m,avgGenerationSpeed:p,responseCount:e.length,llmCallCount:d.length,dataPoints:c,callDataPoints:d}}function KN(e){const t=e.filter(a=>a.stats!==void 0&&a.stats!==null&&GN(a.stats)).sort((a,l)=>new Date(a.timestamp).getTime()-new Date(l.timestamp).getTime());if(t.length===0)return null;const n=new Map;for(const a of t){const l=WN(Am(a.stats)),u=n.get(l)??[];n.set(l,[...u,a])}const s=Array.from(n.entries()).map(([a,l])=>{const u=Am(l[0].stats),c=Yv(l);return{...u,key:a,label:qN(u),...c}});return{...Yv(t),modelGroups:s}}function YN(e){return D.useMemo(()=>KN(e),[e])}function XS(){var a;const e=Ne(l=>l.gitStatus),t=Ne(l=>l.currentSession),[n,s]=D.useState(!0);return D.useEffect(()=>{t!=null&&t.workdir&&s(!1)},[t==null?void 0:t.workdir]),{branch:(e==null?void 0:e.branch)??null,diff:{files:((a=e==null?void 0:e.diff)==null?void 0:a.files)??[],loading:n,error:null}}}function pu(e){return e.toLocaleString("en-US").replace(/,/g," ")}function Xv(e){return Number.isFinite(e)?e>=1e3?`${(e/1e3).toFixed(1)}k`:e.toFixed(1):"0"}function XN(e){if(!Number.isFinite(e))return"0s";if(e<60)return`${e.toFixed(1)}s`;const t=Math.floor(e/60),n=Math.round(e%60);return`${t}m${n}s`}const Qv=["▁","▂","▃","▄","▅","▆","▇","█"];function QN(e,t,n){if(n===t)return 4;const s=(e-t)/(n-t);return Math.min(7,Math.max(0,Math.round(s*7)))}function JN(e,t){if(e===t){const a=Math.max(Math.abs(e)*.05,1);return{minY:e-a,maxY:t+a}}const n=t-e,s=Math.max(n*.1,.1);return{minY:e-s,maxY:t+s}}function ZN(e,t){if(e.length===0||t<=0)return{blocks:"",minX:0,maxX:0,minY:0,maxY:0};const n=[...e].sort((p,_)=>p.x-_.x),s=n[0].x,a=n[n.length-1].x,l=Math.min(...n.map(p=>p.y)),u=Math.max(...n.map(p=>p.y)),{minY:c,maxY:d}=JN(l,u),f=Array.from({length:t},()=>" "),m=new Map;for(const p of n){const _=a===s?0:Math.round((p.x-s)/(a-s)*(t-1)),x=m.get(_)??[];m.set(_,[...x,p.y])}for(const[p,_]of m){const x=Math.max(..._);f[p]=Qv[QN(x,c,d)]??Qv[0]}return{blocks:f.join(""),minX:s,maxX:a,minY:c,maxY:d}}function Jv(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}k`:e.toFixed(1)}function Zv({data:e,width:t=60,height:n=78,label:s,xLabel:a,yLabel:l,showAxes:u=!0,formatY:c=Jv,formatX:d=Jv}){const f=D.useMemo(()=>{const m=ZN(e,t),p=Math.max(t*6,240),_=10,x=8,C=[...e].sort((y,E)=>y.x-E.x).map(y=>{const E=m.maxX===m.minX?p/2:_+(y.x-m.minX)/(m.maxX-m.minX)*(p-_*2),N=m.maxY===m.minY?n/2:x+(m.maxY-y.y)/(m.maxY-m.minY)*(n-x*2);return{...y,cx:E,cy:N,leftPercent:E/p*100,topPercent:N/n*100}}),v=C.map((y,E)=>`${E===0?"M":"L"} ${y.cx.toFixed(1)} ${y.cy.toFixed(1)}`).join(" "),b=[m.maxY,(m.maxY+m.minY)/2,m.minY].map(y=>({value:y,y:m.maxY===m.minY?n/2:x+(m.maxY-y)/(m.maxY-m.minY)*(n-x*2)}));return{...m,chartWidth:p,points:C,path:v,gridLines:b}},[e,n,t]);return e.length===0?o.jsxs("div",{className:"font-mono text-text-muted text-xs",children:[s&&o.jsx("div",{className:"mb-1",children:s}),o.jsx("div",{children:"No data"})]}):o.jsxs("div",{className:"font-mono text-xs",children:[s&&o.jsx("div",{className:"text-text-secondary mb-2",children:s}),o.jsxs("div",{className:"flex gap-3",children:[u&&o.jsx("div",{className:"w-12 h-[78px] flex flex-col justify-between text-right text-text-muted",children:f.gridLines.map(m=>o.jsx("span",{children:c(m.value)},`${m.value}-${m.y}`))}),o.jsx("div",{className:"flex-1 min-w-0",children:o.jsxs("div",{className:"relative h-[78px]",children:[o.jsxs("svg",{viewBox:`0 0 ${f.chartWidth} ${n}`,className:"w-full h-[78px] overflow-visible",preserveAspectRatio:"none","aria-hidden":"true",children:[f.gridLines.map(m=>o.jsx("line",{x1:"0",x2:f.chartWidth,y1:m.y,y2:m.y,stroke:"currentColor",strokeDasharray:"3 4",className:"text-border/60"},`grid-${m.y}`)),f.points.map(m=>o.jsx("line",{x1:m.cx,x2:m.cx,y1:n-4,y2:m.cy,stroke:"currentColor",className:"text-border/40"},`guide-${m.cx}-${m.cy}`)),f.points.length>1&&o.jsx("path",{d:f.path,fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:"text-accent-primary/45"})]}),f.points.map(m=>o.jsx("div",{className:"absolute -translate-x-1/2 -translate-y-1/2",style:{left:`${m.leftPercent}%`,top:`${m.topPercent}%`},title:`${d(m.x)} -> ${c(m.y)}`,children:o.jsx("div",{className:"w-2.5 h-2.5 rounded-full bg-accent-primary/20 flex items-center justify-center",children:o.jsx("div",{className:"w-1.5 h-1.5 rounded-full bg-accent-primary"})})},`point-${m.x}-${m.y}`))]})})]}),u&&o.jsxs("div",{className:"flex items-start gap-3 text-text-muted mt-1",children:[o.jsx("span",{className:"w-12"}),o.jsxs("span",{className:"flex-1 flex justify-between",children:[o.jsx("span",{children:d(f.minX)}),o.jsx("span",{children:a}),o.jsx("span",{children:d(f.maxX)})]})]}),l&&u&&o.jsx("div",{className:"text-text-muted mt-1 text-center",children:l})]})}function eT({data:e,prefillLabel:t="Prefill Speed (tok/s) by Response",generationLabel:n="Generation Speed (tok/s) by Response",xLabel:s="response",width:a=60}){const l=e.map(c=>({x:c.x,y:c.ppSpeed})),u=e.map(c=>({x:c.x,y:c.tgSpeed}));return o.jsxs("div",{className:"space-y-5",children:[o.jsx(Zv,{data:l,width:a,label:t,xLabel:s}),o.jsx(Zv,{data:u,width:a,label:n,xLabel:s})]})}function tT(e){const t=new Map;for(const n of e.callDataPoints){const s=t.get(n.messageId)??[];t.set(n.messageId,[...s,n])}return e.dataPoints.map(n=>{const s=[...t.get(n.messageId)??[]].sort((a,l)=>a.callIndex-l.callIndex);return{...n,callCount:s.length,calls:s,isExpandable:s.length>1}})}function nT(e){return{mode:"responses",xLabel:"response",prefillLabel:"Prefill Speed (tok/s) by Response",generationLabel:"Generation Speed (tok/s) by Response",points:e.dataPoints.map(t=>({x:t.responseIndex,ppSpeed:t.prefillSpeed,tgSpeed:t.generationSpeed}))}}function rT(e){return{mode:"calls",xLabel:"context",prefillLabel:"Prefill Speed (tok/s) vs Context",generationLabel:"Generation Speed (tok/s) vs Context",points:e.callDataPoints.map(t=>({x:t.promptTokens,ppSpeed:t.prefillSpeed,tgSpeed:t.generationSpeed}))}}function sT(e){return e.callDataPoints.length>0?rT(e):nT(e)}function Hf(e){if(e<60)return`${e.toFixed(1)}s`;const t=Math.floor(e/60),n=e%60;return`${t}m ${n.toFixed(0)}s`}function Ti(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}k`:e.toString()}function Zo(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:e.toFixed(1)}function iT(e){if(e.length===0)return"0 ctx";const t=Math.min(...e),n=Math.max(...e);return t===n?`${Ti(t)} ctx`:`${Ti(t)}-${Ti(n)} ctx`}function gu(e){return`${Zo(e)} t/s`}function QS(e){try{return new Date(e).toLocaleTimeString("en-US",{hour12:!1})}catch{return e}}function aT(e){return{exportedAt:new Date().toISOString(),providerId:e.providerId,providerName:e.providerName,backend:e.backend,model:e.model,label:e.label,summary:{totalTime:e.totalTime,aiTime:e.aiTime,toolTime:e.toolTime,prefillTokens:e.prefillTokens,generationTokens:e.generationTokens,avgPrefillSpeed:e.avgPrefillSpeed,avgGenerationSpeed:e.avgGenerationSpeed,responseCount:e.responseCount,llmCallCount:e.llmCallCount},responses:e.dataPoints.map(t=>({responseIndex:t.responseIndex,timestamp:t.timestamp,mode:t.mode,prefillTokens:t.prefillTokens,generationTokens:t.generationTokens,prefillSpeed:t.prefillSpeed,generationSpeed:t.generationSpeed,totalTime:t.totalTime,aiTime:t.aiTime,toolTime:t.toolTime})),llmCalls:e.callDataPoints.map(t=>({sessionCallIndex:t.sessionCallIndex,responseIndex:t.responseIndex,callIndex:t.callIndex,timestamp:t.timestamp,mode:t.mode,promptTokens:t.promptTokens,completionTokens:t.completionTokens,ttft:t.ttft,completionTime:t.completionTime,prefillSpeed:t.prefillSpeed,generationSpeed:t.generationSpeed,totalTime:t.totalTime}))}}function oT({isOpen:e,onClose:t,stats:n}){const s=D.useRef(null),[a,l]=D.useState({}),[u,c]=D.useState(()=>{var w;return((w=n.modelGroups[0])==null?void 0:w.key)??""});D.useEffect(()=>{var w;n.modelGroups.some(C=>C.key===u)||c(((w=n.modelGroups[0])==null?void 0:w.key)??"")},[u,n.modelGroups]);const d=D.useMemo(()=>n.modelGroups.find(w=>w.key===u)??n.modelGroups[0],[u,n.modelGroups]),f=D.useMemo(()=>d?tT(d):[],[d]),m=D.useMemo(()=>d?sT(d):{mode:"responses",xLabel:"response",prefillLabel:"",generationLabel:"",points:[]},[d]),p=D.useCallback(w=>{l(C=>({...C,[w]:!C[w]}))},[]),_=D.useCallback(()=>{if(!d)return;const w=aT(d);navigator.clipboard.writeText(JSON.stringify(w,null,2)).catch(C=>console.error("Failed to copy:",C))},[d]),x=D.useCallback(async()=>{if(s.current)try{const w=(await Q(async()=>{const{default:S}=await import("./html2canvas.esm-QH1iLAAe.js");return{default:S}},[])).default,C=await w(s.current,{backgroundColor:"#1a1a1a",scale:2}),v=document.createElement("a");v.download=`openfox-stats-${new Date().toISOString().slice(0,10)}.png`,v.href=C.toDataURL("image/png"),v.click()}catch(w){console.error("Failed to export PNG:",w),_()}},[_]);return o.jsx(Ot,{isOpen:e,onClose:t,title:"Session Stats",size:"lg",children:o.jsxs("div",{ref:s,className:"space-y-6",children:[o.jsx("section",{children:o.jsx("div",{className:"flex flex-wrap gap-2",children:n.modelGroups.map(w=>o.jsx("button",{onClick:()=>c(w.key),className:`px-3 py-1.5 rounded border text-xs transition-colors ${w.key===(d==null?void 0:d.key)?"border-accent-primary bg-accent-primary/10 text-accent-primary":"border-border text-text-muted hover:text-text-primary hover:bg-bg-tertiary/40"}`,title:w.label,children:w.label},w.key))})}),d&&o.jsxs("section",{children:[o.jsx("h3",{className:"text-sm font-semibold text-text-secondary mb-3 uppercase tracking-wide",children:"Summary"}),o.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-5 gap-4",children:[o.jsx(rs,{label:"AI Time",value:Hf(d.aiTime)}),o.jsx(rs,{label:"Total Time",value:Hf(d.totalTime)}),o.jsx(rs,{label:"Tool Time",value:Hf(d.toolTime)}),o.jsx(rs,{label:"Responses",value:d.responseCount.toString()}),o.jsx(rs,{label:"LLM Calls",value:d.llmCallCount.toString()})]}),o.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4 mt-3",children:[o.jsx(rs,{label:"Prefill Tokens",value:Ti(d.prefillTokens),subValue:`@ ${Zo(d.avgPrefillSpeed)} tok/s`}),o.jsx(rs,{label:"Gen Tokens",value:Ti(d.generationTokens),subValue:`@ ${Zo(d.avgGenerationSpeed)} tok/s`}),o.jsx(rs,{label:"Avg PP Speed",value:`${Zo(d.avgPrefillSpeed)}`,subValue:"tok/s"}),o.jsx(rs,{label:"Avg TG Speed",value:`${Zo(d.avgGenerationSpeed)}`,subValue:"tok/s"})]})]}),d&&m.points.length>1&&o.jsxs("section",{children:[o.jsxs("div",{className:"flex items-center justify-between mb-3",children:[o.jsx("h3",{className:"text-sm font-semibold text-text-secondary uppercase tracking-wide",children:"Performance Progression"}),o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("button",{onClick:_,className:"px-2 py-1 text-xs text-text-muted hover:text-text-primary hover:bg-bg-tertiary rounded transition-colors",children:"Copy JSON"}),o.jsx("button",{onClick:x,className:"px-2 py-1 text-xs text-text-muted hover:text-text-primary hover:bg-bg-tertiary rounded transition-colors",children:"Save PNG"})]})]}),o.jsx("div",{className:"bg-bg-tertiary/50 rounded p-4",children:o.jsx(eT,{data:m.points,width:50,prefillLabel:m.prefillLabel,generationLabel:m.generationLabel,xLabel:m.xLabel})})]}),d&&o.jsxs("section",{children:[o.jsxs("h3",{className:"text-sm font-semibold text-text-secondary mb-3 uppercase tracking-wide",children:["Response Log (",d.responseCount," responses)"]}),o.jsx("div",{className:"overflow-y-auto bg-bg-tertiary/30 rounded",children:o.jsxs("table",{className:"w-full table-fixed border-separate border-spacing-0 text-xs",children:[o.jsxs("colgroup",{children:[o.jsx("col",{className:"w-[7%]"}),o.jsx("col",{className:"w-[14%]"}),o.jsx("col",{className:"w-[10%]"}),o.jsx("col",{className:"w-[14%]"}),o.jsx("col",{className:"w-[14%]"}),o.jsx("col",{className:"w-[14%]"}),o.jsx("col",{className:"w-[11%]"}),o.jsx("col",{className:"w-[2%]"})]}),o.jsx("thead",{children:o.jsxs("tr",{className:"text-[10px] uppercase tracking-wide text-text-muted/80",children:[o.jsx("th",{className:"px-3 py-2 text-center font-medium",children:"#"}),o.jsx("th",{className:"px-2 py-2 text-center font-medium",children:"At"}),o.jsx("th",{className:"px-2 py-2 text-center font-medium",children:"Time"}),o.jsx("th",{className:"px-2 py-2 text-center font-medium",children:"Context"}),o.jsx("th",{className:"px-2 py-2 text-center font-medium",children:"PP t/s"}),o.jsx("th",{className:"px-2 py-2 text-center font-medium",children:"TG t/s"}),o.jsx("th",{className:"px-2 py-2 text-center font-medium",children:"Calls"}),o.jsx("th",{className:"px-2 py-2"})]})}),o.jsx("tbody",{children:f.map((w,C)=>o.jsxs(D.Fragment,{children:[o.jsx(lT,{row:w,index:C,isExpanded:a[w.messageId]??!1,onToggle:w.isExpandable?()=>p(w.messageId):void 0}),(a[w.messageId]??!1)&&w.calls.map((v,S)=>o.jsx(cT,{dataPoint:v,index:S},`${v.messageId}-${v.callIndex}`))]},w.messageId))})]})})]})]})})}function rs({label:e,value:t,subValue:n}){return o.jsxs("div",{className:"bg-bg-tertiary/50 rounded p-3",children:[o.jsx("div",{className:"text-text-muted text-xs mb-1",children:e}),o.jsx("div",{className:"text-text-primary text-lg font-semibold",children:t}),n&&o.jsx("div",{className:"text-text-muted text-xs",children:n})]})}function lT({row:e,index:t,isExpanded:n,onToggle:s}){const a=e.calls.length>0?iT(e.calls.map(l=>l.promptTokens)):`${Ti(e.prefillTokens)} ctx`;return o.jsxs("tr",{onClick:s,className:`${t%2===0?"bg-bg-tertiary/20":""} ${s?"cursor-pointer hover:bg-bg-tertiary/35 transition-colors":""}`,children:[o.jsx("td",{className:"px-3 py-2 text-center text-text-muted align-middle",children:e.responseIndex}),o.jsx("td",{className:"px-2 py-2 text-center text-text-muted font-mono align-middle whitespace-nowrap",children:QS(e.timestamp)}),o.jsxs("td",{className:"px-2 py-2 text-center text-text-muted align-middle whitespace-nowrap",children:[e.totalTime.toFixed(1),"s"]}),o.jsx("td",{className:"px-2 py-2 text-center text-text-primary font-mono align-middle whitespace-nowrap",children:a.replace(/ ctx$/,"")}),o.jsx("td",{className:"px-2 py-2 text-center text-text-primary font-mono align-middle whitespace-nowrap",children:gu(e.prefillSpeed)}),o.jsx("td",{className:"px-2 py-2 text-center text-text-primary font-mono align-middle whitespace-nowrap",children:gu(e.generationSpeed)}),o.jsx("td",{className:"px-2 py-2 text-center text-text-muted font-mono align-middle whitespace-nowrap",children:e.callCount}),o.jsx("td",{className:"px-2 py-2 text-center text-text-muted align-middle whitespace-nowrap",children:e.isExpandable?n?"v":">":""})]})}function cT({dataPoint:e,index:t}){const n=e.temperature!==void 0||e.topP!==void 0||e.topK!==void 0||e.maxTokens!==void 0;return o.jsxs(o.Fragment,{children:[o.jsxs("tr",{className:`${t%2===0?"bg-bg-tertiary/10":"bg-bg-tertiary/5"}`,children:[o.jsxs("td",{className:"px-3 py-2 pl-6 text-center text-text-muted align-middle border-l border-border/60",children:["c",e.callIndex]}),o.jsx("td",{className:"px-2 py-2 text-center text-text-muted font-mono align-middle whitespace-nowrap",children:QS(e.timestamp)}),o.jsxs("td",{className:"px-2 py-2 text-center text-text-muted align-middle whitespace-nowrap",children:[e.totalTime.toFixed(1),"s"]}),o.jsx("td",{className:"px-2 py-2 text-center text-text-primary font-mono align-middle whitespace-nowrap",children:Ti(e.promptTokens)}),o.jsx("td",{className:"px-2 py-2 text-center text-text-primary font-mono align-middle whitespace-nowrap",children:gu(e.prefillSpeed)}),o.jsx("td",{className:"px-2 py-2 text-center text-text-primary font-mono align-middle whitespace-nowrap",children:gu(e.generationSpeed)}),o.jsx("td",{className:"px-2 py-2 text-center text-text-muted font-mono align-middle whitespace-nowrap",children:e.callIndex}),o.jsx("td",{className:"px-2 py-2"})]}),n&&o.jsx("tr",{className:`${t%2===0?"bg-bg-tertiary/5":"bg-bg-tertiary/[2.5%]"}`,children:o.jsx("td",{colSpan:8,className:"px-6 py-1.5 border-l border-border/60",children:o.jsxs("div",{className:"flex flex-wrap gap-x-4 gap-y-1 text-[10px] text-text-muted",children:[e.temperature!==void 0&&o.jsxs("span",{children:["temp: ",e.temperature.toFixed(2)]}),e.topP!==void 0&&o.jsxs("span",{children:["topP: ",e.topP.toFixed(2)]}),e.topK!==void 0&&o.jsxs("span",{children:["topK: ",e.topK]}),e.maxTokens!==void 0&&o.jsxs("span",{children:["maxTok: ",e.maxTokens]})]})})})]})}const uT={passed:{icon:"✓",color:"text-accent-success"},completed:{icon:"◉",color:"text-purple-400"},failed:{icon:"✗",color:"text-accent-error"},resolved:{icon:"✓",color:"text-accent-success"},dismissed:{icon:"–",color:"text-text-muted"},open:{icon:"○",color:"text-accent-warning"},pending:{icon:"○",color:"text-text-muted"},in_progress:{icon:"◌",color:"text-accent-warning"}},dT=["open","in_progress","pending","completed","resolved","dismissed","passed","failed"];function hT(e){return uT[e]??{icon:"○",color:"text-text-muted"}}function JS(e){const t=document.createElement("textarea");return t.innerHTML=e,t.value}const Ku=D.memo(function({status:t,className:n="text-xs leading-tight flex-shrink-0"}){const{icon:s,color:a}=hT(t);return o.jsx("span",{className:`${a} ${n}`,children:s})});function eb({entries:e,title:t}){const n=D.useMemo(()=>e.reduce((s,a)=>(s[a.status]=(s[a.status]??0)+1,s),{}),[e]);return o.jsxs("h3",{className:"text-sm font-semibold text-text-primary mb-2 flex items-center justify-between",children:[o.jsx("span",{children:t}),Object.keys(n).length>0&&o.jsx("span",{className:"font-normal text-xs flex items-center gap-1.5",children:dT.map(s=>{const a=n[s];return a?o.jsxs("span",{className:"flex items-center gap-0.5",children:[o.jsx(Ku,{status:s}),o.jsx("span",{children:a})]},s):null})})]})}const fT=D.memo(function({entries:t,title:n}){return t.length===0?null:o.jsxs("div",{className:"my-1 rounded border border-border bg-secondary overflow-hidden",children:[n&&o.jsx("div",{className:"px-1.5 py-1 border-b border-border bg-secondary",children:o.jsx("span",{className:"text-xs font-medium text-text-muted",children:n})}),o.jsx("div",{className:"bg-primary",children:t.map((s,a)=>o.jsxs("div",{className:`flex items-start gap-1 px-1.5 py-1 ${a>0?"border-t border-border":""}`,children:[o.jsx(Ku,{status:s.status}),o.jsxs("div",{className:"flex-1 min-w-0 text-xs truncate",children:[o.jsxs("span",{className:"text-text-muted",children:["[",s.id,"]"]})," ",JS(s.description)]})]},s.id??a))})]})}),mT="#6b7280";function ol(e,t){var n;return((n=e.find(s=>s.id===t))==null?void 0:n.color)??mT}const gt=Yn(e=>{const t=async()=>{await yp("/api/agents",e,!0)};return{defaults:[],userItems:[],projectItems:[],loading:!1,fetchAgents:t,fetchAgent:async n=>{try{const s=await Ae(`/api/agents/${n}`);return s.ok?await s.json():null}catch{return null}},fetchDefaultContent:async n=>{try{const s=await Ae(`/api/agents/defaults/${n}`);return s.ok?await s.json():null}catch{return null}},createAgent:async(n,s)=>{const a=await qs("POST","/api/agents",{...n,destination:s});return a.success&&await t(),a},updateAgent:async(n,s)=>{const a=await qs("PUT",`/api/agents/${n}`,s);return a.success&&await t(),a},deleteAgent:async n=>{try{const s=await Ae(`/api/agents/${n}`,{method:"DELETE"}),a=await s.json();return s.ok?(e(l=>({userItems:l.userItems.filter(u=>u.id!==n)})),{success:!0}):{success:!1,error:a.error??"Failed to delete"}}catch{return{success:!1,error:"Network error"}}},duplicateAgent:async(n,s)=>zu(`/api/agents/${n}/duplicate`,t,s)}}),jt=Yn((e,t)=>({defaults:[],userItems:[],projectItems:[],activeWorkflowId:"default",loading:!1,templateVariables:[],fetchTemplateVariables:async()=>{try{const s=await(await Ae("/api/workflows/template-variables")).json();e({templateVariables:s.variables??[]})}catch{}},fetchWorkflows:async()=>{e({loading:!0});try{const s=await(await Ae("/api/workflows")).json();e({defaults:s.defaults??[],userItems:s.userItems??[],projectItems:s.projectItems??[],activeWorkflowId:s.activeWorkflowId??"default",loading:!1})}catch{e({loading:!1})}},fetchWorkflow:async n=>{try{const s=await Ae(`/api/workflows/${n}`);return s.ok?await s.json():null}catch{return null}},fetchDefaultContent:async n=>{try{const s=await Ae(`/api/workflows/defaults/${n}`);return s.ok?await s.json():null}catch{return null}},createWorkflow:async(n,s)=>{const a=await qs("POST","/api/workflows",{...n,destination:s});return a.success&&await t().fetchWorkflows(),a},updateWorkflow:async(n,s)=>{const a=await qs("PUT",`/api/workflows/${n}`,s);return a.success&&await t().fetchWorkflows(),a},deleteWorkflow:async n=>{try{const s=await Ae(`/api/workflows/${n}`,{method:"DELETE"}),a=await s.json();return s.ok?(e(l=>({userItems:l.userItems.filter(u=>u.id!==n)})),{success:!0}):{success:!1,error:a.error??"Failed to delete"}}catch{return{success:!1,error:"Network error"}}},duplicateWorkflow:async(n,s)=>zu(`/api/workflows/${n}/duplicate`,()=>t().fetchWorkflows(),s)})),pT={pending:"completed",completed:"passed",passed:"failed",failed:"pending"};async function gT(e,t){await Ae(`/api/sessions/${e}/criteria`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({criteria:t})})}function Gc({id:e,agents:t}){const n=ol(t,e),s=t.find(a=>a.id===e);return o.jsx("span",{className:"font-medium rounded px-1",style:{backgroundColor:`${n}20`,color:n},children:(s==null?void 0:s.name)??e})}function xT({id:e}){const t=jt(u=>u.defaults),n=jt(u=>u.userItems),a=D.useMemo(()=>[...t,...n],[t,n]).find(u=>u.id===e),l=(a==null?void 0:a.color)??"#3b82f6";return o.jsx("span",{className:"font-medium rounded px-1",style:{backgroundColor:`${l}20`,color:l},children:(a==null?void 0:a.name)??e})}function _T({entries:e,sessionId:t}){const[n,s]=D.useState(e),[a,l]=D.useState(!1),[u,c]=D.useState(null),[d,f]=D.useState(""),[m,p]=D.useState(""),[_,x]=D.useState(!1),[w,C]=D.useState(!1),v=gt(z=>z.defaults),S=gt(z=>z.userItems),b=gt(z=>z.projectItems),y=D.useMemo(()=>[...v,...S,...b],[v,S,b]),E=D.useRef(null),N=D.useRef(null);D.useEffect(()=>{s(e)},[e]),D.useEffect(()=>{var z;a&&((z=E.current)==null||z.focus())},[a]),D.useEffect(()=>{var z;u&&((z=N.current)==null||z.focus())},[u]);const T=D.useCallback(z=>{s(z),gT(t,z)},[t]),L=D.useCallback(()=>{var H;const z=d.trim();if(!z)return;const X=String(n.length),te=[...n,{id:X,description:z,status:"pending"}];T(te),f(""),(H=E.current)==null||H.focus()},[n,d,T]),A=D.useCallback(()=>{l(!1),f("")},[]),R=D.useCallback((z,X)=>{c(z),p(X)},[]),M=D.useCallback(()=>{if(!u)return;const z=m.trim(),X=n.map(te=>te.id===u?{...te,description:z||te.description}:te);T(X),c(null)},[u,m,n,T]),G=D.useCallback(z=>{const X=n.map(te=>te.id===z?{...te,status:pT[te.status]??"pending"}:te);T(X)},[n,T]),W=D.useCallback(z=>{T(n.filter(X=>X.id!==z))},[n,T]),O=D.useCallback(()=>{T([]),x(!1)},[T]),U=D.useCallback(z=>{z.key==="Enter"&&(z.preventDefault(),L()),z.key==="Escape"&&A()},[L,A]),V=D.useCallback(z=>{z.key==="Enter"&&M(),z.key==="Escape"&&c(null)},[M]);return o.jsxs("div",{className:"my-1 rounded border border-border bg-secondary overflow-hidden",children:[o.jsxs("div",{className:"bg-primary",children:[n.length===0&&!a&&o.jsxs("div",{className:"px-1.5 py-2 text-xs text-text-muted italic text-center",children:["No criteria yet."," ",o.jsx("button",{onClick:()=>C(!0),className:"text-accent-primary hover:underline not-italic cursor-pointer",children:"Learn more"})]}),n.map((z,X)=>{const te=z.status,H=u===z.id;return o.jsxs("div",{className:`flex items-start gap-1 px-1.5 py-1 group ${X>0?"border-t border-border":""}`,children:[o.jsx("button",{onClick:()=>G(z.id),className:"text-xs leading-tight flex-shrink-0 cursor-pointer hover:opacity-70 transition-opacity",title:`Status: ${z.status} (click to cycle)`,children:o.jsx(Ku,{status:te})}),o.jsx("div",{className:"flex-1 min-w-0",children:H?o.jsx("input",{ref:N,value:m,onChange:I=>p(I.target.value),onBlur:M,onKeyDown:V,className:"w-full bg-bg-tertiary text-text-primary text-xs px-1.5 py-0.5 rounded border border-border focus:outline-none focus:border-accent-primary"}):o.jsxs("button",{onClick:()=>R(z.id,z.description),className:"text-xs text-text-primary text-left hover:text-accent-primary transition-colors w-full truncate cursor-pointer",title:"Click to edit",children:["[",z.id,"] ",JS(z.description)]})}),o.jsx("button",{onClick:()=>W(z.id),className:"flex-shrink-0 opacity-0 group-hover:opacity-100 text-text-muted hover:text-accent-error transition-all ml-0.5 cursor-pointer flex items-center self-center",title:"Delete criterion",children:o.jsx(_l,{className:"w-4 h-4"})})]},z.id)})]}),a&&o.jsx("div",{className:"px-1.5 py-1 border-t border-border bg-secondary",children:o.jsxs("div",{className:"flex items-center gap-1",children:[o.jsx("span",{className:"text-text-muted text-xs leading-tight flex-shrink-0",children:"○"}),o.jsx("input",{ref:E,value:d,onChange:z=>f(z.target.value),onKeyDown:U,placeholder:"New criterion...",className:"flex-1 bg-bg-tertiary text-text-primary text-xs px-1.5 py-0.5 rounded border border-border focus:outline-none focus:border-accent-primary placeholder-text-muted"})]})}),o.jsxs("div",{className:"px-1.5 py-1 border-t border-border bg-secondary flex items-center gap-2",children:[a?o.jsxs(o.Fragment,{children:[o.jsxs("button",{onClick:L,className:"flex items-center gap-1 text-xs text-accent-primary hover:text-accent-primary/70 transition-colors cursor-pointer",title:"Add criterion",children:[o.jsx(Ks,{className:"w-3 h-3"}),"Add"]}),o.jsx("button",{onClick:A,className:"flex items-center gap-1 text-xs text-text-muted hover:text-text-primary transition-colors cursor-pointer",title:"Cancel",children:"Cancel"})]}):o.jsxs("button",{onClick:()=>l(!0),className:"flex items-center gap-1 text-xs text-text-muted hover:text-accent-primary transition-colors cursor-pointer",title:"Add criterion",children:[o.jsx(Ks,{className:"w-3 h-3"}),"Add"]}),n.length>0&&o.jsxs("button",{onClick:()=>x(!0),className:"flex items-center gap-1 text-xs text-text-muted hover:text-accent-error transition-colors ml-auto cursor-pointer",title:"Clear all criteria",children:[o.jsx(xl,{className:"w-3 h-3"}),"Clear all"]}),o.jsx("button",{onClick:()=>C(!0),className:"flex items-center gap-1 text-xs text-text-muted hover:text-accent-primary transition-colors cursor-pointer",title:"About criteria",children:o.jsx(CS,{className:"w-3 h-3"})})]}),_&&o.jsx("div",{className:"px-1.5 py-1 border-t border-border bg-secondary",children:o.jsxs("div",{className:"flex items-center gap-2 justify-between",children:[o.jsx("span",{className:"text-xs text-accent-error",children:"Clear all criteria?"}),o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("button",{onClick:O,className:"text-xs text-accent-error hover:text-accent-error/70 transition-colors cursor-pointer",children:"Yes"}),o.jsx("button",{onClick:()=>x(!1),className:"text-xs text-text-muted hover:text-text-primary transition-colors cursor-pointer",children:"No"})]})]})}),o.jsx(Ot,{isOpen:w,onClose:()=>C(!1),title:"About Acceptance Criteria",size:"md",children:o.jsxs("div",{className:"space-y-3 text-sm text-text-secondary",children:[o.jsx("p",{children:"Each criterion defines a specific requirement that needs to be met."}),o.jsxs("p",{children:["To use this feature, start in ",o.jsx(Gc,{id:"planner",agents:y})," mode and",o.jsxs("strong",{className:"text-text-primary",children:[" ","ask the agent to define acceptance criteria that matches your goal"]}),". Then launch the ",o.jsx(xT,{id:"default"})," builtin workflow to launch the automation part."]}),o.jsx("p",{children:"This workflow will automatically:"}),o.jsxs("ol",{className:"list-decimal list-inside space-y-1",children:[o.jsxs("li",{children:["Launch the ",o.jsx(Gc,{id:"builder",agents:y}),' agent, that will be forced to continue until it marks all criteria as "completed"']}),o.jsxs("li",{children:["Then launch the ",o.jsx(Gc,{id:"verifier",agents:y})," subagent, that will verify each criterion. If every criterion is fulfilled, then it goes to the next step, otherwise, it gives feedback to the main agent until 100% of the criteria are met."]}),o.jsxs("li",{children:["Launch a ",o.jsx(Gc,{id:"code_reviewer",agents:y})," subagent, that will analyze the code to provide actionable feedback to the main agent."]})]}),o.jsx("div",{className:"bg-bg-tertiary rounded p-3 space-y-1.5",children:o.jsx("p",{children:"This lets smaller models follow complex plans to completion and improves the chances that nothing from your plan is missed."})})]})})]})}function yT({isOpen:e,onClose:t}){const n=Or(C=>C.config),s=Or(C=>C.saveConfig),[a,l]=D.useState(""),[u,c]=D.useState(""),[d,f]=D.useState(!1),[m,p]=D.useState(!1),[_,x]=D.useState(!1);D.useEffect(()=>{e&&(l((n==null?void 0:n.command)??""),c((n==null?void 0:n.url)??""),f((n==null?void 0:n.hotReload)??!1),p((n==null?void 0:n.disableInspect)??!1))},[e,n]);const w=async()=>{!a.trim()||!u.trim()||(x(!0),await s({command:a.trim(),url:u.trim(),hotReload:d,disableInspect:m}),x(!1),t())};return o.jsx(Ot,{isOpen:e,onClose:t,title:"Dev Server Config",size:"sm",children:o.jsxs("div",{className:"space-y-4",children:[o.jsxs("div",{children:[o.jsx("label",{className:"block text-xs text-text-secondary mb-1",children:"Command"}),o.jsx("input",{className:"input w-full",type:"text",value:a,onChange:C=>l(C.target.value),placeholder:"npm run dev"})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-xs text-text-secondary mb-1",children:"Dev URL"}),o.jsx("input",{className:"input w-full",type:"text",value:u,onChange:C=>c(C.target.value),placeholder:"http://localhost:3000"})]}),o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("input",{type:"checkbox",id:"hotReload",checked:d,onChange:C=>f(C.target.checked),className:"rounded border-border bg-bg-tertiary"}),o.jsx("label",{htmlFor:"hotReload",className:"text-xs text-text-secondary",children:"Hot Reload"})]}),o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("input",{type:"checkbox",id:"disableInspect",checked:m,onChange:C=>p(C.target.checked),className:"rounded border-border bg-bg-tertiary"}),o.jsx("label",{htmlFor:"disableInspect",className:"text-xs text-text-secondary",children:"Disable inspect feedback"})]}),o.jsxs("div",{className:"flex justify-end gap-2 pt-2",children:[o.jsx("button",{className:"btn btn-secondary",onClick:t,children:"Cancel"}),o.jsx("button",{className:"btn btn-primary",onClick:w,disabled:_||!a.trim()||!u.trim(),children:_?"Saving...":"Save"})]})]})})}const tb={30:"text-black",31:"text-red-400",32:"text-accent-success",33:"text-accent-warning",34:"text-blue-400",35:"text-purple-400",36:"text-cyan-400",37:"text-gray-300",90:"text-gray-500",91:"text-red-500",92:"text-green-500",93:"text-yellow-400",94:"text-blue-500",95:"text-pink-400",96:"text-cyan-500",97:"text-white"},vT={40:"bg-black",41:"bg-red-900",42:"bg-green-900",43:"bg-yellow-900",44:"bg-blue-900",45:"bg-purple-900",46:"bg-cyan-900",47:"bg-gray-700"},nb={1:"font-bold",2:"opacity-75",4:"underline",7:"bg-bg-secondary"},bT="text-text-primary";function ST(e){const t=[],n=new RegExp("\x1B\\[([0-9;]+)m","g");let s=0,a="text-text-primary",l;try{for(;(l=n.exec(e))!==null;){if(l.index>s){const f=e.slice(s,l.index);f&&t.push({text:f,className:a})}const u=l[1];if(!u)continue;const c=u.split(";").map(Number);if(c.length===0||c[0]===0){a="text-text-primary";continue}const d=[];for(const f of c)if(f>=30&&f<=37){const m=tb[f];m&&d.push(m)}else if(f>=40&&f<=47){const m=vT[f];m&&d.push(m)}else if(f>=90&&f<=97){const m=tb[f];m&&d.push(m)}else if(f in nb){const m=nb[f];m&&d.push(m)}else f===39?d.push(bT):f===49&&(a=a.split(" ").filter(m=>!m.startsWith("bg-")).join(" "));d.length>0&&(a=d.join(" ")),s=n.lastIndex}if(s<e.length){const u=e.slice(s);u&&t.push({text:u,className:a})}return t}catch(u){return console.warn("ANSI parsing failed, stripping codes:",u),[{text:wT(e),className:"text-text-primary"}]}}function wT(e){return e.replace(new RegExp("\x1B\\[([0-9;]+)m","g"),"")}function xu(e){const t=ST(e),n=[];return t.forEach((s,a)=>{const l=s.text.split(`
|
|
89
|
+
`,children:[o.jsxs("div",{className:"p-4 border-b border-border flex gap-2",children:[o.jsx(qn,{href:`/p/${e}/new`,className:"flex-1 block text-center rounded font-medium transition-colors bg-accent-primary/25 text-text-primary hover:bg-accent-primary/40 px-3 py-1.5 text-sm","data-testid":"sidebar-new-session-button",children:"+ New Session"}),o.jsx(yl,{items:[{label:"Edit project settings",onClick:()=>l(!0)},{label:"Delete all sessions",onClick:E,danger:!0}],trigger:o.jsx("button",{className:"flex-shrink-0 p-2.5 rounded hover:bg-bg-tertiary text-text-muted hover:text-text-primary transition-colors",title:"Options",children:o.jsx(mp,{})})}),n&&o.jsx(bl,{onClick:n,className:"md:hidden",variant:"sidebar",size:"md"})]}),w&&o.jsx(IN,{isOpen:a,onClose:()=>l(!1),project:w}),o.jsx("div",{className:"flex-1 overflow-y-auto",children:S.length===0?o.jsx("div",{className:"p-4 text-center text-text-muted text-xs",children:"No sessions"}):o.jsxs(o.Fragment,{children:[o.jsx("div",{className:"divide-y divide-border",children:zN(S,c,d,b,y,e)}),x&&o.jsx("div",{className:"p-4 text-center text-text-muted text-xs",children:"Loading more..."}),o.jsx("div",{ref:C,className:"h-px"})]})})]})]})}function zN(e,t,n,s,a,l){const u=WS(e);return Array.from(u).map(([c,d])=>{const f=d[0];return f?o.jsxs("div",{children:[o.jsx("div",{className:"px-4 py-2 bg-bg-tertiary/30 text-text-muted text-xs font-medium",children:VS(f.updatedAt)}),d.map(m=>{const p=(t==null?void 0:t.id)===m.id,_=n.includes(m.id),x=m.isRunning;return o.jsx("div",{className:`w-full px-4 py-3 text-left hover:bg-bg-tertiary/50 transition-colors group ${p?"bg-bg-tertiary":""}`,children:o.jsxs(qn,{href:`/p/${l}/s/${m.id}`,className:`block ${p?"text-accent-primary":"text-text-primary"} hover:text-accent-primary`,children:[o.jsxs("div",{className:"flex justify-between items-center mb-1",children:[o.jsx("span",{className:`font-medium truncate text-sm ${p?"text-accent-primary":"text-text-primary"}`,children:m.title??m.id.slice(0,6)}),o.jsx(yl,{items:[{label:"Rename session",onClick:w=>a(m.id,w)},{label:"Delete session",onClick:w=>s(m.id,w),danger:!0}],trigger:o.jsx("button",{onClick:w=>w.preventDefault(),className:"p-1.5 rounded hover:bg-bg-tertiary text-text-muted hover:text-text-primary transition-all",title:"Options",children:o.jsx(mp,{})})})]}),o.jsxs("div",{className:"flex items-center gap-2 mt-1",children:[x?o.jsx(Bj,{}):_&&!p?o.jsx("span",{"aria-label":"Unread activity",title:"Unread activity",className:"w-2 h-2 rounded-full bg-amber-400 flex-shrink-0"}):null,o.jsx("span",{className:"text-text-muted text-xs flex-shrink-0",children:qu(m.updatedAt)}),o.jsxs("span",{className:"text-text-muted text-xs flex-shrink-0",children:[m.messageCount," messages"]})]})]})},m.id)})]},c):null})}const Kv=["⠋","⠙","⠹","⠸","⠼","⠴"];function $N(){var c;const e=Rt(d=>d.currentProject),t=Ne(d=>d.currentSession),n=$u(),s=!1,a=D.useRef(0),l=D.useRef(null);D.useEffect(()=>(n?(l.current=window.setInterval(()=>{a.current=(a.current+1)%Kv.length,u()},150),u()):(l.current&&(clearInterval(l.current),l.current=null),u()),()=>{l.current&&(clearInterval(l.current),l.current=null)}),[n,e,t,s]);const u=()=>{var p;const f=(p=t==null?void 0:t.metadata)==null?void 0:p.title,m=n?`${Kv[a.current]} `:"";e&&f?document.title=`${m}${e.name} - ${f} | OpenFox`:e?document.title=`${m}${e.name} | OpenFox`:document.title=`${m}OpenFox`};return typeof window<"u"&&((c=t==null?void 0:t.metadata)!=null&&c.title)&&window.document.documentElement.setAttribute("data-session-title",t.metadata.title),null}function KS(e,t=28){if(e.length<=t)return e;const n=e.split("/").filter(Boolean);if(n.length<=2)return e;const s=n[0],a=n[n.length-1],l=n.slice(1,-1).join("/"),u=t-s.length-a.length-3;if(u<0)return e;const c=l.slice(0,Math.floor(u/2)),d=l.slice(-Math.ceil(u/2));return`/${s}/${c}...${d}/${a}`}function YS({isOpen:e,onClose:t,projectName:n,onConfirm:s}){const a=()=>{s(),t()};return o.jsx(Ot,{isOpen:e,onClose:t,title:"Delete Project",size:"sm",children:o.jsxs("div",{className:"space-y-4",children:[o.jsxs("p",{className:"text-text-secondary",children:["This will permanently delete the project"," ",o.jsx("span",{className:"font-semibold text-text-primary",children:n})," and all its sessions from OpenFox. The project files on disk will remain untouched."]}),o.jsxs("div",{className:"flex justify-end gap-2",children:[o.jsx(tt,{variant:"secondary",onClick:t,children:"Cancel"}),o.jsx(tt,{variant:"danger",onClick:a,children:"Delete"})]})]})})}function HN({isOpen:e,onClose:t}){const[,n]=hr(),[s,a]=D.useState(!1),l=FS(),[u,c]=D.useState(!1),d=Rt(A=>A.projects),f=Rt(A=>A.createProject),m=Rt(A=>A.listProjects),p=Rt(A=>A.deleteProject),[_,x]=D.useState(null),[w,C]=D.useState(null);D.useEffect(()=>{e&&m()},[e,m]);const v=A=>{n(`/p/${A}`),t()},S=(A,R)=>{R.stopPropagation(),x(A)},b=()=>{_&&(p(_.id),x(null))},y=async A=>N(A);function E(A){return A!=null&&typeof A=="object"&&"error"in A&&A.error!=null&&typeof A.error=="object"&&"code"in A.error&&A.error.code==="EACCES"}async function N(A){const R=A.split("/").filter(Boolean).pop()??"",M=await f(R,A);return m(),E(M)?(C(M.error.path||A),!1):M&&"id"in M?(n(`/p/${M.id}`),t(),!0):!1}const T=D.useCallback(()=>{C(null)},[]),L=D.useCallback(async()=>{const A=w;C(null),A&&await N(A)},[w]);return e?o.jsxs(Ot,{isOpen:e,onClose:t,title:"Open Project",size:"xl",footer:o.jsx("div",{className:"flex justify-end gap-2",children:o.jsx(tt,{variant:"secondary",onClick:t,children:"Close"})}),children:[o.jsxs("div",{className:"flex flex-col sm:flex-row flex-1 -m-4",children:[o.jsxs("div",{className:"w-full sm:w-1/2 border-b sm:border-b-0 sm:border-r border-border flex flex-col max-h-[40vh] sm:max-h-[50vh]",children:[o.jsx("div",{className:"p-3 border-b border-border bg-bg-tertiary/30 shrink-0",children:o.jsx("h3",{className:"font-medium text-sm text-text-secondary",children:"Recent Projects"})}),o.jsx("div",{className:"flex-1 overflow-y-auto",children:d.length===0?o.jsxs("div",{className:"p-6 text-center text-text-muted text-sm",children:[o.jsx("p",{className:"mb-2",children:"No recent projects"}),o.jsx("p",{className:"text-xs",children:'Click "Create new project" to add one'})]}):o.jsx("div",{className:"divide-y divide-border",children:d.map(A=>o.jsxs("div",{className:"group flex items-center gap-3 p-3 hover:bg-bg-tertiary/50 transition-colors",children:[o.jsxs("button",{onClick:()=>v(A.id),className:"flex-1 flex items-center gap-3 text-left",children:[o.jsx(Hu,{className:"w-5 h-5 text-accent-primary"}),o.jsxs("div",{className:"flex-1 min-w-0",children:[o.jsx("div",{className:"font-medium truncate",children:A.name}),o.jsx("div",{className:"text-xs text-text-muted truncate",children:KS(A.workdir,32)})]})]}),o.jsx("button",{onClick:R=>S(A,R),className:"text-accent-error/70 hover:text-accent-error p-1",title:"Delete project",children:o.jsx(xl,{className:"w-4 h-4"})})]},A.id))})})]}),o.jsx("div",{className:"w-full sm:w-1/2 flex flex-col items-center justify-center p-6 sm:p-8 text-center",children:o.jsxs("div",{className:"flex flex-col gap-3 w-full max-w-sm",children:[o.jsx(tt,{variant:"primary",onClick:()=>c(!0),children:"Select existing project"}),o.jsx(tt,{variant:"secondary",onClick:()=>a(!0),"data-testid":"open-project-create-button",children:"Create new project"})]})})]}),s&&o.jsx(US,{isOpen:s,onClose:()=>a(!1)}),_&&o.jsx(YS,{isOpen:!0,onClose:()=>x(null),projectName:_.name,onConfirm:b}),u&&o.jsx(Cp,{initialPath:l??void 0,onSelect:A=>{y(A)},onClose:()=>c(!1)}),w&&o.jsx(HS,{isOpen:!0,onClose:T,path:w,onRetry:L})]}):null}function UN(){const[e,t]=D.useState(!1),[n,s]=D.useState(null),a=Ne(w=>w.sessions),l=Rt(w=>w.projects),u=Rt(w=>w.loading),c=Rt(w=>w.listProjects),d=Ne(w=>w.listSessions),f=Rt(w=>w.deleteProject),m=Ne(w=>w.connectionStatus);D.useEffect(()=>{m==="connected"&&(c(),d())},[m,c,d]);const p=[...l].sort((w,C)=>{const v=a.filter(E=>E.workdir.startsWith(w.workdir)),S=a.filter(E=>E.workdir.startsWith(C.workdir)),b=v.length>0?new Date(v.reduce((E,N)=>new Date(N.updatedAt)>new Date(E.updatedAt)?N:E).updatedAt).getTime():new Date(w.updatedAt).getTime();return(S.length>0?new Date(S.reduce((E,N)=>new Date(N.updatedAt)>new Date(E.updatedAt)?N:E).updatedAt).getTime():new Date(C.updatedAt).getTime())-b}),_=w=>{const C=l.find(v=>v.id===w);return C?a.filter(v=>v.workdir.startsWith(C.workdir)).sort((v,S)=>new Date(S.updatedAt).getTime()-new Date(v.updatedAt).getTime()).slice(0,5):[]},x=()=>{t(!0)};return o.jsxs("div",{className:"flex-1 flex flex-col overflow-y-auto bg-primary",children:[o.jsxs("div",{className:"max-w-5xl mx-auto w-full p-4 md:p-8",children:[o.jsxs("div",{className:"mb-6 md:mb-8 flex items-center justify-between",children:[o.jsxs("div",{children:[o.jsx("h1",{className:"text-3xl font-bold text-accent-primary",children:"OpenFox"}),o.jsx("p",{className:"text-text-secondary",children:"Local LLM-powered coding assistant with contract-driven execution"})]}),o.jsx(tt,{variant:"primary",onClick:x,children:"Open Project"})]}),p.map(w=>{const C=_(w.id);return o.jsx("div",{className:"mb-6 md:mb-8",children:o.jsxs("div",{className:"bg-bg-secondary border border-border rounded-lg overflow-hidden",children:[o.jsxs("div",{className:"p-3 md:p-4 border-b border-border flex items-center justify-between gap-2",children:[o.jsxs(qn,{href:`/p/${w.id}`,className:"flex items-center gap-2 cursor-pointer hover:opacity-80 transition-opacity flex-1",children:[o.jsx(Hu,{className:"w-5 h-5 text-accent-primary flex-shrink-0"}),o.jsx("span",{className:"text-text-primary font-semibold",children:w.name})]}),o.jsx(qn,{href:`/p/${w.id}/new`,className:"rounded font-medium transition-colors bg-accent-primary/25 text-text-primary hover:bg-accent-primary/40 px-1.5 py-1 text-xs",children:"+ New Session"}),o.jsx("button",{type:"button",onClick:()=>s({id:w.id,name:w.name}),className:"p-1.5 rounded text-text-muted hover:text-accent-error hover:bg-accent-error/10 transition-colors",title:"Delete project",children:o.jsx(xl,{className:"w-4 h-4"})})]}),o.jsx("div",{className:"divide-y divide-border",children:C.length>0?C.map(v=>{const S=l.find(y=>v.workdir.startsWith(y.workdir)),b=S?`/p/${S.id}/s/${v.id}`:"#";return o.jsx(qn,{href:b,className:"block p-3 md:p-4 hover:bg-bg-tertiary/50 cursor-pointer transition-colors",children:o.jsxs("div",{className:"flex items-center justify-between gap-2",children:[o.jsx("div",{className:"flex items-center gap-3 flex-1 min-w-0",children:o.jsx("div",{className:"flex-1 min-w-0",children:o.jsx("div",{className:"text-sm text-text-muted truncate",children:v.title??v.id.slice(0,8)})})}),o.jsxs("div",{className:"flex items-center gap-2 flex-shrink-0",children:[o.jsx("span",{className:"text-text-muted text-xs",children:TN(v.updatedAt)}),o.jsxs("span",{className:"text-text-muted text-xs",children:[v.messageCount," msgs"]})]})]})},v.id)}):o.jsx("div",{className:"p-3 md:p-4 text-text-muted text-sm",children:"No sessions yet"})})]})},w.id)}),p.length===0&&!u&&o.jsx("div",{className:"text-center py-12 text-text-muted",children:"No projects yet. Open a project to get started."}),u&&o.jsx("div",{className:"flex justify-center py-12",children:o.jsx(vl,{})})]}),e&&o.jsx(HN,{isOpen:e,onClose:()=>t(!1)}),n&&o.jsx(YS,{isOpen:!0,onClose:()=>s(null),projectName:n.name,onConfirm:()=>f(n.id)})]})}function FN(){const[,e]=up("/p/:projectId/new"),[,t]=hr(),n=e==null?void 0:e.projectId,s=Ne(u=>u.createSession),a=Ne(u=>u.resetPendingSessionCreate),l=D.useCallback(async()=>{if(!n)return;const u=await s(n);u?(t(`/p/${n}/s/${u.id}`),a()):(t(`/p/${n}`),a())},[n,s,t,a]);return D.useEffect(()=>{l()},[l]),o.jsx("div",{className:"flex-1 flex items-center justify-center",children:o.jsx(vl,{})})}function VN(){const e=Rt(t=>t.currentProject);return o.jsx("div",{className:"h-full flex flex-col items-center justify-center p-8 text-center",children:o.jsxs("div",{className:"max-w-md",children:[o.jsx("h2",{className:"text-xl font-semibold text-text-primary mb-2",children:(e==null?void 0:e.name)??"Project"}),o.jsx("p",{className:"text-text-secondary mb-6",children:"No session selected"}),o.jsxs("div",{className:"flex flex-col gap-3",children:[e&&o.jsx(qn,{href:`/p/${e.id}/new`,"data-testid":"create-new-session-button",className:"block w-full rounded font-medium transition-colors bg-accent-primary/25 text-text-primary hover:bg-accent-primary/40 px-3 py-2 text-center",children:"Create New Session"}),o.jsx("p",{className:"text-sm text-text-muted",children:"Or select an existing session from the sidebar"})]})]})})}const Uo=e=>Math.round(e*10)/10;function GN(e){return typeof e.totalTime=="number"&&!Number.isNaN(e.totalTime)}function Am(e){return{providerId:e.providerId,providerName:e.providerName,backend:e.backend,model:e.model}}function WN(e){return`${e.providerId}::${e.model}`}function qN(e){return`${e.providerName} > ${e.model}`}function Yv(e){let t=0,n=0,s=0,a=0,l=0,u=0;const c=[],d=[];let f=0;for(const[_,x]of e.entries()){const w=x.stats,C=Am(w);t+=w.totalTime,n+=w.toolTime,s+=w.prefillTokens,a+=w.generationTokens;const v=w.prefillSpeed>0?w.prefillTokens/w.prefillSpeed:0,S=w.generationSpeed>0?w.generationTokens/w.generationSpeed:0;l+=v,u+=S,c.push({messageId:x.id,timestamp:x.timestamp,...C,mode:w.mode,responseIndex:_+1,prefillTokens:w.prefillTokens,generationTokens:w.generationTokens,prefillSpeed:w.prefillSpeed,generationSpeed:w.generationSpeed,totalTime:w.totalTime,aiTime:w.totalTime-w.toolTime,toolTime:w.toolTime});const b=w.llmCalls??[];for(const y of b)f+=1,d.push({messageId:x.id,timestamp:y.timestamp??x.timestamp,providerId:y.providerId,providerName:y.providerName,backend:y.backend,model:y.model,mode:w.mode,responseIndex:_+1,sessionCallIndex:f,callIndex:y.callIndex,promptTokens:y.promptTokens,completionTokens:y.completionTokens,ttft:y.ttft,completionTime:y.completionTime,prefillSpeed:y.prefillSpeed,generationSpeed:y.generationSpeed,totalTime:y.totalTime,...y.temperature!==void 0&&{temperature:y.temperature},...y.topP!==void 0&&{topP:y.topP},...y.topK!==void 0&&{topK:y.topK},...y.maxTokens!==void 0&&{maxTokens:y.maxTokens}})}const m=l>0?Uo(s/l):0,p=u>0?Uo(a/u):0;return{totalTime:Uo(t),aiTime:Uo(t-n),toolTime:Uo(n),prefillTokens:s,generationTokens:a,avgPrefillSpeed:m,avgGenerationSpeed:p,responseCount:e.length,llmCallCount:d.length,dataPoints:c,callDataPoints:d}}function KN(e){const t=e.filter(a=>a.stats!==void 0&&a.stats!==null&&GN(a.stats)).sort((a,l)=>new Date(a.timestamp).getTime()-new Date(l.timestamp).getTime());if(t.length===0)return null;const n=new Map;for(const a of t){const l=WN(Am(a.stats)),u=n.get(l)??[];n.set(l,[...u,a])}const s=Array.from(n.entries()).map(([a,l])=>{const u=Am(l[0].stats),c=Yv(l);return{...u,key:a,label:qN(u),...c}});return{...Yv(t),modelGroups:s}}function YN(e){return D.useMemo(()=>KN(e),[e])}function XS(){var a;const e=Ne(l=>l.gitStatus),t=Ne(l=>l.currentSession),[n,s]=D.useState(!0);return D.useEffect(()=>{t!=null&&t.workdir&&s(!1)},[t==null?void 0:t.workdir]),{branch:(e==null?void 0:e.branch)??null,diff:{files:((a=e==null?void 0:e.diff)==null?void 0:a.files)??[],loading:n,error:null}}}function pu(e){return e.toLocaleString("en-US").replace(/,/g," ")}function Xv(e){return Number.isFinite(e)?e>=1e3?`${(e/1e3).toFixed(1)}k`:e.toFixed(1):"0"}function XN(e){if(!Number.isFinite(e))return"0s";if(e<60)return`${e.toFixed(1)}s`;const t=Math.floor(e/60),n=Math.round(e%60);return`${t}m${n}s`}const Qv=["▁","▂","▃","▄","▅","▆","▇","█"];function QN(e,t,n){if(n===t)return 4;const s=(e-t)/(n-t);return Math.min(7,Math.max(0,Math.round(s*7)))}function JN(e,t){if(e===t){const a=Math.max(Math.abs(e)*.05,1);return{minY:e-a,maxY:t+a}}const n=t-e,s=Math.max(n*.1,.1);return{minY:e-s,maxY:t+s}}function ZN(e,t){if(e.length===0||t<=0)return{blocks:"",minX:0,maxX:0,minY:0,maxY:0};const n=[...e].sort((_,x)=>_.x-x.x),s=n[0].x,a=n[n.length-1].x,l=Math.min(...n.map(_=>_.y)),u=Math.max(...n.map(_=>_.y)),{minY:c,maxY:d}=JN(l,u),f=Math.max(0,c),m=Array.from({length:t},()=>" "),p=new Map;for(const _ of n){const x=a===s?0:Math.round((_.x-s)/(a-s)*(t-1)),w=p.get(x)??[];p.set(x,[...w,_.y])}for(const[_,x]of p){const w=Math.max(...x);m[_]=Qv[QN(w,c,d)]??Qv[0]}return{blocks:m.join(""),minX:s,maxX:a,minY:f,maxY:d}}function Jv(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}k`:e.toFixed(1)}function Zv({data:e,width:t=60,height:n=78,label:s,xLabel:a,yLabel:l,showAxes:u=!0,formatY:c=Jv,formatX:d=Jv}){const f=D.useMemo(()=>{const m=ZN(e,t),p=Math.max(t*6,240),_=10,x=8,C=[...e].sort((y,E)=>y.x-E.x).map(y=>{const E=m.maxX===m.minX?p/2:_+(y.x-m.minX)/(m.maxX-m.minX)*(p-_*2),N=m.maxY===m.minY?n/2:x+(m.maxY-y.y)/(m.maxY-m.minY)*(n-x*2);return{...y,cx:E,cy:N,leftPercent:E/p*100,topPercent:N/n*100}}),v=C.map((y,E)=>`${E===0?"M":"L"} ${y.cx.toFixed(1)} ${y.cy.toFixed(1)}`).join(" "),b=[m.maxY,(m.maxY+m.minY)/2,m.minY].map(y=>({value:y,y:m.maxY===m.minY?n/2:x+(m.maxY-y)/(m.maxY-m.minY)*(n-x*2)}));return{...m,chartWidth:p,points:C,path:v,gridLines:b}},[e,n,t]);return e.length===0?o.jsxs("div",{className:"font-mono text-text-muted text-xs",children:[s&&o.jsx("div",{className:"mb-1",children:s}),o.jsx("div",{children:"No data"})]}):o.jsxs("div",{className:"font-mono text-xs",children:[s&&o.jsx("div",{className:"text-text-secondary mb-2",children:s}),o.jsxs("div",{className:"flex gap-3",children:[u&&o.jsx("div",{className:"w-12 h-[78px] flex flex-col justify-between text-right text-text-muted",children:f.gridLines.map(m=>o.jsx("span",{children:c(m.value)},`${m.value}-${m.y}`))}),o.jsx("div",{className:"flex-1 min-w-0",children:o.jsxs("div",{className:"relative h-[78px]",children:[o.jsxs("svg",{viewBox:`0 0 ${f.chartWidth} ${n}`,className:"w-full h-[78px] overflow-visible",preserveAspectRatio:"none","aria-hidden":"true",children:[f.gridLines.map(m=>o.jsx("line",{x1:"0",x2:f.chartWidth,y1:m.y,y2:m.y,stroke:"currentColor",strokeDasharray:"3 4",className:"text-border/60"},`grid-${m.y}`)),f.points.map(m=>o.jsx("line",{x1:m.cx,x2:m.cx,y1:n-4,y2:m.cy,stroke:"currentColor",className:"text-border/40"},`guide-${m.cx}-${m.cy}`)),f.points.length>1&&o.jsx("path",{d:f.path,fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:"text-accent-primary/45"})]}),f.points.map(m=>o.jsx("div",{className:"absolute -translate-x-1/2 -translate-y-1/2",style:{left:`${m.leftPercent}%`,top:`${m.topPercent}%`},title:`${d(m.x)} -> ${c(m.y)}`,children:o.jsx("div",{className:"w-2.5 h-2.5 rounded-full bg-accent-primary/20 flex items-center justify-center",children:o.jsx("div",{className:"w-1.5 h-1.5 rounded-full bg-accent-primary"})})},`point-${m.x}-${m.y}`))]})})]}),u&&o.jsxs("div",{className:"flex items-start gap-3 text-text-muted mt-1",children:[o.jsx("span",{className:"w-12"}),o.jsxs("span",{className:"flex-1 flex justify-between",children:[o.jsx("span",{children:d(f.minX)}),o.jsx("span",{children:a}),o.jsx("span",{children:d(f.maxX)})]})]}),l&&u&&o.jsx("div",{className:"text-text-muted mt-1 text-center",children:l})]})}function eT({data:e,prefillLabel:t="Prefill Speed (tok/s) by Response",generationLabel:n="Generation Speed (tok/s) by Response",xLabel:s="response",width:a=60}){const l=e.map(c=>({x:c.x,y:c.ppSpeed})),u=e.map(c=>({x:c.x,y:c.tgSpeed}));return o.jsxs("div",{className:"space-y-5",children:[o.jsx(Zv,{data:l,width:a,label:t,xLabel:s}),o.jsx(Zv,{data:u,width:a,label:n,xLabel:s})]})}function tT(e){const t=new Map;for(const n of e.callDataPoints){const s=t.get(n.messageId)??[];t.set(n.messageId,[...s,n])}return e.dataPoints.map(n=>{const s=[...t.get(n.messageId)??[]].sort((a,l)=>a.callIndex-l.callIndex);return{...n,callCount:s.length,calls:s,isExpandable:s.length>1}})}function nT(e){return{mode:"responses",xLabel:"response",prefillLabel:"Prefill Speed (tok/s) by Response",generationLabel:"Generation Speed (tok/s) by Response",points:e.dataPoints.map(t=>({x:t.responseIndex,ppSpeed:t.prefillSpeed,tgSpeed:t.generationSpeed}))}}function rT(e){return{mode:"calls",xLabel:"context",prefillLabel:"Prefill Speed (tok/s) vs Context",generationLabel:"Generation Speed (tok/s) vs Context",points:e.callDataPoints.map(t=>({x:t.promptTokens,ppSpeed:t.prefillSpeed,tgSpeed:t.generationSpeed}))}}function sT(e){return e.callDataPoints.length>0?rT(e):nT(e)}function Hf(e){if(e<60)return`${e.toFixed(1)}s`;const t=Math.floor(e/60),n=e%60;return`${t}m ${n.toFixed(0)}s`}function Ti(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}k`:e.toString()}function Zo(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:e.toFixed(1)}function iT(e){if(e.length===0)return"0 ctx";const t=Math.min(...e),n=Math.max(...e);return t===n?`${Ti(t)} ctx`:`${Ti(t)}-${Ti(n)} ctx`}function gu(e){return`${Zo(e)} t/s`}function QS(e){try{return new Date(e).toLocaleTimeString("en-US",{hour12:!1})}catch{return e}}function aT(e){return{exportedAt:new Date().toISOString(),providerId:e.providerId,providerName:e.providerName,backend:e.backend,model:e.model,label:e.label,summary:{totalTime:e.totalTime,aiTime:e.aiTime,toolTime:e.toolTime,prefillTokens:e.prefillTokens,generationTokens:e.generationTokens,avgPrefillSpeed:e.avgPrefillSpeed,avgGenerationSpeed:e.avgGenerationSpeed,responseCount:e.responseCount,llmCallCount:e.llmCallCount},responses:e.dataPoints.map(t=>({responseIndex:t.responseIndex,timestamp:t.timestamp,mode:t.mode,prefillTokens:t.prefillTokens,generationTokens:t.generationTokens,prefillSpeed:t.prefillSpeed,generationSpeed:t.generationSpeed,totalTime:t.totalTime,aiTime:t.aiTime,toolTime:t.toolTime})),llmCalls:e.callDataPoints.map(t=>({sessionCallIndex:t.sessionCallIndex,responseIndex:t.responseIndex,callIndex:t.callIndex,timestamp:t.timestamp,mode:t.mode,promptTokens:t.promptTokens,completionTokens:t.completionTokens,ttft:t.ttft,completionTime:t.completionTime,prefillSpeed:t.prefillSpeed,generationSpeed:t.generationSpeed,totalTime:t.totalTime}))}}function oT({isOpen:e,onClose:t,stats:n}){const s=D.useRef(null),[a,l]=D.useState({}),[u,c]=D.useState(()=>{var w;return((w=n.modelGroups[0])==null?void 0:w.key)??""});D.useEffect(()=>{var w;n.modelGroups.some(C=>C.key===u)||c(((w=n.modelGroups[0])==null?void 0:w.key)??"")},[u,n.modelGroups]);const d=D.useMemo(()=>n.modelGroups.find(w=>w.key===u)??n.modelGroups[0],[u,n.modelGroups]),f=D.useMemo(()=>d?tT(d):[],[d]),m=D.useMemo(()=>d?sT(d):{mode:"responses",xLabel:"response",prefillLabel:"",generationLabel:"",points:[]},[d]),p=D.useCallback(w=>{l(C=>({...C,[w]:!C[w]}))},[]),_=D.useCallback(()=>{if(!d)return;const w=aT(d);navigator.clipboard.writeText(JSON.stringify(w,null,2)).catch(C=>console.error("Failed to copy:",C))},[d]),x=D.useCallback(async()=>{if(s.current)try{const w=(await Q(async()=>{const{default:S}=await import("./html2canvas.esm-QH1iLAAe.js");return{default:S}},[])).default,C=await w(s.current,{backgroundColor:"#1a1a1a",scale:2}),v=document.createElement("a");v.download=`openfox-stats-${new Date().toISOString().slice(0,10)}.png`,v.href=C.toDataURL("image/png"),v.click()}catch(w){console.error("Failed to export PNG:",w),_()}},[_]);return o.jsx(Ot,{isOpen:e,onClose:t,title:"Session Stats",size:"lg",children:o.jsxs("div",{ref:s,className:"space-y-6",children:[o.jsx("section",{children:o.jsx("div",{className:"flex flex-wrap gap-2",children:n.modelGroups.map(w=>o.jsx("button",{onClick:()=>c(w.key),className:`px-3 py-1.5 rounded border text-xs transition-colors ${w.key===(d==null?void 0:d.key)?"border-accent-primary bg-accent-primary/10 text-accent-primary":"border-border text-text-muted hover:text-text-primary hover:bg-bg-tertiary/40"}`,title:w.label,children:w.label},w.key))})}),d&&o.jsxs("section",{children:[o.jsx("h3",{className:"text-sm font-semibold text-text-secondary mb-3 uppercase tracking-wide",children:"Summary"}),o.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-5 gap-4",children:[o.jsx(rs,{label:"AI Time",value:Hf(d.aiTime)}),o.jsx(rs,{label:"Total Time",value:Hf(d.totalTime)}),o.jsx(rs,{label:"Tool Time",value:Hf(d.toolTime)}),o.jsx(rs,{label:"Responses",value:d.responseCount.toString()}),o.jsx(rs,{label:"LLM Calls",value:d.llmCallCount.toString()})]}),o.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4 mt-3",children:[o.jsx(rs,{label:"Prefill Tokens",value:Ti(d.prefillTokens),subValue:`@ ${Zo(d.avgPrefillSpeed)} tok/s`}),o.jsx(rs,{label:"Gen Tokens",value:Ti(d.generationTokens),subValue:`@ ${Zo(d.avgGenerationSpeed)} tok/s`}),o.jsx(rs,{label:"Avg PP Speed",value:`${Zo(d.avgPrefillSpeed)}`,subValue:"tok/s"}),o.jsx(rs,{label:"Avg TG Speed",value:`${Zo(d.avgGenerationSpeed)}`,subValue:"tok/s"})]})]}),d&&m.points.length>1&&o.jsxs("section",{children:[o.jsxs("div",{className:"flex items-center justify-between mb-3",children:[o.jsx("h3",{className:"text-sm font-semibold text-text-secondary uppercase tracking-wide",children:"Performance Progression"}),o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("button",{onClick:_,className:"px-2 py-1 text-xs text-text-muted hover:text-text-primary hover:bg-bg-tertiary rounded transition-colors",children:"Copy JSON"}),o.jsx("button",{onClick:x,className:"px-2 py-1 text-xs text-text-muted hover:text-text-primary hover:bg-bg-tertiary rounded transition-colors",children:"Save PNG"})]})]}),o.jsx("div",{className:"bg-bg-tertiary/50 rounded p-4",children:o.jsx(eT,{data:m.points,width:50,prefillLabel:m.prefillLabel,generationLabel:m.generationLabel,xLabel:m.xLabel})})]}),d&&o.jsxs("section",{children:[o.jsxs("h3",{className:"text-sm font-semibold text-text-secondary mb-3 uppercase tracking-wide",children:["Response Log (",d.responseCount," responses)"]}),o.jsx("div",{className:"overflow-y-auto bg-bg-tertiary/30 rounded",children:o.jsxs("table",{className:"w-full table-fixed border-separate border-spacing-0 text-xs",children:[o.jsxs("colgroup",{children:[o.jsx("col",{className:"w-[7%]"}),o.jsx("col",{className:"w-[14%]"}),o.jsx("col",{className:"w-[10%]"}),o.jsx("col",{className:"w-[14%]"}),o.jsx("col",{className:"w-[14%]"}),o.jsx("col",{className:"w-[14%]"}),o.jsx("col",{className:"w-[11%]"}),o.jsx("col",{className:"w-[2%]"})]}),o.jsx("thead",{children:o.jsxs("tr",{className:"text-[10px] uppercase tracking-wide text-text-muted/80",children:[o.jsx("th",{className:"px-3 py-2 text-center font-medium",children:"#"}),o.jsx("th",{className:"px-2 py-2 text-center font-medium",children:"At"}),o.jsx("th",{className:"px-2 py-2 text-center font-medium",children:"Time"}),o.jsx("th",{className:"px-2 py-2 text-center font-medium",children:"Context"}),o.jsx("th",{className:"px-2 py-2 text-center font-medium",children:"PP t/s"}),o.jsx("th",{className:"px-2 py-2 text-center font-medium",children:"TG t/s"}),o.jsx("th",{className:"px-2 py-2 text-center font-medium",children:"Calls"}),o.jsx("th",{className:"px-2 py-2"})]})}),o.jsx("tbody",{children:f.map((w,C)=>o.jsxs(D.Fragment,{children:[o.jsx(lT,{row:w,index:C,isExpanded:a[w.messageId]??!1,onToggle:w.isExpandable?()=>p(w.messageId):void 0}),(a[w.messageId]??!1)&&w.calls.map((v,S)=>o.jsx(cT,{dataPoint:v,index:S},`${v.messageId}-${v.callIndex}`))]},w.messageId))})]})})]})]})})}function rs({label:e,value:t,subValue:n}){return o.jsxs("div",{className:"bg-bg-tertiary/50 rounded p-3",children:[o.jsx("div",{className:"text-text-muted text-xs mb-1",children:e}),o.jsx("div",{className:"text-text-primary text-lg font-semibold",children:t}),n&&o.jsx("div",{className:"text-text-muted text-xs",children:n})]})}function lT({row:e,index:t,isExpanded:n,onToggle:s}){const a=e.calls.length>0?iT(e.calls.map(l=>l.promptTokens)):`${Ti(e.prefillTokens)} ctx`;return o.jsxs("tr",{onClick:s,className:`${t%2===0?"bg-bg-tertiary/20":""} ${s?"cursor-pointer hover:bg-bg-tertiary/35 transition-colors":""}`,children:[o.jsx("td",{className:"px-3 py-2 text-center text-text-muted align-middle",children:e.responseIndex}),o.jsx("td",{className:"px-2 py-2 text-center text-text-muted font-mono align-middle whitespace-nowrap",children:QS(e.timestamp)}),o.jsxs("td",{className:"px-2 py-2 text-center text-text-muted align-middle whitespace-nowrap",children:[e.totalTime.toFixed(1),"s"]}),o.jsx("td",{className:"px-2 py-2 text-center text-text-primary font-mono align-middle whitespace-nowrap",children:a.replace(/ ctx$/,"")}),o.jsx("td",{className:"px-2 py-2 text-center text-text-primary font-mono align-middle whitespace-nowrap",children:gu(e.prefillSpeed)}),o.jsx("td",{className:"px-2 py-2 text-center text-text-primary font-mono align-middle whitespace-nowrap",children:gu(e.generationSpeed)}),o.jsx("td",{className:"px-2 py-2 text-center text-text-muted font-mono align-middle whitespace-nowrap",children:e.callCount}),o.jsx("td",{className:"px-2 py-2 text-center text-text-muted align-middle whitespace-nowrap",children:e.isExpandable?n?"v":">":""})]})}function cT({dataPoint:e,index:t}){const n=e.temperature!==void 0||e.topP!==void 0||e.topK!==void 0||e.maxTokens!==void 0;return o.jsxs(o.Fragment,{children:[o.jsxs("tr",{className:`${t%2===0?"bg-bg-tertiary/10":"bg-bg-tertiary/5"}`,children:[o.jsxs("td",{className:"px-3 py-2 pl-6 text-center text-text-muted align-middle border-l border-border/60",children:["c",e.callIndex]}),o.jsx("td",{className:"px-2 py-2 text-center text-text-muted font-mono align-middle whitespace-nowrap",children:QS(e.timestamp)}),o.jsxs("td",{className:"px-2 py-2 text-center text-text-muted align-middle whitespace-nowrap",children:[e.totalTime.toFixed(1),"s"]}),o.jsx("td",{className:"px-2 py-2 text-center text-text-primary font-mono align-middle whitespace-nowrap",children:Ti(e.promptTokens)}),o.jsx("td",{className:"px-2 py-2 text-center text-text-primary font-mono align-middle whitespace-nowrap",children:gu(e.prefillSpeed)}),o.jsx("td",{className:"px-2 py-2 text-center text-text-primary font-mono align-middle whitespace-nowrap",children:gu(e.generationSpeed)}),o.jsx("td",{className:"px-2 py-2 text-center text-text-muted font-mono align-middle whitespace-nowrap",children:e.callIndex}),o.jsx("td",{className:"px-2 py-2"})]}),n&&o.jsx("tr",{className:`${t%2===0?"bg-bg-tertiary/5":"bg-bg-tertiary/[2.5%]"}`,children:o.jsx("td",{colSpan:8,className:"px-6 py-1.5 border-l border-border/60",children:o.jsxs("div",{className:"flex flex-wrap gap-x-4 gap-y-1 text-[10px] text-text-muted",children:[e.temperature!==void 0&&o.jsxs("span",{children:["temp: ",e.temperature.toFixed(2)]}),e.topP!==void 0&&o.jsxs("span",{children:["topP: ",e.topP.toFixed(2)]}),e.topK!==void 0&&o.jsxs("span",{children:["topK: ",e.topK]}),e.maxTokens!==void 0&&o.jsxs("span",{children:["maxTok: ",e.maxTokens]})]})})})]})}const uT={passed:{icon:"✓",color:"text-accent-success"},completed:{icon:"◉",color:"text-purple-400"},failed:{icon:"✗",color:"text-accent-error"},resolved:{icon:"✓",color:"text-accent-success"},dismissed:{icon:"–",color:"text-text-muted"},open:{icon:"○",color:"text-accent-warning"},pending:{icon:"○",color:"text-text-muted"},in_progress:{icon:"◌",color:"text-accent-warning"}},dT=["open","in_progress","pending","completed","resolved","dismissed","passed","failed"];function hT(e){return uT[e]??{icon:"○",color:"text-text-muted"}}function JS(e){const t=document.createElement("textarea");return t.innerHTML=e,t.value}const Ku=D.memo(function({status:t,className:n="text-xs leading-tight flex-shrink-0"}){const{icon:s,color:a}=hT(t);return o.jsx("span",{className:`${a} ${n}`,children:s})});function eb({entries:e,title:t}){const n=D.useMemo(()=>e.reduce((s,a)=>(s[a.status]=(s[a.status]??0)+1,s),{}),[e]);return o.jsxs("h3",{className:"text-sm font-semibold text-text-primary mb-2 flex items-center justify-between",children:[o.jsx("span",{children:t}),Object.keys(n).length>0&&o.jsx("span",{className:"font-normal text-xs flex items-center gap-1.5",children:dT.map(s=>{const a=n[s];return a?o.jsxs("span",{className:"flex items-center gap-0.5",children:[o.jsx(Ku,{status:s}),o.jsx("span",{children:a})]},s):null})})]})}const fT=D.memo(function({entries:t,title:n}){return t.length===0?null:o.jsxs("div",{className:"my-1 rounded border border-border bg-secondary overflow-hidden",children:[n&&o.jsx("div",{className:"px-1.5 py-1 border-b border-border bg-secondary",children:o.jsx("span",{className:"text-xs font-medium text-text-muted",children:n})}),o.jsx("div",{className:"bg-primary",children:t.map((s,a)=>o.jsxs("div",{className:`flex items-start gap-1 px-1.5 py-1 ${a>0?"border-t border-border":""}`,children:[o.jsx(Ku,{status:s.status}),o.jsxs("div",{className:"flex-1 min-w-0 text-xs truncate",children:[o.jsxs("span",{className:"text-text-muted",children:["[",s.id,"]"]})," ",JS(s.description)]})]},s.id??a))})]})}),mT="#6b7280";function ol(e,t){var n;return((n=e.find(s=>s.id===t))==null?void 0:n.color)??mT}const gt=Yn(e=>{const t=async()=>{await yp("/api/agents",e,!0)};return{defaults:[],userItems:[],projectItems:[],loading:!1,fetchAgents:t,fetchAgent:async n=>{try{const s=await Ae(`/api/agents/${n}`);return s.ok?await s.json():null}catch{return null}},fetchDefaultContent:async n=>{try{const s=await Ae(`/api/agents/defaults/${n}`);return s.ok?await s.json():null}catch{return null}},createAgent:async(n,s)=>{const a=await qs("POST","/api/agents",{...n,destination:s});return a.success&&await t(),a},updateAgent:async(n,s)=>{const a=await qs("PUT",`/api/agents/${n}`,s);return a.success&&await t(),a},deleteAgent:async n=>{try{const s=await Ae(`/api/agents/${n}`,{method:"DELETE"}),a=await s.json();return s.ok?(e(l=>({userItems:l.userItems.filter(u=>u.id!==n)})),{success:!0}):{success:!1,error:a.error??"Failed to delete"}}catch{return{success:!1,error:"Network error"}}},duplicateAgent:async(n,s)=>zu(`/api/agents/${n}/duplicate`,t,s)}}),jt=Yn((e,t)=>({defaults:[],userItems:[],projectItems:[],activeWorkflowId:"default",loading:!1,templateVariables:[],fetchTemplateVariables:async()=>{try{const s=await(await Ae("/api/workflows/template-variables")).json();e({templateVariables:s.variables??[]})}catch{}},fetchWorkflows:async()=>{e({loading:!0});try{const s=await(await Ae("/api/workflows")).json();e({defaults:s.defaults??[],userItems:s.userItems??[],projectItems:s.projectItems??[],activeWorkflowId:s.activeWorkflowId??"default",loading:!1})}catch{e({loading:!1})}},fetchWorkflow:async n=>{try{const s=await Ae(`/api/workflows/${n}`);return s.ok?await s.json():null}catch{return null}},fetchDefaultContent:async n=>{try{const s=await Ae(`/api/workflows/defaults/${n}`);return s.ok?await s.json():null}catch{return null}},createWorkflow:async(n,s)=>{const a=await qs("POST","/api/workflows",{...n,destination:s});return a.success&&await t().fetchWorkflows(),a},updateWorkflow:async(n,s)=>{const a=await qs("PUT",`/api/workflows/${n}`,s);return a.success&&await t().fetchWorkflows(),a},deleteWorkflow:async n=>{try{const s=await Ae(`/api/workflows/${n}`,{method:"DELETE"}),a=await s.json();return s.ok?(e(l=>({userItems:l.userItems.filter(u=>u.id!==n)})),{success:!0}):{success:!1,error:a.error??"Failed to delete"}}catch{return{success:!1,error:"Network error"}}},duplicateWorkflow:async(n,s)=>zu(`/api/workflows/${n}/duplicate`,()=>t().fetchWorkflows(),s)})),pT={pending:"completed",completed:"passed",passed:"failed",failed:"pending"};async function gT(e,t){await Ae(`/api/sessions/${e}/criteria`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({criteria:t})})}function Gc({id:e,agents:t}){const n=ol(t,e),s=t.find(a=>a.id===e);return o.jsx("span",{className:"font-medium rounded px-1",style:{backgroundColor:`${n}20`,color:n},children:(s==null?void 0:s.name)??e})}function xT({id:e}){const t=jt(u=>u.defaults),n=jt(u=>u.userItems),a=D.useMemo(()=>[...t,...n],[t,n]).find(u=>u.id===e),l=(a==null?void 0:a.color)??"#3b82f6";return o.jsx("span",{className:"font-medium rounded px-1",style:{backgroundColor:`${l}20`,color:l},children:(a==null?void 0:a.name)??e})}function _T({entries:e,sessionId:t}){const[n,s]=D.useState(e),[a,l]=D.useState(!1),[u,c]=D.useState(null),[d,f]=D.useState(""),[m,p]=D.useState(""),[_,x]=D.useState(!1),[w,C]=D.useState(!1),v=gt(z=>z.defaults),S=gt(z=>z.userItems),b=gt(z=>z.projectItems),y=D.useMemo(()=>[...v,...S,...b],[v,S,b]),E=D.useRef(null),N=D.useRef(null);D.useEffect(()=>{s(e)},[e]),D.useEffect(()=>{var z;a&&((z=E.current)==null||z.focus())},[a]),D.useEffect(()=>{var z;u&&((z=N.current)==null||z.focus())},[u]);const T=D.useCallback(z=>{s(z),gT(t,z)},[t]),L=D.useCallback(()=>{var H;const z=d.trim();if(!z)return;const X=String(n.length),te=[...n,{id:X,description:z,status:"pending"}];T(te),f(""),(H=E.current)==null||H.focus()},[n,d,T]),A=D.useCallback(()=>{l(!1),f("")},[]),R=D.useCallback((z,X)=>{c(z),p(X)},[]),M=D.useCallback(()=>{if(!u)return;const z=m.trim(),X=n.map(te=>te.id===u?{...te,description:z||te.description}:te);T(X),c(null)},[u,m,n,T]),G=D.useCallback(z=>{const X=n.map(te=>te.id===z?{...te,status:pT[te.status]??"pending"}:te);T(X)},[n,T]),W=D.useCallback(z=>{T(n.filter(X=>X.id!==z))},[n,T]),O=D.useCallback(()=>{T([]),x(!1)},[T]),U=D.useCallback(z=>{z.key==="Enter"&&(z.preventDefault(),L()),z.key==="Escape"&&A()},[L,A]),V=D.useCallback(z=>{z.key==="Enter"&&M(),z.key==="Escape"&&c(null)},[M]);return o.jsxs("div",{className:"my-1 rounded border border-border bg-secondary overflow-hidden",children:[o.jsxs("div",{className:"bg-primary",children:[n.length===0&&!a&&o.jsxs("div",{className:"px-1.5 py-2 text-xs text-text-muted italic text-center",children:["No criteria yet."," ",o.jsx("button",{onClick:()=>C(!0),className:"text-accent-primary hover:underline not-italic cursor-pointer",children:"Learn more"})]}),n.map((z,X)=>{const te=z.status,H=u===z.id;return o.jsxs("div",{className:`flex items-start gap-1 px-1.5 py-1 group ${X>0?"border-t border-border":""}`,children:[o.jsx("button",{onClick:()=>G(z.id),className:"text-xs leading-tight flex-shrink-0 cursor-pointer hover:opacity-70 transition-opacity",title:`Status: ${z.status} (click to cycle)`,children:o.jsx(Ku,{status:te})}),o.jsx("div",{className:"flex-1 min-w-0",children:H?o.jsx("input",{ref:N,value:m,onChange:I=>p(I.target.value),onBlur:M,onKeyDown:V,className:"w-full bg-bg-tertiary text-text-primary text-xs px-1.5 py-0.5 rounded border border-border focus:outline-none focus:border-accent-primary"}):o.jsxs("button",{onClick:()=>R(z.id,z.description),className:"text-xs text-text-primary text-left hover:text-accent-primary transition-colors w-full truncate cursor-pointer",title:"Click to edit",children:["[",z.id,"] ",JS(z.description)]})}),o.jsx("button",{onClick:()=>W(z.id),className:"flex-shrink-0 opacity-0 group-hover:opacity-100 text-text-muted hover:text-accent-error transition-all ml-0.5 cursor-pointer flex items-center self-center",title:"Delete criterion",children:o.jsx(_l,{className:"w-4 h-4"})})]},z.id)})]}),a&&o.jsx("div",{className:"px-1.5 py-1 border-t border-border bg-secondary",children:o.jsxs("div",{className:"flex items-center gap-1",children:[o.jsx("span",{className:"text-text-muted text-xs leading-tight flex-shrink-0",children:"○"}),o.jsx("input",{ref:E,value:d,onChange:z=>f(z.target.value),onKeyDown:U,placeholder:"New criterion...",className:"flex-1 bg-bg-tertiary text-text-primary text-xs px-1.5 py-0.5 rounded border border-border focus:outline-none focus:border-accent-primary placeholder-text-muted"})]})}),o.jsxs("div",{className:"px-1.5 py-1 border-t border-border bg-secondary flex items-center gap-2",children:[a?o.jsxs(o.Fragment,{children:[o.jsxs("button",{onClick:L,className:"flex items-center gap-1 text-xs text-accent-primary hover:text-accent-primary/70 transition-colors cursor-pointer",title:"Add criterion",children:[o.jsx(Ks,{className:"w-3 h-3"}),"Add"]}),o.jsx("button",{onClick:A,className:"flex items-center gap-1 text-xs text-text-muted hover:text-text-primary transition-colors cursor-pointer",title:"Cancel",children:"Cancel"})]}):o.jsxs("button",{onClick:()=>l(!0),className:"flex items-center gap-1 text-xs text-text-muted hover:text-accent-primary transition-colors cursor-pointer",title:"Add criterion",children:[o.jsx(Ks,{className:"w-3 h-3"}),"Add"]}),n.length>0&&o.jsxs("button",{onClick:()=>x(!0),className:"flex items-center gap-1 text-xs text-text-muted hover:text-accent-error transition-colors ml-auto cursor-pointer",title:"Clear all criteria",children:[o.jsx(xl,{className:"w-3 h-3"}),"Clear all"]}),o.jsx("button",{onClick:()=>C(!0),className:"flex items-center gap-1 text-xs text-text-muted hover:text-accent-primary transition-colors cursor-pointer",title:"About criteria",children:o.jsx(CS,{className:"w-3 h-3"})})]}),_&&o.jsx("div",{className:"px-1.5 py-1 border-t border-border bg-secondary",children:o.jsxs("div",{className:"flex items-center gap-2 justify-between",children:[o.jsx("span",{className:"text-xs text-accent-error",children:"Clear all criteria?"}),o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("button",{onClick:O,className:"text-xs text-accent-error hover:text-accent-error/70 transition-colors cursor-pointer",children:"Yes"}),o.jsx("button",{onClick:()=>x(!1),className:"text-xs text-text-muted hover:text-text-primary transition-colors cursor-pointer",children:"No"})]})]})}),o.jsx(Ot,{isOpen:w,onClose:()=>C(!1),title:"About Acceptance Criteria",size:"md",children:o.jsxs("div",{className:"space-y-3 text-sm text-text-secondary",children:[o.jsx("p",{children:"Each criterion defines a specific requirement that needs to be met."}),o.jsxs("p",{children:["To use this feature, start in ",o.jsx(Gc,{id:"planner",agents:y})," mode and",o.jsxs("strong",{className:"text-text-primary",children:[" ","ask the agent to define acceptance criteria that matches your goal"]}),". Then launch the ",o.jsx(xT,{id:"default"})," builtin workflow to launch the automation part."]}),o.jsx("p",{children:"This workflow will automatically:"}),o.jsxs("ol",{className:"list-decimal list-inside space-y-1",children:[o.jsxs("li",{children:["Launch the ",o.jsx(Gc,{id:"builder",agents:y}),' agent, that will be forced to continue until it marks all criteria as "completed"']}),o.jsxs("li",{children:["Then launch the ",o.jsx(Gc,{id:"verifier",agents:y})," subagent, that will verify each criterion. If every criterion is fulfilled, then it goes to the next step, otherwise, it gives feedback to the main agent until 100% of the criteria are met."]}),o.jsxs("li",{children:["Launch a ",o.jsx(Gc,{id:"code_reviewer",agents:y})," subagent, that will analyze the code to provide actionable feedback to the main agent."]})]}),o.jsx("div",{className:"bg-bg-tertiary rounded p-3 space-y-1.5",children:o.jsx("p",{children:"This lets smaller models follow complex plans to completion and improves the chances that nothing from your plan is missed."})})]})})]})}function yT({isOpen:e,onClose:t}){const n=Or(C=>C.config),s=Or(C=>C.saveConfig),[a,l]=D.useState(""),[u,c]=D.useState(""),[d,f]=D.useState(!1),[m,p]=D.useState(!1),[_,x]=D.useState(!1);D.useEffect(()=>{e&&(l((n==null?void 0:n.command)??""),c((n==null?void 0:n.url)??""),f((n==null?void 0:n.hotReload)??!1),p((n==null?void 0:n.disableInspect)??!1))},[e,n]);const w=async()=>{!a.trim()||!u.trim()||(x(!0),await s({command:a.trim(),url:u.trim(),hotReload:d,disableInspect:m}),x(!1),t())};return o.jsx(Ot,{isOpen:e,onClose:t,title:"Dev Server Config",size:"sm",children:o.jsxs("div",{className:"space-y-4",children:[o.jsxs("div",{children:[o.jsx("label",{className:"block text-xs text-text-secondary mb-1",children:"Command"}),o.jsx("input",{className:"input w-full",type:"text",value:a,onChange:C=>l(C.target.value),placeholder:"npm run dev"})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-xs text-text-secondary mb-1",children:"Dev URL"}),o.jsx("input",{className:"input w-full",type:"text",value:u,onChange:C=>c(C.target.value),placeholder:"http://localhost:3000"})]}),o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("input",{type:"checkbox",id:"hotReload",checked:d,onChange:C=>f(C.target.checked),className:"rounded border-border bg-bg-tertiary"}),o.jsx("label",{htmlFor:"hotReload",className:"text-xs text-text-secondary",children:"Hot Reload"})]}),o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("input",{type:"checkbox",id:"disableInspect",checked:m,onChange:C=>p(C.target.checked),className:"rounded border-border bg-bg-tertiary"}),o.jsx("label",{htmlFor:"disableInspect",className:"text-xs text-text-secondary",children:"Disable inspect feedback"})]}),o.jsxs("div",{className:"flex justify-end gap-2 pt-2",children:[o.jsx("button",{className:"btn btn-secondary",onClick:t,children:"Cancel"}),o.jsx("button",{className:"btn btn-primary",onClick:w,disabled:_||!a.trim()||!u.trim(),children:_?"Saving...":"Save"})]})]})})}const tb={30:"text-black",31:"text-red-400",32:"text-accent-success",33:"text-accent-warning",34:"text-blue-400",35:"text-purple-400",36:"text-cyan-400",37:"text-gray-300",90:"text-gray-500",91:"text-red-500",92:"text-green-500",93:"text-yellow-400",94:"text-blue-500",95:"text-pink-400",96:"text-cyan-500",97:"text-white"},vT={40:"bg-black",41:"bg-red-900",42:"bg-green-900",43:"bg-yellow-900",44:"bg-blue-900",45:"bg-purple-900",46:"bg-cyan-900",47:"bg-gray-700"},nb={1:"font-bold",2:"opacity-75",4:"underline",7:"bg-bg-secondary"},bT="text-text-primary";function ST(e){const t=[],n=new RegExp("\x1B\\[([0-9;]+)m","g");let s=0,a="text-text-primary",l;try{for(;(l=n.exec(e))!==null;){if(l.index>s){const f=e.slice(s,l.index);f&&t.push({text:f,className:a})}const u=l[1];if(!u)continue;const c=u.split(";").map(Number);if(c.length===0||c[0]===0){a="text-text-primary";continue}const d=[];for(const f of c)if(f>=30&&f<=37){const m=tb[f];m&&d.push(m)}else if(f>=40&&f<=47){const m=vT[f];m&&d.push(m)}else if(f>=90&&f<=97){const m=tb[f];m&&d.push(m)}else if(f in nb){const m=nb[f];m&&d.push(m)}else f===39?d.push(bT):f===49&&(a=a.split(" ").filter(m=>!m.startsWith("bg-")).join(" "));d.length>0&&(a=d.join(" ")),s=n.lastIndex}if(s<e.length){const u=e.slice(s);u&&t.push({text:u,className:a})}return t}catch(u){return console.warn("ANSI parsing failed, stripping codes:",u),[{text:wT(e),className:"text-text-primary"}]}}function wT(e){return e.replace(new RegExp("\x1B\\[([0-9;]+)m","g"),"")}function xu(e){const t=ST(e),n=[];return t.forEach((s,a)=>{const l=s.text.split(`
|
|
90
90
|
`);l.forEach((u,c)=>{n.push(Us.createElement("span",{key:`${a}-${c}`,className:s.className,style:{display:"inline-block",whiteSpace:"pre-wrap"}},u)),c<l.length-1&&n.push(Us.createElement("br",{key:`${a}-${c}-br`}))})}),n.length===1?n[0]:n}function ZS({logs:e,preRef:t,preClassName:n="text-sm font-mono"}){return o.jsx("pre",{ref:t,className:n,children:e.length===0?o.jsx("span",{className:"text-text-muted",children:"No output yet"}):e.map((s,a)=>o.jsx("span",{className:s.stream==="stderr"?"text-accent-warning":"",children:xu(s.content)},a))})}function kp({isActive:e,onToggle:t,className:n,style:s}){return o.jsxs("button",{type:"button",onClick:()=>t(!e),className:n,style:s,children:[e?o.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-accent-success"}):o.jsx(dr,{className:"w-3 h-3"}),e?"live":"scroll to bottom"]})}const Yu=(e,t)=>{const n=D.useRef(!0),s=D.useRef(null),[a,l]=D.useState(!0),u=()=>{const c=e.current;c&&(c.scrollTop=c.scrollHeight)};return D.useEffect(()=>{const c=e.current;if(!c)return;const d=x=>{if(x.deltaY>0){requestAnimationFrame(()=>requestAnimationFrame(()=>{c.scrollHeight-c.scrollTop-c.offsetHeight<100&&(n.current=!0,l(!0))}));return}n.current=!1,l(!1)},f=x=>{x.touches[0]&&(s.current=x.touches[0].clientY)},m=x=>{if(s.current===null)return;const w=x.touches[0];if(!w)return;if(w.clientY-s.current>0){n.current=!1,l(!1);return}requestAnimationFrame(()=>requestAnimationFrame(()=>{c.scrollHeight-c.scrollTop-c.offsetHeight<100&&(n.current=!0,l(!0))}))},p=new MutationObserver(()=>{n.current&&requestAnimationFrame(u)}),_=setInterval(()=>{n.current&&u()},1e3);return c.addEventListener("wheel",d,{passive:!0}),c.addEventListener("touchstart",f,{passive:!0}),c.addEventListener("touchmove",m,{passive:!0}),p.observe(c,{childList:!0,subtree:!0,characterData:!0}),()=>{c.removeEventListener("wheel",d),c.removeEventListener("touchstart",f),c.removeEventListener("touchmove",m),p.disconnect(),clearInterval(_)}},[t==null?void 0:t.id]),{force_scroll_to_bottom:()=>{n.current=!0,l(!0),u()},isAutoScrollActive:a,setAutoScroll:c=>{n.current=c,l(c),c&&u()}}},e1=D.memo(function({title:t,logs:n,onClose:s,preClassName:a}){const l=D.useRef(null),{isAutoScrollActive:u,setAutoScroll:c}=Yu(l,null);return o.jsx(Ot,{isOpen:!0,onClose:s,title:t,size:"full",headerRight:o.jsx(kp,{isActive:u,onToggle:c,className:"text-xs text-text-muted hover:text-text-primary flex items-center gap-1 px-1.5 py-0.5 rounded hover:bg-bg-tertiary transition-colors"}),children:o.jsx("div",{ref:l,className:"h-full overflow-y-auto",children:o.jsx(ZS,{logs:n,preClassName:a})})})}),CT=D.memo(function({logs:t,anchorRef:n,isHiding:s,isAutoScrollActive:a,onSetAutoScroll:l}){const[u,c]=D.useState(null),d=D.useRef(null),f=D.useRef(l);return f.current=l,D.useEffect(()=>{var p;const m=(p=n.current)==null?void 0:p.getBoundingClientRect();m&&c({bottom:window.innerHeight-m.bottom,right:window.innerWidth-m.right,width:m.width,height:m.height})},[n]),D.useEffect(()=>{const m=d.current;if(!m)return;const p=_=>{if(_.deltaY<0){f.current(!1);return}_.deltaY>0&&requestAnimationFrame(()=>requestAnimationFrame(()=>{m.scrollHeight-m.scrollTop-m.offsetHeight<100&&f.current(!0)}))};return m.addEventListener("wheel",p,{passive:!0}),()=>m.removeEventListener("wheel",p)},[]),D.useEffect(()=>{d.current&&a&&(d.current.scrollTop=d.current.scrollHeight)},[t,a,u]),o.jsx("div",{className:`relative ${u?"":"hidden"}`,children:o.jsx("pre",{ref:d,className:"fixed z-40 text-sm font-mono text-text-primary bg-bg-primary p-2 rounded border border-border overflow-auto transition-all duration-150 ease-out select-text",style:u?{bottom:u.bottom,right:u.right,width:u.width*2,maxHeight:u.height*3,transformOrigin:"bottom right",transform:s?"scale(0.01)":"scale(1)",opacity:s?0:1}:void 0,children:t.map((m,p)=>o.jsx("span",{className:m.stream==="stderr"?"text-accent-warning":"",children:xu(m.content)},p))})})}),kT=D.memo(function({workdir:t}){const n=Or(U=>U.setWorkdir),s=Or(U=>U.status),a=Or(U=>U.config),l=Or(U=>U.logs),u=Or(U=>U.start),c=Or(U=>U.stop),d=Or(U=>U.fetchLogs),f=Ne(U=>U.currentSession),[m,p]=D.useState(!1),[_,x]=D.useState(!1),[w,C]=D.useState(!1),[v,S]=D.useState(!1),b=D.useRef(null),{isAutoScrollActive:y,setAutoScroll:E}=Yu(b,null),N=D.useRef(null),T=D.useRef(null),L=D.useRef(null),A=D.useRef(null),R=()=>{const U=s==null?void 0:s.inspectProxyPort;if(!U){s!=null&&s.url&&window.open(s.url,"_blank");return}const V=`${window.location.protocol}//${window.location.hostname}:${U}`,z=window.open(V,"_blank");if(z){A.current=z;const X=()=>{var H;!A.current||A.current.closed||(A.current.postMessage({type:"setFoxSessionId",sessionId:(f==null?void 0:f.id)??null},"*"),A.current.postMessage({type:"setFoxSessionTitle",sessionTitle:((H=f==null?void 0:f.metadata)==null?void 0:H.title)??null},"*"),A.current.postMessage({type:"setFoxInspectEnabled",enabled:!(a!=null&&a.disableInspect)},"*"))},te=setInterval(()=>{X(),(!A.current||A.current.closed)&&clearInterval(te)},500);setTimeout(()=>clearInterval(te),5e3)}},M=(s==null?void 0:s.state)??"off",G=a!==null,W=M==="running"||M==="warning";D.useEffect(()=>{n(t??null)},[t,n]),D.useEffect(()=>{W&&d()},[W,d]);const O=()=>{W?c():u()};return o.jsxs("div",{className:"mt-2 pt-3 border-t border-border space-y-3",children:[o.jsxs("div",{className:"flex items-center justify-between",children:[o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("span",{className:`inline-block w-2.5 h-2.5 rounded-full flex-shrink-0 ${M==="running"?"bg-accent-success":M==="warning"?"bg-accent-warning":M==="error"?"bg-accent-error":"bg-text-muted"}`}),o.jsx("h3",{className:"text-sm font-semibold text-text-primary",children:"Dev Server"})]}),o.jsx("button",{onClick:()=>p(!0),className:"p-1.5 rounded hover:bg-bg-tertiary transition-colors text-text-muted",title:"Configure dev server",children:o.jsx(wS,{})})]}),G?o.jsx(o.Fragment,{children:M==="running"||M==="warning"?o.jsxs("div",{className:"flex gap-2",children:[o.jsxs("button",{onClick:O,className:"flex-1 flex items-center justify-center gap-1.5 rounded font-medium text-sm px-3 py-1.5 bg-bg-tertiary text-text-primary hover:bg-border transition-colors",children:[o.jsx(ES,{}),"Stop"]}),(s==null?void 0:s.url)&&o.jsxs("button",{onClick:()=>R(),className:"flex-1 flex items-center justify-center gap-1.5 rounded font-medium text-sm px-3 py-1.5 bg-accent-primary/25 text-text-primary hover:bg-accent-primary/40 transition-colors",title:s.url,children:[o.jsx(Oj,{}),"Open"]})]}):o.jsx("button",{onClick:O,className:"w-full rounded font-medium text-sm px-3 py-1.5 bg-accent-primary/25 text-text-primary hover:bg-accent-primary/40 transition-colors",children:"Start"})}):o.jsx("button",{onClick:()=>p(!0),className:"w-full rounded font-medium text-sm px-3 py-1.5 bg-bg-tertiary text-text-muted hover:bg-border transition-colors",children:"Configure"}),o.jsxs("div",{ref:L,className:`relative ${G&&W?"":"hidden"}`,onMouseEnter:()=>{!G||!W||(T.current&&clearTimeout(T.current),N.current=setTimeout(()=>{C(!0),S(!1)},500))},onMouseLeave:()=>{N.current&&clearTimeout(N.current),S(!0),T.current=setTimeout(()=>C(!1),150)},children:[o.jsx(ZS,{logs:l,preRef:b,preClassName:"text-sm bg-bg-primary p-2 rounded overflow-auto max-h-[200px] border border-border"}),G&&W&&o.jsxs(o.Fragment,{children:[o.jsxs("div",{className:"absolute bottom-1 right-1 z-50 flex items-center gap-1",children:[(w||v)&&o.jsx(kp,{isActive:y,onToggle:E,className:"text-xs text-text-muted hover:text-text-primary flex items-center gap-1 px-1.5 py-0.5 rounded hover:bg-bg-tertiary transition-colors"}),o.jsx("button",{onClick:()=>x(!0),className:"px-2 py-0.5 rounded text-xs font-medium bg-accent-primary/30 text-text-primary hover:bg-accent-primary/50 transition-colors",children:"Expand"})]}),(w||v)&&L.current&&Ha.createPortal(o.jsx(CT,{logs:l,anchorRef:L,isHiding:v,isAutoScrollActive:y,onSetAutoScroll:E}),document.body)]})]}),o.jsx(yT,{isOpen:m,onClose:()=>p(!1)}),_&&o.jsx(e1,{title:"Dev Server Logs",logs:l,onClose:()=>x(!1)})]})}),ET=D.memo(function({sessionId:t}){var x;const n=tl(w=>w.processes),s=tl(w=>w.stopProcess),[a,l]=D.useState(null),[u,c]=D.useState([]),d=n.filter(w=>w.status!=="exited"),f=d.filter(w=>w.status==="running").length;if(n.length===0)return null;const m=w=>{switch(w){case"running":return"bg-accent-success";case"starting":return"bg-accent-warning";case"stopping":return"bg-accent-warning";case"exited":return"bg-text-muted";default:return"bg-text-muted"}},p=w=>{const C=tl.getState().logs[w]??[];c(C.map(v=>({content:v.content,stream:v.stream}))),l(w)},_=w=>{t&&s(w,t)};return o.jsxs("div",{className:"mt-2 pt-3 border-t border-border space-y-3",children:[o.jsx("div",{className:"flex items-center justify-between",children:o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("span",{className:"inline-block w-2.5 h-2.5 rounded-full flex-shrink-0 bg-accent-primary"}),o.jsx("h3",{className:"text-sm font-semibold text-text-primary",children:"Background"}),o.jsxs("span",{className:"text-xs text-text-muted",children:["(",f," running)"]})]})}),o.jsx("div",{className:"space-y-2",children:d.map(w=>o.jsx("div",{className:"border border-border rounded p-2",children:o.jsxs("div",{className:"flex items-center justify-between",children:[o.jsxs("div",{className:"flex items-center gap-2 min-w-0 flex-1",children:[o.jsx("span",{className:`inline-block w-2 h-2 rounded-full flex-shrink-0 ${m(w.status)}`}),o.jsx("span",{className:"text-sm text-text-primary truncate",title:w.name,children:w.name}),o.jsxs("span",{className:"text-xs text-text-muted",children:["[",w.status,"]"]})]}),o.jsxs("div",{className:"flex gap-1 ml-2",children:[o.jsx("button",{onClick:()=>p(w.id),className:"px-2 py-1 text-xs rounded bg-bg-tertiary hover:bg-border text-text-secondary transition-colors",title:"View logs",children:"Logs"}),o.jsx("button",{onClick:()=>_(w.id),className:"px-2 py-1 text-xs rounded bg-bg-tertiary hover:bg-accent-error/20 text-text-secondary hover:text-accent-error transition-colors",title:"Stop process",children:"Stop"})]})]})},w.id))}),a&&o.jsx(e1,{title:((x=d.find(w=>w.id===a))==null?void 0:x.name)??"",logs:u,onClose:()=>{l(null),c([])}})]})});function jT({isOpen:e,onClose:t,versionInfo:n}){const[s,a]=D.useState("ready"),[l,u]=D.useState(""),[c,d]=D.useState(n),[f,m]=D.useState(!1),[p,_]=D.useState(null),[x,w]=D.useState(null),[C,v]=D.useState(!1);D.useEffect(()=>{if(e){if(n){d(n);return}fetch("/api/auto-update/check").then(E=>E.json()).then(E=>{d({current:E.current,latest:E.latest}),m(E.isService??!1)}).catch(()=>{})}},[e]),D.useEffect(()=>{if(!e||s!=="updating")return;const E=setInterval(()=>{u(N=>N.length>=3?"":N+".")},400);return()=>clearInterval(E)},[e,s]);const S=D.useCallback(async()=>{a("updating"),w(null);try{const N=await(await Ae("/api/auto-update",{method:"POST"})).json();if(m(N.isService??!1),N.success){const T=N.version??"unknown";_(T),localStorage.setItem("openfox_updated_to",T),localStorage.setItem("update_pending","true"),a("complete")}else w(N.error??"Update failed"),a("failed")}catch(E){w(E instanceof Error?E.message:"Update request failed"),a("failed")}},[]),b=D.useCallback(async()=>{v(!0);try{await Ae("/api/auto-update/restart",{method:"POST"})}catch{}setTimeout(()=>window.location.reload(),1e4)},[]);D.useEffect(()=>{e&&(a("ready"),u(""),_(null),w(null),v(!1))},[e]);const y=s!=="updating";return o.jsxs(Ot,{isOpen:e,onClose:y?t:void 0,title:s==="failed"?"Update Failed":s==="complete"?"Update Complete":"New OpenFox Version Available",size:"sm",closeOnBackdropClick:y,showCloseButton:y,children:[o.jsxs("div",{className:"flex flex-col gap-4",children:[c&&o.jsxs("div",{className:"flex justify-between text-sm",children:[o.jsx("span",{className:"text-text-muted",children:"Current version"}),o.jsx("span",{className:"text-text-primary font-mono",children:c.current})]}),c&&o.jsxs("div",{className:"flex justify-between text-sm pb-2",children:[o.jsx("span",{className:"text-text-muted",children:"Latest version"}),o.jsx("span",{className:"text-accent-primary font-mono font-semibold",children:c.latest})]}),s==="updating"&&o.jsxs("div",{className:"flex flex-col gap-2 mt-2",children:[o.jsx("div",{className:"h-1.5 bg-bg-tertiary rounded-full overflow-hidden",children:o.jsx("div",{className:"h-full bg-accent-primary animate-pulse w-full"})}),o.jsxs("p",{className:"text-xs text-text-muted text-center",children:["Updating",l]})]}),s==="complete"&&o.jsxs("div",{className:"flex flex-col gap-3 mt-2",children:[o.jsxs("div",{className:"bg-bg-tertiary rounded px-3 py-2 text-xs text-text-secondary",children:["OpenFox has been updated to v",p??(c==null?void 0:c.latest),".",!f&&" Please restart OpenFox to use the new version."]}),f&&o.jsx("button",{onClick:b,disabled:C,className:"w-full px-3 py-2 text-sm rounded bg-accent-primary hover:brightness-110 transition-all text-white font-medium disabled:opacity-50",children:C?"Reloading in 10s…":"Restart Service"})]}),s==="failed"&&o.jsxs("div",{className:"flex flex-col gap-3 mt-2",children:[o.jsxs("div",{className:"flex items-center gap-2 px-3 py-2 bg-accent-danger/10 border border-accent-danger/30 rounded text-xs",children:[o.jsx("span",{children:"⚠️"}),o.jsx("p",{className:"text-text-secondary",children:x})]}),o.jsx("div",{className:"bg-bg-tertiary rounded px-3 py-2 text-xs font-mono text-text-secondary",children:"openfox update"}),o.jsx("p",{className:"text-xs text-text-muted",children:"Run this command in your terminal to complete the update."})]})]}),s==="ready"&&o.jsx("button",{onClick:S,className:"w-full px-3 py-2 text-sm rounded bg-accent-primary hover:brightness-110 transition-all text-white font-medium",children:"Update OpenFox"}),(s==="complete"||s==="failed")&&o.jsx("button",{onClick:t,className:"w-full px-3 py-2 text-sm rounded bg-bg-tertiary hover:bg-bg-secondary transition-colors text-text-primary font-medium mt-2",children:"Close"})]})}function NT({file:e}){const t=KS(e.path,28),n=e.status==="added"?"text-accent-success":e.status==="deleted"?"text-accent-error":"text-accent-primary",s=e.status==="added"?`+${e.additions}`:e.status==="deleted"?`-${e.deletions}`:e.additions>0||e.deletions>0?`+${e.additions}, -${e.deletions}`:"";return o.jsxs("div",{className:"flex items-center justify-between gap-1 py-0.5 text-xs min-w-0",children:[o.jsx("span",{className:`truncate ${n}`,title:e.path,children:t}),s&&o.jsx("span",{className:`shrink-0 font-mono${e.status==="added"?" text-accent-success":e.status==="deleted"?" text-accent-error":" text-text-muted"}`,children:s})]})}function TT(){const{diff:e}=XS();return e.loading?o.jsx("div",{className:"mt-3",children:o.jsxs("div",{className:"flex items-center gap-1.5 text-xs text-text-muted",children:[o.jsx("span",{className:"w-3 h-3 border border-border border-t-accent-primary rounded-full animate-spin"}),o.jsx("span",{children:"Checking changes..."})]})}):e.files.length===0?o.jsx("div",{className:"mt-3",children:o.jsx("p",{className:"text-xs text-text-muted text-center",children:"No changes"})}):o.jsx("div",{className:"mt-3 max-h-[150px] overflow-y-auto",children:o.jsx("div",{className:"pr-1",children:e.files.map((t,n)=>o.jsx(NT,{file:t},n))})})}function rb({messages:e,workdir:t}){var C,v,S,b;const[n,s]=D.useState(!1),[a,l]=D.useState(!1),[u,c]=D.useState(!1),[d,f]=D.useState(!1),m=YN(e),{branch:p}=XS(),_=zt(y=>y.version),x=Ne(y=>y.currentSession),w=D.useCallback(async()=>{l(!0);try{const y=await fetch("/api/auto-update/check");if(y.ok){const E=await y.json();c(E.isUpdateAvailable)}}catch{}finally{l(!1)}},[]);return D.useEffect(()=>{w()},[w]),o.jsxs("div",{className:"flex flex-col h-full",children:[m&&o.jsxs("div",{className:"mb-4",children:[o.jsx("button",{onClick:()=>s(!0),className:"w-full flex items-center justify-center px-3 py-2 rounded bg-bg-tertiary hover:bg-bg-secondary transition-colors",title:"View detailed response and call-level stats",children:o.jsxs("div",{className:"flex items-center gap-2 text-sm text-text-muted",children:[o.jsx("span",{className:"text-text-secondary",children:XN(m.aiTime)}),o.jsx("span",{className:"w-px h-3 bg-border"}),o.jsx("span",{className:"text-text-secondary",children:Xv(m.avgPrefillSpeed)}),o.jsx("span",{children:"pp"}),o.jsx("span",{className:"w-px h-3 bg-border"}),o.jsx("span",{className:"text-text-secondary",children:Xv(m.avgGenerationSpeed)}),o.jsx("span",{children:"tg"})]})}),o.jsx(oT,{isOpen:n,onClose:()=>s(!1),stats:m})]}),o.jsx("div",{className:"flex flex-col flex-1 overflow-y-auto",children:o.jsxs("div",{className:"mt-4",children:[o.jsx(eb,{entries:((C=x==null?void 0:x.metadataEntries)==null?void 0:C.criteria)??[],title:"Acceptance Criteria"}),x&&o.jsx(_T,{entries:((v=x==null?void 0:x.metadataEntries)==null?void 0:v.criteria)??[],sessionId:x.id}),x&&(((b=(S=x.metadataEntries)==null?void 0:S.review_findings)==null?void 0:b.length)??0)>0&&o.jsxs("div",{className:"mt-6",children:[o.jsx(eb,{entries:x.metadataEntries.review_findings,title:"Review Findings"}),o.jsx(fT,{entries:x.metadataEntries.review_findings})]})]})}),p&&o.jsxs("div",{className:"mt-4 flex items-center gap-2 text-sm",children:[o.jsx(Nj,{}),o.jsx("span",{className:"truncate text-text-secondary",title:p,children:p})]}),o.jsx(TT,{}),o.jsx(kT,{workdir:t}),o.jsx(ET,{sessionId:x==null?void 0:x.id}),_&&o.jsxs("div",{className:"mt-4 pt-4 border-t border-border text-center text-xs text-text-muted",children:[o.jsxs("div",{className:"flex items-center justify-center gap-1",children:[o.jsx("a",{href:"https://github.com/co-l/openfox",target:"_blank",rel:"noopener noreferrer",className:"hover:text-accent-primary transition-colors",children:"OpenFox"})," - ",o.jsxs("span",{className:"font-mono",children:["v",_]}),o.jsx("button",{onClick:()=>w(),disabled:a,className:"p-0.5 rounded hover:bg-bg-tertiary text-text-muted hover:text-text-primary transition-colors disabled:opacity-50",title:"Check for updates",children:o.jsx(pp,{className:`w-3 h-3 ${a?"animate-spin":""}`})})]}),u&&o.jsx("button",{onClick:()=>f(!0),className:"text-accent-primary hover:underline mt-1",children:"Update OpenFox →"})]}),o.jsx(jT,{isOpen:d,onClose:()=>f(!1),versionInfo:null})]})}function AT({children:e,criteriaSidebarOpen:t=!0,onCriteriaSidebarToggle:n,messages:s}){const a=Ne(l=>l.currentSession);return o.jsxs("div",{className:"relative h-full overflow-hidden",children:[t&&o.jsx("div",{className:"fixed md:hidden inset-0 bg-secondary/50 z-40",onClick:n}),o.jsxs("div",{className:"flex h-full",children:[o.jsx("div",{className:"flex-1 min-w-0 flex flex-col overflow-hidden bg-secondary",children:e}),t?o.jsx("aside",{className:"hidden md:block w-[320px] shrink-0 border-l border-border p-4 overflow-y-auto bg-secondary",children:o.jsx(rb,{messages:s,workdir:a==null?void 0:a.workdir})}):o.jsx("aside",{className:"hidden md:block w-0 shrink-0 overflow-hidden border-l-0"}),o.jsx("aside",{className:`
|
|
91
91
|
md:hidden
|
|
92
92
|
p-4 overflow-y-auto bg-secondary
|
package/dist/web/index.html
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<link rel="icon" type="image/png" href="/assets/openfox.png" />
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, height=device-height" />
|
|
7
7
|
<title>OpenFox</title>
|
|
8
|
-
<script type="module" crossorigin src="/assets/index-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-Bi5R_oF2.js"></script>
|
|
9
9
|
<link rel="stylesheet" crossorigin href="/assets/index-CkUCxzzC.css">
|
|
10
10
|
<link rel="manifest" href="/manifest.webmanifest"><script id="vite-plugin-pwa:register-sw" src="/registerSW.js"></script></head>
|
|
11
11
|
<body class="bg-bg-primary text-text-primary font-mono">
|
package/dist/web/sw.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
if(!self.define){let s,l={};const e=(e,r)=>(e=new URL(e+".js",r).href,l[e]||new Promise(l=>{if("document"in self){const s=document.createElement("script");s.src=e,s.onload=l,document.head.appendChild(s)}else s=e,importScripts(e),l()}).then(()=>{let s=l[e];if(!s)throw new Error(`Module ${e} didn’t register its module`);return s}));self.define=(r,i)=>{const n=s||("document"in self?document.currentScript.src:"")||location.href;if(l[n])return;let u={};const a=s=>e(s,n),t={module:{uri:n},exports:u,require:a};l[n]=Promise.all(r.map(s=>t[s]||a(s))).then(s=>(i(...s),u))}}define(["./workbox-8c29f6e4"],function(s){"use strict";self.skipWaiting(),s.clientsClaim(),s.precacheAndRoute([{url:"registerSW.js",revision:"1872c500de691dce40960bb85481de07"},{url:"index.html",revision:"086797d7189ef06083e2a8541a8c6c0c"},{url:"__inspect__.js",revision:"878b477aaf1805c028895f3d3bb4af71"},{url:"assets/zig-VOosw3JB.js",revision:null},{url:"assets/zenscript-DVFEvuxE.js",revision:null},{url:"assets/yaml-Buea-lGh.js",revision:null},{url:"assets/xsl-CtQFsRM5.js",revision:null},{url:"assets/xml-sdJ4AIDG.js",revision:null},{url:"assets/wolfram-lXgVvXCa.js",revision:null},{url:"assets/wit-5i3qLPDT.js",revision:null},{url:"assets/wikitext-BhOHFoWU.js",revision:null},{url:"assets/wgsl-Dx-B1_4e.js",revision:null},{url:"assets/wenyan-BV7otONQ.js",revision:null},{url:"assets/wasm-MzD3tlZU.js",revision:null},{url:"assets/wasm-CG6Dc4jp.js",revision:null},{url:"assets/vyper-CDx5xZoG.js",revision:null},{url:"assets/vue-vine-BoDAl6tE.js",revision:null},{url:"assets/vue-html-AaS7Mt5G.js",revision:null},{url:"assets/vue-D2xRrEX4.js",revision:null},{url:"assets/vitesse-light-CVO1_9PV.js",revision:null},{url:"assets/vitesse-dark-D0r3Knsf.js",revision:null},{url:"assets/vitesse-black-Bkuqu6BP.js",revision:null},{url:"assets/viml-CJc9bBzg.js",revision:null},{url:"assets/vhdl-CeAyd5Ju.js",revision:null},{url:"assets/vesper-DRje8inN.js",revision:null},{url:"assets/verilog-BQ8w6xss.js",revision:null},{url:"assets/vb-D17OF-Vu.js",revision:null},{url:"assets/vala-CsfeWuGM.js",revision:null},{url:"assets/v-BcVCzyr7.js",revision:null},{url:"assets/typst-DHCkPAjA.js",revision:null},{url:"assets/typespec-CAFt9gP4.js",revision:null},{url:"assets/typescript-BPQ3VLAy.js",revision:null},{url:"assets/twig-CW1WmMYd.js",revision:null},{url:"assets/turtle-BsS91CYL.js",revision:null},{url:"assets/tsx-COt5Ahok.js",revision:null},{url:"assets/tsv-B_m7g4N7.js",revision:null},{url:"assets/ts-tags-D351s5mN.js",revision:null},{url:"assets/toml-vGWfd6FD.js",revision:null},{url:"assets/tokyo-night-hegEt444.js",revision:null},{url:"assets/tex-idrVyKtj.js",revision:null},{url:"assets/terraform-BETggiCN.js",revision:null},{url:"assets/templ-DhtptRzy.js",revision:null},{url:"assets/tcl-dwOrl1Do.js",revision:null},{url:"assets/tasl-QIJgUcNo.js",revision:null},{url:"assets/talonscript-CkByrt1z.js",revision:null},{url:"assets/systemd-4A_iFExJ.js",revision:null},{url:"assets/system-verilog-CnnmHF94.js",revision:null},{url:"assets/synthwave-84-CbfX1IO0.js",revision:null},{url:"assets/swift-D82vCrfD.js",revision:null},{url:"assets/svelte-Cy7k_4gC.js",revision:null},{url:"assets/surrealql-Bq5Q-fJD.js",revision:null},{url:"assets/stylus-BEDo0Tqx.js",revision:null},{url:"assets/stata-DI20mbqo.js",revision:null},{url:"assets/ssh-config-_ykCGR6B.js",revision:null},{url:"assets/sql-CRqJ_cUM.js",revision:null},{url:"assets/splunk-BtCnVYZw.js",revision:null},{url:"assets/sparql-rVzFXLq3.js",revision:null},{url:"assets/soy-8wufbnw4.js",revision:null},{url:"assets/solidity-rGO070M0.js",revision:null},{url:"assets/solarized-light-L9t79GZl.js",revision:null},{url:"assets/solarized-dark-DXbdFlpD.js",revision:null},{url:"assets/snazzy-light-Bw305WKR.js",revision:null},{url:"assets/smalltalk-BERRCDM3.js",revision:null},{url:"assets/slack-ochin-DqwNpetd.js",revision:null},{url:"assets/slack-dark-BthQWCQV.js",revision:null},{url:"assets/shellsession-BADoaaVG.js",revision:null},{url:"assets/shellscript-Yzrsuije.js",revision:null},{url:"assets/shaderlab-Dg9Lc6iA.js",revision:null},{url:"assets/sdbl-DVxCFoDh.js",revision:null},{url:"assets/scss-D5BDwBP9.js",revision:null},{url:"assets/scheme-C98Dy4si.js",revision:null},{url:"assets/scala-C151Ov-r.js",revision:null},{url:"assets/sass-Cj5Yp3dK.js",revision:null},{url:"assets/sas-DEy46yEz.js",revision:null},{url:"assets/rust-B1yitclQ.js",revision:null},{url:"assets/ruby-DyJCeAvU.js",revision:null},{url:"assets/rst-CpCqk9r5.js",revision:null},{url:"assets/rosmsg-BJDFO7_C.js",revision:null},{url:"assets/rose-pine-qdsjHGoJ.js",revision:null},{url:"assets/rose-pine-moon-D4_iv3hh.js",revision:null},{url:"assets/rose-pine-dawn-DHQR4-dF.js",revision:null},{url:"assets/ron-D8l8udqQ.js",revision:null},{url:"assets/riscv-BM1_JUlF.js",revision:null},{url:"assets/rel-C3B-1QV4.js",revision:null},{url:"assets/regexp-CDVJQ6XC.js",revision:null},{url:"assets/reg-C-SQnVFl.js",revision:null},{url:"assets/red-bN70gL4F.js",revision:null},{url:"assets/razor-BjBPvh-w.js",revision:null},{url:"assets/raku-DXvB9xmW.js",revision:null},{url:"assets/racket-BqYA7rlc.js",revision:null},{url:"assets/r-Dspwwk_N.js",revision:null},{url:"assets/qss-IeuSbFQv.js",revision:null},{url:"assets/qmldir-C8lEn-DE.js",revision:null},{url:"assets/qml-3beO22l8.js",revision:null},{url:"assets/python-B6aJPvgy.js",revision:null},{url:"assets/purescript-CklMAg4u.js",revision:null},{url:"assets/puppet-BMWR74SV.js",revision:null},{url:"assets/pug-DKIMFp6K.js",revision:null},{url:"assets/proto-C7zT0LnQ.js",revision:null},{url:"assets/prolog-CbFg5uaA.js",revision:null},{url:"assets/prisma-Dd19v3D-.js",revision:null},{url:"assets/powershell-Dpen1YoG.js",revision:null},{url:"assets/powerquery-CEu0bR-o.js",revision:null},{url:"assets/postcss-CXtECtnM.js",revision:null},{url:"assets/polar-C0HS_06l.js",revision:null},{url:"assets/poimandres-CS3Unz2-.js",revision:null},{url:"assets/po-BTJTHyun.js",revision:null},{url:"assets/plsql-ChMvpjG-.js",revision:null},{url:"assets/plastic-3e1v2bzS.js",revision:null},{url:"assets/pkl-u5AG7uiY.js",revision:null},{url:"assets/php-Csjmro_R.js",revision:null},{url:"assets/perl-B9cMNwum.js",revision:null},{url:"assets/pascal-D93ZcfNL.js",revision:null},{url:"assets/openscad-C4EeE6gA.js",revision:null},{url:"assets/one-light-C3Wv6jpd.js",revision:null},{url:"assets/one-dark-pro-DVMEJ2y_.js",revision:null},{url:"assets/odin-BBf5iR-q.js",revision:null},{url:"assets/ocaml-C0hk2d4L.js",revision:null},{url:"assets/objective-cpp-CLxacb5B.js",revision:null},{url:"assets/objective-c-DXmwc3jG.js",revision:null},{url:"assets/nushell-Cz2AlsmD.js",revision:null},{url:"assets/nord-Ddv68eIx.js",revision:null},{url:"assets/nix-CwoSXNpI.js",revision:null},{url:"assets/nim-BIad80T-.js",revision:null},{url:"assets/night-owl-light-CMTm3GFP.js",revision:null},{url:"assets/night-owl-C39BiMTA.js",revision:null},{url:"assets/nginx-BpAMiNFr.js",revision:null},{url:"assets/nextflow-groovy-vE_lwT2v.js",revision:null},{url:"assets/nextflow-C-mBbutL.js",revision:null},{url:"assets/narrat-DRg8JJMk.js",revision:null},{url:"assets/move-IF9eRakj.js",revision:null},{url:"assets/moonbit-_H4v1dQx.js",revision:null},{url:"assets/monokai-D4h5O-jR.js",revision:null},{url:"assets/mojo-rZm6bMo-.js",revision:null},{url:"assets/mipsasm-CKIfxQSi.js",revision:null},{url:"assets/min-light-CTRr51gU.js",revision:null},{url:"assets/min-dark-CafNBF8u.js",revision:null},{url:"assets/mermaid-mWjccvbQ.js",revision:null},{url:"assets/mdx-Cmh6b_Ma.js",revision:null},{url:"assets/mdc-DTYItulj.js",revision:null},{url:"assets/matlab-D7o27uSR.js",revision:null},{url:"assets/material-theme-palenight-Csfq5Kiy.js",revision:null},{url:"assets/material-theme-ocean-CyktbL80.js",revision:null},{url:"assets/material-theme-lighter-B0m2ddpp.js",revision:null},{url:"assets/material-theme-darker-BfHTSMKl.js",revision:null},{url:"assets/material-theme-D5KoaKCx.js",revision:null},{url:"assets/marko-DjSrsDqO.js",revision:null},{url:"assets/markdown-Cvjx9yec.js",revision:null},{url:"assets/make-CHLpvVh8.js",revision:null},{url:"assets/luau-KW6xsasC.js",revision:null},{url:"assets/lua-BaeVxFsk.js",revision:null},{url:"assets/logo-BtOb2qkB.js",revision:null},{url:"assets/log-2UxHyX5q.js",revision:null},{url:"assets/llvm-DjAJT7YJ.js",revision:null},{url:"assets/liquid-C0sCDyMI.js",revision:null},{url:"assets/light-plus-B7mTdjB0.js",revision:null},{url:"assets/less-B1dDrJ26.js",revision:null},{url:"assets/lean-BZvkOJ9d.js",revision:null},{url:"assets/latex-CaSxy8MP.js",revision:null},{url:"assets/laserwave-DUszq2jm.js",revision:null},{url:"assets/kusto-wEQ09or8.js",revision:null},{url:"assets/kotlin-BdnUsdx6.js",revision:null},{url:"assets/kdl-DV7GczEv.js",revision:null},{url:"assets/kanagawa-wave-DWedfzmr.js",revision:null},{url:"assets/kanagawa-lotus-CfQXZHmo.js",revision:null},{url:"assets/kanagawa-dragon-CkXjmgJE.js",revision:null},{url:"assets/just-CUsbIsdP.js",revision:null},{url:"assets/julia-D7OTSIA_.js",revision:null},{url:"assets/jsx-g9-lgVsj.js",revision:null},{url:"assets/jssm-C2t-YnRu.js",revision:null},{url:"assets/jsonnet-DFQXde-d.js",revision:null},{url:"assets/jsonl-DcaNXYhu.js",revision:null},{url:"assets/jsonc-Des-eS-w.js",revision:null},{url:"assets/json5-C9tS-k6U.js",revision:null},{url:"assets/json-Cp-IABpG.js",revision:null},{url:"assets/jison-wvAkD_A8.js",revision:null},{url:"assets/jinja-f2NsQr07.js",revision:null},{url:"assets/javascript-wDzz0qaB.js",revision:null},{url:"assets/java-CylS5w8V.js",revision:null},{url:"assets/ini-BEwlwnbL.js",revision:null},{url:"assets/index-CkUCxzzC.css",revision:null},{url:"assets/index-CXXGAW1N.js",revision:null},{url:"assets/imba-DGztddWO.js",revision:null},{url:"assets/hy-DFXneXwc.js",revision:null},{url:"assets/hxml-Bvhsp5Yf.js",revision:null},{url:"assets/hurl-irOxFIW8.js",revision:null},{url:"assets/http-jrhK8wxY.js",revision:null},{url:"assets/html2canvas.esm-QH1iLAAe.js",revision:null},{url:"assets/html-pp8916En.js",revision:null},{url:"assets/html-derivative-DlHx6ybY.js",revision:null},{url:"assets/houston-DnULxvSX.js",revision:null},{url:"assets/horizon-bright-CUuTKBJd.js",revision:null},{url:"assets/horizon-BUw7H-hv.js",revision:null},{url:"assets/hlsl-D3lLCCz7.js",revision:null},{url:"assets/hjson-D5-asLiD.js",revision:null},{url:"assets/hcl-BWvSN4gD.js",revision:null},{url:"assets/haxe-CzTSHFRz.js",revision:null},{url:"assets/haskell-Df6bDoY_.js",revision:null},{url:"assets/handlebars-BpdQsYii.js",revision:null},{url:"assets/haml-D5jkg6IW.js",revision:null},{url:"assets/hack-DbPARsA_.js",revision:null},{url:"assets/gruvbox-light-soft-hJgmCMqR.js",revision:null},{url:"assets/gruvbox-light-medium-DRw_LuNl.js",revision:null},{url:"assets/gruvbox-light-hard-CH1njM8p.js",revision:null},{url:"assets/gruvbox-dark-soft-CVdnzihN.js",revision:null},{url:"assets/gruvbox-dark-medium-GsRaNv29.js",revision:null},{url:"assets/gruvbox-dark-hard-CFHQjOhq.js",revision:null},{url:"assets/groovy-gcz8RCvz.js",revision:null},{url:"assets/graphql-ChdNCCLP.js",revision:null},{url:"assets/go-C27-OAKa.js",revision:null},{url:"assets/gnuplot-DdkO51Og.js",revision:null},{url:"assets/gn-n2N0HUVH.js",revision:null},{url:"assets/glsl-DplSGwfg.js",revision:null},{url:"assets/glimmer-ts-BfAWNZQY.js",revision:null},{url:"assets/glimmer-js-ByusRIyA.js",revision:null},{url:"assets/gleam-BspZqrRM.js",revision:null},{url:"assets/github-light-high-contrast-BfjtVDDH.js",revision:null},{url:"assets/github-light-default-D7oLnXFd.js",revision:null},{url:"assets/github-light-DAi9KRSo.js",revision:null},{url:"assets/github-dark-high-contrast-E3gJ1_iC.js",revision:null},{url:"assets/github-dark-dimmed-DH5Ifo-i.js",revision:null},{url:"assets/github-dark-default-Cuk6v7N8.js",revision:null},{url:"assets/github-dark-DHJKELXO.js",revision:null},{url:"assets/git-rebase-r7XF79zn.js",revision:null},{url:"assets/git-commit-F4YmCXRG.js",revision:null},{url:"assets/gherkin-DyxjwDmM.js",revision:null},{url:"assets/genie-D0YGMca9.js",revision:null},{url:"assets/gdshader-DkwncUOv.js",revision:null},{url:"assets/gdscript-C5YyOfLZ.js",revision:null},{url:"assets/gdresource-BOOCDP_w.js",revision:null},{url:"assets/fsharp-CXgrBDvD.js",revision:null},{url:"assets/fortran-free-form-BxgE0vQu.js",revision:null},{url:"assets/fortran-fixed-form-CkoXwp7k.js",revision:null},{url:"assets/fluent-C4IJs8-o.js",revision:null},{url:"assets/fish-BvzEVeQv.js",revision:null},{url:"assets/fennel-BYunw83y.js",revision:null},{url:"assets/everforest-light-C8M2exoo.js",revision:null},{url:"assets/everforest-dark-BgDCqdQA.js",revision:null},{url:"assets/erlang-DsQrWhSR.js",revision:null},{url:"assets/erb-Dm6A9KJ5.js",revision:null},{url:"assets/emacs-lisp-CXvaQtF9.js",revision:null},{url:"assets/elm-DbKCFpqz.js",revision:null},{url:"assets/elixir-CkH2-t6x.js",revision:null},{url:"assets/edge-FbVlp4U3.js",revision:null},{url:"assets/dream-maker-BtqSS_iP.js",revision:null},{url:"assets/dracula-soft-BXkSAIEj.js",revision:null},{url:"assets/dracula-BzJJZx-M.js",revision:null},{url:"assets/dotenv-Da5cRb03.js",revision:null},{url:"assets/docker-BcOcwvcX.js",revision:null},{url:"assets/diff-D97Zzqfu.js",revision:null},{url:"assets/desktop-BmXAJ9_W.js",revision:null},{url:"assets/dax-CEL-wOlO.js",revision:null},{url:"assets/dart-bE4Kk8sk.js",revision:null},{url:"assets/dark-plus-C3mMm8J8.js",revision:null},{url:"assets/d-85-TOEBH.js",revision:null},{url:"assets/cypher-COkxafJQ.js",revision:null},{url:"assets/cue-D82EKSYY.js",revision:null},{url:"assets/csv-fuZLfV_i.js",revision:null},{url:"assets/css-CLj8gQPS.js",revision:null},{url:"assets/csharp-DSvCPggb.js",revision:null},{url:"assets/crystal-DGywbUpC.js",revision:null},{url:"assets/cpp-UfJy6YNI.js",revision:null},{url:"assets/coq-DkFqJrB1.js",revision:null},{url:"assets/common-lisp-Cg-RD9OK.js",revision:null},{url:"assets/coffee-Ch7k5sss.js",revision:null},{url:"assets/codeql-DsOJ9woJ.js",revision:null},{url:"assets/codeowners-Bp6g37R7.js",revision:null},{url:"assets/cobol-nBiQ_Alo.js",revision:null},{url:"assets/cmake-D1j8_8rp.js",revision:null},{url:"assets/clojure-P80f7IUj.js",revision:null},{url:"assets/clarity-D53aC0YG.js",revision:null},{url:"assets/catppuccin-mocha-D87Tk5Gz.js",revision:null},{url:"assets/catppuccin-macchiato-DQyhUUbL.js",revision:null},{url:"assets/catppuccin-latte-C9dUb6Cb.js",revision:null},{url:"assets/catppuccin-frappe-DFWUc33u.js",revision:null},{url:"assets/cairo-KRGpt6FW.js",revision:null},{url:"assets/cadence-Bv_4Rxtq.js",revision:null},{url:"assets/c3-MRO5bC_T.js",revision:null},{url:"assets/c-BIGW1oBm.js",revision:null},{url:"assets/bsl-BO_Y6i37.js",revision:null},{url:"assets/blade-2xfisSek.js",revision:null},{url:"assets/bird2-BIv1doCn.js",revision:null},{url:"assets/bicep-Bmn6On1c.js",revision:null},{url:"assets/bibtex-CHM0blh-.js",revision:null},{url:"assets/berry-uYugtg8r.js",revision:null},{url:"assets/beancount-k_qm7-4y.js",revision:null},{url:"assets/bat-BkioyH1T.js",revision:null},{url:"assets/ballerina-BFfxhgS-.js",revision:null},{url:"assets/ayu-mirage-32ctXXKs.js",revision:null},{url:"assets/ayu-light-BA47KaF1.js",revision:null},{url:"assets/ayu-dark-DYE7WIF3.js",revision:null},{url:"assets/awk-DMzUqQB5.js",revision:null},{url:"assets/aurora-x-D-2ljcwZ.js",revision:null},{url:"assets/astro-HNnZUWAn.js",revision:null},{url:"assets/asm-D_Q5rh1f.js",revision:null},{url:"assets/asciidoc-Ve4PFQV2.js",revision:null},{url:"assets/ara-BRHolxvo.js",revision:null},{url:"assets/applescript-Co6uUVPk.js",revision:null},{url:"assets/apl-CORt7UWP.js",revision:null},{url:"assets/apex-Dqspr-GT.js",revision:null},{url:"assets/apache-Pmp26Uib.js",revision:null},{url:"assets/angular-ts-BrjP3tb8.js",revision:null},{url:"assets/angular-html-DA-rfuFy.js",revision:null},{url:"assets/andromeeda-C4gqWexZ.js",revision:null},{url:"assets/ada-bCR0ucgS.js",revision:null},{url:"assets/actionscript-3-CoDkCxhg.js",revision:null},{url:"assets/abap-BdImnpbu.js",revision:null},{url:"assets/openfox-192.png",revision:"79feeb86d692c274854e37959a7dae67"},{url:"assets/openfox-512.png",revision:"fee24b214220594b4f595a467e73036e"},{url:"manifest.webmanifest",revision:"c25f372c782e623ab1e768a8dfe350ca"}],{}),s.cleanupOutdatedCaches(),s.registerRoute(new s.NavigationRoute(s.createHandlerBoundToURL("index.html")))});
|
|
1
|
+
if(!self.define){let s,l={};const e=(e,r)=>(e=new URL(e+".js",r).href,l[e]||new Promise(l=>{if("document"in self){const s=document.createElement("script");s.src=e,s.onload=l,document.head.appendChild(s)}else s=e,importScripts(e),l()}).then(()=>{let s=l[e];if(!s)throw new Error(`Module ${e} didn’t register its module`);return s}));self.define=(r,i)=>{const n=s||("document"in self?document.currentScript.src:"")||location.href;if(l[n])return;let u={};const a=s=>e(s,n),t={module:{uri:n},exports:u,require:a};l[n]=Promise.all(r.map(s=>t[s]||a(s))).then(s=>(i(...s),u))}}define(["./workbox-8c29f6e4"],function(s){"use strict";self.skipWaiting(),s.clientsClaim(),s.precacheAndRoute([{url:"registerSW.js",revision:"1872c500de691dce40960bb85481de07"},{url:"index.html",revision:"a73d5ea5992afab73300eac870ba6673"},{url:"__inspect__.js",revision:"878b477aaf1805c028895f3d3bb4af71"},{url:"assets/zig-VOosw3JB.js",revision:null},{url:"assets/zenscript-DVFEvuxE.js",revision:null},{url:"assets/yaml-Buea-lGh.js",revision:null},{url:"assets/xsl-CtQFsRM5.js",revision:null},{url:"assets/xml-sdJ4AIDG.js",revision:null},{url:"assets/wolfram-lXgVvXCa.js",revision:null},{url:"assets/wit-5i3qLPDT.js",revision:null},{url:"assets/wikitext-BhOHFoWU.js",revision:null},{url:"assets/wgsl-Dx-B1_4e.js",revision:null},{url:"assets/wenyan-BV7otONQ.js",revision:null},{url:"assets/wasm-MzD3tlZU.js",revision:null},{url:"assets/wasm-CG6Dc4jp.js",revision:null},{url:"assets/vyper-CDx5xZoG.js",revision:null},{url:"assets/vue-vine-BoDAl6tE.js",revision:null},{url:"assets/vue-html-AaS7Mt5G.js",revision:null},{url:"assets/vue-D2xRrEX4.js",revision:null},{url:"assets/vitesse-light-CVO1_9PV.js",revision:null},{url:"assets/vitesse-dark-D0r3Knsf.js",revision:null},{url:"assets/vitesse-black-Bkuqu6BP.js",revision:null},{url:"assets/viml-CJc9bBzg.js",revision:null},{url:"assets/vhdl-CeAyd5Ju.js",revision:null},{url:"assets/vesper-DRje8inN.js",revision:null},{url:"assets/verilog-BQ8w6xss.js",revision:null},{url:"assets/vb-D17OF-Vu.js",revision:null},{url:"assets/vala-CsfeWuGM.js",revision:null},{url:"assets/v-BcVCzyr7.js",revision:null},{url:"assets/typst-DHCkPAjA.js",revision:null},{url:"assets/typespec-CAFt9gP4.js",revision:null},{url:"assets/typescript-BPQ3VLAy.js",revision:null},{url:"assets/twig-CW1WmMYd.js",revision:null},{url:"assets/turtle-BsS91CYL.js",revision:null},{url:"assets/tsx-COt5Ahok.js",revision:null},{url:"assets/tsv-B_m7g4N7.js",revision:null},{url:"assets/ts-tags-D351s5mN.js",revision:null},{url:"assets/toml-vGWfd6FD.js",revision:null},{url:"assets/tokyo-night-hegEt444.js",revision:null},{url:"assets/tex-idrVyKtj.js",revision:null},{url:"assets/terraform-BETggiCN.js",revision:null},{url:"assets/templ-DhtptRzy.js",revision:null},{url:"assets/tcl-dwOrl1Do.js",revision:null},{url:"assets/tasl-QIJgUcNo.js",revision:null},{url:"assets/talonscript-CkByrt1z.js",revision:null},{url:"assets/systemd-4A_iFExJ.js",revision:null},{url:"assets/system-verilog-CnnmHF94.js",revision:null},{url:"assets/synthwave-84-CbfX1IO0.js",revision:null},{url:"assets/swift-D82vCrfD.js",revision:null},{url:"assets/svelte-Cy7k_4gC.js",revision:null},{url:"assets/surrealql-Bq5Q-fJD.js",revision:null},{url:"assets/stylus-BEDo0Tqx.js",revision:null},{url:"assets/stata-DI20mbqo.js",revision:null},{url:"assets/ssh-config-_ykCGR6B.js",revision:null},{url:"assets/sql-CRqJ_cUM.js",revision:null},{url:"assets/splunk-BtCnVYZw.js",revision:null},{url:"assets/sparql-rVzFXLq3.js",revision:null},{url:"assets/soy-8wufbnw4.js",revision:null},{url:"assets/solidity-rGO070M0.js",revision:null},{url:"assets/solarized-light-L9t79GZl.js",revision:null},{url:"assets/solarized-dark-DXbdFlpD.js",revision:null},{url:"assets/snazzy-light-Bw305WKR.js",revision:null},{url:"assets/smalltalk-BERRCDM3.js",revision:null},{url:"assets/slack-ochin-DqwNpetd.js",revision:null},{url:"assets/slack-dark-BthQWCQV.js",revision:null},{url:"assets/shellsession-BADoaaVG.js",revision:null},{url:"assets/shellscript-Yzrsuije.js",revision:null},{url:"assets/shaderlab-Dg9Lc6iA.js",revision:null},{url:"assets/sdbl-DVxCFoDh.js",revision:null},{url:"assets/scss-D5BDwBP9.js",revision:null},{url:"assets/scheme-C98Dy4si.js",revision:null},{url:"assets/scala-C151Ov-r.js",revision:null},{url:"assets/sass-Cj5Yp3dK.js",revision:null},{url:"assets/sas-DEy46yEz.js",revision:null},{url:"assets/rust-B1yitclQ.js",revision:null},{url:"assets/ruby-DyJCeAvU.js",revision:null},{url:"assets/rst-CpCqk9r5.js",revision:null},{url:"assets/rosmsg-BJDFO7_C.js",revision:null},{url:"assets/rose-pine-qdsjHGoJ.js",revision:null},{url:"assets/rose-pine-moon-D4_iv3hh.js",revision:null},{url:"assets/rose-pine-dawn-DHQR4-dF.js",revision:null},{url:"assets/ron-D8l8udqQ.js",revision:null},{url:"assets/riscv-BM1_JUlF.js",revision:null},{url:"assets/rel-C3B-1QV4.js",revision:null},{url:"assets/regexp-CDVJQ6XC.js",revision:null},{url:"assets/reg-C-SQnVFl.js",revision:null},{url:"assets/red-bN70gL4F.js",revision:null},{url:"assets/razor-BjBPvh-w.js",revision:null},{url:"assets/raku-DXvB9xmW.js",revision:null},{url:"assets/racket-BqYA7rlc.js",revision:null},{url:"assets/r-Dspwwk_N.js",revision:null},{url:"assets/qss-IeuSbFQv.js",revision:null},{url:"assets/qmldir-C8lEn-DE.js",revision:null},{url:"assets/qml-3beO22l8.js",revision:null},{url:"assets/python-B6aJPvgy.js",revision:null},{url:"assets/purescript-CklMAg4u.js",revision:null},{url:"assets/puppet-BMWR74SV.js",revision:null},{url:"assets/pug-DKIMFp6K.js",revision:null},{url:"assets/proto-C7zT0LnQ.js",revision:null},{url:"assets/prolog-CbFg5uaA.js",revision:null},{url:"assets/prisma-Dd19v3D-.js",revision:null},{url:"assets/powershell-Dpen1YoG.js",revision:null},{url:"assets/powerquery-CEu0bR-o.js",revision:null},{url:"assets/postcss-CXtECtnM.js",revision:null},{url:"assets/polar-C0HS_06l.js",revision:null},{url:"assets/poimandres-CS3Unz2-.js",revision:null},{url:"assets/po-BTJTHyun.js",revision:null},{url:"assets/plsql-ChMvpjG-.js",revision:null},{url:"assets/plastic-3e1v2bzS.js",revision:null},{url:"assets/pkl-u5AG7uiY.js",revision:null},{url:"assets/php-Csjmro_R.js",revision:null},{url:"assets/perl-B9cMNwum.js",revision:null},{url:"assets/pascal-D93ZcfNL.js",revision:null},{url:"assets/openscad-C4EeE6gA.js",revision:null},{url:"assets/one-light-C3Wv6jpd.js",revision:null},{url:"assets/one-dark-pro-DVMEJ2y_.js",revision:null},{url:"assets/odin-BBf5iR-q.js",revision:null},{url:"assets/ocaml-C0hk2d4L.js",revision:null},{url:"assets/objective-cpp-CLxacb5B.js",revision:null},{url:"assets/objective-c-DXmwc3jG.js",revision:null},{url:"assets/nushell-Cz2AlsmD.js",revision:null},{url:"assets/nord-Ddv68eIx.js",revision:null},{url:"assets/nix-CwoSXNpI.js",revision:null},{url:"assets/nim-BIad80T-.js",revision:null},{url:"assets/night-owl-light-CMTm3GFP.js",revision:null},{url:"assets/night-owl-C39BiMTA.js",revision:null},{url:"assets/nginx-BpAMiNFr.js",revision:null},{url:"assets/nextflow-groovy-vE_lwT2v.js",revision:null},{url:"assets/nextflow-C-mBbutL.js",revision:null},{url:"assets/narrat-DRg8JJMk.js",revision:null},{url:"assets/move-IF9eRakj.js",revision:null},{url:"assets/moonbit-_H4v1dQx.js",revision:null},{url:"assets/monokai-D4h5O-jR.js",revision:null},{url:"assets/mojo-rZm6bMo-.js",revision:null},{url:"assets/mipsasm-CKIfxQSi.js",revision:null},{url:"assets/min-light-CTRr51gU.js",revision:null},{url:"assets/min-dark-CafNBF8u.js",revision:null},{url:"assets/mermaid-mWjccvbQ.js",revision:null},{url:"assets/mdx-Cmh6b_Ma.js",revision:null},{url:"assets/mdc-DTYItulj.js",revision:null},{url:"assets/matlab-D7o27uSR.js",revision:null},{url:"assets/material-theme-palenight-Csfq5Kiy.js",revision:null},{url:"assets/material-theme-ocean-CyktbL80.js",revision:null},{url:"assets/material-theme-lighter-B0m2ddpp.js",revision:null},{url:"assets/material-theme-darker-BfHTSMKl.js",revision:null},{url:"assets/material-theme-D5KoaKCx.js",revision:null},{url:"assets/marko-DjSrsDqO.js",revision:null},{url:"assets/markdown-Cvjx9yec.js",revision:null},{url:"assets/make-CHLpvVh8.js",revision:null},{url:"assets/luau-KW6xsasC.js",revision:null},{url:"assets/lua-BaeVxFsk.js",revision:null},{url:"assets/logo-BtOb2qkB.js",revision:null},{url:"assets/log-2UxHyX5q.js",revision:null},{url:"assets/llvm-DjAJT7YJ.js",revision:null},{url:"assets/liquid-C0sCDyMI.js",revision:null},{url:"assets/light-plus-B7mTdjB0.js",revision:null},{url:"assets/less-B1dDrJ26.js",revision:null},{url:"assets/lean-BZvkOJ9d.js",revision:null},{url:"assets/latex-CaSxy8MP.js",revision:null},{url:"assets/laserwave-DUszq2jm.js",revision:null},{url:"assets/kusto-wEQ09or8.js",revision:null},{url:"assets/kotlin-BdnUsdx6.js",revision:null},{url:"assets/kdl-DV7GczEv.js",revision:null},{url:"assets/kanagawa-wave-DWedfzmr.js",revision:null},{url:"assets/kanagawa-lotus-CfQXZHmo.js",revision:null},{url:"assets/kanagawa-dragon-CkXjmgJE.js",revision:null},{url:"assets/just-CUsbIsdP.js",revision:null},{url:"assets/julia-D7OTSIA_.js",revision:null},{url:"assets/jsx-g9-lgVsj.js",revision:null},{url:"assets/jssm-C2t-YnRu.js",revision:null},{url:"assets/jsonnet-DFQXde-d.js",revision:null},{url:"assets/jsonl-DcaNXYhu.js",revision:null},{url:"assets/jsonc-Des-eS-w.js",revision:null},{url:"assets/json5-C9tS-k6U.js",revision:null},{url:"assets/json-Cp-IABpG.js",revision:null},{url:"assets/jison-wvAkD_A8.js",revision:null},{url:"assets/jinja-f2NsQr07.js",revision:null},{url:"assets/javascript-wDzz0qaB.js",revision:null},{url:"assets/java-CylS5w8V.js",revision:null},{url:"assets/ini-BEwlwnbL.js",revision:null},{url:"assets/index-CkUCxzzC.css",revision:null},{url:"assets/index-Bi5R_oF2.js",revision:null},{url:"assets/imba-DGztddWO.js",revision:null},{url:"assets/hy-DFXneXwc.js",revision:null},{url:"assets/hxml-Bvhsp5Yf.js",revision:null},{url:"assets/hurl-irOxFIW8.js",revision:null},{url:"assets/http-jrhK8wxY.js",revision:null},{url:"assets/html2canvas.esm-QH1iLAAe.js",revision:null},{url:"assets/html-pp8916En.js",revision:null},{url:"assets/html-derivative-DlHx6ybY.js",revision:null},{url:"assets/houston-DnULxvSX.js",revision:null},{url:"assets/horizon-bright-CUuTKBJd.js",revision:null},{url:"assets/horizon-BUw7H-hv.js",revision:null},{url:"assets/hlsl-D3lLCCz7.js",revision:null},{url:"assets/hjson-D5-asLiD.js",revision:null},{url:"assets/hcl-BWvSN4gD.js",revision:null},{url:"assets/haxe-CzTSHFRz.js",revision:null},{url:"assets/haskell-Df6bDoY_.js",revision:null},{url:"assets/handlebars-BpdQsYii.js",revision:null},{url:"assets/haml-D5jkg6IW.js",revision:null},{url:"assets/hack-DbPARsA_.js",revision:null},{url:"assets/gruvbox-light-soft-hJgmCMqR.js",revision:null},{url:"assets/gruvbox-light-medium-DRw_LuNl.js",revision:null},{url:"assets/gruvbox-light-hard-CH1njM8p.js",revision:null},{url:"assets/gruvbox-dark-soft-CVdnzihN.js",revision:null},{url:"assets/gruvbox-dark-medium-GsRaNv29.js",revision:null},{url:"assets/gruvbox-dark-hard-CFHQjOhq.js",revision:null},{url:"assets/groovy-gcz8RCvz.js",revision:null},{url:"assets/graphql-ChdNCCLP.js",revision:null},{url:"assets/go-C27-OAKa.js",revision:null},{url:"assets/gnuplot-DdkO51Og.js",revision:null},{url:"assets/gn-n2N0HUVH.js",revision:null},{url:"assets/glsl-DplSGwfg.js",revision:null},{url:"assets/glimmer-ts-BfAWNZQY.js",revision:null},{url:"assets/glimmer-js-ByusRIyA.js",revision:null},{url:"assets/gleam-BspZqrRM.js",revision:null},{url:"assets/github-light-high-contrast-BfjtVDDH.js",revision:null},{url:"assets/github-light-default-D7oLnXFd.js",revision:null},{url:"assets/github-light-DAi9KRSo.js",revision:null},{url:"assets/github-dark-high-contrast-E3gJ1_iC.js",revision:null},{url:"assets/github-dark-dimmed-DH5Ifo-i.js",revision:null},{url:"assets/github-dark-default-Cuk6v7N8.js",revision:null},{url:"assets/github-dark-DHJKELXO.js",revision:null},{url:"assets/git-rebase-r7XF79zn.js",revision:null},{url:"assets/git-commit-F4YmCXRG.js",revision:null},{url:"assets/gherkin-DyxjwDmM.js",revision:null},{url:"assets/genie-D0YGMca9.js",revision:null},{url:"assets/gdshader-DkwncUOv.js",revision:null},{url:"assets/gdscript-C5YyOfLZ.js",revision:null},{url:"assets/gdresource-BOOCDP_w.js",revision:null},{url:"assets/fsharp-CXgrBDvD.js",revision:null},{url:"assets/fortran-free-form-BxgE0vQu.js",revision:null},{url:"assets/fortran-fixed-form-CkoXwp7k.js",revision:null},{url:"assets/fluent-C4IJs8-o.js",revision:null},{url:"assets/fish-BvzEVeQv.js",revision:null},{url:"assets/fennel-BYunw83y.js",revision:null},{url:"assets/everforest-light-C8M2exoo.js",revision:null},{url:"assets/everforest-dark-BgDCqdQA.js",revision:null},{url:"assets/erlang-DsQrWhSR.js",revision:null},{url:"assets/erb-Dm6A9KJ5.js",revision:null},{url:"assets/emacs-lisp-CXvaQtF9.js",revision:null},{url:"assets/elm-DbKCFpqz.js",revision:null},{url:"assets/elixir-CkH2-t6x.js",revision:null},{url:"assets/edge-FbVlp4U3.js",revision:null},{url:"assets/dream-maker-BtqSS_iP.js",revision:null},{url:"assets/dracula-soft-BXkSAIEj.js",revision:null},{url:"assets/dracula-BzJJZx-M.js",revision:null},{url:"assets/dotenv-Da5cRb03.js",revision:null},{url:"assets/docker-BcOcwvcX.js",revision:null},{url:"assets/diff-D97Zzqfu.js",revision:null},{url:"assets/desktop-BmXAJ9_W.js",revision:null},{url:"assets/dax-CEL-wOlO.js",revision:null},{url:"assets/dart-bE4Kk8sk.js",revision:null},{url:"assets/dark-plus-C3mMm8J8.js",revision:null},{url:"assets/d-85-TOEBH.js",revision:null},{url:"assets/cypher-COkxafJQ.js",revision:null},{url:"assets/cue-D82EKSYY.js",revision:null},{url:"assets/csv-fuZLfV_i.js",revision:null},{url:"assets/css-CLj8gQPS.js",revision:null},{url:"assets/csharp-DSvCPggb.js",revision:null},{url:"assets/crystal-DGywbUpC.js",revision:null},{url:"assets/cpp-UfJy6YNI.js",revision:null},{url:"assets/coq-DkFqJrB1.js",revision:null},{url:"assets/common-lisp-Cg-RD9OK.js",revision:null},{url:"assets/coffee-Ch7k5sss.js",revision:null},{url:"assets/codeql-DsOJ9woJ.js",revision:null},{url:"assets/codeowners-Bp6g37R7.js",revision:null},{url:"assets/cobol-nBiQ_Alo.js",revision:null},{url:"assets/cmake-D1j8_8rp.js",revision:null},{url:"assets/clojure-P80f7IUj.js",revision:null},{url:"assets/clarity-D53aC0YG.js",revision:null},{url:"assets/catppuccin-mocha-D87Tk5Gz.js",revision:null},{url:"assets/catppuccin-macchiato-DQyhUUbL.js",revision:null},{url:"assets/catppuccin-latte-C9dUb6Cb.js",revision:null},{url:"assets/catppuccin-frappe-DFWUc33u.js",revision:null},{url:"assets/cairo-KRGpt6FW.js",revision:null},{url:"assets/cadence-Bv_4Rxtq.js",revision:null},{url:"assets/c3-MRO5bC_T.js",revision:null},{url:"assets/c-BIGW1oBm.js",revision:null},{url:"assets/bsl-BO_Y6i37.js",revision:null},{url:"assets/blade-2xfisSek.js",revision:null},{url:"assets/bird2-BIv1doCn.js",revision:null},{url:"assets/bicep-Bmn6On1c.js",revision:null},{url:"assets/bibtex-CHM0blh-.js",revision:null},{url:"assets/berry-uYugtg8r.js",revision:null},{url:"assets/beancount-k_qm7-4y.js",revision:null},{url:"assets/bat-BkioyH1T.js",revision:null},{url:"assets/ballerina-BFfxhgS-.js",revision:null},{url:"assets/ayu-mirage-32ctXXKs.js",revision:null},{url:"assets/ayu-light-BA47KaF1.js",revision:null},{url:"assets/ayu-dark-DYE7WIF3.js",revision:null},{url:"assets/awk-DMzUqQB5.js",revision:null},{url:"assets/aurora-x-D-2ljcwZ.js",revision:null},{url:"assets/astro-HNnZUWAn.js",revision:null},{url:"assets/asm-D_Q5rh1f.js",revision:null},{url:"assets/asciidoc-Ve4PFQV2.js",revision:null},{url:"assets/ara-BRHolxvo.js",revision:null},{url:"assets/applescript-Co6uUVPk.js",revision:null},{url:"assets/apl-CORt7UWP.js",revision:null},{url:"assets/apex-Dqspr-GT.js",revision:null},{url:"assets/apache-Pmp26Uib.js",revision:null},{url:"assets/angular-ts-BrjP3tb8.js",revision:null},{url:"assets/angular-html-DA-rfuFy.js",revision:null},{url:"assets/andromeeda-C4gqWexZ.js",revision:null},{url:"assets/ada-bCR0ucgS.js",revision:null},{url:"assets/actionscript-3-CoDkCxhg.js",revision:null},{url:"assets/abap-BdImnpbu.js",revision:null},{url:"assets/openfox-192.png",revision:"79feeb86d692c274854e37959a7dae67"},{url:"assets/openfox-512.png",revision:"fee24b214220594b4f595a467e73036e"},{url:"manifest.webmanifest",revision:"c25f372c782e623ab1e768a8dfe350ca"}],{}),s.cleanupOutdatedCaches(),s.registerRoute(new s.NavigationRoute(s.createHandlerBoundToURL("index.html")))});
|