specrails-desktop 2.2.0 → 2.3.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.
Files changed (63) hide show
  1. package/client/dist/assets/ActivityFeedPage-3Veccrvk.js +1 -0
  2. package/client/dist/assets/AgentsPage-2mFPghP4.js +86 -0
  3. package/client/dist/assets/{AnalyticsPage-D6LE6wG2.js → AnalyticsPage-Dyyz1ht3.js} +1 -1
  4. package/client/dist/assets/{BarChart-B366kDEj.js → BarChart-CMdLa6Es.js} +2 -2
  5. package/client/dist/assets/CodePage-D7Xwjhut.js +2 -0
  6. package/client/dist/assets/{DesktopAnalyticsPage-DG5LA_WO.js → DesktopAnalyticsPage-CTNwb639.js} +1 -1
  7. package/client/dist/assets/{DocsDialog-ChQ1oXLC.js → DocsDialog-D8yoyZDD.js} +2 -2
  8. package/client/dist/assets/{DocsPage-BfGH8NUf.js → DocsPage-CeO-fAxy.js} +2 -2
  9. package/client/dist/assets/{ExportDropdown-9tRrlfM7.js → ExportDropdown-DuoZcdYN.js} +1 -1
  10. package/client/dist/assets/{IntegrationsPage-DANIzihd.js → IntegrationsPage-iIZ0UEzf.js} +3 -3
  11. package/client/dist/assets/JobDetailPage-DgJHAH2m.js +16 -0
  12. package/client/dist/assets/JobsPage-Bv_RpRAE.js +1 -0
  13. package/client/dist/assets/code-BtsmPQLV.js +1 -0
  14. package/client/dist/assets/code-CY85RXZU.js +1 -0
  15. package/client/dist/assets/code-Coa8f2Sh.js +1 -0
  16. package/client/dist/assets/code-D1z-YDt-.js +1 -0
  17. package/client/dist/assets/code-DDU0CRS0.js +1 -0
  18. package/client/dist/assets/code-L35Loak_.js +1 -0
  19. package/client/dist/assets/code-g0qFMzyg.js +1 -0
  20. package/client/dist/assets/code-zCwBt3Uu.js +1 -0
  21. package/client/dist/assets/{dist-js-BvQ52Q67.js → dist-js-4UEGaKhD.js} +1 -1
  22. package/client/dist/assets/{dist-js-XEilFTNz.js → dist-js-H6hyhSuv.js} +1 -1
  23. package/client/dist/assets/{index-CNiaj7Sj.js → index-CGHKpC-N.js} +13 -13
  24. package/client/dist/assets/index-D17R4Cjc.css +2 -0
  25. package/client/dist/assets/{lib-DZJmnErt.js → lib-Cs5FrUJI.js} +1 -1
  26. package/client/dist/assets/{useProjectCache-H0T8Ot9j.js → useProjectCache-BZWYV-w-.js} +1 -1
  27. package/client/dist/index.html +3 -3
  28. package/package.json +1 -1
  29. package/server/dist/agent-refine-manager.js +128 -153
  30. package/server/dist/chat-manager.js +246 -0
  31. package/server/dist/code-explorer-router.js +78 -0
  32. package/server/dist/command-resolver.js +17 -0
  33. package/server/dist/contract-refine-runner.js +42 -10
  34. package/server/dist/db.js +6 -0
  35. package/server/dist/desktop-db.js +3 -0
  36. package/server/dist/explore-stdin-session.js +129 -0
  37. package/server/dist/mobile/mobile-auth.js +16 -0
  38. package/server/dist/project-router-chat.js +218 -0
  39. package/server/dist/project-router-helpers.js +275 -0
  40. package/server/dist/project-router-jobs.js +389 -0
  41. package/server/dist/project-router-settings.js +312 -0
  42. package/server/dist/project-router-setup.js +456 -0
  43. package/server/dist/project-router-spending.js +320 -0
  44. package/server/dist/project-router-terminals.js +312 -0
  45. package/server/dist/project-router-tickets.js +1767 -0
  46. package/server/dist/project-router.js +27 -3943
  47. package/server/dist/providers/claude-adapter.js +58 -17
  48. package/server/dist/providers/codex-adapter.js +6 -0
  49. package/server/dist/spawn-lifecycle.js +117 -0
  50. package/client/dist/assets/ActivityFeedPage-BupGdGjj.js +0 -1
  51. package/client/dist/assets/AgentsPage-F3xksiLd.js +0 -86
  52. package/client/dist/assets/CodePage-DLwCJgQ0.js +0 -2
  53. package/client/dist/assets/JobDetailPage-1RtejIOB.js +0 -16
  54. package/client/dist/assets/JobsPage-NuDf5Zbx.js +0 -1
  55. package/client/dist/assets/code-AL1rVIMb.js +0 -1
  56. package/client/dist/assets/code-C0BKpkht.js +0 -1
  57. package/client/dist/assets/code-C0FTS3ew.js +0 -1
  58. package/client/dist/assets/code-CPcHxzxw.js +0 -1
  59. package/client/dist/assets/code-D3ryDniw.js +0 -1
  60. package/client/dist/assets/code-D3zVVQTj.js +0 -1
  61. package/client/dist/assets/code-PCmfS3dn.js +0 -1
  62. package/client/dist/assets/code-exI0G5Wd.js +0 -1
  63. package/client/dist/assets/index-DgFfrrTX.css +0 -2
