diffing 0.10.3 → 0.10.5

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 (160) hide show
  1. package/dist/{cli-agent-RJ5s4n77.mjs → cli-agent-BJiATn11.mjs} +10 -8
  2. package/dist/{cli-gh-B8HybRWZ.mjs → cli-gh-_bkDCxhh.mjs} +1 -1
  3. package/dist/cli.mjs +214 -13
  4. package/dist/client/assets/{angular-html-BFXVRkhg.js → angular-html-CBcwKYDC.js} +1 -1
  5. package/dist/client/assets/{angular-ts-bUwtWqya.js → angular-ts-DRBYUaJA.js} +1 -1
  6. package/dist/client/assets/{apl-bnOQInIz.js → apl-BM0X8jeL.js} +1 -1
  7. package/dist/client/assets/{arc-CRYHn0oW.js → arc-DTkmmKl3.js} +1 -1
  8. package/dist/client/assets/{architectureDiagram-3BPJPVTR-BLK33h0-.js → architectureDiagram-3BPJPVTR-Cw75ay7q.js} +1 -1
  9. package/dist/client/assets/{astro-BpPieWCw.js → astro-DKTNkoRZ.js} +1 -1
  10. package/dist/client/assets/{blade-B804X9BP.js → blade-DaM7a9Zp.js} +1 -1
  11. package/dist/client/assets/{blockDiagram-GPEHLZMM-VZc4C656.js → blockDiagram-GPEHLZMM-DAzINMr_.js} +1 -1
  12. package/dist/client/assets/{c-Cyh0ngfN.js → c-B3C0Or4o.js} +1 -1
  13. package/dist/client/assets/{c4Diagram-AAUBKEIU-9t9UJlU3.js → c4Diagram-AAUBKEIU-C7SsS28g.js} +1 -1
  14. package/dist/client/assets/channel-lsVHTuYR.js +1 -0
  15. package/dist/client/assets/{chunk-2J33WTMH-LudE8z-b.js → chunk-2J33WTMH-DHOUGWx8.js} +1 -1
  16. package/dist/client/assets/{chunk-3OPIFGDE-BxaQxo50.js → chunk-3OPIFGDE-D8d2scLX.js} +1 -1
  17. package/dist/client/assets/{chunk-4BX2VUAB-BfHcXCJ6.js → chunk-4BX2VUAB-BSC-E5yg.js} +1 -1
  18. package/dist/client/assets/{chunk-55IACEB6-o0ADQlnq.js → chunk-55IACEB6-27pC5pKn.js} +1 -1
  19. package/dist/client/assets/{chunk-5ZQYHXKU-E1qBkOlk.js → chunk-5ZQYHXKU-BM60x82y.js} +1 -1
  20. package/dist/client/assets/{chunk-727SXJPM-BitjzJ_b.js → chunk-727SXJPM-CHCF96vE.js} +1 -1
  21. package/dist/client/assets/{chunk-AQP2D5EJ-B5pw4PfB.js → chunk-AQP2D5EJ-BoVsvmTa.js} +1 -1
  22. package/dist/client/assets/{chunk-BSJP7CBP-CoL841vB.js → chunk-BSJP7CBP-Iip4uSio.js} +1 -1
  23. package/dist/client/assets/{chunk-CSCIHK7Q-Dw4jsICo.js → chunk-CSCIHK7Q-DuIWPyay.js} +1 -1
  24. package/dist/client/assets/{chunk-FMBD7UC4-hpHFrNoE.js → chunk-FMBD7UC4-Du6rtd2k.js} +1 -1
  25. package/dist/client/assets/{chunk-KSCS5N6A-D67-Zs6D.js → chunk-KSCS5N6A-BBq105vI.js} +1 -1
  26. package/dist/client/assets/{chunk-L5ZTLDWV-Brr6wA9I.js → chunk-L5ZTLDWV-0DmB5Qp8.js} +1 -1
  27. package/dist/client/assets/{chunk-LZXEDZCA-e3dTHwrC.js → chunk-LZXEDZCA-CoRsjUfr.js} +2 -2
  28. package/dist/client/assets/{chunk-ND2GUHAM-Cj2MlAOf.js → chunk-ND2GUHAM-tX8cKEls.js} +1 -1
  29. package/dist/client/assets/{chunk-NZK2D7GU-CEyXOVMI.js → chunk-NZK2D7GU-BoJGgPic.js} +1 -1
  30. package/dist/client/assets/{chunk-O5CBEL6O-CymJeKCI.js → chunk-O5CBEL6O-mlwCWs97.js} +1 -1
  31. package/dist/client/assets/chunk-QZHKN3VN-AHUiTM0z.js +1 -0
  32. package/dist/client/assets/chunk-WU5MYG2G-D41j4yxb.js +1 -0
  33. package/dist/client/assets/{chunk-XPW4576I-DfoZU8hD.js → chunk-XPW4576I-B5efww8M.js} +1 -1
  34. package/dist/client/assets/classDiagram-4FO5ZUOK-D1Eo3kly.js +1 -0
  35. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-bAMsbsfB.js +1 -0
  36. package/dist/client/assets/{cobol-D0BZ7BzH.js → cobol-De9QR_Td.js} +1 -1
  37. package/dist/client/assets/{coffee-BAPNIyTD.js → coffee-Ct_GvuHP.js} +1 -1
  38. package/dist/client/assets/{cose-bilkent-S5V4N54A-wCBDLLgv.js → cose-bilkent-S5V4N54A-ATaJZGF7.js} +1 -1
  39. package/dist/client/assets/{cpp-D54qUqoX.js → cpp-Dw52w9cj.js} +1 -1
  40. package/dist/client/assets/{crystal-BvYuHO8u.js → crystal-Dx8ADdsd.js} +1 -1
  41. package/dist/client/assets/{css-BwYPZ1qE.js → css-CZ13XvDU.js} +1 -1
  42. package/dist/client/assets/{dagre-BM42HDAG-DSO2rfSO.js → dagre-BM42HDAG-aDltuYut.js} +1 -1
  43. package/dist/client/assets/{diagram-2AECGRRQ-OO89Fatz.js → diagram-2AECGRRQ-DGWnHVMJ.js} +1 -1
  44. package/dist/client/assets/{diagram-5GNKFQAL-CARudkst.js → diagram-5GNKFQAL-Dd7eZBKe.js} +1 -1
  45. package/dist/client/assets/{diagram-KO2AKTUF-MMqM8Xip.js → diagram-KO2AKTUF-DWThXREf.js} +1 -1
  46. package/dist/client/assets/{diagram-LMA3HP47-CA7_Ug5b.js → diagram-LMA3HP47-CXR4Bjtc.js} +1 -1
  47. package/dist/client/assets/{diagram-OG6HWLK6-BAb7zakI.js → diagram-OG6HWLK6-D4Cbf0nW.js} +1 -1
  48. package/dist/client/assets/{dist-CP7b6OkU.js → dist-CUDhrHNw.js} +1 -1
  49. package/dist/client/assets/{edge-BbeCKm9i.js → edge-CQCjdJKj.js} +1 -1
  50. package/dist/client/assets/{elixir-C2M5DZQF.js → elixir-bkjwPazA.js} +1 -1
  51. package/dist/client/assets/{elm-CwqP8u0T.js → elm-CCweX5Cq.js} +1 -1
  52. package/dist/client/assets/{erDiagram-TEJ5UH35-Jy0Sqs_1.js → erDiagram-TEJ5UH35-BmAyt7SU.js} +1 -1
  53. package/dist/client/assets/{erb-C3C66A5u.js → erb-D-Z-KBLp.js} +1 -1
  54. package/dist/client/assets/{flowDiagram-I6XJVG4X-D9L8qr8V.js → flowDiagram-I6XJVG4X-C6nIFUVc.js} +1 -1
  55. package/dist/client/assets/{ganttDiagram-6RSMTGT7-CGaqGarh.js → ganttDiagram-6RSMTGT7-DMlxThBf.js} +1 -1
  56. package/dist/client/assets/{git-rebase-BQxiUc18.js → git-rebase-BdoFdenB.js} +1 -1
  57. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-RAteUysV.js → gitGraphDiagram-PVQCEYII-JaIFkAIT.js} +1 -1
  58. package/dist/client/assets/{glimmer-js-CSiwvg27.js → glimmer-js-CZQrBJKq.js} +1 -1
  59. package/dist/client/assets/{glimmer-ts-Dpvu35Rk.js → glimmer-ts-CBYW46D4.js} +1 -1
  60. package/dist/client/assets/{glsl-DusmoVD0.js → glsl-wxixKkY_.js} +1 -1
  61. package/dist/client/assets/{graphql-B4CCj0BK.js → graphql-CqZ0Lo5a.js} +1 -1
  62. package/dist/client/assets/{hack-BNgw8w6u.js → hack-rqWymQRV.js} +1 -1
  63. package/dist/client/assets/{haml-BhHHy_kW.js → haml-DFw_IoGM.js} +1 -1
  64. package/dist/client/assets/{handlebars-BBUsDvYG.js → handlebars-3VmTVMYt.js} +1 -1
  65. package/dist/client/assets/{html-DMohn6Yq.js → html-C0Li76jB.js} +1 -1
  66. package/dist/client/assets/{html-derivative-BY6zEZAg.js → html-derivative-CO-RQW8y.js} +1 -1
  67. package/dist/client/assets/{http-BHAVGGfJ.js → http-sPrZOeBY.js} +1 -1
  68. package/dist/client/assets/{hurl-B2q8TNaP.js → hurl-DUoPe4Lc.js} +1 -1
  69. package/dist/client/assets/{index-CguUPVUR.css → index-B42c0TyV.css} +1 -1
  70. package/dist/client/assets/{index-CxN77Qol.js → index-BN_-di_r.js} +31 -31
  71. package/dist/client/assets/{infoDiagram-5YYISTIA-DCyKTiIZ.js → infoDiagram-5YYISTIA-B6AZ5SCV.js} +1 -1
  72. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-BMTEXPAX.js → ishikawaDiagram-YF4QCWOH-CytMrpo8.js} +1 -1
  73. package/dist/client/assets/{java-DHj6gaNP.js → java-Cj0G6QRg.js} +1 -1
  74. package/dist/client/assets/{javascript-CbF7u-DE.js → javascript-d5SUuyWD.js} +1 -1
  75. package/dist/client/assets/{jinja-MOxap5pr.js → jinja-BTw9k0vO.js} +1 -1
  76. package/dist/client/assets/{jison-XUjMP-LK.js → jison-9xSVvR1q.js} +1 -1
  77. package/dist/client/assets/{journeyDiagram-JHISSGLW-Ckd41c1S.js → journeyDiagram-JHISSGLW-Bd4jZUYI.js} +1 -1
  78. package/dist/client/assets/{json-7vp-fS_h.js → json-DjAt53ka.js} +1 -1
  79. package/dist/client/assets/{jsx-BgiCPhz9.js → jsx-BX5KmQ7d.js} +1 -1
  80. package/dist/client/assets/{julia-DADvZSF3.js → julia-CLLx1dHC.js} +1 -1
  81. package/dist/client/assets/{just-BS3xPvUT.js → just-C0v80bKe.js} +1 -1
  82. package/dist/client/assets/{kanban-definition-UN3LZRKU-BlLY2sqY.js → kanban-definition-UN3LZRKU-Ds4pXHJa.js} +1 -1
  83. package/dist/client/assets/{latex-C_QvolBN.js → latex-DY-oQfwO.js} +1 -1
  84. package/dist/client/assets/{line-Bkj6DIfl.js → line-BbSLfOl6.js} +1 -1
  85. package/dist/client/assets/{linear-Cm6J5YrP.js → linear-BMIZJAAR.js} +1 -1
  86. package/dist/client/assets/{liquid-CL0UH-ot.js → liquid-DDHDgbZx.js} +1 -1
  87. package/dist/client/assets/{lua-DlAyxrVn.js → lua-CXymerKS.js} +1 -1
  88. package/dist/client/assets/{marko-6e-PRCyy.js → marko-DoPFsptl.js} +1 -1
  89. package/dist/client/assets/{mdc-BbLfT_IA.js → mdc-BxSmTphd.js} +1 -1
  90. package/dist/client/assets/{mermaid-parser.core-DwyEEn2f.js → mermaid-parser.core-CcYSvN4q.js} +1 -1
  91. package/dist/client/assets/{mermaid.core-K3JZIfb0.js → mermaid.core-COTNtqgQ.js} +3 -3
  92. package/dist/client/assets/{mindmap-definition-RKZ34NQL-B2pkZuEx.js → mindmap-definition-RKZ34NQL-BTxraRzn.js} +1 -1
  93. package/dist/client/assets/{nginx-CoBWheEf.js → nginx-Bma0jNOT.js} +1 -1
  94. package/dist/client/assets/{nim-2_Wea-mV.js → nim-DMBpjygU.js} +1 -1
  95. package/dist/client/assets/{perl-SkTVK0CC.js → perl-CrnrV-AJ.js} +1 -1
  96. package/dist/client/assets/{php-C2cF2oJ6.js → php-CDYxzX6t.js} +1 -1
  97. package/dist/client/assets/{pieDiagram-4H26LBE5-BQeH8sHJ.js → pieDiagram-4H26LBE5-DglRmzer.js} +1 -1
  98. package/dist/client/assets/{pug-C01v9yeE.js → pug-DNewy3GU.js} +1 -1
  99. package/dist/client/assets/{qml-CCP9ULJs.js → qml-COjcnZ-W.js} +1 -1
  100. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-D9CC7zgZ.js → quadrantDiagram-W4KKPZXB-BjSmyES7.js} +1 -1
  101. package/dist/client/assets/{r-DDJJP6PS.js → r-CrCaMxLS.js} +1 -1
  102. package/dist/client/assets/{razor-DKBWfXRk.js → razor-jeuOZIar.js} +1 -1
  103. package/dist/client/assets/{regexp-DOe8oQhc.js → regexp-DSHVUX08.js} +1 -1
  104. package/dist/client/assets/{requirementDiagram-4Y6WPE33-DlYO_tzx.js → requirementDiagram-4Y6WPE33-B4f430jS.js} +1 -1
  105. package/dist/client/assets/{review-export-CgROw3iz.js → review-export-Cen1WEcX.js} +1 -1
  106. package/dist/client/assets/{rst-KHKSB4M-.js → rst-CIDgytzc.js} +1 -1
  107. package/dist/client/assets/{ruby-3gO1sivg.js → ruby-DtuseoNq.js} +1 -1
  108. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-DvgoVn_C.js → sankeyDiagram-5OEKKPKP-TQPPlxc6.js} +1 -1
  109. package/dist/client/assets/{sas-D1u2TkIr.js → sas-C72Theia.js} +1 -1
  110. package/dist/client/assets/{scss-C__x0Kwu.js → scss-ClECtwRk.js} +1 -1
  111. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-Dk46IxzZ.js → sequenceDiagram-3UESZ5HK-D1tx07Wg.js} +1 -1
  112. package/dist/client/assets/{shellscript-YrQZ5Lwf.js → shellscript-BCwBsi2k.js} +1 -1
  113. package/dist/client/assets/{shellsession-CoF5Zc6A.js → shellsession-BrOddEl5.js} +1 -1
  114. package/dist/client/assets/{soy-BKqc8OYl.js → soy-Dcs0GWFW.js} +1 -1
  115. package/dist/client/assets/{sql-D3MVYjA_.js → sql-BAjA7Gv7.js} +1 -1
  116. package/dist/client/assets/{src-UnI8qjTK.js → src-CYYhkqTK.js} +1 -1
  117. package/dist/client/assets/{stata-BqvSK3te.js → stata-19ngQtzR.js} +1 -1
  118. package/dist/client/assets/{stateDiagram-AJRCARHV-BuhZPSPC.js → stateDiagram-AJRCARHV-BZRCEzb5.js} +1 -1
  119. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-Da-mGMA2.js +1 -0
  120. package/dist/client/assets/{surrealql-BhWLIqpd.js → surrealql-Ce2TBRjE.js} +1 -1
  121. package/dist/client/assets/{svelte-DNNWxYsj.js → svelte-DQ_1eGZz.js} +1 -1
  122. package/dist/client/assets/{templ-DdMgSlsy.js → templ-Cw2DDxWF.js} +1 -1
  123. package/dist/client/assets/{tex-B4JFnTVn.js → tex-myDSO2eP.js} +1 -1
  124. package/dist/client/assets/{timeline-definition-PNZ67QCA-C1xzVz0K.js → timeline-definition-PNZ67QCA-CP0OZhBT.js} +1 -1
  125. package/dist/client/assets/{ts-tags-BQI5G_ZS.js → ts-tags-rh39ZwVs.js} +1 -1
  126. package/dist/client/assets/{tsx-C7qfZi8B.js → tsx-B0-26jrU.js} +1 -1
  127. package/dist/client/assets/{twig-RWfC7gXX.js → twig-CgasHzPb.js} +1 -1
  128. package/dist/client/assets/{typescript-aLdMd7mo.js → typescript-Dq3T0c-m.js} +1 -1
  129. package/dist/client/assets/{vennDiagram-CIIHVFJN-CBkCNH_s.js → vennDiagram-CIIHVFJN-DHaKHj0j.js} +1 -1
  130. package/dist/client/assets/{vue-BHCbeDIL.js → vue-CzFVh92-.js} +1 -1
  131. package/dist/client/assets/{vue-html-DXTiTIOp.js → vue-html-Bv2uFkTH.js} +1 -1
  132. package/dist/client/assets/{vue-vine-CuhsWKNe.js → vue-vine-DzieBk9Y.js} +1 -1
  133. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-aFrlILUG.js → wardleyDiagram-YWT4CUSO-Dky7jxlZ.js} +1 -1
  134. package/dist/client/assets/{xml-Dnahor-u.js → xml-wcdHRHN8.js} +1 -1
  135. package/dist/client/assets/{xsl-DB6zLGtG.js → xsl-CXrwsLG9.js} +1 -1
  136. package/dist/client/assets/{xychartDiagram-2RQKCTM6-CpPDrWcg.js → xychartDiagram-2RQKCTM6-BQ2hG60h.js} +1 -1
  137. package/dist/client/assets/{yaml-VItgjNOZ.js → yaml-lO6lK6Xe.js} +1 -1
  138. package/dist/client/index.html +3 -3
  139. package/dist/{completions-Csvfqctx.mjs → completions-3UF8uzhx.mjs} +2 -0
  140. package/dist/{doctor-DGZoOg8f.mjs → doctor-BGYZNIYP.mjs} +3 -3
  141. package/dist/{github-Cf5blBty.mjs → github-CEjtGd41.mjs} +47 -5
  142. package/dist/github-DKT0lJXv.mjs +2 -0
  143. package/dist/github-attachments-Cf17YWp4.mjs +351 -0
  144. package/dist/handoff-DPoIyeWn.mjs +11 -0
  145. package/dist/{mcp-DOqu6S64.mjs → mcp-Dq7J5QOP.mjs} +31 -18
  146. package/dist/{server-Bjzyb6NG.mjs → server-C9i4V36o.mjs} +96 -16
  147. package/dist/{server-lock-uqSdDYeR.mjs → server-lock-Dd_ss_Il.mjs} +1 -1
  148. package/dist/{settings-BVnzGFL7.mjs → settings-bwe7yQ8U.mjs} +1 -1
  149. package/package.json +1 -1
  150. package/dist/client/assets/channel-CdyG8Wtt.js +0 -1
  151. package/dist/client/assets/chunk-QZHKN3VN-DycW3jgO.js +0 -1
  152. package/dist/client/assets/chunk-WU5MYG2G-BXFsAzYU.js +0 -1
  153. package/dist/client/assets/classDiagram-4FO5ZUOK-BxVI8nIr.js +0 -1
  154. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-DZHTBTt9.js +0 -1
  155. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-CyVz0INc.js +0 -1
  156. package/dist/github-DWgPIcKC.mjs +0 -2
  157. /package/dist/{apply-suggestion-BAuyCYk6.mjs → apply-suggestion-DNNsC5gx.mjs} +0 -0
  158. /package/dist/{diff-fingerprint-CWa-soYD.mjs → diff-fingerprint-C8YO3TTE.mjs} +0 -0
  159. /package/dist/{review-export-DjxKBeIZ.mjs → review-export-BBDWvftT.mjs} +0 -0
  160. /package/dist/{update-check-fe0tR8tx.mjs → update-check-DUuHmPeZ.mjs} +0 -0
