specrails-desktop 2.13.0 → 2.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/client/dist/assets/{ActivityFeedPage-D0-P3PsD.js → ActivityFeedPage-C_clKk8d.js} +1 -1
- package/client/dist/assets/AgentsPage-jcPUtPhP.js +86 -0
- package/client/dist/assets/AnalyticsPage-DZkVU3yd.js +1 -0
- package/client/dist/assets/{BarChart-D9vfeilz.js → BarChart-Dq1h8eYR.js} +1 -1
- package/client/dist/assets/CodePage-BcbZT88K.js +2 -0
- package/client/dist/assets/{DesktopAnalyticsPage-C6Qccm5E.js → DesktopAnalyticsPage-CYhXhJoQ.js} +1 -1
- package/client/dist/assets/DocsDialog-CS3Syf61.js +11 -0
- package/client/dist/assets/DocsPage-l3ZcTO2E.js +11 -0
- package/client/dist/assets/{ExportDropdown-DMJ__Yui.js → ExportDropdown-DdB2ncYh.js} +1 -1
- package/client/dist/assets/IntegrationsPage-CJ_Om1zu.js +3 -0
- package/client/dist/assets/JobDetailPage-D5Cxw0md.js +16 -0
- package/client/dist/assets/JobsPage-3v_iX83r.js +1 -0
- package/client/dist/assets/{LoopBuilderPage-BS3enu9N.js → LoopBuilderPage-4s_adZy5.js} +2 -2
- package/client/dist/assets/LoopsPage-DA94-o0j.js +1 -0
- package/client/dist/assets/analytics-BDlELxc7.js +1 -0
- package/client/dist/assets/analytics-BE49LbUk.js +1 -0
- package/client/dist/assets/analytics-CQqu1yE5.js +1 -0
- package/client/dist/assets/analytics-CgEkAUiP.js +1 -0
- package/client/dist/assets/analytics-D1ElChhs.js +1 -0
- package/client/dist/assets/analytics-DBGO8B6-.js +1 -0
- package/client/dist/assets/analytics-DDqve9Ma.js +1 -0
- package/client/dist/assets/analytics-DEsEAJZL.js +1 -0
- package/client/dist/assets/{common-DI4jE5y-.js → common-C9VyfY7g.js} +1 -1
- package/client/dist/assets/{common-DTHzyfYC.js → common-CNoRVpnA.js} +1 -1
- package/client/dist/assets/{common-CnrZ9gCZ.js → common-CcHFVATT.js} +1 -1
- package/client/dist/assets/{common-BhFasU8N.js → common-CzCQ0rpW.js} +1 -1
- package/client/dist/assets/{common-DY4nzbWC.js → common-Dmpyh323.js} +1 -1
- package/client/dist/assets/{common-CwhHWbTD.js → common-LDwESeCX.js} +1 -1
- package/client/dist/assets/{common-DS8zKLQT.js → common-ULlk84G4.js} +1 -1
- package/client/dist/assets/common-kftoE0Q-.js +1 -0
- package/client/dist/assets/dashboard-03EpOoMM.js +1 -0
- package/client/dist/assets/dashboard-BQ3Oa8CE.js +1 -0
- package/client/dist/assets/dashboard-C-dXxut-.js +1 -0
- package/client/dist/assets/dashboard-C2owt3eN.js +1 -0
- package/client/dist/assets/dashboard-C52PElPV.js +1 -0
- package/client/dist/assets/dashboard-CUjyhohl.js +1 -0
- package/client/dist/assets/dashboard-Ch6H-457.js +1 -0
- package/client/dist/assets/dashboard-zH9quXks.js +1 -0
- package/client/dist/assets/{dist-js-o4iwbCuN.js → dist-js-D27I-bfi.js} +1 -1
- package/client/dist/assets/{dist-js-_oLAsZQ4.js → dist-js-Ele_sHO7.js} +1 -1
- package/client/dist/assets/index-BRMyOS1B.css +2 -0
- package/client/dist/assets/index-meTWPBzY.js +144 -0
- package/client/dist/assets/{lib-CVrpo1ac.js → lib-qdRfWwE1.js} +1 -1
- package/client/dist/assets/loops-BYNUJVyD.js +1 -0
- package/client/dist/assets/loops-B_gS4Pqu.js +1 -0
- package/client/dist/assets/loops-B_w7STrw.js +1 -0
- package/client/dist/assets/loops-DE-2cmLw.js +1 -0
- package/client/dist/assets/loops-D_ZxkD4l.js +1 -0
- package/client/dist/assets/loops-DfGadne0.js +1 -0
- package/client/dist/assets/loops-Fv4Bs-9A.js +1 -0
- package/client/dist/assets/loops-mcoeFMat.js +1 -0
- package/client/dist/assets/{tickets-IbYhlr-6.js → tickets-68LH1xp6.js} +1 -1
- package/client/dist/assets/{tickets-EnP6m_Ao.js → tickets-D6f3GSYn.js} +1 -1
- package/client/dist/assets/{tickets-BFrVcXAI.js → tickets-DBQXMYYA.js} +1 -1
- package/client/dist/assets/{tickets-C3gG--yT.js → tickets-OrJwUxJR.js} +1 -1
- package/client/dist/assets/{tickets-Cfhwbdxj.js → tickets-PtHNxQo5.js} +1 -1
- package/client/dist/assets/{tickets-ZS5EsDxn.js → tickets-REr-EQx9.js} +1 -1
- package/client/dist/assets/{tickets-DcggvP3k.js → tickets-blQnNA4N.js} +1 -1
- package/client/dist/assets/{tickets-lJR7pWNI.js → tickets-jxsTrApR.js} +1 -1
- package/client/dist/assets/{upload-Dn9N1ESQ.js → upload-DPG87J4t.js} +1 -1
- package/client/dist/assets/{value-Bd3Cf9Sr.js → value-BRVOAvhY.js} +1 -1
- package/client/dist/index.html +7 -7
- package/package.json +1 -1
- package/server/dist/ai-invocations.js +5 -2
- package/server/dist/db.js +35 -2
- package/server/dist/desktop-analytics.js +39 -6
- package/server/dist/loop-command-catalog.js +97 -0
- package/server/dist/loop-constants.js +51 -1
- package/server/dist/loop-decider.js +13 -10
- package/server/dist/loop-executors.js +58 -6
- package/server/dist/loop-factory.js +10 -3
- package/server/dist/loop-graph.js +21 -0
- package/server/dist/loop-run-manager.js +145 -14
- package/server/dist/loop-runs-store.js +51 -0
- package/server/dist/loop-templates-ported.js +675 -0
- package/server/dist/loop-templates.js +48 -6
- package/server/dist/loops-router.js +1 -0
- package/server/dist/merge-manager.js +81 -0
- package/server/dist/pricing.js +20 -1
- package/server/dist/project-registry.js +7 -0
- package/server/dist/project-router-loop-runs.js +15 -2
- package/server/dist/project-router-spending.js +56 -8
- package/server/dist/queue-manager.js +70 -10
- package/server/dist/rail-isolated-launch.js +189 -0
- package/server/dist/rail-isolation.js +54 -0
- package/server/dist/rail-merge-orchestrator.js +45 -0
- package/server/dist/rail-worktrees-store.js +52 -0
- package/server/dist/rails-router.js +56 -4
- package/server/dist/repo-lock.js +25 -0
- package/server/dist/result-event.js +15 -1
- package/server/dist/spending.js +161 -21
- package/server/dist/worktree-manager.js +159 -0
- package/client/dist/assets/AgentsPage-BZa3lhQM.js +0 -86
- package/client/dist/assets/AnalyticsPage-CgaEg-lx.js +0 -1
- package/client/dist/assets/CodePage-2GUsF_JS.js +0 -2
- package/client/dist/assets/DocsDialog-BAmtk9Jc.js +0 -11
- package/client/dist/assets/DocsPage-CJwnpB57.js +0 -11
- package/client/dist/assets/IntegrationsPage-CP2VcOpr.js +0 -3
- package/client/dist/assets/JobDetailPage-Bk6tQTew.js +0 -16
- package/client/dist/assets/JobsPage-BvbeqWjS.js +0 -1
- package/client/dist/assets/LoopsPage-B0pgvoky.js +0 -2
- package/client/dist/assets/analytics-BHApBnUn.js +0 -1
- package/client/dist/assets/analytics-BUxrug9J.js +0 -1
- package/client/dist/assets/analytics-Cy6DTfO-.js +0 -1
- package/client/dist/assets/analytics-DMJxD9FD.js +0 -1
- package/client/dist/assets/analytics-DgrBuxla.js +0 -1
- package/client/dist/assets/analytics-DwxT1CS8.js +0 -1
- package/client/dist/assets/analytics-GrLc-SMr.js +0 -1
- package/client/dist/assets/analytics-qvPq4T4h.js +0 -1
- package/client/dist/assets/common-D9GAPxeN.js +0 -1
- package/client/dist/assets/dashboard-8FSyxKGV.js +0 -1
- package/client/dist/assets/dashboard-A9XQUfdS.js +0 -1
- package/client/dist/assets/dashboard-BFktSDsV.js +0 -1
- package/client/dist/assets/dashboard-C1PKCXLs.js +0 -1
- package/client/dist/assets/dashboard-DNf0czU-.js +0 -1
- package/client/dist/assets/dashboard-DQQCOVfu.js +0 -1
- package/client/dist/assets/dashboard-DxFqeHZk.js +0 -1
- package/client/dist/assets/dashboard-WvPGhbbi.js +0 -1
- package/client/dist/assets/index-DrFJinsI.css +0 -2
- package/client/dist/assets/index-QEeqwz4v.js +0 -143
- package/client/dist/assets/loops-B1ZQCKEk.js +0 -1
- package/client/dist/assets/loops-Bp5yTSic.js +0 -1
- package/client/dist/assets/loops-BvoL_LAc.js +0 -1
- package/client/dist/assets/loops-BwgehdXY.js +0 -1
- package/client/dist/assets/loops-CMLUqUpc.js +0 -1
- package/client/dist/assets/loops-CW69VvTI.js +0 -1
- package/client/dist/assets/loops-DkV2RhEb.js +0 -1
- package/client/dist/assets/loops-arQ602Zm.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as e}from"./chunk-CilyBKbf.js";import{Bt as t,Dt as n,E as r,F as i,G as a,H as o,Ht as s,I as c,J as l,L as u,M as d,N as f,O as p,Ot as m,P as h,R as g,T as _,Tt as v,Ut as y,V as b,Wt as x,bn as ee,gn as S,hn as C,j as w,n as te,nn as T,pt as ne,tn as E,u as D,v as O,wn as k,y as A}from"./index-meTWPBzY.js";import{t as j}from"./ExportDropdown-DdB2ncYh.js";import{t as re}from"./format-command-CMsBTOPN.js";var ie=t(`git-compare-arrows`,[[`circle`,{cx:`5`,cy:`6`,r:`3`,key:`1qnov2`}],[`path`,{d:`M12 6h5a2 2 0 0 1 2 2v7`,key:`1yj91y`}],[`path`,{d:`m15 9-3-3 3-3`,key:`1lwv8l`}],[`circle`,{cx:`19`,cy:`18`,r:`3`,key:`1qljk2`}],[`path`,{d:`M12 18H7a2 2 0 0 1-2-2V9`,key:`16sdep`}],[`path`,{d:`m9 15 3 3-3 3`,key:`1m3kbl`}]]),M=e(k(),1),N=E();function P(e){if(e==null)return`—`;let t=Math.round(e/1e3);return t<60?`${t}s`:`${Math.floor(t/60)}m ${t%60}s`}function F(e){return e==null?`—`:e===0?`$0`:e<.01?`$${e.toFixed(4)}`:`$${e.toFixed(3)}`}function I(e){return e==null?`—`:e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function L({label:e,a:t,b:n,highlight:r}){return(0,N.jsxs)(`div`,{className:`grid grid-cols-3 gap-2 py-2 border-b border-border/20 last:border-0 text-xs`,children:[(0,N.jsx)(`span`,{className:`text-muted-foreground`,children:e}),(0,N.jsx)(`span`,{className:`font-mono text-right ${r===`a`?`text-emerald-400 aurora-light:text-accent-success font-semibold`:``}`,children:t}),(0,N.jsx)(`span`,{className:`font-mono text-right ${r===`b`?`text-emerald-400 aurora-light:text-accent-success font-semibold`:``}`,children:n})]})}function R(e,t,n=!0){return e==null||t==null||e===t?null:n?e<t?`a`:`b`:e>t?`a`:`b`}function ae({jobIds:e,onClose:t}){let{t:r}=S(`jobs`),[i,o]=(0,M.useState)(null),[s,c]=(0,M.useState)(!0),[l,d]=(0,M.useState)(null),{panelRef:f,panelStyle:p,headerHandleProps:h,resizeHandles:_,isFloating:v,guardBackdrop:y}=g();(0,M.useEffect)(()=>{let t=new AbortController;return fetch(`${T()}/jobs/compare?jobIds=${e.join(`,`)}`,{signal:t.signal}).then(e=>{if(!e.ok)throw Error(`HTTP ${e.status}`);return e.json()}).then(e=>{o(e),c(!1)}).catch(e=>{e.name!==`AbortError`&&(d(e.message),c(!1))}),()=>t.abort()},[e]);function b(e,t){return(0,N.jsxs)(`div`,{className:`text-center space-y-1`,children:[(0,N.jsx)(`p`,{className:`text-[10px] text-muted-foreground font-medium uppercase tracking-wider`,children:r(`comparison.jobN`,{n:t+1})}),(0,N.jsx)(`code`,{className:`text-[10px] text-foreground/70 block truncate max-w-[160px] mx-auto`,children:e.command}),(0,N.jsxs)(`div`,{className:`flex items-center justify-center gap-1 text-[10px]`,children:[e.status===`completed`?(0,N.jsx)(m,{className:`w-3 h-3 text-emerald-400 aurora-light:text-accent-success`}):(0,N.jsx)(n,{className:`w-3 h-3 text-rose-400 aurora-light:text-destructive`}),(0,N.jsx)(`span`,{className:`capitalize text-muted-foreground`,children:r(`statusLabel.${e.status}`,{defaultValue:e.status})})]}),(0,N.jsx)(`p`,{className:`text-[10px] text-muted-foreground font-mono`,children:e.id.slice(0,8)})]})}return(0,N.jsxs)(`div`,{className:`fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm`,onClick:y(t),children:[(0,N.jsxs)(`div`,{ref:f,className:`w-full max-w-lg rounded-xl border border-border/30 bg-popover p-5 shadow-xl space-y-4 mx-4`,onClick:e=>e.stopPropagation(),style:p,children:[(0,N.jsxs)(`div`,{className:`flex items-center justify-between ${v?`cursor-grab active:cursor-grabbing`:``}`,...h,children:[(0,N.jsx)(`h2`,{className:`text-sm font-semibold`,children:r(`comparison.title`)}),(0,N.jsx)(`button`,{type:`button`,onClick:t,className:`text-muted-foreground hover:text-foreground transition-colors`,children:(0,N.jsx)(a,{className:`w-4 h-4`})})]}),s&&(0,N.jsx)(`div`,{className:`space-y-2`,children:[0,1,2,3].map(e=>(0,N.jsx)(`div`,{className:`h-8 bg-muted/20 rounded animate-pulse`},e))}),l&&(0,N.jsx)(`p`,{className:`text-xs text-red-400 aurora-light:text-destructive`,children:r(`comparison.loadFailed`,{error:l})}),i&&(()=>{let[e,t]=i.jobs,n=R(e.durationMs,t.durationMs,!0),a=R(e.totalCostUsd,t.totalCostUsd,!0),o=R(e.tokensOut==null?null:e.tokensOut,t.tokensOut==null?null:t.tokensOut,!0);return(0,N.jsxs)(`div`,{children:[(0,N.jsxs)(`div`,{className:`grid grid-cols-3 gap-2 pb-3 border-b border-border/30 mb-1`,children:[(0,N.jsx)(`div`,{}),b(e,0),b(t,1)]}),(0,N.jsx)(L,{label:r(`comparison.duration`),a:P(e.durationMs),b:P(t.durationMs),highlight:n}),(0,N.jsx)(L,{label:r(`comparison.cost`),a:F(e.totalCostUsd),b:F(t.totalCostUsd),highlight:a}),(0,N.jsx)(L,{label:r(`comparison.tokensOut`),a:I(e.tokensOut),b:I(t.tokensOut),highlight:o}),(0,N.jsx)(L,{label:r(`comparison.tokensIn`),a:I(e.tokensIn),b:I(t.tokensIn),highlight:null}),(0,N.jsx)(L,{label:r(`comparison.cacheRead`),a:I(e.tokensCacheRead),b:I(t.tokensCacheRead),highlight:null}),(0,N.jsx)(L,{label:r(`comparison.model`),a:e.model??`—`,b:t.model??`—`,highlight:null}),(0,N.jsx)(L,{label:r(`comparison.phasesDone`),a:e.phasesCompleted.length>0?e.phasesCompleted.join(`, `):`—`,b:t.phasesCompleted.length>0?t.phasesCompleted.join(`, `):`—`,highlight:null})]})})(),i&&(0,N.jsx)(`p`,{className:`text-[10px] text-muted-foreground/60 text-center`,children:r(`comparison.betterValueHint`)})]}),(0,N.jsx)(u,{handles:_})]})}var z={running:{variant:`running`,labelKey:`statusLabel.running`,tooltipKey:`statusTooltip.running`},completed:{variant:`success`,labelKey:`statusLabel.done`,tooltipKey:`statusTooltip.completed`},failed:{variant:`failed`,labelKey:`statusLabel.failed`,tooltipKey:`statusTooltip.failed`},canceled:{variant:`canceled`,labelKey:`statusLabel.canceled`,tooltipKey:`statusTooltip.canceled`},queued:{variant:`queued`,labelKey:`statusLabel.queued`,tooltipKey:`statusTooltip.queuedToRun`},zombie_terminated:{variant:`failed`,labelKey:`statusLabel.zombie`,tooltipKey:`statusTooltip.zombie`},skipped:{variant:`warning`,labelKey:`statusLabel.skipped`,tooltipKey:`statusTooltip.skipped`}},oe=[`running`,`completed`,`failed`,`canceled`,`zombie_terminated`,`queued`,`skipped`],B={critical:{className:`bg-red-500/15 aurora-light:bg-destructive/10 text-red-400 aurora-light:text-destructive border-red-500/30 aurora-light:border-destructive/30`,labelKey:`recent.priority.critical`},high:{className:`bg-orange-500/15 aurora-light:bg-accent-warning/10 text-orange-400 aurora-light:text-accent-warning border-orange-500/30 aurora-light:border-accent-warning/30`,labelKey:`recent.priority.high`},normal:{className:``,labelKey:`recent.priority.normal`},low:{className:`bg-gray-500/15 aurora-light:bg-muted text-gray-400 aurora-light:text-muted-foreground border-gray-500/30 aurora-light:border-border`,labelKey:`recent.priority.low`}};function se(e){return e==null||e===0?null:e<.01?`$${e.toFixed(4)}`:`$${e.toFixed(3)}`}function ce(e,t){if(!t)return null;let n=new Date(t).getTime()-new Date(e).getTime();if(n<0)return null;let r=Math.round(n/1e3);if(r<60)return`${r}s`;let i=Math.floor(r/60),a=r%60;return i<60?`${i}m ${a}s`:`${Math.floor(i/60)}h ${i%60}m`}function le(e){return e==null||e===0?null:e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function ue(e){try{return D(new Date(e),{addSuffix:!0,locale:x()})}catch{return e}}var V=10;function H({jobs:e,isLoading:t,onJobsCleared:n,onProposalClick:a,onProposalDelete:m}){let{t:y}=S(`jobs`),x=ee(),{activeProjectId:te,projects:E}=s(),D=E.find(e=>e.id===te)?.provider,[O,k]=(0,M.useState)(null),[A,j]=(0,M.useState)(``),[P,F]=(0,M.useState)(``),[I,L]=(0,M.useState)(!1),[R,H]=(0,M.useState)(``),[U,W]=(0,M.useState)(``),[G,de]=(0,M.useState)(!1),[K,q]=(0,M.useState)(null),[J,fe]=(0,M.useState)(V),[Y,pe]=(0,M.useState)(!1),[X,Z]=(0,M.useState)([]),[me,Q]=(0,M.useState)(null),{panelRef:he,panelStyle:ge,headerHandleProps:_e,resizeHandles:ve,isFloating:ye,guardBackdrop:be}=g();(0,M.useEffect)(()=>{fe(V)},[e.length]);function xe(){pe(e=>!e),Z([])}function Se(e){Z(t=>{if(t.includes(e))return t.filter(t=>t!==e);if(t.length>=2)return t;let n=[...t,e];return n.length===2&&Q(n),n})}let $=e.filter(e=>!(O&&e.status!==O||A&&e.started_at<A||P&&e.started_at>`${P}T23:59:59`)),Ce=e.filter(e=>!(R&&e.started_at<R||U&&e.started_at>`${U}T23:59:59`)).length;async function we(e){de(!0);try{let t={};e===`range`&&(R&&(t.from=R),U&&(t.to=U));let r=await fetch(`${T()}/jobs`,{method:`DELETE`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)});if(r.ok){let e=await r.json();C.success(y(`recent.toast.cleared`,{count:e.deleted})),L(!1),H(``),W(``),n?.()}else C.error(y(`recent.toast.clearFailed`))}catch{C.error(y(`recent.toast.networkError`))}finally{de(!1)}}return t?(0,N.jsx)(`div`,{className:`rounded-lg border border-border/40 bg-card/50 p-4 space-y-1`,children:[0,1,2].map(e=>(0,N.jsx)(`div`,{className:`h-9 bg-muted/30 rounded-md animate-pulse`},e))}):e.length===0?(0,N.jsxs)(`div`,{className:`rounded-lg border border-dashed border-border/40 bg-card/50 p-8 text-center space-y-2`,children:[(0,N.jsx)(v,{className:`w-8 h-8 text-muted-foreground/30 mx-auto`}),(0,N.jsx)(`p`,{className:`text-sm font-medium text-muted-foreground`,children:y(`recent.emptyTitle`)}),(0,N.jsx)(`p`,{className:`text-xs text-muted-foreground/60`,children:y(`recent.emptyDescription`)})]}):(0,N.jsxs)(`div`,{className:`rounded-lg border border-border/40 bg-card/50 p-4 space-y-2`,children:[(0,N.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,N.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,N.jsx)(`button`,{type:`button`,onClick:()=>k(null),className:`px-2 py-0.5 rounded text-[10px] font-medium transition-colors ${O===null?`bg-accent text-foreground`:`text-muted-foreground hover:text-foreground hover:bg-accent/50`}`,children:y(`recent.filterAll`,{count:e.length})}),oe.map(t=>{let n=e.filter(e=>e.status===t).length;return n===0?null:(0,N.jsx)(`button`,{type:`button`,onClick:()=>k(O===t?null:t),className:`px-2 py-0.5 rounded text-[10px] font-medium capitalize transition-colors ${O===t?`bg-accent text-foreground`:`text-muted-foreground hover:text-foreground hover:bg-accent/50`}`,children:y(`recent.filterStatus`,{status:y(`statusName.${t}`),count:n})},t)})]}),(0,N.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,N.jsx)(`input`,{type:`date`,value:A,onChange:e=>j(e.target.value),className:`h-6 rounded border border-border bg-input px-1.5 text-[10px] text-foreground`,title:y(`recent.fromDate`)}),(0,N.jsx)(`input`,{type:`date`,value:P,onChange:e=>F(e.target.value),className:`h-6 rounded border border-border bg-input px-1.5 text-[10px] text-foreground`,title:y(`recent.toDate`)}),(A||P)&&(0,N.jsx)(`button`,{type:`button`,onClick:()=>{j(``),F(``)},className:`text-[10px] text-muted-foreground hover:text-foreground transition-colors`,children:y(`recent.clear`)}),(0,N.jsxs)(_,{children:[(0,N.jsx)(p,{asChild:!0,children:(0,N.jsx)(o,{variant:`ghost`,size:`sm`,className:`h-6 w-6 p-0 transition-colors ${Y?`text-foreground bg-accent`:`text-muted-foreground hover:text-foreground`}`,onClick:xe,children:(0,N.jsx)(ie,{className:`w-3.5 h-3.5`})})}),(0,N.jsx)(r,{children:y(Y?`recent.exitCompareMode`:`recent.compareTwoJobs`)})]}),(0,N.jsxs)(_,{children:[(0,N.jsx)(p,{asChild:!0,children:(0,N.jsx)(o,{variant:`ghost`,size:`sm`,className:`h-6 w-6 p-0 text-muted-foreground hover:text-destructive`,onClick:()=>L(!0),children:(0,N.jsx)(l,{className:`w-3.5 h-3.5`})})}),(0,N.jsx)(r,{children:y(`recent.clearJobs`)})]})]})]}),Y&&(0,N.jsxs)(`div`,{className:`flex items-center justify-between rounded-md bg-accent/40 px-3 py-1.5 text-[10px] text-muted-foreground`,children:[(0,N.jsxs)(`span`,{children:[X.length===0&&y(`recent.selectTwoToCompare`),X.length===1&&y(`recent.selectOneMore`),X.length===2&&y(`recent.readyToCompare`)]}),X.length===2&&(0,N.jsx)(`button`,{type:`button`,className:`text-[10px] font-medium text-foreground hover:underline`,onClick:()=>Q(X),children:y(`recent.compareAction`)})]}),(0,N.jsxs)(`div`,{className:`flex items-center gap-3 px-3 py-1 text-[10px] font-medium text-muted-foreground uppercase tracking-wider`,children:[(0,N.jsx)(`span`,{className:`w-14`,children:y(`recent.colStatus`)}),(0,N.jsx)(`span`,{className:`flex-1 min-w-0`,children:y(`recent.colCommand`)}),(0,N.jsxs)(`div`,{className:`flex items-center gap-3 shrink-0`,children:[(0,N.jsx)(`span`,{className:`w-14 text-right`,children:y(`recent.colDuration`)}),(0,N.jsx)(`span`,{className:`w-12 text-right`,children:y(`recent.colTokens`)}),(0,N.jsx)(`span`,{className:`w-12 text-right`,children:y(`recent.colCost`)}),(0,N.jsx)(`span`,{className:`w-20 text-right`,children:y(`recent.colStarted`)})]})]}),(0,N.jsx)(`div`,{className:`space-y-0.5`,children:$.slice(0,J).map(e=>{let t=z[e.status]??z.queued,n=se(e.total_cost_usd),i=ce(e.started_at,e.finished_at),o=le((e.tokens_in??0)+(e.tokens_out??0)+(e.tokens_cache_read??0)+(e.tokens_cache_create??0)||null),s=e.id.startsWith(`proposal:`),c=s?e.id.replace(`proposal:`,``):null,u=X.includes(e.id),d=Y&&!s&&X.length===2&&!u;return(0,N.jsxs)(`div`,{role:`button`,tabIndex:0,className:`flex items-center gap-3 px-3 py-2 rounded-md transition-colors cursor-pointer group ${u?`bg-accent/70 ring-1 ring-border`:d?`opacity-40 cursor-not-allowed`:`hover:bg-accent/50`}`,onClick:()=>{if(Y&&!s){Se(e.id);return}s&&c?a?.(c):x(`/jobs/${e.id}`)},children:[(0,N.jsxs)(_,{children:[(0,N.jsx)(p,{asChild:!0,children:(0,N.jsx)(`div`,{children:(0,N.jsx)(b,{variant:t.variant,children:y(t.labelKey)})})}),(0,N.jsx)(r,{children:y(t.tooltipKey)})]}),e.priority&&e.priority!==`normal`&&(0,N.jsx)(`span`,{className:`inline-flex items-center rounded px-1.5 py-0.5 text-[9px] font-medium border ${B[e.priority].className}`,children:y(B[e.priority].labelKey)}),e.profile_name&&(0,N.jsxs)(_,{children:[(0,N.jsx)(p,{asChild:!0,children:(0,N.jsx)(`span`,{className:`inline-flex items-center rounded px-1.5 py-0.5 text-[9px] font-medium border border-accent-primary/40 bg-accent-primary/10 text-accent-primary/90`,children:e.profile_name})}),(0,N.jsx)(r,{children:y(`recent.profileTooltip`,{name:e.profile_name})})]}),(0,N.jsxs)(`div`,{className:`flex items-center gap-1 flex-1 min-w-0`,children:[e.pipeline_id&&(0,N.jsxs)(_,{children:[(0,N.jsx)(p,{asChild:!0,children:(0,N.jsx)(ne,{className:`w-3 h-3 text-accent-primary/60 shrink-0`})}),(0,N.jsxs)(r,{children:[y(`recent.pipelinePart`),e.depends_on_job_id&&` ${y(`recent.pipelineDependsOn`)}`,e.skip_reason&&` — ${e.skip_reason}`]})]}),(0,N.jsx)(`code`,{className:`text-xs text-foreground/80 truncate`,children:re(e.command,D)})]}),(0,N.jsxs)(`div`,{className:`flex items-center gap-3 text-[10px] text-muted-foreground shrink-0`,children:[(0,N.jsx)(`span`,{className:`w-14 text-right`,children:i??`—`}),(0,N.jsx)(`span`,{className:`w-12 text-right`,children:o?`${o}`:`—`}),(0,N.jsx)(`span`,{className:`w-12 text-right`,children:n??`—`}),(0,N.jsx)(`span`,{className:`w-20 text-right`,children:ue(e.started_at)}),s&&c&&(0,N.jsx)(`button`,{type:`button`,className:`w-4 h-4 md:opacity-0 md:group-hover:opacity-100 text-muted-foreground hover:text-destructive transition-all`,onClick:e=>{e.stopPropagation(),q(c)},title:y(`recent.deleteProposal`),children:(0,N.jsx)(l,{className:`w-3 h-3`})})]})]},e.id)})}),$.length>J&&(0,N.jsx)(`div`,{className:`pt-1 text-center`,children:(0,N.jsx)(`button`,{type:`button`,onClick:()=>fe(e=>e+V),className:`text-[10px] text-muted-foreground hover:text-foreground transition-colors px-3 py-1 rounded hover:bg-accent/50`,children:y(`recent.loadMore`,{count:$.length-J})})}),I&&(0,N.jsxs)(`div`,{className:`fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm`,onClick:be(()=>L(!1)),children:[(0,N.jsxs)(`div`,{ref:he,className:`w-80 rounded-xl border border-border/30 bg-popover p-4 shadow-lg space-y-4`,onClick:e=>e.stopPropagation(),style:ge,children:[(0,N.jsxs)(`div`,{..._e,className:ye?`cursor-grab active:cursor-grabbing`:void 0,children:[(0,N.jsx)(`h3`,{className:`text-sm font-semibold`,children:y(`recent.clearModal.title`)}),(0,N.jsx)(`p`,{className:`text-xs text-muted-foreground mt-0.5`,children:y(`recent.clearModal.jobsInHistory`,{count:e.length})})]}),(0,N.jsx)(o,{variant:`destructive`,size:`sm`,className:`w-full`,disabled:G,onClick:()=>we(`all`),children:y(`recent.clearModal.clearAll`,{count:e.length})}),(0,N.jsxs)(`div`,{className:`space-y-2`,children:[(0,N.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:y(`recent.clearModal.orByRange`)}),(0,N.jsxs)(`div`,{className:`flex gap-2`,children:[(0,N.jsx)(`input`,{type:`date`,value:R,onChange:e=>H(e.target.value),className:`flex-1 h-7 rounded-md border border-border bg-input px-2 text-xs text-foreground`,placeholder:y(`recent.clearModal.fromPlaceholder`)}),(0,N.jsx)(`input`,{type:`date`,value:U,onChange:e=>W(e.target.value),className:`flex-1 h-7 rounded-md border border-border bg-input px-2 text-xs text-foreground`,placeholder:y(`recent.clearModal.toPlaceholder`)})]}),(0,N.jsx)(o,{variant:`outline`,size:`sm`,className:`w-full`,disabled:G||!R&&!U,onClick:()=>we(`range`),children:R||U?y(`recent.clearModal.clearInRange`,{count:Ce}):y(`recent.clearModal.clearRange`)})]}),(0,N.jsx)(o,{variant:`ghost`,size:`sm`,className:`w-full`,onClick:()=>L(!1),children:y(`common:actions.cancel`)})]}),(0,N.jsx)(u,{handles:ve})]}),(0,N.jsx)(w,{open:K!==null,onOpenChange:e=>!e&&q(null),children:(0,N.jsxs)(d,{className:`max-w-sm`,children:[(0,N.jsxs)(i,{children:[(0,N.jsx)(c,{children:y(`recent.deleteProposalConfirm.title`)}),(0,N.jsx)(f,{children:y(`recent.deleteProposalConfirm.description`)})]}),(0,N.jsxs)(h,{children:[(0,N.jsx)(o,{variant:`ghost`,size:`sm`,onClick:()=>q(null),children:y(`common:actions.cancel`)}),(0,N.jsx)(o,{variant:`destructive`,size:`sm`,onClick:()=>{K&&m?.(K),q(null)},children:y(`common:actions.delete`)})]})]})}),me&&(0,N.jsx)(ae,{jobIds:me,onClose:()=>{Q(null),Z([]),pe(!1)}})]})}function U(){let{t:e}=S(`jobs`),{activeProjectId:t}=s(),{recentJobs:n}=te(t),{data:r,isFirstLoad:a,refresh:l}=y({namespace:`jobs`,projectId:t,initialValue:n,fetcher:async()=>{let e=await fetch(`${T()}/jobs?limit=10`);return e.ok?(await e.json()).jobs:[]},pollInterval:1e4}),{data:u}=y({namespace:`proposals`,projectId:t,initialValue:[],fetcher:async()=>{let e=await fetch(`${T()}/propose?limit=10`);return e.ok?(await e.json()).proposals:[]},pollInterval:1e4}),f={input:`queued`,exploring:`running`,review:`running`,refining:`running`,creating_issue:`running`,created:`completed`,cancelled:`canceled`},p=u.map(e=>({id:`proposal:${e.id}`,command:`/specrails:propose-feature ${e.idea.length>60?e.idea.slice(0,57)+`...`:e.idea}`,started_at:e.created_at,status:f[e.status]??`queued`})),m=[...r,...p].sort((e,t)=>new Date(t.started_at).getTime()-new Date(e.started_at).getTime()),[g,_]=(0,M.useState)(null),v=(0,M.useCallback)(async e=>{try{let t=await fetch(`${T()}/propose/${e}`);if(!t.ok)return;_((await t.json()).proposal)}catch{}},[]),x=(0,M.useCallback)(async t=>{try{(await fetch(`${T()}/propose/${t}`,{method:`DELETE`})).ok&&(C.success(e(`page.proposalDeleted`)),l())}catch{}},[l,e]);return(0,N.jsxs)(`div`,{className:`max-w-4xl mx-auto px-4 py-6`,children:[(0,N.jsxs)(`div`,{className:`flex items-center justify-between mb-4`,children:[(0,N.jsx)(`h1`,{className:`text-sm font-semibold`,children:e(`page.title`)}),(0,N.jsx)(j,{baseUrl:`${T()}/jobs/export`,label:e(`page.exportJobs`)})]}),(0,N.jsx)(H,{jobs:m,isLoading:a,onJobsCleared:l,onProposalClick:v,onProposalDelete:x}),(0,N.jsx)(w,{open:g!==null,onOpenChange:e=>!e&&_(null),children:(0,N.jsx)(d,{className:`max-w-3xl glass-card`,children:g&&(0,N.jsxs)(N.Fragment,{children:[(0,N.jsx)(i,{children:(0,N.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,N.jsx)(c,{className:`flex-1 min-w-0`,children:e(`page.proposal.title`)}),(0,N.jsx)(b,{variant:g.status===`created`?`success`:g.status===`cancelled`?`destructive`:`secondary`,children:g.status})]})}),(0,N.jsx)(`div`,{className:`text-xs text-muted-foreground bg-muted/20 rounded px-2 py-1 italic`,children:g.idea}),g.result_markdown?(0,N.jsx)(`div`,{className:`max-h-[400px] overflow-y-auto rounded-lg px-3 py-2 text-xs bg-muted/40`,children:(0,N.jsx)(`div`,{className:`prose prose-invert prose-xs max-w-none prose-p:my-1 prose-headings:mt-2 prose-headings:mb-1 prose-headings:text-sm prose-headings:font-semibold prose-ul:my-1 prose-ol:my-1 prose-li:my-0 prose-code:text-cyan-300 prose-code:text-[10px] prose-code:bg-muted/40 prose-code:px-1 prose-code:py-0.5 prose-code:rounded text-foreground/80`,children:(0,N.jsx)(A,{remarkPlugins:[O],children:g.result_markdown})})}):(0,N.jsx)(`p`,{className:`text-xs text-muted-foreground py-4 text-center`,children:e(`page.proposal.noContent`)}),g.issue_url&&(0,N.jsxs)(`div`,{className:`text-xs`,children:[e(`page.proposal.githubIssue`),` `,(0,N.jsx)(`a`,{href:g.issue_url,target:`_blank`,rel:`noopener noreferrer`,className:`text-accent-primary hover:underline`,children:g.issue_url})]}),(0,N.jsxs)(h,{children:[(0,N.jsx)(o,{variant:`destructive`,size:`sm`,onClick:()=>{x(g.id),_(null)},children:e(`common:actions.delete`)}),(0,N.jsx)(o,{variant:`ghost`,size:`sm`,onClick:()=>_(null),children:e(`common:actions.close`)})]})]})})})]})}export{U as default};
|