specrails-desktop 2.14.0 → 2.16.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 (108) hide show
  1. package/client/dist/assets/{ActivityFeedPage-BBGvhMX5.js → ActivityFeedPage-C_clKk8d.js} +1 -1
  2. package/client/dist/assets/AgentsPage-jcPUtPhP.js +86 -0
  3. package/client/dist/assets/AnalyticsPage-DZkVU3yd.js +1 -0
  4. package/client/dist/assets/{BarChart-zCFHhnbZ.js → BarChart-Dq1h8eYR.js} +2 -2
  5. package/client/dist/assets/CodePage-BcbZT88K.js +2 -0
  6. package/client/dist/assets/{DesktopAnalyticsPage-DlrcBWPo.js → DesktopAnalyticsPage-CYhXhJoQ.js} +1 -1
  7. package/client/dist/assets/{DocsDialog-B8mSbQhA.js → DocsDialog-CS3Syf61.js} +2 -2
  8. package/client/dist/assets/{DocsPage-D7t2Bc-K.js → DocsPage-l3ZcTO2E.js} +2 -2
  9. package/client/dist/assets/{ExportDropdown-ClTut9WA.js → ExportDropdown-DdB2ncYh.js} +1 -1
  10. package/client/dist/assets/IntegrationsPage-CJ_Om1zu.js +3 -0
  11. package/client/dist/assets/JobDetailPage-D5Cxw0md.js +16 -0
  12. package/client/dist/assets/JobsPage-3v_iX83r.js +1 -0
  13. package/client/dist/assets/{LoopBuilderPage-CScd8wyY.js → LoopBuilderPage-4s_adZy5.js} +2 -2
  14. package/client/dist/assets/LoopsPage-DA94-o0j.js +1 -0
  15. package/client/dist/assets/analytics-BDlELxc7.js +1 -0
  16. package/client/dist/assets/analytics-BE49LbUk.js +1 -0
  17. package/client/dist/assets/analytics-CQqu1yE5.js +1 -0
  18. package/client/dist/assets/analytics-CgEkAUiP.js +1 -0
  19. package/client/dist/assets/analytics-D1ElChhs.js +1 -0
  20. package/client/dist/assets/analytics-DBGO8B6-.js +1 -0
  21. package/client/dist/assets/analytics-DDqve9Ma.js +1 -0
  22. package/client/dist/assets/analytics-DEsEAJZL.js +1 -0
  23. package/client/dist/assets/{common-DI4jE5y-.js → common-C9VyfY7g.js} +1 -1
  24. package/client/dist/assets/{common-DTHzyfYC.js → common-CNoRVpnA.js} +1 -1
  25. package/client/dist/assets/{common-CnrZ9gCZ.js → common-CcHFVATT.js} +1 -1
  26. package/client/dist/assets/{common-BhFasU8N.js → common-CzCQ0rpW.js} +1 -1
  27. package/client/dist/assets/{common-DY4nzbWC.js → common-Dmpyh323.js} +1 -1
  28. package/client/dist/assets/{common-CwhHWbTD.js → common-LDwESeCX.js} +1 -1
  29. package/client/dist/assets/{common-DS8zKLQT.js → common-ULlk84G4.js} +1 -1
  30. package/client/dist/assets/common-kftoE0Q-.js +1 -0
  31. package/client/dist/assets/dashboard-03EpOoMM.js +1 -0
  32. package/client/dist/assets/dashboard-BQ3Oa8CE.js +1 -0
  33. package/client/dist/assets/dashboard-C-dXxut-.js +1 -0
  34. package/client/dist/assets/dashboard-C2owt3eN.js +1 -0
  35. package/client/dist/assets/dashboard-C52PElPV.js +1 -0
  36. package/client/dist/assets/dashboard-CUjyhohl.js +1 -0
  37. package/client/dist/assets/dashboard-Ch6H-457.js +1 -0
  38. package/client/dist/assets/dashboard-zH9quXks.js +1 -0
  39. package/client/dist/assets/{dist-js-Ca7dsMhN.js → dist-js-D27I-bfi.js} +1 -1
  40. package/client/dist/assets/{dist-js-BHJ5LpTw.js → dist-js-Ele_sHO7.js} +1 -1
  41. package/client/dist/assets/index-BRMyOS1B.css +2 -0
  42. package/client/dist/assets/index-meTWPBzY.js +144 -0
  43. package/client/dist/assets/{lib-3_pPhUqA.js → lib-qdRfWwE1.js} +1 -1
  44. package/client/dist/assets/{tickets-IbYhlr-6.js → tickets-68LH1xp6.js} +1 -1
  45. package/client/dist/assets/{tickets-EnP6m_Ao.js → tickets-D6f3GSYn.js} +1 -1
  46. package/client/dist/assets/{tickets-BFrVcXAI.js → tickets-DBQXMYYA.js} +1 -1
  47. package/client/dist/assets/{tickets-C3gG--yT.js → tickets-OrJwUxJR.js} +1 -1
  48. package/client/dist/assets/{tickets-Cfhwbdxj.js → tickets-PtHNxQo5.js} +1 -1
  49. package/client/dist/assets/{tickets-ZS5EsDxn.js → tickets-REr-EQx9.js} +1 -1
  50. package/client/dist/assets/{tickets-DcggvP3k.js → tickets-blQnNA4N.js} +1 -1
  51. package/client/dist/assets/{tickets-lJR7pWNI.js → tickets-jxsTrApR.js} +1 -1
  52. package/client/dist/assets/{upload-DsygVwLQ.js → upload-DPG87J4t.js} +1 -1
  53. package/client/dist/assets/{value-B5mYukkD.js → value-BRVOAvhY.js} +1 -1
  54. package/client/dist/index.html +6 -6
  55. package/package.json +1 -1
  56. package/server/dist/ai-invocations.js +5 -2
  57. package/server/dist/db.js +35 -2
  58. package/server/dist/desktop-analytics.js +39 -6
  59. package/server/dist/loop-command-catalog.js +40 -1
  60. package/server/dist/loop-constants.js +37 -1
  61. package/server/dist/loop-decider.js +13 -10
  62. package/server/dist/loop-executors.js +58 -6
  63. package/server/dist/loop-factory.js +10 -3
  64. package/server/dist/loop-run-manager.js +199 -16
  65. package/server/dist/loop-runs-store.js +51 -0
  66. package/server/dist/loop-templates-ported.js +25 -21
  67. package/server/dist/loop-templates.js +87 -7
  68. package/server/dist/merge-manager.js +81 -0
  69. package/server/dist/pricing.js +20 -1
  70. package/server/dist/project-registry.js +7 -0
  71. package/server/dist/project-router-spending.js +56 -8
  72. package/server/dist/queue-manager.js +70 -10
  73. package/server/dist/rail-isolated-launch.js +189 -0
  74. package/server/dist/rail-isolation.js +55 -0
  75. package/server/dist/rail-merge-orchestrator.js +45 -0
  76. package/server/dist/rail-worktrees-store.js +52 -0
  77. package/server/dist/rails-router.js +47 -4
  78. package/server/dist/repo-lock.js +25 -0
  79. package/server/dist/result-event.js +15 -1
  80. package/server/dist/spending.js +161 -21
  81. package/server/dist/workspace-manager.js +134 -14
  82. package/server/dist/worktree-manager.js +159 -0
  83. package/client/dist/assets/AgentsPage-CSrs9kuV.js +0 -86
  84. package/client/dist/assets/AnalyticsPage-B011XilA.js +0 -1
  85. package/client/dist/assets/CodePage-MB0JiLis.js +0 -2
  86. package/client/dist/assets/IntegrationsPage-CgJf4uLW.js +0 -3
  87. package/client/dist/assets/JobDetailPage-DlyLLI4l.js +0 -16
  88. package/client/dist/assets/JobsPage-mbez97dP.js +0 -1
  89. package/client/dist/assets/LoopsPage-mBDRcEzq.js +0 -1
  90. package/client/dist/assets/analytics-BHApBnUn.js +0 -1
  91. package/client/dist/assets/analytics-BUxrug9J.js +0 -1
  92. package/client/dist/assets/analytics-Cy6DTfO-.js +0 -1
  93. package/client/dist/assets/analytics-DMJxD9FD.js +0 -1
  94. package/client/dist/assets/analytics-DgrBuxla.js +0 -1
  95. package/client/dist/assets/analytics-DwxT1CS8.js +0 -1
  96. package/client/dist/assets/analytics-GrLc-SMr.js +0 -1
  97. package/client/dist/assets/analytics-qvPq4T4h.js +0 -1
  98. package/client/dist/assets/common-D9GAPxeN.js +0 -1
  99. package/client/dist/assets/dashboard-8FSyxKGV.js +0 -1
  100. package/client/dist/assets/dashboard-A9XQUfdS.js +0 -1
  101. package/client/dist/assets/dashboard-BFktSDsV.js +0 -1
  102. package/client/dist/assets/dashboard-C1PKCXLs.js +0 -1
  103. package/client/dist/assets/dashboard-DNf0czU-.js +0 -1
  104. package/client/dist/assets/dashboard-DQQCOVfu.js +0 -1
  105. package/client/dist/assets/dashboard-DxFqeHZk.js +0 -1
  106. package/client/dist/assets/dashboard-WvPGhbbi.js +0 -1
  107. package/client/dist/assets/index-ByhYcYLV.css +0 -2
  108. package/client/dist/assets/index-CEunZ8kJ.js +0 -144
