diffing 0.10.5 → 0.12.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 (182) hide show
  1. package/README.md +76 -41
  2. package/dist/{cli-agent-BJiATn11.mjs → cli-agent-CWsOHN-j.mjs} +198 -57
  3. package/dist/{cli-gh-_bkDCxhh.mjs → cli-gh-DI69gJGo.mjs} +27 -17
  4. package/dist/cli.mjs +189 -229
  5. package/dist/client/assets/{angular-html-CBcwKYDC.js → angular-html-PLPuQo0k.js} +1 -1
  6. package/dist/client/assets/{angular-ts-DRBYUaJA.js → angular-ts-CE02Ij4b.js} +1 -1
  7. package/dist/client/assets/{apl-BM0X8jeL.js → apl-CsuUKZoi.js} +1 -1
  8. package/dist/client/assets/{arc-DTkmmKl3.js → arc-CgL5kFe-.js} +1 -1
  9. package/dist/client/assets/{architectureDiagram-3BPJPVTR-Cw75ay7q.js → architectureDiagram-3BPJPVTR-DxZQWGnx.js} +1 -1
  10. package/dist/client/assets/{astro-DKTNkoRZ.js → astro-DkFc7sbz.js} +1 -1
  11. package/dist/client/assets/{blade-DaM7a9Zp.js → blade-BkY07kcC.js} +1 -1
  12. package/dist/client/assets/{blockDiagram-GPEHLZMM-DAzINMr_.js → blockDiagram-GPEHLZMM-D5a2KZV2.js} +1 -1
  13. package/dist/client/assets/{c-B3C0Or4o.js → c-T1BrPfJ6.js} +1 -1
  14. package/dist/client/assets/{c4Diagram-AAUBKEIU-C7SsS28g.js → c4Diagram-AAUBKEIU-mpMH4kFC.js} +1 -1
  15. package/dist/client/assets/channel-D3niKhl0.js +1 -0
  16. package/dist/client/assets/{chunk-2J33WTMH-DHOUGWx8.js → chunk-2J33WTMH-vMtgRLFH.js} +1 -1
  17. package/dist/client/assets/{chunk-3OPIFGDE-D8d2scLX.js → chunk-3OPIFGDE-Dx-FqyO2.js} +1 -1
  18. package/dist/client/assets/{chunk-4BX2VUAB-BSC-E5yg.js → chunk-4BX2VUAB-CUrPd8Kv.js} +1 -1
  19. package/dist/client/assets/{chunk-55IACEB6-27pC5pKn.js → chunk-55IACEB6-DHg3Nr8A.js} +1 -1
  20. package/dist/client/assets/{chunk-5ZQYHXKU-BM60x82y.js → chunk-5ZQYHXKU-CpDPvbGs.js} +1 -1
  21. package/dist/client/assets/{chunk-727SXJPM-CHCF96vE.js → chunk-727SXJPM-3VOGMxwk.js} +1 -1
  22. package/dist/client/assets/{chunk-AQP2D5EJ-BoVsvmTa.js → chunk-AQP2D5EJ-4dbfbIS6.js} +1 -1
  23. package/dist/client/assets/{chunk-BSJP7CBP-Iip4uSio.js → chunk-BSJP7CBP-Dfyn0Uwp.js} +1 -1
  24. package/dist/client/assets/{chunk-CSCIHK7Q-DuIWPyay.js → chunk-CSCIHK7Q-VTpSKo0F.js} +1 -1
  25. package/dist/client/assets/{chunk-FMBD7UC4-Du6rtd2k.js → chunk-FMBD7UC4-kXD1MyOL.js} +1 -1
  26. package/dist/client/assets/{chunk-KSCS5N6A-BBq105vI.js → chunk-KSCS5N6A-BrVoWOAb.js} +1 -1
  27. package/dist/client/assets/{chunk-L5ZTLDWV-0DmB5Qp8.js → chunk-L5ZTLDWV-wZEQDPsa.js} +1 -1
  28. package/dist/client/assets/{chunk-LZXEDZCA-CoRsjUfr.js → chunk-LZXEDZCA-D3i0B0eg.js} +2 -2
  29. package/dist/client/assets/{chunk-ND2GUHAM-tX8cKEls.js → chunk-ND2GUHAM-hDVHT0bN.js} +1 -1
  30. package/dist/client/assets/{chunk-NZK2D7GU-BoJGgPic.js → chunk-NZK2D7GU-jQUfhp9h.js} +1 -1
  31. package/dist/client/assets/{chunk-O5CBEL6O-mlwCWs97.js → chunk-O5CBEL6O-CX_vPWhk.js} +1 -1
  32. package/dist/client/assets/chunk-QZHKN3VN-CZLFuGpt.js +1 -0
  33. package/dist/client/assets/chunk-WU5MYG2G-BhcpjkaB.js +1 -0
  34. package/dist/client/assets/{chunk-XPW4576I-B5efww8M.js → chunk-XPW4576I-Co_-vDB4.js} +1 -1
  35. package/dist/client/assets/classDiagram-4FO5ZUOK-DK5KJNIt.js +1 -0
  36. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-y5K9t6Se.js +1 -0
  37. package/dist/client/assets/{cobol-De9QR_Td.js → cobol-8-qBLs-a.js} +1 -1
  38. package/dist/client/assets/{coffee-Ct_GvuHP.js → coffee-Bjz5lkyW.js} +1 -1
  39. package/dist/client/assets/{cose-bilkent-S5V4N54A-ATaJZGF7.js → cose-bilkent-S5V4N54A-BljJ0FSA.js} +1 -1
  40. package/dist/client/assets/{cpp-Dw52w9cj.js → cpp-5BVQCBXT.js} +1 -1
  41. package/dist/client/assets/{crystal-Dx8ADdsd.js → crystal-CCkY93GS.js} +1 -1
  42. package/dist/client/assets/{css-CZ13XvDU.js → css-BTM7Tp2a.js} +1 -1
  43. package/dist/client/assets/{dagre-BM42HDAG-aDltuYut.js → dagre-BM42HDAG-BSynd_2D.js} +1 -1
  44. package/dist/client/assets/{diagram-2AECGRRQ-DGWnHVMJ.js → diagram-2AECGRRQ-K3E2CVdy.js} +1 -1
  45. package/dist/client/assets/{diagram-5GNKFQAL-Dd7eZBKe.js → diagram-5GNKFQAL-BQHIrfKc.js} +1 -1
  46. package/dist/client/assets/{diagram-KO2AKTUF-DWThXREf.js → diagram-KO2AKTUF-Bqs8sNN4.js} +1 -1
  47. package/dist/client/assets/{diagram-LMA3HP47-CXR4Bjtc.js → diagram-LMA3HP47-C9K4bpQe.js} +1 -1
  48. package/dist/client/assets/{diagram-OG6HWLK6-D4Cbf0nW.js → diagram-OG6HWLK6-DK6wIXY2.js} +1 -1
  49. package/dist/client/assets/{dist-CUDhrHNw.js → dist-1nkZYMRy.js} +1 -1
  50. package/dist/client/assets/{edge-CQCjdJKj.js → edge-DqN2FJce.js} +1 -1
  51. package/dist/client/assets/{elixir-bkjwPazA.js → elixir-BiAgRUFF.js} +1 -1
  52. package/dist/client/assets/{elm-CCweX5Cq.js → elm-N1IbY8sz.js} +1 -1
  53. package/dist/client/assets/{erDiagram-TEJ5UH35-BmAyt7SU.js → erDiagram-TEJ5UH35-jsHCiP02.js} +1 -1
  54. package/dist/client/assets/{erb-D-Z-KBLp.js → erb-B-yYlWAZ.js} +1 -1
  55. package/dist/client/assets/{flowDiagram-I6XJVG4X-C6nIFUVc.js → flowDiagram-I6XJVG4X-DOB1dAWG.js} +1 -1
  56. package/dist/client/assets/{ganttDiagram-6RSMTGT7-DMlxThBf.js → ganttDiagram-6RSMTGT7-BYIewcY5.js} +1 -1
  57. package/dist/client/assets/{git-rebase-BdoFdenB.js → git-rebase-CVkPxOAF.js} +1 -1
  58. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-JaIFkAIT.js → gitGraphDiagram-PVQCEYII-VNQzbpv2.js} +1 -1
  59. package/dist/client/assets/{glimmer-js-CZQrBJKq.js → glimmer-js-BmG1xm72.js} +1 -1
  60. package/dist/client/assets/{glimmer-ts-CBYW46D4.js → glimmer-ts-CvTgwZsg.js} +1 -1
  61. package/dist/client/assets/{glsl-wxixKkY_.js → glsl-DwjNNCbW.js} +1 -1
  62. package/dist/client/assets/{graphql-CqZ0Lo5a.js → graphql-BvgkyF8E.js} +1 -1
  63. package/dist/client/assets/{hack-rqWymQRV.js → hack-DH3188x2.js} +1 -1
  64. package/dist/client/assets/{haml-DFw_IoGM.js → haml-B0GTfMhX.js} +1 -1
  65. package/dist/client/assets/{handlebars-3VmTVMYt.js → handlebars-he7hLDd9.js} +1 -1
  66. package/dist/client/assets/{html-C0Li76jB.js → html-DIYgdTBq.js} +1 -1
  67. package/dist/client/assets/{html-derivative-CO-RQW8y.js → html-derivative-2s6MXlci.js} +1 -1
  68. package/dist/client/assets/{http-sPrZOeBY.js → http-COS23XJP.js} +1 -1
  69. package/dist/client/assets/{hurl-DUoPe4Lc.js → hurl-BlZPjeJt.js} +1 -1
  70. package/dist/client/assets/index-BrEVVQOB.js +4021 -0
  71. package/dist/client/assets/index-BsuX6HVI.css +1 -0
  72. package/dist/client/assets/{infoDiagram-5YYISTIA-B6AZ5SCV.js → infoDiagram-5YYISTIA-DQRqk24I.js} +1 -1
  73. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-CytMrpo8.js → ishikawaDiagram-YF4QCWOH-DU1rqrLx.js} +1 -1
  74. package/dist/client/assets/{java-Cj0G6QRg.js → java-BAa5w-Qd.js} +1 -1
  75. package/dist/client/assets/{javascript-d5SUuyWD.js → javascript-C9e02ssI.js} +1 -1
  76. package/dist/client/assets/{jinja-BTw9k0vO.js → jinja-Bx37xXwq.js} +1 -1
  77. package/dist/client/assets/{jison-9xSVvR1q.js → jison-m_DEf8Jo.js} +1 -1
  78. package/dist/client/assets/{journeyDiagram-JHISSGLW-Bd4jZUYI.js → journeyDiagram-JHISSGLW-CoHlfevf.js} +1 -1
  79. package/dist/client/assets/{json-DjAt53ka.js → json-DtN5AWRW.js} +1 -1
  80. package/dist/client/assets/{jsx-BX5KmQ7d.js → jsx-BlPpu8bR.js} +1 -1
  81. package/dist/client/assets/{julia-CLLx1dHC.js → julia-BAOmCbHl.js} +1 -1
  82. package/dist/client/assets/{just-C0v80bKe.js → just-C_bvVjwE.js} +1 -1
  83. package/dist/client/assets/{kanban-definition-UN3LZRKU-Ds4pXHJa.js → kanban-definition-UN3LZRKU-BiqYI7_m.js} +1 -1
  84. package/dist/client/assets/{latex-DY-oQfwO.js → latex-81pMfNMt.js} +1 -1
  85. package/dist/client/assets/{line-BbSLfOl6.js → line-DCovs9My.js} +1 -1
  86. package/dist/client/assets/{linear-BMIZJAAR.js → linear-cJF5XHE7.js} +1 -1
  87. package/dist/client/assets/{liquid-DDHDgbZx.js → liquid-sKRTk6dT.js} +1 -1
  88. package/dist/client/assets/{lua-CXymerKS.js → lua-C1uZL4IF.js} +1 -1
  89. package/dist/client/assets/{marko-DoPFsptl.js → marko-BKEzP1CL.js} +1 -1
  90. package/dist/client/assets/{mdc-BxSmTphd.js → mdc-CLkfm94H.js} +1 -1
  91. package/dist/client/assets/{mermaid-parser.core-CcYSvN4q.js → mermaid-parser.core-CTsTbvb2.js} +1 -1
  92. package/dist/client/assets/{mermaid.core-COTNtqgQ.js → mermaid.core-D86HJEwL.js} +3 -3
  93. package/dist/client/assets/{mindmap-definition-RKZ34NQL-BTxraRzn.js → mindmap-definition-RKZ34NQL-CL3heUmL.js} +1 -1
  94. package/dist/client/assets/{nginx-Bma0jNOT.js → nginx-eDGm66pc.js} +1 -1
  95. package/dist/client/assets/{nim-DMBpjygU.js → nim-CoWZPv8-.js} +1 -1
  96. package/dist/client/assets/{perl-CrnrV-AJ.js → perl-MoMqtMVr.js} +1 -1
  97. package/dist/client/assets/{php-CDYxzX6t.js → php-DXXVMAtN.js} +1 -1
  98. package/dist/client/assets/{pieDiagram-4H26LBE5-DglRmzer.js → pieDiagram-4H26LBE5-CWV3TMu4.js} +1 -1
  99. package/dist/client/assets/{pug-DNewy3GU.js → pug-CPWaB94J.js} +1 -1
  100. package/dist/client/assets/{qml-COjcnZ-W.js → qml-lhvpx8vk.js} +1 -1
  101. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-BjSmyES7.js → quadrantDiagram-W4KKPZXB-QV25BYos.js} +1 -1
  102. package/dist/client/assets/{r-CrCaMxLS.js → r-DYbUnmmK.js} +1 -1
  103. package/dist/client/assets/{razor-jeuOZIar.js → razor-DcyOLv96.js} +1 -1
  104. package/dist/client/assets/{regexp-DSHVUX08.js → regexp-BdY10jm0.js} +1 -1
  105. package/dist/client/assets/{requirementDiagram-4Y6WPE33-B4f430jS.js → requirementDiagram-4Y6WPE33-BPMsmU6J.js} +1 -1
  106. package/dist/client/assets/{review-export-Cen1WEcX.js → review-export-CMwjJURs.js} +1 -1
  107. package/dist/client/assets/{rst-CIDgytzc.js → rst-6ShFOzgH.js} +1 -1
  108. package/dist/client/assets/{ruby-DtuseoNq.js → ruby-B04DeVbi.js} +1 -1
  109. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-TQPPlxc6.js → sankeyDiagram-5OEKKPKP-DQJeroPp.js} +1 -1
  110. package/dist/client/assets/{sas-C72Theia.js → sas-Dj26ftNa.js} +1 -1
  111. package/dist/client/assets/{scss-ClECtwRk.js → scss-BOHpBkgl.js} +1 -1
  112. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-D1tx07Wg.js → sequenceDiagram-3UESZ5HK-DdV0Y6Sz.js} +1 -1
  113. package/dist/client/assets/{shellscript-BCwBsi2k.js → shellscript-CpHwjRcU.js} +1 -1
  114. package/dist/client/assets/{shellsession-BrOddEl5.js → shellsession-BJAvf4GN.js} +1 -1
  115. package/dist/client/assets/{soy-Dcs0GWFW.js → soy-B67bZJnL.js} +1 -1
  116. package/dist/client/assets/{sql-BAjA7Gv7.js → sql-8MzOqSsK.js} +1 -1
  117. package/dist/client/assets/{src-CYYhkqTK.js → src-AaoRSmFl.js} +1 -1
  118. package/dist/client/assets/{stata-19ngQtzR.js → stata-aCME945h.js} +1 -1
  119. package/dist/client/assets/{stateDiagram-AJRCARHV-BZRCEzb5.js → stateDiagram-AJRCARHV-CMD_Xj2M.js} +1 -1
  120. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-vLl7D4ue.js +1 -0
  121. package/dist/client/assets/{surrealql-Ce2TBRjE.js → surrealql-B_V_HxAi.js} +1 -1
  122. package/dist/client/assets/{svelte-DQ_1eGZz.js → svelte-BcQvTlqz.js} +1 -1
  123. package/dist/client/assets/{templ-Cw2DDxWF.js → templ-DZCQ2blz.js} +1 -1
  124. package/dist/client/assets/{tex-myDSO2eP.js → tex-BfeQ5Wuu.js} +1 -1
  125. package/dist/client/assets/{timeline-definition-PNZ67QCA-CP0OZhBT.js → timeline-definition-PNZ67QCA-CyIS7Zoe.js} +1 -1
  126. package/dist/client/assets/{ts-tags-rh39ZwVs.js → ts-tags-DVWE0E87.js} +1 -1
  127. package/dist/client/assets/{tsx-B0-26jrU.js → tsx-DdJ7Sfqf.js} +1 -1
  128. package/dist/client/assets/{twig-CgasHzPb.js → twig-_gVgaha5.js} +1 -1
  129. package/dist/client/assets/{typescript-Dq3T0c-m.js → typescript-Bj0_LzZV.js} +1 -1
  130. package/dist/client/assets/{vennDiagram-CIIHVFJN-DHaKHj0j.js → vennDiagram-CIIHVFJN-C-J2kWyk.js} +1 -1
  131. package/dist/client/assets/{vue-CzFVh92-.js → vue-Dnt_GBRb.js} +1 -1
  132. package/dist/client/assets/{vue-html-Bv2uFkTH.js → vue-html-ClVA5__5.js} +1 -1
  133. package/dist/client/assets/{vue-vine-DzieBk9Y.js → vue-vine-BCcz4SVP.js} +1 -1
  134. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-Dky7jxlZ.js → wardleyDiagram-YWT4CUSO-Dzt4EPh8.js} +1 -1
  135. package/dist/client/assets/{xml-wcdHRHN8.js → xml-BYeUHEti.js} +1 -1
  136. package/dist/client/assets/{xsl-CXrwsLG9.js → xsl-Vsx0SZEV.js} +1 -1
  137. package/dist/client/assets/{xychartDiagram-2RQKCTM6-BQ2hG60h.js → xychartDiagram-2RQKCTM6-BAWZKvwP.js} +1 -1
  138. package/dist/client/assets/{yaml-lO6lK6Xe.js → yaml-C6L1khMK.js} +1 -1
  139. package/dist/client/index.html +2 -2
  140. package/dist/{completions-3UF8uzhx.mjs → completions-DvyV49HY.mjs} +22 -1
  141. package/dist/{doctor-BGYZNIYP.mjs → doctor-Bz9VHuBI.mjs} +7 -6
  142. package/dist/find-tui-binary-DVQADOSF.mjs +101 -0
  143. package/dist/{git-Czo96ymM.mjs → git-BGj31GX-.mjs} +71 -7
  144. package/dist/git-CfDSkUcE.mjs +2 -0
  145. package/dist/{github-DKT0lJXv.mjs → github-DXiEeHzk.mjs} +1 -1
  146. package/dist/{github-CEjtGd41.mjs → github-DpzqNrUh.mjs} +3 -3
  147. package/dist/{github-attachments-Cf17YWp4.mjs → github-attachments-DgOf7BhP.mjs} +2 -2
  148. package/dist/{mcp-Dq7J5QOP.mjs → mcp-zDVzU1vl.mjs} +42 -33
  149. package/dist/native/tui-darwin-arm64/diffing-tui +0 -0
  150. package/dist/native/tui-darwin-x64/diffing-tui +0 -0
  151. package/dist/native/tui-linux-arm64-gnu/diffing-tui +0 -0
  152. package/dist/native/tui-linux-arm64-musl/diffing-tui +0 -0
  153. package/dist/native/tui-linux-x64-gnu/diffing-tui +0 -0
  154. package/dist/native/tui-linux-x64-musl/diffing-tui +0 -0
  155. package/dist/native/tui-win32-x64-msvc/diffing-tui.exe +0 -0
  156. package/dist/{review-export-BBDWvftT.mjs → review-export-B63eRAVa.mjs} +1 -1
  157. package/dist/{settings-bwe7yQ8U.mjs → search-3R2E5xxr.mjs} +133 -98
  158. package/dist/search-CQ4nsjBX.mjs +2 -0
  159. package/dist/{server-C9i4V36o.mjs → server-Dw3lkQ5q.mjs} +296 -110
  160. package/dist/server-lock-BNI8FKV1.mjs +427 -0
  161. package/dist/session-conflict-Bqt1M4Mp.mjs +96 -0
  162. package/dist/session-manager-BKSZQqDJ.mjs +159 -0
  163. package/dist/session-url-sr7lXXVc.mjs +100 -0
  164. package/dist/tui-search-bridge-BGgLCwMF.mjs +133 -0
  165. package/dist/{update-check-DUuHmPeZ.mjs → update-check-BUfh4Y6c.mjs} +16 -15
  166. package/package.json +9 -4
  167. package/dist/client/assets/channel-lsVHTuYR.js +0 -1
  168. package/dist/client/assets/chunk-QZHKN3VN-AHUiTM0z.js +0 -1
  169. package/dist/client/assets/chunk-WU5MYG2G-D41j4yxb.js +0 -1
  170. package/dist/client/assets/classDiagram-4FO5ZUOK-D1Eo3kly.js +0 -1
  171. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-bAMsbsfB.js +0 -1
  172. package/dist/client/assets/index-B42c0TyV.css +0 -1
  173. package/dist/client/assets/index-BN_-di_r.js +0 -3959
  174. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-Da-mGMA2.js +0 -1
  175. package/dist/find-tui-binary-CRpbYXLC.mjs +0 -52
  176. package/dist/git-DaP_1rVy.mjs +0 -2
  177. package/dist/server-lock-Dd_ss_Il.mjs +0 -153
  178. /package/dist/{apply-suggestion-DNNsC5gx.mjs → apply-suggestion-CHYnw68I.mjs} +0 -0
  179. /package/dist/{comment-format-B5AcGcR-.mjs → comment-format-B85NHZnG.mjs} +0 -0
  180. /package/dist/{diff-fingerprint-C8YO3TTE.mjs → diff-fingerprint-BgR0tu1o.mjs} +0 -0
  181. /package/dist/{handoff-DPoIyeWn.mjs → handoff-LAFtmnHf.mjs} +0 -0
  182. /package/dist/{plan-format-BQyx--mp.mjs → plan-format-BwJh5JSE.mjs} +0 -0
