agim-cli 1.3.7 → 1.3.9

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 (188) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/cli-ui/tui/app.d.ts.map +1 -1
  3. package/dist/cli-ui/tui/app.js +67 -13
  4. package/dist/cli-ui/tui/app.js.map +1 -1
  5. package/dist/cli-ui/tui/markdown.d.ts +46 -2
  6. package/dist/cli-ui/tui/markdown.d.ts.map +1 -1
  7. package/dist/cli-ui/tui/markdown.js +362 -34
  8. package/dist/cli-ui/tui/markdown.js.map +1 -1
  9. package/dist/cli-ui/tui/markdown.test.d.ts +2 -0
  10. package/dist/cli-ui/tui/markdown.test.d.ts.map +1 -0
  11. package/dist/cli-ui/tui/markdown.test.js +240 -0
  12. package/dist/cli-ui/tui/markdown.test.js.map +1 -0
  13. package/dist/cli-ui/tui/stream-reveal.d.ts +13 -0
  14. package/dist/cli-ui/tui/stream-reveal.d.ts.map +1 -0
  15. package/dist/cli-ui/tui/stream-reveal.js +28 -0
  16. package/dist/cli-ui/tui/stream-reveal.js.map +1 -0
  17. package/dist/plugins/agents/claude-code/index.d.ts +8 -0
  18. package/dist/plugins/agents/claude-code/index.d.ts.map +1 -1
  19. package/dist/plugins/agents/claude-code/index.js +34 -3
  20. package/dist/plugins/agents/claude-code/index.js.map +1 -1
  21. package/dist/web/public/assets/{a2a-Bk51ozUt.js → a2a-D_I9ZX8i.js} +2 -2
  22. package/dist/web/public/assets/{a2a-Bk51ozUt.js.map → a2a-D_I9ZX8i.js.map} +1 -1
  23. package/dist/web/public/assets/{activity-DzKONPpA.js → activity-ZxWknBf9.js} +2 -2
  24. package/dist/web/public/assets/{activity-DzKONPpA.js.map → activity-ZxWknBf9.js.map} +1 -1
  25. package/dist/web/public/assets/{admins-CmZ4eQnt.js → admins-DFZcKgq0.js} +2 -2
  26. package/dist/web/public/assets/{admins-CmZ4eQnt.js.map → admins-DFZcKgq0.js.map} +1 -1
  27. package/dist/web/public/assets/{agents-lj76gn9U.js → agents-DTONSU0R.js} +2 -2
  28. package/dist/web/public/assets/{agents-lj76gn9U.js.map → agents-DTONSU0R.js.map} +1 -1
  29. package/dist/web/public/assets/{approvals-C5-3WBcb.js → approvals-BdDJvH8b.js} +2 -2
  30. package/dist/web/public/assets/{approvals-C5-3WBcb.js.map → approvals-BdDJvH8b.js.map} +1 -1
  31. package/dist/web/public/assets/{arrow-down-DAjYgwW2.js → arrow-down-Bhl7hNwa.js} +2 -2
  32. package/dist/web/public/assets/{arrow-down-DAjYgwW2.js.map → arrow-down-Bhl7hNwa.js.map} +1 -1
  33. package/dist/web/public/assets/{arrow-up-Cba9TuAO.js → arrow-up-DZLw3qr1.js} +2 -2
  34. package/dist/web/public/assets/{arrow-up-Cba9TuAO.js.map → arrow-up-DZLw3qr1.js.map} +1 -1
  35. package/dist/web/public/assets/{asks-qlttx_de.js → asks-Cj2QazUD.js} +2 -2
  36. package/dist/web/public/assets/{asks-qlttx_de.js.map → asks-Cj2QazUD.js.map} +1 -1
  37. package/dist/web/public/assets/{audit-CSjpfK6P.js → audit-sxS7UUa6.js} +2 -2
  38. package/dist/web/public/assets/{audit-CSjpfK6P.js.map → audit-sxS7UUa6.js.map} +1 -1
  39. package/dist/web/public/assets/{bell-Dm9oEZR5.js → bell-CqimaF3k.js} +2 -2
  40. package/dist/web/public/assets/{bell-Dm9oEZR5.js.map → bell-CqimaF3k.js.map} +1 -1
  41. package/dist/web/public/assets/{bgjobs-IOX_MrKV.js → bgjobs-BnXdz4TP.js} +2 -2
  42. package/dist/web/public/assets/{bgjobs-IOX_MrKV.js.map → bgjobs-BnXdz4TP.js.map} +1 -1
  43. package/dist/web/public/assets/{brain-D24bSBeM.js → brain-4TIClaVZ.js} +2 -2
  44. package/dist/web/public/assets/{brain-D24bSBeM.js.map → brain-4TIClaVZ.js.map} +1 -1
  45. package/dist/web/public/assets/{briefcase-BrIzC9EZ.js → briefcase-iKF60CJd.js} +2 -2
  46. package/dist/web/public/assets/{briefcase-BrIzC9EZ.js.map → briefcase-iKF60CJd.js.map} +1 -1
  47. package/dist/web/public/assets/{chat-DXki5zbL.js → chat-Cjp0ECm5.js} +2 -2
  48. package/dist/web/public/assets/{chat-DXki5zbL.js.map → chat-Cjp0ECm5.js.map} +1 -1
  49. package/dist/web/public/assets/{chevron-left-C8Ha_lMZ.js → chevron-left-sZyMkeG-.js} +2 -2
  50. package/dist/web/public/assets/{chevron-left-C8Ha_lMZ.js.map → chevron-left-sZyMkeG-.js.map} +1 -1
  51. package/dist/web/public/assets/{chevron-right-LF_j8BGd.js → chevron-right-CPHPRLSX.js} +2 -2
  52. package/dist/web/public/assets/{chevron-right-LF_j8BGd.js.map → chevron-right-CPHPRLSX.js.map} +1 -1
  53. package/dist/web/public/assets/{circle-check-CpSR3rJi.js → circle-check-BB11MxVm.js} +2 -2
  54. package/dist/web/public/assets/{circle-check-CpSR3rJi.js.map → circle-check-BB11MxVm.js.map} +1 -1
  55. package/dist/web/public/assets/{circle-check-big-Dbz0XziN.js → circle-check-big-Sj-6H_3x.js} +2 -2
  56. package/dist/web/public/assets/{circle-check-big-Dbz0XziN.js.map → circle-check-big-Sj-6H_3x.js.map} +1 -1
  57. package/dist/web/public/assets/{circle-x-XWMjbfp5.js → circle-x-DYcD4BUu.js} +2 -2
  58. package/dist/web/public/assets/{circle-x-XWMjbfp5.js.map → circle-x-DYcD4BUu.js.map} +1 -1
  59. package/dist/web/public/assets/{clock-BjVFYz37.js → clock-BVXa81yB.js} +2 -2
  60. package/dist/web/public/assets/{clock-BjVFYz37.js.map → clock-BVXa81yB.js.map} +1 -1
  61. package/dist/web/public/assets/{confirm-dialog-C8nuBNh3.js → confirm-dialog-C2melodU.js} +2 -2
  62. package/dist/web/public/assets/{confirm-dialog-C8nuBNh3.js.map → confirm-dialog-C2melodU.js.map} +1 -1
  63. package/dist/web/public/assets/{copy-BUxvUnbP.js → copy-D1OIgfLU.js} +2 -2
  64. package/dist/web/public/assets/{copy-BUxvUnbP.js.map → copy-D1OIgfLU.js.map} +1 -1
  65. package/dist/web/public/assets/{data-table-BHctKsHM.js → data-table-BYJ2qMyY.js} +2 -2
  66. package/dist/web/public/assets/{data-table-BHctKsHM.js.map → data-table-BYJ2qMyY.js.map} +1 -1
  67. package/dist/web/public/assets/{download-C0hikBL7.js → download-BChufhnl.js} +2 -2
  68. package/dist/web/public/assets/{download-C0hikBL7.js.map → download-BChufhnl.js.map} +1 -1
  69. package/dist/web/public/assets/{email-D940p9kF.js → email-exon2FvQ.js} +2 -2
  70. package/dist/web/public/assets/{email-D940p9kF.js.map → email-exon2FvQ.js.map} +1 -1
  71. package/dist/web/public/assets/{empty-state-BzzUgjlL.js → empty-state-De5ls0uC.js} +2 -2
  72. package/dist/web/public/assets/{empty-state-BzzUgjlL.js.map → empty-state-De5ls0uC.js.map} +1 -1
  73. package/dist/web/public/assets/{external-link-Cjuz11n7.js → external-link-CiJZi5YL.js} +2 -2
  74. package/dist/web/public/assets/{external-link-Cjuz11n7.js.map → external-link-CiJZi5YL.js.map} +1 -1
  75. package/dist/web/public/assets/{eye-DVQjbb2Z.js → eye-DowB5M1R.js} +2 -2
  76. package/dist/web/public/assets/{eye-DVQjbb2Z.js.map → eye-DowB5M1R.js.map} +1 -1
  77. package/dist/web/public/assets/{facts-C4hVaO6t.js → facts-BdnrzWfV.js} +2 -2
  78. package/dist/web/public/assets/{facts-C4hVaO6t.js.map → facts-BdnrzWfV.js.map} +1 -1
  79. package/dist/web/public/assets/{goals-89sYO75m.js → goals-D6ibCBqb.js} +2 -2
  80. package/dist/web/public/assets/{goals-89sYO75m.js.map → goals-D6ibCBqb.js.map} +1 -1
  81. package/dist/web/public/assets/{health-CKfZBddX.js → health-BA8ydz1A.js} +2 -2
  82. package/dist/web/public/assets/{health-CKfZBddX.js.map → health-BA8ydz1A.js.map} +1 -1
  83. package/dist/web/public/assets/{heart-pulse-BfYs3KFD.js → heart-pulse-ClrbGrB7.js} +2 -2
  84. package/dist/web/public/assets/{heart-pulse-BfYs3KFD.js.map → heart-pulse-ClrbGrB7.js.map} +1 -1
  85. package/dist/web/public/assets/{heartbeat-oKkyHWgV.js → heartbeat-j03zupAy.js} +2 -2
  86. package/dist/web/public/assets/{heartbeat-oKkyHWgV.js.map → heartbeat-j03zupAy.js.map} +1 -1
  87. package/dist/web/public/assets/{hot-Cas_nZv9.js → hot-D3bwuObi.js} +2 -2
  88. package/dist/web/public/assets/{hot-Cas_nZv9.js.map → hot-D3bwuObi.js.map} +1 -1
  89. package/dist/web/public/assets/{index-B795P_3p.js → index-DvWldAJY.js} +15 -15
  90. package/dist/web/public/assets/{index-B795P_3p.js.map → index-DvWldAJY.js.map} +1 -1
  91. package/dist/web/public/assets/{injection-DksSjIsi.js → injection-C89g9123.js} +2 -2
  92. package/dist/web/public/assets/{injection-DksSjIsi.js.map → injection-C89g9123.js.map} +1 -1
  93. package/dist/web/public/assets/{installed-DWq0Eluy.js → installed-1Hal8dxW.js} +2 -2
  94. package/dist/web/public/assets/{installed-DWq0Eluy.js.map → installed-1Hal8dxW.js.map} +1 -1
  95. package/dist/web/public/assets/{jobs-CqY-xtBr.js → jobs-cQ7V-7ec.js} +2 -2
  96. package/dist/web/public/assets/{jobs-CqY-xtBr.js.map → jobs-cQ7V-7ec.js.map} +1 -1
  97. package/dist/web/public/assets/{layout-DsoDxB0i.js → layout-BbRAk_tA.js} +2 -2
  98. package/dist/web/public/assets/{layout-DsoDxB0i.js.map → layout-BbRAk_tA.js.map} +1 -1
  99. package/dist/web/public/assets/{layout-CqgDOB5t.js → layout-CXGgZCd2.js} +2 -2
  100. package/dist/web/public/assets/{layout-CqgDOB5t.js.map → layout-CXGgZCd2.js.map} +1 -1
  101. package/dist/web/public/assets/{layout-Cltp3ikG.js → layout-CZ9hb8_a.js} +2 -2
  102. package/dist/web/public/assets/{layout-Cltp3ikG.js.map → layout-CZ9hb8_a.js.map} +1 -1
  103. package/dist/web/public/assets/{layout-BiAVhWgU.js → layout-U5o6RgqN.js} +2 -2
  104. package/dist/web/public/assets/{layout-BiAVhWgU.js.map → layout-U5o6RgqN.js.map} +1 -1
  105. package/dist/web/public/assets/{layout-BodTIhhE.js → layout-Y9JSZczb.js} +2 -2
  106. package/dist/web/public/assets/{layout-BodTIhhE.js.map → layout-Y9JSZczb.js.map} +1 -1
  107. package/dist/web/public/assets/{llm-D3Kd9gqa.js → llm-CumYZM83.js} +2 -2
  108. package/dist/web/public/assets/{llm-D3Kd9gqa.js.map → llm-CumYZM83.js.map} +1 -1
  109. package/dist/web/public/assets/{loader-circle-DsLQMvHE.js → loader-circle-CZQXsfz7.js} +2 -2
  110. package/dist/web/public/assets/{loader-circle-DsLQMvHE.js.map → loader-circle-CZQXsfz7.js.map} +1 -1
  111. package/dist/web/public/assets/{map-pin-e694Eet6.js → map-pin-CYj0xBbt.js} +2 -2
  112. package/dist/web/public/assets/{map-pin-e694Eet6.js.map → map-pin-CYj0xBbt.js.map} +1 -1
  113. package/dist/web/public/assets/{mcp-BoWJqog4.js → mcp-DP4Vj1Nh.js} +2 -2
  114. package/dist/web/public/assets/{mcp-BoWJqog4.js.map → mcp-DP4Vj1Nh.js.map} +1 -1
  115. package/dist/web/public/assets/{memos-C81bimPJ.js → memos-ZDpt1S28.js} +2 -2
  116. package/dist/web/public/assets/{memos-C81bimPJ.js.map → memos-ZDpt1S28.js.map} +1 -1
  117. package/dist/web/public/assets/{messengers-CGcjXUeJ.js → messengers-B007J8et.js} +2 -2
  118. package/dist/web/public/assets/{messengers-CGcjXUeJ.js.map → messengers-B007J8et.js.map} +1 -1
  119. package/dist/web/public/assets/{mobile-Duy_If5A.js → mobile-Crm0YJ36.js} +2 -2
  120. package/dist/web/public/assets/{mobile-Duy_If5A.js.map → mobile-Crm0YJ36.js.map} +1 -1
  121. package/dist/web/public/assets/{network-DnBhCncp.js → network-BYbGwOEp.js} +2 -2
  122. package/dist/web/public/assets/{network-DnBhCncp.js.map → network-BYbGwOEp.js.map} +1 -1
  123. package/dist/web/public/assets/{outbox-DrReVtHr.js → outbox-D7xZ5y2T.js} +2 -2
  124. package/dist/web/public/assets/{outbox-DrReVtHr.js.map → outbox-D7xZ5y2T.js.map} +1 -1
  125. package/dist/web/public/assets/{pagination-DgS8vaZM.js → pagination-bzSoQOAd.js} +2 -2
  126. package/dist/web/public/assets/{pagination-DgS8vaZM.js.map → pagination-bzSoQOAd.js.map} +1 -1
  127. package/dist/web/public/assets/{persona-NTg-RuPa.js → persona-VT6A3VYL.js} +2 -2
  128. package/dist/web/public/assets/{persona-NTg-RuPa.js.map → persona-VT6A3VYL.js.map} +1 -1
  129. package/dist/web/public/assets/{plans-CUsr4aMb.js → plans-b4DAc_3a.js} +2 -2
  130. package/dist/web/public/assets/{plans-CUsr4aMb.js.map → plans-b4DAc_3a.js.map} +1 -1
  131. package/dist/web/public/assets/{play-G96k2QBR.js → play-SPYhVFeC.js} +2 -2
  132. package/dist/web/public/assets/{play-G96k2QBR.js.map → play-SPYhVFeC.js.map} +1 -1
  133. package/dist/web/public/assets/{plus-6RZ3XScp.js → plus-D__n9IVW.js} +2 -2
  134. package/dist/web/public/assets/{plus-6RZ3XScp.js.map → plus-D__n9IVW.js.map} +1 -1
  135. package/dist/web/public/assets/{policy-BFlQnPo5.js → policy-CWeiR9UO.js} +2 -2
  136. package/dist/web/public/assets/{policy-BFlQnPo5.js.map → policy-CWeiR9UO.js.map} +1 -1
  137. package/dist/web/public/assets/{qr-code-L7ClZ31U.js → qr-code-BqDQw03Z.js} +2 -2
  138. package/dist/web/public/assets/{qr-code-L7ClZ31U.js.map → qr-code-BqDQw03Z.js.map} +1 -1
  139. package/dist/web/public/assets/{refresh-ccw-S3sFYfDb.js → refresh-ccw-CW2loqyz.js} +2 -2
  140. package/dist/web/public/assets/{refresh-ccw-S3sFYfDb.js.map → refresh-ccw-CW2loqyz.js.map} +1 -1
  141. package/dist/web/public/assets/{reminders-DVzHdBpK.js → reminders-BAl8NC0R.js} +2 -2
  142. package/dist/web/public/assets/{reminders-DVzHdBpK.js.map → reminders-BAl8NC0R.js.map} +1 -1
  143. package/dist/web/public/assets/{save-DetwgDjo.js → save-DzWp78MC.js} +2 -2
  144. package/dist/web/public/assets/{save-DetwgDjo.js.map → save-DzWp78MC.js.map} +1 -1
  145. package/dist/web/public/assets/{schedules-CslP2Ntr.js → schedules-6cyfjv0O.js} +2 -2
  146. package/dist/web/public/assets/{schedules-CslP2Ntr.js.map → schedules-6cyfjv0O.js.map} +1 -1
  147. package/dist/web/public/assets/{search-ByHc__pY.js → search-Bh7gD1Aq.js} +2 -2
  148. package/dist/web/public/assets/{search-ByHc__pY.js.map → search-Bh7gD1Aq.js.map} +1 -1
  149. package/dist/web/public/assets/{search-Bx2TNvqF.js → search-DVWPME2t.js} +2 -2
  150. package/dist/web/public/assets/{search-Bx2TNvqF.js.map → search-DVWPME2t.js.map} +1 -1
  151. package/dist/web/public/assets/{security-B4dw2-ZU.js → security-DlZ_rDwC.js} +2 -2
  152. package/dist/web/public/assets/{security-B4dw2-ZU.js.map → security-DlZ_rDwC.js.map} +1 -1
  153. package/dist/web/public/assets/{service-LujRx8DT.js → service-DKkji52r.js} +2 -2
  154. package/dist/web/public/assets/{service-LujRx8DT.js.map → service-DKkji52r.js.map} +1 -1
  155. package/dist/web/public/assets/{shield-alert-BM2sbwiD.js → shield-alert-5pYX52s1.js} +2 -2
  156. package/dist/web/public/assets/{shield-alert-BM2sbwiD.js.map → shield-alert-5pYX52s1.js.map} +1 -1
  157. package/dist/web/public/assets/{status-badge-Bz0a-nE1.js → status-badge-W8PRNBT2.js} +2 -2
  158. package/dist/web/public/assets/{status-badge-Bz0a-nE1.js.map → status-badge-W8PRNBT2.js.map} +1 -1
  159. package/dist/web/public/assets/{subtasks-BEAppda9.js → subtasks-DSvOTpF0.js} +2 -2
  160. package/dist/web/public/assets/{subtasks-BEAppda9.js.map → subtasks-DSvOTpF0.js.map} +1 -1
  161. package/dist/web/public/assets/{table-Dl8Faxz-.js → table-B695Fh_p.js} +2 -2
  162. package/dist/web/public/assets/{table-Dl8Faxz-.js.map → table-B695Fh_p.js.map} +1 -1
  163. package/dist/web/public/assets/{topn-CXTn3Qdn.js → topn-DqUC9bYh.js} +2 -2
  164. package/dist/web/public/assets/{topn-CXTn3Qdn.js.map → topn-DqUC9bYh.js.map} +1 -1
  165. package/dist/web/public/assets/{trash-2-DUSLukqd.js → trash-2-DH4UNSUm.js} +2 -2
  166. package/dist/web/public/assets/{trash-2-DUSLukqd.js.map → trash-2-DH4UNSUm.js.map} +1 -1
  167. package/dist/web/public/assets/{use-agim-skills-BD1AIi8d.js → use-agim-skills-BD17YQCK.js} +2 -2
  168. package/dist/web/public/assets/{use-agim-skills-BD1AIi8d.js.map → use-agim-skills-BD17YQCK.js.map} +1 -1
  169. package/dist/web/public/assets/{use-background-tasks-FuodO-_C.js → use-background-tasks-Clyo1IGE.js} +2 -2
  170. package/dist/web/public/assets/{use-background-tasks-FuodO-_C.js.map → use-background-tasks-Clyo1IGE.js.map} +1 -1
  171. package/dist/web/public/assets/{use-memory-4xOyJX4L.js → use-memory-BGvVWIQX.js} +2 -2
  172. package/dist/web/public/assets/{use-memory-4xOyJX4L.js.map → use-memory-BGvVWIQX.js.map} +1 -1
  173. package/dist/web/public/assets/{use-observability-DMebP5-1.js → use-observability-IlURblVq.js} +2 -2
  174. package/dist/web/public/assets/{use-observability-DMebP5-1.js.map → use-observability-IlURblVq.js.map} +1 -1
  175. package/dist/web/public/assets/{use-settings-GPajsGBB.js → use-settings-DFTGCq8J.js} +2 -2
  176. package/dist/web/public/assets/{use-settings-GPajsGBB.js.map → use-settings-DFTGCq8J.js.map} +1 -1
  177. package/dist/web/public/assets/{use-workspace-C6qix-sY.js → use-workspace-DaXX6QdK.js} +2 -2
  178. package/dist/web/public/assets/{use-workspace-C6qix-sY.js.map → use-workspace-DaXX6QdK.js.map} +1 -1
  179. package/dist/web/public/assets/{vector-hGc2RFNQ.js → vector-CKUwZBiK.js} +2 -2
  180. package/dist/web/public/assets/{vector-hGc2RFNQ.js.map → vector-CKUwZBiK.js.map} +1 -1
  181. package/dist/web/public/assets/{viewer-YkLMRkmd.js → viewer-edlHJiVg.js} +2 -2
  182. package/dist/web/public/assets/{viewer-YkLMRkmd.js.map → viewer-edlHJiVg.js.map} +1 -1
  183. package/dist/web/public/assets/{workspace-0GRMLd5j.js → workspace-B0jlv7Gj.js} +2 -2
  184. package/dist/web/public/assets/{workspace-0GRMLd5j.js.map → workspace-B0jlv7Gj.js.map} +1 -1
  185. package/dist/web/public/assets/{workspaces-DPa7ByRm.js → workspaces-_Ho1uiD-.js} +2 -2
  186. package/dist/web/public/assets/{workspaces-DPa7ByRm.js.map → workspaces-_Ho1uiD-.js.map} +1 -1
  187. package/dist/web/public/index.html +1 -1
  188. package/package.json +1 -1