@@ -1,8 +1,8 @@
1
1
  import { C as isSafePath, S as revertHunk, _ as getUntrackedFilePathsAsync, a as getCustomGitDiffAsync, b as listRepoFiles, c as getGitDiffAsync, d as getProjectStorageDir, f as getRepoName, g as getTabSizeForFiles, h as getShowDiff, i as getCommitSeriesSummary, l as getHunkHistory, o as getFileContent, p as getRepoRoot, r as getBranchName, u as getMergeStatus, v as gitAddFile, w as toSafeRelativePath, y as isGitRepo } from "./git-Czo96ymM.mjs";
2
- import { a as searchContent, c as trackSelection, i as searchAll, n as saveSettings, o as searchFiles, r as getSearchStatus, s as searchSymbols, t as loadSettings } from "./settings-BVnzGFL7.mjs";
2
+ import { a as searchContent, c as trackSelection, i as searchAll, n as saveSettings, o as searchFiles, r as getSearchStatus, s as searchSymbols, t as loadSettings } from "./settings-bwe7yQ8U.mjs";
3
3
  import { t as formatComments } from "./comment-format-B5AcGcR-.mjs";
4
4
  import { n as formatPlanReview, r as sectionTitleForLine, t as extractPlanLines } from "./plan-format-BQyx--mp.mjs";