@@ -1,8 +1,9 @@
1
- import { d as getProjectStorageDir } from "./git-Czo96ymM.mjs";
2
- import { t as formatComments } from "./comment-format-B5AcGcR-.mjs";
3
- import { n as formatPlanReview } from "./plan-format-BQyx--mp.mjs";
4
- import { i as readServerLock, r as isLockAlive } from "./server-lock-Dd_ss_Il.mjs";
5
- import { a as CLI_AWAIT_REVIEW_TIMEOUT_HINT, i as CLI_AWAIT_PLAN_TIMEOUT_HINT, o as CLI_PLAN_SUBMIT_PARK_HINT } from "./handoff-DPoIyeWn.mjs";
1
+ import { f as getProjectStorageDir } from "./git-BGj31GX-.mjs";
2
+ import { a as loadSettings, i as reviewSessionUrl, o as saveSettings, t as appendSessionToken } from "./session-url-sr7lXXVc.mjs";
3
+ import { t as formatComments } from "./comment-format-B85NHZnG.mjs";
4
+ import { n as formatPlanReview } from "./plan-format-BwJh5JSE.mjs";
5
+ import { h as SESSION_TOKEN_HEADER, u as resolveActiveServerLock } from "./server-lock-BNI8FKV1.mjs";
6
+ import { a as CLI_AWAIT_REVIEW_TIMEOUT_HINT, i as CLI_AWAIT_PLAN_TIMEOUT_HINT, o as CLI_PLAN_SUBMIT_PARK_HINT } from "./handoff-LAFtmnHf.mjs";
6
7
  import { join } from "node:path";