@@ -0,0 +1,240 @@
1
+ // Tests for the TUI markdown table formatter. We test the pure
2
+ // buildTableLines / displayWidth helpers directly (no ink runtime needed,
3
+ // and ink-testing-library isn't a dependency). The regression these guard
4
+ // against: GFM tables used to be dropped entirely because table tokens have
5
+ // no `.text` field.
6
+ import { describe, it, expect } from 'bun:test';
7
+ import { marked } from 'marked';
8
+ import { buildTableLines, displayWidth, Markdown, renderInlineCell, inlineCellText, highlightCode } from './markdown.js';
9
+ // Walk a React element tree and concatenate all string/number leaves. Lets
10
+ // us assert on rendered text without an ink runtime (ink-testing-library is
11
+ // not a dependency). We call Markdown() directly to get its element tree.
12
+ // biome-ignore lint/suspicious/noExplicitAny: test-only tree walk
13
+ function flatten(node) {
14
+ if (node == null || node === false || node === true)
15
+ return '';
16
+ if (typeof node === 'string' || typeof node === 'number')
17
+ return String(node);
18
+ if (Array.isArray(node))
19
+ return node.map(flatten).join('');
20
+ if (node.props && 'children' in node.props)
21
+ return flatten(node.props.children);
22
+ return '';
23
+ }
24
+ function renderText(md, width = 120) {
25
+ return flatten(Markdown({ source: md, width }));
26
+ }
27
+ // Helper: tokenize a markdown table and pull header/rows/align like the
28
+ // renderer does, so the tests exercise the real marked token shape.
29
+ function tableParts(md) {
30
+ const tok = marked.lexer(md).find((t) => t.type === 'table');
31
+ return {
32
+ header: tok.header.map((c) => c.text),
33
+ rows: tok.rows.map((r) => r.map((c) => c.text)),
34
+ align: tok.align,
35
+ };
36
+ }
37
+ const SAMPLE = [
38
+ '| Name | Score |',
39
+ '|------|------:|',
40
+ '| Ann | 10 |',
41
+ '| Bob | 7 |',
42
+ ].join('\n');
43
+ describe('displayWidth', () => {
44
+ it('counts ASCII as 1 and CJK as 2', () => {
45
+ expect(displayWidth('a')).toBe(1);
46
+ expect(displayWidth('ab')).toBe(2);
47
+ expect(displayWidth('中')).toBe(2);
48
+ expect(displayWidth('中文')).toBe(4);
49
+ expect(displayWidth('中a')).toBe(3);
50
+ });
51
+ });
52
+ describe('buildTableLines — grid mode', () => {
53
+ it('renders header, separator and every row when it fits', () => {
54
+ const { header, rows, align } = tableParts(SAMPLE);
55
+ const { mode, lines } = buildTableLines(header, rows, align, 80);
56
+ expect(mode).toBe('grid');
57
+ // header + separator + 2 data rows
58
+ expect(lines.length).toBe(4);
59
+ expect(lines[0]).toContain('Name');
60
+ expect(lines[0]).toContain('Score');
61
+ expect(lines[1]).toMatch(/─.*┼.*─/);
62
+ expect(lines.some((l) => l.includes('Ann') && l.includes('10'))).toBe(true);
63
+ expect(lines.some((l) => l.includes('Bob') && l.includes('7'))).toBe(true);
64
+ });
65
+ it('pads columns to equal display width (rows align)', () => {
66
+ const { header, rows, align } = tableParts(SAMPLE);
67
+ const { lines } = buildTableLines(header, rows, align, 80);
68
+ const widths = lines.map((l) => displayWidth(l));
69
+ // header + all data rows share one width; the separator may differ by
70
+ // the ┼ vs │ glyph, so compare the data rows + header only.
71
+ const dataWidths = [widths[0], ...widths.slice(2)];
72
+ expect(new Set(dataWidths).size).toBe(1);
73
+ });
74
+ it('never drops rows (5-row table keeps all 5)', () => {
75
+ const md = [
76
+ '| K | V |',
77
+ '|---|---|',
78
+ ...Array.from({ length: 5 }, (_, i) => `| k${i} | v${i} |`),
79
+ ].join('\n');
80
+ const { header, rows, align } = tableParts(md);
81
+ const { lines } = buildTableLines(header, rows, align, 80);
82
+ for (let i = 0; i < 5; i++) {
83
+ expect(lines.some((l) => l.includes(`k${i}`) && l.includes(`v${i}`))).toBe(true);
84
+ }
85
+ });
86
+ });
87
+ describe('buildTableLines — list fallback (too wide)', () => {
88
+ it('degrades to header: value records without dropping data', () => {
89
+ const { header, rows, align } = tableParts(SAMPLE);
90
+ const { mode, lines } = buildTableLines(header, rows, align, 8); // tiny width
91
+ expect(mode).toBe('list');
92
+ const joined = lines.join('\n');
93
+ // every header:value pair present
94
+ expect(joined).toContain('Name: Ann');
95
+ expect(joined).toContain('Score: 10');
96
+ expect(joined).toContain('Name: Bob');
97
+ expect(joined).toContain('Score: 7');
98
+ });
99
+ });
100
+ describe('list rendering', () => {
101
+ it('renders inline formatting in items WITHOUT literal markdown', () => {
102
+ const text = renderText('- **bold** and `code` here');
103
+ expect(text).toContain('bold');
104
+ expect(text).toContain('code');
105
+ expect(text).not.toContain('**'); // no literal asterisks leaking through
106
+ });
107
+ it('keeps nested sub-list items', () => {
108
+ const text = renderText('- parent\n - nested child\n - second child');
109
+ expect(text).toContain('parent');
110
+ expect(text).toContain('nested child');
111
+ expect(text).toContain('second child');
112
+ });
113
+ it('shows task checkboxes', () => {
114
+ const text = renderText('- [ ] todo\n- [x] done');
115
+ expect(text).toContain('☐');
116
+ expect(text).toContain('☑');
117
+ expect(text).toContain('todo');
118
+ expect(text).toContain('done');
119
+ });
120
+ it('honours ordered-list start offset', () => {
121
+ const text = renderText('3. third\n4. fourth');
122
+ expect(text).toContain('3.');
123
+ expect(text).toContain('4.');
124
+ expect(text).toContain('third');
125
+ expect(text).toContain('fourth');
126
+ });
127
+ });
128
+ describe('blockquote rendering', () => {
129
+ it('renders quoted bold without literal markup and keeps a quoted list', () => {
130
+ const text = renderText('> quoted **strong**\n> - quoted item');
131
+ expect(text).toContain('quoted');
132
+ expect(text).toContain('strong');
133
+ expect(text).not.toContain('**');
134
+ expect(text).toContain('quoted item'); // nested list inside the quote survives
135
+ });
136
+ });
137
+ describe('table rendering via <Markdown>', () => {
138
+ it('renders a table (regression: tables used to vanish)', () => {
139
+ const text = renderText('| A | B |\n|---|---|\n| 1 | 2 |');
140
+ expect(text).toContain('A');
141
+ expect(text).toContain('B');
142
+ expect(text).toContain('1');
143
+ expect(text).toContain('2');
144
+ });
145
+ });
146
+ // Helper: inline tokens of the first paragraph of `md`.
147
+ function inlineTokens(md) {
148
+ const p = marked.lexer(md).find((t) => t.type === 'paragraph');
149
+ return p.tokens;
150
+ }
151
+ describe('renderInlineCell — width-preserving inline (table cells)', () => {
152
+ it('emits styled content with the SAME characters as cell.text (no markup chars)', () => {
153
+ const toks = inlineTokens('**b** `c` [x](http://u)');
154
+ // marked produces a `text` token " " between inline spans; flattened text
155
+ // must equal the visible plain form with NO **, backticks or URL.
156
+ const flat = flatten(renderInlineCell(toks, 'k'));
157
+ expect(flat).toBe('b c x');
158
+ expect(flat).not.toContain('*');
159
+ expect(flat).not.toContain('`');
160
+ expect(flat).not.toContain('http');
161
+ });
162
+ it('rendered width matches inlineCellText (keeps columns aligned)', () => {
163
+ const md = '| H |\n|---|\n| **b** `c` |';
164
+ const tok = marked.lexer(md).find((t) => t.type === 'table');
165
+ const c = tok.rows[0][0];
166
+ // marked keeps raw markup in c.text ("**b** `c`"); the rendered/visible
167
+ // form is "b c" and that is what width math must use.
168
+ expect(flatten(renderInlineCell(c.tokens, 'k'))).toBe('b c');
169
+ expect(displayWidth(flatten(renderInlineCell(c.tokens, 'k')))).toBe(displayWidth(inlineCellText(c.tokens)));
170
+ });
171
+ });
172
+ describe('styled table via <Markdown>', () => {
173
+ it('renders bold/code cell values fully and without literal markup', () => {
174
+ const text = renderText('| Name | Note |\n|------|------|\n| **Ann** | `ok` |\n| Bob | done |');
175
+ expect(text).toContain('Ann');
176
+ expect(text).toContain('ok');
177
+ expect(text).toContain('Bob');
178
+ expect(text).toContain('done');
179
+ expect(text).not.toContain('**');
180
+ expect(text).not.toContain('`');
181
+ });
182
+ });
183
+ describe('highlightCode — strings / comments / numbers / keywords', () => {
184
+ const kindOf = (spans, substr) => spans.find((s) => s.text.includes(substr))?.kind;
185
+ it('does not colour keywords inside strings or comments', () => {
186
+ const spans = highlightCode('const s = "return 1" // return', 'js');
187
+ // the string span carries the inner `return`, not a keyword span
188
+ expect(kindOf(spans, '"return 1"')).toBe('string');
189
+ expect(kindOf(spans, '// return')).toBe('comment');
190
+ expect(kindOf(spans, 'const')).toBe('keyword');
191
+ // no standalone keyword span equal to 'return'
192
+ expect(spans.some((s) => s.kind === 'keyword' && s.text === 'return')).toBe(false);
193
+ });
194
+ it('colours numbers', () => {
195
+ const spans = highlightCode('let x = 42', 'ts');
196
+ expect(spans.some((s) => s.kind === 'number' && s.text === '42')).toBe(true);
197
+ });
198
+ it('python uses # line comments', () => {
199
+ const spans = highlightCode('x = 1 # note', 'py');
200
+ expect(kindOf(spans, '# note')).toBe('comment');
201
+ });
202
+ it('reconstructs the exact source (no characters lost)', () => {
203
+ const src = 'const s = "a" // b\nreturn 3';
204
+ expect(highlightCode(src, 'js').map((s) => s.text).join('')).toBe(src);
205
+ });
206
+ it('unknown language → single plain span', () => {
207
+ const spans = highlightCode('whatever 123', 'made-up-lang');
208
+ expect(spans).toEqual([{ text: 'whatever 123' }]);
209
+ });
210
+ });
211
+ describe('minor token cleanups', () => {
212
+ it('drops link-reference definitions (no raw leak)', () => {
213
+ expect(renderText('[id]: https://example.com').trim()).toBe('');
214
+ });
215
+ it('renders images as alt + url', () => {
216
+ const text = renderText('![alt text](http://u/x.png)');
217
+ expect(text).toContain('alt text');
218
+ expect(text).toContain('http://u/x.png');
219
+ });
220
+ });
221
+ describe('buildTableLines — robustness', () => {
222
+ it('CJK header/cells align by display width', () => {
223
+ const md = [
224
+ '| 名称 | 值 |',
225
+ '|------|----|',
226
+ '| ab | x |',
227
+ ].join('\n');
228
+ const { header, rows, align } = tableParts(md);
229
+ const { mode, lines } = buildTableLines(header, rows, align, 80);
230
+ expect(mode).toBe('grid');
231
+ expect(displayWidth(lines[0])).toBe(displayWidth(lines[2]));
232
+ });
233
+ it('ragged rows (fewer cells than header) do not throw and pad out', () => {
234
+ const { mode, lines } = buildTableLines(['A', 'B', 'C'], [['1']], [null, null, null], 80);
235
+ expect(mode).toBe('grid');
236
+ expect(lines.length).toBe(3); // header, sep, 1 row
237
+ expect(lines[2]).toContain('1');
238
+ });
239
+ });
240
+ //# sourceMappingURL=markdown.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.test.js","sourceRoot":"","sources":["../../../src/cli-ui/tui/markdown.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /** Next revealed length, easing toward `target`. Advances by a proportional
2
+ * step (so big gaps catch up fast, small gaps stay smooth) with a floor so
3
+ * it never stalls. Never overshoots and never moves backward. */
4
+ export declare function nextRevealLen(current: number, target: number, opts?: {
5
+ minStep?: number;
6
+ div?: number;
7
+ }): number;
8
+ /** Frame interval in ms. Override cadence via IMHUB_TUI_STREAM_FPS. */
9
+ export declare function resolveTickMs(): number;
10
+ /** Whether smooth reveal is on. Set IMHUB_TUI_STREAM_SMOOTH=0 to render each
11
+ * chunk immediately (the pre-v1.3.8 behavior). */
12
+ export declare function streamSmoothingEnabled(): boolean;
13
+ //# sourceMappingURL=stream-reveal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-reveal.d.ts","sourceRoot":"","sources":["../../../src/cli-ui/tui/stream-reveal.ts"],"names":[],"mappings":"AAOA;;kEAEkE;AAClE,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GACzE,MAAM,CAMR;AAED,uEAAuE;AACvE,wBAAgB,aAAa,IAAI,MAAM,CAGtC;AAED;mDACmD;AACnD,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD"}
@@ -0,0 +1,28 @@
1
+ // Smooth streaming reveal helpers for the TUI. Agent backends emit coarse
2
+ // chunks (whole text blocks / parts / final message), which makes the chat
3
+ // feel like it lands "一段一段". We decouple display cadence from chunk
4
+ // arrival by revealing the accumulated text a few characters per frame.
5
+ //
6
+ // Pure + dependency-free so it can be unit-tested without an ink runtime.
7
+ /** Next revealed length, easing toward `target`. Advances by a proportional
8
+ * step (so big gaps catch up fast, small gaps stay smooth) with a floor so
9
+ * it never stalls. Never overshoots and never moves backward. */
10
+ export function nextRevealLen(current, target, opts) {
11
+ if (current >= target)
12
+ return current;
13
+ const minStep = opts?.minStep ?? 2;
14
+ const div = opts?.div ?? 6;
15
+ const step = Math.max(minStep, Math.ceil((target - current) / div));
16
+ return Math.min(target, current + step);
17
+ }
18
+ /** Frame interval in ms. Override cadence via IMHUB_TUI_STREAM_FPS. */
19
+ export function resolveTickMs() {
20
+ const fps = Number(process.env.IMHUB_TUI_STREAM_FPS);
21
+ return Number.isFinite(fps) && fps > 0 ? Math.max(10, Math.round(1000 / fps)) : 40;
22
+ }
23
+ /** Whether smooth reveal is on. Set IMHUB_TUI_STREAM_SMOOTH=0 to render each
24
+ * chunk immediately (the pre-v1.3.8 behavior). */
25
+ export function streamSmoothingEnabled() {
26
+ return process.env.IMHUB_TUI_STREAM_SMOOTH !== '0';
27
+ }
28
+ //# sourceMappingURL=stream-reveal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-reveal.js","sourceRoot":"","sources":["../../../src/cli-ui/tui/stream-reveal.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,2EAA2E;AAC3E,oEAAoE;AACpE,wEAAwE;AACxE,EAAE;AACF,0EAA0E;AAE1E;;kEAEkE;AAClE,MAAM,UAAU,aAAa,CAC3B,OAAe,EAAE,MAAc,EAAE,IAAyC;IAE1E,IAAI,OAAO,IAAI,MAAM;QAAE,OAAO,OAAO,CAAA;IACrC,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,IAAI,CAAC,CAAA;IAClC,MAAM,GAAG,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,CAAA;IAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;IACnE,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC,CAAA;AACzC,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,aAAa;IAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;IACpD,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AACpF,CAAC;AAED;mDACmD;AACnD,MAAM,UAAU,sBAAsB;IACpC,OAAO,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,GAAG,CAAA;AACpD,CAAC"}
@@ -1,5 +1,12 @@
1
1
  import { AgentBase, type SpawnPlan } from '../../../core/agent-base.js';
