@jpkme/diff-review 0.1.10 → 0.1.13

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 (159) hide show
  1. package/README.md +38 -15
  2. package/bin/diff-review.mjs +151 -34
  3. package/lib/acp-policy.mjs +223 -0
  4. package/lib/acp-policy.test.mjs +136 -0
  5. package/lib/acp-shell.mjs +409 -0
  6. package/lib/acp-shell.test.mjs +158 -0
  7. package/lib/acp.mjs +368 -0
  8. package/lib/acp.test.mjs +58 -0
  9. package/lib/agent-login.mjs +105 -0
  10. package/lib/agents.mjs +87 -14
  11. package/lib/agents.test.mjs +4 -6
  12. package/lib/check-report.mjs +30 -11
  13. package/lib/check-report.test.mjs +1 -0
  14. package/lib/extract-cache.test.mjs +162 -0
  15. package/lib/extract.mjs +197 -1
  16. package/lib/model-label.mjs +263 -0
  17. package/lib/model-label.test.mjs +77 -0
  18. package/lib/models-cache.mjs +75 -0
  19. package/lib/models-cache.test.mjs +50 -0
  20. package/lib/output-name.mjs +8 -0
  21. package/lib/prompt.mjs +168 -22
  22. package/lib/review-dir.mjs +108 -0
  23. package/lib/review-meta.mjs +5 -3
  24. package/lib/review-meta.test.mjs +11 -0
  25. package/lib/review-prep.mjs +63 -0
  26. package/lib/validate.mjs +2 -2
  27. package/lib/wait-output.mjs +46 -23
  28. package/lib/wait-output.test.mjs +24 -1
  29. package/package.json +3 -1
  30. package/web/build/client/_app/immutable/assets/{0.CLQiq3Ed.css → 0.BKRG1f36.css} +1 -1
  31. package/web/build/client/_app/immutable/assets/0.BKRG1f36.css.br +0 -0
  32. package/web/build/client/_app/immutable/assets/{0.CLQiq3Ed.css.gz → 0.BKRG1f36.css.gz} +0 -0
  33. package/web/build/client/_app/immutable/assets/2.tqrMRTM0.css +1 -0
  34. package/web/build/client/_app/immutable/assets/2.tqrMRTM0.css.br +0 -0
  35. package/web/build/client/_app/immutable/assets/2.tqrMRTM0.css.gz +0 -0
  36. package/web/build/client/_app/immutable/assets/3.BT54aVKb.css +1 -0
  37. package/web/build/client/_app/immutable/assets/3.BT54aVKb.css.br +0 -0
  38. package/web/build/client/_app/immutable/assets/3.BT54aVKb.css.gz +0 -0
  39. package/web/build/client/_app/immutable/assets/storage.DqYH0w6R.css +1 -0
  40. package/web/build/client/_app/immutable/assets/storage.DqYH0w6R.css.br +0 -0
  41. package/web/build/client/_app/immutable/assets/storage.DqYH0w6R.css.gz +0 -0
  42. package/web/build/client/_app/immutable/chunks/BXUWMim4.js +213 -0
  43. package/web/build/client/_app/immutable/chunks/BXUWMim4.js.br +0 -0
  44. package/web/build/client/_app/immutable/chunks/BXUWMim4.js.gz +0 -0
  45. package/web/build/client/_app/immutable/chunks/Bu1mm6Oz.js +1 -0
  46. package/web/build/client/_app/immutable/chunks/Bu1mm6Oz.js.br +0 -0
  47. package/web/build/client/_app/immutable/chunks/Bu1mm6Oz.js.gz +0 -0
  48. package/web/build/client/_app/immutable/chunks/D8WOD_eS.js +3 -0
  49. package/web/build/client/_app/immutable/chunks/D8WOD_eS.js.br +0 -0
  50. package/web/build/client/_app/immutable/chunks/D8WOD_eS.js.gz +0 -0
  51. package/web/build/client/_app/immutable/chunks/{BBWAo_yW.js → DPfXzQnm.js} +2 -2
  52. package/web/build/client/_app/immutable/chunks/DPfXzQnm.js.br +0 -0
  53. package/web/build/client/_app/immutable/chunks/DPfXzQnm.js.gz +0 -0
  54. package/web/build/client/_app/immutable/chunks/lUYXRDtZ.js +1 -0
  55. package/web/build/client/_app/immutable/chunks/lUYXRDtZ.js.br +0 -0
  56. package/web/build/client/_app/immutable/chunks/lUYXRDtZ.js.gz +0 -0
  57. package/web/build/client/_app/immutable/entry/app.CTgiuiU1.js +2 -0
  58. package/web/build/client/_app/immutable/entry/app.CTgiuiU1.js.br +0 -0
  59. package/web/build/client/_app/immutable/entry/app.CTgiuiU1.js.gz +0 -0
  60. package/web/build/client/_app/immutable/entry/start.CFSl0kht.js +1 -0
  61. package/web/build/client/_app/immutable/entry/start.CFSl0kht.js.br +0 -0
  62. package/web/build/client/_app/immutable/entry/start.CFSl0kht.js.gz +0 -0
  63. package/web/build/client/_app/immutable/nodes/0.Dj97JW46.js +1 -0
  64. package/web/build/client/_app/immutable/nodes/0.Dj97JW46.js.br +0 -0
  65. package/web/build/client/_app/immutable/nodes/0.Dj97JW46.js.gz +0 -0
  66. package/web/build/client/_app/immutable/nodes/1.0PQZpSbJ.js +1 -0
  67. package/web/build/client/_app/immutable/nodes/1.0PQZpSbJ.js.br +2 -0
  68. package/web/build/client/_app/immutable/nodes/1.0PQZpSbJ.js.gz +0 -0
  69. package/web/build/client/_app/immutable/nodes/2.DQaoQoy4.js +10 -0
  70. package/web/build/client/_app/immutable/nodes/2.DQaoQoy4.js.br +0 -0
  71. package/web/build/client/_app/immutable/nodes/2.DQaoQoy4.js.gz +0 -0
  72. package/web/build/client/_app/immutable/nodes/3.AciugOtL.js +171 -0
  73. package/web/build/client/_app/immutable/nodes/3.AciugOtL.js.br +0 -0
  74. package/web/build/client/_app/immutable/nodes/3.AciugOtL.js.gz +0 -0
  75. package/web/build/client/_app/version.json +1 -1
  76. package/web/build/client/_app/version.json.br +0 -0
  77. package/web/build/client/_app/version.json.gz +0 -0
  78. package/web/build/handler.js +3 -3
  79. package/web/build/index.js +3 -3
  80. package/web/build/server/chunks/0-DUStDOsr.js +11 -0
  81. package/web/build/server/chunks/{0-SseDy__O.js.map → 0-DUStDOsr.js.map} +1 -1
  82. package/web/build/server/chunks/1-C2qlInYk.js +7 -0
  83. package/web/build/server/chunks/1-C2qlInYk.js.map +1 -0
  84. package/web/build/server/chunks/2-DyE177MK.js +7 -0
  85. package/web/build/server/chunks/2-DyE177MK.js.map +1 -0
  86. package/web/build/server/chunks/3-SO3atuWO.js +7 -0
  87. package/web/build/server/chunks/3-SO3atuWO.js.map +1 -0
  88. package/web/build/server/chunks/_server.ts-CRNhzL2a.js +62 -0
  89. package/web/build/server/chunks/_server.ts-CRNhzL2a.js.map +1 -0
  90. package/web/build/server/chunks/agent-sessions-kcUaLhK5.js +2819 -0
  91. package/web/build/server/chunks/agent-sessions-kcUaLhK5.js.map +1 -0
  92. package/web/build/server/chunks/{remote-1g4ayag-B67QMR_2.js → git-review-CXKcjYgZ.js} +70 -704
  93. package/web/build/server/chunks/git-review-CXKcjYgZ.js.map +1 -0
  94. package/web/build/server/chunks/{handler-B5P65tLk.js → handler-_E0NucKN.js} +3 -3
  95. package/web/build/server/chunks/{handler-B5P65tLk.js.map → handler-_E0NucKN.js.map} +1 -1
  96. package/web/build/server/chunks/hooks.server-D7yPODoc.js +42 -0
  97. package/web/build/server/chunks/hooks.server-D7yPODoc.js.map +1 -0
  98. package/web/build/server/chunks/{index.js-CL95e0Gl.js → index.js-lMtDM8ZQ.js} +3 -5
  99. package/web/build/server/chunks/index.js-lMtDM8ZQ.js.map +1 -0
  100. package/web/build/server/chunks/manifest.js-BIm6jot5.js +58 -0
  101. package/web/build/server/chunks/manifest.js-BIm6jot5.js.map +1 -0
  102. package/web/build/server/chunks/remote-1g4ayag-DmqxwUIz.js +144 -0
  103. package/web/build/server/chunks/remote-1g4ayag-DmqxwUIz.js.map +1 -0
  104. package/web/build/server/chunks/remote-wh6t6j-DZk0W9Pp.js +162 -0
  105. package/web/build/server/chunks/remote-wh6t6j-DZk0W9Pp.js.map +1 -0
  106. package/web/build/server/chunks/validate-BsTKyhsq.js +1073 -0
  107. package/web/build/server/chunks/validate-BsTKyhsq.js.map +1 -0
  108. package/web/build/client/_app/immutable/assets/0.CLQiq3Ed.css.br +0 -0
  109. package/web/build/client/_app/immutable/assets/2.CNFDEnjx.css +0 -1
  110. package/web/build/client/_app/immutable/assets/2.CNFDEnjx.css.br +0 -0
  111. package/web/build/client/_app/immutable/assets/2.CNFDEnjx.css.gz +0 -0
  112. package/web/build/client/_app/immutable/assets/3.PHTPLlZ7.css +0 -1
  113. package/web/build/client/_app/immutable/assets/3.PHTPLlZ7.css.br +0 -0
  114. package/web/build/client/_app/immutable/assets/3.PHTPLlZ7.css.gz +0 -0
  115. package/web/build/client/_app/immutable/assets/ThemeToggle.DcT79vPK.css +0 -1
  116. package/web/build/client/_app/immutable/assets/ThemeToggle.DcT79vPK.css.br +0 -0
  117. package/web/build/client/_app/immutable/assets/ThemeToggle.DcT79vPK.css.gz +0 -0
  118. package/web/build/client/_app/immutable/chunks/BBWAo_yW.js.br +0 -0
  119. package/web/build/client/_app/immutable/chunks/BBWAo_yW.js.gz +0 -0
  120. package/web/build/client/_app/immutable/chunks/Dur-vdUf.js +0 -3
  121. package/web/build/client/_app/immutable/chunks/Dur-vdUf.js.br +0 -0
  122. package/web/build/client/_app/immutable/chunks/Dur-vdUf.js.gz +0 -0
  123. package/web/build/client/_app/immutable/chunks/QdZF3nkf.js +0 -176
  124. package/web/build/client/_app/immutable/chunks/QdZF3nkf.js.br +0 -0
  125. package/web/build/client/_app/immutable/chunks/QdZF3nkf.js.gz +0 -0
  126. package/web/build/client/_app/immutable/chunks/tYeNsyIK.js +0 -1
  127. package/web/build/client/_app/immutable/chunks/tYeNsyIK.js.br +0 -0
  128. package/web/build/client/_app/immutable/chunks/tYeNsyIK.js.gz +0 -0
  129. package/web/build/client/_app/immutable/entry/app.Dce6uJU3.js +0 -2
  130. package/web/build/client/_app/immutable/entry/app.Dce6uJU3.js.br +0 -0
  131. package/web/build/client/_app/immutable/entry/app.Dce6uJU3.js.gz +0 -0
  132. package/web/build/client/_app/immutable/entry/start.DnBSC38l.js +0 -1
  133. package/web/build/client/_app/immutable/entry/start.DnBSC38l.js.br +0 -0
  134. package/web/build/client/_app/immutable/entry/start.DnBSC38l.js.gz +0 -0
  135. package/web/build/client/_app/immutable/nodes/0.s5xmjXoS.js +0 -1
  136. package/web/build/client/_app/immutable/nodes/0.s5xmjXoS.js.br +0 -1
  137. package/web/build/client/_app/immutable/nodes/0.s5xmjXoS.js.gz +0 -0
  138. package/web/build/client/_app/immutable/nodes/1.5Iv4ssDT.js +0 -1
  139. package/web/build/client/_app/immutable/nodes/1.5Iv4ssDT.js.br +0 -0
  140. package/web/build/client/_app/immutable/nodes/1.5Iv4ssDT.js.gz +0 -0
  141. package/web/build/client/_app/immutable/nodes/2.BomzYVBF.js +0 -66
  142. package/web/build/client/_app/immutable/nodes/2.BomzYVBF.js.br +0 -0
  143. package/web/build/client/_app/immutable/nodes/2.BomzYVBF.js.gz +0 -0
  144. package/web/build/client/_app/immutable/nodes/3.CeUs4lBX.js +0 -170
  145. package/web/build/client/_app/immutable/nodes/3.CeUs4lBX.js.br +0 -0
  146. package/web/build/client/_app/immutable/nodes/3.CeUs4lBX.js.gz +0 -0
  147. package/web/build/server/chunks/0-SseDy__O.js +0 -11
  148. package/web/build/server/chunks/1-2OO2bb7H.js +0 -7
  149. package/web/build/server/chunks/1-2OO2bb7H.js.map +0 -1
  150. package/web/build/server/chunks/2-BJvuqKN6.js +0 -7
  151. package/web/build/server/chunks/2-BJvuqKN6.js.map +0 -1
  152. package/web/build/server/chunks/3-ZIl1rHef.js +0 -7
  153. package/web/build/server/chunks/3-ZIl1rHef.js.map +0 -1
  154. package/web/build/server/chunks/hooks.server-DERFlOe1.js +0 -14
  155. package/web/build/server/chunks/hooks.server-DERFlOe1.js.map +0 -1
  156. package/web/build/server/chunks/index.js-CL95e0Gl.js.map +0 -1
  157. package/web/build/server/chunks/manifest.js-uD_a0079.js +0 -50
  158. package/web/build/server/chunks/manifest.js-uD_a0079.js.map +0 -1
  159. package/web/build/server/chunks/remote-1g4ayag-B67QMR_2.js.map +0 -1