7
8
  import { parseArgs } from "node:util";
8
9
  import { mkdir, readFile, writeFile } from "node:fs/promises";
@@ -24,26 +25,51 @@ const EXIT_NO_SERVER = 3;
24
25
  const EXIT_NOT_FOUND = 4;
25
26
  const EXIT_USAGE = 5;
26
27
  let activeCapability;
28
+ let activeAuthToken;
27
29
  /** Resolve the running server's base URL from the lockfile, or exit cleanly. */
28
30
  function baseUrl() {
29
- const lock = readServerLock();
30
- if (!lock || !isLockAlive(lock)) {
31
+ const lock = resolveActiveServerLock();
32
+ if (!lock) {
31
33
  console.error("No diffing server running for this repo. Start one with `diffing`.");
32
34
  process.exit(EXIT_NO_SERVER);
33
35
  }
34
36
  const host = lock.host === "0.0.0.0" || lock.host === "::" ? "127.0.0.1" : lock.host;
35
37
  activeCapability = lock.mode === "tui" ? lock.capability : void 0;
38
+ activeAuthToken = lock.authToken;
36
39
  return `http://${host}:${lock.port}`;
37
40
  }
38
- /** Attach the per-session TUI capability while preserving ordinary web calls. */
41
+ /** Attach session credentials while preserving ordinary web calls. */
39
42
  function apiFetch(input, init = {}) {
40
43
  const headers = new Headers(init.headers);
41
44
  if (activeCapability) headers.set("X-Diffing-Capability", activeCapability);
45
+ if (activeAuthToken) headers.set(SESSION_TOKEN_HEADER, activeAuthToken);
42
46
  return fetch(input, {
43
47
  ...init,
44
48
  headers
45
49
  });
46
50
  }
51
+ function connectionErrorMessage(err) {
52
+ if (err instanceof Error) return err.message;
53
+ return String(err);
54
+ }
55
+ /** apiFetch wrapper that logs connection failures and returns null instead of throwing. */
56
+ async function tryApiFetch(input, init) {
57
+ try {
58
+ return await apiFetch(input, init);
59
+ } catch (err) {
60
+ console.error(`Failed to reach diffing server: ${connectionErrorMessage(err)}`);
61
+ return null;
62
+ }
63
+ }
64
+ function parseTimeoutSeconds(raw, flag = "--timeout") {
65
+ if (raw === void 0) return 570;
66
+ const t = Number(raw);
67
+ if (!Number.isFinite(t) || t <= 0) {
68
+ console.error(`${flag} must be a positive number of seconds.`);
69
+ return null;
70
+ }
71
+ return t;
72
+ }
47
73
  async function readStdin() {
48
74
  const chunks = [];
49
75
  for await (const chunk of process.stdin) chunks.push(chunk);
@@ -67,7 +93,9 @@ async function awaitReview(args) {
67
93
  },
68
94
  allowPositionals: false
69
95
  });
