taskchef 8.2.1 → 8.2.2
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/.codex-plugin/plugin.json +1 -1
- package/package.json +1 -1
- package/src/dashboard/dist/app.js +1 -1
- package/src/dashboard/dist/app.js.map +1 -1
- package/src/dashboard/dist/styles.css +1 -1
- package/src/dashboard/react/components/ActivityTimeline.tsx +4 -3
- package/src/dashboard/react/components/RelativeTime.tsx +3 -1
- package/src/dashboard/react/components/TaskCardStats.test.tsx +2 -2
- package/src/dashboard/react/components/TaskCardStats.tsx +4 -3
- package/src/dashboard/react/components/UsagePanel.tsx +14 -23
- package/src/dashboard/react/presentation.test.tsx +40 -9
- package/src/dashboard/react/styles.css +1 -1
package/package.json
CHANGED
|
@@ -190,5 +190,5 @@ ${f?`${d("light")}{${f}}`:""}`}function qs({theme:n,color:l,colorScheme:r,name:o
|
|
|
190
190
|
*
|
|
191
191
|
* This source code is licensed under the MIT license.
|
|
192
192
|
* See the LICENSE file in the root directory of this source tree.
|
|
193
|
-
*/const k_=[["path",{d:"M7 3.34a10 10 0 1 1 -4.995 8.984l-.005 -.324l.005 -.324a10 10 0 0 1 4.995 -8.336z",key:"svg-0"}]],B_=Mt("filled","circle-filled","CircleFilled",k_);function H_({onConnection:n,onError:l,onSnapshot:r}){const o=new EventSource("/api/events");return o.addEventListener("open",()=>n(!0)),o.addEventListener("error",()=>n(!1)),o.addEventListener("snapshot",s=>{n(!0),r(JSON.parse(s.data))}),o.addEventListener("dashboard-error",s=>{const c=JSON.parse(s.data);l(c.message??"The task log is temporarily unavailable.")}),o}async function Ai(n,l){const r=await fetch(n,l),o=await r.json().catch(()=>({}));if(!r.ok)throw Object.assign(new Error(o.message??"Request failed."),{payload:o});return o}async function U_(){return(await Ai("/api/health")).taskchefVersion}async function Y_(n,l,r){return Ai(`/api/settings/${encodeURIComponent(n)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({schemaVersion:1,model:l,effort:r})})}async function q_(n){return(await Ai(`/api/tasks/${encodeURIComponent(n)}`)).task}async function V_(n){return(await Ai(`/api/tasks/${encodeURIComponent(n)}/open-codex`,{method:"POST"})).message??null}async function G_(n,l,r){const o=new AbortController,s=window.setTimeout(()=>o.abort(),1e4);try{return{ok:!0,task:(await Ai(`/api/tasks/${encodeURIComponent(n.id)}/manual-transition`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({schemaVersion:1,actionId:r,expected:{status:n.status,turnRef:n.turnRef,threadId:n.threadId,updatedAt:n.updatedAt},targetStatus:l}),signal:o.signal})).task}}catch(c){const f=c.payload;return{ok:!1,code:(f==null?void 0:f.code)??(o.signal.aborted?"request_timeout":"network_error"),message:(f==null?void 0:f.message)??(o.signal.aborted?"Task state change timed out. Try again.":"Task state changes are temporarily unavailable. Try again."),task:(f==null?void 0:f.task)??null}}finally{window.clearTimeout(s)}}function X_(){const[n,l]=x.useState([]),[r,o]=x.useState(null),[s,c]=x.useState(null),[f,d]=x.useState(!0),[p,h]=x.useState(null),[b,y]=x.useState(null),[v,w]=x.useState(0);x.useEffect(()=>{const C=new AbortController;return d(!0),c(null),fetch("/api/settings",{signal:C.signal}).then(async A=>{if(!A.ok)throw new Error("Settings preview could not be loaded.");const N=await A.json();l(N.profiles),o(N.usageProvider??null)}).catch(A=>{C.signal.aborted||c(A.message)}).finally(()=>{C.signal.aborted||d(!1)}),()=>C.abort()},[v]),x.useEffect(()=>{if(y(null),!p)return;const C=window.setTimeout(()=>y(p),400);return()=>window.clearTimeout(C)},[p]);const R=n.find(C=>C.id==="personal"),T=async(C,A,N)=>{h(C.role),c(null),l(_=>_.map(j=>j.id!=="personal"?j:{...j,roles:j.roles.map($=>$.role===C.role?{...$,model:A,effort:N}:$)}));try{const _=await Y_(C.role,A,N);l([_.profile])}catch(_){l(j=>j.map($=>$.id!=="personal"?$:{...$,roles:$.roles.map(L=>L.role===C.role?C:L)})),c(_ instanceof Error?_.message:"Model role could not be saved.")}finally{h(null)}};return g.jsxs(Ut,{gap:"md","aria-label":"Model settings",children:[g.jsxs(St,{justify:"space-between",children:[g.jsx(Wt,{order:2,size:"h3",children:"Model roles"}),g.jsx(ul,{"aria-label":"Refresh","aria-busy":f,"aria-disabled":f||p!==null,className:"taskchef-icon-button",color:"gray",variant:"subtle",size:"lg",onClick:()=>{f||p||(d(!0),w(C=>C+1))},children:g.jsx(M_,{className:f?"taskchef-refresh-spinning":void 0,size:18,stroke:1.8})})]}),g.jsx(_e,{c:"dimmed",size:"sm",children:"Your models for planning, implementation, and review."}),s&&g.jsx(Mn,{color:"red",role:"alert",children:s}),R&&g.jsxs(g.Fragment,{children:[R.problems.map(C=>g.jsx(Mn,{color:"yellow",children:C},C)),R.roles.map(C=>{var A,N;return g.jsx(gn,{withBorder:!0,p:"md",children:g.jsxs(Ut,{gap:"xs",children:[g.jsxs(St,{justify:"space-between",children:[g.jsx(Wt,{order:3,size:"h4",tt:"capitalize",children:C.role}),g.jsx(Jo,{color:["invalid","unavailable"].includes(C.status)?"red":C.status==="missing"?"gray":"teal",children:C.status})]}),g.jsxs($p,{cols:{base:1,sm:2},children:[g.jsx(Wo,{label:"Model","aria-label":`${C.role} model`,"aria-busy":f||p!==null,data:R.modelOptions??[],value:typeof C.model=="string"?C.model:null,readOnly:f||p!==null,allowDeselect:!1,searchable:!0,onChange:_=>{var L;if(f||p||!_)return;const j=(L=R.modelOptions)==null?void 0:L.find(D=>D.value===_),$=typeof C.effort=="string"&&(j!=null&&j.efforts.includes(C.effort))?C.effort:j==null?void 0:j.efforts[0];$&&T(C,_,$)}}),g.jsx(Wo,{label:"Reasoning effort","aria-label":`${C.role} reasoning effort`,"aria-busy":f||p!==null,data:(((N=(A=R.modelOptions)==null?void 0:A.find(_=>_.value===C.model))==null?void 0:N.efforts)??[]).map(_=>({value:_,label:_})),value:typeof C.effort=="string"?C.effort:null,disabled:typeof C.model!="string",readOnly:f||p!==null,allowDeselect:!1,onChange:_=>{!f&&!p&&_&&typeof C.model=="string"&&T(C,C.model,_)}})]}),g.jsxs(_e,{size:"sm",style:{overflowWrap:"anywhere"},children:["Source: ",C.displaySource??C.source??"No role file"]}),b===C.role&&g.jsx(_e,{c:"dimmed",size:"sm",role:"status",children:"Saving…"}),C.problems.map(_=>g.jsx(Mn,{color:"red",children:_},_))]})},C.role)})]}),r&&g.jsx(gn,{withBorder:!0,p:"md",children:g.jsxs(Ut,{gap:"xs",children:[g.jsxs(St,{justify:"space-between",children:[g.jsx(Wt,{order:3,size:"h4",children:"Usage provider"}),g.jsx(Jo,{color:r.status==="available"?"teal":"red",children:r.status})]}),g.jsxs(_e,{children:[r.provider,r.version?` ${r.version}`:" version unavailable"]}),g.jsx(_e,{c:"dimmed",size:"sm",children:"Version reported by the executable TaskChef uses for token and cost estimates."})]})})]})}const I_=50,Z_="Turn interrupted before a terminal report.",ZS=[{value:"",label:"All"},{value:"working",label:"Working"},{value:"needs input",label:"Needs input"},{value:"completed",label:"Completed"},{value:"failed",label:"Failed"}],Q_=new Map([["created","Task created"],["task_started","Task started"],["follow_up_started","Follow-up started"],["completed","Task completed"],["needs_input","Task needs input"],["failed","Task failed"],["manual_completed","Task manually completed"],["manual_failed","Task manually failed"],["archive_succeeded","Chat archived"],["archive_failed","Chat archive failed"],["unresolved","Task updated"]]),K_=new Map([["24h",1440*60*1e3],["7d",10080*60*1e3],["all",null]]);function F_(n){return Date.parse(n.meaningfulUpdatedAt??n.updatedAt??n.createdAt)}function QS(n){return n.status===null?"unresolved":n.status.replaceAll("_"," ")}function J_(n){return{status:n.status,turnRef:n.turnRef,threadId:n.threadId,updatedAt:n.updatedAt}}function P_(n,l){return!!l&&n.status===l.status&&n.turnRef===l.turnRef&&n.threadId===l.threadId&&n.updatedAt===l.updatedAt}function Db({requestTask:n,expected:l,responseTask:r,selectedTask:o}){const s=(o==null?void 0:o.id)===n.id?o:n;return P_(s,l)?r??s:s}function W_(n){var s;const l=n.latestTurn??null,r=(l==null?void 0:l.result)??null,o=(l==null?void 0:l.requestSummary)??(l?"Request not recorded by this TaskChef version.":n.title);return{turnRef:(l==null?void 0:l.turnRef)??(l==null?void 0:l.turnId)??n.turnRef??n.turnId??null,turnId:(l==null?void 0:l.turnId)??n.turnId??null,startedAt:(l==null?void 0:l.startedAt)??n.updatedAt??n.createdAt??null,requestSummary:o,resultStatus:(r==null?void 0:r.status)??(n.status==="working"?"working":n.status),resultSummary:(r==null?void 0:r.summary)??(n.status==="working"?"In progress":((s=n.lastResult)==null?void 0:s.summary)??n.summary??"No result reported."),resultUpdatedAt:(r==null?void 0:r.updatedAt)??null}}function eN(n){var r;const l=n.result??null;return{status:(l==null?void 0:l.status)??"working",summary:(l==null?void 0:l.summary)??"In progress",updatedAt:(l==null?void 0:l.updatedAt)??n.startedAt,...((r=n.provenance)==null?void 0:r.kind)==="dashboard_manual"?{sourceLabel:"Manual dashboard change"}:{}}}function tN(n,l=[]){if(Array.isArray(n.turns))return n.turns;if(!n.latestTurn)return l;const r=[...l],o=r.length-1,s=n.latestTurn.turnRef??n.latestTurn.turnId,c=o>=0?r[o].turnRef??r[o].turnId:null,f=o>=0&&c===null&&s!==null&&r[o].turnId==null&&n.latestTurn.turnId==null&&JSON.stringify({...r[o],turnRef:null})===JSON.stringify({...n.latestTurn,turnRef:null});return o>=0&&(c===s||f)?r[o]=n.latestTurn:(n.schemaVersion>=8&&o>=0&&r[o].result===null&&(r[o]={...r[o],result:{status:"interrupted",summary:Z_,updatedAt:n.latestTurn.startedAt}}),r.push(n.latestTurn)),r}function nu(n){return Q_.get(n.event)??"Task updated"}function nN(n,l,r=Date.now()){const o=K_.get(l);if(o===null)return!0;if(o===void 0)return!1;const s=F_(n);return Number.isFinite(s)&&s>=r-o}function KS(n,{project:l="",status:r="",date:o="all",now:s=Date.now()}={}){return n.filter(c=>(!l||c.project.name===l)&&(!r||QS(c)===r)&&nN(c,o,s))}function lN(n,{project:l="",date:r="all",now:o=Date.now()}={}){const s=KS(n,{project:l,date:r,now:o});return Object.fromEntries(ZS.map(({value:c})=>[c,c?s.filter(f=>QS(f)===c).length:s.length]))}function aN(n){return JSON.stringify([n.id,n.turnRef??n.turnId??null,n.turnId??null,n.status??"unresolved"])}function oN(n,l){try{const r=JSON.parse(n),o=JSON.parse(l);return Array.isArray(r)&&Array.isArray(o)&&r.length===o.length&&r[1]===null&&o[1]!==null&&r[2]===null&&o[2]===null&&r[3]!=="working"&&r.every((s,c)=>c===1||s===o[c])}catch{return!1}}function rN(n){var l,r;return n.status==="working"?n.lastResult?"follow_up_started":"task_started":((r=(l=n.latestTurn)==null?void 0:l.provenance)==null?void 0:r.kind)==="dashboard_manual"?`manual_${n.status}`:n.status??"unresolved"}function FS(n,l){return JSON.stringify(l==="created"?[n.id,null,l,n.createdAt??null]:[n.id,n.turnRef??n.turnId??null,l])}function iN(n,l){var r,o,s;return l==="created"?n.createdAt??n.updatedAt??null:((r=n.lastResult)==null?void 0:r.status)===n.status&&(((o=n.lastResult)==null?void 0:o.turnRef)??((s=n.lastResult)==null?void 0:s.turnId))===(n.turnRef??n.turnId)?n.lastResult.updatedAt:n.updatedAt??n.createdAt??null}function sN(n,l){var r,o,s;return["completed","needs_input","failed","manual_completed","manual_failed"].includes(l)?((r=n.lastResult)==null?void 0:r.status)===n.status&&(((o=n.lastResult)==null?void 0:o.turnRef)??((s=n.lastResult)==null?void 0:s.turnId))===(n.turnRef??n.turnId)?n.lastResult.summary:n.summary??null:null}function qo(n,l=rN(n)){const r=l==="created";return Object.freeze({id:FS(n,l),taskId:n.id,title:n.title,status:r?"working":n.status,event:l,turnRef:r?null:n.turnRef??n.turnId??null,turnId:r?null:n.turnId??null,timestamp:iN(n,l),summary:sN(n,l)})}function Ks(n){var o;const l=n.lastResult;if(!l)return null;const r=((o=l.provenance)==null?void 0:o.kind)==="dashboard_manual"?`manual_${l.status}`:l.status;return Object.freeze({id:FS({...n,turnRef:l.turnRef??l.turnId,turnId:l.turnId},r),taskId:n.id,title:n.title,status:l.status,event:r,turnRef:l.turnRef??l.turnId??null,turnId:l.turnId??null,timestamp:l.updatedAt,summary:l.summary})}function cN(n,l){return`${l?"Open current task details":"Show task availability"} for ${n.title}: ${nu(n)}`}function uN(n){return`Dismiss ${nu(n)} notification for ${n.title}`}function $b(n,l){return n.filter(({id:r})=>r!==l)}function fN({initialized:n,notifications:l,seenIds:r=new Set,signatures:o},s){const c=new Map(o);for(const p of s)c.set(p.id,aN(p));const f=new Set(r);if(!n){for(const p of s){f.add(qo(p,"created").id);const h=Ks(p);h&&f.add(h.id),f.add(qo(p).id)}return{additions:[],notifications:l,seenIds:f,signatures:c}}const d=[];for(const p of s){const h=[];if(o.has(p.id)){if(o.get(p.id)!==c.get(p.id)&&!oN(o.get(p.id),c.get(p.id))){h.push(qo(p));const y=Ks(p);y&&h.push(y)}}else{const y=Ks(p);(p.turnRef||p.turnId||p.status!=="working"||y)&&(h.push(qo(p)),y&&h.push(y)),h.push(qo(p,"created"))}for(const y of h)f.has(y.id)||d.push(y),f.add(y.id);const b=Ks(p);b&&f.add(b.id),f.add(qo(p).id)}return{additions:d,notifications:[...d,...l].slice(0,I_),seenIds:f,signatures:c}}function dN(n,l,r){const o=n.notifications.filter(({id:s})=>s!==l.id);return r?{...n,detailTaskId:l.taskId,detailOpened:!0,highlightTurnRef:l.turnRef??l.turnId,notifications:o,refreshGeneration:n.refreshGeneration+1}:{...n,notifications:o}}function Lb(n){return{...n,notifications:[]}}function kb(n,l){const r=Array.isArray(n.turns)&&Array.isArray(n.results),o=!Array.isArray(l.turns)&&!Array.isArray(l.results);return{...n,...l,...r&&o?{results:n.results,turns:n.turns,usage:n.usage}:{}}}function Fs(n){var l,r,o,s,c,f,d;return JSON.stringify([((l=n==null?void 0:n.usage)==null?void 0:l.generationTurnRef)??null,((r=n==null?void 0:n.usage)==null?void 0:r.status)??null,((o=n==null?void 0:n.usage)==null?void 0:o.updatedAt)??null,((c=(s=n==null?void 0:n.usage)==null?void 0:s.task)==null?void 0:c.totalTokens)??null,((d=(f=n==null?void 0:n.usage)==null?void 0:f.task)==null?void 0:d.estimatedCostUsd)??null])}const mN=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.(\d{1,3}))?(Z|[+-]\d{2}:\d{2})$/;function JS(n,l){const r=Bb(n),o=Bb(l);if(r===null||o===null)return null;const s=o-r;return s>=0?s:null}function PS(n){var r;const l=JS(n.startedAt,(r=n.result)==null?void 0:r.updatedAt);return l===0?null:l}function pN(n){const l=n.filter(s=>s.result!==null),r=l.map(PS).filter(s=>s!==null),o=r.length===0?l.length===0?0:null:r.reduce((s,c)=>s+c,0);return Object.freeze({terminalTurns:l.length,validTurns:r.length,totalMilliseconds:o===null||Number.isSafeInteger(o)?o:null})}function Bb(n){if(typeof n!="string")return null;const l=n.match(mN);if(!l)return null;const[,r,o,s,c,f,d,,p]=l,h=Number(r),b=Number(o),y=Number(s),v=Number(c),w=Number(f),R=Number(d),T=p==="Z"?0:Number(p.slice(1,3)),C=p==="Z"?0:Number(p.slice(4,6)),N=[31,h%4===0&&(h%100!==0||h%400===0)?29:28,31,30,31,30,31,31,30,31,30,31];if(b<1||b>12||y<1||y>N[b-1]||v>23||w>59||R>59||T>23||C>59)return null;const _=Date.parse(n);return Number.isFinite(_)?_:null}const hm=1e3,vm=60*hm,gm=60*vm,hN=24*gm,vn="n/a";function WS(n){if(!Number.isFinite(n)||n<0)return null;if(n>0&&n<hm)return"<1s";const l=Math.floor(n/hm);if(n<vm)return`${l}s`;if(n<gm)return`${Math.floor(l/60)}m ${l%60}s`;const r=Math.floor(n/vm);if(n<hN)return`${Math.floor(r/60)}h ${r%60}m`;const o=Math.floor(n/gm);return`${Math.floor(o/24)}d ${o%24}h`}function ex(n){const l=n.turns===void 0?n.reportedWork:pN(n.turns??[]);if(l===void 0)return{accessibleLabel:"Reported work unavailable because terminal turn history is not available.",kind:"unavailable",title:"Reported wall-clock elapsed time requires the terminal turn history from the task detail projection.",value:vn};if(l.terminalTurns===0)return{accessibleLabel:"Reported work not yet reported. Unfinished turns are excluded.",kind:"not-reported",title:"Reported wall-clock elapsed time is added only after a turn reaches a terminal state.",value:vn};if(l.validTurns===0)return{accessibleLabel:"Reported work unavailable because completed turn timestamps are missing or invalid.",kind:"unavailable",title:"Reported wall-clock elapsed time is unavailable because no terminal turn has a valid start and end timestamp.",value:vn};const r=l.totalMilliseconds===null?null:WS(l.totalMilliseconds);if(r===null)return{accessibleLabel:"Reported work unavailable because the duration total is outside the supported range.",kind:"unavailable",title:"Reported wall-clock elapsed time is unavailable because the duration total is outside the supported range.",value:vn};const o=l.terminalTurns-l.validTurns,s=o>0?` ${o} terminal ${o===1?"turn was":"turns were"} unavailable and excluded.`:"";return{accessibleLabel:`Reported work ${r}. This is reported wall-clock elapsed time.${s}`,kind:"available",title:`Sum of valid terminal-turn wall-clock elapsed times; unfinished turns and idle gaps are excluded.${s}`,value:r}}function vN(n,l=Date.now()){const r=n.result===null,o=r?JS(n.startedAt,new Date(l).toISOString()):PS(n),s=r?"Elapsed so far":"Elapsed",c=o===null?vn:WS(o)??vn;return{accessibleLabel:`${s} ${o===null?"unavailable":c}. ${r?"Current":"Completed"} turn reported wall-clock elapsed time.`,kind:o===null?"unavailable":"available",label:s,title:o===null?"Reported wall-clock elapsed time is unavailable because the turn timestamps are missing, invalid, or reversed.":`Reported wall-clock elapsed time from startedAt ${r?"to the current time":"to result.updatedAt"}.`,value:c}}function lu(n,l){return new Intl.NumberFormat(l,{maximumFractionDigits:2,notation:"compact"}).format(n)}function pi(n,l){return new Intl.NumberFormat(l,{maximumFractionDigits:2}).format(n)}function er(n,l){return typeof n!="number"||!Number.isFinite(n)?"—":new Intl.NumberFormat(l,{currency:"USD",currencyDisplay:"narrowSymbol",maximumFractionDigits:2,minimumFractionDigits:2,style:"currency"}).format(n)}function tx(n,l){return new Intl.NumberFormat(l,{maximumFractionDigits:2,minimumFractionDigits:2}).format(n)}function nx(n){var s;const l=n.usage,r=n.turnRef??((s=n.latestTurn)==null?void 0:s.turnRef)??null,o=(l==null?void 0:l.generationTurnRef)!=null&&r!=null&&l.generationTurnRef!==r;return n.status==="working"?l!=null&&l.task?Qd(l.task,!0):{kind:"pending",label:"Token usage pending"}:(l==null?void 0:l.status)==="calculating"||o?l.task?Qd(l.task,!0):{kind:"calculating",label:"Calculating token usage"}:(l==null?void 0:l.status)==="available"&&l.task?Qd(l.task,!1):!l&&n.threadId&&["completed","failed","needs_input"].includes(n.status??"")?{kind:"calculating",label:"Calculating token usage"}:{kind:"unavailable",label:(l==null?void 0:l.reason)??"Token usage unavailable"}}function Qd(n,l){const r=lu(n.totalTokens),o=n.estimatedCostUsd==null?"Estimated cost n/a":`Estimated cost ${er(n.estimatedCostUsd)}`;return{kind:"ready",knownSoFar:l,label:`${r} tokens · ${o}${l?" · known so far":""}`,usage:n}}function gN(n,l){var s,c;if(l.result===null)return{kind:"pending",label:"Turn usage pending"};const r=l.turnRef??l.turnId,o=r?(c=(s=n.usage)==null?void 0:s.turns)==null?void 0:c[r]:null;if((o==null?void 0:o.status)==="calculating")return{kind:"calculating",label:"Calculating turn usage"};if((o==null?void 0:o.status)==="available"&&typeof o.totalTokens=="number"){const f=pi(o.totalTokens),d=o.estimatedCostUsd==null?"Estimated cost n/a":`Estimated cost ${er(o.estimatedCostUsd)}`;return{kind:"ready",label:`${f} tokens · ${d}`}}return{kind:"unavailable",label:(o==null?void 0:o.reason)??"Turn usage unavailable"}}function yN(n,l){var c,f;const r=gN(n,l);if(r.kind==="ready"){const d=l.turnRef??l.turnId,p=d?(f=(c=n.usage)==null?void 0:c.turns)==null?void 0:f[d]:null,h=typeof(p==null?void 0:p.totalTokens)=="number"?pi(p.totalTokens):vn,b=typeof(p==null?void 0:p.totalTokens)=="number"?lu(p.totalTokens):vn,y=p==null?void 0:p.estimatedCostUsd,v=typeof y=="number"&&Number.isFinite(y),w=v?tx(y):vn;return{animated:!1,cost:{accessibleLabel:`Estimated cost ${v?er(y).toLowerCase():"unavailable"}`,value:w},kind:r.kind,note:null,title:r.label,tokens:{accessibleLabel:`${h} tokens`,value:b}}}const o=r.kind==="pending"?"Pending":r.kind==="calculating"?"Calculating":vn,s=r.kind==="unavailable"?"unavailable":o.toLowerCase();return{animated:r.kind==="pending"||r.kind==="calculating",cost:{accessibleLabel:`Estimated cost ${s}${r.kind==="unavailable"?`: ${r.label}`:""}`,value:o},kind:r.kind,note:r.kind==="unavailable"&&r.label!=="Turn usage unavailable"?r.label:null,title:r.label,tokens:{accessibleLabel:`Tokens ${s}${r.kind==="unavailable"?`: ${r.label}`:""}`,value:o}}}function bN(n){var l,r;return n.status!=="working"&&(((l=n.usage)==null?void 0:l.status)==="calculating"||Object.values(((r=n.usage)==null?void 0:r.turns)??{}).some(o=>o.status==="calculating"))}function SN(n){var R;const l=nx(n);if(l.kind==="pending"||l.kind==="calculating"){const T=l.kind==="pending"?"Pending":"Calculating";return{cost:{accessibleLabel:`Estimated cost ${T.toLowerCase()}`,animated:!0,title:l.label,value:T},kind:l.kind,tokens:{accessibleLabel:`Tokens ${T.toLowerCase()}`,animated:!0,title:l.label,value:T}}}if(l.kind==="unavailable"){const T=l.label==="Token usage unavailable"?"":`: ${l.label}`;return{cost:{accessibleLabel:`Estimated cost unavailable${T}`,animated:!1,title:l.label,value:vn},kind:"unavailable",tokens:{accessibleLabel:`Token usage unavailable${T}`,animated:!1,title:l.label,value:`${vn} tokens`}}}const r=lu(l.usage.totalTokens),o=pi(l.usage.totalTokens),s=l.usage.estimatedCostUsd,c=typeof s=="number"&&Number.isFinite(s),f=c?er(s):null,d=c?tx(s):null,p=l.knownSoFar?" · Updating…":"",h=l.knownSoFar?"; updating":"",b=c?p:"",y=c?h:"",v=l.usage.sourceUpdatedAt??l.usage.sampledAt??((R=n.usage)==null?void 0:R.updatedAt)??null,w=v&&!Number.isNaN(Date.parse(v))?` Cached usage updated ${new Date(v).toLocaleString()}.`:"";return{cost:{accessibleLabel:`Estimated cost ${f??"unavailable"}${y}.${w}`,animated:l.knownSoFar&&c,title:`${f===null?"Estimated cost unavailable":`Unrounded estimate: $${l.usage.estimatedCostUsd}`}${b}.${w}`,value:d??vn},kind:"ready",tokens:{accessibleLabel:`${o} tokens${h}.${w}`,animated:l.knownSoFar,title:`${o} tokens${p}.${w}`,value:`${r} tokens`}}}function xN(n){return n==="completed"?"teal":n==="needs_input"?"yellow":n==="failed"?"red":n==="working"?"blue":"gray"}function wN(n){return n===null?"Unresolved":n.replaceAll("_"," ")}const Kd=30,oi=6e4,fc=60*oi,Ga=24*fc;function lx(n){if(typeof n!="string"||n.trim()==="")return null;const l=Date.parse(n);return Number.isFinite(l)?{date:new Date(l),iso:new Date(l).toISOString(),milliseconds:l}:null}function Hb(n,{locale:l,timeZone:r}={}){const o=lx(n);return o?new Intl.DateTimeFormat(l,{dateStyle:"medium",timeStyle:"short",timeZone:r}).format(o.date):"—"}function CN(n,l){const r=Math.floor(n/fc),o=r===1?"1 hour":`${r} hours`;return l==="future"?`in ${o}`:`${o} ago`}function Lp(n,{now:l=Date.now(),locale:r,timeZone:o}={}){const s=lx(n);if(!s)return"—";const c=l-s.milliseconds,f=c<0,d=Math.abs(c);if(d<oi)return"just now";if(d<2*oi)return f?"in 1 minute":"1 minute ago";if(d<fc){const b=f?Math.ceil(d/oi):Math.floor(d/oi);return f?`in ${b} minutes`:`${b} minutes ago`}if(d<2*fc)return f?"in 1 hour":"1 hour ago";if(d<Ga)return CN(d,f?"future":"past");if(d<2*Ga)return f?"in 1 day":"1 day ago";if(d<Kd*Ga){const b=f?Math.ceil(d/Ga):Math.floor(d/Ga);return f?`in ${b} days`:`${b} days ago`}const p=f?Math.ceil(d/(Kd*Ga)):Math.floor(d/(Kd*Ga)),h=p===1?"1 month":`${p} months`;return f?`in ${h}`:`${h} ago`}function au({status:n}){return g.jsx(Jo,{className:"taskchef-status-badge",color:xN(n),size:"sm",variant:"light",children:wN(n)})}function Ub({notifications:n,announcements:l=n,onClear:r,onDismiss:o,onOpen:s,tasks:c,withinPortal:f=!0}){if(n.length===0)return null;const d=g.jsxs(g.Fragment,{children:[g.jsxs(gn,{"aria-label":"Task notifications",className:"taskchef-notifications",p:"sm",radius:"md",role:"region",shadow:"xl",withBorder:!0,children:[g.jsxs(St,{justify:"space-between",mb:"xs",children:[g.jsxs(St,{gap:6,children:[g.jsx(m_,{"aria-hidden":!0,size:16}),g.jsx(_e,{fw:700,size:"sm",children:"Updates"})]}),g.jsx(il,{onClick:r,size:"compact-xs",variant:"subtle",children:"Clear all"})]}),g.jsx(Un.Autosize,{className:"taskchef-notification-scroll",mah:"min(55vh, 520px)",type:"auto",children:g.jsx(Ut,{className:"taskchef-notification-list",gap:6,children:n.map(p=>{const h=c.some(w=>w.id===p.taskId),b=`notification-${Math.abs(RN(p.id))}`,y=`${b}-summary`,v=`${b}-metadata`;return g.jsx(gn,{className:"taskchef-notification",p:"xs",radius:"sm",children:g.jsxs(St,{align:"flex-start",gap:"xs",wrap:"nowrap",children:[g.jsxs("button",{"aria-describedby":[p.summary?y:null,v].filter(Boolean).join(" "),"aria-label":cN(p,h),className:"taskchef-notification-open",onClick:()=>s(p),type:"button",children:[g.jsxs(St,{gap:"xs",justify:"space-between",wrap:"nowrap",children:[g.jsx(_e,{fw:700,size:"sm",children:nu(p)}),g.jsx(au,{status:p.status})]}),g.jsx(_e,{lineClamp:1,size:"sm",children:p.title}),p.summary&&g.jsx(_e,{className:"taskchef-preserve-lines",id:y,lineClamp:3,size:"xs",children:p.summary}),g.jsxs(_e,{c:"dimmed",id:v,size:"xs",children:[Lp(p.timestamp),h?"":" · Task no longer available"]})]}),g.jsx(Zn,{label:"Dismiss notification",children:g.jsx(ul,{"aria-label":uN(p),color:"gray",onClick:()=>o(p),size:"compact-sm",variant:"subtle",children:g.jsx(IS,{"aria-hidden":!0,size:14})})})]})},p.id)})})})]}),g.jsx(ue,{"aria-atomic":"true","aria-live":"polite",className:"taskchef-visually-hidden",role:"status",children:l.map(TN).join(" ")})]});return f?g.jsx(ep,{children:d}):d}function TN(n){return[nu(n),n.title,n.summary,n.turnRef?`Turn ref ${n.turnRef}`:null,Lp(n.timestamp)].filter(Boolean).map(l=>String(l).replace(/[.\s]+$/,"")).join(". ")+"."}function RN(n){let l=0;for(const r of n)l=(l<<5)-l+r.charCodeAt(0)|0;return l}const EN=/^[A-Za-z0-9](?:[A-Za-z0-9-]{0,38})\/[A-Za-z0-9._-]+$/,AN=/https?:\/\/(?:www\.)?github\.com\/([A-Za-z0-9](?:[A-Za-z0-9-]{0,38}))\/([A-Za-z0-9._-]+)\/(issues|pull)\/([1-9]\d*)(?![A-Za-z0-9_])|([A-Za-z0-9](?:[A-Za-z0-9-]{0,38}))\/([A-Za-z0-9._-]+)#([1-9]\d*)(?![A-Za-z0-9_])|#([1-9]\d*)(?![A-Za-z0-9_])|https?:\/\/(?:www\.)?github\.com\/([A-Za-z0-9](?:[A-Za-z0-9-]{0,38}))\/([A-Za-z0-9](?:[A-Za-z0-9._-]*[A-Za-z0-9_-])?)\/?(?=$|[\s#),.;:!?'"\]}>])/gi,_N=/https?:\/\/[^\s<>"'`]+/gi;function Qo(n){return!(n!=null&&n.owner)||!(n!=null&&n.repository)?null:`${n.owner.toLowerCase()}/${n.repository.toLowerCase()}`}function ax(n){const l=new Map;for(const r of n){const o=Qo(r);if(!o)continue;const s=r.repository.toLowerCase(),c=l.get(s)??new Set;c.add(o),l.set(s,c)}return new Set([...l].filter(([,r])=>r.size>1).map(([r])=>r))}function ym(n,l){return l.has(n.repository.toLowerCase())?`${n.owner}/${n.repository}`:n.repository}function ox(n,{related:l=!1}={}){const r=ax(n);let o=null;return n.map(s=>{if(s.provider!=="github"&&!s.owner)return s.label??s.text;const c=Qo(s),f=ym(s,r);if(s.type==="repository")return f;if(l){const d=c===o?`#${s.number}`:`${f} #${s.number}`;return o=c,d}return s.type==="pull"?`${f} PR #${s.number}`:s.type==="issue"?`${f} Issue #${s.number}`:`${f} #${s.number}`})}function NN(n,l){const r=String(n.number??""),o=String(l.number??"");return r.length-o.length||r.localeCompare(o)}function MN(n){const l=new Map,r=new Set,o=new Set,s=new Set;for(const f of n??[]){const d=Qo(f),p=f.number?`${d}#${f.number}`:null;if(f.type==="repository"||!d||r.has(f.label)||s.has(f.url)||p&&o.has(p))continue;r.add(f.label),s.add(f.url),p&&o.add(p);const h=l.get(d)??[];h.push(f),l.set(d,h)}const c=ax(n??[]);return[...l.values()].map(f=>[...f].sort(NN)).sort((f,d)=>{const p=ym(f[0],c),h=ym(d[0],c);return p.localeCompare(h,void 0,{sensitivity:"base"})||Qo(f[0]).localeCompare(Qo(d[0]))})}function rx(n){const l=Qo(n);return l?n.type==="repository"?l:n.type==="pull"?`${l} PR #${n.number}`:n.type==="issue"?`${l} Issue #${n.number}`:`${l} #${n.number}`:n.label??n.text}function ix(n,l){return`${n.toLowerCase()}/${l.toLowerCase()}`}function sx(n){return n!=="."&&n!==".."}function cx(n){if(typeof n!="string")return null;let l=n.trim();const r=l.match(/^https?:\/\/(?:www\.)?github\.com\/([^/?#]+)\/([^/?#]+?)(?:\.git)?\/?$/i);if(r&&(l=`${r[1]}/${r[2]}`),!EN.test(l))return null;const[o,s]=l.split("/");return sx(s)?ix(o,s):null}function jN(n){var s;const l=String(n??""),r=ux(l),o=[];for(const c of l.matchAll(AN)){const f=c.index,d=f>0?l[f-1]:"";let p=null;const h=r.find(C=>f>=C.start&&f<C.end);if(h){const C=!!(c[1]||c[9]);let A=null;try{A=new URL(h.text).hostname.toLowerCase()}catch{}if(!(C&&f===h.start&&(A==="github.com"||A==="www.github.com"))||!fx(h.text))continue;p={end:h.end,suffix:h.text.slice(c[0].length),text:h.text}}if(c[8]&&/[\w&#/]/.test(d)||(c[5]||c[1]||c[9])&&/[\w/]/.test(d))continue;let b=c[1]??c[5]??c[9]??null,y=c[2]??c[6]??c[10]??null;c[9]&&(y=y.replace(/\.git$/i,""));const v=c[4]??c[7]??c[8]??null,w=(s=c[3])==null?void 0:s.toLowerCase(),R=c[9]?"repository":w==="pull"?"pull":w==="issues"?"issue":"generic",T=!!(b&&y);if(T){if(!sx(y))continue;[b,y]=ix(b,y).split("/")}o.push({end:(p==null?void 0:p.end)??f+c[0].length,explicit:T,number:v,owner:b,repository:y,start:f,text:(p==null?void 0:p.text)??c[0],type:R,urlSuffix:(p==null?void 0:p.suffix)??""})}return o}function ON(n){const l=new Set(n.filter(({explicit:r})=>r).map(({owner:r,repository:o})=>`${r}/${o}`));return l.size===1?[...l][0]:null}function zN(n){const l=new Set((n??[]).map(cx).filter(Boolean));return l.size===1?[...l][0]:null}function DN(n,l){const r=n.explicit?`${n.owner}/${n.repository}`:l;if(!r)return null;const[o,s]=r.split("/");if(n.type==="repository")return{kind:"link",label:`${o}/${s}`,number:null,owner:o,provider:"github",repository:s,text:n.text,type:n.type,url:`https://github.com/${o}/${s}${n.urlSuffix}`};const c=n.type==="pull"?"pull":"issues";return{kind:"link",label:`${o}/${s}#${n.number}`,number:n.number,owner:o,provider:"github",repository:s,text:n.text,type:n.type,url:`https://github.com/${o}/${s}/${c}/${n.number}${n.urlSuffix}`}}function $N(n){let l=n,r;do{r=l,l=l.replace(/[.,;:!?]+$/u,"");for(const[o,s]of[["(",")"],["[","]"],["{","}"]])for(;l.endsWith(s);){const c=[...l].filter(d=>d===o).length;if([...l].filter(d=>d===s).length<=c)break;l=l.slice(0,-1)}}while(l!==r);return l}function ux(n){const l=[];for(const r of String(n??"").matchAll(_N)){const o=$N(r[0]);o&&l.push({end:r.index+o.length,start:r.index,text:o})}return l}function LN(n){const l=n.slice(n.indexOf("//")+2).split(/[?#]/u,1)[0],r=l.indexOf("/");return r<0?!1:l.slice(r).split("/").some(o=>{try{const s=decodeURIComponent(o);return s==="."||s===".."}catch{return!0}})}function fx(n){try{const l=new URL(n);return!l.hostname||l.username||l.password||n.includes("\\")||LN(n)?null:l.href}catch{return null}}function kN(n){const l=[];for(const r of ux(n)){const o=fx(r.text);o&&l.push({end:r.end,kind:"link",label:r.text,provider:"web",start:r.start,text:r.text,type:"url",url:o})}return l}function BN(n,{projectRepositories:l=[],taskRepository:r=null}={}){const o=String(n??""),s=jN(o),f=ON(s)??cx(r)??zN(l),d=[];let p=0;for(const h of s){h.start>p&&d.push({kind:"text",text:o.slice(p,h.start)});const b=DN(h,f);b?d.push(b):d.push({kind:"ambiguous",reason:`GitHub reference ${h.text} is not linked because the repository is ambiguous.`,text:h.text}),p=h.end}return p<o.length&&d.push({kind:"text",text:o.slice(p)}),d}function HN(n,l={}){const r=String(n??""),o=BN(r,l),s=[];let c=0;for(const h of o){const b=r.indexOf(h.text,c);b<0||(h.kind!=="text"&&s.push({end:b+h.text.length,segment:h,start:b}),c=b+h.text.length)}const f=kN(r).filter(h=>!s.some(({end:b,start:y})=>h.start<b&&h.end>y));if(f.length===0)return o;s.push(...f.map(h=>({end:h.end,segment:h,start:h.start}))),s.sort((h,b)=>h.start-b.start);const d=[];let p=0;for(const h of s)h.start<p||(h.start>p&&d.push({kind:"text",text:r.slice(p,h.start)}),d.push(h.segment),p=h.end);return p<r.length&&d.push({kind:"text",text:r.slice(p)}),d}function dx({task:n}){const l=n.relatedGitHubLinks??[];if(l.length===0&&!n.relatedGitHubLinksTruncated)return null;const r=MN(l),o=ox(r.flat(),{related:!0});let s=0;return g.jsxs(ue,{"aria-label":`Related GitHub links for ${n.title}`,className:"taskchef-github-groups",component:"nav",children:[r.map(c=>g.jsx(St,{className:"taskchef-github-group",gap:5,wrap:"wrap",children:c.map(f=>{const d=o[s];s+=1;const p=f.type==="pull"?", GitHub pull request":f.type==="issue"?", GitHub issue":" on GitHub";return g.jsx(Lc,{"aria-label":`${rx(f)}${p} (opens in a new tab)`,className:"taskchef-github-link",href:f.url,rel:"noopener noreferrer",size:"xs",target:"_blank",children:d},f.url)})},`${c[0].owner}/${c[0].repository}`)),n.relatedGitHubLinksTruncated&&g.jsx(_e,{c:"dimmed",size:"xs",children:"More links in task history"})]})}function dc({task:n,text:l}){const r=HN(l,{projectRepositories:n.project.githubRepos,taskRepository:n.relatedGitHubRepository}),o=r.filter(f=>f.kind==="link"),s=ox(o);let c=0;return r.map((f,d)=>{if(f.kind==="text")return f.text;if(f.kind==="ambiguous")return g.jsx("span",{"aria-label":f.reason,className:"taskchef-github-reference-ambiguous",tabIndex:0,title:f.reason,children:f.text},`${d}:${f.text}`);const p=s[c];c+=1;const h=f.type==="pull"?", GitHub pull request":f.type==="issue"?", GitHub issue":f.owner?" on GitHub":"";return g.jsx(Lc,{"aria-label":`${rx(f)}${h} (opens in a new tab)`,className:"taskchef-github-link",href:f.url,rel:"noopener noreferrer",target:"_blank",children:p},`${d}:${f.url}`)})}function mx({loading:n,onClick:l,taskTitle:r}){return g.jsx(il,{"aria-label":`Open chat for ${r}`,leftSection:g.jsx(T_,{"aria-hidden":!0,size:15}),loading:n,onClick:l,size:"compact-sm",variant:"default",children:"Open chat"})}function ou({children:n,className:l="",...r}){return g.jsx("span",{className:`taskchef-shimmer ${l}`.trim(),"data-animation":"text-shimmer",...r,children:n})}const px=x.createContext(null);function UN({children:n,now:l}){return g.jsx(px,{value:l,children:n})}function mc({icon:n,label:l,value:r}){const[o,s]=x.useState(!1);x.useContext(px);const c=o?Hb(r):Lp(r),f=Hb(r),d=f==="—",p=f==="—"?"Updated time unavailable":o?"Show relative time":`Exact time: ${f}. Show exact time`;return g.jsx(Zn,{label:p,children:g.jsxs(kl,{"aria-label":d?`${l}: unavailable.`:`${l}: ${c}. ${o?"Show relative time":"Show exact time"}`,className:"taskchef-time",disabled:d,onClick:()=>s(h=>!h),children:[n??g.jsx(b_,{"aria-hidden":!0,size:12}),g.jsx("bdi",{className:"taskchef-time-label",children:c})]})})}function hx({children:n,variant:l}){return g.jsx(ue,{className:`taskchef-stats taskchef-${l}-stats`,component:"div",children:n})}function va({children:n,usageState:l}){return g.jsx(ue,{className:"taskchef-stat","data-usage-state":l,children:n})}function Ko({accessibleLabel:n,animated:l=!1,icon:r,title:o,value:s}){return g.jsx(Zn,{events:{focus:!0,hover:!0,touch:!1},label:o,multiline:!0,children:g.jsxs(_e,{"aria-label":n,className:"taskchef-stat-content",component:"span",size:"xs",tabIndex:0,children:[r,g.jsx("bdi",{children:l?g.jsx(ou,{children:s}):s})]})})}function YN({task:n}){const l=ex(n),r=SN(n);return g.jsxs(hx,{variant:"card",children:[g.jsx(va,{children:g.jsx(mc,{icon:g.jsx(VS,{"aria-hidden":!0,size:14}),label:`Updated time for ${n.title}`,value:n.meaningfulUpdatedAt??n.updatedAt})}),g.jsx(va,{children:g.jsx(Ko,{accessibleLabel:l.accessibleLabel,icon:g.jsx(GS,{"aria-hidden":!0,size:14}),title:l.title,value:l.value})}),g.jsxs(va,{usageState:r.kind,children:[g.jsx(Ko,{accessibleLabel:r.tokens.accessibleLabel,animated:r.tokens.animated,icon:g.jsx(XS,{"aria-hidden":!0,size:14}),title:r.tokens.title,value:r.tokens.value}),g.jsxs(_e,{className:"taskchef-visually-hidden",component:"span",role:"status",children:[r.tokens.accessibleLabel,"; ",r.cost.accessibleLabel]})]}),g.jsx(va,{usageState:r.kind,children:g.jsx(Ko,{accessibleLabel:r.cost.accessibleLabel,animated:r.cost.animated,icon:g.jsx(qS,{"aria-hidden":!0,size:14}),title:r.cost.title,value:r.cost.value})})]})}function qN({onOpenCodex:n,onOpenDetail:l,task:r}){const o=W_(r);return g.jsx(gn,{className:"taskchef-task-row",component:"article",p:"md",radius:"md",withBorder:!0,children:g.jsxs(Ut,{className:"taskchef-task-main",gap:"sm",children:[g.jsxs(ue,{children:[g.jsxs(ue,{className:"taskchef-card-heading",children:[g.jsx(Wt,{order:3,size:"h5",children:g.jsx("button",{className:"taskchef-title-button",onClick:()=>l(r),type:"button",children:r.title})}),g.jsxs(Ut,{align:"flex-end",className:"taskchef-card-metadata",gap:4,children:[g.jsx(au,{status:r.status}),g.jsx(mx,{onClick:()=>n(r),taskTitle:r.title})]})]}),g.jsx(_e,{c:"dimmed",mt:2,size:"xs",children:r.project.name})]}),g.jsxs(ue,{className:"taskchef-summary-grid",children:[g.jsx(_e,{c:"dimmed",className:"taskchef-field-label",size:"xs",children:"Request"}),g.jsx(_e,{className:"taskchef-preserve-lines",lineClamp:3,size:"sm",children:g.jsx(dc,{task:r,text:o.requestSummary})}),g.jsx(_e,{c:"dimmed",className:"taskchef-field-label",size:"xs",children:"Result"}),g.jsx(_e,{className:"taskchef-preserve-lines",lineClamp:3,size:"sm",children:o.resultStatus==="working"?g.jsx(ou,{children:o.resultSummary}):g.jsx(dc,{task:r,text:o.resultSummary})})]}),g.jsx(dx,{task:r}),g.jsx(YN,{task:r})]})})}function VN({highlightTurnRef:n,task:l}){const r=tN(l,[]);return r!=null&&r.length?g.jsx(Ut,{gap:"sm",children:[...r].reverse().map((o,s)=>{const c=eN(o),f=o.turnRef??o.turnId??`turn-${s}`,d=f===n,p=yN(l,o);return g.jsx(gn,{className:`taskchef-turn${d?" taskchef-turn-highlighted":""}`,"data-turn-ref":f,p:"sm",radius:"md",tabIndex:d?-1:void 0,withBorder:!0,children:g.jsxs(Ut,{gap:7,children:[g.jsxs(ue,{className:"taskchef-turn-heading",children:[g.jsx(_e,{c:"dimmed",size:"xs",children:c.sourceLabel}),g.jsx(au,{status:c.status})]}),g.jsxs(ue,{children:[g.jsx(_e,{c:"dimmed",className:"taskchef-field-label",size:"xs",children:"Request"}),g.jsx(_e,{className:"taskchef-preserve-lines",size:"sm",children:g.jsx(dc,{task:l,text:o.requestSummary??"Request not recorded."})})]}),g.jsxs(ue,{children:[g.jsx(_e,{c:"dimmed",className:"taskchef-field-label",size:"xs",children:"Result"}),g.jsx(_e,{className:"taskchef-preserve-lines",size:"sm",children:c.status==="working"?g.jsx(ou,{children:c.summary}):g.jsx(dc,{task:l,text:c.summary})})]}),g.jsxs(hx,{variant:"turn",children:[g.jsx(va,{children:g.jsx(mc,{icon:g.jsx(VS,{"aria-hidden":!0,size:14}),label:"Turn update time",value:c.updatedAt})}),g.jsx(va,{children:g.jsx(GN,{turn:o})}),g.jsx(va,{usageState:p.kind,children:g.jsx(Ko,{accessibleLabel:p.tokens.accessibleLabel,animated:p.animated,icon:g.jsx(XS,{"aria-hidden":!0,size:14}),title:p.title,value:p.tokens.value})}),g.jsx(va,{usageState:p.kind,children:g.jsx(Ko,{accessibleLabel:p.cost.accessibleLabel,animated:p.animated,icon:g.jsx(qS,{"aria-hidden":!0,size:14}),title:p.title,value:p.cost.value})})]}),p.note&&g.jsx(_e,{c:"dimmed",size:"xs",children:p.note})]})},f)})}):g.jsx(_e,{c:"dimmed",size:"sm",children:"No turn history has been recorded."})}function GN({turn:n}){const l=XN(n.result===null),r=vN(n,l);return g.jsx(Ko,{accessibleLabel:r.accessibleLabel,icon:g.jsx(GS,{"aria-hidden":!0,size:14}),title:r.title,value:r.value})}function XN(n){const[l,r]=x.useState(()=>Date.now());return x.useEffect(()=>{if(!n)return;r(Date.now());const o=window.setInterval(()=>r(Date.now()),1e3);return()=>window.clearInterval(o)},[n]),l}function IN({task:n}){const l=nx(n),r=ex(n),o=l.kind==="ready"?l:null,s=(o==null?void 0:o.usage.cachedInputTokens)??0,c=(o==null?void 0:o.usage.inputTokens)??0,f=o&&c+s>0?`${Math.round(s/(c+s)*100)}%`:"n/a",d=Object.keys((o==null?void 0:o.usage.models)??{}).join(", "),p=l.kind==="pending"?"Pending":l.kind==="calculating"?"Calculating":"n/a",h=l.kind==="unavailable"?"unavailable":p.toLowerCase(),b=[{accessibleValue:o?`${pi(o.usage.totalTokens)} tokens`:l.label,animated:l.kind==="pending"||l.kind==="calculating",label:o!=null&&o.knownSoFar?"Tokens · known so far":"Tokens",title:o?`${pi(o.usage.totalTokens)} tokens`:l.label,value:o?lu(o.usage.totalTokens):p},{accessibleValue:o?o.usage.estimatedCostUsd==null?"Estimated cost unavailable":`Estimated cost ${er(o.usage.estimatedCostUsd)}`:`Estimated cost ${h}${l.kind==="unavailable"?`: ${l.label}`:""}`,animated:l.kind==="pending"||l.kind==="calculating",label:"Estimated cost",title:(o==null?void 0:o.usage.estimatedCostUsd)==null?"Estimated cost unavailable":`Unrounded estimate: $${o.usage.estimatedCostUsd}`,value:o?o.usage.estimatedCostUsd==null?"n/a":er(o.usage.estimatedCostUsd):p},{accessibleValue:r.accessibleLabel,label:"Reported work",title:r.title,value:r.value},...o?[{accessibleValue:d||"Model unavailable",label:"Model",title:d||"Model unavailable",value:d||"n/a"},{accessibleValue:f==="n/a"?"Cache ratio unavailable":`Cache ratio ${f}`,label:"Cache ratio",title:f==="n/a"?"Cache ratio unavailable because no input-token total is available.":void 0,value:f}]:[]];return g.jsxs(ue,{"aria-live":"polite",children:[g.jsx(ue,{className:"taskchef-metrics",children:b.map(({accessibleValue:y,animated:v,label:w,title:R,value:T})=>g.jsxs(gn,{className:"taskchef-metric",p:"sm",radius:"md",withBorder:!0,children:[g.jsx(_e,{c:"dimmed",size:"xs",children:w}),g.jsx(_e,{"aria-label":y,className:"taskchef-metric-value",fw:650,size:"sm",title:R,children:v?g.jsx(ou,{children:T}):T})]},w))}),l.kind==="unavailable"&&l.label!=="Token usage unavailable"&&g.jsx(_e,{c:"dimmed",mt:"xs",size:"xs",children:l.label})]})}function ZN({busy:n,error:l,highlightTurnRef:r,onClose:o,onCopy:s,onOpenCodex:c,onTransition:f,opened:d,task:p,notifications:h,notice:b}){var C;const y=Rm("(max-width: 48em)"),[v,w]=x.useState(null);if(x.useEffect(()=>{d||w(null)},[d]),x.useEffect(()=>{d&&r&&requestAnimationFrame(()=>{var A;(A=document.querySelector(`[data-turn-ref="${CSS.escape(r)}"]`))==null||A.focus()})},[r,d,(C=p==null?void 0:p.turns)==null?void 0:C.length,p==null?void 0:p.updatedAt]),x.useEffect(()=>{v&&(!p||!Yb(p).includes(v))&&w(null)},[v,p==null?void 0:p.status]),!p)return null;const R=Yb(p),T=g.jsxs(Ut,{gap:"lg",children:[h,g.jsxs(ue,{children:[g.jsxs(St,{align:"flex-start",gap:"sm",justify:"space-between",wrap:"nowrap",children:[g.jsxs(ue,{children:[g.jsx(_e,{c:"teal",fw:700,size:"xs",tt:"uppercase",children:p.project.name}),g.jsx(Wt,{id:"task-detail-title",order:2,size:"h3",tabIndex:-1,children:p.title})]}),g.jsx(au,{status:p.status})]}),g.jsxs(St,{gap:"xs",mt:"md",children:[g.jsx(mx,{loading:n,onClick:c,taskTitle:p.title}),g.jsxs(xt,{position:"bottom-start",shadow:"md",withinPortal:!0,zIndex:360,children:[g.jsx(xt.Target,{children:g.jsx(Zn,{label:"More task actions",children:g.jsx(ul,{"aria-label":"More task actions",disabled:n,variant:"default",children:g.jsx(w_,{"aria-hidden":!0,size:17})})})}),g.jsxs(xt.Dropdown,{children:[g.jsx(xt.Item,{leftSection:g.jsx(g_,{size:14}),onClick:s,children:"Copy Task ID"}),R.includes("completed")&&g.jsx(xt.Item,{leftSection:g.jsx(h_,{size:14}),onClick:()=>w("completed"),children:"Mark completed"}),R.includes("failed")&&g.jsx(xt.Item,{color:"red",leftSection:g.jsx(IS,{size:14}),onClick:()=>w("failed"),children:"Mark failed"})]})]})]}),g.jsx(ue,{mt:"sm",children:g.jsx(dx,{task:p})})]}),v&&g.jsx(QN,{busy:n,onCancel:()=>w(null),onTransition:f,status:v},v),b&&g.jsx(Mn,{color:"teal",role:"status",children:b}),l&&g.jsx(Mn,{color:"red",role:"alert",children:l}),g.jsxs("section",{"aria-labelledby":"usage-heading",children:[g.jsx(Wt,{id:"usage-heading",mb:"xs",order:3,size:"h5",children:"Usage"}),g.jsx(IN,{task:p})]}),g.jsx(Uc,{}),g.jsxs("section",{"aria-labelledby":"activity-heading",children:[g.jsx(Wt,{id:"activity-heading",mb:"sm",order:3,size:"h5",children:"Activity timeline"}),g.jsx(VN,{highlightTurnRef:r,task:p})]}),g.jsxs("section",{"aria-labelledby":"instruction-heading",children:[g.jsx(Wt,{id:"instruction-heading",mb:"xs",order:3,size:"h5",children:"Original instruction"}),g.jsx(ue,{className:"taskchef-code-panel",component:"pre",children:p.instruction})]}),g.jsxs("section",{"aria-labelledby":"metadata-heading",children:[g.jsx(Wt,{id:"metadata-heading",mb:"xs",order:3,size:"h5",children:"Metadata"}),g.jsxs("dl",{className:"taskchef-metadata",children:[g.jsx("dt",{children:"Task ID"}),g.jsx("dd",{children:p.id}),g.jsx("dt",{children:"Thread ID"}),g.jsx("dd",{children:p.threadId??"—"}),g.jsx("dt",{children:"Current turn ref"}),g.jsx("dd",{children:p.turnRef??"—"}),g.jsx("dt",{children:"Project path"}),g.jsx("dd",{children:p.project.path}),g.jsx("dt",{children:"Created"}),g.jsx("dd",{children:g.jsx(mc,{label:"Created time",value:p.createdAt})}),g.jsx("dt",{children:"Updated"}),g.jsx("dd",{children:g.jsx(mc,{label:"Updated time",value:p.meaningfulUpdatedAt??p.updatedAt})}),g.jsx("dt",{children:"Updated by"}),g.jsx("dd",{children:p.updatedBy??"—"})]})]})]});return y?g.jsx(Gn,{closeOnClickOutside:!n,closeOnEscape:!n,onClose:o,opened:d,overlayProps:{backgroundOpacity:.55,blur:2},position:"bottom",scrollAreaComponent:Un.Autosize,size:"92%",title:g.jsx("span",{className:"taskchef-visually-hidden",children:"Task details"}),trapFocus:!0,zIndex:300,children:T}):g.jsx(In,{"aria-labelledby":"task-detail-title",closeOnClickOutside:!n,closeOnEscape:!n,onClose:o,opened:d,overlayProps:{backgroundOpacity:.55,blur:2},scrollAreaComponent:Un.Autosize,size:"min(820px, calc(100vw - 32px))",title:g.jsx("span",{className:"taskchef-visually-hidden",children:"Task details"}),trapFocus:!0,zIndex:300,children:T})}function Yb(n){return n.status==="completed"?["failed"]:n.status==="failed"?["completed"]:n.status==="working"||n.status==="needs_input"?["completed","failed"]:[]}function QN({busy:n,onCancel:l,onTransition:r,status:o}){const s=x.useRef(crypto.randomUUID());return g.jsxs(Mn,{color:o==="failed"?"red":"teal",role:"alert",title:`Mark task ${o}?`,children:[g.jsx(_e,{mb:"sm",size:"sm",children:"This interrupts active work and appends an audited manual dashboard turn."}),g.jsxs(St,{gap:"xs",children:[g.jsx(il,{color:o==="failed"?"red":"teal",loading:n,onClick:async()=>{const c=await r(o,s.current);c.ok?(l(),requestAnimationFrame(()=>{var f;return(f=document.getElementById("task-detail-title"))==null?void 0:f.focus()})):c.rotateActionId&&(s.current=crypto.randomUUID())},size:"compact-sm",children:"Confirm"}),g.jsx(il,{disabled:n,onClick:l,size:"compact-sm",variant:"default",children:"Cancel"})]})]})}const KN={primaryColor:"teal",colors:{teal:["#e6fcf5","#c3fae8","#96f2d7","#63e6be","#38d9a9","#20c997","#087f5b","#067052","#055e46","#044d39"]},defaultRadius:"md",fontFamily:"Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif",headings:{fontFamily:"inherit",fontWeight:"680"},components:{Button:{defaultProps:{radius:"md"}},Paper:{defaultProps:{radius:"md"}}}};var Vb;const qb=(Vb=document.querySelector('meta[name="taskchef-style-nonce"]'))==null?void 0:Vb.content;function FN({totalCount:n,visibleCount:l}){return g.jsxs(_e,{"aria-live":"polite",className:"taskchef-results-summary",id:"task-results-summary",children:["Tasks: ",l," of ",n]})}function JN({connect:n=!0,initialFilters:l={},initialTasks:r=[]}){const[o,s]=x.useState(()=>window.location.hash==="#settings");x.useEffect(()=>{const me=()=>s(window.location.hash==="#settings");return window.addEventListener("hashchange",me),()=>window.removeEventListener("hashchange",me)},[]);const[c,f]=x.useState(r),[d,p]=x.useState(),[h,b]=x.useState(!1),[y,v]=x.useState(null),[w,R]=x.useState(null),[T,C]=x.useState(l.project??""),[A,N]=x.useState(l.status??""),[_,j]=x.useState(l.date??"all"),[$,L]=x.useState(()=>Date.now()),[D,H]=x.useState(null),[W,le]=x.useState(!1),[ae,te]=x.useState(!1),[J,V]=x.useState(null),[ce,O]=x.useState(null),[B,U]=x.useState(null),[Q,P]=x.useState({initialized:r.length>0,announcements:[],notifications:[],seenIds:new Set,signatures:new Map}),M=(D==null?void 0:D.id)??null,Y=x.useRef(M);Y.current=M;const F=x.useRef(0),re=x.useRef(null),ie=x.useRef(Fs(null)),fe=x.useCallback(me=>{f(me.tasks),p(me.projectIndex),P(qe=>{const ze=fN(qe,me.tasks);return{initialized:!0,announcements:ze.additions,notifications:ze.notifications,seenIds:ze.seenIds,signatures:ze.signatures}}),v(me.healthy===!1?"The task log is temporarily unavailable. Showing the last valid snapshot.":null);const Me=Y.current;if(Me){const qe=me.tasks.find(ze=>ze.id===Me);qe&&H(ze=>ze?kb(ze,qe):qe)}},[]);x.useEffect(()=>{const me=window.setInterval(()=>L(Date.now()),3e4);return()=>window.clearInterval(me)},[]),x.useEffect(()=>{if(!n)return;U_().then(R).catch(()=>R(null));const me=H_({onConnection:b,onError:v,onSnapshot:fe});return()=>me.close()},[fe,n]);const ge=x.useCallback(async(me,Me=null)=>{const qe=++F.current;re.current=me.updatedAt,ie.current=Fs(me),H(ze=>(ze==null?void 0:ze.id)===me.id?kb(ze,me):me),le(!0),U(Me),V(null),O(null);try{for(let ze=0;ze<=40;ze+=1){if(qe!==F.current)return;const Je=await q_(me.id);if(qe!==F.current||(re.current=Je.updatedAt,ie.current=Fs(Je),H(Je),!bN(Je)||ze===40))return;await new Promise(ct=>window.setTimeout(ct,1500))}}catch{qe===F.current&&V("Task activity is temporarily unavailable. Showing the latest list snapshot.")}},[]),de=c.find(me=>me.id===M)??null,he=Fs(de);x.useEffect(()=>{!W||!M||!n||de&&(de.updatedAt===re.current&&he===ie.current||ge(de,B))},[de==null?void 0:de.updatedAt,he]);const Oe=x.useMemo(()=>[{label:"All projects",value:""},...[...new Set(c.map(me=>me.project.name))].sort().map(me=>({label:me,value:me}))],[c]),be=x.useMemo(()=>KS(c,{project:T,status:A,date:_,now:$}),[c,T,A,_,$]),Ce=x.useMemo(()=>lN(c,{project:T,date:_,now:$}),[c,T,_,$]),Se=ZS.map(({label:me,value:Me})=>({label:Ce[Me]>0?`${me} ${Ce[Me]}`:me,value:Me}));async function Ne(me){te(!0);try{const Me=await V_(me.id);Me&&v(Me)}catch{v("Codex could not be opened. Open the project and select the recorded task instead.")}finally{te(!1)}}async function st(me,Me){if(!D)return{ok:!1};const qe=D,ze=J_(qe);te(!0),V(null);const Je=await G_(qe,me,Me);return te(!1),Je.task&&(H(ct=>Db({requestTask:qe,expected:ze,responseTask:Je.task,selectedTask:ct})),f(ct=>ct.map(jt=>jt.id===qe.id?Db({requestTask:qe,expected:ze,responseTask:Je.task,selectedTask:jt}):jt))),Je.ok&&Je.task?(U(Je.task.turnRef??Je.task.turnId),{ok:!0}):(V(Je.message??"Task state could not be changed."),{ok:!1,rotateActionId:Je.code==="stale_task"})}function at(me){const Me=c.find(ze=>ze.id===me.taskId),qe=dN({detailTaskId:M,detailOpened:W,highlightTurnRef:B,notifications:Q.notifications,refreshGeneration:F.current},me,!!Me);if(P(ze=>({...ze,notifications:qe.notifications})),!Me){v("This task is no longer present in the current snapshot.");return}ge(Me,qe.highlightTurnRef)}return g.jsx(c0,{defaultColorScheme:"auto",getStyleNonce:qb?()=>qb:void 0,theme:KN,children:g.jsxs(UN,{now:$,children:[g.jsxs(Yn,{className:"taskchef-shell",padding:0,children:[g.jsx(mi,{className:"taskchef-header",component:"header",size:1080,children:g.jsxs(St,{className:"taskchef-header-layout",align:"stretch",justify:"space-between",wrap:"nowrap",children:[g.jsxs(ue,{className:"taskchef-header-copy",children:[g.jsxs(_e,{c:"var(--taskchef-accent)",fw:750,size:"xs",tt:"uppercase",children:["TaskChef ",w&&g.jsxs("span",{className:"taskchef-version",children:["v",w]})]}),g.jsxs(St,{gap:"sm",mt:5,wrap:"nowrap",children:[g.jsx(WN,{}),g.jsx(Wt,{order:1,size:"h2",children:"Dashboard"})]})]}),g.jsxs(Ut,{align:"flex-end",className:"taskchef-header-actions",gap:0,justify:"space-between",children:[g.jsxs(St,{"aria-live":"polite",className:"taskchef-connection",gap:7,role:"status",wrap:"nowrap",children:[g.jsx(B_,{"aria-hidden":!0,color:h?"var(--mantine-color-teal-6)":"var(--mantine-color-yellow-6)",size:9}),g.jsx(_e,{c:"dimmed",size:"xs",children:h?"Live":n?"Connecting…":"Fixture preview"})]}),g.jsxs(St,{className:"taskchef-header-icon-row",gap:2,justify:"flex-end",wrap:"nowrap",children:[g.jsx(Zn,{label:"Settings",children:g.jsx(ul,{className:"taskchef-icon-button",component:"a",href:"#settings","aria-label":"Settings","aria-current":o?"page":void 0,variant:"subtle",color:"gray",size:"lg",children:g.jsx(O_,{size:18,stroke:1.8})})}),g.jsx(PN,{})]})]})]})}),g.jsx(Yn.Main,{children:g.jsxs(mi,{className:"taskchef-main",pb:80,size:1080,children:[(d==null?void 0:d.status)==="unavailable"&&g.jsx(Mn,{color:"yellow",icon:g.jsx(Zd,{size:18}),mb:"md",title:"Project index unavailable",children:"Task history is still visible. Verify the index and inspect backups before making project changes."}),(d==null?void 0:d.status)==="available"&&d.missingProjects.length>0&&g.jsx(Mn,{color:"yellow",icon:g.jsx(Zd,{size:18}),mb:"md",title:"Historical projects are missing from the current index",children:d.missingProjects.map(me=>g.jsxs(_e,{size:"sm",children:[me.snapshotNames.join(", "),": ",me.taskCount," task(s). Run ",g.jsx("code",{children:"taskchef backup list --json"})," and preview any restore; the dashboard never restores automatically."]},me.path))}),o?g.jsxs(Ut,{gap:"md",children:[g.jsx(il,{component:"a",href:"#",variant:"subtle",size:"sm",leftSection:g.jsx(f_,{size:16}),style:{alignSelf:"flex-start"},children:"Back to tasks"}),g.jsx(X_,{})]}):g.jsxs(g.Fragment,{children:[g.jsx(gn,{className:"taskchef-toolbar",p:"sm",radius:"md",withBorder:!0,children:g.jsxs(Ut,{gap:"sm",children:[g.jsxs(St,{align:"end",gap:"sm",children:[g.jsx(Wo,{"aria-label":"Project",data:Oe,label:"Project",onChange:me=>C(me??""),size:"sm",value:T}),g.jsx(Wo,{"aria-label":"Updated",data:[{label:"Latest 24 hours",value:"24h"},{label:"Latest 7 days",value:"7d"},{label:"All time",value:"all"}],label:"Updated",onChange:me=>j(me??"all"),size:"sm",value:_})]}),g.jsxs(ue,{children:[g.jsx(_e,{className:"taskchef-filter-label",mb:5,children:"Status"}),g.jsx(tu,{"aria-label":"Status",data:Se,fullWidth:!0,onChange:N,size:"xs",value:A})]})]})}),g.jsx(FN,{totalCount:c.length,visibleCount:be.length}),y&&g.jsx(Mn,{color:"yellow",icon:g.jsx(Zd,{"aria-hidden":!0,size:17}),mt:"md",role:"status",children:g.jsxs(St,{gap:"sm",justify:"space-between",wrap:"nowrap",children:[g.jsx(_e,{size:"sm",children:y}),g.jsx(Ja,{"aria-label":"Dismiss dashboard message",onClick:()=>v(null),size:"sm"})]})}),g.jsxs(Ut,{"aria-describedby":"task-results-summary","aria-label":"Tasks",component:"section",gap:"sm",mt:"xs",children:[be.map(me=>g.jsx(qN,{onOpenCodex:Ne,onOpenDetail:Me=>void ge(Me),task:me},me.id)),be.length===0&&g.jsxs(gn,{className:"taskchef-empty",p:48,ta:"center",withBorder:!0,children:[g.jsx(Wt,{order:2,size:"h4",children:"No tasks match these filters"}),g.jsx(_e,{c:"dimmed",mt:4,size:"sm",children:"Choose a different project, date, or status."})]})]})]})]})})]}),g.jsx(ZN,{busy:ae,error:J,highlightTurnRef:B,onClose:()=>{ae||(F.current+=1,le(!1),U(null))},onCopy:()=>{D&&(O(null),navigator.clipboard.writeText(D.id).then(()=>O("Task ID copied."),()=>O("Clipboard access is unavailable. Copy the Task ID from metadata.")))},onOpenCodex:()=>D&&void Ne(D),onTransition:st,opened:W,task:D,notice:ce,notifications:W?g.jsx(Ub,{announcements:Q.announcements,notifications:Q.notifications,onClear:()=>P(me=>({...me,notifications:Lb({detailTaskId:M,detailOpened:W,highlightTurnRef:B,notifications:me.notifications,refreshGeneration:F.current}).notifications})),onDismiss:me=>P(Me=>({...Me,notifications:$b(Me.notifications,me.id)})),onOpen:at,tasks:c,withinPortal:!1}):null}),!W&&g.jsx(Ub,{announcements:Q.announcements,notifications:Q.notifications,onClear:()=>P(me=>({...me,notifications:Lb({detailTaskId:M,detailOpened:W,highlightTurnRef:B,notifications:me.notifications,refreshGeneration:F.current}).notifications})),onDismiss:me=>P(Me=>({...Me,notifications:$b(Me.notifications,me.id)})),onOpen:at,tasks:c})]})})}function PN(){const{setColorScheme:n}=l0(),l=a0("light"),r=l==="dark"?"light":"dark";return g.jsx(Zn,{label:`Use ${r} theme`,children:g.jsx(ul,{"aria-label":`Use ${r} theme`,className:"taskchef-icon-button",color:"gray",onClick:()=>n(r),size:"lg",variant:"subtle",children:l==="dark"?g.jsx($_,{"aria-hidden":!0,size:18,stroke:1.8}):g.jsx(__,{"aria-hidden":!0,size:18,stroke:1.8})})})}function WN(){const n=a0("light");return g.jsx("img",{alt:"","aria-hidden":!0,className:"taskchef-brand-icon",height:"42",src:n==="dark"?"/assets/taskchef-dark.svg":"/assets/taskchef.svg",width:"42"})}B2.createRoot(document.getElementById("root")).render(g.jsx(x.StrictMode,{children:g.jsx(JN,{})}));
|
|
193
|
+
*/const k_=[["path",{d:"M7 3.34a10 10 0 1 1 -4.995 8.984l-.005 -.324l.005 -.324a10 10 0 0 1 4.995 -8.336z",key:"svg-0"}]],B_=Mt("filled","circle-filled","CircleFilled",k_);function H_({onConnection:n,onError:l,onSnapshot:r}){const o=new EventSource("/api/events");return o.addEventListener("open",()=>n(!0)),o.addEventListener("error",()=>n(!1)),o.addEventListener("snapshot",s=>{n(!0),r(JSON.parse(s.data))}),o.addEventListener("dashboard-error",s=>{const c=JSON.parse(s.data);l(c.message??"The task log is temporarily unavailable.")}),o}async function Ai(n,l){const r=await fetch(n,l),o=await r.json().catch(()=>({}));if(!r.ok)throw Object.assign(new Error(o.message??"Request failed."),{payload:o});return o}async function U_(){return(await Ai("/api/health")).taskchefVersion}async function Y_(n,l,r){return Ai(`/api/settings/${encodeURIComponent(n)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({schemaVersion:1,model:l,effort:r})})}async function q_(n){return(await Ai(`/api/tasks/${encodeURIComponent(n)}`)).task}async function V_(n){return(await Ai(`/api/tasks/${encodeURIComponent(n)}/open-codex`,{method:"POST"})).message??null}async function G_(n,l,r){const o=new AbortController,s=window.setTimeout(()=>o.abort(),1e4);try{return{ok:!0,task:(await Ai(`/api/tasks/${encodeURIComponent(n.id)}/manual-transition`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({schemaVersion:1,actionId:r,expected:{status:n.status,turnRef:n.turnRef,threadId:n.threadId,updatedAt:n.updatedAt},targetStatus:l}),signal:o.signal})).task}}catch(c){const f=c.payload;return{ok:!1,code:(f==null?void 0:f.code)??(o.signal.aborted?"request_timeout":"network_error"),message:(f==null?void 0:f.message)??(o.signal.aborted?"Task state change timed out. Try again.":"Task state changes are temporarily unavailable. Try again."),task:(f==null?void 0:f.task)??null}}finally{window.clearTimeout(s)}}function X_(){const[n,l]=x.useState([]),[r,o]=x.useState(null),[s,c]=x.useState(null),[f,d]=x.useState(!0),[p,h]=x.useState(null),[b,y]=x.useState(null),[v,w]=x.useState(0);x.useEffect(()=>{const C=new AbortController;return d(!0),c(null),fetch("/api/settings",{signal:C.signal}).then(async A=>{if(!A.ok)throw new Error("Settings preview could not be loaded.");const N=await A.json();l(N.profiles),o(N.usageProvider??null)}).catch(A=>{C.signal.aborted||c(A.message)}).finally(()=>{C.signal.aborted||d(!1)}),()=>C.abort()},[v]),x.useEffect(()=>{if(y(null),!p)return;const C=window.setTimeout(()=>y(p),400);return()=>window.clearTimeout(C)},[p]);const R=n.find(C=>C.id==="personal"),T=async(C,A,N)=>{h(C.role),c(null),l(_=>_.map(j=>j.id!=="personal"?j:{...j,roles:j.roles.map($=>$.role===C.role?{...$,model:A,effort:N}:$)}));try{const _=await Y_(C.role,A,N);l([_.profile])}catch(_){l(j=>j.map($=>$.id!=="personal"?$:{...$,roles:$.roles.map(L=>L.role===C.role?C:L)})),c(_ instanceof Error?_.message:"Model role could not be saved.")}finally{h(null)}};return g.jsxs(Ut,{gap:"md","aria-label":"Model settings",children:[g.jsxs(St,{justify:"space-between",children:[g.jsx(Wt,{order:2,size:"h3",children:"Model roles"}),g.jsx(ul,{"aria-label":"Refresh","aria-busy":f,"aria-disabled":f||p!==null,className:"taskchef-icon-button",color:"gray",variant:"subtle",size:"lg",onClick:()=>{f||p||(d(!0),w(C=>C+1))},children:g.jsx(M_,{className:f?"taskchef-refresh-spinning":void 0,size:18,stroke:1.8})})]}),g.jsx(_e,{c:"dimmed",size:"sm",children:"Your models for planning, implementation, and review."}),s&&g.jsx(Mn,{color:"red",role:"alert",children:s}),R&&g.jsxs(g.Fragment,{children:[R.problems.map(C=>g.jsx(Mn,{color:"yellow",children:C},C)),R.roles.map(C=>{var A,N;return g.jsx(gn,{withBorder:!0,p:"md",children:g.jsxs(Ut,{gap:"xs",children:[g.jsxs(St,{justify:"space-between",children:[g.jsx(Wt,{order:3,size:"h4",tt:"capitalize",children:C.role}),g.jsx(Jo,{color:["invalid","unavailable"].includes(C.status)?"red":C.status==="missing"?"gray":"teal",children:C.status})]}),g.jsxs($p,{cols:{base:1,sm:2},children:[g.jsx(Wo,{label:"Model","aria-label":`${C.role} model`,"aria-busy":f||p!==null,data:R.modelOptions??[],value:typeof C.model=="string"?C.model:null,readOnly:f||p!==null,allowDeselect:!1,searchable:!0,onChange:_=>{var L;if(f||p||!_)return;const j=(L=R.modelOptions)==null?void 0:L.find(D=>D.value===_),$=typeof C.effort=="string"&&(j!=null&&j.efforts.includes(C.effort))?C.effort:j==null?void 0:j.efforts[0];$&&T(C,_,$)}}),g.jsx(Wo,{label:"Reasoning effort","aria-label":`${C.role} reasoning effort`,"aria-busy":f||p!==null,data:(((N=(A=R.modelOptions)==null?void 0:A.find(_=>_.value===C.model))==null?void 0:N.efforts)??[]).map(_=>({value:_,label:_})),value:typeof C.effort=="string"?C.effort:null,disabled:typeof C.model!="string",readOnly:f||p!==null,allowDeselect:!1,onChange:_=>{!f&&!p&&_&&typeof C.model=="string"&&T(C,C.model,_)}})]}),g.jsxs(_e,{size:"sm",style:{overflowWrap:"anywhere"},children:["Source: ",C.displaySource??C.source??"No role file"]}),b===C.role&&g.jsx(_e,{c:"dimmed",size:"sm",role:"status",children:"Saving…"}),C.problems.map(_=>g.jsx(Mn,{color:"red",children:_},_))]})},C.role)})]}),r&&g.jsx(gn,{withBorder:!0,p:"md",children:g.jsxs(Ut,{gap:"xs",children:[g.jsxs(St,{justify:"space-between",children:[g.jsx(Wt,{order:3,size:"h4",children:"Usage provider"}),g.jsx(Jo,{color:r.status==="available"?"teal":"red",children:r.status})]}),g.jsxs(_e,{children:[r.provider,r.version?` ${r.version}`:" version unavailable"]}),g.jsx(_e,{c:"dimmed",size:"sm",children:"Version reported by the executable TaskChef uses for token and cost estimates."})]})})]})}const I_=50,Z_="Turn interrupted before a terminal report.",ZS=[{value:"",label:"All"},{value:"working",label:"Working"},{value:"needs input",label:"Needs input"},{value:"completed",label:"Completed"},{value:"failed",label:"Failed"}],Q_=new Map([["created","Task created"],["task_started","Task started"],["follow_up_started","Follow-up started"],["completed","Task completed"],["needs_input","Task needs input"],["failed","Task failed"],["manual_completed","Task manually completed"],["manual_failed","Task manually failed"],["archive_succeeded","Chat archived"],["archive_failed","Chat archive failed"],["unresolved","Task updated"]]),K_=new Map([["24h",1440*60*1e3],["7d",10080*60*1e3],["all",null]]);function F_(n){return Date.parse(n.meaningfulUpdatedAt??n.updatedAt??n.createdAt)}function QS(n){return n.status===null?"unresolved":n.status.replaceAll("_"," ")}function J_(n){return{status:n.status,turnRef:n.turnRef,threadId:n.threadId,updatedAt:n.updatedAt}}function P_(n,l){return!!l&&n.status===l.status&&n.turnRef===l.turnRef&&n.threadId===l.threadId&&n.updatedAt===l.updatedAt}function Db({requestTask:n,expected:l,responseTask:r,selectedTask:o}){const s=(o==null?void 0:o.id)===n.id?o:n;return P_(s,l)?r??s:s}function W_(n){var s;const l=n.latestTurn??null,r=(l==null?void 0:l.result)??null,o=(l==null?void 0:l.requestSummary)??(l?"Request not recorded by this TaskChef version.":n.title);return{turnRef:(l==null?void 0:l.turnRef)??(l==null?void 0:l.turnId)??n.turnRef??n.turnId??null,turnId:(l==null?void 0:l.turnId)??n.turnId??null,startedAt:(l==null?void 0:l.startedAt)??n.updatedAt??n.createdAt??null,requestSummary:o,resultStatus:(r==null?void 0:r.status)??(n.status==="working"?"working":n.status),resultSummary:(r==null?void 0:r.summary)??(n.status==="working"?"In progress":((s=n.lastResult)==null?void 0:s.summary)??n.summary??"No result reported."),resultUpdatedAt:(r==null?void 0:r.updatedAt)??null}}function eN(n){var r;const l=n.result??null;return{status:(l==null?void 0:l.status)??"working",summary:(l==null?void 0:l.summary)??"In progress",updatedAt:(l==null?void 0:l.updatedAt)??n.startedAt,...((r=n.provenance)==null?void 0:r.kind)==="dashboard_manual"?{sourceLabel:"Manual dashboard change"}:{}}}function tN(n,l=[]){if(Array.isArray(n.turns))return n.turns;if(!n.latestTurn)return l;const r=[...l],o=r.length-1,s=n.latestTurn.turnRef??n.latestTurn.turnId,c=o>=0?r[o].turnRef??r[o].turnId:null,f=o>=0&&c===null&&s!==null&&r[o].turnId==null&&n.latestTurn.turnId==null&&JSON.stringify({...r[o],turnRef:null})===JSON.stringify({...n.latestTurn,turnRef:null});return o>=0&&(c===s||f)?r[o]=n.latestTurn:(n.schemaVersion>=8&&o>=0&&r[o].result===null&&(r[o]={...r[o],result:{status:"interrupted",summary:Z_,updatedAt:n.latestTurn.startedAt}}),r.push(n.latestTurn)),r}function nu(n){return Q_.get(n.event)??"Task updated"}function nN(n,l,r=Date.now()){const o=K_.get(l);if(o===null)return!0;if(o===void 0)return!1;const s=F_(n);return Number.isFinite(s)&&s>=r-o}function KS(n,{project:l="",status:r="",date:o="all",now:s=Date.now()}={}){return n.filter(c=>(!l||c.project.name===l)&&(!r||QS(c)===r)&&nN(c,o,s))}function lN(n,{project:l="",date:r="all",now:o=Date.now()}={}){const s=KS(n,{project:l,date:r,now:o});return Object.fromEntries(ZS.map(({value:c})=>[c,c?s.filter(f=>QS(f)===c).length:s.length]))}function aN(n){return JSON.stringify([n.id,n.turnRef??n.turnId??null,n.turnId??null,n.status??"unresolved"])}function oN(n,l){try{const r=JSON.parse(n),o=JSON.parse(l);return Array.isArray(r)&&Array.isArray(o)&&r.length===o.length&&r[1]===null&&o[1]!==null&&r[2]===null&&o[2]===null&&r[3]!=="working"&&r.every((s,c)=>c===1||s===o[c])}catch{return!1}}function rN(n){var l,r;return n.status==="working"?n.lastResult?"follow_up_started":"task_started":((r=(l=n.latestTurn)==null?void 0:l.provenance)==null?void 0:r.kind)==="dashboard_manual"?`manual_${n.status}`:n.status??"unresolved"}function FS(n,l){return JSON.stringify(l==="created"?[n.id,null,l,n.createdAt??null]:[n.id,n.turnRef??n.turnId??null,l])}function iN(n,l){var r,o,s;return l==="created"?n.createdAt??n.updatedAt??null:((r=n.lastResult)==null?void 0:r.status)===n.status&&(((o=n.lastResult)==null?void 0:o.turnRef)??((s=n.lastResult)==null?void 0:s.turnId))===(n.turnRef??n.turnId)?n.lastResult.updatedAt:n.updatedAt??n.createdAt??null}function sN(n,l){var r,o,s;return["completed","needs_input","failed","manual_completed","manual_failed"].includes(l)?((r=n.lastResult)==null?void 0:r.status)===n.status&&(((o=n.lastResult)==null?void 0:o.turnRef)??((s=n.lastResult)==null?void 0:s.turnId))===(n.turnRef??n.turnId)?n.lastResult.summary:n.summary??null:null}function qo(n,l=rN(n)){const r=l==="created";return Object.freeze({id:FS(n,l),taskId:n.id,title:n.title,status:r?"working":n.status,event:l,turnRef:r?null:n.turnRef??n.turnId??null,turnId:r?null:n.turnId??null,timestamp:iN(n,l),summary:sN(n,l)})}function Ks(n){var o;const l=n.lastResult;if(!l)return null;const r=((o=l.provenance)==null?void 0:o.kind)==="dashboard_manual"?`manual_${l.status}`:l.status;return Object.freeze({id:FS({...n,turnRef:l.turnRef??l.turnId,turnId:l.turnId},r),taskId:n.id,title:n.title,status:l.status,event:r,turnRef:l.turnRef??l.turnId??null,turnId:l.turnId??null,timestamp:l.updatedAt,summary:l.summary})}function cN(n,l){return`${l?"Open current task details":"Show task availability"} for ${n.title}: ${nu(n)}`}function uN(n){return`Dismiss ${nu(n)} notification for ${n.title}`}function $b(n,l){return n.filter(({id:r})=>r!==l)}function fN({initialized:n,notifications:l,seenIds:r=new Set,signatures:o},s){const c=new Map(o);for(const p of s)c.set(p.id,aN(p));const f=new Set(r);if(!n){for(const p of s){f.add(qo(p,"created").id);const h=Ks(p);h&&f.add(h.id),f.add(qo(p).id)}return{additions:[],notifications:l,seenIds:f,signatures:c}}const d=[];for(const p of s){const h=[];if(o.has(p.id)){if(o.get(p.id)!==c.get(p.id)&&!oN(o.get(p.id),c.get(p.id))){h.push(qo(p));const y=Ks(p);y&&h.push(y)}}else{const y=Ks(p);(p.turnRef||p.turnId||p.status!=="working"||y)&&(h.push(qo(p)),y&&h.push(y)),h.push(qo(p,"created"))}for(const y of h)f.has(y.id)||d.push(y),f.add(y.id);const b=Ks(p);b&&f.add(b.id),f.add(qo(p).id)}return{additions:d,notifications:[...d,...l].slice(0,I_),seenIds:f,signatures:c}}function dN(n,l,r){const o=n.notifications.filter(({id:s})=>s!==l.id);return r?{...n,detailTaskId:l.taskId,detailOpened:!0,highlightTurnRef:l.turnRef??l.turnId,notifications:o,refreshGeneration:n.refreshGeneration+1}:{...n,notifications:o}}function Lb(n){return{...n,notifications:[]}}function kb(n,l){const r=Array.isArray(n.turns)&&Array.isArray(n.results),o=!Array.isArray(l.turns)&&!Array.isArray(l.results);return{...n,...l,...r&&o?{results:n.results,turns:n.turns,usage:n.usage}:{}}}function Fs(n){var l,r,o,s,c,f,d;return JSON.stringify([((l=n==null?void 0:n.usage)==null?void 0:l.generationTurnRef)??null,((r=n==null?void 0:n.usage)==null?void 0:r.status)??null,((o=n==null?void 0:n.usage)==null?void 0:o.updatedAt)??null,((c=(s=n==null?void 0:n.usage)==null?void 0:s.task)==null?void 0:c.totalTokens)??null,((d=(f=n==null?void 0:n.usage)==null?void 0:f.task)==null?void 0:d.estimatedCostUsd)??null])}const mN=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.(\d{1,3}))?(Z|[+-]\d{2}:\d{2})$/;function JS(n,l){const r=Bb(n),o=Bb(l);if(r===null||o===null)return null;const s=o-r;return s>=0?s:null}function PS(n){var r;const l=JS(n.startedAt,(r=n.result)==null?void 0:r.updatedAt);return l===0?null:l}function pN(n){const l=n.filter(s=>s.result!==null),r=l.map(PS).filter(s=>s!==null),o=r.length===0?l.length===0?0:null:r.reduce((s,c)=>s+c,0);return Object.freeze({terminalTurns:l.length,validTurns:r.length,totalMilliseconds:o===null||Number.isSafeInteger(o)?o:null})}function Bb(n){if(typeof n!="string")return null;const l=n.match(mN);if(!l)return null;const[,r,o,s,c,f,d,,p]=l,h=Number(r),b=Number(o),y=Number(s),v=Number(c),w=Number(f),R=Number(d),T=p==="Z"?0:Number(p.slice(1,3)),C=p==="Z"?0:Number(p.slice(4,6)),N=[31,h%4===0&&(h%100!==0||h%400===0)?29:28,31,30,31,30,31,31,30,31,30,31];if(b<1||b>12||y<1||y>N[b-1]||v>23||w>59||R>59||T>23||C>59)return null;const _=Date.parse(n);return Number.isFinite(_)?_:null}const hm=1e3,vm=60*hm,gm=60*vm,hN=24*gm,vn="n/a";function WS(n){if(!Number.isFinite(n)||n<0)return null;if(n>0&&n<hm)return"<1s";const l=Math.floor(n/hm);if(n<vm)return`${l}s`;if(n<gm)return`${Math.floor(l/60)}m ${l%60}s`;const r=Math.floor(n/vm);if(n<hN)return`${Math.floor(r/60)}h ${r%60}m`;const o=Math.floor(n/gm);return`${Math.floor(o/24)}d ${o%24}h`}function ex(n){const l=n.turns===void 0?n.reportedWork:pN(n.turns??[]);if(l===void 0)return{accessibleLabel:"Reported work unavailable because terminal turn history is not available.",kind:"unavailable",title:"Reported wall-clock elapsed time requires the terminal turn history from the task detail projection.",value:vn};if(l.terminalTurns===0)return{accessibleLabel:"Reported work not yet reported. Unfinished turns are excluded.",kind:"not-reported",title:"Reported wall-clock elapsed time is added only after a turn reaches a terminal state.",value:vn};if(l.validTurns===0)return{accessibleLabel:"Reported work unavailable because completed turn timestamps are missing or invalid.",kind:"unavailable",title:"Reported wall-clock elapsed time is unavailable because no terminal turn has a valid start and end timestamp.",value:vn};const r=l.totalMilliseconds===null?null:WS(l.totalMilliseconds);if(r===null)return{accessibleLabel:"Reported work unavailable because the duration total is outside the supported range.",kind:"unavailable",title:"Reported wall-clock elapsed time is unavailable because the duration total is outside the supported range.",value:vn};const o=l.terminalTurns-l.validTurns,s=o>0?` ${o} terminal ${o===1?"turn was":"turns were"} unavailable and excluded.`:"";return{accessibleLabel:`Reported work ${r}. This is reported wall-clock elapsed time.${s}`,kind:"available",title:`Sum of valid terminal-turn wall-clock elapsed times; unfinished turns and idle gaps are excluded.${s}`,value:r}}function vN(n,l=Date.now()){const r=n.result===null,o=r?JS(n.startedAt,new Date(l).toISOString()):PS(n),s=r?"Elapsed so far":"Elapsed",c=o===null?vn:WS(o)??vn;return{accessibleLabel:`${s} ${o===null?"unavailable":c}. ${r?"Current":"Completed"} turn reported wall-clock elapsed time.`,kind:o===null?"unavailable":"available",label:s,title:o===null?"Reported wall-clock elapsed time is unavailable because the turn timestamps are missing, invalid, or reversed.":`Reported wall-clock elapsed time from startedAt ${r?"to the current time":"to result.updatedAt"}.`,value:c}}function lu(n,l){return new Intl.NumberFormat(l,{maximumFractionDigits:2,notation:"compact"}).format(n)}function pi(n,l){return new Intl.NumberFormat(l,{maximumFractionDigits:2}).format(n)}function er(n,l){return typeof n!="number"||!Number.isFinite(n)?"—":new Intl.NumberFormat(l,{currency:"USD",currencyDisplay:"narrowSymbol",maximumFractionDigits:2,minimumFractionDigits:2,style:"currency"}).format(n)}function tx(n,l){return new Intl.NumberFormat(l,{maximumFractionDigits:2,minimumFractionDigits:2}).format(n)}function nx(n){var s;const l=n.usage,r=n.turnRef??((s=n.latestTurn)==null?void 0:s.turnRef)??null,o=(l==null?void 0:l.generationTurnRef)!=null&&r!=null&&l.generationTurnRef!==r;return n.status==="working"?l!=null&&l.task?Qd(l.task,!0):{kind:"pending",label:"Token usage pending"}:(l==null?void 0:l.status)==="calculating"||o?l.task?Qd(l.task,!0):{kind:"calculating",label:"Calculating token usage"}:(l==null?void 0:l.status)==="available"&&l.task?Qd(l.task,!1):!l&&n.threadId&&["completed","failed","needs_input"].includes(n.status??"")?{kind:"calculating",label:"Calculating token usage"}:{kind:"unavailable",label:(l==null?void 0:l.reason)??"Token usage unavailable"}}function Qd(n,l){const r=lu(n.totalTokens),o=n.estimatedCostUsd==null?"Estimated cost n/a":`Estimated cost ${er(n.estimatedCostUsd)}`;return{kind:"ready",knownSoFar:l,label:`${r} tokens · ${o}${l?" · known so far":""}`,usage:n}}function gN(n,l){var s,c;if(l.result===null)return{kind:"pending",label:"Turn usage pending"};const r=l.turnRef??l.turnId,o=r?(c=(s=n.usage)==null?void 0:s.turns)==null?void 0:c[r]:null;if((o==null?void 0:o.status)==="calculating")return{kind:"calculating",label:"Calculating turn usage"};if((o==null?void 0:o.status)==="available"&&typeof o.totalTokens=="number"){const f=pi(o.totalTokens),d=o.estimatedCostUsd==null?"Estimated cost n/a":`Estimated cost ${er(o.estimatedCostUsd)}`;return{kind:"ready",label:`${f} tokens · ${d}`}}return{kind:"unavailable",label:(o==null?void 0:o.reason)??"Turn usage unavailable"}}function yN(n,l){var c,f;const r=gN(n,l);if(r.kind==="ready"){const d=l.turnRef??l.turnId,p=d?(f=(c=n.usage)==null?void 0:c.turns)==null?void 0:f[d]:null,h=typeof(p==null?void 0:p.totalTokens)=="number"?pi(p.totalTokens):vn,b=typeof(p==null?void 0:p.totalTokens)=="number"?lu(p.totalTokens):vn,y=p==null?void 0:p.estimatedCostUsd,v=typeof y=="number"&&Number.isFinite(y),w=v?tx(y):vn;return{animated:!1,cost:{accessibleLabel:`Estimated cost ${v?er(y).toLowerCase():"unavailable"}`,value:w},kind:r.kind,note:null,title:r.label,tokens:{accessibleLabel:`${h} tokens`,value:b}}}const o=r.kind==="pending"?"Pending":r.kind==="calculating"?"Calculating":vn,s=r.kind==="unavailable"?"unavailable":o.toLowerCase();return{animated:r.kind==="pending"||r.kind==="calculating",cost:{accessibleLabel:`Estimated cost ${s}${r.kind==="unavailable"?`: ${r.label}`:""}`,value:o},kind:r.kind,note:r.kind==="unavailable"&&r.label!=="Turn usage unavailable"?r.label:null,title:r.label,tokens:{accessibleLabel:`Tokens ${s}${r.kind==="unavailable"?`: ${r.label}`:""}`,value:o}}}function bN(n){var l,r;return n.status!=="working"&&(((l=n.usage)==null?void 0:l.status)==="calculating"||Object.values(((r=n.usage)==null?void 0:r.turns)??{}).some(o=>o.status==="calculating"))}function SN(n){var R;const l=nx(n);if(l.kind==="pending"||l.kind==="calculating"){const T=l.kind==="pending"?"Pending":"Calculating";return{cost:{accessibleLabel:`Estimated cost ${T.toLowerCase()}`,animated:!0,title:l.label,value:T},kind:l.kind,tokens:{accessibleLabel:`Tokens ${T.toLowerCase()}`,animated:!0,title:l.label,value:T}}}if(l.kind==="unavailable"){const T=l.label==="Token usage unavailable"?"":`: ${l.label}`;return{cost:{accessibleLabel:`Estimated cost unavailable${T}`,animated:!1,title:l.label,value:vn},kind:"unavailable",tokens:{accessibleLabel:`Token usage unavailable${T}`,animated:!1,title:l.label,value:`${vn} tokens`}}}const r=lu(l.usage.totalTokens),o=pi(l.usage.totalTokens),s=l.usage.estimatedCostUsd,c=typeof s=="number"&&Number.isFinite(s),f=c?er(s):null,d=c?tx(s):null,p=l.knownSoFar?" · Updating…":"",h=l.knownSoFar?"; updating":"",b=c?p:"",y=c?h:"",v=l.usage.sourceUpdatedAt??l.usage.sampledAt??((R=n.usage)==null?void 0:R.updatedAt)??null,w=v&&!Number.isNaN(Date.parse(v))?` Cached usage updated ${new Date(v).toLocaleString()}.`:"";return{cost:{accessibleLabel:`Estimated cost ${f??"unavailable"}${y}.${w}`,animated:l.knownSoFar&&c,title:`${f===null?"Estimated cost unavailable":`Unrounded estimate: $${l.usage.estimatedCostUsd}`}${b}.${w}`,value:d??vn},kind:"ready",tokens:{accessibleLabel:`${o} tokens${h}.${w}`,animated:l.knownSoFar,title:`${o} tokens${p}.${w}`,value:`${r} tokens`}}}function xN(n){return n==="completed"?"teal":n==="needs_input"?"yellow":n==="failed"?"red":n==="working"?"blue":"gray"}function wN(n){return n===null?"Unresolved":n.replaceAll("_"," ")}const Kd=30,oi=6e4,fc=60*oi,Ga=24*fc;function lx(n){if(typeof n!="string"||n.trim()==="")return null;const l=Date.parse(n);return Number.isFinite(l)?{date:new Date(l),iso:new Date(l).toISOString(),milliseconds:l}:null}function Hb(n,{locale:l,timeZone:r}={}){const o=lx(n);return o?new Intl.DateTimeFormat(l,{dateStyle:"medium",timeStyle:"short",timeZone:r}).format(o.date):"—"}function CN(n,l){const r=Math.floor(n/fc),o=r===1?"1 hour":`${r} hours`;return l==="future"?`in ${o}`:`${o} ago`}function Lp(n,{now:l=Date.now(),locale:r,timeZone:o}={}){const s=lx(n);if(!s)return"—";const c=l-s.milliseconds,f=c<0,d=Math.abs(c);if(d<oi)return"just now";if(d<2*oi)return f?"in 1 minute":"1 minute ago";if(d<fc){const b=f?Math.ceil(d/oi):Math.floor(d/oi);return f?`in ${b} minutes`:`${b} minutes ago`}if(d<2*fc)return f?"in 1 hour":"1 hour ago";if(d<Ga)return CN(d,f?"future":"past");if(d<2*Ga)return f?"in 1 day":"1 day ago";if(d<Kd*Ga){const b=f?Math.ceil(d/Ga):Math.floor(d/Ga);return f?`in ${b} days`:`${b} days ago`}const p=f?Math.ceil(d/(Kd*Ga)):Math.floor(d/(Kd*Ga)),h=p===1?"1 month":`${p} months`;return f?`in ${h}`:`${h} ago`}function au({status:n}){return g.jsx(Jo,{className:"taskchef-status-badge",color:xN(n),size:"sm",variant:"light",children:wN(n)})}function Ub({notifications:n,announcements:l=n,onClear:r,onDismiss:o,onOpen:s,tasks:c,withinPortal:f=!0}){if(n.length===0)return null;const d=g.jsxs(g.Fragment,{children:[g.jsxs(gn,{"aria-label":"Task notifications",className:"taskchef-notifications",p:"sm",radius:"md",role:"region",shadow:"xl",withBorder:!0,children:[g.jsxs(St,{justify:"space-between",mb:"xs",children:[g.jsxs(St,{gap:6,children:[g.jsx(m_,{"aria-hidden":!0,size:16}),g.jsx(_e,{fw:700,size:"sm",children:"Updates"})]}),g.jsx(il,{onClick:r,size:"compact-xs",variant:"subtle",children:"Clear all"})]}),g.jsx(Un.Autosize,{className:"taskchef-notification-scroll",mah:"min(55vh, 520px)",type:"auto",children:g.jsx(Ut,{className:"taskchef-notification-list",gap:6,children:n.map(p=>{const h=c.some(w=>w.id===p.taskId),b=`notification-${Math.abs(RN(p.id))}`,y=`${b}-summary`,v=`${b}-metadata`;return g.jsx(gn,{className:"taskchef-notification",p:"xs",radius:"sm",children:g.jsxs(St,{align:"flex-start",gap:"xs",wrap:"nowrap",children:[g.jsxs("button",{"aria-describedby":[p.summary?y:null,v].filter(Boolean).join(" "),"aria-label":cN(p,h),className:"taskchef-notification-open",onClick:()=>s(p),type:"button",children:[g.jsxs(St,{gap:"xs",justify:"space-between",wrap:"nowrap",children:[g.jsx(_e,{fw:700,size:"sm",children:nu(p)}),g.jsx(au,{status:p.status})]}),g.jsx(_e,{lineClamp:1,size:"sm",children:p.title}),p.summary&&g.jsx(_e,{className:"taskchef-preserve-lines",id:y,lineClamp:3,size:"xs",children:p.summary}),g.jsxs(_e,{c:"dimmed",id:v,size:"xs",children:[Lp(p.timestamp),h?"":" · Task no longer available"]})]}),g.jsx(Zn,{label:"Dismiss notification",children:g.jsx(ul,{"aria-label":uN(p),color:"gray",onClick:()=>o(p),size:"compact-sm",variant:"subtle",children:g.jsx(IS,{"aria-hidden":!0,size:14})})})]})},p.id)})})})]}),g.jsx(ue,{"aria-atomic":"true","aria-live":"polite",className:"taskchef-visually-hidden",role:"status",children:l.map(TN).join(" ")})]});return f?g.jsx(ep,{children:d}):d}function TN(n){return[nu(n),n.title,n.summary,n.turnRef?`Turn ref ${n.turnRef}`:null,Lp(n.timestamp)].filter(Boolean).map(l=>String(l).replace(/[.\s]+$/,"")).join(". ")+"."}function RN(n){let l=0;for(const r of n)l=(l<<5)-l+r.charCodeAt(0)|0;return l}const EN=/^[A-Za-z0-9](?:[A-Za-z0-9-]{0,38})\/[A-Za-z0-9._-]+$/,AN=/https?:\/\/(?:www\.)?github\.com\/([A-Za-z0-9](?:[A-Za-z0-9-]{0,38}))\/([A-Za-z0-9._-]+)\/(issues|pull)\/([1-9]\d*)(?![A-Za-z0-9_])|([A-Za-z0-9](?:[A-Za-z0-9-]{0,38}))\/([A-Za-z0-9._-]+)#([1-9]\d*)(?![A-Za-z0-9_])|#([1-9]\d*)(?![A-Za-z0-9_])|https?:\/\/(?:www\.)?github\.com\/([A-Za-z0-9](?:[A-Za-z0-9-]{0,38}))\/([A-Za-z0-9](?:[A-Za-z0-9._-]*[A-Za-z0-9_-])?)\/?(?=$|[\s#),.;:!?'"\]}>])/gi,_N=/https?:\/\/[^\s<>"'`]+/gi;function Qo(n){return!(n!=null&&n.owner)||!(n!=null&&n.repository)?null:`${n.owner.toLowerCase()}/${n.repository.toLowerCase()}`}function ax(n){const l=new Map;for(const r of n){const o=Qo(r);if(!o)continue;const s=r.repository.toLowerCase(),c=l.get(s)??new Set;c.add(o),l.set(s,c)}return new Set([...l].filter(([,r])=>r.size>1).map(([r])=>r))}function ym(n,l){return l.has(n.repository.toLowerCase())?`${n.owner}/${n.repository}`:n.repository}function ox(n,{related:l=!1}={}){const r=ax(n);let o=null;return n.map(s=>{if(s.provider!=="github"&&!s.owner)return s.label??s.text;const c=Qo(s),f=ym(s,r);if(s.type==="repository")return f;if(l){const d=c===o?`#${s.number}`:`${f} #${s.number}`;return o=c,d}return s.type==="pull"?`${f} PR #${s.number}`:s.type==="issue"?`${f} Issue #${s.number}`:`${f} #${s.number}`})}function NN(n,l){const r=String(n.number??""),o=String(l.number??"");return r.length-o.length||r.localeCompare(o)}function MN(n){const l=new Map,r=new Set,o=new Set,s=new Set;for(const f of n??[]){const d=Qo(f),p=f.number?`${d}#${f.number}`:null;if(f.type==="repository"||!d||r.has(f.label)||s.has(f.url)||p&&o.has(p))continue;r.add(f.label),s.add(f.url),p&&o.add(p);const h=l.get(d)??[];h.push(f),l.set(d,h)}const c=ax(n??[]);return[...l.values()].map(f=>[...f].sort(NN)).sort((f,d)=>{const p=ym(f[0],c),h=ym(d[0],c);return p.localeCompare(h,void 0,{sensitivity:"base"})||Qo(f[0]).localeCompare(Qo(d[0]))})}function rx(n){const l=Qo(n);return l?n.type==="repository"?l:n.type==="pull"?`${l} PR #${n.number}`:n.type==="issue"?`${l} Issue #${n.number}`:`${l} #${n.number}`:n.label??n.text}function ix(n,l){return`${n.toLowerCase()}/${l.toLowerCase()}`}function sx(n){return n!=="."&&n!==".."}function cx(n){if(typeof n!="string")return null;let l=n.trim();const r=l.match(/^https?:\/\/(?:www\.)?github\.com\/([^/?#]+)\/([^/?#]+?)(?:\.git)?\/?$/i);if(r&&(l=`${r[1]}/${r[2]}`),!EN.test(l))return null;const[o,s]=l.split("/");return sx(s)?ix(o,s):null}function jN(n){var s;const l=String(n??""),r=ux(l),o=[];for(const c of l.matchAll(AN)){const f=c.index,d=f>0?l[f-1]:"";let p=null;const h=r.find(C=>f>=C.start&&f<C.end);if(h){const C=!!(c[1]||c[9]);let A=null;try{A=new URL(h.text).hostname.toLowerCase()}catch{}if(!(C&&f===h.start&&(A==="github.com"||A==="www.github.com"))||!fx(h.text))continue;p={end:h.end,suffix:h.text.slice(c[0].length),text:h.text}}if(c[8]&&/[\w&#/]/.test(d)||(c[5]||c[1]||c[9])&&/[\w/]/.test(d))continue;let b=c[1]??c[5]??c[9]??null,y=c[2]??c[6]??c[10]??null;c[9]&&(y=y.replace(/\.git$/i,""));const v=c[4]??c[7]??c[8]??null,w=(s=c[3])==null?void 0:s.toLowerCase(),R=c[9]?"repository":w==="pull"?"pull":w==="issues"?"issue":"generic",T=!!(b&&y);if(T){if(!sx(y))continue;[b,y]=ix(b,y).split("/")}o.push({end:(p==null?void 0:p.end)??f+c[0].length,explicit:T,number:v,owner:b,repository:y,start:f,text:(p==null?void 0:p.text)??c[0],type:R,urlSuffix:(p==null?void 0:p.suffix)??""})}return o}function ON(n){const l=new Set(n.filter(({explicit:r})=>r).map(({owner:r,repository:o})=>`${r}/${o}`));return l.size===1?[...l][0]:null}function zN(n){const l=new Set((n??[]).map(cx).filter(Boolean));return l.size===1?[...l][0]:null}function DN(n,l){const r=n.explicit?`${n.owner}/${n.repository}`:l;if(!r)return null;const[o,s]=r.split("/");if(n.type==="repository")return{kind:"link",label:`${o}/${s}`,number:null,owner:o,provider:"github",repository:s,text:n.text,type:n.type,url:`https://github.com/${o}/${s}${n.urlSuffix}`};const c=n.type==="pull"?"pull":"issues";return{kind:"link",label:`${o}/${s}#${n.number}`,number:n.number,owner:o,provider:"github",repository:s,text:n.text,type:n.type,url:`https://github.com/${o}/${s}/${c}/${n.number}${n.urlSuffix}`}}function $N(n){let l=n,r;do{r=l,l=l.replace(/[.,;:!?]+$/u,"");for(const[o,s]of[["(",")"],["[","]"],["{","}"]])for(;l.endsWith(s);){const c=[...l].filter(d=>d===o).length;if([...l].filter(d=>d===s).length<=c)break;l=l.slice(0,-1)}}while(l!==r);return l}function ux(n){const l=[];for(const r of String(n??"").matchAll(_N)){const o=$N(r[0]);o&&l.push({end:r.index+o.length,start:r.index,text:o})}return l}function LN(n){const l=n.slice(n.indexOf("//")+2).split(/[?#]/u,1)[0],r=l.indexOf("/");return r<0?!1:l.slice(r).split("/").some(o=>{try{const s=decodeURIComponent(o);return s==="."||s===".."}catch{return!0}})}function fx(n){try{const l=new URL(n);return!l.hostname||l.username||l.password||n.includes("\\")||LN(n)?null:l.href}catch{return null}}function kN(n){const l=[];for(const r of ux(n)){const o=fx(r.text);o&&l.push({end:r.end,kind:"link",label:r.text,provider:"web",start:r.start,text:r.text,type:"url",url:o})}return l}function BN(n,{projectRepositories:l=[],taskRepository:r=null}={}){const o=String(n??""),s=jN(o),f=ON(s)??cx(r)??zN(l),d=[];let p=0;for(const h of s){h.start>p&&d.push({kind:"text",text:o.slice(p,h.start)});const b=DN(h,f);b?d.push(b):d.push({kind:"ambiguous",reason:`GitHub reference ${h.text} is not linked because the repository is ambiguous.`,text:h.text}),p=h.end}return p<o.length&&d.push({kind:"text",text:o.slice(p)}),d}function HN(n,l={}){const r=String(n??""),o=BN(r,l),s=[];let c=0;for(const h of o){const b=r.indexOf(h.text,c);b<0||(h.kind!=="text"&&s.push({end:b+h.text.length,segment:h,start:b}),c=b+h.text.length)}const f=kN(r).filter(h=>!s.some(({end:b,start:y})=>h.start<b&&h.end>y));if(f.length===0)return o;s.push(...f.map(h=>({end:h.end,segment:h,start:h.start}))),s.sort((h,b)=>h.start-b.start);const d=[];let p=0;for(const h of s)h.start<p||(h.start>p&&d.push({kind:"text",text:r.slice(p,h.start)}),d.push(h.segment),p=h.end);return p<r.length&&d.push({kind:"text",text:r.slice(p)}),d}function dx({task:n}){const l=n.relatedGitHubLinks??[];if(l.length===0&&!n.relatedGitHubLinksTruncated)return null;const r=MN(l),o=ox(r.flat(),{related:!0});let s=0;return g.jsxs(ue,{"aria-label":`Related GitHub links for ${n.title}`,className:"taskchef-github-groups",component:"nav",children:[r.map(c=>g.jsx(St,{className:"taskchef-github-group",gap:5,wrap:"wrap",children:c.map(f=>{const d=o[s];s+=1;const p=f.type==="pull"?", GitHub pull request":f.type==="issue"?", GitHub issue":" on GitHub";return g.jsx(Lc,{"aria-label":`${rx(f)}${p} (opens in a new tab)`,className:"taskchef-github-link",href:f.url,rel:"noopener noreferrer",size:"xs",target:"_blank",children:d},f.url)})},`${c[0].owner}/${c[0].repository}`)),n.relatedGitHubLinksTruncated&&g.jsx(_e,{c:"dimmed",size:"xs",children:"More links in task history"})]})}function dc({task:n,text:l}){const r=HN(l,{projectRepositories:n.project.githubRepos,taskRepository:n.relatedGitHubRepository}),o=r.filter(f=>f.kind==="link"),s=ox(o);let c=0;return r.map((f,d)=>{if(f.kind==="text")return f.text;if(f.kind==="ambiguous")return g.jsx("span",{"aria-label":f.reason,className:"taskchef-github-reference-ambiguous",tabIndex:0,title:f.reason,children:f.text},`${d}:${f.text}`);const p=s[c];c+=1;const h=f.type==="pull"?", GitHub pull request":f.type==="issue"?", GitHub issue":f.owner?" on GitHub":"";return g.jsx(Lc,{"aria-label":`${rx(f)}${h} (opens in a new tab)`,className:"taskchef-github-link",href:f.url,rel:"noopener noreferrer",target:"_blank",children:p},`${d}:${f.url}`)})}function mx({loading:n,onClick:l,taskTitle:r}){return g.jsx(il,{"aria-label":`Open chat for ${r}`,leftSection:g.jsx(T_,{"aria-hidden":!0,size:15}),loading:n,onClick:l,size:"compact-sm",variant:"default",children:"Open chat"})}function ou({children:n,className:l="",...r}){return g.jsx("span",{className:`taskchef-shimmer ${l}`.trim(),"data-animation":"text-shimmer",...r,children:n})}const px=x.createContext(null);function UN({children:n,now:l}){return g.jsx(px,{value:l,children:n})}function mc({icon:n,label:l,tooltipLabel:r,value:o}){const[s,c]=x.useState(!1);x.useContext(px);const f=s?Hb(o):Lp(o),d=Hb(o),p=d==="—",h=d==="—"?"Updated time unavailable":s?"Show relative time":`Exact time: ${d}. Show exact time`;return g.jsx(Zn,{events:{focus:!0,hover:!0,touch:!1},label:r??h,children:g.jsxs(kl,{"aria-label":p?`${l}: unavailable.`:`${l}: ${f}. ${s?"Show relative time":"Show exact time"}`,className:"taskchef-time",disabled:p,onClick:()=>c(b=>!b),children:[n??g.jsx(b_,{"aria-hidden":!0,size:12}),g.jsx("bdi",{className:"taskchef-time-label",children:f})]})})}function hx({children:n,variant:l}){return g.jsx(ue,{className:`taskchef-stats taskchef-${l}-stats`,component:"div",children:n})}function va({children:n,usageState:l}){return g.jsx(ue,{className:"taskchef-stat","data-usage-state":l,children:n})}function Ko({accessibleLabel:n,animated:l=!1,icon:r,title:o,value:s}){return g.jsx(Zn,{events:{focus:!0,hover:!0,touch:!1},label:o,multiline:!0,children:g.jsxs(_e,{"aria-label":n,className:"taskchef-stat-content",component:"span",size:"xs",tabIndex:0,children:[r,g.jsx("bdi",{children:l?g.jsx(ou,{children:s}):s})]})})}function YN({task:n}){const l=ex(n),r=SN(n);return g.jsxs(hx,{variant:"card",children:[g.jsx(va,{children:g.jsx(mc,{icon:g.jsx(VS,{"aria-hidden":!0,size:14}),label:`Updated time for ${n.title}`,tooltipLabel:"Updated at",value:n.meaningfulUpdatedAt??n.updatedAt})}),g.jsx(va,{children:g.jsx(Ko,{accessibleLabel:l.accessibleLabel,icon:g.jsx(GS,{"aria-hidden":!0,size:14}),title:"Duration",value:l.value})}),g.jsxs(va,{usageState:r.kind,children:[g.jsx(Ko,{accessibleLabel:r.tokens.accessibleLabel,animated:r.tokens.animated,icon:g.jsx(XS,{"aria-hidden":!0,size:14}),title:"Tokens",value:r.tokens.value}),g.jsxs(_e,{className:"taskchef-visually-hidden",component:"span",role:"status",children:[r.tokens.accessibleLabel,"; ",r.cost.accessibleLabel]})]}),g.jsx(va,{usageState:r.kind,children:g.jsx(Ko,{accessibleLabel:r.cost.accessibleLabel,animated:r.cost.animated,icon:g.jsx(qS,{"aria-hidden":!0,size:14}),title:"Estimated cost",value:r.cost.value})})]})}function qN({onOpenCodex:n,onOpenDetail:l,task:r}){const o=W_(r);return g.jsx(gn,{className:"taskchef-task-row",component:"article",p:"md",radius:"md",withBorder:!0,children:g.jsxs(Ut,{className:"taskchef-task-main",gap:"sm",children:[g.jsxs(ue,{children:[g.jsxs(ue,{className:"taskchef-card-heading",children:[g.jsx(Wt,{order:3,size:"h5",children:g.jsx("button",{className:"taskchef-title-button",onClick:()=>l(r),type:"button",children:r.title})}),g.jsxs(Ut,{align:"flex-end",className:"taskchef-card-metadata",gap:4,children:[g.jsx(au,{status:r.status}),g.jsx(mx,{onClick:()=>n(r),taskTitle:r.title})]})]}),g.jsx(_e,{c:"dimmed",mt:2,size:"xs",children:r.project.name})]}),g.jsxs(ue,{className:"taskchef-summary-grid",children:[g.jsx(_e,{c:"dimmed",className:"taskchef-field-label",size:"xs",children:"Request"}),g.jsx(_e,{className:"taskchef-preserve-lines",lineClamp:3,size:"sm",children:g.jsx(dc,{task:r,text:o.requestSummary})}),g.jsx(_e,{c:"dimmed",className:"taskchef-field-label",size:"xs",children:"Result"}),g.jsx(_e,{className:"taskchef-preserve-lines",lineClamp:3,size:"sm",children:o.resultStatus==="working"?g.jsx(ou,{children:o.resultSummary}):g.jsx(dc,{task:r,text:o.resultSummary})})]}),g.jsx(dx,{task:r}),g.jsx(YN,{task:r})]})})}function VN({highlightTurnRef:n,task:l}){const r=tN(l,[]);return r!=null&&r.length?g.jsx(Ut,{gap:"sm",children:[...r].reverse().map((o,s)=>{const c=eN(o),f=o.turnRef??o.turnId??`turn-${s}`,d=f===n,p=yN(l,o);return g.jsx(gn,{className:`taskchef-turn${d?" taskchef-turn-highlighted":""}`,"data-turn-ref":f,p:"sm",radius:"md",tabIndex:d?-1:void 0,withBorder:!0,children:g.jsxs(Ut,{gap:7,children:[g.jsxs(ue,{className:"taskchef-turn-heading",children:[g.jsx(_e,{c:"dimmed",size:"xs",children:c.sourceLabel}),g.jsx(au,{status:c.status})]}),g.jsxs(ue,{children:[g.jsx(_e,{c:"dimmed",className:"taskchef-field-label",size:"xs",children:"Request"}),g.jsx(_e,{className:"taskchef-preserve-lines",size:"sm",children:g.jsx(dc,{task:l,text:o.requestSummary??"Request not recorded."})})]}),g.jsxs(ue,{children:[g.jsx(_e,{c:"dimmed",className:"taskchef-field-label",size:"xs",children:"Result"}),g.jsx(_e,{className:"taskchef-preserve-lines",size:"sm",children:c.status==="working"?g.jsx(ou,{children:c.summary}):g.jsx(dc,{task:l,text:c.summary})})]}),g.jsxs(hx,{variant:"turn",children:[g.jsx(va,{children:g.jsx(mc,{icon:g.jsx(VS,{"aria-hidden":!0,size:14}),label:"Turn update time",tooltipLabel:"Updated at",value:c.updatedAt})}),g.jsx(va,{children:g.jsx(GN,{turn:o})}),g.jsx(va,{usageState:p.kind,children:g.jsx(Ko,{accessibleLabel:p.tokens.accessibleLabel,animated:p.animated,icon:g.jsx(XS,{"aria-hidden":!0,size:14}),title:"Tokens",value:p.tokens.value})}),g.jsx(va,{usageState:p.kind,children:g.jsx(Ko,{accessibleLabel:p.cost.accessibleLabel,animated:p.animated,icon:g.jsx(qS,{"aria-hidden":!0,size:14}),title:"Estimated cost",value:p.cost.value})})]}),p.note&&g.jsx(_e,{c:"dimmed",size:"xs",children:p.note})]})},f)})}):g.jsx(_e,{c:"dimmed",size:"sm",children:"No turn history has been recorded."})}function GN({turn:n}){const l=XN(n.result===null),r=vN(n,l);return g.jsx(Ko,{accessibleLabel:r.accessibleLabel,icon:g.jsx(GS,{"aria-hidden":!0,size:14}),title:"Duration",value:r.value})}function XN(n){const[l,r]=x.useState(()=>Date.now());return x.useEffect(()=>{if(!n)return;r(Date.now());const o=window.setInterval(()=>r(Date.now()),1e3);return()=>window.clearInterval(o)},[n]),l}function IN({task:n}){const l=nx(n),r=ex(n),o=l.kind==="ready"?l:null,s=Object.keys((o==null?void 0:o.usage.models)??{}).join(", "),c=o==null?void 0:o.usage.estimatedCostUsd,f=typeof c=="number"&&Number.isFinite(c),d=l.kind==="pending"?"Pending":l.kind==="calculating"?"Calculating":"n/a",p=l.kind==="unavailable"?"unavailable":d.toLowerCase(),h=[{accessibleValue:o?`${pi(o.usage.totalTokens)} tokens`:l.label,animated:l.kind==="pending"||l.kind==="calculating"||(o==null?void 0:o.knownSoFar),label:"Tokens",title:o?`${pi(o.usage.totalTokens)} tokens`:l.label,value:o?lu(o.usage.totalTokens):d},{accessibleValue:o?o.usage.estimatedCostUsd==null?"Estimated cost unavailable":`Estimated cost ${er(o.usage.estimatedCostUsd)}`:`Estimated cost ${p}${l.kind==="unavailable"?`: ${l.label}`:""}`,animated:l.kind==="pending"||l.kind==="calculating"||(o==null?void 0:o.knownSoFar)&&f,label:"Estimated cost",title:(o==null?void 0:o.usage.estimatedCostUsd)==null?"Estimated cost unavailable":`Unrounded estimate: $${o.usage.estimatedCostUsd}`,value:o?o.usage.estimatedCostUsd==null?"n/a":er(o.usage.estimatedCostUsd):d},{accessibleValue:r.accessibleLabel,label:"Duration",title:r.title,value:r.value},{accessibleValue:s||"Models unavailable",label:"Models",title:s||"Models unavailable",value:s||"n/a"}];return g.jsxs(ue,{"aria-live":"polite",children:[g.jsx(ue,{className:"taskchef-metrics",children:h.map(({accessibleValue:b,animated:y,label:v,title:w,value:R})=>g.jsxs(gn,{className:"taskchef-metric",p:"sm",radius:"md",withBorder:!0,children:[g.jsx(_e,{c:"dimmed",size:"xs",children:v}),g.jsx(_e,{"aria-label":b,className:"taskchef-metric-value",fw:650,size:"sm",title:w,children:y?g.jsx(ou,{children:R}):R})]},v))}),l.kind==="unavailable"&&l.label!=="Token usage unavailable"&&g.jsx(_e,{c:"dimmed",mt:"xs",size:"xs",children:l.label})]})}function ZN({busy:n,error:l,highlightTurnRef:r,onClose:o,onCopy:s,onOpenCodex:c,onTransition:f,opened:d,task:p,notifications:h,notice:b}){var C;const y=Rm("(max-width: 48em)"),[v,w]=x.useState(null);if(x.useEffect(()=>{d||w(null)},[d]),x.useEffect(()=>{d&&r&&requestAnimationFrame(()=>{var A;(A=document.querySelector(`[data-turn-ref="${CSS.escape(r)}"]`))==null||A.focus()})},[r,d,(C=p==null?void 0:p.turns)==null?void 0:C.length,p==null?void 0:p.updatedAt]),x.useEffect(()=>{v&&(!p||!Yb(p).includes(v))&&w(null)},[v,p==null?void 0:p.status]),!p)return null;const R=Yb(p),T=g.jsxs(Ut,{gap:"lg",children:[h,g.jsxs(ue,{children:[g.jsxs(St,{align:"flex-start",gap:"sm",justify:"space-between",wrap:"nowrap",children:[g.jsxs(ue,{children:[g.jsx(_e,{c:"teal",fw:700,size:"xs",tt:"uppercase",children:p.project.name}),g.jsx(Wt,{id:"task-detail-title",order:2,size:"h3",tabIndex:-1,children:p.title})]}),g.jsx(au,{status:p.status})]}),g.jsxs(St,{gap:"xs",mt:"md",children:[g.jsx(mx,{loading:n,onClick:c,taskTitle:p.title}),g.jsxs(xt,{position:"bottom-start",shadow:"md",withinPortal:!0,zIndex:360,children:[g.jsx(xt.Target,{children:g.jsx(Zn,{label:"More task actions",children:g.jsx(ul,{"aria-label":"More task actions",disabled:n,variant:"default",children:g.jsx(w_,{"aria-hidden":!0,size:17})})})}),g.jsxs(xt.Dropdown,{children:[g.jsx(xt.Item,{leftSection:g.jsx(g_,{size:14}),onClick:s,children:"Copy Task ID"}),R.includes("completed")&&g.jsx(xt.Item,{leftSection:g.jsx(h_,{size:14}),onClick:()=>w("completed"),children:"Mark completed"}),R.includes("failed")&&g.jsx(xt.Item,{color:"red",leftSection:g.jsx(IS,{size:14}),onClick:()=>w("failed"),children:"Mark failed"})]})]})]}),g.jsx(ue,{mt:"sm",children:g.jsx(dx,{task:p})})]}),v&&g.jsx(QN,{busy:n,onCancel:()=>w(null),onTransition:f,status:v},v),b&&g.jsx(Mn,{color:"teal",role:"status",children:b}),l&&g.jsx(Mn,{color:"red",role:"alert",children:l}),g.jsxs("section",{"aria-labelledby":"usage-heading",children:[g.jsx(Wt,{id:"usage-heading",mb:"xs",order:3,size:"h5",children:"Usage"}),g.jsx(IN,{task:p})]}),g.jsx(Uc,{}),g.jsxs("section",{"aria-labelledby":"activity-heading",children:[g.jsx(Wt,{id:"activity-heading",mb:"sm",order:3,size:"h5",children:"Activity timeline"}),g.jsx(VN,{highlightTurnRef:r,task:p})]}),g.jsxs("section",{"aria-labelledby":"instruction-heading",children:[g.jsx(Wt,{id:"instruction-heading",mb:"xs",order:3,size:"h5",children:"Original instruction"}),g.jsx(ue,{className:"taskchef-code-panel",component:"pre",children:p.instruction})]}),g.jsxs("section",{"aria-labelledby":"metadata-heading",children:[g.jsx(Wt,{id:"metadata-heading",mb:"xs",order:3,size:"h5",children:"Metadata"}),g.jsxs("dl",{className:"taskchef-metadata",children:[g.jsx("dt",{children:"Task ID"}),g.jsx("dd",{children:p.id}),g.jsx("dt",{children:"Thread ID"}),g.jsx("dd",{children:p.threadId??"—"}),g.jsx("dt",{children:"Current turn ref"}),g.jsx("dd",{children:p.turnRef??"—"}),g.jsx("dt",{children:"Project path"}),g.jsx("dd",{children:p.project.path}),g.jsx("dt",{children:"Created"}),g.jsx("dd",{children:g.jsx(mc,{label:"Created time",value:p.createdAt})}),g.jsx("dt",{children:"Updated"}),g.jsx("dd",{children:g.jsx(mc,{label:"Updated time",value:p.meaningfulUpdatedAt??p.updatedAt})}),g.jsx("dt",{children:"Updated by"}),g.jsx("dd",{children:p.updatedBy??"—"})]})]})]});return y?g.jsx(Gn,{closeOnClickOutside:!n,closeOnEscape:!n,onClose:o,opened:d,overlayProps:{backgroundOpacity:.55,blur:2},position:"bottom",scrollAreaComponent:Un.Autosize,size:"92%",title:g.jsx("span",{className:"taskchef-visually-hidden",children:"Task details"}),trapFocus:!0,zIndex:300,children:T}):g.jsx(In,{"aria-labelledby":"task-detail-title",closeOnClickOutside:!n,closeOnEscape:!n,onClose:o,opened:d,overlayProps:{backgroundOpacity:.55,blur:2},scrollAreaComponent:Un.Autosize,size:"min(820px, calc(100vw - 32px))",title:g.jsx("span",{className:"taskchef-visually-hidden",children:"Task details"}),trapFocus:!0,zIndex:300,children:T})}function Yb(n){return n.status==="completed"?["failed"]:n.status==="failed"?["completed"]:n.status==="working"||n.status==="needs_input"?["completed","failed"]:[]}function QN({busy:n,onCancel:l,onTransition:r,status:o}){const s=x.useRef(crypto.randomUUID());return g.jsxs(Mn,{color:o==="failed"?"red":"teal",role:"alert",title:`Mark task ${o}?`,children:[g.jsx(_e,{mb:"sm",size:"sm",children:"This interrupts active work and appends an audited manual dashboard turn."}),g.jsxs(St,{gap:"xs",children:[g.jsx(il,{color:o==="failed"?"red":"teal",loading:n,onClick:async()=>{const c=await r(o,s.current);c.ok?(l(),requestAnimationFrame(()=>{var f;return(f=document.getElementById("task-detail-title"))==null?void 0:f.focus()})):c.rotateActionId&&(s.current=crypto.randomUUID())},size:"compact-sm",children:"Confirm"}),g.jsx(il,{disabled:n,onClick:l,size:"compact-sm",variant:"default",children:"Cancel"})]})]})}const KN={primaryColor:"teal",colors:{teal:["#e6fcf5","#c3fae8","#96f2d7","#63e6be","#38d9a9","#20c997","#087f5b","#067052","#055e46","#044d39"]},defaultRadius:"md",fontFamily:"Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif",headings:{fontFamily:"inherit",fontWeight:"680"},components:{Button:{defaultProps:{radius:"md"}},Paper:{defaultProps:{radius:"md"}}}};var Vb;const qb=(Vb=document.querySelector('meta[name="taskchef-style-nonce"]'))==null?void 0:Vb.content;function FN({totalCount:n,visibleCount:l}){return g.jsxs(_e,{"aria-live":"polite",className:"taskchef-results-summary",id:"task-results-summary",children:["Tasks: ",l," of ",n]})}function JN({connect:n=!0,initialFilters:l={},initialTasks:r=[]}){const[o,s]=x.useState(()=>window.location.hash==="#settings");x.useEffect(()=>{const me=()=>s(window.location.hash==="#settings");return window.addEventListener("hashchange",me),()=>window.removeEventListener("hashchange",me)},[]);const[c,f]=x.useState(r),[d,p]=x.useState(),[h,b]=x.useState(!1),[y,v]=x.useState(null),[w,R]=x.useState(null),[T,C]=x.useState(l.project??""),[A,N]=x.useState(l.status??""),[_,j]=x.useState(l.date??"all"),[$,L]=x.useState(()=>Date.now()),[D,H]=x.useState(null),[W,le]=x.useState(!1),[ae,te]=x.useState(!1),[J,V]=x.useState(null),[ce,O]=x.useState(null),[B,U]=x.useState(null),[Q,P]=x.useState({initialized:r.length>0,announcements:[],notifications:[],seenIds:new Set,signatures:new Map}),M=(D==null?void 0:D.id)??null,Y=x.useRef(M);Y.current=M;const F=x.useRef(0),re=x.useRef(null),ie=x.useRef(Fs(null)),fe=x.useCallback(me=>{f(me.tasks),p(me.projectIndex),P(qe=>{const ze=fN(qe,me.tasks);return{initialized:!0,announcements:ze.additions,notifications:ze.notifications,seenIds:ze.seenIds,signatures:ze.signatures}}),v(me.healthy===!1?"The task log is temporarily unavailable. Showing the last valid snapshot.":null);const Me=Y.current;if(Me){const qe=me.tasks.find(ze=>ze.id===Me);qe&&H(ze=>ze?kb(ze,qe):qe)}},[]);x.useEffect(()=>{const me=window.setInterval(()=>L(Date.now()),3e4);return()=>window.clearInterval(me)},[]),x.useEffect(()=>{if(!n)return;U_().then(R).catch(()=>R(null));const me=H_({onConnection:b,onError:v,onSnapshot:fe});return()=>me.close()},[fe,n]);const ge=x.useCallback(async(me,Me=null)=>{const qe=++F.current;re.current=me.updatedAt,ie.current=Fs(me),H(ze=>(ze==null?void 0:ze.id)===me.id?kb(ze,me):me),le(!0),U(Me),V(null),O(null);try{for(let ze=0;ze<=40;ze+=1){if(qe!==F.current)return;const Je=await q_(me.id);if(qe!==F.current||(re.current=Je.updatedAt,ie.current=Fs(Je),H(Je),!bN(Je)||ze===40))return;await new Promise(ct=>window.setTimeout(ct,1500))}}catch{qe===F.current&&V("Task activity is temporarily unavailable. Showing the latest list snapshot.")}},[]),de=c.find(me=>me.id===M)??null,he=Fs(de);x.useEffect(()=>{!W||!M||!n||de&&(de.updatedAt===re.current&&he===ie.current||ge(de,B))},[de==null?void 0:de.updatedAt,he]);const Oe=x.useMemo(()=>[{label:"All projects",value:""},...[...new Set(c.map(me=>me.project.name))].sort().map(me=>({label:me,value:me}))],[c]),be=x.useMemo(()=>KS(c,{project:T,status:A,date:_,now:$}),[c,T,A,_,$]),Ce=x.useMemo(()=>lN(c,{project:T,date:_,now:$}),[c,T,_,$]),Se=ZS.map(({label:me,value:Me})=>({label:Ce[Me]>0?`${me} ${Ce[Me]}`:me,value:Me}));async function Ne(me){te(!0);try{const Me=await V_(me.id);Me&&v(Me)}catch{v("Codex could not be opened. Open the project and select the recorded task instead.")}finally{te(!1)}}async function st(me,Me){if(!D)return{ok:!1};const qe=D,ze=J_(qe);te(!0),V(null);const Je=await G_(qe,me,Me);return te(!1),Je.task&&(H(ct=>Db({requestTask:qe,expected:ze,responseTask:Je.task,selectedTask:ct})),f(ct=>ct.map(jt=>jt.id===qe.id?Db({requestTask:qe,expected:ze,responseTask:Je.task,selectedTask:jt}):jt))),Je.ok&&Je.task?(U(Je.task.turnRef??Je.task.turnId),{ok:!0}):(V(Je.message??"Task state could not be changed."),{ok:!1,rotateActionId:Je.code==="stale_task"})}function at(me){const Me=c.find(ze=>ze.id===me.taskId),qe=dN({detailTaskId:M,detailOpened:W,highlightTurnRef:B,notifications:Q.notifications,refreshGeneration:F.current},me,!!Me);if(P(ze=>({...ze,notifications:qe.notifications})),!Me){v("This task is no longer present in the current snapshot.");return}ge(Me,qe.highlightTurnRef)}return g.jsx(c0,{defaultColorScheme:"auto",getStyleNonce:qb?()=>qb:void 0,theme:KN,children:g.jsxs(UN,{now:$,children:[g.jsxs(Yn,{className:"taskchef-shell",padding:0,children:[g.jsx(mi,{className:"taskchef-header",component:"header",size:1080,children:g.jsxs(St,{className:"taskchef-header-layout",align:"stretch",justify:"space-between",wrap:"nowrap",children:[g.jsxs(ue,{className:"taskchef-header-copy",children:[g.jsxs(_e,{c:"var(--taskchef-accent)",fw:750,size:"xs",tt:"uppercase",children:["TaskChef ",w&&g.jsxs("span",{className:"taskchef-version",children:["v",w]})]}),g.jsxs(St,{gap:"sm",mt:5,wrap:"nowrap",children:[g.jsx(WN,{}),g.jsx(Wt,{order:1,size:"h2",children:"Dashboard"})]})]}),g.jsxs(Ut,{align:"flex-end",className:"taskchef-header-actions",gap:0,justify:"space-between",children:[g.jsxs(St,{"aria-live":"polite",className:"taskchef-connection",gap:7,role:"status",wrap:"nowrap",children:[g.jsx(B_,{"aria-hidden":!0,color:h?"var(--mantine-color-teal-6)":"var(--mantine-color-yellow-6)",size:9}),g.jsx(_e,{c:"dimmed",size:"xs",children:h?"Live":n?"Connecting…":"Fixture preview"})]}),g.jsxs(St,{className:"taskchef-header-icon-row",gap:2,justify:"flex-end",wrap:"nowrap",children:[g.jsx(Zn,{label:"Settings",children:g.jsx(ul,{className:"taskchef-icon-button",component:"a",href:"#settings","aria-label":"Settings","aria-current":o?"page":void 0,variant:"subtle",color:"gray",size:"lg",children:g.jsx(O_,{size:18,stroke:1.8})})}),g.jsx(PN,{})]})]})]})}),g.jsx(Yn.Main,{children:g.jsxs(mi,{className:"taskchef-main",pb:80,size:1080,children:[(d==null?void 0:d.status)==="unavailable"&&g.jsx(Mn,{color:"yellow",icon:g.jsx(Zd,{size:18}),mb:"md",title:"Project index unavailable",children:"Task history is still visible. Verify the index and inspect backups before making project changes."}),(d==null?void 0:d.status)==="available"&&d.missingProjects.length>0&&g.jsx(Mn,{color:"yellow",icon:g.jsx(Zd,{size:18}),mb:"md",title:"Historical projects are missing from the current index",children:d.missingProjects.map(me=>g.jsxs(_e,{size:"sm",children:[me.snapshotNames.join(", "),": ",me.taskCount," task(s). Run ",g.jsx("code",{children:"taskchef backup list --json"})," and preview any restore; the dashboard never restores automatically."]},me.path))}),o?g.jsxs(Ut,{gap:"md",children:[g.jsx(il,{component:"a",href:"#",variant:"subtle",size:"sm",leftSection:g.jsx(f_,{size:16}),style:{alignSelf:"flex-start"},children:"Back to tasks"}),g.jsx(X_,{})]}):g.jsxs(g.Fragment,{children:[g.jsx(gn,{className:"taskchef-toolbar",p:"sm",radius:"md",withBorder:!0,children:g.jsxs(Ut,{gap:"sm",children:[g.jsxs(St,{align:"end",gap:"sm",children:[g.jsx(Wo,{"aria-label":"Project",data:Oe,label:"Project",onChange:me=>C(me??""),size:"sm",value:T}),g.jsx(Wo,{"aria-label":"Updated",data:[{label:"Latest 24 hours",value:"24h"},{label:"Latest 7 days",value:"7d"},{label:"All time",value:"all"}],label:"Updated",onChange:me=>j(me??"all"),size:"sm",value:_})]}),g.jsxs(ue,{children:[g.jsx(_e,{className:"taskchef-filter-label",mb:5,children:"Status"}),g.jsx(tu,{"aria-label":"Status",data:Se,fullWidth:!0,onChange:N,size:"xs",value:A})]})]})}),g.jsx(FN,{totalCount:c.length,visibleCount:be.length}),y&&g.jsx(Mn,{color:"yellow",icon:g.jsx(Zd,{"aria-hidden":!0,size:17}),mt:"md",role:"status",children:g.jsxs(St,{gap:"sm",justify:"space-between",wrap:"nowrap",children:[g.jsx(_e,{size:"sm",children:y}),g.jsx(Ja,{"aria-label":"Dismiss dashboard message",onClick:()=>v(null),size:"sm"})]})}),g.jsxs(Ut,{"aria-describedby":"task-results-summary","aria-label":"Tasks",component:"section",gap:"sm",mt:"xs",children:[be.map(me=>g.jsx(qN,{onOpenCodex:Ne,onOpenDetail:Me=>void ge(Me),task:me},me.id)),be.length===0&&g.jsxs(gn,{className:"taskchef-empty",p:48,ta:"center",withBorder:!0,children:[g.jsx(Wt,{order:2,size:"h4",children:"No tasks match these filters"}),g.jsx(_e,{c:"dimmed",mt:4,size:"sm",children:"Choose a different project, date, or status."})]})]})]})]})})]}),g.jsx(ZN,{busy:ae,error:J,highlightTurnRef:B,onClose:()=>{ae||(F.current+=1,le(!1),U(null))},onCopy:()=>{D&&(O(null),navigator.clipboard.writeText(D.id).then(()=>O("Task ID copied."),()=>O("Clipboard access is unavailable. Copy the Task ID from metadata.")))},onOpenCodex:()=>D&&void Ne(D),onTransition:st,opened:W,task:D,notice:ce,notifications:W?g.jsx(Ub,{announcements:Q.announcements,notifications:Q.notifications,onClear:()=>P(me=>({...me,notifications:Lb({detailTaskId:M,detailOpened:W,highlightTurnRef:B,notifications:me.notifications,refreshGeneration:F.current}).notifications})),onDismiss:me=>P(Me=>({...Me,notifications:$b(Me.notifications,me.id)})),onOpen:at,tasks:c,withinPortal:!1}):null}),!W&&g.jsx(Ub,{announcements:Q.announcements,notifications:Q.notifications,onClear:()=>P(me=>({...me,notifications:Lb({detailTaskId:M,detailOpened:W,highlightTurnRef:B,notifications:me.notifications,refreshGeneration:F.current}).notifications})),onDismiss:me=>P(Me=>({...Me,notifications:$b(Me.notifications,me.id)})),onOpen:at,tasks:c})]})})}function PN(){const{setColorScheme:n}=l0(),l=a0("light"),r=l==="dark"?"light":"dark";return g.jsx(Zn,{label:`Use ${r} theme`,children:g.jsx(ul,{"aria-label":`Use ${r} theme`,className:"taskchef-icon-button",color:"gray",onClick:()=>n(r),size:"lg",variant:"subtle",children:l==="dark"?g.jsx($_,{"aria-hidden":!0,size:18,stroke:1.8}):g.jsx(__,{"aria-hidden":!0,size:18,stroke:1.8})})})}function WN(){const n=a0("light");return g.jsx("img",{alt:"","aria-hidden":!0,className:"taskchef-brand-icon",height:"42",src:n==="dark"?"/assets/taskchef-dark.svg":"/assets/taskchef.svg",width:"42"})}B2.createRoot(document.getElementById("root")).render(g.jsx(x.StrictMode,{children:g.jsx(JN,{})}));
|
|
194
194
|
//# sourceMappingURL=app.js.map
|