@@ -1,16 +0,0 @@
1
- import{r as e}from"./chunk-CilyBKbf.js";import{A as t,B as n,K as r,Kt as i,L as a,Mt as o,Nt as s,O as c,Qt as l,St as u,Xt as d,Zt as f,_ as p,a as m,at as h,bt as g,c as _,ct as v,d as y,f as b,it as x,jt as S,k as C,l as w,lt as T,nt as E,ot as D,qt as O,tn as k,tt as ee,ut as A,v as j,vt as M,xt as N,y as P}from"./index-CNiaj7Sj.js";import{t as F}from"./lib-DZJmnErt.js";import{t as te}from"./format-command-CwGuwzGA.js";var I=M(`clock`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 6v6l4 2`,key:`mmk7yg`}]]),L=M(`house`,[[`path`,{d:`M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8`,key:`5wwlr5`}],[`path`,{d:`M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z`,key:`r6nss1`}]]),R=e(k(),1),z=o();function ne({phases:e,phaseDefinitions:n}){return n.length===0?null:(0,z.jsx)(`div`,{className:`flex items-center`,children:n.map((r,i)=>{let a=e[r.key]??`idle`,o=i<n.length-1?e[n[i+1].key]??`idle`:null;return(0,z.jsxs)(`div`,{className:`flex items-center`,children:[(0,z.jsxs)(p,{children:[(0,z.jsx)(P,{asChild:!0,children:(0,z.jsxs)(`div`,{className:`flex flex-col items-center gap-1.5 cursor-default px-4`,children:[(0,z.jsx)(B,{state:a}),(0,z.jsx)(`span`,{className:t(`text-xs font-medium transition-colors`,a===`running`?`text-blue-400`:a===`done`?`text-emerald-400`:a===`error`?`text-red-400`:`text-muted-foreground/40`),children:r.label})]})}),(0,z.jsxs)(j,{side:`bottom`,className:`max-w-[200px]`,children:[(0,z.jsx)(`p`,{className:`font-medium`,children:r.label}),(0,z.jsx)(`p`,{className:`text-muted-foreground mt-0.5`,children:r.description})]})]}),o!==null&&(0,z.jsx)(`div`,{className:t(`h-px w-12 -mt-5 shrink-0 transition-all duration-300`,o===`done`||a===`done`?`bg-emerald-500/30`:o===`running`?`bg-blue-400/40`:`bg-border/30`)})]},r.key)})})}function B({state:e}){return(0,z.jsxs)(`div`,{className:t(`flex items-center justify-center w-10 h-10 rounded-full transition-all duration-300`,e===`running`?`bg-blue-500/10 ring-1 ring-blue-400/30 animate-pulse`:e===`done`?`bg-emerald-500/10`:e===`error`?`bg-red-500/10`:`bg-muted/20`),children:[e===`running`&&(0,z.jsx)(r,{className:`w-6 h-6 text-blue-400 animate-spin`}),e===`done`&&(0,z.jsx)(D,{className:`w-6 h-6 text-emerald-400`}),e===`error`&&(0,z.jsx)(h,{className:`w-6 h-6 text-red-400`}),e===`idle`&&(0,z.jsx)(x,{className:`w-6 h-6 text-muted-foreground/20`})]})}function V(e,t){let n=(typeof t==`number`?t:new Date(t).getTime())-new Date(e).getTime();if(!Number.isFinite(n)||n<0)return`—`;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 H(e){let t=new Set;for(let n of e)if(n.event_type===`log`)try{let e=(JSON.parse(n.payload).line??``).match(/(?:Writing|Editing|Created?|Updated?)\s+(?:file:\s*)?([\w./\-]+\.\w+)/i);e&&t.add(e[1])}catch{}return Array.from(t).slice(0,20)}var U=new Set([`editing`,`writing`,`reading`,`searching`,`running`]);function W(e){return e.length>40?`${e.slice(0,39)}…`:e}function G(e){return typeof e!=`string`||e.length===0?``:W(e.replace(/\\/g,`/`).split(`/`).filter(Boolean).pop()??``)}function K(e){return typeof e!=`string`||e.length===0?``:W(e.trim().split(/\s+/)[0]??``)}function q(e,t){let n=t??{},r=G(n.file_path??n.path);switch(e){case`Edit`:case`MultiEdit`:case`NotebookEdit`:case`Update`:return{step:!0,actionKey:`editing`,actionArg:r};case`Write`:case`create`:return{step:!0,actionKey:`writing`,actionArg:r};case`Read`:return{step:!0,actionKey:`reading`,actionArg:r};case`Grep`:case`Glob`:case`search`:return{step:!0,actionKey:`searching`,actionArg:W(String(n.pattern??n.query??``))};case`Bash`:case`shell`:return{step:!0,actionKey:`running`,actionArg:K(n.command)};default:return{step:!0,actionKey:`working`}}}function J(e){let t=e.event_type,n={};try{n=JSON.parse(e.payload)}catch{n={}}if(t===`assistant`){let e=n.message?.content;if(Array.isArray(e)){let t=[...e].reverse().find(e=>e?.type===`tool_use`);if(t)return q(t.name,t.input);if(e.some(e=>e?.type===`text`))return{step:!0,actionKey:`thinking`}}return{step:!0}}if(t===`tool_use`)return q(n.name,n.input);if(t===`item.completed`){let e=n.item,t=e?.type;return t===`agent_message`?{step:!0,actionKey:`thinking`}:t===`agent_reasoning`?{step:!0,actionKey:`reasoning`}:t===`function_call`||t===`local_shell_call`||t===`command_execution`?{step:!0,actionKey:`running`,actionArg:K(e?.command)||(typeof e?.name==`string`?W(e.name):``)||(t===`local_shell_call`?`shell`:``)}:{step:!0}}return{step:!1}}var Y={steps:0,actionKey:``,actionArg:``,lastSeenIdx:0};function re(e,t){if(t.type===`reset`)return Y;if(t.type===`consume`){let{events:n}=t;if(n.length<=e.lastSeenIdx)return e;let{steps:r,actionKey:i,actionArg:a}=e;for(let t=e.lastSeenIdx;t<n.length;t++){let e=J(n[t]);e.step&&(r+=1),e.actionKey&&(i=e.actionKey,a=e.actionArg??``)}return{steps:r,actionKey:i,actionArg:a,lastSeenIdx:n.length}}return e}function ie({job:e,events:n,defaultOpen:i=!0,pipelineTotals:a,phases:o,phaseDefinitions:s}){let{t:c}=O(`jobs`),[l,u]=(0,R.useState)(i),d=(0,R.useMemo)(()=>H(n),[n]),f=e.status===`running`,p=e.status===`completed`,[m,g]=(0,R.useState)(()=>Date.now());(0,R.useEffect)(()=>{if(!f)return;let e=window.setInterval(()=>g(Date.now()),1e3);return()=>window.clearInterval(e)},[f]);let[_,v]=(0,R.useReducer)(re,Y),y=(0,R.useRef)(e.id);(0,R.useEffect)(()=>{y.current!==e.id&&(y.current=e.id,v({type:`reset`})),v({type:`consume`,events:n})},[e.id,n]);let[b,x]=(0,R.useState)(!0);(0,R.useEffect)(()=>{if(!f)return;x(!0);let e=window.setTimeout(()=>x(!1),8e3);return()=>window.clearTimeout(e)},[f,e.id]);let S=e.finished_at?V(e.started_at,e.finished_at):f?V(e.started_at,m):`—`,C=!!e.total_cost_usd_estimated,w=e.total_cost_usd==null?null:`${C?`~`:``}$${e.total_cost_usd.toFixed(4)}`,T=e.num_turns==null?null:String(e.num_turns),E=e.tokens_in==null?null:(e.tokens_in??0)+(e.tokens_out??0)+(e.tokens_cache_read??0)+(e.tokens_cache_create??0),k=E==null?null:`${(E/1e3).toFixed(1)}k`,ee=(0,R.useMemo)(()=>!o||!s?null:s.find(e=>o[e.key]===`running`)?.label??null,[o,s]),j=f&&_.steps===0?`connecting`:_.actionKey||`thinking`,M=U.has(j)?c(`statusPanel.activity.${j}`,{arg:_.actionArg}):c(`statusPanel.activity.${j}`),N=ee??(f&&_.steps===0?c(`statusPanel.activity.starting`):null),P=_.steps>0?c(`statusPanel.steps`,{count:_.steps}):null,F=c(f?`statusPanel.inProgress`:p?`statusPanel.completed`:`statusPanel.failed`),te=f?`border-accent-info/20 bg-accent-info/5`:p?`border-emerald-500/20 bg-emerald-500/5`:`border-red-500/20 bg-red-500/5`,I=f?r:p?D:h,L=f?`w-4 h-4 text-accent-info shrink-0 animate-spin`:p?`w-4 h-4 text-emerald-400 shrink-0`:`w-4 h-4 text-red-400 shrink-0`;return(0,z.jsxs)(`div`,{className:t(`mx-4 my-2 rounded-xl border transition-colors duration-500`,te),children:[(0,z.jsxs)(`button`,{type:`button`,onClick:()=>u(!l),className:`w-full flex items-center gap-3 px-4 py-3`,children:[(0,z.jsx)(I,{className:L,"aria-hidden":`true`}),(0,z.jsx)(`span`,{className:`text-sm font-semibold flex-1 text-left`,children:F}),(0,z.jsxs)(`div`,{className:`flex items-center gap-3 text-[11px] text-muted-foreground`,children:[(0,z.jsx)(`span`,{className:`tabular-nums`,children:S}),f?P&&(0,z.jsx)(`span`,{className:`tabular-nums`,children:P}):(0,z.jsxs)(z.Fragment,{children:[w&&(0,z.jsx)(`span`,{className:`tabular-nums text-yellow-400`,children:w}),d.length>0&&(0,z.jsx)(`span`,{children:c(`statusPanel.filesCount`,{count:d.length})})]})]}),(0,z.jsx)(A,{className:t(`w-4 h-4 text-muted-foreground/40 transition-transform duration-150 shrink-0`,l&&`rotate-180`)})]}),l&&(0,z.jsx)(`div`,{className:`px-4 pb-4 space-y-3 border-t border-border/20`,children:f?(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(`p`,{className:`pt-3 text-[10px] text-muted-foreground/50 uppercase tracking-wider`,children:c(`statusPanel.zoneInProgress`)}),(0,z.jsxs)(`div`,{className:`flex flex-col sm:flex-row gap-3 sm:items-stretch`,children:[(0,z.jsxs)(`div`,{className:`bg-muted/20 rounded-lg px-3 py-2 sm:w-44 shrink-0`,children:[(0,z.jsxs)(`p`,{className:`flex items-center gap-1.5 text-[10px] text-muted-foreground/50 uppercase tracking-wider`,children:[c(`statusPanel.duration`),(0,z.jsx)(`span`,{className:`inline-block w-1.5 h-1.5 rounded-full bg-accent-info animate-pulse`,title:c(`statusPanel.liveTooltip`),"aria-label":c(`statusPanel.liveTooltip`)})]}),(0,z.jsx)(`p`,{className:`text-sm font-semibold tabular-nums mt-0.5 text-accent-info`,children:S})]}),(0,z.jsxs)(`div`,{className:`flex-1 flex items-center gap-2 bg-muted/10 rounded-lg px-3 py-2 min-w-0`,children:[(0,z.jsx)(r,{className:`w-3.5 h-3.5 text-accent-info shrink-0 animate-spin`,"aria-hidden":`true`}),N&&(0,z.jsx)(`span`,{className:`text-[11px] font-medium px-1.5 py-0.5 rounded bg-accent-info/15 text-accent-info shrink-0`,children:N}),(0,z.jsx)(`span`,{className:`text-xs text-muted-foreground truncate flex-1 min-w-0`,children:M}),P&&(0,z.jsxs)(`span`,{className:`text-[11px] text-muted-foreground/60 tabular-nums shrink-0`,children:[`· `,P]})]})]}),b&&(0,z.jsx)(`p`,{className:`text-[11px] text-muted-foreground/40 leading-snug`,children:c(`statusPanel.explainer`)}),(0,z.jsx)(`p`,{className:`pt-1 text-[10px] text-muted-foreground/50 uppercase tracking-wider border-t border-accent-info/10 mt-1`,children:c(`statusPanel.zoneFinalPending`)}),(0,z.jsxs)(`div`,{className:`grid grid-cols-3 gap-2`,children:[(0,z.jsx)(Q,{label:c(`statusPanel.cost`),caption:c(`statusPanel.pendingCaption`),tooltip:c(`statusPanel.costTooltip`)}),(0,z.jsx)(Q,{label:c(`statusPanel.turns`),caption:c(`statusPanel.pendingCaption`),tooltip:c(`statusPanel.pendingTooltip`)}),(0,z.jsx)(Q,{label:c(`statusPanel.tokens`),caption:c(`statusPanel.pendingCaption`),tooltip:c(`statusPanel.pendingTooltip`)})]})]}):(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(`p`,{className:`pt-3 text-[10px] text-muted-foreground/50 uppercase tracking-wider`,children:c(`statusPanel.zoneFinal`)}),(0,z.jsxs)(`div`,{className:`grid grid-cols-2 sm:grid-cols-4 gap-2`,children:[(0,z.jsx)(X,{label:c(`statusPanel.duration`),value:S}),(0,z.jsx)(Z,{label:c(`statusPanel.cost`),value:w,valueClass:`text-yellow-400`,naCaption:c(`statusPanel.notAvailable`)}),(0,z.jsx)(Z,{label:c(`statusPanel.turns`),value:T,naCaption:c(`statusPanel.notAvailable`)}),(0,z.jsx)(Z,{label:c(`statusPanel.tokens`),value:k,naCaption:c(`statusPanel.notAvailable`)})]}),a&&(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`p`,{className:`text-[10px] text-muted-foreground/50 uppercase tracking-wider mb-1.5`,children:c(`statusPanel.pipelineTotal`,{count:a.jobCount})}),(0,z.jsxs)(`div`,{className:`grid grid-cols-2 gap-2`,children:[(0,z.jsx)(X,{label:c(`statusPanel.totalCost`),value:`$${a.totalCostUsd.toFixed(4)}`,valueClass:`text-yellow-400`}),(0,z.jsx)(X,{label:c(`statusPanel.totalTokens`),value:`${((a.totalTokensIn+a.totalTokensOut+a.totalTokensCacheRead+a.totalTokensCacheCreate)/1e3).toFixed(1)}k`})]})]}),d.length>0&&(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`p`,{className:`text-[10px] text-muted-foreground/50 uppercase tracking-wider mb-1.5`,children:c(`statusPanel.filesModified`)}),(0,z.jsx)(`div`,{className:`flex flex-wrap gap-1.5`,children:d.map(e=>(0,z.jsx)(`code`,{className:`text-[10px] font-mono bg-muted/30 px-2 py-0.5 rounded text-cyan-400/80`,children:e},e))})]})]})})]})}function X({label:e,value:n,valueClass:r}){return(0,z.jsxs)(`div`,{className:`bg-muted/20 rounded-lg px-3 py-2`,children:[(0,z.jsx)(`p`,{className:`text-[10px] text-muted-foreground/50 uppercase tracking-wider`,children:e}),(0,z.jsx)(`p`,{className:t(`text-sm font-semibold tabular-nums mt-0.5`,r),children:n})]})}function Z({label:e,value:n,valueClass:r,naCaption:i}){return(0,z.jsxs)(`div`,{className:`bg-muted/20 rounded-lg px-3 py-2`,children:[(0,z.jsx)(`p`,{className:`text-[10px] text-muted-foreground/50 uppercase tracking-wider`,children:e}),(0,z.jsx)(`p`,{className:t(`text-sm font-semibold tabular-nums mt-0.5`,n==null?`text-muted-foreground`:r),children:n??`—`}),n==null&&(0,z.jsx)(`p`,{className:`text-[10px] text-muted-foreground/30 mt-0.5`,children:i})]})}function Q({label:e,caption:t,tooltip:n}){return(0,z.jsxs)(`div`,{className:`bg-muted/20 rounded-lg px-3 py-2 ring-1 ring-accent-info/10`,title:n,children:[(0,z.jsxs)(`p`,{className:`flex items-center gap-1 text-[10px] text-muted-foreground/50 uppercase tracking-wider`,children:[e,(0,z.jsx)(I,{className:`w-2.5 h-2.5 text-muted-foreground/30`,"aria-hidden":`true`})]}),(0,z.jsx)(`p`,{className:`text-sm font-semibold tabular-nums mt-0.5 text-muted-foreground/40`,children:`—`}),(0,z.jsx)(`p`,{className:`text-[10px] text-muted-foreground/30 mt-0.5`,children:t})]})}var $=4;function ae({tickets:e,onTicketClick:t}){let{t:n}=O(`jobs`),[r,i]=(0,R.useState)(!1);if(e.length===0)return null;let a=e.length>=$&&!r?e.slice(0,1):e,o=e.length-a.length;return(0,z.jsxs)(`div`,{className:`rounded-xl border border-border/40 bg-card/40 px-4 py-3 space-y-1.5`,children:[a.map(e=>(0,z.jsx)(oe,{ticket:e,onClick:()=>t(e.id)},e.id)),o>0&&(0,z.jsxs)(`button`,{type:`button`,onClick:()=>i(!0),className:`flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground transition-colors`,children:[n(`ticketHeader.showMore`,{count:o}),(0,z.jsx)(A,{className:`w-3 h-3`})]}),r&&e.length>=$&&(0,z.jsxs)(`button`,{type:`button`,onClick:()=>i(!1),className:`flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground transition-colors`,children:[n(`ticketHeader.showLess`),(0,z.jsx)(v,{className:`w-3 h-3`})]})]})}function oe({ticket:e,onClick:n}){let{t:r}=O(`jobs`),i=e.title==null,a=`inline-flex items-center px-1.5 py-0.5 rounded-md text-[11px] font-mono tabular-nums shrink-0`;return i?(0,z.jsx)(`div`,{className:`flex items-center gap-2 min-w-0`,children:(0,z.jsx)(`span`,{className:t(a,`text-muted-foreground bg-muted/20 select-none`),title:r(`ticketHeader.deletedTooltip`),children:r(`ticketHeader.deletedTicket`,{id:e.id})})}):(0,z.jsxs)(`button`,{type:`button`,onClick:n,className:`flex items-center gap-2 min-w-0 w-full text-left group`,title:e.title??void 0,children:[(0,z.jsxs)(`span`,{className:t(a,`text-accent-primary bg-accent-primary/10 group-hover:bg-accent-primary/20 transition-colors`),children:[`#`,e.id]}),(0,z.jsx)(`span`,{className:`text-lg font-semibold text-foreground truncate group-hover:text-accent-primary transition-colors`,children:e.title})]})}function se(e){let t=e.trimStart();return!!(/^#{1,6}\s/.test(t)||/^[-*+]\s/.test(t)||/^\d+\.\s/.test(t)||/^\|.+\|/.test(t)||t.startsWith("```")||t.startsWith(`> `)||/\*\*[^*]+\*\*/.test(e)||/`[^`]+`/.test(e)||/\[.+\]\(.+\)/.test(e)||/^(-{3,}|_{3,}|\*{3,})$/.test(t)||/^- \[[ x]\]\s/.test(t))}function ce(e,t){let n=`${e.id??t}`,r=e.timestamp;if(e.event_type===`log`)try{let t=JSON.parse(e.payload).line??``;return t.trim()?t.startsWith(`▸`)||t.match(/^(architect|developer|reviewer|ship|analyst)\s*:/i)?{id:n,content:t,type:`phase`,timestamp:r}:e.source===`stderr`?{id:n,content:t,type:`stderr`,timestamp:r}:se(t)?{id:n,content:t,type:`assistant`,timestamp:r}:{id:n,content:t,type:`plain`,timestamp:r}:null}catch{return null}if(e.event_type!==`log`&&e.event_type!==`result`)return null;if(e.event_type===`result`)try{let t=JSON.parse(e.payload),i=[];return t.duration_ms&&i.push(`${(t.duration_ms/1e3).toFixed(1)}s`),t.total_cost_usd&&i.push(`$${t.total_cost_usd.toFixed(4)}`),t.num_turns&&i.push(u.t(`jobs:logViewer.turns`,{count:t.num_turns})),{id:n,content:`▸ ${u.t(`jobs:logViewer.completed`)}${i.length?` — ${i.join(` · `)}`:``}`,type:`result`,timestamp:r}}catch{return null}return null}function le(e){let t=`none`,n=[];for(let r of e){let e=r.type;if(e!==`plain`&&e!==`log`){t=`none`,n.push(r);continue}let i=r.content;i.startsWith(`--- `)?(t=`saw_minus`,n.push({...r,type:`diff-meta`})):t===`saw_minus`&&i.startsWith(`+++ `)?(t=`active`,n.push({...r,type:`diff-meta`})):t===`active`&&i.startsWith(`@@ `)?n.push({...r,type:`diff-hunk`}):t===`active`&&i.startsWith(`+`)&&!i.startsWith(`+++`)?n.push({...r,type:`diff-add`}):t===`active`&&i.startsWith(`-`)&&!i.startsWith(`---`)?n.push({...r,type:`diff-remove`}):(t===`active`&&(i.startsWith(` `)||i===``)||(t=`none`),n.push(r))}return n}function ue(e){let t=[{key:`__preamble__`,header:null,lines:[]}];for(let n of e)n.type===`phase`?t.push({key:n.id,header:n,lines:[]}):t[t.length-1].lines.push(n);return t.filter(e=>e.header!==null||e.lines.length>0)}function de({events:e,isLoading:t}){let{t:n,i18n:r}=O(`jobs`),[o,s]=(0,R.useState)(``),[c,l]=(0,R.useState)(!0),[u,d]=(0,R.useState)(new Set),f=(0,R.useRef)(null),p=(0,R.useRef)(null),{processedLines:h,groups:g,totalLines:_}=(0,R.useMemo)(()=>{let t=e.map((e,t)=>ce(e,t)).filter(e=>e!==null),n=[];for(let e of t){let t=n.length>0?n[n.length-1]:null;e.type===`assistant`&&t?.type===`assistant`?t.content+=`
2
- `+e.content:n.push({...e})}let r=le(n);return{processedLines:r,groups:ue(r),totalLines:r.length}},[e,r.language]),v=(0,R.useMemo)(()=>{if(!o)return _;let e=o.toLowerCase();return h.filter(t=>t.content.toLowerCase().includes(e)).length},[o,h,_]),y=(0,R.useCallback)(()=>{let e=p.current;e&&(e.scrollTop=e.scrollHeight)},[]);(0,R.useEffect)(()=>{c&&y()},[e.length,c,y]);function b(){let e=p.current;e&&l(e.scrollHeight-e.scrollTop-e.clientHeight<50)}function x(e){d(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})}return t?(0,z.jsx)(`div`,{className:`flex-1 flex items-center justify-center`,children:(0,z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:n(`logViewer.loading`)})}):_===0?(0,z.jsx)(`div`,{className:`flex-1 flex items-center justify-center`,children:(0,z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:n(`logViewer.empty`)})}):(0,z.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,z.jsxs)(`div`,{className:`px-4 py-2 border-b border-border flex items-center gap-2`,children:[(0,z.jsxs)(`div`,{className:`relative flex-1 max-w-xs`,children:[(0,z.jsx)(a,{className:`absolute left-2.5 top-1/2 -translate-y-1/2 w-3 h-3 text-muted-foreground`}),(0,z.jsx)(m,{placeholder:n(`logViewer.filterPlaceholder`),value:o,onChange:e=>s(e.target.value),className:`pl-7 h-7`})]}),(0,z.jsx)(C,{variant:`ghost`,size:`sm`,className:`h-7 px-2 text-muted-foreground/50 hover:text-foreground`,onClick:()=>{let e=h.map(e=>e.content).join(`
3
- `);navigator.clipboard.writeText(e).then(()=>{i.success(n(`logViewer.copySuccess`))}).catch(()=>{i.error(n(`logViewer.copyFailed`))})},children:(0,z.jsx)(E,{className:`w-3.5 h-3.5`})}),(0,z.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:n(`logViewer.lineCount`,{filtered:v,total:_})})]}),(0,z.jsxs)(`div`,{ref:p,className:`flex-1 overflow-y-auto p-2 text-xs relative`,onScroll:b,children:[g.map(e=>(0,z.jsx)(fe,{group:e,filter:o,collapsed:u.has(e.key),onToggle:()=>x(e.key)},e.key)),(0,z.jsx)(`div`,{ref:f})]}),!c&&(0,z.jsxs)(C,{size:`sm`,variant:`secondary`,onClick:()=>{l(!0),y()},className:`absolute bottom-16 right-6 h-7 gap-1 shadow-lg`,children:[(0,z.jsx)(A,{className:`w-3 h-3`}),n(`logViewer.jumpToBottom`)]})]})}var fe=(0,R.memo)(function({group:e,filter:n,collapsed:r,onToggle:i}){let{t:a}=O(`jobs`),o=n?e.lines.filter(e=>e.content.toLowerCase().includes(n.toLowerCase())):e.lines;if(e.header===null)return o.length===0?null:(0,z.jsx)(`div`,{children:o.map((e,t)=>(0,z.jsx)(me,{line:e,even:t%2==0},e.id))});let s=e.header.content;return(0,z.jsxs)(`div`,{className:`mt-3 rounded-md overflow-hidden border border-border/20`,children:[(0,z.jsxs)(`button`,{type:`button`,onClick:i,className:t(`flex items-center gap-2 w-full text-left px-3 py-2`,`bg-primary/5 border-b border-primary/20`,`hover:bg-primary/10 transition-colors duration-150 cursor-pointer`),children:[(0,z.jsx)(T,{className:t(`w-3 h-3 text-primary/60 shrink-0 transition-transform duration-150`,!r&&`rotate-90`)}),(0,z.jsx)(`span`,{className:`flex-1 text-[12px] font-semibold text-foreground leading-none`,children:s}),e.header.timestamp&&(0,z.jsx)(`span`,{className:`text-[10px] text-muted-foreground/40 font-mono tabular-nums shrink-0`,children:new Date(e.header.timestamp).toLocaleTimeString(`en`,{hour:`2-digit`,minute:`2-digit`,second:`2-digit`,hour12:!1})}),(0,z.jsx)(`span`,{className:`text-[10px] text-muted-foreground/40 shrink-0`,children:a(`logViewer.phaseLines`,{count:e.lines.length})})]}),!r&&(0,z.jsx)(`div`,{className:`bg-muted/5`,children:o.length===0?(0,z.jsx)(`p`,{className:`px-4 py-2 text-[10px] text-muted-foreground/40 italic`,children:a(n?`logViewer.noMatchingLines`:`logViewer.noOutput`)}):o.map((e,t)=>(0,z.jsx)(me,{line:e,even:t%2==0},e.id))})]})}),pe=[F],me=(0,R.memo)(function({line:e,even:n}){let r=e.type===`assistant`,i=e.type===`diff-add`,a=e.type===`diff-remove`,o=e.type===`diff-meta`,s=e.type===`diff-hunk`;return(0,z.jsxs)(`div`,{className:t(`flex items-start gap-2 group px-2 py-0.5 rounded-sm`,!(i||a||o||s)&&(n?`bg-muted/20`:`bg-transparent`),e.type===`result`&&`bg-emerald-500/5 border-l-2 border-emerald-500/40 mt-2 py-2`,i&&`bg-emerald-500/8 border-l-2 border-emerald-500/50`,a&&`bg-red-500/8 border-l-2 border-red-500/50`,o&&`bg-accent-primary/5 border-l-2 border-accent-primary/30`,s&&`bg-accent-info/5 border-l-2 border-accent-info/30`),children:[e.timestamp&&(0,z.jsx)(`span`,{className:`text-[10px] text-muted-foreground/40 shrink-0 mt-0.5 w-[52px] font-mono tabular-nums`,children:new Date(e.timestamp).toLocaleTimeString(`en`,{hour:`2-digit`,minute:`2-digit`,second:`2-digit`,hour12:!1})}),r?(0,z.jsx)(`div`,{className:`flex-1 min-w-0 prose prose-invert prose-xs max-w-none
4
- prose-p:my-1 prose-p:leading-relaxed
5
- prose-headings:mt-2 prose-headings:mb-1 prose-headings:text-sm prose-headings:font-semibold
6
- prose-ul:my-1 prose-ol:my-1 prose-li:my-0
7
- prose-code:text-cyan-300 prose-code:text-[11px] prose-code:bg-muted/40 prose-code:px-1 prose-code:py-0.5 prose-code:rounded
8
- prose-pre:my-1 prose-pre:bg-muted/30 prose-pre:rounded-md prose-pre:p-2 prose-pre:text-[11px]
9
- prose-strong:text-foreground prose-em:text-foreground/70
10
- prose-a:text-blue-400 prose-a:no-underline hover:prose-a:underline
11
- prose-table:my-2 prose-table:text-[11px]
12
- prose-thead:border-border prose-thead:bg-muted/30
13
- prose-th:px-3 prose-th:py-1.5 prose-th:text-left prose-th:font-semibold prose-th:text-foreground/90
14
- prose-td:px-3 prose-td:py-1.5 prose-td:border-border
15
- prose-tr:border-border
16
- text-foreground/80`,children:(0,z.jsx)(b,{remarkPlugins:[y],rehypePlugins:pe,children:e.content})}):(0,z.jsx)(`span`,{className:t(`flex-1 break-all leading-relaxed whitespace-pre-wrap font-mono`,e.type===`tool-use`&&`text-cyan-400/80 text-[11px]`,e.type===`stderr`&&`text-orange-400`,e.type===`result`&&`text-emerald-400 font-medium`,e.type===`log`&&`text-foreground/60`,e.type===`plain`&&`text-foreground/70`,e.type===`tool-result`&&`text-muted-foreground/50`,i&&`text-emerald-400`,a&&`text-red-400`,o&&`text-accent-primary/80`,s&&`text-accent-info/80`),children:e.content})]})}),he={running:{variant:`running`,labelKey:`statusLabel.running`,tooltipKey:`statusTooltip.running`},completed:{variant:`success`,labelKey:`statusLabel.completed`,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.queued`}};function ge(){let{t:e}=O(`jobs`),{id:r}=l(),{activeProjectId:a,projects:o}=g(),u=o.find(e=>e.id===a)?.provider,m=f(),{openTicketDetail:h}=_(),[v,y]=(0,R.useState)(null),[b,x]=(0,R.useState)([]),[E,D]=(0,R.useState)([]),[k,A]=(0,R.useState)({}),[M,F]=(0,R.useState)([]),[I,B]=(0,R.useState)(!0),[V,H]=(0,R.useState)(!1);(0,R.useEffect)(()=>{if(!r)return;let e=new AbortController;y(null),x([]),D([]),A({}),B(!0),H(!1);async function t(){try{let t=await fetch(`${s()}/jobs/${r}`,{signal:e.signal});if(t.status===404){H(!0);return}if(!t.ok)throw Error(`Failed to fetch job`);let n=await t.json();y(n.job),x(n.events)}catch(e){if(e.name===`AbortError`)return;H(!0)}finally{e.signal.aborted||B(!1)}}return t(),()=>e.abort()},[r,a]),(0,R.useEffect)(()=>{if(!v?.pipeline_id){F([]);return}let e=v.pipeline_id;fetch(`${s()}/pipelines/${e}`).then(e=>e.ok?e.json():null).then(e=>{e?.jobs&&F(e.jobs)}).catch(()=>{})},[v?.pipeline_id,v?.status]);let U=(0,R.useRef)(a);U.current=a;let W=(0,R.useRef)([]),G=(0,R.useRef)(null),K=(0,R.useCallback)(()=>{G.current=null;let e=W.current;e.length!==0&&(W.current=[],x(t=>{let n=[...t,...e];return n.length>1e4?n.slice(n.length-8e3):n}))},[]);(0,R.useEffect)(()=>()=>{G.current&&cancelAnimationFrame(G.current)},[]);let q=(0,R.useCallback)(e=>{let t=e;if(!(U.current&&t.projectId&&t.projectId!==U.current)){if(t.type===`init`){let e=t.phaseDefinitions??[];D(e);let n={};for(let r of e)n[r.key]=t.phases?.[r.key]??`idle`;A(n)}else if(t.type===`event`&&t.jobId===r){let e={id:Date.now(),job_id:r??``,seq:t.seq??0,event_type:t.event_type,source:t.source,payload:t.payload,timestamp:t.timestamp};W.current.push(e),G.current||=requestAnimationFrame(K)}else if(t.type===`log`&&t.processId===r){let e={id:Date.now(),job_id:r??``,seq:0,event_type:`log`,source:t.source,payload:JSON.stringify({line:t.line}),timestamp:t.timestamp};W.current.push(e),G.current||=requestAnimationFrame(K)}else if(t.type===`phase`){let e=t.phase,n=t.state;A(t=>({...t,[e]:n}))}else if(t.type===`queue`){let e=t.jobs?.find(e=>e.id===r);if(e){let t=e.status;y(e=>e&&{...e,status:t}),(t===`completed`||t===`failed`||t===`canceled`)&&fetch(`${s()}/jobs/${r}`).then(e=>e.json()).then(e=>y(e.job)).catch(()=>{})}}}},[r,K]),{registerHandler:J,unregisterHandler:Y}=S();(0,R.useEffect)(()=>(J(`job-detail-${r}`,q),()=>Y(`job-detail-${r}`)),[r,q,J,Y]),(0,R.useEffect)(()=>{if(!r||!v||v.status!==`running`||v.hasTelemetry)return;let e=setInterval(()=>{fetch(`${s()}/jobs/${r}`).then(e=>e.ok?e.json():null).then(e=>{e?.job?.hasTelemetry&&y(e=>e&&{...e,hasTelemetry:!0})}).catch(()=>{})},8e3);return()=>clearInterval(e)},[r,v?.status,v?.hasTelemetry]);async function re(){if(r)try{let t=await fetch(`${s()}/jobs/${r}`,{method:`DELETE`});if(t.ok)(await t.json()).status===`deleted`?(i.success(e(`detail.toast.jobDeleted`)),m(`/jobs`)):i.success(e(`detail.toast.cancelSignalSent`),{description:e(`detail.toast.cancelSignalSentDescription`)});else{let n=await t.json();i.error(e(`detail.toast.failed`),{description:n.error})}}catch{i.error(e(`detail.toast.networkError`))}}async function X(){if(v)try{let t=await fetch(`${s()}/jobs/${v.id}/diagnostic`);if(!t.ok){let n=await t.json().catch(()=>({}));throw Error(n.error??e(`detail.toast.exportFailedHttp`,{status:t.status}))}let n=await t.blob(),r=URL.createObjectURL(n),i=new Date().toISOString().slice(0,10),a=document.createElement(`a`);a.href=r,a.download=`specrails-diagnostic-${v.id}-${i}.zip`,document.body.appendChild(a),a.click(),a.remove(),URL.revokeObjectURL(r)}catch(t){i.error(e(`detail.toast.exportFailed`),{description:t.message})}}async function Z(){if(v)try{let t=await fetch(`${s()}/spawn`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({command:v.command})}),n=await t.json();if(!t.ok)throw Error(n.error??e(`detail.toast.spawnFailed`));i.success(e(`detail.toast.jobRequeued`)),m(`/jobs/${n.jobId}`)}catch(e){i.error(e.message)}}if(I)return(0,z.jsx)(`div`,{className:`max-w-5xl mx-auto px-4 py-6`,children:(0,z.jsxs)(`div`,{className:`space-y-3`,children:[(0,z.jsx)(`div`,{className:`h-4 w-48 bg-muted/30 rounded animate-pulse`}),(0,z.jsx)(`div`,{className:`h-20 bg-muted/30 rounded-lg animate-pulse`}),(0,z.jsx)(`div`,{className:`h-64 bg-muted/30 rounded-lg animate-pulse`})]})});if(V||!v)return(0,z.jsxs)(`div`,{className:`max-w-5xl mx-auto px-4 py-6 flex flex-col items-center gap-3 mt-12`,children:[(0,z.jsx)(`p`,{className:`text-lg font-semibold`,children:e(`detail.notFound`)}),(0,z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:e(`detail.notFoundDescription`,{id:r})}),(0,z.jsx)(C,{asChild:!0,variant:`outline`,size:`sm`,children:(0,z.jsxs)(d,{to:`/`,children:[(0,z.jsx)(L,{className:`w-3.5 h-3.5 mr-1.5`}),e(`detail.backToDashboard`)]})})]});let Q=he[v.status]??he.queued,$=v.status===`running`,oe=v.status===`completed`||v.status===`failed`,se=(v.tickets?.length??0)>0,ce=M.length>1?{totalCostUsd:M.reduce((e,t)=>e+(t.total_cost_usd??0),0),totalTokensIn:M.reduce((e,t)=>e+(t.tokens_in??0),0),totalTokensOut:M.reduce((e,t)=>e+(t.tokens_out??0),0),totalTokensCacheRead:M.reduce((e,t)=>e+(t.tokens_cache_read??0),0),totalTokensCacheCreate:M.reduce((e,t)=>e+(t.tokens_cache_create??0),0),jobCount:M.length}:null;return(0,z.jsxs)(`div`,{"data-job-detail-surface":!0,className:`flex flex-col h-full max-w-5xl mx-auto w-full`,children:[(0,z.jsxs)(`div`,{className:`px-4 py-4 border-b border-border space-y-3`,children:[(0,z.jsxs)(`div`,{className:`flex items-center gap-1 text-xs text-muted-foreground`,children:[(0,z.jsxs)(d,{to:`/`,className:`hover:text-foreground transition-colors flex items-center gap-1`,children:[(0,z.jsx)(L,{className:`w-3 h-3`}),e(`detail.breadcrumbDashboard`)]}),(0,z.jsx)(T,{className:`w-3 h-3`}),(0,z.jsx)(`span`,{className:`text-foreground font-mono`,children:e(`detail.breadcrumbJob`,{id:r?.slice(0,8)})})]}),se&&(0,z.jsx)(ae,{tickets:v.tickets??[],onTicketClick:h}),(0,z.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,z.jsxs)(`div`,{className:`space-y-1 min-w-0`,children:[(0,z.jsxs)(`div`,{className:`flex items-center gap-2 flex-wrap`,children:[(0,z.jsxs)(p,{children:[(0,z.jsx)(P,{asChild:!0,children:(0,z.jsx)(`div`,{children:(0,z.jsx)(c,{variant:Q.variant,children:e(Q.labelKey)})})}),(0,z.jsx)(j,{children:e(Q.tooltipKey)})]}),(0,z.jsx)(`code`,{className:t(`font-mono text-foreground/90 truncate`,se?`text-xs text-muted-foreground`:`text-sm`),children:te(v.command,u)})]}),(0,z.jsxs)(`div`,{className:`flex items-center gap-3 text-xs text-muted-foreground flex-wrap`,children:[(0,z.jsx)(`span`,{children:v.started_at?e(`detail.startedAgo`,{timeAgo:w(new Date(v.started_at),{addSuffix:!0,locale:N()})}):e(`detail.queuedWaiting`)}),v.model&&(0,z.jsx)(`span`,{className:`text-muted-foreground/40`,children:v.model})]})]}),(0,z.jsxs)(`div`,{className:`flex items-center gap-2 shrink-0`,children:[v.hasTelemetry&&(0,z.jsxs)(p,{children:[(0,z.jsx)(P,{asChild:!0,children:(0,z.jsxs)(C,{variant:`outline`,size:`sm`,className:`h-7`,onClick:X,"aria-label":e(`detail.exportDiagnosticAria`),children:[(0,z.jsx)(ee,{className:`w-3.5 h-3.5 mr-1.5`}),e(`detail.exportDiagnostic`)]})}),(0,z.jsx)(j,{children:e(`detail.exportDiagnosticTooltip`)})]}),oe&&(0,z.jsxs)(p,{children:[(0,z.jsx)(P,{asChild:!0,children:(0,z.jsxs)(C,{variant:`outline`,size:`sm`,onClick:Z,className:`h-7`,children:[(0,z.jsx)(n,{className:`w-3.5 h-3.5 mr-1.5`}),e(`detail.reExecute`)]})}),(0,z.jsx)(j,{children:e(`detail.reExecuteTooltip`)})]}),$&&(0,z.jsxs)(p,{children:[(0,z.jsx)(P,{asChild:!0,children:(0,z.jsx)(C,{variant:`outline`,size:`sm`,onClick:re,className:`h-7 border-destructive/30 text-destructive hover:bg-destructive/10`,children:e(`detail.cancelJob`)})}),(0,z.jsx)(j,{children:e(`detail.cancelJobTooltip`)})]})]})]}),(0,z.jsx)(ne,{phases:k,phaseDefinitions:E})]}),(v.status===`running`||v.status===`completed`||v.status===`failed`)&&(0,z.jsx)(ie,{job:v,events:b,defaultOpen:v.status===`completed`||v.status===`running`,pipelineTotals:ce??void 0,phases:k,phaseDefinitions:E}),(0,z.jsx)(`div`,{className:`flex-1 overflow-hidden relative`,children:(0,z.jsx)(de,{events:b})})]})}export{ge as default};
@@ -1 +0,0 @@
1
- import{r as e}from"./chunk-CilyBKbf.js";import{C as t,Kt as n,M as r,Mt as i,Nt as a,O as o,P as s,S as c,T as l,Zt as u,_ as d,at as f,b as p,bt as m,d as ee,f as h,k as g,l as _,ot as v,q as y,qt as b,rt as x,t as S,tn as C,v as w,vt as T,w as E,x as D,xt as O,y as k}from"./index-CNiaj7Sj.js";import{t as A}from"./ExportDropdown-9tRrlfM7.js";import{t as j}from"./useProjectCache-H0T8Ot9j.js";import{t as te}from"./format-command-CwGuwzGA.js";var ne=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(C(),1),N=i();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 font-semibold`:``}`,children:t}),(0,N.jsx)(`span`,{className:`font-mono text-right ${r===`b`?`text-emerald-400 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 re({jobIds:e,onClose:t}){let{t:n}=b(`jobs`),[i,o]=(0,M.useState)(null),[s,c]=(0,M.useState)(!0),[l,u]=(0,M.useState)(null);(0,M.useEffect)(()=>{let t=new AbortController;return fetch(`${a()}/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`&&(u(e.message),c(!1))}),()=>t.abort()},[e]);function d(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:n(`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)(v,{className:`w-3 h-3 text-emerald-400`}):(0,N.jsx)(f,{className:`w-3 h-3 text-rose-400`}),(0,N.jsx)(`span`,{className:`capitalize text-muted-foreground`,children:n(`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.jsx)(`div`,{className:`fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm`,onClick:t,children:(0,N.jsxs)(`div`,{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(),children:[(0,N.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,N.jsx)(`h2`,{className:`text-sm font-semibold`,children:n(`comparison.title`)}),(0,N.jsx)(`button`,{type:`button`,onClick:t,className:`text-muted-foreground hover:text-foreground transition-colors`,children:(0,N.jsx)(r,{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`,children:n(`comparison.loadFailed`,{error:l})}),i&&(()=>{let[e,t]=i.jobs,r=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`,{}),d(e,0),d(t,1)]}),(0,N.jsx)(L,{label:n(`comparison.duration`),a:P(e.durationMs),b:P(t.durationMs),highlight:r}),(0,N.jsx)(L,{label:n(`comparison.cost`),a:F(e.totalCostUsd),b:F(t.totalCostUsd),highlight:a}),(0,N.jsx)(L,{label:n(`comparison.tokensOut`),a:I(e.tokensOut),b:I(t.tokensOut),highlight:o}),(0,N.jsx)(L,{label:n(`comparison.tokensIn`),a:I(e.tokensIn),b:I(t.tokensIn),highlight:null}),(0,N.jsx)(L,{label:n(`comparison.cacheRead`),a:I(e.tokensCacheRead),b:I(t.tokensCacheRead),highlight:null}),(0,N.jsx)(L,{label:n(`comparison.model`),a:e.model??`—`,b:t.model??`—`,highlight:null}),(0,N.jsx)(L,{label:n(`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:n(`comparison.betterValueHint`)})]})})}var ie={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`}},ae=[`running`,`completed`,`failed`,`canceled`,`zombie_terminated`,`queued`,`skipped`],oe={critical:{className:`bg-red-500/15 text-red-400 border-red-500/30`,labelKey:`recent.priority.critical`},high:{className:`bg-orange-500/15 text-orange-400 border-orange-500/30`,labelKey:`recent.priority.high`},normal:{className:``,labelKey:`recent.priority.normal`},low:{className:`bg-gray-500/15 text-gray-400 border-gray-500/30`,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 _(new Date(e),{addSuffix:!0,locale:O()})}catch{return e}}var z=10;function B({jobs:e,isLoading:r,onJobsCleared:i,onProposalClick:f,onProposalDelete:ee}){let{t:h}=b(`jobs`),_=u(),{activeProjectId:v,projects:S}=m(),C=S.find(e=>e.id===v)?.provider,[T,O]=(0,M.useState)(null),[A,j]=(0,M.useState)(``),[P,F]=(0,M.useState)(``),[I,L]=(0,M.useState)(!1),[R,B]=(0,M.useState)(``),[V,H]=(0,M.useState)(``),[U,W]=(0,M.useState)(!1),[G,K]=(0,M.useState)(null),[q,J]=(0,M.useState)(z),[Y,de]=(0,M.useState)(!1),[X,Z]=(0,M.useState)([]),[fe,Q]=(0,M.useState)(null);(0,M.useEffect)(()=>{J(z)},[e.length]);function pe(){de(e=>!e),Z([])}function me(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=>!(T&&e.status!==T||A&&e.started_at<A||P&&e.started_at>`${P}T23:59:59`)),he=e.filter(e=>!(R&&e.started_at<R||V&&e.started_at>`${V}T23:59:59`)).length;async function ge(e){W(!0);try{let t={};e===`range`&&(R&&(t.from=R),V&&(t.to=V));let r=await fetch(`${a()}/jobs`,{method:`DELETE`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)});if(r.ok){let e=await r.json();n.success(h(`recent.toast.cleared`,{count:e.deleted})),L(!1),B(``),H(``),i?.()}else n.error(h(`recent.toast.clearFailed`))}catch{n.error(h(`recent.toast.networkError`))}finally{W(!1)}}return r?(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)(x,{className:`w-8 h-8 text-muted-foreground/30 mx-auto`}),(0,N.jsx)(`p`,{className:`text-sm font-medium text-muted-foreground`,children:h(`recent.emptyTitle`)}),(0,N.jsx)(`p`,{className:`text-xs text-muted-foreground/60`,children:h(`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:()=>O(null),className:`px-2 py-0.5 rounded text-[10px] font-medium transition-colors ${T===null?`bg-accent text-foreground`:`text-muted-foreground hover:text-foreground hover:bg-accent/50`}`,children:h(`recent.filterAll`,{count:e.length})}),ae.map(t=>{let n=e.filter(e=>e.status===t).length;return n===0?null:(0,N.jsx)(`button`,{type:`button`,onClick:()=>O(T===t?null:t),className:`px-2 py-0.5 rounded text-[10px] font-medium capitalize transition-colors ${T===t?`bg-accent text-foreground`:`text-muted-foreground hover:text-foreground hover:bg-accent/50`}`,children:h(`recent.filterStatus`,{status:h(`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:h(`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:h(`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:h(`recent.clear`)}),(0,N.jsxs)(d,{children:[(0,N.jsx)(k,{asChild:!0,children:(0,N.jsx)(g,{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:pe,children:(0,N.jsx)(ne,{className:`w-3.5 h-3.5`})})}),(0,N.jsx)(w,{children:h(Y?`recent.exitCompareMode`:`recent.compareTwoJobs`)})]}),(0,N.jsxs)(d,{children:[(0,N.jsx)(k,{asChild:!0,children:(0,N.jsx)(g,{variant:`ghost`,size:`sm`,className:`h-6 w-6 p-0 text-muted-foreground hover:text-destructive`,onClick:()=>L(!0),children:(0,N.jsx)(s,{className:`w-3.5 h-3.5`})})}),(0,N.jsx)(w,{children:h(`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&&h(`recent.selectTwoToCompare`),X.length===1&&h(`recent.selectOneMore`),X.length===2&&h(`recent.readyToCompare`)]}),X.length===2&&(0,N.jsx)(`button`,{type:`button`,className:`text-[10px] font-medium text-foreground hover:underline`,onClick:()=>Q(X),children:h(`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:h(`recent.colStatus`)}),(0,N.jsx)(`span`,{className:`flex-1 min-w-0`,children:h(`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:h(`recent.colDuration`)}),(0,N.jsx)(`span`,{className:`w-12 text-right`,children:h(`recent.colTokens`)}),(0,N.jsx)(`span`,{className:`w-12 text-right`,children:h(`recent.colCost`)}),(0,N.jsx)(`span`,{className:`w-20 text-right`,children:h(`recent.colStarted`)})]})]}),(0,N.jsx)(`div`,{className:`space-y-0.5`,children:$.slice(0,q).map(e=>{let t=ie[e.status]??ie.queued,n=se(e.total_cost_usd),r=ce(e.started_at,e.finished_at),i=le((e.tokens_in??0)+(e.tokens_out??0)+(e.tokens_cache_read??0)+(e.tokens_cache_create??0)||null),a=e.id.startsWith(`proposal:`),c=a?e.id.replace(`proposal:`,``):null,l=X.includes(e.id),u=Y&&!a&&X.length===2&&!l;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 ${l?`bg-accent/70 ring-1 ring-border`:u?`opacity-40 cursor-not-allowed`:`hover:bg-accent/50`}`,onClick:()=>{if(Y&&!a){me(e.id);return}a&&c?f?.(c):_(`/jobs/${e.id}`)},children:[(0,N.jsxs)(d,{children:[(0,N.jsx)(k,{asChild:!0,children:(0,N.jsx)(`div`,{children:(0,N.jsx)(o,{variant:t.variant,children:h(t.labelKey)})})}),(0,N.jsx)(w,{children:h(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 ${oe[e.priority].className}`,children:h(oe[e.priority].labelKey)}),e.profile_name&&(0,N.jsxs)(d,{children:[(0,N.jsx)(k,{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)(w,{children:h(`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)(d,{children:[(0,N.jsx)(k,{asChild:!0,children:(0,N.jsx)(y,{className:`w-3 h-3 text-accent-primary/60 shrink-0`})}),(0,N.jsxs)(w,{children:[h(`recent.pipelinePart`),e.depends_on_job_id&&` ${h(`recent.pipelineDependsOn`)}`,e.skip_reason&&` — ${e.skip_reason}`]})]}),(0,N.jsx)(`code`,{className:`text-xs text-foreground/80 truncate`,children:te(e.command,C)})]}),(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:r??`—`}),(0,N.jsx)(`span`,{className:`w-12 text-right`,children:i?`${i}`:`—`}),(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)}),a&&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(),K(c)},title:h(`recent.deleteProposal`),children:(0,N.jsx)(s,{className:`w-3 h-3`})})]})]},e.id)})}),$.length>q&&(0,N.jsx)(`div`,{className:`pt-1 text-center`,children:(0,N.jsx)(`button`,{type:`button`,onClick:()=>J(e=>e+z),className:`text-[10px] text-muted-foreground hover:text-foreground transition-colors px-3 py-1 rounded hover:bg-accent/50`,children:h(`recent.loadMore`,{count:$.length-q})})}),I&&(0,N.jsx)(`div`,{className:`fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm`,onClick:()=>L(!1),children:(0,N.jsxs)(`div`,{className:`w-80 rounded-xl border border-border/30 bg-popover p-4 shadow-lg space-y-4`,onClick:e=>e.stopPropagation(),children:[(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`h3`,{className:`text-sm font-semibold`,children:h(`recent.clearModal.title`)}),(0,N.jsx)(`p`,{className:`text-xs text-muted-foreground mt-0.5`,children:h(`recent.clearModal.jobsInHistory`,{count:e.length})})]}),(0,N.jsx)(g,{variant:`destructive`,size:`sm`,className:`w-full`,disabled:U,onClick:()=>ge(`all`),children:h(`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:h(`recent.clearModal.orByRange`)}),(0,N.jsxs)(`div`,{className:`flex gap-2`,children:[(0,N.jsx)(`input`,{type:`date`,value:R,onChange:e=>B(e.target.value),className:`flex-1 h-7 rounded-md border border-border bg-input px-2 text-xs text-foreground`,placeholder:h(`recent.clearModal.fromPlaceholder`)}),(0,N.jsx)(`input`,{type:`date`,value:V,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:h(`recent.clearModal.toPlaceholder`)})]}),(0,N.jsx)(g,{variant:`outline`,size:`sm`,className:`w-full`,disabled:U||!R&&!V,onClick:()=>ge(`range`),children:R||V?h(`recent.clearModal.clearInRange`,{count:he}):h(`recent.clearModal.clearRange`)})]}),(0,N.jsx)(g,{variant:`ghost`,size:`sm`,className:`w-full`,onClick:()=>L(!1),children:h(`common:actions.cancel`)})]})}),(0,N.jsx)(p,{open:G!==null,onOpenChange:e=>!e&&K(null),children:(0,N.jsxs)(D,{className:`max-w-sm`,children:[(0,N.jsxs)(E,{children:[(0,N.jsx)(l,{children:h(`recent.deleteProposalConfirm.title`)}),(0,N.jsx)(c,{children:h(`recent.deleteProposalConfirm.description`)})]}),(0,N.jsxs)(t,{children:[(0,N.jsx)(g,{variant:`ghost`,size:`sm`,onClick:()=>K(null),children:h(`common:actions.cancel`)}),(0,N.jsx)(g,{variant:`destructive`,size:`sm`,onClick:()=>{G&&ee?.(G),K(null)},children:h(`common:actions.delete`)})]})]})}),fe&&(0,N.jsx)(re,{jobIds:fe,onClose:()=>{Q(null),Z([]),de(!1)}})]})}function V(){let{t:e}=b(`jobs`),{activeProjectId:r}=m(),{recentJobs:i}=S(r),{data:s,isFirstLoad:c,refresh:u}=j({namespace:`jobs`,projectId:r,initialValue:i,fetcher:async()=>{let e=await fetch(`${a()}/jobs?limit=10`);return e.ok?(await e.json()).jobs:[]},pollInterval:1e4}),{data:d}=j({namespace:`proposals`,projectId:r,initialValue:[],fetcher:async()=>{let e=await fetch(`${a()}/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`},_=d.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`})),v=[...s,..._].sort((e,t)=>new Date(t.started_at).getTime()-new Date(e.started_at).getTime()),[y,x]=(0,M.useState)(null),C=(0,M.useCallback)(async e=>{try{let t=await fetch(`${a()}/propose/${e}`);if(!t.ok)return;x((await t.json()).proposal)}catch{}},[]),w=(0,M.useCallback)(async t=>{try{(await fetch(`${a()}/propose/${t}`,{method:`DELETE`})).ok&&(n.success(e(`page.proposalDeleted`)),u())}catch{}},[u,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)(A,{baseUrl:`${a()}/jobs/export`,label:e(`page.exportJobs`)})]}),(0,N.jsx)(B,{jobs:v,isLoading:c,onJobsCleared:u,onProposalClick:C,onProposalDelete:w}),(0,N.jsx)(p,{open:y!==null,onOpenChange:e=>!e&&x(null),children:(0,N.jsx)(D,{className:`max-w-3xl glass-card`,children:y&&(0,N.jsxs)(N.Fragment,{children:[(0,N.jsx)(E,{children:(0,N.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,N.jsx)(l,{className:`flex-1 min-w-0`,children:e(`page.proposal.title`)}),(0,N.jsx)(o,{variant:y.status===`created`?`success`:y.status===`cancelled`?`destructive`:`secondary`,children:y.status})]})}),(0,N.jsx)(`div`,{className:`text-xs text-muted-foreground bg-muted/20 rounded px-2 py-1 italic`,children:y.idea}),y.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)(h,{remarkPlugins:[ee],children:y.result_markdown})})}):(0,N.jsx)(`p`,{className:`text-xs text-muted-foreground py-4 text-center`,children:e(`page.proposal.noContent`)}),y.issue_url&&(0,N.jsxs)(`div`,{className:`text-xs`,children:[e(`page.proposal.githubIssue`),` `,(0,N.jsx)(`a`,{href:y.issue_url,target:`_blank`,rel:`noopener noreferrer`,className:`text-accent-primary hover:underline`,children:y.issue_url})]}),(0,N.jsxs)(t,{children:[(0,N.jsx)(g,{variant:`destructive`,size:`sm`,onClick:()=>{w(y.id),x(null)},children:e(`common:actions.delete`)}),(0,N.jsx)(g,{variant:`ghost`,size:`sm`,onClick:()=>x(null),children:e(`common:actions.close`)})]})]})})})]})}export{V as default};
@@ -1 +0,0 @@
1
- var e={resizeFileTree:`ファイルツリーのサイズを変更`,selectFile:`プレビューするファイルを選択してください。`},t={hint:`ドラッグでサイズ変更。ダブルクリックでリセット。`},n={scope:`スコープ`,allAi:`すべての AI`,spec:`スペック`,ticketIdPlaceholder:`id`,copyFilePath:`ファイルパスをコピー`,generateSummary:`要約を生成`,regenerateSummary:`要約を再生成`,generating:`生成中…`,regenerating:`再生成中…`,summaryUnavailable:`要約は利用できません: {{reason}}`,jobContext:`ジョブコンテキスト`,clear:`クリア`},r={jobTitle:`ジョブ {{jobId}}`,specTitle:`スペック #{{ticketId}}`,touchedFiles_one:`変更ファイル {{count}} 件`,touchedFiles_other:`変更ファイル {{count}} 件`,log:`ログ`},i={created:`作成`,modified:`変更`,deleted:`削除`},a={added:`追加`,changed:`変更`,deleted:`削除`},o={loadingFile:`ファイルを読み込み中…`,showSummary:`要約を表示`,markdownViewMode:`Markdown 表示モード`,preview:`プレビュー`,raw:`Raw`,missingFile:`このファイルは AI ジョブによって変更されましたが、作業ツリーにはもう存在しません。`,binaryFile:`バイナリファイルです。`,tooLarge:`ファイルが大きすぎてプレビューできません ({{size}} MB)。`,noContent:`表示できる内容がありません。`,pathCopied:`パスをコピーしました`,copyPathFailed:`パスをコピーできませんでした`,budgetPrompt:`予算上限を超過して実行しますか?`},s={generationFailed:`要約の生成に失敗しました`,skipped:`要約をスキップしました: {{reason}}`,unavailable:`要約は利用できません: {{reason}}。`,empty:`このファイルの要約はまだありません。`,stale:`古い`,hide:`非表示`,reason:{missing:`ファイルが存在しません`,binary:`バイナリファイル`,tooLarge:`ファイルが大きすぎます`}},c={resize:`AI 変更履歴のサイズを変更`,title_one:`AI 変更履歴 · {{count}} 件の変更`,title_other:`AI 変更履歴 · {{count}} 件の変更`,show:`表示`,hide:`非表示`,unknownJob:`不明なジョブ`,filterByJob:`ジョブ {{jobId}} でコードを絞り込み`,diff:`差分`,openSpec:`スペック #{{ticketId}} を開く`,specChip:`スペック #{{ticketId}}`,loadingDiff:`差分を読み込み中...`,diffUnavailable:`この過去の変更の差分は利用できません。新しいジョブからはパッチが自動的に保存されます。`,diffTruncated:`[差分は切り捨てられました]`},l={jobFiles:`ジョブのファイル`,specFiles:`スペックのファイル`,touchedByAi:`AI が変更`,allFiles:`すべてのファイル`,collapseAll:`すべてのフォルダを折りたたむ`,expandAll:`すべてのフォルダを展開`,touchedCount_one:`AI が変更したファイル {{count}} 件`,touchedCount_other:`AI が変更したファイル {{count}} 件`,loadingFiles:`ファイルを読み込み中…`,emptyTouched:`AI が変更したファイルはまだありません。ジョブを実行するか、「すべてのファイル」に切り替えてください。`,showAllFiles:`すべてのファイルを表示`,noFiles:`ファイルがありません。`,folderTouched_one:`このフォルダ以下に AI が変更したファイルが {{count}} 件あります`,folderTouched_other:`このフォルダ以下に AI が変更したファイルが {{count}} 件あります`,jobTitle:`ジョブ {{jobId}}`,createdBySpec:`スペック #{{id}} の実装中に作成`,modifiedBySpec:`スペック #{{id}} の実装中に変更`,latestTitleCreated:`最新の AI ジョブがこのファイルを追加しました`,latestTitleModified:`最新の AI ジョブがこのファイルを変更しました`,latestTitleDeleted:`最新の AI ジョブがこのファイルを削除しました`},u={loadFailed:`コードビューアの読み込みに失敗しました。`,reload:`再読み込み`,loadingEditor:`エディタを読み込み中…`},d={title:`このチケットが変更したファイル`,jobTitle:`ジョブ {{jobId}}`},f={page:e,resizer:t,toolbar:n,provenancePanel:r,kind:i,action:a,viewer:o,summary:s,history:c,tree:l,monaco:u,ticketFiles:d};export{a as action,f as default,c as history,i as kind,u as monaco,e as page,r as provenancePanel,t as resizer,s as summary,d as ticketFiles,n as toolbar,l as tree,o as viewer};
@@ -1 +0,0 @@
1
- var e={resizeFileTree:`Redimensionar árbol de archivos`,selectFile:`Selecciona un archivo para previsualizarlo.`},t={hint:`Arrastra para redimensionar. Doble clic para restablecer.`},n={scope:`Ámbito`,allAi:`Toda la IA`,spec:`Spec`,ticketIdPlaceholder:`id`,copyFilePath:`Copiar ruta del archivo`,generateSummary:`Generar resumen`,regenerateSummary:`Regenerar resumen`,generating:`Generando…`,regenerating:`Regenerando…`,summaryUnavailable:`Resumen no disponible: {{reason}}`,jobContext:`Contexto del job`,clear:`Limpiar`},r={jobTitle:`Job {{jobId}}`,specTitle:`Spec #{{ticketId}}`,touchedFiles_one:`{{count}} archivo tocado`,touchedFiles_other:`{{count}} archivos tocados`,log:`Log`},i={created:`creado`,modified:`modificado`,deleted:`eliminado`},a={added:`añadido`,changed:`cambiado`,deleted:`eliminado`},o={loadingFile:`Cargando archivo…`,showSummary:`Mostrar resumen`,markdownViewMode:`Modo de vista de Markdown`,preview:`Vista previa`,raw:`Sin formato`,missingFile:`Este archivo fue tocado por un job de IA pero ya no existe en el árbol de trabajo.`,binaryFile:`Archivo binario.`,tooLarge:`Archivo demasiado grande para previsualizar ({{size}} MB).`,noContent:`No hay contenido disponible.`,pathCopied:`Ruta copiada`,copyPathFailed:`No se pudo copiar la ruta`,budgetPrompt:`¿Ignorar el límite de presupuesto?`},s={generationFailed:`Error al generar el resumen`,skipped:`Resumen omitido: {{reason}}`,unavailable:`Resumen no disponible: {{reason}}.`,empty:`Aún no hay resumen para este archivo.`,stale:`Obsoleto`,hide:`Ocultar`,reason:{missing:`archivo no encontrado`,binary:`archivo binario`,tooLarge:`archivo demasiado grande`}},c={resize:`Redimensionar historial de cambios de IA`,title_one:`Historial de cambios de IA · {{count}} cambio`,title_other:`Historial de cambios de IA · {{count}} cambios`,show:`Mostrar`,hide:`Ocultar`,unknownJob:`job desconocido`,filterByJob:`Filtrar Código por el job {{jobId}}`,diff:`Diff`,openSpec:`Abrir spec #{{ticketId}}`,specChip:`spec #{{ticketId}}`,loadingDiff:`Cargando diff...`,diffUnavailable:`Diff no disponible para este cambio histórico. Los jobs nuevos guardarán los parches automáticamente.`,diffTruncated:`[diff truncado]`},l={jobFiles:`Archivos del job`,specFiles:`Archivos de la spec`,touchedByAi:`Tocado por IA`,allFiles:`Todos los archivos`,collapseAll:`Contraer todas las carpetas`,expandAll:`Expandir todas las carpetas`,touchedCount_one:`{{count}} archivo tocado por IA`,touchedCount_other:`{{count}} archivos tocados por IA`,loadingFiles:`Cargando archivos…`,emptyTouched:`Aún no hay archivos tocados por IA. Ejecuta un job o cambia a Todos los archivos.`,showAllFiles:`Mostrar todos los archivos`,noFiles:`No hay archivos.`,folderTouched_one:`{{count}} archivo tocado por IA dentro de esta carpeta`,folderTouched_other:`{{count}} archivos tocados por IA dentro de esta carpeta`,jobTitle:`Job {{jobId}}`,createdBySpec:`Creado al implementar la spec #{{id}}`,modifiedBySpec:`Modificado al implementar la spec #{{id}}`,latestTitleCreated:`El último job de IA añadió este archivo`,latestTitleModified:`El último job de IA modificó este archivo`,latestTitleDeleted:`El último job de IA eliminó este archivo`},u={loadFailed:`No se pudo cargar el visor de código.`,reload:`Recargar`,loadingEditor:`Cargando editor…`},d={title:`Archivos tocados por este ticket`,jobTitle:`Job {{jobId}}`},f={page:e,resizer:t,toolbar:n,provenancePanel:r,kind:i,action:a,viewer:o,summary:s,history:c,tree:l,monaco:u,ticketFiles:d};export{a as action,f as default,c as history,i as kind,u as monaco,e as page,r as provenancePanel,t as resizer,s as summary,d as ticketFiles,n as toolbar,l as tree,o as viewer};
@@ -1 +0,0 @@
1
- var e={resizeFileTree:`Größe des Dateibaums ändern`,selectFile:`Wähle eine Datei für die Vorschau.`},t={hint:`Zum Ändern der Größe ziehen. Doppelklick zum Zurücksetzen.`},n={scope:`Bereich`,allAi:`Alle KI`,spec:`Spec`,ticketIdPlaceholder:`id`,copyFilePath:`Dateipfad kopieren`,generateSummary:`Zusammenfassung generieren`,regenerateSummary:`Zusammenfassung neu generieren`,generating:`Wird generiert…`,regenerating:`Wird neu generiert…`,summaryUnavailable:`Zusammenfassung nicht verfügbar: {{reason}}`,jobContext:`Job-Kontext`,clear:`Zurücksetzen`},r={jobTitle:`Job {{jobId}}`,specTitle:`Spec #{{ticketId}}`,touchedFiles_one:`{{count}} bearbeitete Datei`,touchedFiles_other:`{{count}} bearbeitete Dateien`,log:`Log`},i={created:`erstellt`,modified:`geändert`,deleted:`gelöscht`},a={added:`hinzugefügt`,changed:`geändert`,deleted:`gelöscht`},o={loadingFile:`Datei wird geladen…`,showSummary:`Zusammenfassung anzeigen`,markdownViewMode:`Markdown-Ansichtsmodus`,preview:`Vorschau`,raw:`Quelltext`,missingFile:`Diese Datei wurde von einem KI-Job bearbeitet, existiert aber nicht mehr im Arbeitsverzeichnis.`,binaryFile:`Binärdatei.`,tooLarge:`Datei zu groß für die Vorschau ({{size}} MB).`,noContent:`Kein Inhalt verfügbar.`,pathCopied:`Pfad kopiert`,copyPathFailed:`Pfad konnte nicht kopiert werden`,budgetPrompt:`Budgetgrenze außer Kraft setzen?`},s={generationFailed:`Generierung der Zusammenfassung fehlgeschlagen`,skipped:`Zusammenfassung übersprungen: {{reason}}`,unavailable:`Zusammenfassung nicht verfügbar: {{reason}}.`,empty:`Noch keine Zusammenfassung für diese Datei.`,stale:`Veraltet`,hide:`Ausblenden`,reason:{missing:`Datei fehlt`,binary:`Binärdatei`,tooLarge:`Datei zu groß`}},c={resize:`Größe des KI-Bearbeitungsverlaufs ändern`,title_one:`KI-Bearbeitungsverlauf · {{count}} Änderung`,title_other:`KI-Bearbeitungsverlauf · {{count}} Änderungen`,show:`Anzeigen`,hide:`Ausblenden`,unknownJob:`unbekannter Job`,filterByJob:`Code nach Job {{jobId}} filtern`,diff:`Diff`,openSpec:`Spec #{{ticketId}} öffnen`,specChip:`Spec #{{ticketId}}`,loadingDiff:`Diff wird geladen...`,diffUnavailable:`Für diese frühere Bearbeitung ist kein Diff verfügbar. Neue Jobs speichern Patches automatisch.`,diffTruncated:`[Diff gekürzt]`},l={jobFiles:`Job-Dateien`,specFiles:`Spec-Dateien`,touchedByAi:`Von KI bearbeitet`,allFiles:`Alle Dateien`,collapseAll:`Alle Ordner einklappen`,expandAll:`Alle Ordner ausklappen`,touchedCount_one:`{{count}} von KI bearbeitete Datei`,touchedCount_other:`{{count}} von KI bearbeitete Dateien`,loadingFiles:`Dateien werden geladen…`,emptyTouched:`Noch keine von KI bearbeiteten Dateien. Starte einen Job oder wechsle zu „Alle Dateien“.`,showAllFiles:`Alle Dateien anzeigen`,noFiles:`Keine Dateien.`,folderTouched_one:`{{count}} von KI bearbeitete Datei unterhalb dieses Ordners`,folderTouched_other:`{{count}} von KI bearbeitete Dateien unterhalb dieses Ordners`,jobTitle:`Job {{jobId}}`,createdBySpec:`Bei der Implementierung von Spec #{{id}} erstellt`,modifiedBySpec:`Bei der Implementierung von Spec #{{id}} geändert`,latestTitleCreated:`Der letzte KI-Job hat diese Datei hinzugefügt`,latestTitleModified:`Der letzte KI-Job hat diese Datei geändert`,latestTitleDeleted:`Der letzte KI-Job hat diese Datei gelöscht`},u={loadFailed:`Code-Viewer konnte nicht geladen werden.`,reload:`Neu laden`,loadingEditor:`Editor wird geladen…`},d={title:`Von diesem Ticket bearbeitete Dateien`,jobTitle:`Job {{jobId}}`},f={page:e,resizer:t,toolbar:n,provenancePanel:r,kind:i,action:a,viewer:o,summary:s,history:c,tree:l,monaco:u,ticketFiles:d};export{a as action,f as default,c as history,i as kind,u as monaco,e as page,r as provenancePanel,t as resizer,s as summary,d as ticketFiles,n as toolbar,l as tree,o as viewer};
@@ -1 +0,0 @@
1
- var e={resizeFileTree:`调整文件树大小`,selectFile:`选择一个文件进行预览。`},t={hint:`拖动以调整大小。双击重置。`},n={scope:`范围`,allAi:`全部 AI`,spec:`Spec`,ticketIdPlaceholder:`id`,copyFilePath:`复制文件路径`,generateSummary:`生成摘要`,regenerateSummary:`重新生成摘要`,generating:`生成中…`,regenerating:`重新生成中…`,summaryUnavailable:`摘要不可用:{{reason}}`,jobContext:`任务上下文`,clear:`清除`},r={jobTitle:`任务 {{jobId}}`,specTitle:`Spec #{{ticketId}}`,touchedFiles_one:`{{count}} 个被改动的文件`,touchedFiles_other:`{{count}} 个被改动的文件`,log:`日志`},i={created:`创建`,modified:`修改`,deleted:`删除`},a={added:`新增`,changed:`更改`,deleted:`删除`},o={loadingFile:`正在加载文件…`,showSummary:`显示摘要`,markdownViewMode:`Markdown 查看模式`,preview:`预览`,raw:`原始`,missingFile:`此文件曾被 AI 任务改动,但已不存在于工作区中。`,binaryFile:`二进制文件。`,tooLarge:`文件过大,无法预览({{size}} MB)。`,noContent:`无可用内容。`,pathCopied:`路径已复制`,copyPathFailed:`无法复制路径`,budgetPrompt:`要超出预算上限继续吗?`},s={generationFailed:`摘要生成失败`,skipped:`已跳过摘要:{{reason}}`,unavailable:`摘要不可用:{{reason}}。`,empty:`此文件还没有摘要。`,stale:`已过期`,hide:`隐藏`,reason:{missing:`文件缺失`,binary:`二进制文件`,tooLarge:`文件过大`}},c={resize:`调整 AI 改动历史大小`,title_one:`AI 改动历史 · {{count}} 处更改`,title_other:`AI 改动历史 · {{count}} 处更改`,show:`显示`,hide:`隐藏`,unknownJob:`未知任务`,filterByJob:`按任务 {{jobId}} 筛选 Code`,diff:`Diff`,openSpec:`打开 Spec #{{ticketId}}`,specChip:`Spec #{{ticketId}}`,loadingDiff:`正在加载 diff...`,diffUnavailable:`此历史改动没有可用的 diff。新任务会自动保存补丁。`,diffTruncated:`[diff 已截断]`},l={jobFiles:`任务文件`,specFiles:`Spec 文件`,touchedByAi:`AI 改动过`,allFiles:`全部文件`,collapseAll:`折叠所有文件夹`,expandAll:`展开所有文件夹`,touchedCount_one:`{{count}} 个 AI 改动过的文件`,touchedCount_other:`{{count}} 个 AI 改动过的文件`,loadingFiles:`正在加载文件…`,emptyTouched:`还没有 AI 改动过的文件。运行一个任务,或切换到“全部文件”。`,showAllFiles:`显示全部文件`,noFiles:`没有文件。`,folderTouched_one:`此文件夹下有 {{count}} 个 AI 改动过的文件`,folderTouched_other:`此文件夹下有 {{count}} 个 AI 改动过的文件`,jobTitle:`任务 {{jobId}}`,createdBySpec:`在实现 Spec #{{id}} 时创建`,modifiedBySpec:`在实现 Spec #{{id}} 时修改`,latestTitleCreated:`最近的 AI 任务添加了此文件`,latestTitleModified:`最近的 AI 任务更改了此文件`,latestTitleDeleted:`最近的 AI 任务删除了此文件`},u={loadFailed:`代码查看器加载失败。`,reload:`重新加载`,loadingEditor:`正在加载编辑器…`},d={title:`此工单改动的文件`,jobTitle:`任务 {{jobId}}`},f={page:e,resizer:t,toolbar:n,provenancePanel:r,kind:i,action:a,viewer:o,summary:s,history:c,tree:l,monaco:u,ticketFiles:d};export{a as action,f as default,c as history,i as kind,u as monaco,e as page,r as provenancePanel,t as resizer,s as summary,d as ticketFiles,n as toolbar,l as tree,o as viewer};
@@ -1 +0,0 @@
1
- var e={resizeFileTree:`Redimensionner l'arborescence de fichiers`,selectFile:`Sélectionnez un fichier pour l'afficher.`},t={hint:`Glissez pour redimensionner. Double-cliquez pour réinitialiser.`},n={scope:`Portée`,allAi:`Toute l'IA`,spec:`Spec`,ticketIdPlaceholder:`id`,copyFilePath:`Copier le chemin du fichier`,generateSummary:`Générer le résumé`,regenerateSummary:`Régénérer le résumé`,generating:`Génération…`,regenerating:`Régénération…`,summaryUnavailable:`Résumé indisponible : {{reason}}`,jobContext:`Contexte du job`,clear:`Effacer`},r={jobTitle:`Job {{jobId}}`,specTitle:`Spec #{{ticketId}}`,touchedFiles_one:`{{count}} fichier touché`,touchedFiles_other:`{{count}} fichiers touchés`,log:`Log`},i={created:`créé`,modified:`modifié`,deleted:`supprimé`},a={added:`ajouté`,changed:`modifié`,deleted:`supprimé`},o={loadingFile:`Chargement du fichier…`,showSummary:`Afficher le résumé`,markdownViewMode:`Mode d'affichage Markdown`,preview:`Aperçu`,raw:`Brut`,missingFile:`Ce fichier a été touché par un job IA mais n'existe plus dans l'arbre de travail.`,binaryFile:`Fichier binaire.`,tooLarge:`Fichier trop volumineux pour l'aperçu ({{size}} MB).`,noContent:`Aucun contenu disponible.`,pathCopied:`Chemin copié`,copyPathFailed:`Impossible de copier le chemin`,budgetPrompt:`Outrepasser le plafond de budget ?`},s={generationFailed:`Échec de la génération du résumé`,skipped:`Résumé ignoré : {{reason}}`,unavailable:`Résumé indisponible : {{reason}}.`,empty:`Pas encore de résumé pour ce fichier.`,stale:`Obsolète`,hide:`Masquer`,reason:{missing:`fichier manquant`,binary:`fichier binaire`,tooLarge:`fichier trop volumineux`}},c={resize:`Redimensionner l'historique des modifications IA`,title_one:`Historique des modifications IA · {{count}} changement`,title_other:`Historique des modifications IA · {{count}} changements`,show:`Afficher`,hide:`Masquer`,unknownJob:`job inconnu`,filterByJob:`Filtrer Code par le job {{jobId}}`,diff:`Diff`,openSpec:`Ouvrir la spec #{{ticketId}}`,specChip:`spec #{{ticketId}}`,loadingDiff:`Chargement du diff...`,diffUnavailable:`Diff indisponible pour cette modification historique. Les nouveaux jobs enregistreront les patchs automatiquement.`,diffTruncated:`[diff tronqué]`},l={jobFiles:`Fichiers du job`,specFiles:`Fichiers de la spec`,touchedByAi:`Touchés par l'IA`,allFiles:`Tous les fichiers`,collapseAll:`Replier tous les dossiers`,expandAll:`Déplier tous les dossiers`,touchedCount_one:`{{count}} fichier touché par l'IA`,touchedCount_other:`{{count}} fichiers touchés par l'IA`,loadingFiles:`Chargement des fichiers…`,emptyTouched:`Aucun fichier touché par l'IA pour l'instant. Lancez un job ou passez à Tous les fichiers.`,showAllFiles:`Afficher tous les fichiers`,noFiles:`Aucun fichier.`,folderTouched_one:`{{count}} fichier touché par l'IA sous ce dossier`,folderTouched_other:`{{count}} fichiers touchés par l'IA sous ce dossier`,jobTitle:`Job {{jobId}}`,createdBySpec:`Créé lors de l'implémentation de la spec #{{id}}`,modifiedBySpec:`Modifié lors de l'implémentation de la spec #{{id}}`,latestTitleCreated:`Le dernier job IA a ajouté ce fichier`,latestTitleModified:`Le dernier job IA a modifié ce fichier`,latestTitleDeleted:`Le dernier job IA a supprimé ce fichier`},u={loadFailed:`Échec du chargement de l'afficheur de code.`,reload:`Recharger`,loadingEditor:`Chargement de l'éditeur…`},d={title:`Fichiers touchés par ce ticket`,jobTitle:`Job {{jobId}}`},f={page:e,resizer:t,toolbar:n,provenancePanel:r,kind:i,action:a,viewer:o,summary:s,history:c,tree:l,monaco:u,ticketFiles:d};export{a as action,f as default,c as history,i as kind,u as monaco,e as page,r as provenancePanel,t as resizer,s as summary,d as ticketFiles,n as toolbar,l as tree,o as viewer};
@@ -1 +0,0 @@
1
- import{n as e}from"./chunk-CilyBKbf.js";var t=e({action:()=>s,default:()=>m,history:()=>u,kind:()=>o,monaco:()=>f,page:()=>n,provenancePanel:()=>a,resizer:()=>r,summary:()=>l,ticketFiles:()=>p,toolbar:()=>i,tree:()=>d,viewer:()=>c}),n={resizeFileTree:`Resize file tree`,selectFile:`Select a file to preview.`},r={hint:`Drag to resize. Double-click to reset.`},i={scope:`Scope`,allAi:`All AI`,spec:`Spec`,ticketIdPlaceholder:`id`,copyFilePath:`Copy file path`,generateSummary:`Generate summary`,regenerateSummary:`Regenerate summary`,generating:`Generating…`,regenerating:`Regenerating…`,summaryUnavailable:`Summary unavailable: {{reason}}`,jobContext:`Job context`,clear:`Clear`},a={jobTitle:`Job {{jobId}}`,specTitle:`Spec #{{ticketId}}`,touchedFiles_one:`{{count}} touched file`,touchedFiles_other:`{{count}} touched files`,log:`Log`},o={created:`created`,modified:`modified`,deleted:`deleted`},s={added:`added`,changed:`changed`,deleted:`deleted`},c={loadingFile:`Loading file…`,showSummary:`Show summary`,markdownViewMode:`Markdown view mode`,preview:`Preview`,raw:`Raw`,missingFile:`This file was touched by an AI job but no longer exists in the working tree.`,binaryFile:`Binary file.`,tooLarge:`File too large to preview ({{size}} MB).`,noContent:`No content available.`,pathCopied:`Path copied`,copyPathFailed:`Could not copy path`,budgetPrompt:`Override the budget cap?`},l={generationFailed:`Summary generation failed`,skipped:`Summary skipped: {{reason}}`,unavailable:`Summary unavailable: {{reason}}.`,empty:`No summary for this file yet.`,stale:`Stale`,hide:`Hide`,reason:{missing:`file missing`,binary:`binary file`,tooLarge:`file too large`}},u={resize:`Resize AI touch history`,title_one:`AI touch history · {{count}} change`,title_other:`AI touch history · {{count}} changes`,show:`Show`,hide:`Hide`,unknownJob:`unknown job`,filterByJob:`Filter Code by job {{jobId}}`,diff:`Diff`,openSpec:`Open spec #{{ticketId}}`,specChip:`spec #{{ticketId}}`,loadingDiff:`Loading diff...`,diffUnavailable:`Diff unavailable for this historical touch. New jobs will store patches automatically.`,diffTruncated:`[diff truncated]`},d={jobFiles:`Job files`,specFiles:`Spec files`,touchedByAi:`Touched by AI`,allFiles:`All files`,collapseAll:`Collapse all folders`,expandAll:`Expand all folders`,touchedCount_one:`{{count}} AI-touched file`,touchedCount_other:`{{count}} AI-touched files`,loadingFiles:`Loading files…`,emptyTouched:`No AI-touched files yet. Run a job, or switch to All files.`,showAllFiles:`Show all files`,noFiles:`No files.`,folderTouched_one:`{{count}} AI-touched file below this folder`,folderTouched_other:`{{count}} AI-touched files below this folder`,jobTitle:`Job {{jobId}}`,createdBySpec:`Created while implementing spec #{{id}}`,modifiedBySpec:`Modified while implementing spec #{{id}}`,latestTitleCreated:`Latest AI job added this file`,latestTitleModified:`Latest AI job changed this file`,latestTitleDeleted:`Latest AI job deleted this file`},f={loadFailed:`Failed to load the code viewer.`,reload:`Reload`,loadingEditor:`Loading editor…`},p={title:`Files touched by this ticket`,jobTitle:`Job {{jobId}}`},m={page:n,resizer:r,toolbar:i,provenancePanel:a,kind:o,action:s,viewer:c,summary:l,history:u,tree:d,monaco:f,ticketFiles:p};export{t};
@@ -1 +0,0 @@
1
- var e={resizeFileTree:`Redimensionar árvore de ficheiros`,selectFile:`Selecione um ficheiro para pré-visualizar.`},t={hint:`Arraste para redimensionar. Duplo clique para repor.`},n={scope:`Âmbito`,allAi:`Toda a IA`,spec:`Spec`,ticketIdPlaceholder:`id`,copyFilePath:`Copiar caminho do ficheiro`,generateSummary:`Gerar resumo`,regenerateSummary:`Regenerar resumo`,generating:`A gerar…`,regenerating:`A regenerar…`,summaryUnavailable:`Resumo indisponível: {{reason}}`,jobContext:`Contexto do job`,clear:`Limpar`},r={jobTitle:`Job {{jobId}}`,specTitle:`Spec #{{ticketId}}`,touchedFiles_one:`{{count}} ficheiro alterado`,touchedFiles_other:`{{count}} ficheiros alterados`,log:`Log`},i={created:`criado`,modified:`modificado`,deleted:`eliminado`},a={added:`adicionado`,changed:`alterado`,deleted:`eliminado`},o={loadingFile:`A carregar ficheiro…`,showSummary:`Mostrar resumo`,markdownViewMode:`Modo de visualização de Markdown`,preview:`Pré-visualização`,raw:`Original`,missingFile:`Este ficheiro foi alterado por um job de IA mas já não existe na árvore de trabalho.`,binaryFile:`Ficheiro binário.`,tooLarge:`Ficheiro demasiado grande para pré-visualizar ({{size}} MB).`,noContent:`Sem conteúdo disponível.`,pathCopied:`Caminho copiado`,copyPathFailed:`Não foi possível copiar o caminho`,budgetPrompt:`Ultrapassar o limite de orçamento?`},s={generationFailed:`Falha na geração do resumo`,skipped:`Resumo ignorado: {{reason}}`,unavailable:`Resumo indisponível: {{reason}}.`,empty:`Ainda não há resumo para este ficheiro.`,stale:`Desatualizado`,hide:`Ocultar`,reason:{missing:`ficheiro em falta`,binary:`ficheiro binário`,tooLarge:`ficheiro demasiado grande`}},c={resize:`Redimensionar histórico de alterações por IA`,title_one:`Histórico de alterações por IA · {{count}} alteração`,title_other:`Histórico de alterações por IA · {{count}} alterações`,show:`Mostrar`,hide:`Ocultar`,unknownJob:`job desconhecido`,filterByJob:`Filtrar Código pelo job {{jobId}}`,diff:`Diff`,openSpec:`Abrir spec #{{ticketId}}`,specChip:`spec #{{ticketId}}`,loadingDiff:`A carregar diff...`,diffUnavailable:`Diff indisponível para esta alteração histórica. Os novos jobs guardarão patches automaticamente.`,diffTruncated:`[diff truncado]`},l={jobFiles:`Ficheiros do job`,specFiles:`Ficheiros da spec`,touchedByAi:`Alterados por IA`,allFiles:`Todos os ficheiros`,collapseAll:`Recolher todas as pastas`,expandAll:`Expandir todas as pastas`,touchedCount_one:`{{count}} ficheiro alterado por IA`,touchedCount_other:`{{count}} ficheiros alterados por IA`,loadingFiles:`A carregar ficheiros…`,emptyTouched:`Ainda não há ficheiros alterados por IA. Execute um job ou mude para Todos os ficheiros.`,showAllFiles:`Mostrar todos os ficheiros`,noFiles:`Sem ficheiros.`,folderTouched_one:`{{count}} ficheiro alterado por IA nesta pasta`,folderTouched_other:`{{count}} ficheiros alterados por IA nesta pasta`,jobTitle:`Job {{jobId}}`,createdBySpec:`Criado durante a implementação da spec #{{id}}`,modifiedBySpec:`Modificado durante a implementação da spec #{{id}}`,latestTitleCreated:`O último job de IA adicionou este ficheiro`,latestTitleModified:`O último job de IA alterou este ficheiro`,latestTitleDeleted:`O último job de IA eliminou este ficheiro`},u={loadFailed:`Falha ao carregar o visualizador de código.`,reload:`Recarregar`,loadingEditor:`A carregar editor…`},d={title:`Ficheiros alterados por este ticket`,jobTitle:`Job {{jobId}}`},f={page:e,resizer:t,toolbar:n,provenancePanel:r,kind:i,action:a,viewer:o,summary:s,history:c,tree:l,monaco:u,ticketFiles:d};export{a as action,f as default,c as history,i as kind,u as monaco,e as page,r as provenancePanel,t as resizer,s as summary,d as ticketFiles,n as toolbar,l as tree,o as viewer};
@@ -1 +0,0 @@
1
- var e={resizeFileTree:`Ridimensiona l'albero dei file`,selectFile:`Seleziona un file per l'anteprima.`},t={hint:`Trascina per ridimensionare. Doppio clic per ripristinare.`},n={scope:`Ambito`,allAi:`Tutta l'AI`,spec:`Spec`,ticketIdPlaceholder:`id`,copyFilePath:`Copia percorso file`,generateSummary:`Genera riepilogo`,regenerateSummary:`Rigenera riepilogo`,generating:`Generazione…`,regenerating:`Rigenerazione…`,summaryUnavailable:`Riepilogo non disponibile: {{reason}}`,jobContext:`Contesto job`,clear:`Cancella`},r={jobTitle:`Job {{jobId}}`,specTitle:`Spec #{{ticketId}}`,touchedFiles_one:`{{count}} file toccato`,touchedFiles_other:`{{count}} file toccati`,log:`Log`},i={created:`creato`,modified:`modificato`,deleted:`eliminato`},a={added:`aggiunto`,changed:`modificato`,deleted:`eliminato`},o={loadingFile:`Caricamento file…`,showSummary:`Mostra riepilogo`,markdownViewMode:`Modalità di visualizzazione Markdown`,preview:`Anteprima`,raw:`Raw`,missingFile:`Questo file è stato toccato da un job AI ma non esiste più nel working tree.`,binaryFile:`File binario.`,tooLarge:`File troppo grande per l'anteprima ({{size}} MB).`,noContent:`Nessun contenuto disponibile.`,pathCopied:`Percorso copiato`,copyPathFailed:`Impossibile copiare il percorso`,budgetPrompt:`Ignorare il limite di budget?`},s={generationFailed:`Generazione del riepilogo non riuscita`,skipped:`Riepilogo saltato: {{reason}}`,unavailable:`Riepilogo non disponibile: {{reason}}.`,empty:`Ancora nessun riepilogo per questo file.`,stale:`Obsoleto`,hide:`Nascondi`,reason:{missing:`file mancante`,binary:`file binario`,tooLarge:`file troppo grande`}},c={resize:`Ridimensiona cronologia interventi AI`,title_one:`Cronologia interventi AI · {{count}} modifica`,title_other:`Cronologia interventi AI · {{count}} modifiche`,show:`Mostra`,hide:`Nascondi`,unknownJob:`job sconosciuto`,filterByJob:`Filtra Codice per job {{jobId}}`,diff:`Diff`,openSpec:`Apri spec #{{ticketId}}`,specChip:`spec #{{ticketId}}`,loadingDiff:`Caricamento diff...`,diffUnavailable:`Diff non disponibile per questo intervento storico. I nuovi job salveranno le patch automaticamente.`,diffTruncated:`[diff troncato]`},l={jobFiles:`File del job`,specFiles:`File della spec`,touchedByAi:`Toccati dall'AI`,allFiles:`Tutti i file`,collapseAll:`Comprimi tutte le cartelle`,expandAll:`Espandi tutte le cartelle`,touchedCount_one:`{{count}} file toccato dall'AI`,touchedCount_other:`{{count}} file toccati dall'AI`,loadingFiles:`Caricamento file…`,emptyTouched:`Ancora nessun file toccato dall'AI. Esegui un job o passa a Tutti i file.`,showAllFiles:`Mostra tutti i file`,noFiles:`Nessun file.`,folderTouched_one:`{{count}} file toccato dall'AI in questa cartella`,folderTouched_other:`{{count}} file toccati dall'AI in questa cartella`,jobTitle:`Job {{jobId}}`,createdBySpec:`Creato durante l'implementazione della spec #{{id}}`,modifiedBySpec:`Modificato durante l'implementazione della spec #{{id}}`,latestTitleCreated:`L'ultimo job AI ha aggiunto questo file`,latestTitleModified:`L'ultimo job AI ha modificato questo file`,latestTitleDeleted:`L'ultimo job AI ha eliminato questo file`},u={loadFailed:`Impossibile caricare il visualizzatore di codice.`,reload:`Ricarica`,loadingEditor:`Caricamento editor…`},d={title:`File toccati da questo ticket`,jobTitle:`Job {{jobId}}`},f={page:e,resizer:t,toolbar:n,provenancePanel:r,kind:i,action:a,viewer:o,summary:s,history:c,tree:l,monaco:u,ticketFiles:d};export{a as action,f as default,c as history,i as kind,u as monaco,e as page,r as provenancePanel,t as resizer,s as summary,d as ticketFiles,n as toolbar,l as tree,o as viewer};