70
- const totalBudgetMs = (values.timeout ? Number(values.timeout) : 570) * 1e3;
96
+ const timeoutSeconds = parseTimeoutSeconds(values.timeout);
97
+ if (timeoutSeconds === null) return EXIT_USAGE;
98
+ const totalBudgetMs = timeoutSeconds * 1e3;
71
99
  const base = baseUrl();
72
100
  let agentId = typeof values["agent-id"] === "string" ? values["agent-id"] : void 0;
73
101
  try {
@@ -83,9 +111,8 @@ async function awaitReview(args) {
83
111
  if (reg.ok) agentId = (await reg.json()).agentId ?? agentId;
84
112
  } catch {}
85
113
  let sinceRound = 0;
86
- try {
87
- sinceRound = (await apiFetch(`${base}/api/review/status`).then((r) => r.json())).round ?? 0;
88
- } catch {}
114
+ const statusRes = await tryApiFetch(`${base}/api/review/status`);
115
+ if (statusRes?.ok) sinceRound = (await statusRes.json()).round ?? 0;
89
116
  const unregister = async () => {
90
117
  if (!agentId) return;
91
118
  try {
@@ -99,10 +126,15 @@ async function awaitReview(args) {
99
126
  res = await apiFetch(`${base}/api/review/await?timeoutMs=25000&sinceRound=${sinceRound}`, { signal: AbortSignal.timeout(3e4) });
100
127
  } catch (err) {
101
128
  if (err?.name === "TimeoutError") continue;
102
- console.error(`Failed to reach diffing server: ${err?.message ?? err}`);
129
+ console.error(`Failed to reach diffing server: ${connectionErrorMessage(err)}`);
103
130
  await unregister();
104
131
  return EXIT_NO_SERVER;
105
132
  }
133
+ if (!res.ok) {
134
+ console.error(`Failed to await review: HTTP ${res.status}`);
135
+ await unregister();
136
+ return 1;
137
+ }
106
138
  const result = await res.json();
107
139
  if (result.status === "released") {
108
140
  process.stdout.write(result.payload.commentXml + "\n");
@@ -138,12 +170,18 @@ async function reply(args) {
138
170
  return EXIT_USAGE;
139
171
  }
140
172
  let body = values.body;
141
- if (body === "-" || body === void 0) body = (await readStdin()).trim();
173
+ if (body === void 0) {
174
+ if (process.stdin.isTTY) {
175
+ console.error("Usage: diffing reply <commentId> --body <text> [--model <name>]");
176
+ return EXIT_USAGE;
177
+ }
178
+ body = (await readStdin()).trim();
179
+ } else if (body === "-") body = (await readStdin()).trim();
142
180
  if (!body) {
143
181
  console.error("A reply body is required (--body <text> or pipe via stdin).");
144
182
  return EXIT_USAGE;
145
183
  }
146
- const res = await apiFetch(`${baseUrl()}/api/comments/${commentId}/replies`, {
184
+ const res = await tryApiFetch(`${baseUrl()}/api/comments/${commentId}/replies`, {
147
185
  method: "POST",
148
186
  headers: { "Content-Type": "application/json" },
149
187
  body: JSON.stringify({
@@ -152,6 +190,7 @@ async function reply(args) {
152
190
  model: values.model
153
191
  })
154
192
  });
193
+ if (!res) return EXIT_NO_SERVER;
155
194
  if (res.status === 404) {
156
195
  console.error(`Comment ${commentId} not found.`);
157
196
  return EXIT_NOT_FOUND;
@@ -174,11 +213,12 @@ async function resolve$1(args) {
174
213
  console.error("Usage: diffing resolve <commentId>");
175
214
  return EXIT_USAGE;
176
215
  }
177
- const res = await apiFetch(`${baseUrl()}/api/comments/${commentId}`, {
216
+ const res = await tryApiFetch(`${baseUrl()}/api/comments/${commentId}`, {
178
217
  method: "PUT",
179
218
  headers: { "Content-Type": "application/json" },
180
219
  body: JSON.stringify({ status: "resolved" })
181
220
  });
221
+ if (!res) return EXIT_NO_SERVER;
182
222
  if (res.status === 404) {
183
223
  console.error(`Comment ${commentId} not found.`);
184
224
  return EXIT_NOT_FOUND;
@@ -201,11 +241,12 @@ async function unresolve(args) {
201
241
  console.error("Usage: diffing unresolve <commentId>");
202
242
  return EXIT_USAGE;
203
243
  }
204
- const res = await apiFetch(`${baseUrl()}/api/comments/${commentId}`, {
244
+ const res = await tryApiFetch(`${baseUrl()}/api/comments/${commentId}`, {
205
245
  method: "PUT",
206
246
  headers: { "Content-Type": "application/json" },
207
247
  body: JSON.stringify({ status: "open" })
208
248
  });
249
+ if (!res) return EXIT_NO_SERVER;
209
250
  if (res.status === 404) {
210
251
  console.error(`Comment ${commentId} not found.`);
211
252
  return EXIT_NOT_FOUND;
@@ -232,16 +273,23 @@ async function commentEdit(args) {
232
273
  return EXIT_USAGE;
233
274
  }
234
275
  let body = values.body;
235
- if (body === "-" || body === void 0) body = (await readStdin()).trim();
276
+ if (body === void 0) {
277
+ if (process.stdin.isTTY) {
278
+ console.error("Usage: diffing comment edit <commentId> --body <text>");
279
+ return EXIT_USAGE;
280
+ }
281
+ body = (await readStdin()).trim();
282
+ } else if (body === "-") body = (await readStdin()).trim();
236
283
  if (!body) {
237
284
  console.error("A body is required (--body <text> or stdin).");
238
285
  return EXIT_USAGE;
239
286
  }
240
- const res = await apiFetch(`${baseUrl()}/api/comments/${commentId}`, {
287
+ const res = await tryApiFetch(`${baseUrl()}/api/comments/${commentId}`, {
241
288
  method: "PUT",
242
289
  headers: { "Content-Type": "application/json" },
243
290
  body: JSON.stringify({ body })
244
291
  });
292
+ if (!res) return EXIT_NO_SERVER;
245
293
  if (res.status === 404) {
246
294
  console.error(`Comment ${commentId} not found.`);
247
295
  return EXIT_NOT_FOUND;
@@ -264,7 +312,8 @@ async function commentDelete(args) {
264
312
  console.error("Usage: diffing comment delete <commentId>");
265
313
  return EXIT_USAGE;
266
314
  }
267
- const res = await apiFetch(`${baseUrl()}/api/comments/${commentId}`, { method: "DELETE" });
315
+ const res = await tryApiFetch(`${baseUrl()}/api/comments/${commentId}`, { method: "DELETE" });
316
+ if (!res) return EXIT_NO_SERVER;
268
317
  if (res.status === 404) {
269
318
  console.error(`Comment ${commentId} not found.`);
270
319
  return EXIT_NOT_FOUND;
@@ -288,7 +337,13 @@ async function commentCmd(args) {
288
337
  }
289
338
  }
290
339
  async function url() {
291
- process.stdout.write(baseUrl() + "\n");
340
+ const lock = resolveActiveServerLock();
341
+ if (!lock) {
342
+ console.error("No diffing server running for this repo. Start one with `diffing`.");
343
+ process.exit(EXIT_NO_SERVER);
344
+ }
345
+ const printed = reviewSessionUrl(lock) ?? baseUrl();
346
+ process.stdout.write(`${printed}\n`);
292
347
  return EXIT_OK;
293
348
  }
294
349
  async function comments(args) {
@@ -301,16 +356,50 @@ async function comments(args) {
301
356
  },
302
357
  allowPositionals: false
303
358
  });
304
- const all = await apiFetch(`${baseUrl()}/api/comments`).then((r) => r.json());
359
+ const res = await tryApiFetch(`${baseUrl()}/api/comments`);
360
+ if (!res) return EXIT_NO_SERVER;
361
+ if (!res.ok) {
362
+ console.error(`Failed to fetch comments: HTTP ${res.status}`);
363
+ return 1;
364
+ }
365
+ const all = await res.json();
305
366
  const selected = values.open ? all.filter((c) => c.status === "open") : all;
306
367
  const format = values.format?.toLowerCase();
368
+ if (format && format !== "xml" && format !== "json" && format !== "md" && format !== "markdown") {
369
+ console.error("Unknown --format. Use xml, json, md, or markdown.");
370
+ return EXIT_USAGE;
371
+ }
307
372
  if (values.json || format === "json") process.stdout.write(JSON.stringify(selected, null, 2) + "\n");
308
373
  else if (format === "markdown" || format === "md") {
309
- const { formatCommentsMarkdown } = await import("./review-export-BBDWvftT.mjs");
374
+ const { formatCommentsMarkdown } = await import("./review-export-B63eRAVa.mjs");
310
375
  process.stdout.write(formatCommentsMarkdown(selected) + "\n");
311
376
  } else process.stdout.write(formatComments(selected) + "\n");
312
377
  return EXIT_OK;
313
378
  }
379
+ function mode(args) {
380
+ if (args.length === 0) {
381
+ process.stdout.write(loadSettings().defaultMode + "\n");
382
+ return EXIT_OK;
383
+ }
384
+ if (args.length === 1 && (args[0] === "--help" || args[0] === "-h")) {
385
+ process.stdout.write("Usage: diffing mode <web|tui>\n");
386
+ return EXIT_OK;
387
+ }
388
+ const requested = args[0];
389
+ if (args.length !== 1 || requested !== "web" && requested !== "tui") {
390
+ console.error("Usage: diffing mode <web|tui>");
391
+ return EXIT_USAGE;
392
+ }
393
+ try {
394
+ saveSettings({ defaultMode: requested });
395
+ } catch (error) {
396
+ const detail = error instanceof Error ? error.message : String(error);
397
+ console.error(`Failed to save default mode: ${detail}`);
398
+ return 1;
399
+ }
400
+ process.stdout.write(`Default mode set to ${requested}.\n`);
401
+ return EXIT_OK;
402
+ }
314
403
  /** Derive a human title from a plan's first heading or non-empty line. */
315
404
  function deriveTitle(body) {
316
405
  for (const raw of body.split("\n")) {
@@ -324,9 +413,10 @@ function deriveTitle(body) {
324
413
  /** Long-poll the plan-review handoff until a decision arrives or time runs out. */
325
414
  async function pollPlanDecision(base, totalBudgetMs, seedSince) {
326
415
  let sinceRound = seedSince ?? 0;
327
- if (seedSince === void 0) try {
328
- sinceRound = (await apiFetch(`${base}/api/plan-review/status`).then((r) => r.json())).round ?? 0;
329
- } catch {}
416
+ if (seedSince === void 0) {
417
+ const statusRes = await tryApiFetch(`${base}/api/plan-review/status`);
418
+ if (statusRes?.ok) sinceRound = (await statusRes.json()).round ?? 0;
419
+ }
330
420
  const deadline = Date.now() + totalBudgetMs;
331
421
  while (Date.now() < deadline) {
332
422
  let res;
@@ -334,9 +424,13 @@ async function pollPlanDecision(base, totalBudgetMs, seedSince) {
334
424
  res = await apiFetch(`${base}/api/plan-review/await?timeoutMs=25000&sinceRound=${sinceRound}`, { signal: AbortSignal.timeout(3e4) });
335
425
  } catch (err) {
336
426
  if (err?.name === "TimeoutError") continue;
337
- console.error(`Failed to reach diffing server: ${err?.message ?? err}`);
427
+ console.error(`Failed to reach diffing server: ${connectionErrorMessage(err)}`);
338
428
  return EXIT_NO_SERVER;
339
429
  }
430
+ if (!res.ok) {
431
+ console.error(`Failed to await plan review: HTTP ${res.status}`);
432
+ return 1;
433
+ }
340
434
  const result = await res.json();
341
435
  if (result.status === "released") {
342
436
  process.stdout.write(result.payload.reviewXml + "\n");
@@ -403,10 +497,11 @@ async function planSubmit(args) {
403
497
  source = file;
404
498
  }
405
499
  let sinceRound = 0;
406
- if (values.wait) try {
407
- sinceRound = (await apiFetch(`${base}/api/plan-review/status`).then((r) => r.json())).round ?? 0;
408
- } catch {}
409
- const res = await apiFetch(`${base}/api/plans`, {
500
+ if (values.wait) {
501
+ const statusRes = await tryApiFetch(`${base}/api/plan-review/status`);
502
+ if (statusRes?.ok) sinceRound = (await statusRes.json()).round ?? 0;
503
+ }
504
+ const submitRes = await tryApiFetch(`${base}/api/plans`, {
410
505
  method: "POST",
411
506
  headers: { "Content-Type": "application/json" },
412
507
  body: JSON.stringify({
@@ -417,12 +512,13 @@ async function planSubmit(args) {
417
512
  model: values.model
418
513
  })
419
514
  });
420
- if (!res.ok) {
421
- console.error(`Failed to submit plan: HTTP ${res.status}`);
515
+ if (!submitRes) return EXIT_NO_SERVER;
516
+ if (!submitRes.ok) {
517
+ console.error(`Failed to submit plan: HTTP ${submitRes.status}`);
422
518
  return 1;
423
519
  }
424
- const plan = await res.json();
425
- console.error(`Submitted plan ${plan.id} (v${plan.version}) — review at ${base}/plan/${plan.id}`);
520
+ const plan = await submitRes.json();
521
+ console.error(`Submitted plan ${plan.id} (v${plan.version}) — review at ${appendSessionToken(`${base}/plan/${plan.id}`, activeAuthToken)}`);
426
522
  if (plan.sourcePath) console.error(`Source path: ${plan.sourcePath}`);
427
523
  if (!values.wait) console.error(CLI_PLAN_SUBMIT_PARK_HINT);
428
524
  if (values.saveSource) try {
@@ -438,7 +534,9 @@ async function planSubmit(args) {
438
534
  process.stdout.write(plan.id + "\n");
439
535
  return EXIT_OK;
440
536
  }
441
- return pollPlanDecision(base, (values.timeout ? Number(values.timeout) : 570) * 1e3, sinceRound);
537
+ const timeoutSeconds = parseTimeoutSeconds(values.timeout);
538
+ if (timeoutSeconds === null) return EXIT_USAGE;
539
+ return pollPlanDecision(base, timeoutSeconds * 1e3, sinceRound);
442
540
  }
443
541
  async function planAwait(args) {
444
542
  const { values } = parseArgs({
@@ -449,8 +547,9 @@ async function planAwait(args) {
449
547
  } },
450
548
  allowPositionals: false
451
549
  });
452
- const totalBudgetMs = (values.timeout ? Number(values.timeout) : 570) * 1e3;
453
- return pollPlanDecision(baseUrl(), totalBudgetMs);
550
+ const timeoutSeconds = parseTimeoutSeconds(values.timeout);
551
+ if (timeoutSeconds === null) return EXIT_USAGE;
552
+ return pollPlanDecision(baseUrl(), timeoutSeconds * 1e3);
454
553
  }
455
554
  async function planList(args) {
456
555
  const { values } = parseArgs({
@@ -458,7 +557,13 @@ async function planList(args) {
458
557
  options: { json: { type: "boolean" } },
459
558
  allowPositionals: false
460
559
  });
461
- const all = await apiFetch(`${baseUrl()}/api/plans`).then((r) => r.json());
560
+ const res = await tryApiFetch(`${baseUrl()}/api/plans`);
561
+ if (!res) return EXIT_NO_SERVER;
562
+ if (!res.ok) {
563
+ console.error(`Failed to list plans: HTTP ${res.status}`);
564
+ return 1;
565
+ }
566
+ const all = await res.json();
462
567
  if (values.json) {
463
568
  process.stdout.write(JSON.stringify(all, null, 2) + "\n");
464
569
  return EXIT_OK;
@@ -485,18 +590,29 @@ async function planShow(args) {
485
590
  const base = baseUrl();
486
591
  let planId = positionals[0];
487
592
  if (!planId) {
488
- const all = await apiFetch(`${base}/api/plans`).then((r) => r.json());
593
+ const listRes = await tryApiFetch(`${base}/api/plans`);
594
+ if (!listRes) return EXIT_NO_SERVER;
595
+ if (!listRes.ok) {
596
+ console.error(`Failed to list plans: HTTP ${listRes.status}`);
597
+ return 1;
598
+ }
599
+ const all = await listRes.json();
489
600
  if (all.length === 0) {
490
601
  console.error("No plans submitted yet.");
491
602
  return EXIT_NOT_FOUND;
492
603
  }
493
604
  planId = all[all.length - 1].id;
494
605
  }
495
- const res = await apiFetch(`${base}/api/plans/${planId}`);
606
+ const res = await tryApiFetch(`${base}/api/plans/${planId}`);
607
+ if (!res) return EXIT_NO_SERVER;
496
608
  if (res.status === 404) {
497
609
  console.error(`Plan ${planId} not found.`);
498
610
  return EXIT_NOT_FOUND;
499
611
  }
612
+ if (!res.ok) {
613
+ console.error(`Failed to load plan: HTTP ${res.status}`);
614
+ return 1;
615
+ }
500
616
  const plan = await res.json();
501
617
  const requestedVersion = values.version !== void 0 ? Number(values.version) : void 0;
502
618
  if (requestedVersion !== void 0 && (!Number.isFinite(requestedVersion) || requestedVersion < 1)) {
@@ -525,11 +641,16 @@ async function planVersions(args) {
525
641
  console.error("Usage: diffing plan versions <id> [--json]");
526
642
  return EXIT_USAGE;
527
643
  }
528
- const planRes = await apiFetch(`${base}/api/plans/${planId}`);
644
+ const planRes = await tryApiFetch(`${base}/api/plans/${planId}`);
645
+ if (!planRes) return EXIT_NO_SERVER;
529
646
  if (planRes.status === 404) {
530
647
  console.error(`Plan ${planId} not found.`);
531
648
  return EXIT_NOT_FOUND;
532
649
  }
650
+ if (!planRes.ok) {
651
+ console.error(`Failed to load plan: HTTP ${planRes.status}`);
652
+ return 1;
653
+ }
533
654
  const plan = await planRes.json();
534
655
  const versions = plan.versions ?? [];
535
656
  if (values.json) {
@@ -549,7 +670,9 @@ async function planVersions(args) {
549
670
  }
550
671
  /** Locate which plan owns a given comment id (comment ids are globally unique). */
551
672
  async function findCommentPlan(base, commentId) {
552
- return (await apiFetch(`${base}/api/plans`).then((r) => r.json())).find((p) => (p.comments ?? []).some((c) => c.id === commentId)) ?? null;
673
+ const res = await tryApiFetch(`${base}/api/plans`);
674
+ if (!res?.ok) return null;
675
+ return (await res.json()).find((p) => (p.comments ?? []).some((c) => c.id === commentId)) ?? null;
553
676
  }
554
677
  async function planReply(args) {
555
678
  const { values, positionals } = parseArgs({
@@ -572,7 +695,13 @@ async function planReply(args) {
572
695
  return EXIT_USAGE;
573
696
  }
574
697
  let body = values.body;
575
- if (body === "-" || body === void 0) body = (await readStdin()).trim();
698
+ if (body === void 0) {
699
+ if (process.stdin.isTTY) {
700
+ console.error("Usage: diffing plan reply <commentId> --body <text> [--model <name>]");
701
+ return EXIT_USAGE;
702
+ }
703
+ body = (await readStdin()).trim();
704
+ } else if (body === "-") body = (await readStdin()).trim();
576
705
  if (!body) {
577
706
  console.error("A reply body is required (--body <text> or pipe via stdin).");
578
707
  return EXIT_USAGE;
@@ -583,7 +712,7 @@ async function planReply(args) {
583
712
  console.error(`Plan comment ${commentId} not found.`);
584
713
  return EXIT_NOT_FOUND;
585
714
  }
586
- const res = await apiFetch(`${base}/api/plans/${plan.id}/comments/${commentId}/replies`, {
715
+ const res = await tryApiFetch(`${base}/api/plans/${plan.id}/comments/${commentId}/replies`, {
587
716
  method: "POST",
588
717
  headers: { "Content-Type": "application/json" },
589
718
  body: JSON.stringify({
@@ -592,6 +721,7 @@ async function planReply(args) {
592
721
  model: values.model
593
722
  })
594
723
  });
724
+ if (!res) return EXIT_NO_SERVER;
595
725
  if (!res.ok) {
596
726
  console.error(`Failed to reply: HTTP ${res.status}`);
597
727
  return 1;
@@ -616,11 +746,12 @@ async function planResolve(args) {
616
746
  console.error(`Plan comment ${commentId} not found.`);
617
747
  return EXIT_NOT_FOUND;
618
748
  }
619
- const res = await apiFetch(`${base}/api/plans/${plan.id}/comments/${commentId}`, {
749
+ const res = await tryApiFetch(`${base}/api/plans/${plan.id}/comments/${commentId}`, {
620
750
  method: "PUT",
621
751
  headers: { "Content-Type": "application/json" },
622
752
  body: JSON.stringify({ status: "resolved" })
623
753
  });
754
+ if (!res) return EXIT_NO_SERVER;
624
755
  if (!res.ok) {
625
756
  console.error(`Failed to resolve: HTTP ${res.status}`);
626
757
  return 1;
@@ -645,7 +776,7 @@ async function plan(args) {
645
776
  }
646
777
  }
647
778
  async function doctor() {
648
- const { runDoctor, formatDoctorReport } = await import("./doctor-BGYZNIYP.mjs");
779
+ const { runDoctor, formatDoctorReport } = await import("./doctor-Bz9VHuBI.mjs");
649
780
  const report = await runDoctor({
650
781
  cwd: process.cwd(),
651
782
  cliImportMetaUrl: import.meta.url
@@ -654,16 +785,20 @@ async function doctor() {
654
785
  return report.ok ? EXIT_OK : 1;
655
786
  }
656
787
  async function completion(args) {
657
- const shell = args[0];
658
- if (!shell || args.includes("--help") || args.includes("-h")) {
788
+ if (args.includes("--help") || args.includes("-h")) {
659
789
  console.error("Usage: diffing completion <bash|zsh|fish>");
660
790
  console.error(" # Install examples:");
661
791
  console.error(" # diffing completion bash >> ~/.bashrc");
662
792
  console.error(" # diffing completion zsh > ~/.zfunc/_diffing");
663
793
  console.error(" # diffing completion fish > ~/.config/fish/completions/diffing.fish");
794
+ return EXIT_OK;
795
+ }
796
+ const shell = args[0];
797
+ if (!shell) {
798
+ console.error("Usage: diffing completion <bash|zsh|fish>");
664
799
  return EXIT_USAGE;
665
800
  }
666
- const { completionFor } = await import("./completions-3UF8uzhx.mjs");
801
+ const { completionFor } = await import("./completions-DvyV49HY.mjs");
667
802
  const script = completionFor(shell);
668
803
  if (!script) {
669
804
  console.error(`Unknown shell: ${shell}. Use bash, zsh, or fish.`);
@@ -763,11 +898,12 @@ Add --pretty for indented JSON. Compact JSON is the token-efficient default.`);
763
898
  return EXIT_USAGE;
764
899
  }
765
900
  const base = baseUrl();
901
+ const queryString = params.toString();
766
902
  let response;
767
903
  try {
768
- response = await apiFetch(`${base}${endpoint}${params.size ? `?${params}` : ""}`);
904
+ response = await apiFetch(`${base}${endpoint}${queryString ? `?${queryString}` : ""}`);
769
905
  } catch (error) {
770
- console.error(`Failed to reach diffing server: ${error?.message ?? error}`);
906
+ console.error(`Failed to reach diffing server: ${connectionErrorMessage(error)}`);
771
907
  return EXIT_NO_SERVER;
772
908
  }
773
909
  const body = await response.json().catch(() => ({ error: response.statusText }));
@@ -779,7 +915,7 @@ Add --pretty for indented JSON. Compact JSON is the token-efficient default.`);
779
915
  return EXIT_OK;
780
916
  }
781
917
  async function progress(args) {
782
- const { values } = parseArgs({
918
+ const { values, positionals } = parseArgs({
783
919
  args,
784
920
  options: {
785
921
  message: {
@@ -793,12 +929,12 @@ async function progress(args) {
793
929
  },
794
930
  allowPositionals: true
795
931
  });
796
- const message = values.message || (args.find((a) => !a.startsWith("-")) ?? "");
932
+ const message = values.message || positionals[0] || "";
797
933
  if (!message) {
798
934
  console.error("Usage: diffing progress --message \"Working on comment…\" [--model M] [--pct N]");
799
935
  return EXIT_USAGE;
800
936
  }
801
- const res = await apiFetch(`${baseUrl()}/api/agent/progress`, {
937
+ const res = await tryApiFetch(`${baseUrl()}/api/agent/progress`, {
802
938
  method: "POST",
803
939
  headers: { "Content-Type": "application/json" },
804
940
  body: JSON.stringify({
@@ -809,6 +945,7 @@ async function progress(args) {
809
945
  pct: values.pct != null ? Number(values.pct) : void 0
810
946
  })
811
947
  });
948
+ if (!res) return EXIT_NO_SERVER;
812
949
  if (!res.ok) {
813
950
  const err = await res.json().catch(() => ({}));
814
951
  console.error(err.error ?? res.statusText);
@@ -827,15 +964,19 @@ async function runSubcommand(name, args) {
827
964
  case "url": return url();
828
965
  case "plan": return plan(args);
829
966
  case "update":
830
- const { runUpdateCommand } = await import("./update-check-DUuHmPeZ.mjs");
967
+ const { runUpdateCommand } = await import("./update-check-BUfh4Y6c.mjs");
831
968
  return runUpdateCommand();
832
969
  case "gh":
833
- const { runGhSubcommand } = await import("./cli-gh-_bkDCxhh.mjs");
970
+ const { runGhSubcommand } = await import("./cli-gh-DI69gJGo.mjs");
834
971
  return runGhSubcommand(args);
835
972
  case "doctor": return doctor();
836
973
  case "completion": return completion(args);
837
974
  case "progress": return progress(args);
838
975
  case "inspect": return inspect(args);
976
+ case "mode": return mode(args);
977
+ case "sessions":
978
+ const { runSessionsCommand } = await import("./session-manager-BKSZQqDJ.mjs");
979
+ return runSessionsCommand(args);
839
980
  default:
840
981
  console.error(`Unknown subcommand: ${name}`);
841
982
  return EXIT_USAGE;