2
2
  import type { AgentSendOpts } from '../../../core/types.js';
3
+ /** v1.3.8 — token-level streaming. With `--include-partial-messages` the CLI
4
+ * emits `content_block_delta` / `text_delta` events as the model writes,
5
+ * instead of one whole text block per turn — so the TUI streams smoothly
6
+ * rather than landing a paragraph at a time. Default ON; set
7
+ * IMHUB_CLAUDE_PARTIAL_STREAM=0 to fall back to block streaming (e.g. for an
8
+ * older Claude Code CLI that doesn't recognise the flag). */
9
+ export declare function claudePartialStreamEnabled(): boolean;
3
10
  export declare class ClaudeCodeAdapter extends AgentBase {
4
11
  readonly name = "claude-code";
5
12
  readonly aliases: string[];
@@ -31,5 +38,6 @@ export declare const claudeCodeAdapter: ClaudeCodeAdapter;
31
38
  export declare const _testInternals: {
32
39
  prepareCommand(adapter: ClaudeCodeAdapter, prompt: string, opts: AgentSendOpts): Promise<SpawnPlan>;
33
40
  buildArgs(adapter: ClaudeCodeAdapter, prompt: string, opts?: AgentSendOpts): string[];
41
+ extractText(adapter: ClaudeCodeAdapter, event: unknown): string;
34
42
  };
35
43
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/plugins/agents/claude-code/index.ts"],"names":[],"mappings":"AAwCA,OAAO,EAAE,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,6BAA6B,CAAA;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AA+C3D,qBAAa,iBAAkB,SAAQ,SAAS;IAC9C,QAAQ,CAAC,IAAI,iBAAgB;IAC7B,QAAQ,CAAC,OAAO,WAAiC;IACjD,QAAQ,CAAC,IAAI,EAAG,KAAK,CAAS;IAE9B,SAAS,KAAK,WAAW,IAAI,MAAM,CAAoB;IAEvD;;;;;;;;OAQG;IACH,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,EAAE;cAUlD,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC;IA6HvF,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAY7C;;;;;;;OAOG;IACH,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI;CAuBlE;AAED,eAAO,MAAM,iBAAiB,mBAA0B,CAAA;AAIxD,eAAO,MAAM,cAAc;4BACK,iBAAiB,UAAU,MAAM,QAAQ,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC;uBAItF,iBAAiB,UAAU,MAAM,SAAQ,aAAa,GAAQ,MAAM,EAAE;CAI1F,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/plugins/agents/claude-code/index.ts"],"names":[],"mappings":"AAwCA,OAAO,EAAE,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,6BAA6B,CAAA;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAW3D;;;;;8DAK8D;AAC9D,wBAAgB,0BAA0B,IAAI,OAAO,CAEpD;AAkDD,qBAAa,iBAAkB,SAAQ,SAAS;IAC9C,QAAQ,CAAC,IAAI,iBAAgB;IAC7B,QAAQ,CAAC,OAAO,WAAiC;IACjD,QAAQ,CAAC,IAAI,EAAG,KAAK,CAAS;IAE9B,SAAS,KAAK,WAAW,IAAI,MAAM,CAAoB;IAEvD;;;;;;;;OAQG;IACH,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,EAAE;cAUlD,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC;IA6HvF,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAwB7C;;;;;;;OAOG;IACH,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI;CAuBlE;AAED,eAAO,MAAM,iBAAiB,mBAA0B,CAAA;AAIxD,eAAO,MAAM,cAAc;4BACK,iBAAiB,UAAU,MAAM,QAAQ,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC;uBAItF,iBAAiB,UAAU,MAAM,SAAQ,aAAa,GAAQ,MAAM,EAAE;yBAIpE,iBAAiB,SAAS,OAAO,GAAG,MAAM;CAIhE,CAAA"}
@@ -45,6 +45,20 @@ const __dirname = dirname(fileURLToPath(import.meta.url));
45
45
  const SIDECAR_PATH = join(__dirname, 'mcp-approval-server.js');
46
46
  const log = rootLogger.child({ component: 'agent.claude-code' });
47
47
  const BASE_ARGS = ['--print', '--verbose', '--output-format', 'stream-json'];
48
+ /** v1.3.8 — token-level streaming. With `--include-partial-messages` the CLI
49
+ * emits `content_block_delta` / `text_delta` events as the model writes,
50
+ * instead of one whole text block per turn — so the TUI streams smoothly
51
+ * rather than landing a paragraph at a time. Default ON; set
52
+ * IMHUB_CLAUDE_PARTIAL_STREAM=0 to fall back to block streaming (e.g. for an
53
+ * older Claude Code CLI that doesn't recognise the flag). */
54
+ export function claudePartialStreamEnabled() {
55
+ return process.env.IMHUB_CLAUDE_PARTIAL_STREAM !== '0';
56
+ }
57
+ /** BASE_ARGS plus the partial-message flag when enabled. Computed at call
58
+ * time so the env opt-out (and tests) take effect without a restart. */
59
+ function baseArgs() {
60
+ return claudePartialStreamEnabled() ? [...BASE_ARGS, '--include-partial-messages'] : [...BASE_ARGS];
61
+ }
48
62
  /** First call with a UUID: --session-id (creates the session under that id).
49
63
  * Subsequent calls: --resume (continues from existing). Mixing them up gets
50
64
  * you "Session ID already in use" or "session not found". */
@@ -73,7 +87,7 @@ export class ClaudeCodeAdapter extends AgentBase {
73
87
  const mode = opts.planMode ? 'plan' : 'dontAsk';
74
88
  return [
75
89
  ...sessionFlag(opts),
76
- ...BASE_ARGS,
90
+ ...baseArgs(),
77
91
  '--permission-mode', mode,
78
92
  prompt,
79
93
  ];
@@ -105,7 +119,7 @@ export class ClaudeCodeAdapter extends AgentBase {
105
119
  return {
106
120
  args: [
107
121
  ...sessionFlag(opts),
108
- ...BASE_ARGS,
122
+ ...baseArgs(),
109
123
  '--dangerously-skip-permissions',
110
124
  prompt,
111
125
  ],
@@ -180,7 +194,7 @@ export class ClaudeCodeAdapter extends AgentBase {
180
194
  // before another `-X` flag so it sees exactly one file path, not the
181
195
  // prompt as a second config file.
182
196
  '--mcp-config', configPath,
183
- ...BASE_ARGS,
197
+ ...baseArgs(),
184
198
  '--permission-mode', 'default',
185
199
  '--permission-prompt-tool', 'mcp__imhub__request',
186
200
  prompt,
@@ -197,7 +211,20 @@ export class ClaudeCodeAdapter extends AgentBase {
197
211
  }
198
212
  extractText(event) {
199
213
  const msg = event;
214
+ // Partial streaming: emit token-level text deltas as they arrive.
215
+ if (msg.type === 'stream_event') {
216
+ const ev = msg.event;
217
+ if (ev?.type === 'content_block_delta' && ev.delta?.type === 'text_delta') {
218
+ return ev.delta.text ?? '';
219
+ }
220
+ return ''; // ignore thinking_delta / input_json_delta / block start/stop
221
+ }
200
222
  if (msg.type === 'assistant' && msg.message?.content) {
223
+ // When partial streaming is on, the consolidated `assistant` block
224
+ // repeats text already emitted via stream_event deltas — skip it to
225
+ // avoid printing the message twice.
226
+ if (claudePartialStreamEnabled())
227
+ return '';
201
228
  const parts = [];
202
229
  for (const item of msg.message.content) {
203
230
  if (item.type === 'text' && item.text)
@@ -257,5 +284,9 @@ export const _testInternals = {
257
284
  // @ts-expect-error
258
285
  return adapter.buildArgs(prompt, opts);
259
286
  },
287
+ extractText(adapter, event) {
288
+ // @ts-expect-error — protected; tests reach in deliberately
289
+ return adapter.extractText(event);
290
+ },
260
291
  };
261
292
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/agents/claude-code/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/agents/claude-code/index.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import{o as p,a as f,b as o,d as m,u as g,j as t,c as x,B as j}from"./index-B795P_3p.js";import{r as N}from"./react-DlP5eolq.js";import{D as y}from"./data-table-BHctKsHM.js";import{E as b}from"./empty-state-BzzUgjlL.js";import{S as w}from"./status-badge-Bz0a-nE1.js";import{u as v}from"./use-event-stream-I1lMFEfh.js";import{L as A}from"./loader-circle-DsLQMvHE.js";import{R as S}from"./refresh-ccw-S3sFYfDb.js";import"./table-Dl8Faxz-.js";import"./arrow-up-Cba9TuAO.js";import"./arrow-down-DAjYgwW2.js";/**
1
+ import{o as p,a as f,b as o,d as m,u as g,j as t,c as x,B as j}from"./index-DvWldAJY.js";import{r as N}from"./react-DlP5eolq.js";import{D as y}from"./data-table-BYJ2qMyY.js";import{E as b}from"./empty-state-De5ls0uC.js";import{S as w}from"./status-badge-W8PRNBT2.js";import{u as v}from"./use-event-stream-I1lMFEfh.js";import{L as A}from"./loader-circle-CZQXsfz7.js";import{R as S}from"./refresh-ccw-CW2loqyz.js";import"./table-B695Fh_p.js";import"./arrow-up-DZLw3qr1.js";import"./arrow-down-Bhl7hNwa.js";/**
2
2
  * @license lucide-react v0.469.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
5
5
  * See the LICENSE file in the root directory of this source tree.
6
6
  */const C=p("GitBranch",[["line",{x1:"6",x2:"6",y1:"3",y2:"15",key:"17qcm7"}],["circle",{cx:"18",cy:"6",r:"3",key:"1h7g24"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}],["path",{d:"M18 9a9 9 0 0 1-9 9",key:"n2h4wq"}]]),l={all:["a2a"],stats:["a2a","stats"],recent:e=>["a2a","recent",e]};function T(){return o({queryKey:l.stats,queryFn:()=>m.getA2AStats()})}function q(e){return o({queryKey:l.recent(e),queryFn:()=>m.getA2ARecent(e)})}function E(){const e=f();return()=>e.invalidateQueries({queryKey:l.all})}const L={connected:"text-success",connecting:"text-text-dim",reconnecting:"text-warning",closed:"text-text-muted"};function U(){const{t:e}=g(["tasks","common"]),s=E(),n=T(),r=q({limit:50}),u=r.data?.rows??[],i=n.data,d=v({job:()=>s()}),h=N.useMemo(()=>[{id:"id",header:e("a2a.col.id"),cell:a=>t.jsxs("span",{className:"tabular-nums text-text-dim",children:["#",a.id]}),headClassName:"w-16"},{id:"agent",header:e("a2a.col.agent"),cell:a=>t.jsx("span",{className:"font-medium",children:a.agent}),headClassName:"w-32"},{id:"parent",header:e("a2a.col.parent"),cell:a=>a.parent_id!=null?t.jsxs("span",{className:"tabular-nums text-text-dim",children:["#",a.parent_id]}):t.jsx("span",{className:"text-text-muted",children:"—"}),headClassName:"w-20"},{id:"depth",header:e("a2a.col.depth"),cell:a=>t.jsx("span",{className:"tabular-nums text-text-dim",children:a.call_depth}),headClassName:"w-16",hideOnMobile:!0},{id:"status",header:e("a2a.col.status"),cell:a=>t.jsx(w,{status:a.status,children:a.status}),headClassName:"w-28"},{id:"prompt",header:e("a2a.col.prompt"),cell:a=>t.jsx("span",{className:"line-clamp-2 text-text-dim",children:a.prompt??"—"}),asCardTitle:!0},{id:"createdAt",header:e("a2a.col.createdAt"),cell:a=>t.jsx("span",{className:"text-text-dim",children:R(a.created_at)}),headClassName:"w-40",hideOnMobile:!0}],[e]);return t.jsxs("div",{className:"mx-auto flex max-w-7xl flex-col gap-4",children:[t.jsxs("header",{className:"flex flex-col gap-1",children:[t.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[t.jsx("h1",{className:"text-xl font-semibold",children:e("a2a.title")}),t.jsx("span",{className:x("text-xs font-medium tabular-nums",L[d]),children:e(`jobs.live.${d}`)}),t.jsxs(j,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>{r.refetch(),n.refetch()},disabled:r.isFetching||n.isFetching,"aria-label":e("actions.refresh",{ns:"common"}),children:[r.isFetching?t.jsx(A,{className:"h-4 w-4 animate-spin"}):t.jsx(S,{className:"h-4 w-4"}),t.jsx("span",{className:"hidden sm:inline",children:e("actions.refresh",{ns:"common"})})]})]}),t.jsx("p",{className:"text-sm text-text-dim",children:e("a2a.subtitle")})]}),i&&t.jsxs("div",{className:"grid grid-cols-3 gap-2",children:[t.jsx(c,{label:e("a2a.stats.total"),value:i.total,tone:"info"}),t.jsx(c,{label:e("a2a.stats.recent24h"),value:i.recent24h,tone:"success"}),t.jsx(c,{label:e("a2a.stats.maxDepth"),value:i.maxDepth,tone:"warning"})]}),t.jsx(y,{columns:h,rows:u,getRowId:a=>String(a.id),loading:r.isLoading,emptyState:t.jsx(b,{icon:t.jsx(C,{}),title:e("a2a.empty.title"),description:e("a2a.empty.description")})})]})}const k={info:"border-info/30 text-info",success:"border-success/30 text-success",warning:"border-warning/30 text-warning",danger:"border-danger/30 text-danger"};function c({label:e,value:s,tone:n}){return t.jsxs("div",{className:x("rounded-md border bg-surface px-3 py-2",k[n]),children:[t.jsx("div",{className:"text-xs uppercase tracking-wide text-text-dim",children:e}),t.jsx("div",{className:"text-2xl font-semibold tabular-nums",children:s})]})}function R(e){try{const s=new Date(e);return Number.isNaN(s.getTime())?e:s.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return e}}export{U as default};
7
- //# sourceMappingURL=a2a-Bk51ozUt.js.map
7
+ //# sourceMappingURL=a2a-D_I9ZX8i.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"a2a-Bk51ozUt.js","sources":["../../node_modules/lucide-react/dist/esm/icons/git-branch.js","../../src/hooks/use-a2a.ts","../../src/routes/tasks/a2a.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst GitBranch = createLucideIcon(\"GitBranch\", [\n [\"line\", { x1: \"6\", x2: \"6\", y1: \"3\", y2: \"15\", key: \"17qcm7\" }],\n [\"circle\", { cx: \"18\", cy: \"6\", r: \"3\", key: \"1h7g24\" }],\n [\"circle\", { cx: \"6\", cy: \"18\", r: \"3\", key: \"fqmcym\" }],\n [\"path\", { d: \"M18 9a9 9 0 0 1-9 9\", key: \"n2h4wq\" }]\n]);\n\nexport { GitBranch as default };\n//# sourceMappingURL=git-branch.js.map\n","/**\n * useA2A* — react-query wrappers for the Agent-to-Agent inline-job\n * view. Read-only; data lives in jobs.db and is exposed via:\n *\n * GET /api/a2a/stats → totals, recent24h, maxDepth, byStatus/byAgent\n * GET /api/a2a/recent → recent rows (truncated prompt + result)\n *\n * SSE: subscribes to the `job` event so a freshly-completed inline\n * sub-invocation shows up without manual refresh.\n */\n\nimport { useQueryClient, useQuery } from '@tanstack/react-query'\nimport { api } from '@/lib/api/endpoints'\nimport type { A2AStats, ListA2ARecentQuery, ListA2ARecentResponse } from '@/types/api'\n\nexport const a2aKeys = {\n all: ['a2a'] as const,\n stats: ['a2a', 'stats'] as const,\n recent: (q: ListA2ARecentQuery) => ['a2a', 'recent', q] as const,\n}\n\nexport function useA2AStats() {\n return useQuery<A2AStats>({\n queryKey: a2aKeys.stats,\n queryFn: () => api.getA2AStats(),\n })\n}\n\nexport function useA2ARecent(query: ListA2ARecentQuery) {\n return useQuery<ListA2ARecentResponse>({\n queryKey: a2aKeys.recent(query),\n queryFn: () => api.getA2ARecent(query),\n })\n}\n\nexport function useInvalidateA2A() {\n const qc = useQueryClient()\n return () => qc.invalidateQueries({ queryKey: a2aKeys.all })\n}\n","/**\n * /tasks/a2a — Agent ↔ Agent inline-call history.\n *\n * Splits into stats KPI cards (total / recent24h / maxDepth) +\n * recent-rows table. Subscribes to the SSE `job` event so a fresh\n * agent-to-agent call appears live.\n */\n\nimport { useMemo } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { GitBranch, Loader2, RefreshCcw } from 'lucide-react'\n\nimport { DataTable, type DataTableColumn } from '@/components/common/data-table'\nimport { EmptyState } from '@/components/common/empty-state'\nimport { StatusBadge } from '@/components/common/status-badge'\nimport { Button } from '@/components/ui/button'\nimport { useA2ARecent, useA2AStats, useInvalidateA2A } from '@/hooks/use-a2a'\nimport { useEventStream, type SseStatus } from '@/hooks/use-event-stream'\nimport type { A2ARow } from '@/types/api'\nimport { cn } from '@/lib/utils'\n\nconst LIVE_STATUS_CLASS: Record<SseStatus, string> = {\n connected: 'text-success',\n connecting: 'text-text-dim',\n reconnecting: 'text-warning',\n closed: 'text-text-muted',\n}\n\nexport default function A2ARoute(): JSX.Element {\n const { t } = useTranslation(['tasks', 'common'])\n const invalidate = useInvalidateA2A()\n\n const statsQuery = useA2AStats()\n const recentQuery = useA2ARecent({ limit: 50 })\n const rows = recentQuery.data?.rows ?? []\n const stats = statsQuery.data\n\n const live = useEventStream({\n job: () => invalidate(),\n })\n\n const columns: DataTableColumn<A2ARow>[] = useMemo(\n () => [\n {\n id: 'id',\n header: t('a2a.col.id'),\n cell: (r) => <span className=\"tabular-nums text-text-dim\">#{r.id}</span>,\n headClassName: 'w-16',\n },\n {\n id: 'agent',\n header: t('a2a.col.agent'),\n cell: (r) => <span className=\"font-medium\">{r.agent}</span>,\n headClassName: 'w-32',\n },\n {\n id: 'parent',\n header: t('a2a.col.parent'),\n cell: (r) =>\n r.parent_id != null ? (\n <span className=\"tabular-nums text-text-dim\">#{r.parent_id}</span>\n ) : (\n <span className=\"text-text-muted\">—</span>\n ),\n headClassName: 'w-20',\n },\n {\n id: 'depth',\n header: t('a2a.col.depth'),\n cell: (r) => <span className=\"tabular-nums text-text-dim\">{r.call_depth}</span>,\n headClassName: 'w-16',\n hideOnMobile: true,\n },\n {\n id: 'status',\n header: t('a2a.col.status'),\n cell: (r) => <StatusBadge status={r.status}>{r.status}</StatusBadge>,\n headClassName: 'w-28',\n },\n {\n id: 'prompt',\n header: t('a2a.col.prompt'),\n cell: (r) => (\n <span className=\"line-clamp-2 text-text-dim\">{r.prompt ?? '—'}</span>\n ),\n asCardTitle: true,\n },\n {\n id: 'createdAt',\n header: t('a2a.col.createdAt'),\n cell: (r) => <span className=\"text-text-dim\">{formatTime(r.created_at)}</span>,\n headClassName: 'w-40',\n hideOnMobile: true,\n },\n ],\n [t],\n )\n\n return (\n <div className=\"mx-auto flex max-w-7xl flex-col gap-4\">\n <header className=\"flex flex-col gap-1\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('a2a.title')}</h1>\n <span className={cn('text-xs font-medium tabular-nums', LIVE_STATUS_CLASS[live])}>\n {t(`jobs.live.${live}`)}\n </span>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => {\n void recentQuery.refetch()\n void statsQuery.refetch()\n }}\n disabled={recentQuery.isFetching || statsQuery.isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {recentQuery.isFetching ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('actions.refresh', { ns: 'common' })}</span>\n </Button>\n </div>\n <p className=\"text-sm text-text-dim\">{t('a2a.subtitle')}</p>\n </header>\n\n {stats && (\n <div className=\"grid grid-cols-3 gap-2\">\n <StatCard label={t('a2a.stats.total')} value={stats.total} tone=\"info\" />\n <StatCard label={t('a2a.stats.recent24h')} value={stats.recent24h} tone=\"success\" />\n <StatCard label={t('a2a.stats.maxDepth')} value={stats.maxDepth} tone=\"warning\" />\n </div>\n )}\n\n <DataTable\n columns={columns}\n rows={rows}\n getRowId={(r) => String(r.id)}\n loading={recentQuery.isLoading}\n emptyState={\n <EmptyState\n icon={<GitBranch />}\n title={t('a2a.empty.title')}\n description={t('a2a.empty.description')}\n />\n }\n />\n </div>\n )\n}\n\ninterface StatCardProps {\n label: string\n value: number\n tone: 'info' | 'success' | 'warning' | 'danger'\n}\n\nconst TONE_STYLES: Record<StatCardProps['tone'], string> = {\n info: 'border-info/30 text-info',\n success: 'border-success/30 text-success',\n warning: 'border-warning/30 text-warning',\n danger: 'border-danger/30 text-danger',\n}\n\nfunction StatCard({ label, value, tone }: StatCardProps): JSX.Element {\n return (\n <div\n className={cn(\n 'rounded-md border bg-surface px-3 py-2',\n TONE_STYLES[tone],\n )}\n >\n <div className=\"text-xs uppercase tracking-wide text-text-dim\">{label}</div>\n <div className=\"text-2xl font-semibold tabular-nums\">{value}</div>\n </div>\n )\n}\n\nfunction formatTime(iso: string): string {\n try {\n const d = new Date(iso)\n if (Number.isNaN(d.getTime())) return iso\n return d.toLocaleString(undefined, { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' })\n } catch {\n return iso\n }\n}\n"],"names":["GitBranch","createLucideIcon","a2aKeys","q","useA2AStats","useQuery","api","useA2ARecent","query","useInvalidateA2A","qc","useQueryClient","LIVE_STATUS_CLASS","A2ARoute","t","useTranslation","invalidate","statsQuery","recentQuery","rows","stats","live","useEventStream","columns","useMemo","r","jsxs","jsx","StatusBadge","formatTime","cn","Button","Loader2","RefreshCcw","StatCard","DataTable","EmptyState","TONE_STYLES","label","value","tone","iso","d"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"a2a-D_I9ZX8i.js","sources":["../../node_modules/lucide-react/dist/esm/icons/git-branch.js","../../src/hooks/use-a2a.ts","../../src/routes/tasks/a2a.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst GitBranch = createLucideIcon(\"GitBranch\", [\n [\"line\", { x1: \"6\", x2: \"6\", y1: \"3\", y2: \"15\", key: \"17qcm7\" }],\n [\"circle\", { cx: \"18\", cy: \"6\", r: \"3\", key: \"1h7g24\" }],\n [\"circle\", { cx: \"6\", cy: \"18\", r: \"3\", key: \"fqmcym\" }],\n [\"path\", { d: \"M18 9a9 9 0 0 1-9 9\", key: \"n2h4wq\" }]\n]);\n\nexport { GitBranch as default };\n//# sourceMappingURL=git-branch.js.map\n","/**\n * useA2A* — react-query wrappers for the Agent-to-Agent inline-job\n * view. Read-only; data lives in jobs.db and is exposed via:\n *\n * GET /api/a2a/stats → totals, recent24h, maxDepth, byStatus/byAgent\n * GET /api/a2a/recent → recent rows (truncated prompt + result)\n *\n * SSE: subscribes to the `job` event so a freshly-completed inline\n * sub-invocation shows up without manual refresh.\n */\n\nimport { useQueryClient, useQuery } from '@tanstack/react-query'\nimport { api } from '@/lib/api/endpoints'\nimport type { A2AStats, ListA2ARecentQuery, ListA2ARecentResponse } from '@/types/api'\n\nexport const a2aKeys = {\n all: ['a2a'] as const,\n stats: ['a2a', 'stats'] as const,\n recent: (q: ListA2ARecentQuery) => ['a2a', 'recent', q] as const,\n}\n\nexport function useA2AStats() {\n return useQuery<A2AStats>({\n queryKey: a2aKeys.stats,\n queryFn: () => api.getA2AStats(),\n })\n}\n\nexport function useA2ARecent(query: ListA2ARecentQuery) {\n return useQuery<ListA2ARecentResponse>({\n queryKey: a2aKeys.recent(query),\n queryFn: () => api.getA2ARecent(query),\n })\n}\n\nexport function useInvalidateA2A() {\n const qc = useQueryClient()\n return () => qc.invalidateQueries({ queryKey: a2aKeys.all })\n}\n","/**\n * /tasks/a2a — Agent ↔ Agent inline-call history.\n *\n * Splits into stats KPI cards (total / recent24h / maxDepth) +\n * recent-rows table. Subscribes to the SSE `job` event so a fresh\n * agent-to-agent call appears live.\n */\n\nimport { useMemo } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { GitBranch, Loader2, RefreshCcw } from 'lucide-react'\n\nimport { DataTable, type DataTableColumn } from '@/components/common/data-table'\nimport { EmptyState } from '@/components/common/empty-state'\nimport { StatusBadge } from '@/components/common/status-badge'\nimport { Button } from '@/components/ui/button'\nimport { useA2ARecent, useA2AStats, useInvalidateA2A } from '@/hooks/use-a2a'\nimport { useEventStream, type SseStatus } from '@/hooks/use-event-stream'\nimport type { A2ARow } from '@/types/api'\nimport { cn } from '@/lib/utils'\n\nconst LIVE_STATUS_CLASS: Record<SseStatus, string> = {\n connected: 'text-success',\n connecting: 'text-text-dim',\n reconnecting: 'text-warning',\n closed: 'text-text-muted',\n}\n\nexport default function A2ARoute(): JSX.Element {\n const { t } = useTranslation(['tasks', 'common'])\n const invalidate = useInvalidateA2A()\n\n const statsQuery = useA2AStats()\n const recentQuery = useA2ARecent({ limit: 50 })\n const rows = recentQuery.data?.rows ?? []\n const stats = statsQuery.data\n\n const live = useEventStream({\n job: () => invalidate(),\n })\n\n const columns: DataTableColumn<A2ARow>[] = useMemo(\n () => [\n {\n id: 'id',\n header: t('a2a.col.id'),\n cell: (r) => <span className=\"tabular-nums text-text-dim\">#{r.id}</span>,\n headClassName: 'w-16',\n },\n {\n id: 'agent',\n header: t('a2a.col.agent'),\n cell: (r) => <span className=\"font-medium\">{r.agent}</span>,\n headClassName: 'w-32',\n },\n {\n id: 'parent',\n header: t('a2a.col.parent'),\n cell: (r) =>\n r.parent_id != null ? (\n <span className=\"tabular-nums text-text-dim\">#{r.parent_id}</span>\n ) : (\n <span className=\"text-text-muted\">—</span>\n ),\n headClassName: 'w-20',\n },\n {\n id: 'depth',\n header: t('a2a.col.depth'),\n cell: (r) => <span className=\"tabular-nums text-text-dim\">{r.call_depth}</span>,\n headClassName: 'w-16',\n hideOnMobile: true,\n },\n {\n id: 'status',\n header: t('a2a.col.status'),\n cell: (r) => <StatusBadge status={r.status}>{r.status}</StatusBadge>,\n headClassName: 'w-28',\n },\n {\n id: 'prompt',\n header: t('a2a.col.prompt'),\n cell: (r) => (\n <span className=\"line-clamp-2 text-text-dim\">{r.prompt ?? '—'}</span>\n ),\n asCardTitle: true,\n },\n {\n id: 'createdAt',\n header: t('a2a.col.createdAt'),\n cell: (r) => <span className=\"text-text-dim\">{formatTime(r.created_at)}</span>,\n headClassName: 'w-40',\n hideOnMobile: true,\n },\n ],\n [t],\n )\n\n return (\n <div className=\"mx-auto flex max-w-7xl flex-col gap-4\">\n <header className=\"flex flex-col gap-1\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('a2a.title')}</h1>\n <span className={cn('text-xs font-medium tabular-nums', LIVE_STATUS_CLASS[live])}>\n {t(`jobs.live.${live}`)}\n </span>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => {\n void recentQuery.refetch()\n void statsQuery.refetch()\n }}\n disabled={recentQuery.isFetching || statsQuery.isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {recentQuery.isFetching ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('actions.refresh', { ns: 'common' })}</span>\n </Button>\n </div>\n <p className=\"text-sm text-text-dim\">{t('a2a.subtitle')}</p>\n </header>\n\n {stats && (\n <div className=\"grid grid-cols-3 gap-2\">\n <StatCard label={t('a2a.stats.total')} value={stats.total} tone=\"info\" />\n <StatCard label={t('a2a.stats.recent24h')} value={stats.recent24h} tone=\"success\" />\n <StatCard label={t('a2a.stats.maxDepth')} value={stats.maxDepth} tone=\"warning\" />\n </div>\n )}\n\n <DataTable\n columns={columns}\n rows={rows}\n getRowId={(r) => String(r.id)}\n loading={recentQuery.isLoading}\n emptyState={\n <EmptyState\n icon={<GitBranch />}\n title={t('a2a.empty.title')}\n description={t('a2a.empty.description')}\n />\n }\n />\n </div>\n )\n}\n\ninterface StatCardProps {\n label: string\n value: number\n tone: 'info' | 'success' | 'warning' | 'danger'\n}\n\nconst TONE_STYLES: Record<StatCardProps['tone'], string> = {\n info: 'border-info/30 text-info',\n success: 'border-success/30 text-success',\n warning: 'border-warning/30 text-warning',\n danger: 'border-danger/30 text-danger',\n}\n\nfunction StatCard({ label, value, tone }: StatCardProps): JSX.Element {\n return (\n <div\n className={cn(\n 'rounded-md border bg-surface px-3 py-2',\n TONE_STYLES[tone],\n )}\n >\n <div className=\"text-xs uppercase tracking-wide text-text-dim\">{label}</div>\n <div className=\"text-2xl font-semibold tabular-nums\">{value}</div>\n </div>\n )\n}\n\nfunction formatTime(iso: string): string {\n try {\n const d = new Date(iso)\n if (Number.isNaN(d.getTime())) return iso\n return d.toLocaleString(undefined, { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' })\n } catch {\n return iso\n }\n}\n"],"names":["GitBranch","createLucideIcon","a2aKeys","q","useA2AStats","useQuery","api","useA2ARecent","query","useInvalidateA2A","qc","useQueryClient","LIVE_STATUS_CLASS","A2ARoute","t","useTranslation","invalidate","statsQuery","recentQuery","rows","stats","live","useEventStream","columns","useMemo","r","jsxs","jsx","StatusBadge","formatTime","cn","Button","Loader2","RefreshCcw","StatCard","DataTable","EmptyState","TONE_STYLES","label","value","tone","iso","d"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1,7 +1,7 @@
1
- import{o as t}from"./index-B795P_3p.js";/**
1
+ import{o as t}from"./index-DvWldAJY.js";/**
2
2
  * @license lucide-react v0.469.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
5
5
  * See the LICENSE file in the root directory of this source tree.
6
6
  */const c=t("Activity",[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]]);export{c as A};
7
- //# sourceMappingURL=activity-DzKONPpA.js.map
7
+ //# sourceMappingURL=activity-ZxWknBf9.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"activity-DzKONPpA.js","sources":["../../node_modules/lucide-react/dist/esm/icons/activity.js"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Activity = createLucideIcon(\"Activity\", [\n [\n \"path\",\n {\n d: \"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2\",\n key: \"169zse\"\n }\n ]\n]);\n\nexport { Activity as default };\n//# sourceMappingURL=activity.js.map\n"],"names":["Activity","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAWC,EAAiB,WAAY,CAC5C,CACE,OACA,CACE,EAAG,6HACH,IAAK,QACX,CACA,CACA,CAAC","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"activity-ZxWknBf9.js","sources":["../../node_modules/lucide-react/dist/esm/icons/activity.js"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Activity = createLucideIcon(\"Activity\", [\n [\n \"path\",\n {\n d: \"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2\",\n key: \"169zse\"\n }\n ]\n]);\n\nexport { Activity as default };\n//# sourceMappingURL=activity.js.map\n"],"names":["Activity","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAWC,EAAiB,WAAY,CAC5C,CACE,OACA,CACE,EAAG,6HACH,IAAK,QACX,CACA,CACA,CAAC","x_google_ignoreList":[0]}
@@ -1,4 +1,4 @@
1
- import{o as u,u as I,j as s,B as h,l as f,m,n as y}from"./index-B795P_3p.js";import{r as g}from"./react-DlP5eolq.js";import{C as S}from"./confirm-dialog-C8nuBNh3.js";import{E as w}from"./empty-state-BzzUgjlL.js";import{T as N,a as v,b as d,c as t,d as b,e as r}from"./table-Dl8Faxz-.js";import{n as R,o as L,p as U}from"./use-settings-GPajsGBB.js";import{L as k}from"./loader-circle-DsLQMvHE.js";import{R as M}from"./refresh-ccw-S3sFYfDb.js";import{T as P}from"./trash-2-DUSLukqd.js";/**
1
+ import{o as u,u as I,j as s,B as h,l as f,m,n as y}from"./index-DvWldAJY.js";import{r as g}from"./react-DlP5eolq.js";import{C as S}from"./confirm-dialog-C2melodU.js";import{E as w}from"./empty-state-De5ls0uC.js";import{T as N,a as v,b as d,c as t,d as b,e as r}from"./table-B695Fh_p.js";import{n as R,o as L,p as U}from"./use-settings-DFTGCq8J.js";import{L as k}from"./loader-circle-CZQXsfz7.js";import{R as M}from"./refresh-ccw-CW2loqyz.js";import{T as P}from"./trash-2-DH4UNSUm.js";/**
2
2
  * @license lucide-react v0.469.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -14,4 +14,4 @@ import{o as u,u as I,j as s,B as h,l as f,m,n as y}from"./index-B795P_3p.js";imp
14
14
  * This source code is licensed under the ISC license.
15
15
  * See the LICENSE file in the root directory of this source tree.
16
16
  */const H=u("Users",[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}],["path",{d:"M22 21v-2a4 4 0 0 0-3-3.87",key:"kshegd"}],["path",{d:"M16 3.13a4 4 0 0 1 0 7.75",key:"1da9ce"}]]);function z(e){const i=new Date(e);return Number.isNaN(i.getTime())?e:i.toLocaleString()}function J(){const{t:e}=I(["settings","common"]),i=R(),a=i.data,c=L(),j=U(),[x,p]=g.useState(null),A=g.useMemo(()=>new Set((a?.admins??[]).map(n=>`${n.platform}:${n.userId}`)),[a?.admins]);async function C(n){try{await c.mutateAsync({platform:n.platform,userId:n.userId}),m.success(e("admins.toast.added"))}catch(l){m.error(y(l,e).message)}}async function T(){if(x)try{await j.mutateAsync(x),m.success(e("admins.toast.removed"))}catch(n){throw m.error(y(n,e).message),n}}return s.jsxs("div",{className:"mx-auto flex max-w-4xl flex-col gap-4",children:[s.jsxs("header",{className:"flex flex-col gap-1",children:[s.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[s.jsx("h1",{className:"text-xl font-semibold",children:e("admins.title")}),s.jsxs(h,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>i.refetch(),disabled:i.isFetching,"aria-label":e("actions.refresh",{ns:"common"}),children:[i.isFetching?s.jsx(k,{className:"h-4 w-4 animate-spin"}):s.jsx(M,{className:"h-4 w-4"}),s.jsx("span",{className:"hidden sm:inline",children:e("actions.refresh",{ns:"common"})})]})]}),s.jsx("p",{className:"text-sm text-text-dim",children:e("admins.subtitle")})]}),a&&s.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[a.configured?s.jsx(f,{variant:"success",children:e("admins.configured")}):s.jsx(f,{variant:"warning",children:e("admins.notConfigured")}),s.jsx(f,{variant:"info",children:e("admins.known.count",{count:a.knownUsers.length})})]}),i.isLoading?s.jsx("div",{className:"h-32 rounded-md bg-surface-2 animate-pulse"}):a&&a.admins.length===0?s.jsx(w,{icon:s.jsx($,{}),title:e("admins.empty")}):a?s.jsxs(N,{children:[s.jsx(v,{children:s.jsxs(d,{children:[s.jsx(t,{className:"w-40",children:e("admins.col.platform")}),s.jsx(t,{children:e("admins.col.userId")}),s.jsx(t,{className:"w-24"})]})}),s.jsx(b,{children:a.admins.map(n=>s.jsxs(d,{children:[s.jsx(r,{className:"font-mono",children:n.platform}),s.jsx(r,{className:"font-mono text-xs",children:n.userId}),s.jsx(r,{children:s.jsxs(h,{variant:"ghost",size:"sm",onClick:()=>p(n),disabled:j.isPending,"aria-label":e("admins.remove.label"),children:[s.jsx(P,{className:"h-3 w-3"}),s.jsx("span",{className:"sr-only sm:not-sr-only sm:ml-1",children:e("admins.remove.label")})]})})]},`${n.platform}:${n.userId}`))})]}):null,s.jsxs("section",{className:"rounded-md border border-border bg-surface p-4",children:[s.jsxs("div",{className:"mb-3 flex flex-col gap-1",children:[s.jsx("div",{className:"text-sm font-medium",children:e("admins.known.title")}),s.jsx("div",{className:"text-xs text-text-dim",children:e("admins.known.hint")})]}),i.isLoading?s.jsx("div",{className:"h-20 rounded-md bg-surface-2 animate-pulse"}):a&&a.knownUsers.length===0?s.jsx(w,{icon:s.jsx(H,{}),title:e("admins.known.empty"),description:e("admins.known.emptyHint")}):a?s.jsxs(N,{children:[s.jsx(v,{children:s.jsxs(d,{children:[s.jsx(t,{className:"w-40",children:e("admins.col.platform")}),s.jsx(t,{children:e("admins.col.userId")}),s.jsx(t,{className:"w-48",children:e("admins.known.col.lastSeen")}),s.jsx(t,{className:"w-32"})]})}),s.jsx(b,{children:a.knownUsers.map(n=>{const l=`${n.platform}:${n.userId}`,o=A.has(l);return s.jsxs(d,{children:[s.jsx(r,{className:"font-mono",children:n.platform}),s.jsx(r,{className:"font-mono text-xs",children:n.userId}),s.jsx(r,{className:"text-xs text-text-dim",children:z(n.lastSeenAt)}),s.jsx(r,{children:s.jsxs(h,{size:"sm",variant:o?"ghost":"outline",disabled:o||c.isPending,onClick:()=>void C(n),"aria-label":e(o?"admins.known.alreadyAdmin":"admins.known.promote"),children:[c.isPending?s.jsx(k,{className:"h-4 w-4 animate-spin"}):s.jsx(E,{className:"h-4 w-4"}),e(o?"admins.known.alreadyAdmin":"admins.known.promote")]})})]},l)})})]}):null]}),s.jsx(S,{open:x!=null,onOpenChange:n=>{n||p(null)},title:e("admins.remove.confirmTitle"),description:e("admins.remove.confirmDescription"),intent:"danger",confirmLabel:e("admins.remove.label"),onConfirm:T})]})}export{J as default};
17
- //# sourceMappingURL=admins-CmZ4eQnt.js.map
17
+ //# sourceMappingURL=admins-DFZcKgq0.js.map