5
- import { D as updatePrReviewComment, E as submitReview, S as refreshPrSession, T as setPrReviewThreadResolved, a as detectCwdRepo, b as parsePrRef, f as fetchPrFileContentViaGh, i as deletePrReviewComment, l as fetchExistingCommentsViaGh, t as buildPrSession, u as fetchExistingReviewsViaGh, w as resolvedFromSession } from "./github-Cf5blBty.mjs";
5
+ import { D as updatePrReviewComment, E as submitReview, S as refreshPrSession, T as setPrReviewThreadResolved, a as detectCwdRepo, b as parsePrRef, f as fetchPrFileContentViaGh, i as deletePrReviewComment, l as fetchExistingCommentsViaGh, t as buildPrSession, u as fetchExistingReviewsViaGh, w as resolvedFromSession } from "./github-CEjtGd41.mjs";
6
6
  import { execFileSync } from "node:child_process";
7
7
  import { createHash } from "node:crypto";
8
8
  import { fileURLToPath } from "node:url";
@@ -51,6 +51,8 @@ const DEFAULTS = {
51
51
  outputMode: "auto",
52
52
  host: "127.0.0.1",
53
53
  noOpen: false,
54
+ reuseSession: false,
55
+ replaceSession: false,
54
56
  help: false,
55
57
  version: false,
56
58
  includeUnstaged: true,
@@ -179,6 +181,14 @@ const DIFFING_OPTIONS = {
179
181
  type: "boolean",
180
182
  default: false
181
183
  },
184
+ "reuse-session": {
185
+ type: "boolean",
186
+ default: false
187
+ },
188
+ "replace-session": {
189
+ type: "boolean",
190
+ default: false
191
+ },
182
192
  web: {
183
193
  type: "boolean",
184
194
  default: false
@@ -226,6 +236,8 @@ Diffing Server Options:
226
236
  --host <host> Host address to bind to (default: 127.0.0.1). Pass
227
237
  0.0.0.0 to expose the server to the local network.
228
238
  --no-open Don't open the browser automatically
239
+ --reuse-session If a review is already running, open it instead of prompting
240
+ --replace-session If a review is already running, stop it and start a new one
229
241
  --gh-pr <ref> Open a GitHub PR review session (number, owner/repo#N, or URL)
230
242
  Same as: diffing "gh pr <ref>"
231
243
 
@@ -488,6 +500,8 @@ function parseDiffOptions(rawArgs) {
488
500
  if (values.port) opts.port = parseInt(values.port, 10);
489
501
  if (values.host) opts.host = values.host;
490
502
  if (values["no-open"]) opts.noOpen = true;
503
+ if (values["reuse-session"]) opts.reuseSession = true;
504
+ if (values["replace-session"]) opts.replaceSession = true;
491
505
  if (values["gh-pr"]) opts.ghPr = String(values["gh-pr"]);
492
506
  if (values.staged || values.cached) opts.staged = true;
493
507
  if (values.merge) opts.merge = true;
@@ -3401,7 +3415,7 @@ function createApp(clientDir, diffOptsInput = DEFAULTS, commentStore, planStore,
3401
3415
  if (!relPath) return c.json({ error: "Forbidden file path" }, 403);
3402
3416
  const absolutePath = resolve(root, relPath);
3403
3417
  const content = await readFile(absolutePath, "utf-8");
3404
- const { applySuggestionToContent } = await import("./apply-suggestion-BAuyCYk6.mjs");
3418
+ const { applySuggestionToContent } = await import("./apply-suggestion-DNNsC5gx.mjs");
3405
3419
  const result = applySuggestionToContent({
3406
3420
  content,
3407
3421
  lineNumber: comment.lineNumber,
@@ -3541,19 +3555,69 @@ function createApp(clientDir, diffOptsInput = DEFAULTS, commentStore, planStore,
3541
3555
  }
3542
3556
  return c.json(page);
3543
3557
  });
3558
+ /**
3559
+ * Merge the GitHub-fetched existing comments into the *current* session's
3560
+ * optimistic state. The reply endpoint optimistically appends a new reply to
3561
+ * a thread before GitHub has propagated it through the REST comments API
3562
+ * (a noticeable window during the periodic 30s / window-focus sync). A naive
3563
+ * overwrite would make that reply flash out of the UI until the next sync
3564
+ * catches up — which is what users reported as "comments disappear after
3565
+ * submitting a reply" (especially visible on file-level threads because
3566
+ * those bubbles live in their own section and a missing one is striking).
3567
+ *
3568
+ * Strategy: take fresh-from-GitHub replies as authoritative for ids GitHub
3569
+ * already knows about, then re-append any optimistic local replies that
3570
+ * haven't yet appeared on GitHub (tracked via {@link PrSession.pendingOptimisticReplyIds}).
3571
+ * Replies GitHub no longer returns AND that aren't optimistic are dropped
3572
+ * (a real delete). Optimistic ids that do show up are confirmed and pruned
3573
+ * from the pending list.
3574
+ */
3575
+ const mergeFreshWithLocalOptimistic = (fresh, current, pendingIds) => {
3576
+ const pending = new Set(pendingIds);
3577
+ const localById = /* @__PURE__ */ new Map();
3578
+ for (const c of current ?? []) localById.set(c.id, c);
3579
+ const remainingPending = [];
3580
+ return {
3581
+ existingComments: fresh.map((freshTop) => {
3582
+ const local = localById.get(freshTop.id);
3583
+ if (!local) return freshTop;
3584
+ const freshReplyIds = new Set(freshTop.replies.map((r) => r.id));
3585
+ for (const id of freshReplyIds) pending.delete(id);
3586
+ const preserved = [];
3587
+ if (pending.size > 0) for (const r of local.replies) {
3588
+ if (freshReplyIds.has(r.id)) continue;
3589
+ if (pending.has(r.id)) {
3590
+ preserved.push(r);
3591
+ remainingPending.push(r.id);
3592
+ }
3593
+ }
3594
+ if (preserved.length === 0) return freshTop;
3595
+ const replies = [...freshTop.replies, ...preserved];
3596
+ return {
3597
+ ...freshTop,
3598
+ replies
3599
+ };
3600
+ }),
3601
+ remainingPending
3602
+ };
3603
+ };
3544
3604
  const syncExistingPrReviewData = async (session) => {
3545
3605
  const resolved = resolvedFromSession(session);
3546
3606
  let existingReviews = await fetchExistingReviewsViaGh(resolved);
3547
3607
  const optimisticReview = session.submittedReviewId == null ? void 0 : session.existingReviews?.find((review) => review.id === session.submittedReviewId);
3548
3608
  if (optimisticReview && !existingReviews.some((review) => review.id === optimisticReview.id) && session.submittedAt != null && Date.now() - session.submittedAt < 12e4) existingReviews = [optimisticReview, ...existingReviews];
3549
- const existingComments = await fetchExistingCommentsViaGh(resolved, existingReviews);
3550
- const comments = session.submittedAt ? (session.comments ?? []).filter((comment) => comment.createdAt > session.submittedAt) : session.comments;
3609
+ const freshExistingComments = await fetchExistingCommentsViaGh(resolved, existingReviews);
3610
+ const current = await prStore.get() ?? session;
3611
+ const { existingComments, remainingPending } = mergeFreshWithLocalOptimistic(freshExistingComments, current.existingComments, current.pendingOptimisticReplyIds ?? []);
3612
+ const comments = current.submittedAt ? (current.comments ?? []).filter((comment) => comment.createdAt > current.submittedAt) : current.comments;
3551
3613
  const next = {
3552
- ...session,
3614
+ ...current,
3553
3615
  comments,
3554
3616
  existingComments,
3555
3617
  existingReviews
3556
3618
  };
3619
+ if (remainingPending.length > 0) next.pendingOptimisticReplyIds = remainingPending;
3620
+ else delete next.pendingOptimisticReplyIds;
3557
3621
  await prStore.set(next);
3558
3622
  return next;
3559
3623
  };
@@ -3598,7 +3662,7 @@ function createApp(clientDir, diffOptsInput = DEFAULTS, commentStore, planStore,
3598
3662
  const session = await prStore.get();
3599
3663
  if (!session) return notInPrMode(c);
3600
3664
  try {
3601
- const { fetchPrChecks } = await import("./github-DWgPIcKC.mjs");
3665
+ const { fetchPrChecks } = await import("./github-DKT0lJXv.mjs");
3602
3666
  const checks = await fetchPrChecks(resolvedFromSession(session), session.headSha);
3603
3667
  const summary = {
3604
3668
  total: checks.length,
@@ -3630,7 +3694,7 @@ function createApp(clientDir, diffOptsInput = DEFAULTS, commentStore, planStore,
3630
3694
  const text = typeof body.body === "string" ? body.body.trim() : "";
3631
3695
  if (!text) return c.json({ error: "body is required" }, 400);
3632
3696
  try {
3633
- const { replyToPrComment } = await import("./github-DWgPIcKC.mjs");
3697
+ const { replyToPrComment } = await import("./github-DKT0lJXv.mjs");
3634
3698
  const result = await replyToPrComment({
3635
3699
  resolved: resolvedFromSession(session),
3636
3700
  inReplyTo: id,
@@ -3639,13 +3703,15 @@ function createApp(clientDir, diffOptsInput = DEFAULTS, commentStore, planStore,
3639
3703
  if (!result.ok) return c.json({ error: result.error ?? "Reply failed" }, 500);
3640
3704
  const reply = result.reply;
3641
3705
  if (reply) {
3642
- const existingComments = session.existingComments.map((comment) => comment.id === id ? {
3706
+ const existingComments = session.existingComments.map((comment) => comment.id === id || comment.replies.some((r) => r.id === id) ? {
3643
3707
  ...comment,
3644
3708
  replies: [...comment.replies, reply]
3645
3709
  } : comment);
3710
+ const pendingOptimisticReplyIds = [...session.pendingOptimisticReplyIds ?? [], ...typeof result.id === "number" ? [result.id] : []];
3646
3711
  await prStore.set({
3647
3712
  ...session,
3648
- existingComments
3713
+ existingComments,
3714
+ pendingOptimisticReplyIds
3649
3715
  });
3650
3716
  }
3651
3717
  return c.json({
@@ -3842,18 +3908,32 @@ function createApp(clientDir, diffOptsInput = DEFAULTS, commentStore, planStore,
3842
3908
  if (decision !== "approve" && decision !== "comment" && decision !== "request-changes" && decision !== "draft") return c.json({ error: "decision must be one of: approve, comment, request-changes, draft" }, 400);
3843
3909
  const generalBody = typeof body.body === "string" ? body.body : "";
3844
3910
  if (body.dryRun === true) {
3845
- const { buildReviewPayload } = await import("./github-DWgPIcKC.mjs");
3911
+ const { buildReviewPayload, resolvedFromSession } = await import("./github-DKT0lJXv.mjs");
3912
+ const { rewriteLocalAttachmentsInBodies } = await import("./github-attachments-Cf17YWp4.mjs");
3913
+ const resolved = resolvedFromSession(session);
3914
+ const comments = session.comments ?? [];
3915
+ const rewritten = await rewriteLocalAttachmentsInBodies(resolved, [generalBody, ...comments.map((c) => c.body ?? "")], { dryRun: true });
3916
+ if (rewritten.error) return c.json({
3917
+ ok: false,
3918
+ dryRun: true,
3919
+ error: rewritten.error
3920
+ }, 400);
3921
+ const [body, ...commentBodies] = rewritten.bodies;
3846
3922
  const payload = buildReviewPayload({
3847
3923
  decision,
3848
- body: generalBody,
3849
- comments: session.comments ?? []
3924
+ body: body ?? generalBody,
3925
+ comments: comments.map((c, i) => ({
3926
+ ...c,
3927
+ body: commentBodies[i] ?? c.body
3928
+ }))
3850
3929
  });
3851
3930
  return c.json({
3852
3931
  ok: true,
3853
3932
  dryRun: true,
3854
3933
  authSource: session.authSource ?? "none",
3855
3934
  failedComments: 0,
3856
- payload
3935
+ payload,
3936
+ attachmentRewrites: rewritten.urlMap
3857
3937
  });
3858
3938
  }
3859
3939
  const result = await submitReview({
@@ -3926,7 +4006,7 @@ function createApp(clientDir, diffOptsInput = DEFAULTS, commentStore, planStore,
3926
4006
  const openCount = all.filter((x) => x.status === "open").length;
3927
4007
  let diffFingerprints;
3928
4008
  try {
3929
- const { fingerprintDiffFiles } = await import("./diff-fingerprint-CWa-soYD.mjs");
4009
+ const { fingerprintDiffFiles } = await import("./diff-fingerprint-C8YO3TTE.mjs");
3930
4010
  if (prMode) {
3931
4011
  const prSession = await prStore.get();
3932
4012
  if (prSession?.diff) diffFingerprints = fingerprintDiffFiles(prSession.diff);
@@ -3994,7 +4074,7 @@ function createApp(clientDir, diffOptsInput = DEFAULTS, commentStore, planStore,
3994
4074
  } catch (err) {
3995
4075
  return c.json({ error: err?.message ?? "Failed to compute current diff" }, 500);
3996
4076
  }
3997
- const { fingerprintDiffFiles, diffSinceLast, filesToReviewSinceLast } = await import("./diff-fingerprint-CWa-soYD.mjs");
4077
+ const { fingerprintDiffFiles, diffSinceLast, filesToReviewSinceLast } = await import("./diff-fingerprint-C8YO3TTE.mjs");
3998
4078
  const delta = diffSinceLast(previous, fingerprintDiffFiles(currentPatch));
3999
4079
  return c.json({
4000
4080
  hasBaseline: true,
@@ -9,7 +9,7 @@ const STARTUP_LEASE_STALE_MS = 3e4;
9
9
  * mismatches between a user-started session and an MCP request.
10
10
  */
11
11
  function diffScopeKey(options) {
12
- const { port: _port, host: _host, noOpen: _noOpen, help: _help, version: _version, outputMode: _outputMode, tui: _tui, gpu: _gpu, noExtDiff: _noExtDiff, ...scope } = options;
12
+ const { port: _port, host: _host, noOpen: _noOpen, reuseSession: _reuseSession, replaceSession: _replaceSession, help: _help, version: _version, outputMode: _outputMode, tui: _tui, gpu: _gpu, noExtDiff: _noExtDiff, ...scope } = options;
13
13
  return JSON.stringify(scope);
14
14
  }
15
15
  function lockPath(repoRoot) {
@@ -430,7 +430,7 @@ const DEFAULTS = {
430
430
  untracked: true,
431
431
  diffStyle: "split",
432
432
  defaultTabSize: 4,
433
- theme: "nord",
433
+ theme: "rose-pine",
434
434
  editorIDE: "default",
435
435
  lineDiffType: "word",
436
436
  lineWrap: false,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "diffing",
3
- "version": "0.10.3",
3
+ "version": "0.10.5",
4
4
  "description": "local-first CLI for reviewing, navigating, and discussing git diffs with AI",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -1 +0,0 @@
1
- import{at as e,ot as t}from"./chunk-CSCIHK7Q-Dw4jsICo.js";var n=(n,r)=>t.lang.round(e.parse(n)[r]);export{n as t};
@@ -1 +0,0 @@
1
- import{h as e}from"./src-UnI8qjTK.js";var t=class{constructor(e){this.init=e,this.records=this.init()}static{e(this,`ImperativeState`)}reset(){this.records=this.init()}};export{t};
@@ -1 +0,0 @@
1
- import{h as e,p as t}from"./src-UnI8qjTK.js";import{x as n}from"./chunk-CSCIHK7Q-Dw4jsICo.js";var r=e(e=>{let{securityLevel:r}=n(),i=t(`body`);return r===`sandbox`&&(i=t((t(`#i${e}`).node()?.contentDocument??document).body)),i.select(`#${e}`)},`selectSvgElement`);export{r as t};
@@ -1 +0,0 @@
1
- import{h as e}from"./src-UnI8qjTK.js";import"./chunk-CSCIHK7Q-Dw4jsICo.js";import"./chunk-5ZQYHXKU-E1qBkOlk.js";import"./chunk-O5CBEL6O-CymJeKCI.js";import"./chunk-FMBD7UC4-hpHFrNoE.js";import"./chunk-BSJP7CBP-CoL841vB.js";import"./chunk-L5ZTLDWV-Brr6wA9I.js";import"./chunk-ND2GUHAM-Cj2MlAOf.js";import"./chunk-55IACEB6-o0ADQlnq.js";import"./chunk-2J33WTMH-LudE8z-b.js";import"./chunk-NZK2D7GU-CEyXOVMI.js";import"./chunk-3OPIFGDE-BxaQxo50.js";import"./chunk-KSCS5N6A-D67-Zs6D.js";import"./chunk-LZXEDZCA-e3dTHwrC.js";import{i as t,n,r,t as i}from"./chunk-727SXJPM-BitjzJ_b.js";var a={parser:n,get db(){return new i},renderer:r,styles:t,init:e(e=>{e.class||={},e.class.arrowMarkerAbsolute=e.arrowMarkerAbsolute},`init`)};export{a as diagram};
@@ -1 +0,0 @@
1
- import{h as e}from"./src-UnI8qjTK.js";import"./chunk-CSCIHK7Q-Dw4jsICo.js";import"./chunk-5ZQYHXKU-E1qBkOlk.js";import"./chunk-O5CBEL6O-CymJeKCI.js";import"./chunk-FMBD7UC4-hpHFrNoE.js";import"./chunk-BSJP7CBP-CoL841vB.js";import"./chunk-L5ZTLDWV-Brr6wA9I.js";import"./chunk-ND2GUHAM-Cj2MlAOf.js";import"./chunk-55IACEB6-o0ADQlnq.js";import"./chunk-2J33WTMH-LudE8z-b.js";import"./chunk-NZK2D7GU-CEyXOVMI.js";import"./chunk-3OPIFGDE-BxaQxo50.js";import"./chunk-KSCS5N6A-D67-Zs6D.js";import"./chunk-LZXEDZCA-e3dTHwrC.js";import{i as t,n,r,t as i}from"./chunk-727SXJPM-BitjzJ_b.js";var a={parser:n,get db(){return new i},renderer:r,styles:t,init:e(e=>{e.class||={},e.class.arrowMarkerAbsolute=e.arrowMarkerAbsolute},`init`)};export{a as diagram};
@@ -1 +0,0 @@
1
- import{h as e}from"./src-UnI8qjTK.js";import"./chunk-CSCIHK7Q-Dw4jsICo.js";import"./chunk-5ZQYHXKU-E1qBkOlk.js";import"./chunk-O5CBEL6O-CymJeKCI.js";import"./chunk-BSJP7CBP-CoL841vB.js";import"./chunk-L5ZTLDWV-Brr6wA9I.js";import"./chunk-55IACEB6-o0ADQlnq.js";import"./chunk-2J33WTMH-LudE8z-b.js";import"./chunk-NZK2D7GU-CEyXOVMI.js";import"./chunk-3OPIFGDE-BxaQxo50.js";import"./chunk-KSCS5N6A-D67-Zs6D.js";import"./chunk-LZXEDZCA-e3dTHwrC.js";import{i as t,n,r,t as i}from"./chunk-AQP2D5EJ-B5pw4PfB.js";var a={parser:n,get db(){return new i(2)},renderer:r,styles:t,init:e(e=>{e.state||={},e.state.arrowMarkerAbsolute=e.arrowMarkerAbsolute},`init`)};export{a as diagram};
@@ -1,2 +0,0 @@
1
- import { C as replyToPrComment, d as fetchPrChecks, n as buildReviewPayload } from "./github-Cf5blBty.mjs";
2
- export { buildReviewPayload, fetchPrChecks, replyToPrComment };