@@ -1 +0,0 @@
1
- import{rt as e}from"./Dur-vdUf.js";typeof window<`u`&&((window.__svelte??={}).v??=new Set).add(`5`),e();
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.s5xmjXoS.js","../chunks/Dur-vdUf.js","../chunks/tYeNsyIK.js","../chunks/BZfQ9INH.js","../assets/0.CLQiq3Ed.css","../nodes/1.5Iv4ssDT.js","../chunks/BBWAo_yW.js","../nodes/2.BomzYVBF.js","../chunks/QdZF3nkf.js","../assets/ThemeToggle.DcT79vPK.css","../assets/2.CNFDEnjx.css","../nodes/3.CeUs4lBX.js","../assets/3.PHTPLlZ7.css"])))=>i.map(i=>d[i]);
2
- import{A as e,C as t,E as n,G as r,H as i,I as a,K as o,L as s,M as c,R as l,S as u,U as d,V as f,Y as p,a as m,at as h,b as g,et as _,h as v,i as y,n as b,r as x,tt as S,w as C,x as w}from"../chunks/Dur-vdUf.js";import"../chunks/tYeNsyIK.js";var T=`modulepreload`,E=function(e,t){return new URL(e,t).href},D={},O=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=E(t,n),t=s(t),t in D)return;D[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:T,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},k={},A=C(`<div id="svelte-announcer" aria-live="assertive" aria-atomic="true" style="position: absolute; left: 0; top: 0; clip: rect(0 0 0 0); clip-path: inset(50%); overflow: hidden; white-space: nowrap; width: 1px; height: 1px"><!></div>`),j=C(`<!> <!>`,1);function M(x,C){S(C,!0);let T=y(C,`components`,23,()=>[]),E=y(C,`data_0`,3,null),D=y(C,`data_1`,3,null);l(()=>C.stores.page.set(C.page)),s(()=>{C.stores,C.page,C.constructors,T(),C.form,E(),D(),C.stores.page.notify()});let O=o(!1),k=o(!1),M=o(null);b(()=>{let t=C.stores.page.subscribe(()=>{e(O)&&(r(k,!0),c().then(()=>{r(M,document.title||`untitled page`,!0)}))});return r(O,!0),t});let N=p(()=>C.constructors[1]);var P=j(),F=i(P),I=n=>{let r=p(()=>C.constructors[0]);var a=t();v(i(a),()=>e(r),(n,r)=>{m(r(n,{get data(){return E()},get form(){return C.form},get params(){return C.page.params},children:(n,r)=>{var a=t();v(i(a),()=>e(N),(e,t)=>{m(t(e,{get data(){return D()},get form(){return C.form},get params(){return C.page.params}}),e=>T()[1]=e,()=>T()?.[1])}),u(n,a)},$$slots:{default:!0}}),e=>T()[0]=e,()=>T()?.[0])}),u(n,a)},L=n=>{let r=p(()=>C.constructors[0]);var a=t();v(i(a),()=>e(r),(e,t)=>{m(t(e,{get data(){return E()},get form(){return C.form},get params(){return C.page.params}}),e=>T()[0]=e,()=>T()?.[0])}),u(n,a)};g(F,e=>{C.constructors[1]?e(I):e(L,-1)});var R=d(F,2),z=t=>{var r=A(),i=f(r),o=t=>{var r=n();a(()=>w(r,e(M))),u(t,r)};g(i,t=>{e(k)&&t(o)}),h(r),u(t,r)};g(R,t=>{e(O)&&t(z)}),u(x,P),_()}var N=x(M),P=[()=>O(()=>import(`../nodes/0.s5xmjXoS.js`),__vite__mapDeps([0,1,2,3,4]),import.meta.url),()=>O(()=>import(`../nodes/1.5Iv4ssDT.js`),__vite__mapDeps([5,1,6,2]),import.meta.url),()=>O(()=>import(`../nodes/2.BomzYVBF.js`),__vite__mapDeps([7,1,6,8,2,3,9,10]),import.meta.url),()=>O(()=>import(`../nodes/3.CeUs4lBX.js`),__vite__mapDeps([11,1,6,8,2,3,9,12]),import.meta.url)],F=[],I={"/":[2],"/report/[id]":[3]},L={handleError:(({error:e})=>{console.error(e)}),reroute:(()=>{}),transport:{}},R=Object.fromEntries(Object.entries(L.transport).map(([e,t])=>[e,t.decode])),z=Object.fromEntries(Object.entries(L.transport).map(([e,t])=>[e,t.encode])),B=!1,V=(e,t)=>R[e](t),H=()=>O(()=>import(`../chunks/Bjy-W4x2.js`).then(e=>e.default),[],import.meta.url);export{V as decode,R as decoders,I as dictionary,z as encoders,H as get_error_template,B as hash,L as hooks,k as matchers,P as nodes,N as root,F as server_loads};
@@ -1 +0,0 @@
1
- import{s as e,y as t}from"../chunks/BBWAo_yW.js";export{t as load_css,e as start};
@@ -1 +0,0 @@
1
- import{C as e,D as t,H as n,I as r,O as i,P as a,S as o,U as s,V as c,X as l,at as u,et as d,g as f,m as p,n as m,st as h,tt as g,ut as _,w as v,x as y,z as b}from"../chunks/Dur-vdUf.js";import"../chunks/tYeNsyIK.js";import{n as x,t as S}from"../chunks/BZfQ9INH.js";var C=_({ssr:()=>!1}),w=v(`<div class="boot svelte-12qhfyh">Cargando…</div>`),T=v(`<div class="boot svelte-12qhfyh"><p> </p> <button type="button" class="svelte-12qhfyh">Reintentar</button></div>`);function E(t,_){g(_,!0),m(()=>{S(x())});var v=e();p(`12qhfyh`,e=>{a(()=>{b.title=`diff-review`})}),l(n(v),{pending:e=>{o(e,w())},failed:(e,t=h,n=h)=>{var a=T(),l=c(a),d=c(l,!0);u(l);var f=s(l,2);u(a),r(e=>y(d,e),[()=>t()instanceof Error?t().message:String(t())]),i(`click`,f,function(...e){n()?.apply(this,e)}),o(e,a)}},t=>{var r=e();f(n(r),()=>_.children),o(t,r)}),o(t,v),d()}t([`click`]);export{E as component,C as universal};
@@ -1 +0,0 @@
1
- } �����lyg�T�:�ֶ�t��FN�o���� дYz�����z���8��1V�ƹ��\��a좆(u���p��@Б�v��92�p���3���\�BNB�-6�K!F"*�T��Ccږ��I(T�5��[���d2�9y��Q�� �YN<5Z7�n��]ܨ���l�V���*2>�����L���:�Z�� 3���d�M��T���"ud파�$O���ߋ/hf����X�W��ㆌ��>���<%����c��
@@ -1 +0,0 @@
1
- import{H as e,I as t,S as n,U as r,V as i,at as a,et as o,tt as s,w as c,x as l}from"../chunks/Dur-vdUf.js";import{l as u}from"../chunks/BBWAo_yW.js";import"../chunks/tYeNsyIK.js";var d={get data(){return u.data},get error(){return u.error},get form(){return u.form},get params(){return u.params},get route(){return u.route},get state(){return u.state},get status(){return u.status},get url(){return u.url}},f=c(`<h1> </h1> <p> </p>`,1);function p(c,u){s(u,!0);var p=f(),m=e(p),h=i(m,!0);a(m);var g=r(m,2),_=i(g,!0);a(g),t(()=>{l(h,d.status),l(_,d.error?.message)}),n(c,p),o()}export{p as component};
@@ -1,66 +0,0 @@
1
- import{A as e,B as t,D as n,E as r,G as i,H as a,I as o,K as s,O as c,S as l,U as u,V as d,W as f,Y as p,Z as ee,a as m,at as h,b as g,c as _,d as v,et as y,f as b,it as x,k as S,l as te,n as ne,o as re,s as C,tt as ie,u as ae,v as w,w as T,x as E}from"../chunks/Dur-vdUf.js";import{n as oe,o as se,x as ce}from"../chunks/BBWAo_yW.js";import{A as le,M as ue,N as de,O as fe,S as pe,T as me,_ as he,a as ge,b as _e,c as ve,f as ye,g as be,h as xe,j as Se,m as Ce,n as we,p as Te,r as Ee,s as De,t as Oe,u as ke,v as Ae,w as je,x as Me,y as Ne,z as D}from"../chunks/QdZF3nkf.js";import"../chunks/tYeNsyIK.js";function Pe(e){let t=String(e||``).replace(/\\/g,`/`);t.includes(`/`)||(t=`**/${t}`);let n=``;for(let e=0;e<t.length;e++){let r=t[e];r===`*`&&t[e+1]===`*`?t[e+2]===`/`?(n+=`(?:.*/)?`,e+=2):(n+=`.*`,e+=1):r===`*`?n+=`[^/]*`:r===`?`?n+=`[^/]`:`+()[]{}|.^$`.includes(r)?n+=`\\${r}`:n+=r}return RegExp(`^${n}$`)}function Fe(e){let t=e.files??[];if(!t.length)return[];let n=new Set((e.blocks??[]).map(e=>e.file)),r=(e.skipped??[]).map(e=>Pe(e.file));return t.map(e=>e.path).filter(e=>!n.has(e)&&!r.some(t=>t.test(e))).sort((e,t)=>e.localeCompare(t))}var Ie={intent:`Habilita el flujo DEBIN de vendedor mediante POST de pre-órdenes y diferencia comprador (PAGO_DEBIN) de vendedor (GENERAR_DEBIN) usando rol en consultas. Reorganiza DTOs Shared/Internal, agrega retry con Polly para el cliente HTTP de Bantotal y expone el endpoint de pre-órdenes con MediatR.`,groups:[{id:`g1`,kind:`feat`,title:`vendedor: flujo PostPreOrden end-to-end`,intent:`Nuevo endpoint que recibe la pre-orden del vendedor y la despacha vía MediatR hacia aprobaciones.`},{id:`g2`,kind:`feat`,title:`rol: distingue operaciones comprador/vendedor`,intent:`GetTransactionType ahora resuelve el tipo según el rol para no mezclar PAGO_DEBIN con GENERAR_DEBIN.`},{id:`g3`,kind:`infra`,title:`bantotal: retry con Polly para HttpClient`,intent:`Agrega política de reintentos con backoff para llamadas transitorias, evitando reintentar POST no idempotentes.`},{id:`g4`,kind:`chore`,title:`release: configuración por rol y limpieza de constantes`,intent:`Ajusta config y remueve una constante de moneda duplicada.`}],blocks:[{id:`b1`,group:`g1`,file:`Core/Controllers/V1/PreOrdenesController.cs`,lines:`L1-33`,side:`new`,start:1,end:33,op:`add`,what:`Nuevo controller POST que envía PostPreOrdenRequest via MediatR y retorna 200.`,why:`Expone el endpoint api/v1.0/pre-ordenes para el flujo vendedor hacia aprobaciones.`,source:`code`},{id:`b2`,group:`g2`,file:`Core/Application/Validators/GetOrdenRequestValidator.cs`,lines:`L17-18`,side:`new`,start:17,end:18,op:`mod`,what:`RuleFor Rol con MustBeValidRole y RolesConstants.RolesValidos.`,why:`Evitar consultas con rol inválido que rompen GetTransactionType.`,source:`code`},{id:`b3`,group:`g3`,file:`Core/Infra/PollyPolicyBuilder.cs`,lines:`L18-25`,side:`new`,start:18,end:25,op:`mod`,what:`GetPolicy corta a NoOp si el request es POST.`,why:`Evita reintentar operaciones no idempotentes contra Bantotal.`,source:`code`},{id:`b4`,group:`g4`,file:`Core/Constants/MonedasConstants.cs`,lines:`L20-27`,side:`old`,start:20,end:27,op:`del`,what:`Borra _divisaBantotal, mapeo duplicado de _bantotalDivisa.`,why:`Las dos constantes mapeaban el mismo código de moneda.`,source:`code`}],findings:[{id:`f1`,class:`risk`,severity:`high`,blocking:!0,kind:`bug`,file:`Core/Application/Validators/GetOrdenRequestValidator.cs`,line:17,block:`b2`,what:`MustBeValidRole no cubre "ADMIN", usado en 3 callers del área de soporte.`,fix:`Agregar "ADMIN" a RolesConstants.RolesValidos o documentar que ya no se soporta.`},{id:`f2`,class:`risk`,severity:`high`,blocking:!0,kind:`race`,file:`Core/Controllers/V1/PreOrdenesController.cs`,line:28,block:`b1`,what:`Dos POST concurrentes de la misma orden no se deduplican: pueden crear dos registros.`,fix:`Índice único por IdDebin+tipo o lock/upsert antes de persistir.`},{id:`f3`,class:`quality`,severity:`med`,blocking:!1,kind:`perf`,file:`Core/Infra/PollyPolicyBuilder.cs`,line:20,block:`b3`,what:`El chequeo de POST se hace antes de resolver la policy real; también aplica NoOp a PUT/PATCH que sí son idempotentes.`,fix:`Ampliar la condición a POST estrictamente, no a todo lo no-GET.`},{id:`f4`,class:`quality`,severity:`low`,blocking:!1,kind:`maintainability`,file:`Core/Constants/MonedasConstants.cs`,line:20,block:`b4`,what:`Se borra _divisaBantotal pero queda un comentario que todavía lo referencia.`,fix:`Actualizar el comentario de la clase.`},{id:`f5`,class:`risk`,severity:`med`,blocking:!1,kind:`missing-test`,file:`Core/Controllers/V1/PreOrdenesController.cs`,line:null,block:``,what:`No hay test que cubra el POST con IdDebin repetido.`,fix:`Agregar test de integración para el caso de duplicado.`},{id:`f6`,class:`quality`,severity:`nit`,blocking:!1,kind:`docs`,file:`Core/Application/Validators/GetOrdenRequestValidator.cs`,line:null,block:``,what:`El validador no documenta qué roles son válidos en el summary.`,fix:`Sumar un comentario con la lista de roles esperados.`}],skipped:[{file:`Core/MsObeAprobacionDebin.Application.csproj`,reason:`generated`},{file:`package-lock.json`,reason:`lockfile`}],files:[{path:`Core/Controllers/V1/PreOrdenesController.cs`,changeType:`added`,group:`g1`,diff:`@@ -0,0 +1,33 @@
2
- +using MediatR;
3
- +using Microsoft.AspNetCore.Http;
4
- +using Microsoft.AspNetCore.Mvc;
5
- +using MsObeAprobacionDebin.Application.Dtos.PostPreOrden.Input;
6
- +using MsObeAprobacionDebin.Application.Dtos.PostPreOrden.Output;
7
- +using MsObeAprobacionDebin.Application.Features.Vendedor.Commands;
8
- +using MsObeAprobacionDebin.Controllers.Base;
9
- +
10
- +namespace MsObeAprobacionDebin.Controllers.V1;
11
- +
12
- +[ApiController]
13
- +public class PreOrdenesController : BaseController
14
- +{
15
- + public PreOrdenesController(IMediator mediator) : base(mediator) { }
16
- +
17
- + [HttpPost]
18
- + [ProducesResponseType(typeof(PostPreOrdenResponse), StatusCodes.Status200OK)]
19
- + public async Task<IActionResult> PostPreOrdenAsync([FromBody] PostPreOrdenRequest postPreOrdenRequest)
20
- + {
21
- + var result = await Mediator.Send(new PostPreOrden(postPreOrdenRequest));
22
- + return Ok(result);
23
- + }
24
- +}`},{path:`Core/Application/Validators/GetOrdenRequestValidator.cs`,changeType:`modified`,group:`g2`,diff:`@@ -1,4 +1,6 @@
25
- using FluentValidation;
26
- +using MsObeAprobacionDebin.Application.Common;
27
- +using MsObeAprobacionDebin.Application.Constants;
28
- using MsObeAprobacionDebin.Application.Dtos.GetOrden.Input;
29
-
30
- namespace MsObeAprobacionDebin.Application.Validators;
31
- @@ -11,5 +13,8 @@ public class GetOrdenRequestValidator : AbstractValidator<GetOrdenRequest>
32
- RuleFor(o => o.IdDebin)
33
- .NotEmpty().WithMessage("El id de la orden de debin no puede estar nulo o vacío.");
34
-
35
- + RuleFor(o => o.Rol)
36
- + .MustBeValidRole($"El rol recibido no es válido. (Roles válidos: {string.Join(", ", RolesConstants.RolesValidos)})");
37
- +
38
- }
39
- }`},{path:`Core/Infra/PollyPolicyBuilder.cs`,changeType:`modified`,group:`g3`,diff:`@@ -16,7 +16,9 @@ namespace Bff.Obe.Pago.Servicios.Infrastructure
40
- public static class PollyPolicyBuilder
41
- {
42
- + public static IAsyncPolicy<HttpResponseMessage> GetPolicy(HttpRequestMessage request)
43
- + {
44
- + if (request.Method == HttpMethod.Post)
45
- + return Policy.NoOpAsync<HttpResponseMessage>();
46
- +
47
- + return BuildRetryPolicy();
48
- + }
49
-
50
- public static IAsyncPolicy<HttpResponseMessage> BuildRetryPolicy()
51
- {`},{path:`Core/Constants/MonedasConstants.cs`,changeType:`modified`,group:`g4`,diff:`@@ -18,12 +18,4 @@ public static class MonedasConstants
52
- public const string Ars = "ARS";
53
- public const string Usd = "USD";
54
-
55
- - // Duplicado histórico de _bantotalDivisa, mismo mapeo de código.
56
- - public static readonly Dictionary<int, string> _divisaBantotal = new()
57
- - {
58
- - { 32, Ars },
59
- - { 840, Usd }
60
- - };
61
- -
62
- public static readonly Dictionary<int, string> _bantotalDivisa = new()`}],notes:[`El diff completo tenía 162 archivos; este ejemplo incluye solo 4 para mostrar el viewer.`]};function Le(e){let t=[];if(!e||typeof e!=`object`)return[`El archivo no contiene un objeto JSON.`];let n=e;if((typeof n.intent!=`string`||!n.intent.trim())&&t.push(`Falta "intent" (string).`),Array.isArray(n.groups)?n.groups.forEach((e,n)=>{if(!e||typeof e!=`object`){t.push(`groups[${n}]: no es un objeto.`);return}for(let r of[`id`,`kind`,`title`,`intent`])(typeof e[r]!=`string`||!e[r])&&t.push(`groups[${n}]: falta "${r}".`)}):t.push(`Falta "groups" (array).`),Array.isArray(n.blocks)?n.blocks.forEach((e,n)=>{if(!e||typeof e!=`object`){t.push(`blocks[${n}]: no es un objeto.`);return}for(let r of[`id`,`group`,`file`,`op`,`what`,`why`])(typeof e[r]!=`string`||!e[r])&&t.push(`blocks[${n}]: falta "${r}".`)}):t.push(`Falta "blocks" (array).`),Array.isArray(n.findings)?n.findings.forEach((e,n)=>{if(!e||typeof e!=`object`){t.push(`findings[${n}]: no es un objeto.`);return}let r=e;for(let e of[`id`,`class`,`severity`,`kind`,`file`,`what`,`fix`])(typeof r[e]!=`string`||!r[e])&&t.push(`findings[${n}]: falta "${e}".`);typeof r.blocking!=`boolean`&&t.push(`findings[${n}]: "blocking" debe ser booleano.`)}):t.push(`Falta "findings" (array).`),n.files!=null&&!Array.isArray(n.files)&&t.push(`"files" debe ser un array.`),n.skipped!=null&&!Array.isArray(n.skipped)&&t.push(`"skipped" debe ser un array.`),n.notes!=null&&!Array.isArray(n.notes)&&t.push(`"notes" debe ser un array.`),n.meta==null||typeof n.meta!=`object`||Array.isArray(n.meta))t.push(`Falta "meta" (objeto con "agent" y "model").`);else{let e=n.meta;e.source!=null&&e.source!==`local`&&e.source!==`url`&&t.push(`meta.source debe ser "local" o "url".`);for(let n of[`agent`,`model`])(typeof e[n]!=`string`||!e[n].trim())&&t.push(`Falta meta.${n}.`);for(let n of[`repo`,`branch`,`base`,`remoteUrl`,`generatedAt`])e[n]!=null&&typeof e[n]!=`string`&&t.push(`meta.${n} debe ser string.`)}return t}var Re=T(`<div class="toast svelte-1uha8ag" role="status">Prompt copiado al portapapeles.</div>`),ze=T(`<div class="diff-backdrop svelte-1uha8ag"><div class="diff-modal svelte-1uha8ag" role="status" aria-live="polite" aria-busy="true"><div class="diff-spinner svelte-1uha8ag" aria-hidden="true"></div> <p class="svelte-1uha8ag">Calculando diff con git…</p></div></div>`),Be=T(`URL del remote (https / SSH). Al cargar se listan branches con <code class="svelte-1uha8ag">ls-remote</code>; al soltar el
63
- JSON se hace un clone shallow temporal para armar el diff. Requiere que el branch esté en el remote.`,1),Ve=T(`<p class="error-line svelte-1uha8ag"> </p>`),He=T(`<p class="ok-line svelte-1uha8ag"> </p>`),Ue=T(`<button type="button" class="svelte-1uha8ag"> </button>`),We=T(`<option> </option>`),Ge=T(`<select class="svelte-1uha8ag"></select>`),Ke=T(`<input type="text" placeholder="feature/PCM-14839" class="svelte-1uha8ag"/>`),qe=T(`<input type="text" placeholder="develop" class="svelte-1uha8ag"/>`),Je=T(`<p class="hint-text svelte-1uha8ag">Copiá esto en Claude, Cursor, Copilot o el agente que uses. El schema de salida va incluido.</p> <textarea class="svelte-1uha8ag"></textarea> <div class="actions svelte-1uha8ag"><button type="button" class="primary svelte-1uha8ag"> </button> <button type="button" class="ghost svelte-1uha8ag">Ver ejemplo</button></div>`,1),Ye=T(`<p class="hint-text svelte-1uha8ag">Necesita el skill instalado (abajo). El agente ya tiene guardadas las reglas y el schema de salida.</p> <div class="command-box svelte-1uha8ag"><code class="svelte-1uha8ag"> </code></div> <div class="actions svelte-1uha8ag"><button type="button" class="primary svelte-1uha8ag"> </button></div> <div class="skill-block svelte-1uha8ag"><h3 class="svelte-1uha8ag">¿No tenés el skill instalado?</h3> <p class="hint-text svelte-1uha8ag">Define /diff-review y /diff-review-fix. Descargalo e instalalo en la carpeta indicada.</p> <div class="skill-buttons svelte-1uha8ag"><button type="button" class="svelte-1uha8ag">Claude Code · .claude/commands/</button> <button type="button" class="svelte-1uha8ag">Cursor · .cursor/commands/</button> <button type="button" class="svelte-1uha8ag">Copilot · .github/prompts/</button></div></div>`,1),Xe=T(`<span>abriendo…</span>`),Ze=T(`<span>(se abre solo; podés hacer click si no)</span>`),Qe=T(`<span>(hacé click para abrirlo)</span>`),$e=T(`<p class="detect-banner svelte-1uha8ag">Listo: <button type="button" class="file-link svelte-1uha8ag"> </button> <!></p>`),et=T(`<p class="detect-banner svelte-1uha8ag">Encontré otro reporte: <button type="button" class="file-link svelte-1uha8ag"> </button></p>`),tt=T(`<p class="detect-wait svelte-1uha8ag">Esperando <code> </code> en la raíz del repo…</p>`),nt=T(`<p class="detect-wait svelte-1uha8ag">Detecté el JSON — abriendo reporte…</p>`),rt=T(`<li> </li>`),it=T(`<div class="coverage-box svelte-1uha8ag"><div class="coverage-head svelte-1uha8ag"><strong class="svelte-1uha8ag"> </strong> <span class="svelte-1uha8ag">no aparecen ni en "blocks" ni en "skipped"</span></div> <details><summary class="svelte-1uha8ag">Ver los archivos</summary> <ul class="coverage-list svelte-1uha8ag"></ul></details> <p class="hint-text svelte-1uha8ag">Pasale este prompt al mismo agente que corrió la review: tiene el diff en contexto y solo
64
- tiene que completar lo que falta. Después soltá de nuevo el <code class="svelte-1uha8ag"> </code>.</p> <textarea readonly="" rows="7" class="svelte-1uha8ag"></textarea> <div class="coverage-actions svelte-1uha8ag"><button type="button" class="primary svelte-1uha8ag"> </button> <button type="button" class="svelte-1uha8ag">Abrir igual</button></div></div>`),at=T(`<div class="drop-errors svelte-1uha8ag"><strong class="svelte-1uha8ag">No se pudo abrir el reporte:</strong> <ul class="svelte-1uha8ag"></ul></div>`),ot=T(`<span class="pill bad svelte-1uha8ag"> </span>`),st=T(`<span class="pill svelte-1uha8ag"> </span>`),ct=T(`<span class="prov-agent svelte-1uha8ag"> </span>`),lt=T(`<span class="prov-sep svelte-1uha8ag">·</span>`),ut=T(`<span class="prov-model svelte-1uha8ag"> </span>`),dt=T(`<span class="report-prov svelte-1uha8ag"><!> <!> <!></span>`),ft=T(`<p class="report-intent svelte-1uha8ag"> </p>`),pt=T(`<div class="report-menu svelte-1uha8ag" role="menu" tabindex="-1"><button type="button" class="menu-item danger svelte-1uha8ag" role="menuitem">Eliminar…</button></div>`),mt=T(`<li class="report-item svelte-1uha8ag"><a class="report-card svelte-1uha8ag"><span class="report-top svelte-1uha8ag"><strong class="svelte-1uha8ag"> </strong> <span class="when svelte-1uha8ag"> </span></span> <span class="report-meta svelte-1uha8ag"><span class="report-base svelte-1uha8ag"><span class="base-arrow svelte-1uha8ag" aria-hidden="true">→</span> </span> <span class="report-counts svelte-1uha8ag"><span class="pill svelte-1uha8ag"> </span> <!> <!></span></span> <!> <!></a> <div class="report-actions svelte-1uha8ag"><button type="button" class="kebab svelte-1uha8ag" title="Más acciones" aria-haspopup="menu"><svg viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"><circle cx="8" cy="3.5" r="1.25" fill="currentColor"></circle><circle cx="8" cy="8" r="1.25" fill="currentColor"></circle><circle cx="8" cy="12.5" r="1.25" fill="currentColor"></circle></svg></button> <!></div></li>`),ht=T(`<ul class="report-list svelte-1uha8ag"></ul>`),gt=T(`<p class="hint-text svelte-1uha8ag">Todavía no hay reportes. Generá un prompt, corré tu agente y soltá el JSON.</p>`),_t=T(`<div class="page svelte-1uha8ag"><!> <!> <header class="topbar svelte-1uha8ag"><a class="brand svelte-1uha8ag"><span class="brand-dot svelte-1uha8ag"></span> <span class="title-block svelte-1uha8ag"><span class="svelte-1uha8ag">diff-review</span> <small class="svelte-1uha8ag">generá un prompt, corré tu agente, soltá el resultado</small></span></a> <!></header> <div class="workspace svelte-1uha8ag"><section class="setup svelte-1uha8ag"><h2 class="svelte-1uha8ag">1. Contexto</h2> <div class="mode-toggle source-toggle svelte-1uha8ag"><button type="button">Carpeta local</button> <button type="button">URL remota</button></div> <p class="hint-text svelte-1uha8ag"><!></p> <!> <!> <div class="repo-setup svelte-1uha8ag"><label class="field repo-field svelte-1uha8ag"><span class="svelte-1uha8ag"> </span> <div class="repo-row svelte-1uha8ag"><input type="text" class="svelte-1uha8ag"/> <!> <button type="button" class="svelte-1uha8ag"> </button></div></label> <div class="row branches-row svelte-1uha8ag"><label class="field svelte-1uha8ag"><span class="svelte-1uha8ag">Branch a revisar</span> <!></label> <label class="field svelte-1uha8ag"><span class="svelte-1uha8ag">Base</span> <!></label></div></div> <div class="section-head svelte-1uha8ag"><h2 class="svelte-1uha8ag">2. Prompt</h2></div> <div class="mode-toggle svelte-1uha8ag"><button type="button">Prompt completo</button> <button type="button">Comando (skill)</button></div> <!> <h2 class="result-head svelte-1uha8ag">3. Resultado</h2> <p class="hint-text svelte-1uha8ag">Soltá acá el <code class="svelte-1uha8ag"> </code> que generó el agente. Si trae <code class="svelte-1uha8ag">meta</code>, se
65
- autocompletan repo y branches. <!></p> <!> <!> <div role="presentation"><p class="svelte-1uha8ag"><!></p> <button type="button" class="svelte-1uha8ag"> </button> <input type="file" accept="application/json,.json" class="visually-hidden svelte-1uha8ag"/></div> <!> <!></section> <aside class="reports-col svelte-1uha8ag"><h2 class="svelte-1uha8ag">Reportes recientes</h2> <!></aside></div></div>`);function O(n,T){ie(T,!0);function Pe(e){return typeof window>`u`?!1:new URL(window.location.href).searchParams.get(e)===`1`}let O=s(f({source:`local`,repo:``,branch:``,base:`develop`})),k=s(f(de({}))),A=s(``),j=s(!1),vt=s(!1),yt=s(!1),M=s(`full`),bt=s(!1),N=s(!1),P=s(f([])),F=s(null),I=s(f([])),xt=s(!1),St=s(f([])),L=s(null),Ct=s(null),R=s(f([])),z=s(``),B=s(!1),V=s(!1),H=s(!1),U=s(!1),W=s(f(Pe(`import`))),wt=s(f(Pe(`watch`))),Tt=!1,Et=s(``),Dt=s(null),G=s(null),K=s(!1),Ot=s(``),kt=0,At=p(()=>je(e(O))),q=p(()=>e(O).source===`local`&&Y(e(O).repo));ne(()=>{let t=Ee();i(O,t,!0),t.source===`local`&&Y(t.repo)&&i(Et,t.repo.trim(),!0);let n=new URL(window.location.href).searchParams,r=n.get(`import`)===`1`,a=n.get(`watch`)===`1`,o=n.get(`notify`)===`prompt`,s=n.get(`out`)?.trim();i(wt,a),r&&i(W,!0),s&&ue(s)&&i(k,s,!0),i(A,fe(e(O),{outputFilename:e(k)}),!0),i(St,ge(),!0),(r||a||o||s)&&jt(),Mt(t,{wantImport:r,wantWatch:a,wantNotify:o,keepOutName:!!(s&&ue(s))});let c=setInterval(()=>{Yt({auto:!0})},1500);return()=>clearInterval(c)});function jt(){let e=new URL(window.location.href);e.search&&(e.search=``,se(e,{}))}async function Mt(t,n){try{let e=await Te();if(e?.repo){let r=e.current&&e.current!==`HEAD`?e.current:e.branches[0]||``,a=e.branches.includes(t.base)?t.base:e.defaultBase;i(R,e.branches,!0),i(Et,e.repo,!0),J({source:`local`,repo:e.repo,branch:r,base:a,remoteUrl:e.remoteUrl||void 0}),n.keepOutName||await Nt()}else t.repo.trim()&&(Ht(t.repo,t.source),!n.keepOutName&&t.source===`local`&&await Nt())}catch{t.repo.trim()&&Ht(t.repo,t.source)}if(n.wantNotify&&It(e(A),e=>{i(vt,e,!0),i(yt,!0),setTimeout(()=>i(yt,!1),2800)}),n.wantImport)try{let e=await he();e?.payload?(e.filename&&i(k,e.filename,!0),await $t(e.payload)):Tt||i(W,!1)}catch{i(P,[`No se pudo importar el JSON pendiente del CLI.`],!0),i(W,!1)}n.wantWatch&&Yt({auto:!0})}async function Nt(){if(e(O).source!==`local`||!Y(e(O).repo)||!e(O).branch.trim()){i(k,de({}),!0),e(j)||i(A,fe(e(O),{outputFilename:e(k)}),!0);return}let t=++kt;try{let n=await be({repo:e(O).repo.trim(),branch:e(O).branch.trim(),base:e(O).base.trim()||`develop`});if(t!==kt)return;i(k,n.filename,!0),e(j)||i(A,fe(e(O),{outputFilename:e(k)}),!0)}catch{if(t!==kt)return;i(k,de({}),!0),e(j)||i(A,fe(e(O),{outputFilename:e(k)}),!0)}}function J(t){let n=e(O);i(O,{...e(O),...t},!0),e(O).source===`local`&&Y(e(O).repo)&&i(Et,e(O).repo.trim(),!0),De(e(O)),e(j)||i(A,fe(e(O),{outputFilename:e(k)}),!0),(n.repo!==e(O).repo||n.branch!==e(O).branch||n.base!==e(O).base||n.source!==e(O).source)&&e(O).source===`local`&&Nt()}function Pt(t){if(t===e(O).source)return;if(i(R,[],!0),i(z,``),t===`url`){Y(e(O).repo)&&i(Et,e(O).repo.trim(),!0);let n=(e(O).remoteUrl||``).trim()||(X(e(O).repo)?e(O).repo.trim():``);J({source:t,repo:n,...n?{remoteUrl:n}:{}});return}let n=e(Et)||(Y(e(O).repo)?e(O).repo.trim():``),r=(X(e(O).repo)?e(O).repo.trim():``)||(e(O).remoteUrl||``).trim();J({source:t,repo:n,...r?{remoteUrl:r}:{}})}function Ft(e){i(A,e.currentTarget.value,!0),i(j,!0)}function It(e,t){let n=()=>{t(!0),setTimeout(()=>t(!1),1600)};navigator.clipboard?.writeText?navigator.clipboard.writeText(e).then(n).catch(n):n()}function Lt(){It(e(A),e=>i(vt,e,!0))}function Rt(){It(me(e(O),e(I),{outputFilename:e(k)}),e=>i(xt,e,!0))}function zt(){It(e(At),e=>i(bt,e,!0))}function Bt(e){let t=le(e),n=new Blob([t],{type:`text/markdown`}),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=Se(e),i.click(),URL.revokeObjectURL(r)}function Y(e){return/[\\/]/.test(e)||/^[A-Za-z]:/.test(e)}function X(e){let t=e.trim();return t?!!(/^(https?:\/\/|git@|ssh:\/\/)/i.test(t)||/\.git$/i.test(t)&&!Y(t)):!1}function Z(e){if(!e)return`Error desconocido`;if(typeof e==`string`){try{let t=JSON.parse(e);if(typeof t?.message==`string`&&t.message.trim())return t.message}catch{}return e}if(typeof e==`object`){let t=e;if(typeof t.body?.message==`string`&&t.body.message.trim())return t.body.message;if(typeof t.message==`string`&&t.message.trim()){let e=t.message.trim();if(e.startsWith(`{`))try{let t=JSON.parse(e);if(typeof t?.message==`string`&&t.message.trim())return t.message}catch{}return e}}return String(e)}async function Vt(){if(!(e(V)||e(B))){i(V,!0),i(z,``);try{let e=await Ae(null);if(!e)return;J({source:`local`,repo:e}),await Ht(e,`local`)}catch(e){i(z,`No se pudo elegir la carpeta: `+Z(e))}finally{i(V,!1)}}}async function Ht(t=e(O).repo,n=e(O).source){let r=t.trim();if(!r){i(z,n===`url`?`Indicá la URL del repo.`:`Indicá la ruta absoluta del repo.`,!0);return}if(!e(B)){i(B,!0),i(z,``);try{let t=await xe({source:n,repo:r}),a=t.branches.includes(e(O).branch)?e(O).branch:t.current||t.branches[0]||``,o=t.branches.includes(e(O).base)?e(O).base:t.defaultBase;i(R,t.branches,!0),J({source:t.source,repo:t.repo,branch:a,base:o,remoteUrl:t.remoteUrl||(t.source===`url`?t.repo:e(O).remoteUrl)})}catch(e){i(R,[],!0),i(z,`No se pudo leer el repo: `+Z(e))}finally{i(B,!1)}}}function Ut(t){t.preventDefault(),e(N)||i(N,!0)}function Wt(e){e.preventDefault(),i(N,!1)}function Gt(t){if(t.preventDefault(),i(N,!1),e(U)||e(H)||e(K))return;let n=t.dataTransfer?.files?.[0];n&&Zt(n)}async function Kt(){if(!(e(U)||e(H)||e(K))){if(e(q)){i(H,!0),i(z,``);try{let t=await Ne({directory:e(O).repo.trim()});if(!t?.payload)return;t.filename&&i(k,t.filename,!0),await $t(t.payload)}catch(t){i(P,[`No se pudo abrir el archivo: `+Z(t)],!0),e(Dt)?.click()}finally{i(H,!1)}return}e(Dt)?.click()}}function qt(e){let t=e.currentTarget,n=t.files?.[0];n&&Zt(n),t.value=``}function Jt(e){return`${e.path}::${e.mtimeMs}`}async function Yt(t){if(!(!e(q)||e(U)||e(H)))try{let n=await ke({repo:e(O).repo.trim(),preferredName:e(k)});if(i(G,n,!0),!t.auto||!e(wt)||!n||e(K)||n.filename!==e(k)||Jt(n)===e(Ot))return;await Xt(n,{auto:!0})}catch{}}async function Xt(t,n){if(!(e(U)||e(K)||e(H))){i(K,!0),i(W,!0),i(P,[],!0);try{let r=await Ce({repo:e(O).repo.trim(),filename:t.filename});if(!r?.payload){n?.auto||i(P,[`No se pudo leer `+t.filename],!0),i(W,!1);return}i(k,t.filename,!0),await $t(r.payload)&&(i(Ot,Jt(t),!0),n?.auto&&i(wt,!1))}catch(e){i(P,[`No se pudo abrir `+t.filename+`: `+Z(e)],!0),i(W,!1)}finally{i(K,!1)}}}function Zt(e){i(W,!0),i(P,[],!0);let t=new FileReader;t.onload=()=>{let e;try{e=JSON.parse(String(t.result))}catch(e){i(P,[`El archivo no es JSON válido: `+Z(e)],!0),i(W,!1);return}$t(e)},t.onerror=()=>{i(P,[`No se pudo leer el archivo.`],!0),i(W,!1)},t.readAsText(e)}function Qt(t){return pe(t,e(O))}async function $t(e){i(W,!0),Tt=!1;try{let t=await en(e);return Tt||i(W,!1),t}catch(e){throw i(W,!1),e}}async function en(t){let n=Le(t);if(n.length)return i(P,n,!0),!1;let r=_e(t),a=Qt(t);(a.repo||a.branch||a.base||a.remoteUrl)&&J({source:a.source,repo:a.repo||e(O).repo,branch:a.branch||e(O).branch,base:a.base||e(O).base,remoteUrl:a.remoteUrl||e(O).remoteUrl});let o={intent:r.intent,groups:r.groups,blocks:r.blocks,findings:r.findings,skipped:r.skipped,notes:r.notes},s=[],c=(e,t)=>{let n=t.trim();n&&(s.some(t=>t.source===e&&t.repo===n)||s.push({source:e,repo:n}))};if(a.branch){a.source===`local`&&Y(a.repo)?c(`local`,a.repo):a.source===`url`&&X(a.repo)||X(a.repo)?c(`url`,a.repo):Y(a.repo)&&c(`local`,a.repo);let e=(a.remoteUrl||``).trim();e&&X(e)&&c(`url`,e)}if(s.length&&a.branch){i(U,!0),i(P,[],!0);let e=[],t=!1,n=a.remoteUrl;try{for(let i of s)try{if(r=await ye({repo:i.repo,branch:a.branch,base:a.base||`develop`,source:i.source,payload:o}),t=!0,i.source===`url`)n||=i.repo;else if(!n)try{let e=await xe({source:`local`,repo:i.repo});e.remoteUrl&&(n=e.remoteUrl)}catch{}break}catch(t){e.push(`${i.source===`url`?`URL`:`local`}: ${Z(t)}`)}if(!t){if(!Me(r))return i(P,[`No se pudo calcular el diff con git.`,...e.map(e=>`· ${e}`)],!0),!1;r={...r,notes:[...r.notes,`No se pudo refrescar el diff con git: `+e.join(` | `)]}}}finally{i(U,!1)}n&&J({remoteUrl:n});let c=tn(a,n),l=Fe(r);return l.length?(i(F,r,!0),i(I,l,!0),i(P,[],!0),J(c),!0):(nn(r,c),!0)}else if(!Me(r))return i(P,[`Indicá repo (ruta o URL) y branch, o incluí meta.remoteUrl en el JSON, para calcular el diff con git.`],!0),!1;let l=tn(a),u=Fe(r);return u.length?(i(F,r,!0),i(I,u,!0),i(P,[],!0),J(l),!0):(nn(r,l),!0)}function tn(t,n){return{source:t.source,repo:t.repo||e(O).repo,branch:t.branch||e(O).branch,base:t.base||e(O).base,remoteUrl:n||t.remoteUrl||e(O).remoteUrl,...t.generatedAt?{generatedAt:t.generatedAt}:{},...t.agent?{agent:t.agent}:{},...t.model?{model:t.model}:{}}}function nn(t,n=e(O)){i(P,[],!0),i(F,null),i(I,[],!0),Tt=!0,oe(ce(`/report/${ve(t,n).id}`))}function rn(){nn(Ie,{source:`local`,repo:`ms-obe-aprobacion-debin`,branch:`feature/PCM-14839`,base:`develop`,agent:`Claude Code`,model:`opus`})}function an(e){let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString(`es-AR`,{day:`2-digit`,month:`2-digit`,hour:`2-digit`,minute:`2-digit`})}function on(){i(L,null),i(Ct,null)}function sn(e){let t=e.getBoundingClientRect(),n=t.bottom+4;n+42>window.innerHeight-8&&(n=t.top-4-42),n<8&&(n=8);let r=t.right-148;r<8&&(r=8),r+148>window.innerWidth-8&&(r=window.innerWidth-8-148),i(Ct,{top:n,left:r},!0)}function cn(t,n){if(e(L)===t){on();return}i(L,t,!0),sn(n)}function ln(e){let t=e.branch||`este reporte`;confirm(`¿Eliminar “${t}”? No se puede deshacer.`)&&(we(e.id),i(St,ge(),!0),on())}var un=_t();S(`click`,t,()=>{e(L)&&on()}),S(`keydown`,t,e=>{e.key===`Escape`&&on()});var dn=d(un),fn=e=>{l(e,Re())};g(dn,t=>{e(yt)&&t(fn)});var pn=u(dn,2),mn=e=>{l(e,ze())};g(pn,t=>{e(W)&&t(mn)});var hn=u(pn,2),gn=d(hn);Oe(u(gn,2),{}),h(hn);var _n=u(hn,2),vn=d(_n),yn=u(d(vn),2),bn=d(yn);let xn;var Sn=u(bn,2);let Cn;h(yn);var wn=u(yn,2),Tn=d(wn),En=e=>{var t=Be();x(2),l(e,t)},Dn=e=>{l(e,r(`Carpeta local del repo. Podés pegar la ruta o elegirla con el diálogo del sistema. Git corre ahí
66
- mismo (sirve para branches no pusheados).`))};g(Tn,t=>{e(O).source===`url`?t(En):t(Dn,-1)}),h(wn);var On=u(wn,2),kn=t=>{var n=Ve(),r=d(n,!0);h(n),o(()=>E(r,e(z))),l(t,n)};g(On,t=>{e(z)&&t(kn)});var An=u(On,2),jn=t=>{var n=He(),r=d(n);h(n),o(e=>E(r,`${e??``}.`),[()=>D(e(R).length,`branch encontrado`,`branches encontrados`)]),l(t,n)};g(An,t=>{e(R).length&&t(jn)});var Mn=u(An,2),Nn=d(Mn),Pn=d(Nn),Fn=d(Pn,!0);h(Pn);var In=u(Pn,2),Q=d(In);re(Q);var Ln=u(Q,2),Rn=t=>{var n=Ue(),r=d(n,!0);h(n),o(()=>{n.disabled=e(V)||e(B),E(r,e(V)?`Eligiendo…`:`Elegir…`)}),c(`click`,n,()=>void Vt()),l(t,n)};g(Ln,t=>{e(O).source===`local`&&t(Rn)});var zn=u(Ln,2),Bn=d(zn,!0);h(zn),h(In),h(Nn);var Vn=u(Nn,2),Hn=d(Vn),Un=u(d(Hn),2),Wn=t=>{var n=Ge();w(n,20,()=>e(R),e=>e,(e,t)=>{var n=We(),r=d(n,!0);h(n);var i={};o(()=>{E(r,t),i!==(i=t)&&(n.value=(n.__value=t)??``)}),l(e,n)}),h(n);var r;te(n),o(()=>{r!==(r=e(O).branch)&&(n.value=(n.__value=e(O).branch)??``,ae(n,e(O).branch))}),c(`change`,n,e=>J({branch:e.currentTarget.value})),l(t,n)},Gn=t=>{var n=Ke();re(n),o(()=>_(n,e(O).branch)),c(`input`,n,e=>J({branch:e.currentTarget.value})),l(t,n)};g(Un,t=>{e(R).length?t(Wn):t(Gn,-1)}),h(Hn);var Kn=u(Hn,2),qn=u(d(Kn),2),Jn=t=>{var n=Ge();w(n,20,()=>e(R),e=>e,(e,t)=>{var n=We(),r=d(n,!0);h(n);var i={};o(()=>{E(r,t),i!==(i=t)&&(n.value=(n.__value=t)??``)}),l(e,n)}),h(n);var r;te(n),o(()=>{r!==(r=e(O).base)&&(n.value=(n.__value=e(O).base)??``,ae(n,e(O).base))}),c(`change`,n,e=>J({base:e.currentTarget.value})),l(t,n)},Yn=t=>{var n=qe();re(n),o(()=>_(n,e(O).base)),c(`input`,n,e=>J({base:e.currentTarget.value})),l(t,n)};g(qn,t=>{e(R).length?t(Jn):t(Yn,-1)}),h(Kn),h(Vn),h(Mn);var Xn=u(Mn,4),Zn=d(Xn);let Qn;var $n=u(Zn,2);let er;h(Xn);var tr=u(Xn,2),nr=t=>{var n=Je(),r=u(a(n),2);ee(r);var i=u(r,2),s=d(i),f=d(s,!0);h(s);var p=u(s,2);h(i),o(()=>{_(r,e(A)),E(f,e(vt)?`Copiado ✓`:`Copiar prompt`)}),c(`input`,r,Ft),c(`click`,s,Lt),c(`click`,p,rn),l(t,n)},rr=t=>{var n=Ye(),r=u(a(n),2),i=d(r),s=d(i,!0);h(i),h(r);var f=u(r,2),p=d(f),ee=d(p,!0);h(p),h(f);var m=u(f,2),g=u(d(m),4),_=d(g),v=u(_,2),y=u(v,2);h(g),h(m),o(()=>{E(s,e(At)),E(ee,e(bt)?`Copiado ✓`:`Copiar comando`)}),c(`click`,p,zt),c(`click`,_,()=>Bt(`claude`)),c(`click`,v,()=>Bt(`cursor`)),c(`click`,y,()=>Bt(`copilot`)),l(t,n)};g(tr,t=>{e(M)===`full`?t(nr):t(rr,-1)});var ir=u(tr,4),ar=u(d(ir)),or=d(ar,!0);h(ar);var sr=u(ar,4),cr=e=>{l(e,r(`Con repo local, si el archivo aparece en la raíz lo abrimos solos.`))},lr=e=>{l(e,r(`Con repo local, si el archivo está en la raíz podés abrirlo desde acá.`))};g(sr,t=>{e(q)&&e(wt)?t(cr):e(q)&&t(lr,1)}),h(ir);var ur=u(ir,2),dr=t=>{var n=$e(),r=u(d(n)),i=d(r,!0);h(r);var a=u(r,2),s=e=>{l(e,Xe())},f=e=>{l(e,Ze())},p=e=>{l(e,Qe())};g(a,t=>{e(K)?t(s):e(wt)?t(f,1):t(p,-1)}),h(n),o(()=>E(i,e(G).filename)),c(`click`,r,()=>void Xt(e(G))),l(t,n)},fr=t=>{var n=et(),r=u(d(n)),i=d(r,!0);h(r),h(n),o(()=>E(i,e(G).filename)),c(`click`,r,()=>void Xt(e(G))),l(t,n)},pr=t=>{var n=tt(),r=u(d(n)),i=d(r,!0);h(r),x(),h(n),o(()=>E(i,e(k))),l(t,n)};g(ur,t=>{e(q)&&e(G)&&e(G).filename===e(k)&&!e(U)&&!e(K)?t(dr):e(q)&&e(G)&&e(G).filename!==e(k)&&!e(U)?t(fr,1):e(q)&&!e(G)&&!e(U)&&!e(K)&&t(pr,2)});var mr=u(ur,2),hr=e=>{l(e,nt())};g(mr,t=>{e(K)&&t(hr)});var $=u(mr,2);let gr;var _r=d($),vr=d(_r),yr=e=>{l(e,r(`Calculando diff con git…`))},br=e=>{l(e,r(`Eligiendo archivo…`))},xr=e=>{l(e,r(`Importando JSON…`))},Sr=e=>{l(e,r(`Arrastrá el archivo .json acá`))};g(vr,t=>{e(U)?t(yr):e(H)?t(br,1):e(K)?t(xr,2):t(Sr,-1)}),h(_r);var Cr=u(_r,2),wr=d(Cr,!0);h(Cr);var Tr=u(Cr,2);m(Tr,e=>i(Dt,e),()=>e(Dt)),h($);var Er=u($,2),Dr=t=>{var n=it(),r=d(n),i=d(r),a=d(i);h(i),x(2),h(r);var s=u(r,2),f=u(d(s),2);w(f,20,()=>e(I),e=>e,(e,t)=>{var n=rt(),r=d(n,!0);h(n),o(()=>E(r,t)),l(e,n)}),h(f),h(s);var p=u(s,2),m=u(d(p)),g=d(m,!0);h(m),x(),h(p);var v=u(p,2);ee(v);var y=u(v,2),b=d(y),S=d(b,!0);h(b);var te=u(b,2);h(y),h(n),o((t,n)=>{E(a,`El modelo dejó ${t??``} sin explicar`),E(g,e(k)),_(v,n),E(S,e(xt)?`Copiado ✓`:`Copiar prompt de corrección`)},[()=>D(e(I).length,`archivo`,`archivos`),()=>me(e(O),e(I),{outputFilename:e(k)})]),c(`click`,b,Rt),c(`click`,te,()=>e(F)&&nn(e(F))),l(t,n)};g(Er,t=>{e(F)&&t(Dr)});var Or=u(Er,2),kr=t=>{var n=at(),r=u(d(n),2);w(r,20,()=>e(P),e=>e,(e,t)=>{var n=rt(),r=d(n,!0);h(n),o(()=>E(r,t)),l(e,n)}),h(r),h(n),l(t,n)};g(Or,t=>{e(P).length&&t(kr)}),h(vn);var Ar=u(vn,2),jr=u(d(Ar),2),Mr=t=>{var n=ht();w(n,21,()=>e(St),e=>e.id,(t,n)=>{var r=mt(),i=d(r),a=d(i),s=d(a),f=d(s,!0);h(s);var p=u(s,2),ee=d(p,!0);h(p),h(a);var m=u(a,2),_=d(m),y=u(d(_));h(_);var b=u(_,2),x=d(b),S=d(x,!0);h(x);var te=u(x,2),ne=t=>{var r=ot(),i=d(r,!0);h(r),o(e=>E(i,e),[()=>D(e(n).blockerCount,`blocker`,`blockers`)]),l(t,r)};g(te,t=>{e(n).blockerCount&&t(ne)});var re=u(te,2),ie=t=>{var r=st(),i=d(r,!0);h(r),o(e=>E(i,e),[()=>D(e(n).qualityCount,`calidad`,`calidad`)]),l(t,r)};g(re,t=>{e(n).qualityCount&&t(ie)}),h(b),h(m);var ae=u(m,2),w=t=>{var r=dt(),i=d(r),a=t=>{var r=ct(),i=d(r,!0);h(r),o(()=>E(i,e(n).agent)),l(t,r)};g(i,t=>{e(n).agent&&t(a)});var s=u(i,2),c=e=>{l(e,lt())};g(s,t=>{e(n).agent&&e(n).model&&t(c)});var f=u(s,2),p=t=>{var r=ut(),i=d(r,!0);h(r),o(()=>E(i,e(n).model)),l(t,r)};g(f,t=>{e(n).model&&t(p)}),h(r),o(e=>C(r,`title`,e),[()=>[e(n).agent,e(n).model].filter(Boolean).join(` · `)]),l(t,r)};g(ae,t=>{(e(n).agent||e(n).model)&&t(w)});var T=u(ae,2),oe=t=>{var r=ft(),i=d(r,!0);h(r),o(()=>E(i,e(n).intent)),l(t,r)};g(T,t=>{e(n).intent&&t(oe)}),h(i);var se=u(i,2),le=d(se),ue=u(le,2),de=t=>{var r=pt();let i;var a=d(r);h(r),o(()=>i=v(r,``,i,{top:`${e(Ct).top??``}px`,left:`${e(Ct).left??``}px`})),c(`click`,a,t=>{t.stopPropagation(),ln(e(n))}),l(t,r)};g(ue,t=>{e(L)===e(n).id&&e(Ct)&&t(de)}),h(se),h(r),o((t,r,a)=>{C(i,`href`,t),E(f,e(n).branch||`—`),E(ee,r),E(y,` ${(e(n).base||`develop`)??``}`),E(S,a),C(le,`aria-label`,`Más acciones para ${(e(n).branch||`reporte`)??``}`),C(le,`aria-expanded`,e(L)===e(n).id)},[()=>ce(`/report/${e(n).id}`),()=>an(e(n).savedAt),()=>D(e(n).groupCount,`tema`,`temas`)]),c(`click`,le,t=>{t.preventDefault(),t.stopPropagation(),cn(e(n).id,t.currentTarget)}),l(t,r)}),h(n),l(t,n)},Nr=e=>{l(e,gt())};g(jr,t=>{e(St).length?t(Mr):t(Nr,-1)}),h(Ar),h(_n),h(un),o(t=>{C(gn,`href`,t),xn=b(bn,1,`svelte-1uha8ag`,null,xn,{on:e(O).source===`local`}),Cn=b(Sn,1,`svelte-1uha8ag`,null,Cn,{on:e(O).source===`url`}),E(Fn,e(O).source===`url`?`URL del repo`:`Repo`),C(Q,`placeholder`,e(O).source===`url`?`https://github.com/org/repo.git`:`C:\\path\\to\\repo`),_(Q,e(O).repo),zn.disabled=e(B)||e(V),E(Bn,e(B)?`Cargando…`:`Cargar`),Qn=b(Zn,1,`svelte-1uha8ag`,null,Qn,{on:e(M)===`full`}),er=b($n,1,`svelte-1uha8ag`,null,er,{on:e(M)===`command`}),E(or,e(k)),gr=b($,1,`dropzone svelte-1uha8ag`,null,gr,{drag:e(N),busy:e(U)||e(H)||e(K)}),Cr.disabled=e(U)||e(H)||e(K),E(wr,e(H)?`Abriendo…`:`Elegir archivo`)},[()=>ce(`/`)]),c(`click`,bn,()=>Pt(`local`)),c(`click`,Sn,()=>Pt(`url`)),c(`input`,Q,e=>J({repo:e.currentTarget.value})),c(`keydown`,Q,e=>{e.key===`Enter`&&(e.preventDefault(),Ht())}),c(`click`,zn,()=>void Ht()),c(`click`,Zn,()=>i(M,`full`)),c(`click`,$n,()=>i(M,`command`)),S(`dragover`,$,Ut),S(`dragleave`,$,Wt),S(`drop`,$,Gt),c(`click`,Cr,()=>void Kt()),c(`change`,Tr,qt),S(`scroll`,Ar,()=>e(L)&&on()),l(n,un),y()}n([`click`,`input`,`keydown`,`change`]);export{O as component};