@@ -0,0 +1 @@
1
+ import{r as e}from"./chunk-CilyBKbf.js";import{n as t,r as n,t as r}from"./upload-DPG87J4t.js";import{Bt as i,Ct as a,F as o,H as s,Ht as c,I as l,J as u,K as d,M as f,N as p,P as m,Q as h,U as g,Vt as _,Y as v,Z as y,bn as b,g as x,gn as S,gt as C,h as w,hn as T,j as E,lt as D,m as O,st as ee,tn as te,ut as k,w as A,wn as j,wt as M}from"./index-meTWPBzY.js";var N=i(`file-down`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M12 18v-6`,key:`17g6i2`}],[`path`,{d:`m9 15 3 3 3-3`,key:`1npd3o`}]]),ne=i(`file-up`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M12 12v6`,key:`3ahymv`}],[`path`,{d:`m15 15-3-3-3 3`,key:`15xj92`}]]),P=e(j(),1);function re(e){return{specrailsLoops:1,loops:e.map(e=>({name:e.name,description:e.description,graph:e.graph}))}}function F(e){let t=e;return!!t&&typeof t.name==`string`&&!!t.graph&&typeof t.graph==`object`}function ie(e){let t;try{t=JSON.parse(e)}catch{throw Error(`invalid-json`)}let n=(Array.isArray(t)?t:Array.isArray(t?.loops)?t.loops:F(t)?[t]:[]).filter(F);if(n.length===0)throw Error(`no-loops`);return n.map(e=>({name:e.name,description:e.description??null,graph:e.graph}))}function ae(e){return e.length===1?`${e[0].name.trim().toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``)||`loop`}.loop.json`:`specrails-loops-${e.length}.json`}var I=[`API`,`Automation`,`CI`,`Database`,`Debugging`,`DevOps`,`Docs`,`Git`,`Maintenance`,`Performance`,`Planning`,`Quality`,`Review`,`Security`,`Testing`];function oe(e,t){let n=t.query.trim().toLowerCase(),r=t.categories;return e.filter(e=>r.length>0&&!(e.category&&r.includes(e.category))?!1:n?`${e.name} ${e.description} ${e.tags.join(` `)} ${e.category??``} ${e.searchTerms??``}`.toLowerCase().includes(n):!0)}function se(e){let t=new Map;for(let n of e)n.category&&t.set(n.category,(t.get(n.category)??0)+1);let n=[];for(let e of I){let r=t.get(e);r&&(n.push({category:e,count:r}),t.delete(e))}for(let e of[...t.keys()].sort())n.push({category:e,count:t.get(e)});return n}var L=te(),R={start:D,"ai-step":n,shell:v,decider:C,condition:C,end:y};function ce(e){return e.type===`ai-step`?typeof e.data?.prompt==`string`?e.data.prompt:null:e.type===`shell`?typeof e.data?.command==`string`?e.data.command:null:e.type===`decider`?typeof e.data?.goal==`string`?e.data.goal:null:e.type===`end`?e.data?.outcome===`failure`?`failure`:`success`:null}function le({template:e,onClose:t,onUse:r,mode:i=`use`}){let{t:c}=S(`loops`);return(0,L.jsx)(E,{open:e!==null,onOpenChange:e=>{e||t()},children:(0,L.jsx)(f,{movableResizable:!0,className:`max-w-lg`,children:e&&(0,L.jsxs)(L.Fragment,{children:[(0,L.jsxs)(o,{children:[(0,L.jsxs)(l,{className:`flex items-center gap-2`,children:[(0,L.jsx)(n,{className:`w-4 h-4 text-accent-highlight`}),e.name]}),(0,L.jsx)(p,{children:e.description})]}),(0,L.jsxs)(`div`,{className:`flex flex-wrap gap-1.5`,children:[O(e.graph)?(0,L.jsx)(`span`,{title:c(`gallery.needsSpecHint`),className:`px-1.5 py-0.5 rounded text-[10px] bg-accent-secondary/15 text-accent-secondary`,children:c(`gallery.needsSpec`)}):(0,L.jsx)(`span`,{title:c(`gallery.standaloneHint`),className:`px-1.5 py-0.5 rounded text-[10px] bg-accent-success/15 text-accent-success`,children:c(`gallery.standalone`)}),e.category&&(0,L.jsx)(`span`,{className:`px-1.5 py-0.5 rounded text-[10px] bg-accent-info/15 text-accent-info`,children:c(`categories.${e.category}`,{defaultValue:e.category})}),e.tags.map(e=>(0,L.jsx)(`span`,{className:`px-1.5 py-0.5 rounded text-[10px] bg-muted text-muted-foreground`,children:e},e))]}),(0,L.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:c(`preview.limits`,{iterations:e.graph.config.maxIterations,timeout:e.graph.config.timeoutMinutes})}),(0,L.jsxs)(`div`,{className:`max-h-[50vh] overflow-y-auto space-y-1.5 pr-1`,children:[(0,L.jsx)(`span`,{className:`block text-[10px] font-medium uppercase tracking-wide text-muted-foreground`,children:c(`preview.steps`)}),e.graph.nodes.map((e,t)=>{let n=R[e.type]??y,r=ce(e);return(0,L.jsxs)(`div`,{className:`rounded border border-border bg-surface/30 p-2`,children:[(0,L.jsxs)(`div`,{className:`flex items-center gap-1.5 text-xs font-medium text-foreground`,children:[(0,L.jsxs)(`span`,{className:`text-[10px] text-muted-foreground tabular-nums`,children:[t+1,`.`]}),(0,L.jsx)(n,{className:`w-3.5 h-3.5 text-accent-primary`}),c(`builder.nodes.${e.type}`)]}),r&&(0,L.jsx)(`pre`,{className:`mt-1 whitespace-pre-wrap break-words text-[11px] text-muted-foreground font-mono`,children:r})]},e.id)})]}),(0,L.jsxs)(m,{children:[(0,L.jsx)(s,{variant:`ghost`,onClick:t,children:c(`common:actions.cancel`)}),(0,L.jsxs)(s,{onClick:()=>r(e.id),children:[i===`fork`?(0,L.jsx)(M,{className:`w-3.5 h-3.5 mr-1.5`}):(0,L.jsx)(a,{className:`w-3.5 h-3.5 mr-1.5`}),c(i===`fork`?`actions.fork`:`actions.use`)]})]})]})})})}var z={claude:[{value:`sonnet`,label:`Claude Sonnet`},{value:`opus`,label:`Claude Opus`},{value:`haiku`,label:`Claude Haiku`}],codex:[{value:`gpt-5.5`,label:`GPT-5.5`},{value:`gpt-5.4`,label:`GPT-5.4`},{value:`gpt-5.4-mini`,label:`GPT-5.4 Mini`},{value:`gpt-5.3-codex`,label:`GPT-5.3 Codex`}],gemini:[{value:`gemini-3.5-flash`,label:`Gemini 3.5 Flash`},{value:`gemini-3.1-pro-preview`,label:`Gemini 3.1 Pro (preview)`},{value:`gemini-3.1-flash-lite`,label:`Gemini 3.1 Flash Lite`},{value:`gemini-2.5-flash-lite`,label:`Gemini 2.5 Flash Lite`}]};function B(e){return e&&z[e]||[]}function V(e){return B(e)[0]?.value??``}function ue({loop:e,projects:t,onClose:n,onExecute:r}){let{t:i}=S(`loops`),a=e!==null,[c,u]=(0,P.useState)(``),[d,h]=(0,P.useState)(``),[g,_]=(0,P.useState)(``),[v,y]=(0,P.useState)(`medium`),b=t.find(e=>e.id===(c||t[0]?.id)),x=(0,P.useMemo)(()=>b?.providers??(b?.provider?[b.provider]:[]),[b]),C=d||x[0]||``,w=(0,P.useMemo)(()=>B(C),[C]),T=g||V(C),O=C?A(C):!1;return(0,L.jsx)(E,{open:a,onOpenChange:e=>{e||n()},children:(0,L.jsx)(f,{movableResizable:!0,className:`max-w-sm`,children:e&&(0,L.jsxs)(L.Fragment,{children:[(0,L.jsxs)(o,{children:[(0,L.jsx)(l,{children:i(`run.title`,{name:e.name})}),(0,L.jsx)(p,{children:i(`run.subtitle`)})]}),(0,L.jsx)(`label`,{className:`block text-[11px] font-medium text-muted-foreground`,children:i(`run.project`)}),t.length===0?(0,L.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:i(`run.noProjects`)}):(0,L.jsx)(`select`,{"aria-label":i(`run.project`),"data-testid":`run-project-select`,value:c||t[0]?.id,onChange:e=>{u(e.target.value),h(``),_(``)},className:`w-full text-xs rounded border border-border bg-transparent px-2 py-1 text-foreground focus:outline-none focus:ring-1 focus:ring-accent-primary/40`,children:t.map(e=>(0,L.jsx)(`option`,{value:e.id,children:e.name},e.id))}),x.length>1&&(0,L.jsxs)(L.Fragment,{children:[(0,L.jsx)(`label`,{className:`block text-[11px] font-medium text-muted-foreground`,children:i(`run.provider`)}),(0,L.jsx)(`select`,{"aria-label":i(`run.provider`),value:C,onChange:e=>{h(e.target.value),_(``)},className:`w-full text-xs rounded border border-border bg-transparent px-2 py-1 text-foreground focus:outline-none focus:ring-1 focus:ring-accent-primary/40`,children:x.map(e=>(0,L.jsx)(`option`,{value:e,children:e},e))})]}),w.length>0&&(0,L.jsxs)(L.Fragment,{children:[(0,L.jsx)(`label`,{className:`block text-[11px] font-medium text-muted-foreground`,children:i(`run.model`)}),(0,L.jsx)(`select`,{"aria-label":i(`run.model`),"data-testid":`run-model-select`,value:T,onChange:e=>_(e.target.value),className:`w-full text-xs rounded border border-border bg-transparent px-2 py-1 text-foreground focus:outline-none focus:ring-1 focus:ring-accent-primary/40`,children:w.map(e=>(0,L.jsx)(`option`,{value:e.value,children:e.label},e.value))})]}),O&&(0,L.jsxs)(L.Fragment,{children:[(0,L.jsx)(`label`,{className:`block text-[11px] font-medium text-muted-foreground`,children:i(`run.effort`)}),(0,L.jsxs)(`select`,{"aria-label":i(`run.effort`),value:v,onChange:e=>y(e.target.value),className:`w-full text-xs rounded border border-border bg-transparent px-2 py-1 text-foreground focus:outline-none focus:ring-1 focus:ring-accent-primary/40`,children:[(0,L.jsx)(`option`,{value:`low`,children:`low`}),(0,L.jsx)(`option`,{value:`medium`,children:`medium`}),(0,L.jsx)(`option`,{value:`high`,children:`high`})]})]}),(0,L.jsxs)(m,{children:[(0,L.jsx)(s,{variant:`ghost`,onClick:n,children:i(`common:actions.cancel`)}),(0,L.jsxs)(s,{onClick:()=>{let e=c||t[0]?.id;e&&r({projectId:e,provider:x.length>1?C:void 0,model:w.length>0?T:void 0,effort:O?v:void 0})},disabled:t.length===0,children:[(0,L.jsx)(D,{className:`w-3.5 h-3.5 mr-1.5`}),i(`run.execute`)]})]})]})})})}var H={draft:`bg-accent-secondary/15 text-accent-secondary ring-accent-secondary/40`,published:`bg-accent-success/15 text-accent-success ring-accent-success/40`};function U({status:e}){let{t}=S(`loops`);return(0,L.jsx)(`span`,{className:g(`inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-medium ring-1 ring-inset`,H[e]),children:t(`status.${e}`)})}function W(){let{t:e}=S(`loops`),n=b(),r=(0,P.useCallback)(e=>e.replace(/:/g,`_`),[]),i=(0,P.useCallback)((t,n)=>e(`catalog.${r(t)}.name`,{defaultValue:n}),[e,r]),v=(0,P.useCallback)((t,n)=>e(`catalog.${r(t)}.description`,{defaultValue:n}),[e,r]),[y,C]=(0,P.useState)([]),[D,te]=(0,P.useState)([]),[k,A]=(0,P.useState)([]),[j,F]=(0,P.useState)(!0),[I,R]=(0,P.useState)(null),[ce,z]=(0,P.useState)(null),[B,V]=(0,P.useState)(`use`),[H,U]=(0,P.useState)(null),[W,K]=(0,P.useState)(new Set),fe=`specrails-desktop:loop-template-filter`,pe=(()=>{try{let e=localStorage.getItem(fe),t=e?JSON.parse(e):null;return{query:typeof t?.query==`string`?t.query:``,categories:Array.isArray(t?.categories)?t.categories:[]}}catch{return{query:``,categories:[]}}})(),[q,me]=(0,P.useState)(pe.query),[J,he]=(0,P.useState)(pe.categories);(0,P.useEffect)(()=>{try{localStorage.setItem(fe,JSON.stringify({query:q,categories:J}))}catch{}},[q,J]);let ge=(0,P.useCallback)(e=>{he(t=>t.includes(e)?t.filter(t=>t!==e):[...t,e])},[]),_e=(0,P.useCallback)(()=>{me(``),he([])},[]),ve=(0,P.useRef)(null),{projects:ye,setActiveProjectId:be}=c(),xe=(0,P.useCallback)(e=>{K(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),Y=(0,P.useCallback)(e=>{if(e.length===0)return;let t=new Blob([JSON.stringify(re(e),null,2)],{type:`application/json`}),n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=ae(e),r.click(),URL.revokeObjectURL(n)},[]),X=(0,P.useCallback)(async()=>{try{let[e,t]=await Promise.all([x.list(),x.templates()]);C(e),te(t)}catch{T.error(e(`errors.load`))}finally{F(!1)}try{A(await x.factoryLoops())}catch{A([])}},[e]);(0,P.useEffect)(()=>{X()},[X]);let Se=(0,P.useCallback)(async t=>{try{let n=ie(await t.text()),{imported:r,skipped:i}=await x.importLoops(n);await X(),r.length&&T.success(e(`import.done`,{count:r.length})),i.length&&T.warning(e(`import.skipped`,{count:i.length,names:i.join(`, `)})),!r.length&&!i.length&&T.warning(e(`import.invalid`))}catch(t){let n=t instanceof Error?t.message:``;T.error(e(n===`invalid-json`||n===`no-loops`?`import.invalid`:`errors.save`))}},[X,e]),Z=(0,P.useCallback)(e=>n(`/loops/${e}/edit`),[n]),Ce=(0,P.useCallback)(async()=>{try{Z((await x.create({name:e(`newLoopName`)})).id)}catch{T.error(e(`errors.save`))}},[e,Z]),we=(0,P.useCallback)(async t=>{try{Z((await x.fromTemplate(t)).id)}catch{T.error(e(`errors.save`))}},[e,Z]),Te=(0,P.useCallback)(async t=>{try{Z((await x.forkFactory(t)).id)}catch{T.error(e(`errors.save`))}},[e,Z]),Ee=(0,P.useCallback)(async({projectId:t,provider:r,model:i,effort:a})=>{let o=H;if(o){U(null);try{let{loopRunId:s}=await x.runStandalone(t,o.id,{aiEngine:r,model:i,reasoning_effort:a});be(t),n(`/jobs/${s}`),T.success(e(`run.launched`,{name:o.name}))}catch{T.error(e(`errors.save`))}}},[H,n,be,e]),De=(0,P.useCallback)(e=>{V(`fork`),z({id:e.id,name:i(e.id,e.name),description:v(e.id,e.description),tags:e.claudeOnly?[`claude-only`]:[],graph:e.graph})},[i,v]),Oe=(0,P.useCallback)(async t=>{try{await x.publish(t),await X()}catch(t){t instanceof w?T.error(e(`errors.publishInvalid`)):T.error(e(`errors.save`))}},[e,X]),ke=(0,P.useCallback)(async t=>{try{await x.unpublish(t),await X()}catch{T.error(e(`errors.save`))}},[e,X]),Ae=(0,P.useCallback)(async t=>{try{await x.duplicate(t),await X()}catch{T.error(e(`errors.save`))}},[e,X]),je=(0,P.useCallback)(e=>R(e),[]),Me=(0,P.useCallback)(async()=>{let t=I;if(t){R(null);try{await x.remove(t),await X()}catch{T.error(e(`errors.save`))}}},[I,e,X]),Q=y.filter(e=>e.status===`draft`),$=y.filter(e=>e.status===`published`),Ne=se(D),Pe=oe(D.map(t=>({...t,searchTerms:`${i(t.id,t.name)} ${v(t.id,t.description)} ${t.category?e(`categories.${t.category}`,{defaultValue:t.category}):``}`})),{query:q,categories:J}),Fe=q.trim()!==``||J.length>0;return(0,L.jsxs)(`div`,{className:`h-full overflow-y-auto`,children:[(0,L.jsxs)(`div`,{className:`max-w-5xl mx-auto px-6 py-6`,children:[(0,L.jsxs)(`div`,{className:`flex items-start justify-between mb-6`,children:[(0,L.jsxs)(`div`,{className:`flex items-center gap-2.5`,children:[(0,L.jsx)(d,{className:`w-5 h-5 text-accent-primary`}),(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`h1`,{className:`text-lg font-semibold text-foreground`,children:e(`title`)}),(0,L.jsx)(`p`,{className:`text-xs text-muted-foreground mt-0.5`,children:e(`subtitle`)})]})]}),(0,L.jsxs)(`div`,{className:`flex items-center gap-2`,children:[W.size>0&&(0,L.jsxs)(`button`,{type:`button`,onClick:()=>Y(y.filter(e=>W.has(e.id))),className:`inline-flex items-center gap-1.5 h-8 px-3 rounded-md text-xs font-medium border border-border text-foreground hover:bg-muted`,children:[(0,L.jsx)(N,{className:`w-3.5 h-3.5`}),e(`actions.export`),` (`,W.size,`)`]}),(0,L.jsxs)(`button`,{type:`button`,onClick:()=>ve.current?.click(),className:`inline-flex items-center gap-1.5 h-8 px-3 rounded-md text-xs font-medium border border-border text-foreground hover:bg-muted`,children:[(0,L.jsx)(ne,{className:`w-3.5 h-3.5`}),e(`actions.import`)]}),(0,L.jsx)(`input`,{ref:ve,type:`file`,accept:`application/json,.json`,className:`hidden`,onChange:e=>{let t=e.target.files?.[0];t&&Se(t),e.target.value=``}}),(0,L.jsxs)(`button`,{type:`button`,onClick:Ce,className:`inline-flex items-center gap-1.5 h-8 px-3 rounded-md text-xs font-medium bg-accent-primary text-white hover:bg-accent-primary/90`,children:[(0,L.jsx)(ee,{className:`w-3.5 h-3.5`}),e(`newLoop`)]})]})]}),j?(0,L.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`…`}):(0,L.jsxs)(`div`,{className:`space-y-8`,children:[Q.length===0&&$.length===0&&(0,L.jsxs)(`div`,{className:`rounded-lg border border-dashed border-border p-8 text-center`,children:[(0,L.jsx)(`p`,{className:`text-sm font-medium text-foreground`,children:e(`empty.title`)}),(0,L.jsx)(`p`,{className:`text-xs text-muted-foreground mt-1`,children:e(`empty.body`)})]}),$.length>0&&(0,L.jsx)(G,{title:e(`sections.published`),children:$.map(e=>(0,L.jsx)(de,{loop:e,selected:W.has(e.id),onToggleSelect:()=>xe(e.id),onEdit:()=>Z(e.id),onUnpublish:()=>ke(e.id),onDuplicate:()=>Ae(e.id),onExport:()=>Y([e]),onDelete:()=>je(e.id),onRun:O(e.graph)?void 0:()=>U(e)},e.id))}),Q.length>0&&(0,L.jsx)(G,{title:e(`sections.drafts`),children:Q.map(e=>(0,L.jsx)(de,{loop:e,selected:W.has(e.id),onToggleSelect:()=>xe(e.id),onEdit:()=>Z(e.id),onPublish:()=>Oe(e.id),onDuplicate:()=>Ae(e.id),onExport:()=>Y([e]),onDelete:()=>je(e.id)},e.id))}),k.length>0&&(0,L.jsx)(G,{title:e(`sections.builtIn`),children:k.map(n=>(0,L.jsxs)(`div`,{className:`rounded-lg border border-border bg-card p-3 flex flex-col gap-2`,"data-testid":`factory-loop-card`,children:[(0,L.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,L.jsx)(d,{className:`w-3.5 h-3.5 text-accent-primary`}),(0,L.jsx)(`span`,{className:`text-sm font-medium text-foreground`,children:i(n.id,n.name)}),(0,L.jsx)(`span`,{className:`ml-auto px-1.5 py-0.5 rounded text-[10px] bg-muted text-muted-foreground`,children:e(`builtInBadge`)})]}),(0,L.jsx)(`p`,{className:`text-xs text-muted-foreground flex-1`,children:v(n.id,n.description)}),(0,L.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,L.jsxs)(`button`,{type:`button`,onClick:()=>De(n),className:`inline-flex items-center gap-1.5 h-7 px-2.5 rounded-md text-xs border border-border hover:bg-muted text-foreground`,children:[(0,L.jsx)(t,{className:`w-3 h-3`}),e(`actions.preview`)]}),(0,L.jsxs)(`button`,{type:`button`,onClick:()=>void Te(n.id),className:`inline-flex items-center gap-1.5 h-7 px-2.5 rounded-md text-xs border border-border hover:bg-muted text-foreground`,children:[(0,L.jsx)(M,{className:`w-3 h-3`}),e(`actions.fork`)]})]})]},n.id))}),D.length>0&&(0,L.jsxs)(`section`,{children:[(0,L.jsxs)(`div`,{className:`flex items-center justify-between gap-3 mb-2 flex-wrap`,children:[(0,L.jsx)(`h2`,{className:`text-xs font-semibold uppercase tracking-wide text-muted-foreground`,children:e(`sections.templates`)}),(0,L.jsx)(`input`,{type:`search`,value:q,onChange:e=>me(e.target.value),placeholder:e(`gallery.search`),"aria-label":e(`gallery.search`),"data-testid":`template-search`,className:`h-7 w-48 max-w-full rounded-md border border-border bg-surface/40 px-2.5 text-xs text-foreground placeholder:text-muted-foreground/70 focus:outline-none focus:ring-1 focus:ring-accent-primary`})]}),(0,L.jsxs)(`div`,{className:`flex flex-wrap items-center gap-1.5 mb-3`,"data-testid":`category-chips`,children:[Ne.map(({category:t,count:n})=>{let r=J.includes(t);return(0,L.jsxs)(`button`,{type:`button`,"aria-pressed":r,onClick:()=>ge(t),className:g(`inline-flex items-center gap-1 h-6 px-2 rounded-full text-[11px] border transition-colors`,r?`border-accent-primary bg-accent-primary/15 text-accent-primary`:`border-border bg-surface/40 text-muted-foreground hover:text-foreground hover:bg-muted`),children:[e(`categories.${t}`,{defaultValue:t}),(0,L.jsx)(`span`,{className:`opacity-60 tabular-nums`,children:n})]},t)}),Fe&&(0,L.jsx)(`button`,{type:`button`,onClick:_e,className:`inline-flex items-center h-6 px-2 rounded-full text-[11px] text-accent-primary hover:underline`,children:e(`gallery.clearFilter`)})]}),Pe.length===0?(0,L.jsxs)(`div`,{className:`rounded-lg border border-dashed border-border p-6 text-center`,"data-testid":`template-empty`,children:[(0,L.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e(`gallery.noResults`)}),(0,L.jsx)(`button`,{type:`button`,onClick:_e,className:`mt-2 text-xs text-accent-primary hover:underline`,children:e(`gallery.clearFilter`)})]}):(0,L.jsx)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3`,children:Pe.map(n=>(0,L.jsxs)(`div`,{className:`rounded-lg border border-border bg-card p-3 flex flex-col gap-2`,"data-testid":`template-card`,children:[(0,L.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,L.jsx)(h,{className:`w-3.5 h-3.5 text-accent-highlight flex-shrink-0`}),(0,L.jsx)(`span`,{className:`text-sm font-medium text-foreground truncate`,children:i(n.id,n.name)}),n.category&&(0,L.jsx)(`span`,{className:`ml-auto px-1.5 py-0.5 rounded text-[10px] bg-accent-info/15 text-accent-info flex-shrink-0`,children:e(`categories.${n.category}`,{defaultValue:n.category})})]}),(0,L.jsx)(`p`,{className:`text-xs text-muted-foreground flex-1`,children:v(n.id,n.description)}),(0,L.jsxs)(`div`,{className:`flex flex-wrap items-center gap-1`,children:[O(n.graph)?(0,L.jsx)(`span`,{title:e(`gallery.needsSpecHint`),className:`px-1.5 py-0.5 rounded text-[10px] bg-accent-secondary/15 text-accent-secondary`,children:e(`gallery.needsSpec`)}):(0,L.jsx)(`span`,{title:e(`gallery.standaloneHint`),className:`px-1.5 py-0.5 rounded text-[10px] bg-accent-success/15 text-accent-success`,children:e(`gallery.standalone`)}),n.tags.map(e=>(0,L.jsx)(`span`,{className:`px-1.5 py-0.5 rounded text-[10px] bg-muted text-muted-foreground`,children:e},e))]}),(0,L.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,L.jsxs)(`button`,{type:`button`,onClick:()=>{V(`use`),z({...n,name:i(n.id,n.name),description:v(n.id,n.description)})},className:`inline-flex items-center gap-1.5 h-7 px-2.5 rounded-md text-xs border border-border hover:bg-muted text-foreground`,children:[(0,L.jsx)(t,{className:`w-3 h-3`}),e(`actions.preview`)]}),(0,L.jsxs)(`button`,{type:`button`,onClick:()=>we(n.id),className:`inline-flex items-center gap-1.5 h-7 px-2.5 rounded-md text-xs border border-border hover:bg-muted text-foreground`,children:[(0,L.jsx)(a,{className:`w-3 h-3`}),e(`actions.use`)]})]})]},n.id))})]})]})]}),(0,L.jsx)(E,{open:I!==null,onOpenChange:e=>{e||R(null)},children:(0,L.jsxs)(f,{className:`max-w-sm`,children:[(0,L.jsxs)(o,{children:[(0,L.jsxs)(l,{className:`flex items-center gap-2`,children:[(0,L.jsx)(u,{className:`w-4 h-4 text-destructive`}),y.find(e=>e.id===I)?.name??e(`actions.delete`)]}),(0,L.jsx)(p,{children:e(`confirmDelete`)})]}),(0,L.jsxs)(m,{children:[(0,L.jsx)(s,{variant:`ghost`,onClick:()=>R(null),children:e(`common:actions.cancel`)}),(0,L.jsx)(s,{variant:`destructive`,onClick:()=>void Me(),children:e(`common:actions.delete`)})]})]})}),(0,L.jsx)(le,{template:ce,mode:B,onClose:()=>z(null),onUse:e=>{z(null),B===`fork`?Te(e):we(e)}}),(0,L.jsx)(ue,{loop:H?{id:H.id,name:H.name}:null,projects:ye.map(e=>({id:e.id,name:e.name,providers:_(e)})),onClose:()=>U(null),onExecute:Ee})]})}function G({title:e,children:t}){return(0,L.jsxs)(`section`,{children:[(0,L.jsx)(`h2`,{className:`text-xs font-semibold uppercase tracking-wide text-muted-foreground mb-2`,children:e}),(0,L.jsx)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3`,children:t})]})}function de({loop:e,selected:t,onToggleSelect:n,onEdit:i,onPublish:o,onUnpublish:s,onDuplicate:c,onExport:l,onDelete:d,onRun:f}){let{t:p}=S(`loops`),m=e.graph?.nodes?.length??0;return(0,L.jsxs)(`div`,{className:`rounded-lg border border-border bg-card p-3 flex flex-col gap-2`,"data-testid":`loop-card`,children:[(0,L.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,L.jsxs)(`div`,{className:`flex items-center gap-2 min-w-0`,children:[(0,L.jsx)(`input`,{type:`checkbox`,checked:t,onChange:n,"aria-label":p(`actions.select`,{name:e.name}),className:`accent-accent-primary flex-shrink-0`}),(0,L.jsx)(`span`,{className:`text-sm font-medium text-foreground truncate`,children:e.name})]}),(0,L.jsx)(U,{status:e.status})]}),(0,L.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:p(`card.nodes`,{count:m})}),(0,L.jsxs)(`div`,{className:`flex items-center gap-1 flex-wrap`,children:[f&&(0,L.jsx)(K,{icon:D,label:p(`actions.run`),onClick:f}),(0,L.jsx)(K,{icon:k,label:p(`actions.edit`),onClick:i}),o&&(0,L.jsx)(K,{icon:r,label:p(`actions.publish`),onClick:o}),s&&(0,L.jsx)(K,{icon:a,label:p(`actions.unpublish`),onClick:s}),(0,L.jsx)(K,{icon:M,label:p(`actions.duplicate`),onClick:c}),(0,L.jsx)(K,{icon:N,label:p(`actions.export`),onClick:l}),(0,L.jsx)(K,{icon:u,label:p(`actions.delete`),onClick:d,danger:!0})]})]})}function K({icon:e,label:t,onClick:n,danger:r}){return(0,L.jsx)(`button`,{type:`button`,onClick:n,title:t,"aria-label":t,className:g(`inline-flex items-center justify-center w-7 h-7 rounded-md transition-colors`,r?`text-muted-foreground hover:text-destructive hover:bg-destructive/10`:`text-muted-foreground hover:text-foreground hover:bg-muted`),children:(0,L.jsx)(e,{className:`w-3.5 h-3.5`})})}export{W as default};
@@ -0,0 +1 @@
1
+ var e={job:`ジョブ`,quickSpec:`クイック`,exploreSpec:`Explore`,aiEdit:`リファイン`,smash:`SMASH`,fileSummary:`ファイル要約`,loop:`Loops`},t={d7:`7日`,d30:`30日`,d90:`90日`,all:`すべて`,custom:`カスタム`,startDate:`開始日`,endDate:`終了日`,to:`〜`},n=`{{count}} 回の実行`,r=`{{count}} 回の実行`,i={title:`アナリティクス`,all:`すべて`,engine:`エンジン`,ticketChip:`チケット #{{id}} · ✕`,failedToLoad:`読み込みに失敗しました: {{error}}`,modelChip:`モデル:{{model}}`,clearModelFilter:`モデルフィルターをクリア`},a={spending:`支出`,vsPrev:`前期間比 {{pct}}%`,invocations_one:`{{count}} 回の呼び出し`,invocations_other:`{{count}} 回の呼び出し`,tokens:`· {{tokens}} トークン`,tokensTooltip:`合計トークン = この期間の全呼び出しにおける新規入力 + 出力 + キャッシュ読み取り + キャッシュ作成の合計。`,includesEstimated:`· 約 {{amount}} の推定値を含む`,includesEstimatedTooltip:`ネイティブのコストフィールドを持たないプロバイダーからの推定コスト {{amount}} を含みます(例: ローカル料金表で算出する codex)。`,trackingStarted:`トラッキング開始: {{date}}`,trackingStartedFallback:`最初の呼び出しからトラッキングを開始`,emptyState:`このフィルター期間の呼び出しはまだありません。`,segmentTitle:`{{label}}: {{value}}`},o={title:`プロバイダー別`,description:`このプロジェクトの AI CLI 間でのコストの内訳。<tilde>~</tilde> プレフィックスは、コストがローカル料金表からの推定値である行を示します(プロバイダーがネイティブに報告しない場合)。`,noCost:`この期間に記録されたコストはまだありません。`,segmentTitle:`{{label}}: {{value}} ({{count}})`,costUnavailable:`コスト利用不可`,costUnavailableTooltip:`このプロバイダーは実行されましたが、そのモデルが料金表にないため、コストを計算できませんでした。`},s={title:`日次タイムライン`,subtitle:`サーフェス別の積み上げ`,empty:`この期間の支出はありません。`},c={title:`クイック vs Explore`,quick:`クイック`,explore:`Explore`,sparseCta:`より充実したスペックには Explore をお試しください`,runsSoFar_one:`これまで {{count}} 回実行`,runsSoFar_other:`これまで {{count}} 回実行`,perSpec:`スペックあたり`,createdRuns:`<strong>{{created}}</strong> 件作成 · {{runs}} 回実行`,avgDuration:`平均 {{duration}}`,ratio:`スペックあたり {{ratio}}× 多い`,estimatedTooltip:`推定コスト(codex/gemini の料金表フォールバック、プロバイダー請求ではありません)`,estimatedFootnote:`~ 推定コストを含みます(codex/gemini)`},l={title:`モデル`,empty:`記録されたモデルはありません。`,estimatedTooltip:`ローカルの料金表からの推定値 — このプロバイダーはコストをネイティブに報告しません。`},u={title:`コスト vs ターン`,empty:`プロットする呼び出しがありません。`,turnsLabel:`ターン`,costLabel:`コスト`,truncated:`{{total}} 件中 {{shown}} 件を表示 — 最もコストの高いポイントは保持されますが、それ以前のポイントは非表示になります`},d={title:`上位チケット`,empty:`この期間のチケットアクティビティはありません。`,breakdownItem:`{{n}} {{label}}`,unattributed:`未割り当て`,deletedTicket:`削除済みチケット #{{id}}`},f={title:`すべての呼び出し`,statusFilterAria:`ステータスフィルター`,minCostFilterAria:`最小コストフィルター`,minCostPlaceholder:`≥ $0.00`,allStatus:`すべてのステータス`,success:`成功`,failed:`失敗`,aborted:`中断`,empty:`現在のフィルターに一致する呼び出しはありません。`,colSurface:`サーフェス`,colTicket:`チケット`,colCost:`コスト`,colTurns:`ターン`,colTokens:`トークン`,colModel:`モデル`,colStatus:`ステータス`,colStarted:`開始`,contractLayer:`Contract Layer`,contractLayerRefinement:`Contract Layer の改良`,deleted:`(削除済み)`,provisionalTitleTooltip:`暫定の Explore タイトル — まだコミットされていません`,estimatedCostTooltip:`ローカル料金表からの推定値 — このプロバイダーはコストをネイティブに報告しません。`,inferred:`推定`,statusValue:{success:`成功`,failed:`失敗`,aborted:`中断`},truncated:`一致する {{total}} 行のうち最初の {{shown}} 行を表示しています。`,colProvider:`プロバイダー`,sortLabel:`並べ替え`,sortRecency:`最近`,sortCost:`コスト`},p={title:`Desktop アナリティクス`,refreshAria:`アナリティクスを更新`,failedToLoad:`アナリティクスの読み込みに失敗しました: {{error}}`,totalCost:`合計コスト`,costToday:`本日 {{value}}`,totalJobs:`合計ジョブ数`,jobsToday:`本日 {{n}} 件`,successRate:`成功率`,acrossAllProjects:`全プロジェクト`,avgCostPerJob:`ジョブあたり平均コスト`,periodAverage:`期間平均`,costOverTime:`プロジェクト横断のコスト推移`,noCostData:`この期間のコストデータはありません`,projectComparison:`プロジェクト比較`,noProjects:`登録されたプロジェクトはありません。`,jobsCount_one:`{{count}} 件のジョブ`,jobsCount_other:`{{count}} 件のジョブ`,successPct:`成功率 {{pct}}%`,costByProject:`プロジェクト別コスト`,includesEstimated:`~{{amount}} 推定`,includesEstimatedTooltip:`料金表による推定コスト {{amount}} を含みます(codex/gemini)。プロバイダー請求ではありません。`,includesEstimatedShort:`推定含む`,timelineEstimatedTooltip:`一部の日には ~ で示された料金表による推定コスト(codex/gemini)が含まれます。`,estimatedBadge:`推定`,projectEstimatedTooltip:`このプロジェクトのコストのうち {{amount}} は料金表による推定値です(codex/gemini)。プロバイダー請求ではありません。`,statusBarEstimatedTooltip:`料金表による推定コスト(codex/gemini)を含みます。プロバイダー請求ではありません。`},m={surfaces:e,periods:t,runs_one:n,runs_other:r,page:i,hero:a,providerCard:o,timeline:s,quickVsExplore:c,models:l,scatter:u,topTickets:d,table:f,export:{summaryCsv:`サマリー CSV`,rawCsv:`生データ CSV`,summaryJson:`サマリー JSON`,rawJson:`生データ JSON`,downloading:`ダウンロード中…`,noData:`現在のフィルターにデータがありません`,failed:`エクスポートに失敗しました`},desktop:p};export{m as default,p as desktop,a as hero,l as models,i as page,t as periods,o as providerCard,c as quickVsExplore,n as runs_one,r as runs_other,u as scatter,e as surfaces,f as table,s as timeline,d as topTickets};
@@ -0,0 +1 @@
1
+ import{n as e}from"./chunk-CilyBKbf.js";var t=e({default:()=>g,desktop:()=>h,hero:()=>s,models:()=>d,page:()=>o,periods:()=>r,providerCard:()=>c,quickVsExplore:()=>u,runs_one:()=>i,runs_other:()=>a,scatter:()=>f,surfaces:()=>n,table:()=>m,timeline:()=>l,topTickets:()=>p}),n={job:`Jobs`,quickSpec:`Quick`,exploreSpec:`Explore`,aiEdit:`Refine`,smash:`SMASH`,fileSummary:`File summaries`,loop:`Loops`},r={d7:`7d`,d30:`30d`,d90:`90d`,all:`All`,custom:`Custom`,startDate:`Start date`,endDate:`End date`,to:`to`},i=`{{count}} run`,a=`{{count}} runs`,o={title:`Analytics`,all:`All`,engine:`Engine`,ticketChip:`ticket #{{id}} · ✕`,failedToLoad:`Failed to load: {{error}}`,modelChip:`Model: {{model}}`,clearModelFilter:`Clear model filter`},s={spending:`Spending`,vsPrev:`{{pct}}% vs prev`,invocations_one:`{{count}} invocation`,invocations_other:`{{count}} invocations`,tokens:`· {{tokens}} tokens`,tokensTooltip:`Total tokens = fresh input + output + cache-read + cache-create across all invocations in this window.`,includesEstimated:`· includes ~{{amount}} estimated`,includesEstimatedTooltip:`Includes {{amount}} of estimated cost from providers without a native cost field (e.g. codex via the local pricing table).`,trackingStarted:`Tracking started {{date}}`,trackingStartedFallback:`Tracking started on first invocation`,emptyState:`No invocations yet for this filter window.`,segmentTitle:`{{label}}: {{value}}`},c={title:`By provider`,description:`How cost splits across the AI CLIs in this project. The <tilde>~</tilde> prefix marks rows where cost is estimated from the local pricing table (the provider does not report it natively).`,noCost:`No cost recorded yet in this window.`,segmentTitle:`{{label}}: {{value}} ({{count}})`,costUnavailable:`cost unavailable`,costUnavailableTooltip:`This provider ran but its model is not in the pricing table, so no cost could be computed.`},l={title:`Daily timeline`,subtitle:`stacked by surface`,empty:`No spend in this period.`},u={title:`Quick vs Explore`,quick:`Quick`,explore:`Explore`,sparseCta:`Try Explore for richer specs`,runsSoFar_one:`{{count}} run so far`,runsSoFar_other:`{{count}} runs so far`,perSpec:`per spec`,createdRuns:`<strong>{{created}}</strong> created · {{runs}} runs`,avgDuration:`{{duration}} avg`,ratio:`{{ratio}}× more per spec`,estimatedTooltip:`Estimated cost (codex/gemini pricing-table fallback, not provider-billed)`,estimatedFootnote:`~ Includes estimated costs (codex/gemini)`},d={title:`Models`,empty:`No models recorded.`,estimatedTooltip:`Estimated from the local pricing table — this provider does not report cost natively.`},f={title:`Cost vs Turns`,empty:`No invocations to plot.`,turnsLabel:`turns`,costLabel:`cost`,truncated:`Showing {{shown}} of {{total}} — the costliest point is kept, but earlier points are hidden`},p={title:`Top tickets`,empty:`No ticket activity in this period.`,breakdownItem:`{{n}} {{label}}`,unattributed:`Unattributed`,deletedTicket:`deleted ticket #{{id}}`},m={title:`All invocations`,statusFilterAria:`Status filter`,minCostFilterAria:`Minimum cost filter`,minCostPlaceholder:`≥ $0.00`,allStatus:`All status`,success:`Success`,failed:`Failed`,aborted:`Aborted`,empty:`No invocations match the current filters.`,colSurface:`Surface`,colTicket:`Ticket`,colCost:`Cost`,colTurns:`Turns`,colTokens:`Tokens`,colModel:`Model`,colStatus:`Status`,colStarted:`Started`,contractLayer:`Contract Layer`,contractLayerRefinement:`Contract Layer refinement`,deleted:`(deleted)`,provisionalTitleTooltip:`Provisional Explore title — not yet committed`,estimatedCostTooltip:`Estimated from local pricing table — this provider does not report cost natively.`,inferred:`inferred`,statusValue:{success:`success`,failed:`failed`,aborted:`aborted`},truncated:`Showing first {{shown}} of {{total}} matching rows.`,colProvider:`Provider`,sortLabel:`Sort`,sortRecency:`Recent`,sortCost:`Cost`},h={title:`Desktop Analytics`,refreshAria:`Refresh analytics`,failedToLoad:`Failed to load analytics: {{error}}`,totalCost:`Total Cost`,costToday:`{{value}} today`,totalJobs:`Total Jobs`,jobsToday:`{{n}} today`,successRate:`Success Rate`,acrossAllProjects:`across all projects`,avgCostPerJob:`Avg Cost / Job`,periodAverage:`period average`,costOverTime:`Cross-Project Cost Over Time`,noCostData:`No cost data for this period`,projectComparison:`Project Comparison`,noProjects:`No projects registered.`,jobsCount_one:`{{count}} job`,jobsCount_other:`{{count}} jobs`,successPct:`{{pct}}% success`,costByProject:`Cost by Project`,includesEstimated:`~{{amount}} estimated`,includesEstimatedTooltip:`Includes {{amount}} of rate-card estimated cost (codex/gemini), not provider-billed.`,includesEstimatedShort:`incl. estimated`,timelineEstimatedTooltip:`Some days include rate-card estimated cost (codex/gemini) marked with ~.`,estimatedBadge:`est.`,projectEstimatedTooltip:`{{amount}} of this project's cost is a rate-card estimate (codex/gemini), not provider-billed.`,statusBarEstimatedTooltip:`Includes rate-card estimated cost (codex/gemini), not provider-billed.`},g={surfaces:n,periods:r,runs_one:i,runs_other:a,page:o,hero:s,providerCard:c,timeline:l,quickVsExplore:u,models:d,scatter:f,topTickets:p,table:m,export:{summaryCsv:`Summary CSV`,rawCsv:`Raw CSV`,summaryJson:`Summary JSON`,rawJson:`Raw JSON`,downloading:`Downloading…`,noData:`No data for current filters`,failed:`Export failed`},desktop:h};export{t};
@@ -0,0 +1 @@
1
+ var e={job:`Jobs`,quickSpec:`Quick`,exploreSpec:`Explore`,aiEdit:`Affinage`,smash:`SMASH`,fileSummary:`Résumés de fichiers`,loop:`Loops`},t={d7:`7j`,d30:`30j`,d90:`90j`,all:`Tout`,custom:`Personnalisé`,startDate:`Date de début`,endDate:`Date de fin`,to:`au`},n=`{{count}} exécution`,r=`{{count}} exécutions`,i={title:`Analytics`,all:`Tout`,engine:`Moteur`,ticketChip:`ticket #{{id}} · ✕`,failedToLoad:`Échec du chargement : {{error}}`,modelChip:`Modèle : {{model}}`,clearModelFilter:`Effacer le filtre de modèle`},a={spending:`Dépenses`,vsPrev:`{{pct}} % vs préc.`,invocations_one:`{{count}} invocation`,invocations_other:`{{count}} invocations`,tokens:`· {{tokens}} tokens`,tokensTooltip:`Total des tokens = entrée fraîche + sortie + lecture cache + création cache, sur toutes les invocations de cette période.`,includesEstimated:`· inclut ~{{amount}} estimés`,includesEstimatedTooltip:`Inclut {{amount}} de coût estimé pour les fournisseurs sans champ de coût natif (ex. codex via la table de tarifs locale).`,trackingStarted:`Suivi démarré le {{date}}`,trackingStartedFallback:`Le suivi démarre à la première invocation`,emptyState:`Aucune invocation pour cette période de filtrage.`,segmentTitle:`{{label}} : {{value}}`},o={title:`Par fournisseur`,description:`Répartition du coût entre les CLI IA de ce projet. Le préfixe <tilde>~</tilde> marque les lignes dont le coût est estimé à partir de la table de tarifs locale (le fournisseur ne le rapporte pas nativement).`,noCost:`Aucun coût enregistré sur cette période.`,segmentTitle:`{{label}} : {{value}} ({{count}})`,costUnavailable:`coût indisponible`,costUnavailableTooltip:`Ce fournisseur s'est exécuté mais son modèle n'est pas dans la table de tarifs, donc aucun coût n'a pu être calculé.`},s={title:`Chronologie quotidienne`,subtitle:`empilée par surface`,empty:`Aucune dépense sur cette période.`},c={title:`Quick vs Explore`,quick:`Quick`,explore:`Explore`,sparseCta:`Essayez Explore pour des specs plus riches`,runsSoFar_one:`{{count}} exécution pour l'instant`,runsSoFar_other:`{{count}} exécutions pour l'instant`,perSpec:`par spec`,createdRuns:`<strong>{{created}}</strong> créées · {{runs}} exécutions`,avgDuration:`{{duration}} en moyenne`,ratio:`{{ratio}}× de plus par spec`,estimatedTooltip:`Coût estimé (repli sur la table de tarifs codex/gemini, non facturé par le fournisseur)`,estimatedFootnote:`~ Inclut des coûts estimés (codex/gemini)`},l={title:`Modèles`,empty:`Aucun modèle enregistré.`,estimatedTooltip:`Estimé à partir de la table de tarifs locale — ce fournisseur ne signale pas le coût de manière native.`},u={title:`Coût vs tours`,empty:`Aucune invocation à tracer.`,turnsLabel:`tours`,costLabel:`coût`,truncated:`Affichage de {{shown}} sur {{total}} — le point le plus coûteux est conservé, mais les points précédents sont masqués`},d={title:`Top tickets`,empty:`Aucune activité de ticket sur cette période.`,breakdownItem:`{{n}} {{label}}`,unattributed:`Non attribué`,deletedTicket:`ticket supprimé #{{id}}`},f={title:`Toutes les invocations`,statusFilterAria:`Filtre de statut`,minCostFilterAria:`Filtre de coût minimum`,minCostPlaceholder:`≥ $0.00`,allStatus:`Tous les statuts`,success:`Succès`,failed:`Échec`,aborted:`Interrompu`,empty:`Aucune invocation ne correspond aux filtres actuels.`,colSurface:`Surface`,colTicket:`Ticket`,colCost:`Coût`,colTurns:`Tours`,colTokens:`Tokens`,colModel:`Modèle`,colStatus:`Statut`,colStarted:`Démarré`,contractLayer:`Contract Layer`,contractLayerRefinement:`Affinage Contract Layer`,deleted:`(supprimé)`,provisionalTitleTooltip:`Titre Explore provisoire — pas encore validé`,estimatedCostTooltip:`Estimé à partir de la table de tarifs locale — ce fournisseur ne rapporte pas le coût nativement.`,inferred:`inféré`,statusValue:{success:`succès`,failed:`échec`,aborted:`interrompu`},truncated:`Affichage des {{shown}} premières lignes sur {{total}} correspondantes.`,colProvider:`Fournisseur`,sortLabel:`Trier`,sortRecency:`Récent`,sortCost:`Coût`},p={title:`Analytics de Desktop`,refreshAria:`Actualiser les analytics`,failedToLoad:`Échec du chargement des analytics : {{error}}`,totalCost:`Coût total`,costToday:`{{value}} aujourd'hui`,totalJobs:`Total des jobs`,jobsToday:`{{n}} aujourd'hui`,successRate:`Taux de réussite`,acrossAllProjects:`sur tous les projets`,avgCostPerJob:`Coût moyen / job`,periodAverage:`moyenne de la période`,costOverTime:`Coût inter-projets dans le temps`,noCostData:`Aucune donnée de coût pour cette période`,projectComparison:`Comparaison des projets`,noProjects:`Aucun projet enregistré.`,jobsCount_one:`{{count}} job`,jobsCount_other:`{{count}} jobs`,successPct:`{{pct}} % de réussite`,costByProject:`Coût par projet`,includesEstimated:`~{{amount}} estimé`,includesEstimatedTooltip:`Inclut {{amount}} de coût estimé par la table de tarifs (codex/gemini), non facturé par le fournisseur.`,includesEstimatedShort:`incl. estimé`,timelineEstimatedTooltip:`Certains jours incluent un coût estimé par la table de tarifs (codex/gemini) marqué d'un ~.`,estimatedBadge:`est.`,projectEstimatedTooltip:`{{amount}} du coût de ce projet est une estimation par table de tarifs (codex/gemini), non facturé par le fournisseur.`,statusBarEstimatedTooltip:`Inclut un coût estimé par la table de tarifs (codex/gemini), non facturé par le fournisseur.`},m={surfaces:e,periods:t,runs_one:n,runs_other:r,page:i,hero:a,providerCard:o,timeline:s,quickVsExplore:c,models:l,scatter:u,topTickets:d,table:f,export:{summaryCsv:`CSV résumé`,rawCsv:`CSV brut`,summaryJson:`JSON résumé`,rawJson:`JSON brut`,downloading:`Téléchargement…`,noData:`Aucune donnée pour les filtres actuels`,failed:`Échec de l'export`},desktop:p};export{m as default,p as desktop,a as hero,l as models,i as page,t as periods,o as providerCard,c as quickVsExplore,n as runs_one,r as runs_other,u as scatter,e as surfaces,f as table,s as timeline,d as topTickets};
@@ -0,0 +1 @@
1
+ var e={job:`Jobs`,quickSpec:`Quick`,exploreSpec:`Explore`,aiEdit:`Refinado`,smash:`SMASH`,fileSummary:`Resúmenes de archivo`,loop:`Loops`},t={d7:`7d`,d30:`30d`,d90:`90d`,all:`Todo`,custom:`Personalizado`,startDate:`Fecha de inicio`,endDate:`Fecha de fin`,to:`a`},n=`{{count}} ejecución`,r=`{{count}} ejecuciones`,i={title:`Analíticas`,all:`Todo`,engine:`Motor`,ticketChip:`ticket #{{id}} · ✕`,failedToLoad:`Error al cargar: {{error}}`,modelChip:`Modelo: {{model}}`,clearModelFilter:`Quitar filtro de modelo`},a={spending:`Gasto`,vsPrev:`{{pct}}% vs anterior`,invocations_one:`{{count}} invocación`,invocations_other:`{{count}} invocaciones`,tokens:`· {{tokens}} tokens`,tokensTooltip:`Tokens totales = entrada nueva + salida + lectura de caché + creación de caché en todas las invocaciones de esta ventana.`,includesEstimated:`· incluye ~{{amount}} estimado`,includesEstimatedTooltip:`Incluye {{amount}} de coste estimado de proveedores sin campo de coste nativo (p. ej. codex mediante la tabla de precios local).`,trackingStarted:`Seguimiento iniciado el {{date}}`,trackingStartedFallback:`El seguimiento empieza con la primera invocación`,emptyState:`Aún no hay invocaciones para esta ventana de filtros.`,segmentTitle:`{{label}}: {{value}}`},o={title:`Por proveedor`,description:`Cómo se reparte el coste entre las CLI de IA de este proyecto. El prefijo <tilde>~</tilde> marca las filas cuyo coste se estima con la tabla de precios local (el proveedor no lo informa de forma nativa).`,noCost:`Aún no hay coste registrado en esta ventana.`,segmentTitle:`{{label}}: {{value}} ({{count}})`,costUnavailable:`coste no disponible`,costUnavailableTooltip:`Este proveedor se ejecutó pero su modelo no está en la tabla de precios, así que no se pudo calcular ningún coste.`},s={title:`Cronología diaria`,subtitle:`apilada por superficie`,empty:`Sin gasto en este periodo.`},c={title:`Quick vs Explore`,quick:`Quick`,explore:`Explore`,sparseCta:`Prueba Explore para conseguir specs más completas`,runsSoFar_one:`{{count}} ejecución hasta ahora`,runsSoFar_other:`{{count}} ejecuciones hasta ahora`,perSpec:`por spec`,createdRuns:`<strong>{{created}}</strong> creadas · {{runs}} ejecuciones`,avgDuration:`{{duration}} de media`,ratio:`{{ratio}}× más por spec`,estimatedTooltip:`Coste estimado (estimación con tabla de precios para codex/gemini, no facturado por el proveedor)`,estimatedFootnote:`~ Incluye costes estimados (codex/gemini)`},l={title:`Modelos`,empty:`No hay modelos registrados.`,estimatedTooltip:`Estimado a partir de la tabla de precios local — este proveedor no informa el coste de forma nativa.`},u={title:`Coste vs turnos`,empty:`No hay invocaciones que representar.`,turnsLabel:`turnos`,costLabel:`coste`,truncated:`Mostrando {{shown}} de {{total}} — se conserva el punto más costoso, pero se ocultan los anteriores`},d={title:`Tickets principales`,empty:`Sin actividad de tickets en este periodo.`,breakdownItem:`{{n}} {{label}}`,unattributed:`Sin atribuir`,deletedTicket:`ticket eliminado #{{id}}`},f={title:`Todas las invocaciones`,statusFilterAria:`Filtro de estado`,minCostFilterAria:`Filtro de coste mínimo`,minCostPlaceholder:`≥ $0.00`,allStatus:`Todos los estados`,success:`Éxito`,failed:`Fallido`,aborted:`Abortado`,empty:`Ninguna invocación coincide con los filtros actuales.`,colSurface:`Superficie`,colTicket:`Ticket`,colCost:`Coste`,colTurns:`Turnos`,colTokens:`Tokens`,colModel:`Modelo`,colStatus:`Estado`,colStarted:`Inicio`,contractLayer:`Contract Layer`,contractLayerRefinement:`Refinamiento de Contract Layer`,deleted:`(eliminado)`,provisionalTitleTooltip:`Título provisional de Explore — aún sin confirmar`,estimatedCostTooltip:`Estimado con la tabla de precios local — este proveedor no informa el coste de forma nativa.`,inferred:`inferido`,statusValue:{success:`éxito`,failed:`fallido`,aborted:`abortado`},truncated:`Mostrando las primeras {{shown}} de {{total}} filas coincidentes.`,colProvider:`Proveedor`,sortLabel:`Ordenar`,sortRecency:`Reciente`,sortCost:`Coste`},p={title:`Analíticas de Desktop`,refreshAria:`Actualizar analíticas`,failedToLoad:`No se pudieron cargar las analíticas: {{error}}`,totalCost:`Coste total`,costToday:`{{value}} hoy`,totalJobs:`Jobs totales`,jobsToday:`{{n}} hoy`,successRate:`Tasa de éxito`,acrossAllProjects:`en todos los proyectos`,avgCostPerJob:`Coste medio / job`,periodAverage:`media del periodo`,costOverTime:`Coste entre proyectos a lo largo del tiempo`,noCostData:`Sin datos de coste para este periodo`,projectComparison:`Comparación de proyectos`,noProjects:`No hay proyectos registrados.`,jobsCount_one:`{{count}} job`,jobsCount_other:`{{count}} jobs`,successPct:`{{pct}}% de éxito`,costByProject:`Coste por proyecto`,includesEstimated:`~{{amount}} estimado`,includesEstimatedTooltip:`Incluye {{amount}} de coste estimado por tabla de precios (codex/gemini), no facturado por el proveedor.`,includesEstimatedShort:`incl. estimado`,timelineEstimatedTooltip:`Algunos días incluyen coste estimado por tabla de precios (codex/gemini) marcado con ~.`,estimatedBadge:`est.`,projectEstimatedTooltip:`{{amount}} del coste de este proyecto es una estimación por tabla de precios (codex/gemini), no facturado por el proveedor.`,statusBarEstimatedTooltip:`Incluye coste estimado por tabla de precios (codex/gemini), no facturado por el proveedor.`},m={surfaces:e,periods:t,runs_one:n,runs_other:r,page:i,hero:a,providerCard:o,timeline:s,quickVsExplore:c,models:l,scatter:u,topTickets:d,table:f,export:{summaryCsv:`CSV resumen`,rawCsv:`CSV en bruto`,summaryJson:`JSON resumen`,rawJson:`JSON en bruto`,downloading:`Descargando…`,noData:`Sin datos para los filtros actuales`,failed:`Error al exportar`},desktop:p};export{m as default,p as desktop,a as hero,l as models,i as page,t as periods,o as providerCard,c as quickVsExplore,n as runs_one,r as runs_other,u as scatter,e as surfaces,f as table,s as timeline,d as topTickets};
@@ -0,0 +1 @@
1
+ var e={job:`Job`,quickSpec:`Quick`,exploreSpec:`Explore`,aiEdit:`Raffinamento`,smash:`SMASH`,fileSummary:`Riepiloghi file`,loop:`Loops`},t={d7:`7d`,d30:`30d`,d90:`90d`,all:`Tutto`,custom:`Personalizzato`,startDate:`Data di inizio`,endDate:`Data di fine`,to:`a`},n=`{{count}} esecuzione`,r=`{{count}} esecuzioni`,i={title:`Analytics`,all:`Tutti`,engine:`Engine`,ticketChip:`ticket #{{id}} · ✕`,failedToLoad:`Caricamento non riuscito: {{error}}`,modelChip:`Modello: {{model}}`,clearModelFilter:`Rimuovi filtro modello`},a={spending:`Spesa`,vsPrev:`{{pct}}% vs prec.`,invocations_one:`{{count}} invocazione`,invocations_other:`{{count}} invocazioni`,tokens:`· {{tokens}} token`,tokensTooltip:`Token totali = input nuovo + output + lettura cache + creazione cache su tutte le invocazioni in questa finestra.`,includesEstimated:`· include ~{{amount}} stimati`,includesEstimatedTooltip:`Include {{amount}} di costo stimato da provider senza un campo di costo nativo (es. codex tramite la tabella prezzi locale).`,trackingStarted:`Tracciamento iniziato il {{date}}`,trackingStartedFallback:`Il tracciamento inizia alla prima invocazione`,emptyState:`Ancora nessuna invocazione per questa finestra di filtri.`,segmentTitle:`{{label}}: {{value}}`},o={title:`Per provider`,description:`Come si ripartisce il costo tra le CLI AI di questo progetto. Il prefisso <tilde>~</tilde> indica le righe in cui il costo è stimato dalla tabella prezzi locale (il provider non lo riporta nativamente).`,noCost:`Ancora nessun costo registrato in questa finestra.`,segmentTitle:`{{label}}: {{value}} ({{count}})`,costUnavailable:`costo non disponibile`,costUnavailableTooltip:`Questo provider è stato eseguito ma il suo modello non è nella tabella prezzi, quindi non è stato possibile calcolare alcun costo.`},s={title:`Timeline giornaliera`,subtitle:`impilata per origine`,empty:`Nessuna spesa in questo periodo.`},c={title:`Quick vs Explore`,quick:`Quick`,explore:`Explore`,sparseCta:`Prova Explore per spec più ricche`,runsSoFar_one:`{{count}} esecuzione finora`,runsSoFar_other:`{{count}} esecuzioni finora`,perSpec:`per spec`,createdRuns:`<strong>{{created}}</strong> create · {{runs}} esecuzioni`,avgDuration:`{{duration}} in media`,ratio:`{{ratio}}× in più per spec`,estimatedTooltip:`Costo stimato (stima da tabella prezzi per codex/gemini, non fatturato dal provider)`,estimatedFootnote:`~ Include costi stimati (codex/gemini)`},l={title:`Modelli`,empty:`Nessun modello registrato.`,estimatedTooltip:`Stimato dalla tabella prezzi locale — questo provider non riporta il costo in modo nativo.`},u={title:`Costo vs Turni`,empty:`Nessuna invocazione da rappresentare.`,turnsLabel:`turni`,costLabel:`costo`,truncated:`Visualizzati {{shown}} di {{total}} — il punto più costoso viene mantenuto, ma i punti precedenti sono nascosti`},d={title:`Top ticket`,empty:`Nessuna attività sui ticket in questo periodo.`,breakdownItem:`{{n}} {{label}}`,unattributed:`Non attribuito`,deletedTicket:`ticket eliminato #{{id}}`},f={title:`Tutte le invocazioni`,statusFilterAria:`Filtro stato`,minCostFilterAria:`Filtro costo minimo`,minCostPlaceholder:`≥ $0.00`,allStatus:`Tutti gli stati`,success:`Riuscita`,failed:`Fallita`,aborted:`Interrotta`,empty:`Nessuna invocazione corrisponde ai filtri attuali.`,colSurface:`Origine`,colTicket:`Ticket`,colCost:`Costo`,colTurns:`Turni`,colTokens:`Token`,colModel:`Modello`,colStatus:`Stato`,colStarted:`Avvio`,contractLayer:`Contract Layer`,contractLayerRefinement:`Raffinamento Contract Layer`,deleted:`(eliminato)`,provisionalTitleTooltip:`Titolo Explore provvisorio — non ancora confermato`,estimatedCostTooltip:`Stimato dalla tabella prezzi locale — questo provider non riporta il costo nativamente.`,inferred:`dedotto`,statusValue:{success:`riuscita`,failed:`fallita`,aborted:`interrotta`},truncated:`Mostrate le prime {{shown}} di {{total}} righe corrispondenti.`,colProvider:`Provider`,sortLabel:`Ordina`,sortRecency:`Recenti`,sortCost:`Costo`},p={title:`Analytics di Desktop`,refreshAria:`Aggiorna le analytics`,failedToLoad:`Impossibile caricare le analytics: {{error}}`,totalCost:`Costo totale`,costToday:`{{value}} oggi`,totalJobs:`Job totali`,jobsToday:`{{n}} oggi`,successRate:`Tasso di successo`,acrossAllProjects:`su tutti i progetti`,avgCostPerJob:`Costo medio / job`,periodAverage:`media del periodo`,costOverTime:`Costo nel tempo tra i progetti`,noCostData:`Nessun dato di costo per questo periodo`,projectComparison:`Confronto progetti`,noProjects:`Nessun progetto registrato.`,jobsCount_one:`{{count}} job`,jobsCount_other:`{{count}} job`,successPct:`{{pct}}% di successo`,costByProject:`Costo per progetto`,includesEstimated:`~{{amount}} stimato`,includesEstimatedTooltip:`Include {{amount}} di costo stimato da tabella prezzi (codex/gemini), non fatturato dal provider.`,includesEstimatedShort:`incl. stimato`,timelineEstimatedTooltip:`Alcuni giorni includono un costo stimato da tabella prezzi (codex/gemini) contrassegnato con ~.`,estimatedBadge:`stim.`,projectEstimatedTooltip:`{{amount}} del costo di questo progetto è una stima da tabella prezzi (codex/gemini), non fatturato dal provider.`,statusBarEstimatedTooltip:`Include un costo stimato da tabella prezzi (codex/gemini), non fatturato dal provider.`},m={surfaces:e,periods:t,runs_one:n,runs_other:r,page:i,hero:a,providerCard:o,timeline:s,quickVsExplore:c,models:l,scatter:u,topTickets:d,table:f,export:{summaryCsv:`CSV riepilogo`,rawCsv:`CSV raw`,summaryJson:`JSON riepilogo`,rawJson:`JSON raw`,downloading:`Download in corso…`,noData:`Nessun dato per i filtri attuali`,failed:`Esportazione non riuscita`},desktop:p};export{m as default,p as desktop,a as hero,l as models,i as page,t as periods,o as providerCard,c as quickVsExplore,n as runs_one,r as runs_other,u as scatter,e as surfaces,f as table,s as timeline,d as topTickets};
@@ -0,0 +1 @@
1
+ var e={job:`任务`,quickSpec:`Quick`,exploreSpec:`Explore`,aiEdit:`AI 编辑`,smash:`SMASH`,fileSummary:`文件摘要`,loop:`Loops`},t={d7:`7天`,d30:`30天`,d90:`90天`,all:`全部`,custom:`自定义`,startDate:`开始日期`,endDate:`结束日期`,to:`至`},n=`{{count}} 次运行`,r=`{{count}} 次运行`,i={title:`分析`,all:`全部`,engine:`引擎`,ticketChip:`工单 #{{id}} · ✕`,failedToLoad:`加载失败:{{error}}`,modelChip:`模型:{{model}}`,clearModelFilter:`清除模型筛选`},a={spending:`支出`,vsPrev:`较上期 {{pct}}%`,invocations_one:`{{count}} 次调用`,invocations_other:`{{count}} 次调用`,tokens:`· {{tokens}} token`,tokensTooltip:`总 token 数 = 此时间窗口内所有调用的新输入 + 输出 + 缓存读取 + 缓存创建之和。`,includesEstimated:`· 含约 {{amount}} 估算值`,includesEstimatedTooltip:`包含 {{amount}} 的估算成本,来自不原生上报成本的提供方(例如 codex,按本地价格表估算)。`,trackingStarted:`追踪始于 {{date}}`,trackingStartedFallback:`首次调用后开始追踪`,emptyState:`当前筛选窗口内暂无调用。`,segmentTitle:`{{label}}:{{value}}`},o={title:`按提供方`,description:`此项目中各 AI CLI 的成本分布。<tilde>~</tilde> 前缀表示该行成本由本地价格表估算(提供方不原生上报)。`,noCost:`此时间窗口内暂无成本记录。`,segmentTitle:`{{label}}:{{value}}({{count}})`,costUnavailable:`成本不可用`,costUnavailableTooltip:`此提供商已运行,但其模型不在价格表中,因此无法计算成本。`},s={title:`每日时间线`,subtitle:`按来源堆叠`,empty:`此期间没有支出。`},c={title:`Quick vs Explore`,quick:`Quick`,explore:`Explore`,sparseCta:`试试 Explore,获得更丰富的 spec`,runsSoFar_one:`目前 {{count}} 次运行`,runsSoFar_other:`目前 {{count}} 次运行`,perSpec:`每个 spec`,createdRuns:`已创建 <strong>{{created}}</strong> · {{runs}} 次运行`,avgDuration:`平均 {{duration}}`,ratio:`每个 spec 多 {{ratio}}×`,estimatedTooltip:`估算成本(codex/gemini 价格表回退,非提供商计费)`,estimatedFootnote:`~ 包含估算成本(codex/gemini)`},l={title:`模型`,empty:`暂无模型记录。`,estimatedTooltip:`根据本地价格表估算 — 此提供商不原生报告成本。`},u={title:`成本 vs 轮次`,empty:`暂无可绘制的调用。`,turnsLabel:`轮次`,costLabel:`成本`,truncated:`显示 {{total}} 中的 {{shown}} 个 — 保留成本最高的点,但隐藏较早的点`},d={title:`热门工单`,empty:`此期间没有工单活动。`,breakdownItem:`{{n}} {{label}}`,unattributed:`未归属`,deletedTicket:`已删除工单 #{{id}}`},f={title:`全部调用`,statusFilterAria:`状态筛选`,minCostFilterAria:`最低成本筛选`,minCostPlaceholder:`≥ $0.00`,allStatus:`全部状态`,success:`成功`,failed:`失败`,aborted:`已中止`,empty:`没有符合当前筛选条件的调用。`,colSurface:`来源`,colTicket:`工单`,colCost:`成本`,colTurns:`轮次`,colTokens:`Token`,colModel:`模型`,colStatus:`状态`,colStarted:`开始时间`,contractLayer:`Contract Layer`,contractLayerRefinement:`Contract Layer 增强`,deleted:`(已删除)`,provisionalTitleTooltip:`Explore 临时标题——尚未提交`,estimatedCostTooltip:`按本地价格表估算——此提供方不原生上报成本。`,inferred:`推断`,statusValue:{success:`成功`,failed:`失败`,aborted:`已中止`},truncated:`显示前 {{shown}} 条,共 {{total}} 条匹配记录。`,colProvider:`提供商`,sortLabel:`排序`,sortRecency:`最近`,sortCost:`成本`},p={title:`Desktop 分析`,refreshAria:`刷新分析数据`,failedToLoad:`加载分析数据失败:{{error}}`,totalCost:`总成本`,costToday:`今日 {{value}}`,totalJobs:`任务总数`,jobsToday:`今日 {{n}} 个`,successRate:`成功率`,acrossAllProjects:`所有项目汇总`,avgCostPerJob:`平均成本 / 任务`,periodAverage:`期间平均`,costOverTime:`跨项目成本走势`,noCostData:`此期间无成本数据`,projectComparison:`项目对比`,noProjects:`尚未注册任何项目。`,jobsCount_one:`{{count}} 个任务`,jobsCount_other:`{{count}} 个任务`,successPct:`成功率 {{pct}}%`,costByProject:`按项目统计成本`,includesEstimated:`~{{amount}} 估算`,includesEstimatedTooltip:`包含 {{amount}} 的价格表估算成本(codex/gemini),非提供商计费。`,includesEstimatedShort:`含估算`,timelineEstimatedTooltip:`某些天包含以 ~ 标记的价格表估算成本(codex/gemini)。`,estimatedBadge:`估算`,projectEstimatedTooltip:`此项目成本中的 {{amount}} 为价格表估算(codex/gemini),非提供商计费。`,statusBarEstimatedTooltip:`包含价格表估算成本(codex/gemini),非提供商计费。`},m={surfaces:e,periods:t,runs_one:n,runs_other:r,page:i,hero:a,providerCard:o,timeline:s,quickVsExplore:c,models:l,scatter:u,topTickets:d,table:f,export:{summaryCsv:`摘要 CSV`,rawCsv:`原始 CSV`,summaryJson:`摘要 JSON`,rawJson:`原始 JSON`,downloading:`正在下载…`,noData:`当前筛选条件下无数据`,failed:`导出失败`},desktop:p};export{m as default,p as desktop,a as hero,l as models,i as page,t as periods,o as providerCard,c as quickVsExplore,n as runs_one,r as runs_other,u as scatter,e as surfaces,f as table,s as timeline,d as topTickets};
@@ -0,0 +1 @@
1
+ var e={job:`Jobs`,quickSpec:`Quick`,exploreSpec:`Explore`,aiEdit:`Verfeinern`,smash:`SMASH`,fileSummary:`Dateizusammenfassungen`,loop:`Loops`},t={d7:`7d`,d30:`30d`,d90:`90d`,all:`Alle`,custom:`Benutzerdefiniert`,startDate:`Startdatum`,endDate:`Enddatum`,to:`bis`},n=`{{count}} Lauf`,r=`{{count}} Läufe`,i={title:`Analytics`,all:`Alle`,engine:`Engine`,ticketChip:`Ticket #{{id}} · ✕`,failedToLoad:`Laden fehlgeschlagen: {{error}}`,modelChip:`Modell: {{model}}`,clearModelFilter:`Modellfilter zurücksetzen`},a={spending:`Ausgaben`,vsPrev:`{{pct}} % ggü. Vorperiode`,invocations_one:`{{count}} Aufruf`,invocations_other:`{{count}} Aufrufe`,tokens:`· {{tokens}} Tokens`,tokensTooltip:`Tokens gesamt = neue Eingabe + Ausgabe + Cache-Read + Cache-Create über alle Aufrufe in diesem Zeitraum.`,includesEstimated:`· enthält ~{{amount}} geschätzt`,includesEstimatedTooltip:`Enthält {{amount}} geschätzte Kosten von Providern ohne natives Kostenfeld (z. B. codex über die lokale Preistabelle).`,trackingStarted:`Tracking gestartet am {{date}}`,trackingStartedFallback:`Tracking beginnt mit dem ersten Aufruf`,emptyState:`Noch keine Aufrufe für diesen Filterzeitraum.`,segmentTitle:`{{label}}: {{value}}`},o={title:`Nach Provider`,description:`So verteilen sich die Kosten auf die KI-CLIs in diesem Projekt. Das Präfix <tilde>~</tilde> markiert Zeilen, deren Kosten über die lokale Preistabelle geschätzt sind (der Provider meldet sie nicht nativ).`,noCost:`Noch keine Kosten in diesem Zeitraum erfasst.`,segmentTitle:`{{label}}: {{value}} ({{count}})`,costUnavailable:`Kosten nicht verfügbar`,costUnavailableTooltip:`Dieser Anbieter lief, aber sein Modell ist nicht in der Preistabelle, daher konnten keine Kosten berechnet werden.`},s={title:`Täglicher Verlauf`,subtitle:`gestapelt nach Surface`,empty:`Keine Ausgaben in diesem Zeitraum.`},c={title:`Quick vs. Explore`,quick:`Quick`,explore:`Explore`,sparseCta:`Probiere Explore für reichhaltigere Specs`,runsSoFar_one:`bisher {{count}} Lauf`,runsSoFar_other:`bisher {{count}} Läufe`,perSpec:`pro Spec`,createdRuns:`<strong>{{created}}</strong> erstellt · {{runs}} Läufe`,avgDuration:`Ø {{duration}}`,ratio:`{{ratio}}× mehr pro Spec`,estimatedTooltip:`Geschätzte Kosten (Rückgriff auf Preistabelle für codex/gemini, nicht vom Anbieter abgerechnet)`,estimatedFootnote:`~ Enthält geschätzte Kosten (codex/gemini)`},l={title:`Modelle`,empty:`Keine Modelle erfasst.`,estimatedTooltip:`Geschätzt aus der lokalen Preistabelle — dieser Anbieter meldet die Kosten nicht nativ.`},u={title:`Kosten vs. Turns`,empty:`Keine Aufrufe zum Darstellen.`,turnsLabel:`Turns`,costLabel:`Kosten`,truncated:`Zeige {{shown}} von {{total}} — der teuerste Punkt bleibt erhalten, frühere Punkte werden ausgeblendet`},d={title:`Top-Tickets`,empty:`Keine Ticket-Aktivität in diesem Zeitraum.`,breakdownItem:`{{n}} {{label}}`,unattributed:`Nicht zugeordnet`,deletedTicket:`gelöschtes Ticket #{{id}}`},f={title:`Alle Aufrufe`,statusFilterAria:`Statusfilter`,minCostFilterAria:`Mindestkosten-Filter`,minCostPlaceholder:`≥ $0.00`,allStatus:`Alle Status`,success:`Erfolgreich`,failed:`Fehlgeschlagen`,aborted:`Abgebrochen`,empty:`Keine Aufrufe entsprechen den aktuellen Filtern.`,colSurface:`Surface`,colTicket:`Ticket`,colCost:`Kosten`,colTurns:`Turns`,colTokens:`Tokens`,colModel:`Modell`,colStatus:`Status`,colStarted:`Gestartet`,contractLayer:`Contract Layer`,contractLayerRefinement:`Contract-Layer-Verfeinerung`,deleted:`(gelöscht)`,provisionalTitleTooltip:`Vorläufiger Explore-Titel – noch nicht committet`,estimatedCostTooltip:`Geschätzt anhand der lokalen Preistabelle – dieser Provider meldet Kosten nicht nativ.`,inferred:`abgeleitet`,statusValue:{success:`erfolgreich`,failed:`fehlgeschlagen`,aborted:`abgebrochen`},truncated:`Zeige die ersten {{shown}} von {{total}} passenden Zeilen.`,colProvider:`Anbieter`,sortLabel:`Sortieren`,sortRecency:`Neueste`,sortCost:`Kosten`},p={title:`Desktop-Analytics`,refreshAria:`Analytics aktualisieren`,failedToLoad:`Analytics konnten nicht geladen werden: {{error}}`,totalCost:`Gesamtkosten`,costToday:`{{value}} heute`,totalJobs:`Jobs gesamt`,jobsToday:`{{n}} heute`,successRate:`Erfolgsquote`,acrossAllProjects:`über alle Projekte`,avgCostPerJob:`Ø Kosten / Job`,periodAverage:`Durchschnitt im Zeitraum`,costOverTime:`Projektübergreifende Kosten im Zeitverlauf`,noCostData:`Keine Kostendaten für diesen Zeitraum`,projectComparison:`Projektvergleich`,noProjects:`Keine Projekte registriert.`,jobsCount_one:`{{count}} Job`,jobsCount_other:`{{count}} Jobs`,successPct:`{{pct}} % Erfolg`,costByProject:`Kosten nach Projekt`,includesEstimated:`~{{amount}} geschätzt`,includesEstimatedTooltip:`Enthält {{amount}} geschätzte Kosten aus der Preistabelle (codex/gemini), nicht vom Anbieter abgerechnet.`,includesEstimatedShort:`inkl. geschätzt`,timelineEstimatedTooltip:`Einige Tage enthalten geschätzte Kosten aus der Preistabelle (codex/gemini), markiert mit ~.`,estimatedBadge:`gesch.`,projectEstimatedTooltip:`{{amount}} der Kosten dieses Projekts sind eine Schätzung aus der Preistabelle (codex/gemini), nicht vom Anbieter abgerechnet.`,statusBarEstimatedTooltip:`Enthält geschätzte Kosten aus der Preistabelle (codex/gemini), nicht vom Anbieter abgerechnet.`},m={surfaces:e,periods:t,runs_one:n,runs_other:r,page:i,hero:a,providerCard:o,timeline:s,quickVsExplore:c,models:l,scatter:u,topTickets:d,table:f,export:{summaryCsv:`Zusammenfassung (CSV)`,rawCsv:`Rohdaten (CSV)`,summaryJson:`Zusammenfassung (JSON)`,rawJson:`Rohdaten (JSON)`,downloading:`Wird heruntergeladen…`,noData:`Keine Daten für aktuelle Filter`,failed:`Export fehlgeschlagen`},desktop:p};export{m as default,p as desktop,a as hero,l as models,i as page,t as periods,o as providerCard,c as quickVsExplore,n as runs_one,r as runs_other,u as scatter,e as surfaces,f as table,s as timeline,d as topTickets};
@@ -0,0 +1 @@
1
+ var e={job:`Jobs`,quickSpec:`Quick`,exploreSpec:`Explore`,aiEdit:`Refinamento`,smash:`SMASH`,fileSummary:`Resumos de ficheiros`,loop:`Loops`},t={d7:`7d`,d30:`30d`,d90:`90d`,all:`Tudo`,custom:`Personalizado`,startDate:`Data de início`,endDate:`Data de fim`,to:`até`},n=`{{count}} execução`,r=`{{count}} execuções`,i={title:`Analytics`,all:`Tudo`,engine:`Motor`,ticketChip:`ticket #{{id}} · ✕`,failedToLoad:`Falha ao carregar: {{error}}`,modelChip:`Modelo: {{model}}`,clearModelFilter:`Limpar filtro de modelo`},a={spending:`Gastos`,vsPrev:`{{pct}}% vs anterior`,invocations_one:`{{count}} invocação`,invocations_other:`{{count}} invocações`,tokens:`· {{tokens}} tokens`,tokensTooltip:`Total de tokens = input novo + output + leitura de cache + criação de cache em todas as invocações desta janela.`,includesEstimated:`· inclui ~{{amount}} estimado`,includesEstimatedTooltip:`Inclui {{amount}} de custo estimado de fornecedores sem campo de custo nativo (p. ex. codex através da tabela de preços local).`,trackingStarted:`Registo iniciado em {{date}}`,trackingStartedFallback:`O registo começa na primeira invocação`,emptyState:`Ainda não há invocações para esta janela de filtros.`,segmentTitle:`{{label}}: {{value}}`},o={title:`Por fornecedor`,description:`Como o custo se divide entre as CLIs de IA deste projeto. O prefixo <tilde>~</tilde> assinala as linhas em que o custo é estimado a partir da tabela de preços local (o fornecedor não o reporta nativamente).`,noCost:`Ainda não há custo registado nesta janela.`,segmentTitle:`{{label}}: {{value}} ({{count}})`,costUnavailable:`custo indisponível`,costUnavailableTooltip:`Este provedor foi executado, mas seu modelo não está na tabela de preços, portanto nenhum custo pôde ser calculado.`},s={title:`Cronologia diária`,subtitle:`empilhada por superfície`,empty:`Sem gastos neste período.`},c={title:`Quick vs Explore`,quick:`Quick`,explore:`Explore`,sparseCta:`Experimente o Explore para specs mais ricas`,runsSoFar_one:`{{count}} execução até agora`,runsSoFar_other:`{{count}} execuções até agora`,perSpec:`por spec`,createdRuns:`<strong>{{created}}</strong> criadas · {{runs}} execuções`,avgDuration:`{{duration}} em média`,ratio:`{{ratio}}× mais por spec`,estimatedTooltip:`Custo estimado (estimativa pela tabela de preços para codex/gemini, não faturado pelo provedor)`,estimatedFootnote:`~ Inclui custos estimados (codex/gemini)`},l={title:`Modelos`,empty:`Nenhum modelo registado.`,estimatedTooltip:`Estimado a partir da tabela de preços local — este provedor não informa o custo nativamente.`},u={title:`Custo vs Turnos`,empty:`Sem invocações para representar.`,turnsLabel:`turnos`,costLabel:`custo`,truncated:`Mostrando {{shown}} de {{total}} — o ponto mais caro é mantido, mas os pontos anteriores ficam ocultos`},d={title:`Top tickets`,empty:`Sem atividade de tickets neste período.`,breakdownItem:`{{n}} {{label}}`,unattributed:`Sem atribuição`,deletedTicket:`ticket eliminado #{{id}}`},f={title:`Todas as invocações`,statusFilterAria:`Filtro de estado`,minCostFilterAria:`Filtro de custo mínimo`,minCostPlaceholder:`≥ $0.00`,allStatus:`Todos os estados`,success:`Sucesso`,failed:`Falhadas`,aborted:`Abortadas`,empty:`Nenhuma invocação corresponde aos filtros atuais.`,colSurface:`Superfície`,colTicket:`Ticket`,colCost:`Custo`,colTurns:`Turnos`,colTokens:`Tokens`,colModel:`Modelo`,colStatus:`Estado`,colStarted:`Início`,contractLayer:`Contract Layer`,contractLayerRefinement:`Refinamento do Contract Layer`,deleted:`(eliminado)`,provisionalTitleTooltip:`Título provisório do Explore — ainda não confirmado`,estimatedCostTooltip:`Estimado a partir da tabela de preços local — este fornecedor não reporta o custo nativamente.`,inferred:`inferido`,statusValue:{success:`sucesso`,failed:`falhada`,aborted:`abortada`},truncated:`A mostrar as primeiras {{shown}} de {{total}} linhas correspondentes.`,colProvider:`Provedor`,sortLabel:`Ordenar`,sortRecency:`Recente`,sortCost:`Custo`},p={title:`Analytics do Desktop`,refreshAria:`Atualizar analytics`,failedToLoad:`Falha ao carregar as analytics: {{error}}`,totalCost:`Custo total`,costToday:`{{value}} hoje`,totalJobs:`Total de jobs`,jobsToday:`{{n}} hoje`,successRate:`Taxa de sucesso`,acrossAllProjects:`em todos os projetos`,avgCostPerJob:`Custo médio / job`,periodAverage:`média do período`,costOverTime:`Custo entre projetos ao longo do tempo`,noCostData:`Sem dados de custo para este período`,projectComparison:`Comparação de projetos`,noProjects:`Nenhum projeto registado.`,jobsCount_one:`{{count}} job`,jobsCount_other:`{{count}} jobs`,successPct:`{{pct}}% de sucesso`,costByProject:`Custo por projeto`,includesEstimated:`~{{amount}} estimado`,includesEstimatedTooltip:`Inclui {{amount}} de custo estimado pela tabela de preços (codex/gemini), não faturado pelo provedor.`,includesEstimatedShort:`incl. estimado`,timelineEstimatedTooltip:`Alguns dias incluem custo estimado pela tabela de preços (codex/gemini) marcado com ~.`,estimatedBadge:`est.`,projectEstimatedTooltip:`{{amount}} do custo deste projeto é uma estimativa pela tabela de preços (codex/gemini), não faturado pelo provedor.`,statusBarEstimatedTooltip:`Inclui custo estimado pela tabela de preços (codex/gemini), não faturado pelo provedor.`},m={surfaces:e,periods:t,runs_one:n,runs_other:r,page:i,hero:a,providerCard:o,timeline:s,quickVsExplore:c,models:l,scatter:u,topTickets:d,table:f,export:{summaryCsv:`CSV de resumo`,rawCsv:`CSV em bruto`,summaryJson:`JSON de resumo`,rawJson:`JSON em bruto`,downloading:`A transferir…`,noData:`Sem dados para os filtros atuais`,failed:`Falha na exportação`},desktop:p};export{m as default,p as desktop,a as hero,l as models,i as page,t as periods,o as providerCard,c as quickVsExplore,n as runs_one,r as runs_other,u as scatter,e as surfaces,f as table,s as timeline,d as topTickets};
@@ -1 +1 @@
1
- var e={save:`Speichern`,cancel:`Abbrechen`,close:`Schließen`,delete:`Löschen`,confirm:`Bestätigen`,retry:`Wiederholen`,search:`Suchen`,copy:`Kopieren`,copied:`Kopiert`,back:`Zurück`,next:`Weiter`,done:`Fertig`,open:`Öffnen`,add:`Hinzufügen`,remove:`Entfernen`,edit:`Bearbeiten`,rename:`Umbenennen`,duplicate:`Duplizieren`,refresh:`Aktualisieren`,export:`Exportieren`,discard:`Verwerfen`,minimize:`Minimieren`,expand:`Ausklappen`,collapse:`Einklappen`,viewAll:`Alle anzeigen`,learnMore:`Mehr erfahren`},t={loading:`Wird geladen…`,saving:`Wird gespeichert…`,error:`Fehler`,empty:`Keine Daten`,none:`Keine`,unknown:`Unbekannt`,yes:`Ja`,no:`Nein`,on:`Ein`,off:`Aus`,enabled:`Aktiviert`,disabled:`Deaktiviert`},n={queued:`In Warteschlange`,running:`Läuft`,completed:`Abgeschlossen`,failed:`Fehlgeschlagen`,canceled:`Abgebrochen`,draft:`Entwurf`},r={actions:e,states:t,status:n};export{e as actions,r as default,t as states,n as status};
1
+ var e={save:`Speichern`,cancel:`Abbrechen`,close:`Schließen`,delete:`Löschen`,confirm:`Bestätigen`,retry:`Wiederholen`,search:`Suchen`,copy:`Kopieren`,copied:`Kopiert`,back:`Zurück`,next:`Weiter`,done:`Fertig`,open:`Öffnen`,add:`Hinzufügen`,remove:`Entfernen`,edit:`Bearbeiten`,rename:`Umbenennen`,duplicate:`Duplizieren`,refresh:`Aktualisieren`,export:`Exportieren`,discard:`Verwerfen`,minimize:`Minimieren`,expand:`Ausklappen`,collapse:`Einklappen`,viewAll:`Alle anzeigen`,learnMore:`Mehr erfahren`},t={loading:`Wird geladen…`,saving:`Wird gespeichert…`,error:`Fehler`,empty:`Keine Daten`,none:`Keine`,unknown:`Unbekannt`,yes:`Ja`,no:`Nein`,on:`Ein`,off:`Aus`,enabled:`Aktiviert`,disabled:`Deaktiviert`},n={queued:`In Warteschlange`,running:`Läuft`,completed:`Abgeschlossen`,failed:`Fehlgeschlagen`,canceled:`Abgebrochen`,draft:`Entwurf`},r={resize:{nw:`Größe ändern — obere linke Ecke`,n:`Größe ändern — obere Kante`,ne:`Größe ändern — obere rechte Ecke`,e:`Größe ändern — rechte Kante`,se:`Größe ändern — untere rechte Ecke`,s:`Größe ändern — untere Kante`,sw:`Größe ändern — untere linke Ecke`,w:`Größe ändern — linke Kante`},resetPosition:`Position zurücksetzen`},i={actions:e,states:t,status:n,modal:r};export{e as actions,i as default,r as modal,t as states,n as status};
@@ -1 +1 @@
1
- var e={save:`Guardar`,cancel:`Cancelar`,close:`Cerrar`,delete:`Eliminar`,confirm:`Confirmar`,retry:`Reintentar`,search:`Buscar`,copy:`Copiar`,copied:`Copiado`,back:`Atrás`,next:`Siguiente`,done:`Hecho`,open:`Abrir`,add:`Añadir`,remove:`Quitar`,edit:`Editar`,rename:`Renombrar`,duplicate:`Duplicar`,refresh:`Actualizar`,export:`Exportar`,discard:`Descartar`,minimize:`Minimizar`,expand:`Expandir`,collapse:`Contraer`,viewAll:`Ver todo`,learnMore:`Más información`},t={loading:`Cargando…`,saving:`Guardando…`,error:`Error`,empty:`Sin datos`,none:`Ninguno`,unknown:`Desconocido`,yes:`Sí`,no:`No`,on:`Activado`,off:`Desactivado`,enabled:`Habilitado`,disabled:`Deshabilitado`},n={queued:`En cola`,running:`En ejecución`,completed:`Completado`,failed:`Fallido`,canceled:`Cancelado`,draft:`Borrador`},r={actions:e,states:t,status:n};export{e as actions,r as default,t as states,n as status};
1
+ var e={save:`Guardar`,cancel:`Cancelar`,close:`Cerrar`,delete:`Eliminar`,confirm:`Confirmar`,retry:`Reintentar`,search:`Buscar`,copy:`Copiar`,copied:`Copiado`,back:`Atrás`,next:`Siguiente`,done:`Hecho`,open:`Abrir`,add:`Añadir`,remove:`Quitar`,edit:`Editar`,rename:`Renombrar`,duplicate:`Duplicar`,refresh:`Actualizar`,export:`Exportar`,discard:`Descartar`,minimize:`Minimizar`,expand:`Expandir`,collapse:`Contraer`,viewAll:`Ver todo`,learnMore:`Más información`},t={loading:`Cargando…`,saving:`Guardando…`,error:`Error`,empty:`Sin datos`,none:`Ninguno`,unknown:`Desconocido`,yes:`Sí`,no:`No`,on:`Activado`,off:`Desactivado`,enabled:`Habilitado`,disabled:`Deshabilitado`},n={queued:`En cola`,running:`En ejecución`,completed:`Completado`,failed:`Fallido`,canceled:`Cancelado`,draft:`Borrador`},r={resize:{nw:`Redimensionar — esquina superior izquierda`,n:`Redimensionar — borde superior`,ne:`Redimensionar — esquina superior derecha`,e:`Redimensionar — borde derecho`,se:`Redimensionar — esquina inferior derecha`,s:`Redimensionar — borde inferior`,sw:`Redimensionar — esquina inferior izquierda`,w:`Redimensionar — borde izquierdo`},resetPosition:`Restablecer posición`},i={actions:e,states:t,status:n,modal:r};export{e as actions,i as default,r as modal,t as states,n as status};
@@ -1 +1 @@
1
- var e={save:`保存`,cancel:`取消`,close:`关闭`,delete:`删除`,confirm:`确认`,retry:`重试`,search:`搜索`,copy:`复制`,copied:`已复制`,back:`返回`,next:`下一步`,done:`完成`,open:`打开`,add:`添加`,remove:`移除`,edit:`编辑`,rename:`重命名`,duplicate:`创建副本`,refresh:`刷新`,export:`导出`,discard:`丢弃`,minimize:`最小化`,expand:`展开`,collapse:`收起`,viewAll:`查看全部`,learnMore:`了解更多`},t={loading:`加载中…`,saving:`保存中…`,error:`错误`,empty:`暂无数据`,none:`无`,unknown:`未知`,yes:`是`,no:`否`,on:`开`,off:`关`,enabled:`已启用`,disabled:`已禁用`},n={queued:`已排队`,running:`运行中`,completed:`已完成`,failed:`失败`,canceled:`已取消`,draft:`草稿`},r={actions:e,states:t,status:n};export{e as actions,r as default,t as states,n as status};
1
+ var e={save:`保存`,cancel:`取消`,close:`关闭`,delete:`删除`,confirm:`确认`,retry:`重试`,search:`搜索`,copy:`复制`,copied:`已复制`,back:`返回`,next:`下一步`,done:`完成`,open:`打开`,add:`添加`,remove:`移除`,edit:`编辑`,rename:`重命名`,duplicate:`创建副本`,refresh:`刷新`,export:`导出`,discard:`丢弃`,minimize:`最小化`,expand:`展开`,collapse:`收起`,viewAll:`查看全部`,learnMore:`了解更多`},t={loading:`加载中…`,saving:`保存中…`,error:`错误`,empty:`暂无数据`,none:`无`,unknown:`未知`,yes:`是`,no:`否`,on:`开`,off:`关`,enabled:`已启用`,disabled:`已禁用`},n={queued:`已排队`,running:`运行中`,completed:`已完成`,failed:`失败`,canceled:`已取消`,draft:`草稿`},r={resize:{nw:`调整大小 — 左上角`,n:`调整大小 — 顶边`,ne:`调整大小 — 右上角`,e:`调整大小 — 右边`,se:`调整大小 — 右下角`,s:`调整大小 — 底边`,sw:`调整大小 — 左下角`,w:`调整大小 — 左边`},resetPosition:`重置位置`},i={actions:e,states:t,status:n,modal:r};export{e as actions,i as default,r as modal,t as states,n as status};
@@ -1 +1 @@
1
- var e={save:`保存`,cancel:`キャンセル`,close:`閉じる`,delete:`削除`,confirm:`確認`,retry:`再試行`,search:`検索`,copy:`コピー`,copied:`コピーしました`,back:`戻る`,next:`次へ`,done:`完了`,open:`開く`,add:`追加`,remove:`削除`,edit:`編集`,rename:`名前を変更`,duplicate:`複製`,refresh:`更新`,export:`エクスポート`,discard:`破棄`,minimize:`最小化`,expand:`展開`,collapse:`折りたたむ`,viewAll:`すべて表示`,learnMore:`詳細`},t={loading:`読み込み中…`,saving:`保存中…`,error:`エラー`,empty:`データなし`,none:`なし`,unknown:`不明`,yes:`はい`,no:`いいえ`,on:`オン`,off:`オフ`,enabled:`有効`,disabled:`無効`},n={queued:`キュー待ち`,running:`実行中`,completed:`完了`,failed:`失敗`,canceled:`キャンセル済み`,draft:`下書き`},r={actions:e,states:t,status:n};export{e as actions,r as default,t as states,n as status};
1
+ var e={save:`保存`,cancel:`キャンセル`,close:`閉じる`,delete:`削除`,confirm:`確認`,retry:`再試行`,search:`検索`,copy:`コピー`,copied:`コピーしました`,back:`戻る`,next:`次へ`,done:`完了`,open:`開く`,add:`追加`,remove:`削除`,edit:`編集`,rename:`名前を変更`,duplicate:`複製`,refresh:`更新`,export:`エクスポート`,discard:`破棄`,minimize:`最小化`,expand:`展開`,collapse:`折りたたむ`,viewAll:`すべて表示`,learnMore:`詳細`},t={loading:`読み込み中…`,saving:`保存中…`,error:`エラー`,empty:`データなし`,none:`なし`,unknown:`不明`,yes:`はい`,no:`いいえ`,on:`オン`,off:`オフ`,enabled:`有効`,disabled:`無効`},n={queued:`キュー待ち`,running:`実行中`,completed:`完了`,failed:`失敗`,canceled:`キャンセル済み`,draft:`下書き`},r={resize:{nw:`サイズ変更 — 左上隅`,n:`サイズ変更 — 上端`,ne:`サイズ変更 — 右上隅`,e:`サイズ変更 — 右端`,se:`サイズ変更 — 右下隅`,s:`サイズ変更 — 下端`,sw:`サイズ変更 — 左下隅`,w:`サイズ変更 — 左端`},resetPosition:`位置をリセット`},i={actions:e,states:t,status:n,modal:r};export{e as actions,i as default,r as modal,t as states,n as status};
@@ -1 +1 @@
1
- var e={save:`Salva`,cancel:`Annulla`,close:`Chiudi`,delete:`Elimina`,confirm:`Conferma`,retry:`Riprova`,search:`Cerca`,copy:`Copia`,copied:`Copiato`,back:`Indietro`,next:`Avanti`,done:`Fatto`,open:`Apri`,add:`Aggiungi`,remove:`Rimuovi`,edit:`Modifica`,rename:`Rinomina`,duplicate:`Duplica`,refresh:`Aggiorna`,export:`Esporta`,discard:`Scarta`,minimize:`Riduci`,expand:`Espandi`,collapse:`Comprimi`,viewAll:`Vedi tutto`,learnMore:`Scopri di più`},t={loading:`Caricamento…`,saving:`Salvataggio…`,error:`Errore`,empty:`Nessun dato`,none:`Nessuno`,unknown:`Sconosciuto`,yes:`Sì`,no:`No`,on:`On`,off:`Off`,enabled:`Abilitato`,disabled:`Disabilitato`},n={queued:`In coda`,running:`In esecuzione`,completed:`Completato`,failed:`Non riuscito`,canceled:`Annullato`,draft:`Bozza`},r={actions:e,states:t,status:n};export{e as actions,r as default,t as states,n as status};
1
+ var e={save:`Salva`,cancel:`Annulla`,close:`Chiudi`,delete:`Elimina`,confirm:`Conferma`,retry:`Riprova`,search:`Cerca`,copy:`Copia`,copied:`Copiato`,back:`Indietro`,next:`Avanti`,done:`Fatto`,open:`Apri`,add:`Aggiungi`,remove:`Rimuovi`,edit:`Modifica`,rename:`Rinomina`,duplicate:`Duplica`,refresh:`Aggiorna`,export:`Esporta`,discard:`Scarta`,minimize:`Riduci`,expand:`Espandi`,collapse:`Comprimi`,viewAll:`Vedi tutto`,learnMore:`Scopri di più`},t={loading:`Caricamento…`,saving:`Salvataggio…`,error:`Errore`,empty:`Nessun dato`,none:`Nessuno`,unknown:`Sconosciuto`,yes:`Sì`,no:`No`,on:`On`,off:`Off`,enabled:`Abilitato`,disabled:`Disabilitato`},n={queued:`In coda`,running:`In esecuzione`,completed:`Completato`,failed:`Non riuscito`,canceled:`Annullato`,draft:`Bozza`},r={resize:{nw:`Ridimensiona — angolo in alto a sinistra`,n:`Ridimensiona — bordo superiore`,ne:`Ridimensiona — angolo in alto a destra`,e:`Ridimensiona — bordo destro`,se:`Ridimensiona — angolo in basso a destra`,s:`Ridimensiona — bordo inferiore`,sw:`Ridimensiona — angolo in basso a sinistra`,w:`Ridimensiona — bordo sinistro`},resetPosition:`Reimposta posizione`},i={actions:e,states:t,status:n,modal:r};export{e as actions,i as default,r as modal,t as states,n as status};
@@ -1 +1 @@
1
- var e={save:`Guardar`,cancel:`Cancelar`,close:`Fechar`,delete:`Eliminar`,confirm:`Confirmar`,retry:`Repetir`,search:`Pesquisar`,copy:`Copiar`,copied:`Copiado`,back:`Voltar`,next:`Seguinte`,done:`Concluído`,open:`Abrir`,add:`Adicionar`,remove:`Remover`,edit:`Editar`,rename:`Renomear`,duplicate:`Duplicar`,refresh:`Atualizar`,export:`Exportar`,discard:`Descartar`,minimize:`Minimizar`,expand:`Expandir`,collapse:`Recolher`,viewAll:`Ver tudo`,learnMore:`Saber mais`},t={loading:`A carregar…`,saving:`A guardar…`,error:`Erro`,empty:`Sem dados`,none:`Nenhum`,unknown:`Desconhecido`,yes:`Sim`,no:`Não`,on:`Ligado`,off:`Desligado`,enabled:`Ativado`,disabled:`Desativado`},n={queued:`Em fila`,running:`Em execução`,completed:`Concluído`,failed:`Falhou`,canceled:`Cancelado`,draft:`Rascunho`},r={actions:e,states:t,status:n};export{e as actions,r as default,t as states,n as status};
1
+ var e={save:`Guardar`,cancel:`Cancelar`,close:`Fechar`,delete:`Eliminar`,confirm:`Confirmar`,retry:`Repetir`,search:`Pesquisar`,copy:`Copiar`,copied:`Copiado`,back:`Voltar`,next:`Seguinte`,done:`Concluído`,open:`Abrir`,add:`Adicionar`,remove:`Remover`,edit:`Editar`,rename:`Renomear`,duplicate:`Duplicar`,refresh:`Atualizar`,export:`Exportar`,discard:`Descartar`,minimize:`Minimizar`,expand:`Expandir`,collapse:`Recolher`,viewAll:`Ver tudo`,learnMore:`Saber mais`},t={loading:`A carregar…`,saving:`A guardar…`,error:`Erro`,empty:`Sem dados`,none:`Nenhum`,unknown:`Desconhecido`,yes:`Sim`,no:`Não`,on:`Ligado`,off:`Desligado`,enabled:`Ativado`,disabled:`Desativado`},n={queued:`Em fila`,running:`Em execução`,completed:`Concluído`,failed:`Falhou`,canceled:`Cancelado`,draft:`Rascunho`},r={resize:{nw:`Redimensionar — canto superior esquerdo`,n:`Redimensionar — borda superior`,ne:`Redimensionar — canto superior direito`,e:`Redimensionar — borda direita`,se:`Redimensionar — canto inferior direito`,s:`Redimensionar — borda inferior`,sw:`Redimensionar — canto inferior esquerdo`,w:`Redimensionar — borda esquerda`},resetPosition:`Repor posição`},i={actions:e,states:t,status:n,modal:r};export{e as actions,i as default,r as modal,t as states,n as status};
@@ -1 +1 @@
1
- var e={save:`Enregistrer`,cancel:`Annuler`,close:`Fermer`,delete:`Supprimer`,confirm:`Confirmer`,retry:`Réessayer`,search:`Rechercher`,copy:`Copier`,copied:`Copié`,back:`Retour`,next:`Suivant`,done:`Terminé`,open:`Ouvrir`,add:`Ajouter`,remove:`Retirer`,edit:`Modifier`,rename:`Renommer`,duplicate:`Dupliquer`,refresh:`Actualiser`,export:`Exporter`,discard:`Abandonner`,minimize:`Réduire`,expand:`Déplier`,collapse:`Replier`,viewAll:`Tout voir`,learnMore:`En savoir plus`},t={loading:`Chargement…`,saving:`Enregistrement…`,error:`Erreur`,empty:`Aucune donnée`,none:`Aucun`,unknown:`Inconnu`,yes:`Oui`,no:`Non`,on:`Activé`,off:`Désactivé`,enabled:`Activé`,disabled:`Désactivé`},n={queued:`En attente`,running:`En cours`,completed:`Terminé`,failed:`Échec`,canceled:`Annulé`,draft:`Brouillon`},r={actions:e,states:t,status:n};export{e as actions,r as default,t as states,n as status};
1
+ var e={save:`Enregistrer`,cancel:`Annuler`,close:`Fermer`,delete:`Supprimer`,confirm:`Confirmer`,retry:`Réessayer`,search:`Rechercher`,copy:`Copier`,copied:`Copié`,back:`Retour`,next:`Suivant`,done:`Terminé`,open:`Ouvrir`,add:`Ajouter`,remove:`Retirer`,edit:`Modifier`,rename:`Renommer`,duplicate:`Dupliquer`,refresh:`Actualiser`,export:`Exporter`,discard:`Abandonner`,minimize:`Réduire`,expand:`Déplier`,collapse:`Replier`,viewAll:`Tout voir`,learnMore:`En savoir plus`},t={loading:`Chargement…`,saving:`Enregistrement…`,error:`Erreur`,empty:`Aucune donnée`,none:`Aucun`,unknown:`Inconnu`,yes:`Oui`,no:`Non`,on:`Activé`,off:`Désactivé`,enabled:`Activé`,disabled:`Désactivé`},n={queued:`En attente`,running:`En cours`,completed:`Terminé`,failed:`Échec`,canceled:`Annulé`,draft:`Brouillon`},r={resize:{nw:`Redimensionner — coin supérieur gauche`,n:`Redimensionner — bord supérieur`,ne:`Redimensionner — coin supérieur droit`,e:`Redimensionner — bord droit`,se:`Redimensionner — coin inférieur droit`,s:`Redimensionner — bord inférieur`,sw:`Redimensionner — coin inférieur gauche`,w:`Redimensionner — bord gauche`},resetPosition:`Réinitialiser la position`},i={actions:e,states:t,status:n,modal:r};export{e as actions,i as default,r as modal,t as states,n as status};
@@ -0,0 +1 @@
1
+ import{n as e}from"./chunk-CilyBKbf.js";var t=e({actions:()=>n,default:()=>o,modal:()=>a,states:()=>r,status:()=>i}),n={save:`Save`,cancel:`Cancel`,close:`Close`,delete:`Delete`,confirm:`Confirm`,retry:`Retry`,search:`Search`,copy:`Copy`,copied:`Copied`,back:`Back`,next:`Next`,done:`Done`,open:`Open`,add:`Add`,remove:`Remove`,edit:`Edit`,rename:`Rename`,duplicate:`Duplicate`,refresh:`Refresh`,export:`Export`,discard:`Discard`,minimize:`Minimize`,expand:`Expand`,collapse:`Collapse`,viewAll:`View all`,learnMore:`Learn more`},r={loading:`Loading…`,saving:`Saving…`,error:`Error`,empty:`No data`,none:`None`,unknown:`Unknown`,yes:`Yes`,no:`No`,on:`On`,off:`Off`,enabled:`Enabled`,disabled:`Disabled`},i={queued:`Queued`,running:`Running`,completed:`Completed`,failed:`Failed`,canceled:`Canceled`,draft:`Draft`},a={resize:{nw:`Resize modal — top-left corner`,n:`Resize modal — top edge`,ne:`Resize modal — top-right corner`,e:`Resize modal — right edge`,se:`Resize modal — bottom-right corner`,s:`Resize modal — bottom edge`,sw:`Resize modal — bottom-left corner`,w:`Resize modal — left edge`},resetPosition:`Reset modal position`},o={actions:n,states:r,status:i,modal:a};export{t};
@@ -0,0 +1 @@
1
+ var e={railAdded:`Rail {{n}} aggiunto`,railRemoved:`{{rail}} rimosso`,railCompleted:`Rail {{n}} completato`,railFailed:`Rail {{n}} non riuscito — le spec sono tornate in Specs`,railEnded:`Rail {{n}} {{status}} — le spec sono tornate in Specs`,alreadyOnRail:`Già su {{rail}}`,movedToRail:`Spostata su {{rail}}`,railRunningStopFirst:`{{rail}} è in esecuzione — fermalo prima di rimuoverlo`,removedFromRail:`Rimossa da {{rail}}`,queuedOnRail:`In coda su {{rail}}`,queuedOnRailDescription:`Il rail è attualmente in esecuzione`,railStopped:`{{rail}} fermato`,stopFailed:`Impossibile fermare il rail`,syncTicketsFailed:`Impossibile sincronizzare i ticket del rail`,launchFailed:`Impossibile avviare il rail`,launchNetworkError:`Errore di rete durante l'avvio del rail`,railLaunched:`{{rail}} avviato`,launchDescription_one:`{{mode}} con {{count}} spec`,launchDescription_other:`{{mode}} con {{count}} spec`,railWorktreeNeedsReview:`Rail {{n}}: la spec #{{ticket}} richiede revisione dopo il merge`,railWorktreesNoGit:`Isolamento con worktree non disponibile: il progetto non è un repository git — esecuzione in modalità condivisa.`,railWorktreesNoCommits:`Isolamento con worktree non disponibile: il repository non ha ancora commit — crea un commit iniziale e rilancia.`},t={title:`Rails`,runningCount_one:`{{count}} in esecuzione`,runningCount_other:`{{count}} in esecuzione`},n={viewJobLog:`Visualizza log del job`,log:`Log`,implement:`Implementa`,batch:`Batch`,ultra:`Ultra`,ultraTitle:`Ultracode — Claude implementa la spec in autonomia, senza pipeline`,loop:`Loop`,loopTitle:`Loop — esegui un loop di automazione pubblicato sulle spec del rail`,pickLoop:`Scegli un loop…`,effortTitle:`Sforzo di ragionamento`,interactive:`Interattivo`,interactiveTitle:`Interattivo — chatta con il job in esecuzione; invia altri prompt e finalizza al termine`,stop:`Stop`,play:`Avvia`,failedRetry:`Job non riuscito — clicca per riprovare`,addSpecsFirst:`Aggiungi prima delle spec a questo rail`,builtInLoops:`Integrati`,customLoops:`Loop personalizzati`,worktreesMerged:`{{count}} uniti`,worktreesNeedsReview:`{{count}} da rivedere`,execSteps:`{{count}} passi`,execLines:`{{count}} righe`},r={moveToSpecs:`Sposta in Specs`,deleteRail:`Elimina {{label}}`,dropHere:`Rilascia qui`,dropOnThisRail:`Rilascia su questo rail`,dragSpecsHere:`Trascina qui le spec`},i={title:`Avvia in modalità Ultracode`,context_one:`{{rail}} · {{count}} spec`,context_other:`{{rail}} · {{count}} spec`,noPipelineTitle:`Nessuna pipeline OpenSpec.`,noPipelineBody:`Il flusso strutturato architect → developer → reviewer viene saltato del tutto.`,autonomyTitle:`Autonomia nativa di Claude.`,autonomyBody:`Claude lavora in autonomia usando agenti nativi e workflow dinamici.`,costTitle:`Costo variabile.`,costBody:`La spesa dipende da cosa Claude decide di fare — può essere più alta del previsto.`,continue:`Continua`},a={fetchFailed:`Impossibile recuperare i rail: {{status}}`},o={toasts:e,railsBoard:t,railControls:n,railRow:r,ultracodeDialog:i,useRails:a};export{o as default,n as railControls,r as railRow,t as railsBoard,e as toasts,i as ultracodeDialog,a as useRails};
@@ -0,0 +1 @@
1
+ import{n as e}from"./chunk-CilyBKbf.js";var t=e({default:()=>c,railControls:()=>i,railRow:()=>a,railsBoard:()=>r,toasts:()=>n,ultracodeDialog:()=>o,useRails:()=>s}),n={railAdded:`Rail {{n}} added`,railRemoved:`{{rail}} removed`,railCompleted:`Rail {{n}} completed`,railFailed:`Rail {{n}} failed — specs returned to Specs`,railEnded:`Rail {{n}} {{status}} — specs returned to Specs`,alreadyOnRail:`Already on {{rail}}`,movedToRail:`Moved to {{rail}}`,railRunningStopFirst:`{{rail}} is running — stop it before removing`,removedFromRail:`Removed from {{rail}}`,queuedOnRail:`Queued on {{rail}}`,queuedOnRailDescription:`Rail is currently running`,railStopped:`{{rail}} stopped`,stopFailed:`Failed to stop rail`,syncTicketsFailed:`Failed to sync rail tickets`,launchFailed:`Failed to launch rail`,launchNetworkError:`Network error launching rail`,railLaunched:`{{rail}} launched`,launchDescription_one:`{{mode}} with {{count}} spec`,launchDescription_other:`{{mode}} with {{count}} specs`,railWorktreeNeedsReview:`Rail {{n}}: spec #{{ticket}} needs review after merge`,railWorktreesNoGit:`Worktree isolation unavailable: this project isn't a git repository — running in shared mode.`,railWorktreesNoCommits:`Worktree isolation unavailable: the repository has no commits yet — make an initial commit, then relaunch.`},r={title:`Rails`,runningCount_one:`{{count}} running`,runningCount_other:`{{count}} running`},i={viewJobLog:`View job log`,log:`Log`,implement:`Implement`,batch:`Batch`,ultra:`Ultra`,ultraTitle:`Ultracode — Claude implements the spec autonomously, no pipeline`,loop:`Loop`,loopTitle:`Loop — run a published automation loop against the rail's specs`,pickLoop:`Pick a loop…`,effortTitle:`Reasoning effort`,interactive:`Interactive`,interactiveTitle:`Interactive — chat with the running job; send more prompts and finalize when done`,stop:`Stop`,play:`Play`,failedRetry:`Job failed — click to retry`,addSpecsFirst:`Add specs to this rail first`,builtInLoops:`Built-in`,customLoops:`Custom loops`,worktreesMerged:`{{count}} merged`,worktreesNeedsReview:`{{count}} need review`,execSteps:`{{count}} steps`,execLines:`{{count}} lines`},a={moveToSpecs:`Move to Specs`,deleteRail:`Delete {{label}}`,dropHere:`Drop here`,dropOnThisRail:`Drop on this rail`,dragSpecsHere:`Drag specs here`},o={title:`Launch in Ultracode mode`,context_one:`{{rail}} · {{count}} spec`,context_other:`{{rail}} · {{count}} specs`,noPipelineTitle:`No OpenSpec pipeline.`,noPipelineBody:`The structured architect → developer → reviewer flow is skipped entirely.`,autonomyTitle:`Native Claude autonomy.`,autonomyBody:`Claude works on its own using native agents and dynamic workflows.`,costTitle:`Variable cost.`,costBody:`Spend depends on what Claude decides to do — it can be higher than expected.`,continue:`Continue`},s={fetchFailed:`Failed to fetch rails: {{status}}`},c={toasts:n,railsBoard:r,railControls:i,railRow:a,ultracodeDialog:o,useRails:s};export{t};
@@ -0,0 +1 @@
1
+ var e={railAdded:`Rail {{n}} ajouté`,railRemoved:`{{rail}} supprimé`,railCompleted:`Rail {{n}} terminé`,railFailed:`Rail {{n}} en échec — specs renvoyées vers Specs`,railEnded:`Rail {{n}} {{status}} — specs renvoyées vers Specs`,alreadyOnRail:`Déjà sur {{rail}}`,movedToRail:`Déplacé vers {{rail}}`,railRunningStopFirst:`{{rail}} est en cours d'exécution — arrêtez-le avant de le supprimer`,removedFromRail:`Retiré de {{rail}}`,queuedOnRail:`Mis en file sur {{rail}}`,queuedOnRailDescription:`Le rail est en cours d'exécution`,railStopped:`{{rail}} arrêté`,stopFailed:`Échec de l'arrêt du rail`,syncTicketsFailed:`Échec de la synchronisation des tickets du rail`,launchFailed:`Échec du lancement du rail`,launchNetworkError:`Erreur réseau au lancement du rail`,railLaunched:`{{rail}} lancé`,launchDescription_one:`{{mode}} avec {{count}} spec`,launchDescription_other:`{{mode}} avec {{count}} specs`,railWorktreeNeedsReview:`Rail {{n}} : la spec #{{ticket}} nécessite une revue après le merge`,railWorktreesNoGit:`Isolation par worktree indisponible : ce projet n'est pas un dépôt git — exécution en mode partagé.`,railWorktreesNoCommits:`Isolation par worktree indisponible : le dépôt n'a pas encore de commit — faites un commit initial puis relancez.`},t={title:`Rails`,runningCount_one:`{{count}} en cours`,runningCount_other:`{{count}} en cours`},n={viewJobLog:`Voir le log du job`,log:`Log`,implement:`Implémenter`,batch:`Batch`,ultra:`Ultra`,ultraTitle:`Ultracode — Claude implémente la spec en autonomie, sans pipeline`,loop:`Loop`,loopTitle:`Loop — exécute une boucle d'automatisation publiée sur les specs du rail`,pickLoop:`Choisir une boucle…`,effortTitle:`Effort de raisonnement`,interactive:`Interactif`,interactiveTitle:`Interactif — discutez avec le job en cours ; envoyez d'autres prompts et finalisez une fois terminé`,stop:`Arrêter`,play:`Lancer`,failedRetry:`Job en échec — cliquez pour réessayer`,addSpecsFirst:`Ajoutez d'abord des specs à ce rail`,builtInLoops:`Intégrés`,customLoops:`Loops personnalisés`,worktreesMerged:`{{count}} fusionnés`,worktreesNeedsReview:`{{count}} à vérifier`,execSteps:`{{count}} étapes`,execLines:`{{count}} lignes`},r={moveToSpecs:`Déplacer vers Specs`,deleteRail:`Supprimer {{label}}`,dropHere:`Déposer ici`,dropOnThisRail:`Déposer sur ce rail`,dragSpecsHere:`Glissez des specs ici`},i={title:`Lancer en mode Ultracode`,context_one:`{{rail}} · {{count}} spec`,context_other:`{{rail}} · {{count}} specs`,noPipelineTitle:`Pas de pipeline OpenSpec.`,noPipelineBody:`Le flux structuré architecte → développeur → reviewer est entièrement ignoré.`,autonomyTitle:`Autonomie native de Claude.`,autonomyBody:`Claude travaille seul avec ses agents natifs et des workflows dynamiques.`,costTitle:`Coût variable.`,costBody:`La dépense dépend de ce que Claude décide de faire — elle peut être plus élevée que prévu.`,continue:`Continuer`},a={fetchFailed:`Échec de la récupération des rails : {{status}}`},o={toasts:e,railsBoard:t,railControls:n,railRow:r,ultracodeDialog:i,useRails:a};export{o as default,n as railControls,r as railRow,t as railsBoard,e as toasts,i as ultracodeDialog,a as useRails};
@@ -0,0 +1 @@
1
+ var e={railAdded:`Rail {{n}} hinzugefügt`,railRemoved:`{{rail}} entfernt`,railCompleted:`Rail {{n}} abgeschlossen`,railFailed:`Rail {{n}} fehlgeschlagen – Specs zurück in Specs`,railEnded:`Rail {{n}} {{status}} – Specs zurück in Specs`,alreadyOnRail:`Bereits auf {{rail}}`,movedToRail:`Auf {{rail}} verschoben`,railRunningStopFirst:`{{rail}} läuft – vor dem Entfernen stoppen`,removedFromRail:`Von {{rail}} entfernt`,queuedOnRail:`Auf {{rail}} eingereiht`,queuedOnRailDescription:`Rail läuft gerade`,railStopped:`{{rail}} gestoppt`,stopFailed:`Rail konnte nicht gestoppt werden`,syncTicketsFailed:`Rail-Tickets konnten nicht synchronisiert werden`,launchFailed:`Rail konnte nicht gestartet werden`,launchNetworkError:`Netzwerkfehler beim Starten des Rails`,railLaunched:`{{rail}} gestartet`,launchDescription_one:`{{mode}} mit {{count}} Spec`,launchDescription_other:`{{mode}} mit {{count}} Specs`,railWorktreeNeedsReview:`Rail {{n}}: Spec #{{ticket}} muss nach dem Merge geprüft werden`,railWorktreesNoGit:`Worktree-Isolation nicht verfügbar: Dieses Projekt ist kein Git-Repository — Ausführung im gemeinsamen Modus.`,railWorktreesNoCommits:`Worktree-Isolation nicht verfügbar: Das Repository hat noch keine Commits — erstelle einen ersten Commit und starte neu.`},t={title:`Rails`,runningCount_one:`{{count}} läuft`,runningCount_other:`{{count}} laufen`},n={viewJobLog:`Job-Log anzeigen`,log:`Log`,implement:`Implement`,batch:`Batch`,ultra:`Ultra`,ultraTitle:`Ultracode – Claude implementiert die Spec autonom, ohne Pipeline`,loop:`Loop`,loopTitle:`Loop – eine veröffentlichte Automatisierungsschleife gegen die Specs des Rails ausführen`,pickLoop:`Schleife auswählen…`,effortTitle:`Denkaufwand`,interactive:`Interaktiv`,interactiveTitle:`Interaktiv – chatte mit dem laufenden Job; sende weitere Prompts und schließe ab, wenn du fertig bist`,stop:`Stopp`,play:`Start`,failedRetry:`Job fehlgeschlagen – zum Wiederholen klicken`,addSpecsFirst:`Füge zuerst Specs zu diesem Rail hinzu`,builtInLoops:`Integriert`,customLoops:`Eigene Loops`,worktreesMerged:`{{count}} zusammengeführt`,worktreesNeedsReview:`{{count}} zu prüfen`,execSteps:`{{count}} Schritte`,execLines:`{{count}} Zeilen`},r={moveToSpecs:`Nach Specs verschieben`,deleteRail:`{{label}} löschen`,dropHere:`Hier ablegen`,dropOnThisRail:`Auf diesem Rail ablegen`,dragSpecsHere:`Specs hierher ziehen`},i={title:`Im Ultracode-Modus starten`,context_one:`{{rail}} · {{count}} Spec`,context_other:`{{rail}} · {{count}} Specs`,noPipelineTitle:`Keine OpenSpec-Pipeline.`,noPipelineBody:`Der strukturierte Flow Architect → Developer → Reviewer wird komplett übersprungen.`,autonomyTitle:`Native Claude-Autonomie.`,autonomyBody:`Claude arbeitet eigenständig mit nativen Agenten und dynamischen Workflows.`,costTitle:`Variable Kosten.`,costBody:`Die Ausgaben hängen davon ab, was Claude entscheidet – sie können höher ausfallen als erwartet.`,continue:`Weiter`},a={fetchFailed:`Rails konnten nicht geladen werden: {{status}}`},o={toasts:e,railsBoard:t,railControls:n,railRow:r,ultracodeDialog:i,useRails:a};export{o as default,n as railControls,r as railRow,t as railsBoard,e as toasts,i as ultracodeDialog,a as useRails};
@@ -0,0 +1 @@
1
+ var e={railAdded:`Rail {{n}} adicionado`,railRemoved:`{{rail}} removido`,railCompleted:`Rail {{n}} concluído`,railFailed:`Rail {{n}} falhou — specs devolvidas a Specs`,railEnded:`Rail {{n}} {{status}} — specs devolvidas a Specs`,alreadyOnRail:`Já está em {{rail}}`,movedToRail:`Movido para {{rail}}`,railRunningStopFirst:`{{rail}} está em execução — pare-o antes de remover`,removedFromRail:`Removido de {{rail}}`,queuedOnRail:`Em fila em {{rail}}`,queuedOnRailDescription:`O rail está atualmente em execução`,railStopped:`{{rail}} parado`,stopFailed:`Falha ao parar o rail`,syncTicketsFailed:`Falha ao sincronizar os tickets do rail`,launchFailed:`Falha ao lançar o rail`,launchNetworkError:`Erro de rede ao lançar o rail`,railLaunched:`{{rail}} lançado`,launchDescription_one:`{{mode}} com {{count}} spec`,launchDescription_other:`{{mode}} com {{count}} specs`,railWorktreeNeedsReview:`Rail {{n}}: a spec #{{ticket}} precisa de revisão após o merge`,railWorktreesNoGit:`Isolamento por worktree indisponível: este projeto não é um repositório git — executando em modo compartilhado.`,railWorktreesNoCommits:`Isolamento por worktree indisponível: o repositório ainda não tem commits — faça um commit inicial e relance.`},t={title:`Rails`,runningCount_one:`{{count}} em execução`,runningCount_other:`{{count}} em execução`},n={viewJobLog:`Ver log do job`,log:`Log`,implement:`Implementar`,batch:`Batch`,ultra:`Ultra`,ultraTitle:`Ultracode — o Claude implementa a spec de forma autónoma, sem pipeline`,loop:`Loop`,loopTitle:`Loop — execute um loop de automação publicado nas specs do rail`,pickLoop:`Escolha um loop…`,effortTitle:`Esforço de raciocínio`,interactive:`Interativo`,interactiveTitle:`Interativo — converse com o job em execução; envie mais prompts e finalize quando terminar`,stop:`Parar`,play:`Iniciar`,failedRetry:`O job falhou — clique para repetir`,addSpecsFirst:`Adicione primeiro specs a este rail`,builtInLoops:`Integrados`,customLoops:`Loops personalizados`,worktreesMerged:`{{count}} mesclados`,worktreesNeedsReview:`{{count}} para revisar`,execSteps:`{{count}} passos`,execLines:`{{count}} linhas`},r={moveToSpecs:`Mover para Specs`,deleteRail:`Eliminar {{label}}`,dropHere:`Largar aqui`,dropOnThisRail:`Largar neste rail`,dragSpecsHere:`Arraste specs para aqui`},i={title:`Lançar em modo Ultracode`,context_one:`{{rail}} · {{count}} spec`,context_other:`{{rail}} · {{count}} specs`,noPipelineTitle:`Sem pipeline OpenSpec.`,noPipelineBody:`O fluxo estruturado architect → developer → reviewer é totalmente ignorado.`,autonomyTitle:`Autonomia nativa do Claude.`,autonomyBody:`O Claude trabalha por conta própria com agentes nativos e workflows dinâmicos.`,costTitle:`Custo variável.`,costBody:`O gasto depende do que o Claude decidir fazer — pode ser superior ao esperado.`,continue:`Continuar`},a={fetchFailed:`Falha ao obter os rails: {{status}}`},o={toasts:e,railsBoard:t,railControls:n,railRow:r,ultracodeDialog:i,useRails:a};export{o as default,n as railControls,r as railRow,t as railsBoard,e as toasts,i as ultracodeDialog,a as useRails};
@@ -0,0 +1 @@
1
+ var e={railAdded:`レール {{n}} を追加しました`,railRemoved:`{{rail}} を削除しました`,railCompleted:`レール {{n}} が完了しました`,railFailed:`レール {{n}} が失敗しました — スペックは Specs に戻されました`,railEnded:`レール {{n}}: {{status}} — スペックは Specs に戻されました`,alreadyOnRail:`すでに {{rail}} にあります`,movedToRail:`{{rail}} に移動しました`,railRunningStopFirst:`{{rail}} は実行中です — 削除する前に停止してください`,removedFromRail:`{{rail}} から削除しました`,queuedOnRail:`{{rail}} のキューに追加しました`,queuedOnRailDescription:`レールは現在実行中です`,railStopped:`{{rail}} を停止しました`,stopFailed:`レールの停止に失敗しました`,syncTicketsFailed:`レールのチケット同期に失敗しました`,launchFailed:`レールの起動に失敗しました`,launchNetworkError:`レール起動中にネットワークエラーが発生しました`,railLaunched:`{{rail}} を起動しました`,launchDescription_one:`{{mode}} · スペック {{count}} 件`,launchDescription_other:`{{mode}} · スペック {{count}} 件`,railWorktreeNeedsReview:`Rail {{n}}:マージ後、spec #{{ticket}} は要確認です`,railWorktreesNoGit:`worktree 分離は利用できません:このプロジェクトは git リポジトリではありません — 共有モードで実行します。`,railWorktreesNoCommits:`worktree 分離は利用できません:リポジトリにまだコミットがありません — 初回コミットを作成してから再実行してください。`},t={title:`レール`,runningCount_one:`{{count}} 件実行中`,runningCount_other:`{{count}} 件実行中`},n={viewJobLog:`ジョブログを表示`,log:`ログ`,implement:`実装`,batch:`バッチ`,ultra:`Ultra`,ultraTitle:`Ultracode — Claude がパイプラインなしでスペックを自律的に実装します`,loop:`Loop`,loopTitle:`Loop — 公開済みの自動化ループをレールのスペックに対して実行します`,pickLoop:`ループを選択…`,effortTitle:`推論の労力`,interactive:`インタラクティブ`,interactiveTitle:`インタラクティブ — 実行中のジョブとチャットし、さらにプロンプトを送信して完了時にファイナライズします`,stop:`停止`,play:`実行`,failedRetry:`ジョブが失敗しました — クリックして再試行`,addSpecsFirst:`先にこのレールにスペックを追加してください`,builtInLoops:`組み込み`,customLoops:`カスタムループ`,worktreesMerged:`{{count}} 件マージ済み`,worktreesNeedsReview:`{{count}} 件要確認`,execSteps:`{{count}} ステップ`,execLines:`{{count}} 行`},r={moveToSpecs:`Specs に移動`,deleteRail:`{{label}} を削除`,dropHere:`ここにドロップ`,dropOnThisRail:`このレールにドロップ`,dragSpecsHere:`ここにスペックをドラッグ`},i={title:`Ultracode モードで起動`,context_one:`{{rail}} · スペック {{count}} 件`,context_other:`{{rail}} · スペック {{count}} 件`,noPipelineTitle:`OpenSpec パイプラインなし。`,noPipelineBody:`アーキテクト → 開発者 → レビュアーの構造化フローは完全にスキップされます。`,autonomyTitle:`Claude ネイティブの自律性。`,autonomyBody:`Claude はネイティブエージェントと動的ワークフローを使って自律的に作業します。`,costTitle:`コストは変動します。`,costBody:`支出は Claude の判断に依存し、想定より高くなることがあります。`,continue:`続行`},a={fetchFailed:`レールの取得に失敗しました: {{status}}`},o={toasts:e,railsBoard:t,railControls:n,railRow:r,ultracodeDialog:i,useRails:a};export{o as default,n as railControls,r as railRow,t as railsBoard,e as toasts,i as ultracodeDialog,a as useRails};
@@ -0,0 +1 @@
1
+ var e={railAdded:`Rail {{n}} añadido`,railRemoved:`{{rail}} eliminado`,railCompleted:`Rail {{n}} completado`,railFailed:`Rail {{n}} fallido — las specs han vuelto a Specs`,railEnded:`Rail {{n}} {{status}} — las specs han vuelto a Specs`,alreadyOnRail:`Ya está en {{rail}}`,movedToRail:`Movida a {{rail}}`,railRunningStopFirst:`{{rail}} está en ejecución — detenlo antes de eliminarlo`,removedFromRail:`Quitada de {{rail}}`,queuedOnRail:`En cola en {{rail}}`,queuedOnRailDescription:`El rail está en ejecución`,railStopped:`{{rail}} detenido`,stopFailed:`No se pudo detener el rail`,syncTicketsFailed:`No se pudieron sincronizar los tickets del rail`,launchFailed:`No se pudo lanzar el rail`,launchNetworkError:`Error de red al lanzar el rail`,railLaunched:`{{rail}} lanzado`,launchDescription_one:`{{mode}} con {{count}} spec`,launchDescription_other:`{{mode}} con {{count}} specs`,railWorktreeNeedsReview:`Rail {{n}}: la spec #{{ticket}} necesita revisión tras el merge`,railWorktreesNoGit:`Aislamiento por worktrees no disponible: el proyecto no es un repositorio git — ejecutando en modo compartido.`,railWorktreesNoCommits:`Aislamiento por worktrees no disponible: el repositorio aún no tiene commits — haz un commit inicial y relanza.`},t={title:`Rails`,runningCount_one:`{{count}} en ejecución`,runningCount_other:`{{count}} en ejecución`},n={viewJobLog:`Ver log del job`,log:`Log`,implement:`Implement`,batch:`Batch`,ultra:`Ultra`,ultraTitle:`Ultracode — Claude implementa la spec de forma autónoma, sin pipeline`,loop:`Loop`,loopTitle:`Loop — ejecuta un bucle de automatización publicado sobre las specs del rail`,pickLoop:`Elige un bucle…`,effortTitle:`Esfuerzo de razonamiento`,interactive:`Interactivo`,interactiveTitle:`Interactivo — chatea con el job en ejecución; envía más prompts y finaliza cuando termines`,stop:`Detener`,play:`Iniciar`,failedRetry:`El job ha fallado — haz clic para reintentar`,addSpecsFirst:`Añade primero specs a este rail`,builtInLoops:`Integrados`,customLoops:`Loops personalizados`,worktreesMerged:`{{count}} fusionados`,worktreesNeedsReview:`{{count}} a revisar`,execSteps:`{{count}} pasos`,execLines:`{{count}} líneas`},r={moveToSpecs:`Mover a Specs`,deleteRail:`Eliminar {{label}}`,dropHere:`Suelta aquí`,dropOnThisRail:`Suelta en este rail`,dragSpecsHere:`Arrastra specs aquí`},i={title:`Lanzar en modo Ultracode`,context_one:`{{rail}} · {{count}} spec`,context_other:`{{rail}} · {{count}} specs`,noPipelineTitle:`Sin pipeline de OpenSpec.`,noPipelineBody:`El flujo estructurado architect → developer → reviewer se omite por completo.`,autonomyTitle:`Autonomía nativa de Claude.`,autonomyBody:`Claude trabaja por su cuenta con agentes nativos y flujos dinámicos.`,costTitle:`Coste variable.`,costBody:`El gasto depende de lo que Claude decida hacer — puede ser mayor de lo esperado.`,continue:`Continuar`},a={fetchFailed:`No se pudieron obtener los rails: {{status}}`},o={toasts:e,railsBoard:t,railControls:n,railRow:r,ultracodeDialog:i,useRails:a};export{o as default,n as railControls,r as railRow,t as railsBoard,e as toasts,i as ultracodeDialog,a as useRails};
@@ -0,0 +1 @@
1
+ var e={railAdded:`已添加 Rail {{n}}`,railRemoved:`已移除 {{rail}}`,railCompleted:`Rail {{n}} 已完成`,railFailed:`Rail {{n}} 失败 — Spec 已退回 Specs`,railEnded:`Rail {{n}} {{status}} — Spec 已退回 Specs`,alreadyOnRail:`已在 {{rail}} 上`,movedToRail:`已移至 {{rail}}`,railRunningStopFirst:`{{rail}} 正在运行 — 请先停止再移除`,removedFromRail:`已从 {{rail}} 移除`,queuedOnRail:`已在 {{rail}} 排队`,queuedOnRailDescription:`Rail 正在运行`,railStopped:`{{rail}} 已停止`,stopFailed:`停止 Rail 失败`,syncTicketsFailed:`同步 Rail 工单失败`,launchFailed:`启动 Rail 失败`,launchNetworkError:`启动 Rail 时网络错误`,railLaunched:`{{rail}} 已启动`,launchDescription_one:`{{mode}},共 {{count}} 个 Spec`,launchDescription_other:`{{mode}},共 {{count}} 个 Spec`,railWorktreeNeedsReview:`Rail {{n}}:合并后 spec #{{ticket}} 需要复查`,railWorktreesNoGit:`worktree 隔离不可用:该项目不是 git 仓库 — 以共享模式运行。`,railWorktreesNoCommits:`worktree 隔离不可用:仓库还没有任何提交 — 先做一次初始提交再重新启动。`},t={title:`Rails`,runningCount_one:`{{count}} 个运行中`,runningCount_other:`{{count}} 个运行中`},n={viewJobLog:`查看任务日志`,log:`日志`,implement:`实现`,batch:`批量`,ultra:`Ultra`,ultraTitle:`Ultracode — Claude 自主实现该 Spec,不走流水线`,loop:`Loop`,loopTitle:`Loop — 针对该轨道的 Spec 运行已发布的自动化循环`,pickLoop:`选择一个循环…`,effortTitle:`推理强度`,interactive:`交互`,interactiveTitle:`交互 — 与运行中的任务对话;可继续发送提示,完成后再定稿`,stop:`停止`,play:`运行`,failedRetry:`任务失败 — 点击重试`,addSpecsFirst:`请先向此 Rail 添加 Spec`,builtInLoops:`内置`,customLoops:`自定义循环`,worktreesMerged:`已合并 {{count}}`,worktreesNeedsReview:`{{count}} 需复查`,execSteps:`{{count}} 步`,execLines:`{{count}} 行`},r={moveToSpecs:`移至 Specs`,deleteRail:`删除 {{label}}`,dropHere:`拖放到此处`,dropOnThisRail:`拖放到此 Rail`,dragSpecsHere:`将 Spec 拖到此处`},i={title:`以 Ultracode 模式启动`,context_one:`{{rail}} · {{count}} 个 Spec`,context_other:`{{rail}} · {{count}} 个 Spec`,noPipelineTitle:`无 OpenSpec 流水线。`,noPipelineBody:`完全跳过架构师 → 开发者 → 审查者的结构化流程。`,autonomyTitle:`Claude 原生自主模式。`,autonomyBody:`Claude 使用原生 Agent 和动态工作流自主工作。`,costTitle:`成本不固定。`,costBody:`花费取决于 Claude 的决策 — 可能高于预期。`,continue:`继续`},a={fetchFailed:`获取 Rails 失败:{{status}}`},o={toasts:e,railsBoard:t,railControls:n,railRow:r,ultracodeDialog:i,useRails:a};export{o as default,n as railControls,r as railRow,t as railsBoard,e as toasts,i as ultracodeDialog,a as useRails};
@@ -1 +1 @@
1
- import{i as e,r as t}from"./index-CEunZ8kJ.js";var n=class{constructor(){this.eventListeners=Object.create(null)}addListener(e,t){return this.on(e,t)}removeListener(e,t){return this.off(e,t)}on(e,t){return e in this.eventListeners?this.eventListeners[e].push(t):this.eventListeners[e]=[t],this}once(e,t){let n=r=>{this.removeListener(e,n),t(r)};return this.addListener(e,n)}off(e,t){return e in this.eventListeners&&(this.eventListeners[e]=this.eventListeners[e].filter(e=>e!==t)),this}removeAllListeners(e){return e?delete this.eventListeners[e]:this.eventListeners=Object.create(null),this}emit(e,t){if(e in this.eventListeners){let n=this.eventListeners[e];for(let e of n)e(t);return!0}return!1}listenerCount(e){return e in this.eventListeners?this.eventListeners[e].length:0}prependListener(e,t){return e in this.eventListeners?this.eventListeners[e].unshift(t):this.eventListeners[e]=[t],this}prependOnceListener(e,t){let n=r=>{this.removeListener(e,n),t(r)};return this.prependListener(e,n)}},r=class{constructor(e){this.pid=e}async write(t){await e(`plugin:shell|stdin_write`,{pid:this.pid,buffer:t})}async kill(){await e(`plugin:shell|kill`,{cmd:`killChild`,pid:this.pid})}},i=class i extends n{constructor(e,t=[],r){super(),this.stdout=new n,this.stderr=new n,this.program=e,this.args=typeof t==`string`?[t]:t,this.options=r??{}}static create(e,t=[],n){return new i(e,t,n)}static sidecar(e,t=[],n){let r=new i(e,t,n);return r.options.sidecar=!0,r}async spawn(){let n=this.program,i=this.args,a=this.options;typeof i==`object`&&Object.freeze(i);let o=new t;return o.onmessage=e=>{switch(e.event){case`Error`:this.emit(`error`,e.payload);break;case`Terminated`:this.emit(`close`,e.payload);break;case`Stdout`:this.stdout.emit(`data`,e.payload);break;case`Stderr`:this.stderr.emit(`data`,e.payload);break}},await e(`plugin:shell|spawn`,{program:n,args:i,options:a,onEvent:o}).then(e=>new r(e))}async execute(){let t=this.program,n=this.args,r=this.options;return typeof n==`object`&&Object.freeze(n),await e(`plugin:shell|execute`,{program:t,args:n,options:r})}};async function a(t,n){await e(`plugin:shell|open`,{path:t,with:n})}export{r as Child,i as Command,n as EventEmitter,a as open};
1
+ import{i as e,r as t}from"./index-meTWPBzY.js";var n=class{constructor(){this.eventListeners=Object.create(null)}addListener(e,t){return this.on(e,t)}removeListener(e,t){return this.off(e,t)}on(e,t){return e in this.eventListeners?this.eventListeners[e].push(t):this.eventListeners[e]=[t],this}once(e,t){let n=r=>{this.removeListener(e,n),t(r)};return this.addListener(e,n)}off(e,t){return e in this.eventListeners&&(this.eventListeners[e]=this.eventListeners[e].filter(e=>e!==t)),this}removeAllListeners(e){return e?delete this.eventListeners[e]:this.eventListeners=Object.create(null),this}emit(e,t){if(e in this.eventListeners){let n=this.eventListeners[e];for(let e of n)e(t);return!0}return!1}listenerCount(e){return e in this.eventListeners?this.eventListeners[e].length:0}prependListener(e,t){return e in this.eventListeners?this.eventListeners[e].unshift(t):this.eventListeners[e]=[t],this}prependOnceListener(e,t){let n=r=>{this.removeListener(e,n),t(r)};return this.prependListener(e,n)}},r=class{constructor(e){this.pid=e}async write(t){await e(`plugin:shell|stdin_write`,{pid:this.pid,buffer:t})}async kill(){await e(`plugin:shell|kill`,{cmd:`killChild`,pid:this.pid})}},i=class i extends n{constructor(e,t=[],r){super(),this.stdout=new n,this.stderr=new n,this.program=e,this.args=typeof t==`string`?[t]:t,this.options=r??{}}static create(e,t=[],n){return new i(e,t,n)}static sidecar(e,t=[],n){let r=new i(e,t,n);return r.options.sidecar=!0,r}async spawn(){let n=this.program,i=this.args,a=this.options;typeof i==`object`&&Object.freeze(i);let o=new t;return o.onmessage=e=>{switch(e.event){case`Error`:this.emit(`error`,e.payload);break;case`Terminated`:this.emit(`close`,e.payload);break;case`Stdout`:this.stdout.emit(`data`,e.payload);break;case`Stderr`:this.stderr.emit(`data`,e.payload);break}},await e(`plugin:shell|spawn`,{program:n,args:i,options:a,onEvent:o}).then(e=>new r(e))}async execute(){let t=this.program,n=this.args,r=this.options;return typeof n==`object`&&Object.freeze(n),await e(`plugin:shell|execute`,{program:t,args:n,options:r})}};async function a(t,n){await e(`plugin:shell|open`,{path:t,with:n})}export{r as Child,i as Command,n as EventEmitter,a as open};
@@ -1 +1 @@
1
- import{i as e}from"./index-CEunZ8kJ.js";function t(e){if(e!==void 0){if(typeof e==`string`)return e;if(`ok`in e&&`cancel`in e)return{OkCancelCustom:[e.ok,e.cancel]};if(`yes`in e&&`no`in e&&`cancel`in e)return{YesNoCancelCustom:[e.yes,e.no,e.cancel]};if(`ok`in e)return{OkCustom:e.ok}}}async function n(t={}){return typeof t==`object`&&Object.freeze(t),await e(`plugin:dialog|open`,{options:t})}async function r(t={}){return typeof t==`object`&&Object.freeze(t),await e(`plugin:dialog|save`,{options:t})}async function i(n,r){return await e(`plugin:dialog|message`,{message:n,title:r?.title,kind:r?.kind,buttons:t(r?.buttons)})}async function a(e,t){let n=typeof t==`string`?{title:t}:t;return n&&!n.buttons&&n.okLabel&&(n.buttons={ok:n.okLabel}),i(e,n)}async function o(e,t){let n=typeof t==`string`?{title:t}:t,r=n?.okLabel||n?.cancelLabel,a=n?.okLabel??`Yes`;return await i(e,{title:n?.title,kind:n?.kind,buttons:r?{ok:a,cancel:n.cancelLabel??`No`}:`YesNo`})===a}async function s(e,t){let n=typeof t==`string`?{title:t}:t,r=n?.okLabel||n?.cancelLabel,a=n?.okLabel??`Ok`;return await i(e,{title:n?.title,kind:n?.kind,buttons:r?{ok:a,cancel:n.cancelLabel??`Cancel`}:`OkCancel`})===a}export{o as ask,s as confirm,a as message,n as open,r as save};
1
+ import{i as e}from"./index-meTWPBzY.js";function t(e){if(e!==void 0){if(typeof e==`string`)return e;if(`ok`in e&&`cancel`in e)return{OkCancelCustom:[e.ok,e.cancel]};if(`yes`in e&&`no`in e&&`cancel`in e)return{YesNoCancelCustom:[e.yes,e.no,e.cancel]};if(`ok`in e)return{OkCustom:e.ok}}}async function n(t={}){return typeof t==`object`&&Object.freeze(t),await e(`plugin:dialog|open`,{options:t})}async function r(t={}){return typeof t==`object`&&Object.freeze(t),await e(`plugin:dialog|save`,{options:t})}async function i(n,r){return await e(`plugin:dialog|message`,{message:n,title:r?.title,kind:r?.kind,buttons:t(r?.buttons)})}async function a(e,t){let n=typeof t==`string`?{title:t}:t;return n&&!n.buttons&&n.okLabel&&(n.buttons={ok:n.okLabel}),i(e,n)}async function o(e,t){let n=typeof t==`string`?{title:t}:t,r=n?.okLabel||n?.cancelLabel,a=n?.okLabel??`Yes`;return await i(e,{title:n?.title,kind:n?.kind,buttons:r?{ok:a,cancel:n.cancelLabel??`No`}:`YesNo`})===a}async function s(e,t){let n=typeof t==`string`?{title:t}:t,r=n?.okLabel||n?.cancelLabel,a=n?.okLabel??`Ok`;return await i(e,{title:n?.title,kind:n?.kind,buttons:r?{ok:a,cancel:n.cancelLabel??`Cancel`}:`OkCancel`})===a}export{o as ask,s as confirm,a as message,n as open,r as save};