@shareai-lab/kode 2.0.2 → 2.0.3

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 (343) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +649 -25
  3. package/README.zh-CN.md +579 -0
  4. package/cli-acp.js +3 -17
  5. package/cli.js +5 -7
  6. package/dist/chunks/Doctor-M3J7GRTJ.js +12 -0
  7. package/dist/chunks/LogList-ISWZ6DDD.js +121 -0
  8. package/dist/chunks/LogList-ISWZ6DDD.js.map +7 -0
  9. package/dist/chunks/REPL-RQ6LO6S7.js +56 -0
  10. package/dist/chunks/ResumeConversation-6DMVBEGH.js +56 -0
  11. package/dist/chunks/agentLoader-FCRG3TFJ.js +31 -0
  12. package/dist/{agentsValidate-XP3CFN6F.js → chunks/agentsValidate-PEWMYN4Q.js} +97 -69
  13. package/dist/chunks/agentsValidate-PEWMYN4Q.js.map +7 -0
  14. package/dist/{ask-3G5H5KD5.js → chunks/ask-D7SOHJ6Z.js} +36 -44
  15. package/dist/chunks/ask-D7SOHJ6Z.js.map +7 -0
  16. package/dist/chunks/autoUpdater-CNESBOKO.js +19 -0
  17. package/dist/{chunk-EH34V7CY.js → chunks/chunk-2JN5MY67.js} +12 -14
  18. package/dist/chunks/chunk-2JN5MY67.js.map +7 -0
  19. package/dist/chunks/chunk-2QONJ5MG.js +14 -0
  20. package/dist/chunks/chunk-2QONJ5MG.js.map +7 -0
  21. package/dist/chunks/chunk-2WEXPKHH.js +903 -0
  22. package/dist/chunks/chunk-2WEXPKHH.js.map +7 -0
  23. package/dist/{chunk-K2MI4TPB.js → chunks/chunk-3BYE3ME6.js} +717 -792
  24. package/dist/chunks/chunk-3BYE3ME6.js.map +7 -0
  25. package/dist/chunks/chunk-3JDNWX7W.js +1264 -0
  26. package/dist/chunks/chunk-3JDNWX7W.js.map +7 -0
  27. package/dist/chunks/chunk-3OEJVB5A.js +906 -0
  28. package/dist/chunks/chunk-3OEJVB5A.js.map +7 -0
  29. package/dist/chunks/chunk-3TNIOEBO.js +369 -0
  30. package/dist/chunks/chunk-3TNIOEBO.js.map +7 -0
  31. package/dist/chunks/chunk-4A46ZXMJ.js +67 -0
  32. package/dist/chunks/chunk-4A46ZXMJ.js.map +7 -0
  33. package/dist/{chunk-4GAIJGRH.js → chunks/chunk-4ATBQOFO.js} +107 -55
  34. package/dist/chunks/chunk-4ATBQOFO.js.map +7 -0
  35. package/dist/chunks/chunk-4CRUCZR4.js +0 -0
  36. package/dist/{chunk-54DNHKOD.js → chunks/chunk-4EO6SIQY.js} +32 -75
  37. package/dist/chunks/chunk-4EO6SIQY.js.map +7 -0
  38. package/dist/chunks/chunk-53M46S5I.js +64 -0
  39. package/dist/chunks/chunk-53M46S5I.js.map +7 -0
  40. package/dist/{chunk-JC6NCUG5.js → chunks/chunk-54KOYG5C.js} +0 -2
  41. package/dist/{chunk-EZXMVTDU.js → chunks/chunk-6BAS4WY6.js} +29 -45
  42. package/dist/chunks/chunk-6BAS4WY6.js.map +7 -0
  43. package/dist/{chunk-BHGTA6JQ.js → chunks/chunk-6KRRFSDN.js} +4 -6
  44. package/dist/chunks/chunk-6KRRFSDN.js.map +7 -0
  45. package/dist/chunks/chunk-6LJNZK4K.js +39 -0
  46. package/dist/chunks/chunk-6LJNZK4K.js.map +7 -0
  47. package/dist/chunks/chunk-6ZWEOSEI.js +666 -0
  48. package/dist/chunks/chunk-6ZWEOSEI.js.map +7 -0
  49. package/dist/chunks/chunk-77XDJMBP.js +3326 -0
  50. package/dist/chunks/chunk-77XDJMBP.js.map +7 -0
  51. package/dist/chunks/chunk-7RRW4NTB.js +6454 -0
  52. package/dist/chunks/chunk-7RRW4NTB.js.map +7 -0
  53. package/dist/chunks/chunk-7X3TW4JB.js +4520 -0
  54. package/dist/chunks/chunk-7X3TW4JB.js.map +7 -0
  55. package/dist/chunks/chunk-B3MW3YGY.js +1409 -0
  56. package/dist/chunks/chunk-B3MW3YGY.js.map +7 -0
  57. package/dist/chunks/chunk-BBJFHTBC.js +28 -0
  58. package/dist/chunks/chunk-BBJFHTBC.js.map +7 -0
  59. package/dist/chunks/chunk-BHDHXOXB.js +24 -0
  60. package/dist/chunks/chunk-BHDHXOXB.js.map +7 -0
  61. package/dist/{chunk-OZNRLY3E.js → chunks/chunk-BTA7SZ26.js} +152 -223
  62. package/dist/chunks/chunk-BTA7SZ26.js.map +7 -0
  63. package/dist/chunks/chunk-CDGRYGPZ.js +103 -0
  64. package/dist/chunks/chunk-CDGRYGPZ.js.map +7 -0
  65. package/dist/{chunk-S6HRABTA.js → chunks/chunk-CP6E5UG6.js} +1 -4
  66. package/dist/chunks/chunk-CP6E5UG6.js.map +7 -0
  67. package/dist/{chunk-2PMO2FS2.js → chunks/chunk-DQ4JHXMT.js} +462 -424
  68. package/dist/chunks/chunk-DQ4JHXMT.js.map +7 -0
  69. package/dist/chunks/chunk-DXD76CMV.js +208 -0
  70. package/dist/chunks/chunk-DXD76CMV.js.map +7 -0
  71. package/dist/chunks/chunk-GCQCAXJZ.js +0 -0
  72. package/dist/chunks/chunk-GELCZWMB.js +42 -0
  73. package/dist/chunks/chunk-GELCZWMB.js.map +7 -0
  74. package/dist/{chunk-NQLEUHMS.js → chunks/chunk-HJYOH4HC.js} +23 -18
  75. package/dist/chunks/chunk-HJYOH4HC.js.map +7 -0
  76. package/dist/chunks/chunk-HPYNW6TT.js +744 -0
  77. package/dist/chunks/chunk-HPYNW6TT.js.map +7 -0
  78. package/dist/{chunk-2KWKUXLT.js → chunks/chunk-HRJ3ICQK.js} +59 -55
  79. package/dist/chunks/chunk-HRJ3ICQK.js.map +7 -0
  80. package/dist/{chunk-ZQU3TXLC.js → chunks/chunk-IFCIADS3.js} +571 -573
  81. package/dist/chunks/chunk-IFCIADS3.js.map +7 -0
  82. package/dist/chunks/chunk-IN7XZ7BC.js +27 -0
  83. package/dist/chunks/chunk-IN7XZ7BC.js.map +7 -0
  84. package/dist/chunks/chunk-L7P4M4KW.js +193 -0
  85. package/dist/chunks/chunk-L7P4M4KW.js.map +7 -0
  86. package/dist/chunks/chunk-LB6TCPDI.js +0 -0
  87. package/dist/{chunk-3RUXVV4S.js → chunks/chunk-LOCXPQNJ.js} +1 -4
  88. package/dist/{chunk-3RUXVV4S.js.map → chunks/chunk-LOCXPQNJ.js.map} +2 -2
  89. package/dist/{chunk-IE2CG2TV.js → chunks/chunk-LOD5ZHCI.js} +213 -208
  90. package/dist/chunks/chunk-LOD5ZHCI.js.map +7 -0
  91. package/dist/{chunk-S3J2TLV6.js → chunks/chunk-M7P3QNRU.js} +1 -4
  92. package/dist/{chunk-S3J2TLV6.js.map → chunks/chunk-M7P3QNRU.js.map} +2 -2
  93. package/dist/chunks/chunk-PPHLQVL7.js +4234 -0
  94. package/dist/chunks/chunk-PPHLQVL7.js.map +7 -0
  95. package/dist/{chunk-ABLVTESJ.js → chunks/chunk-QAXE37B5.js} +1 -4
  96. package/dist/chunks/chunk-QAXE37B5.js.map +7 -0
  97. package/dist/chunks/chunk-QHQOBUF6.js +60 -0
  98. package/dist/chunks/chunk-QHQOBUF6.js.map +7 -0
  99. package/dist/{chunk-SRZZFAS7.js → chunks/chunk-RPJXO7GG.js} +241 -214
  100. package/dist/chunks/chunk-RPJXO7GG.js.map +7 -0
  101. package/dist/{chunk-NPFOMITO.js → chunks/chunk-SWQV4KSY.js} +1 -4
  102. package/dist/{chunk-NPFOMITO.js.map → chunks/chunk-SWQV4KSY.js.map} +2 -2
  103. package/dist/chunks/chunk-SZLAPULP.js +28 -0
  104. package/dist/chunks/chunk-SZLAPULP.js.map +7 -0
  105. package/dist/{chunk-SDGKPKDK.js → chunks/chunk-T7RB5V5J.js} +23 -25
  106. package/dist/chunks/chunk-T7RB5V5J.js.map +7 -0
  107. package/dist/{chunk-HN4E4UUQ.js → chunks/chunk-TI2CTTMA.js} +25 -17
  108. package/dist/chunks/chunk-TI2CTTMA.js.map +7 -0
  109. package/dist/{chunk-G6I7XROM.js → chunks/chunk-TNGVRTO5.js} +45 -20
  110. package/dist/chunks/chunk-TNGVRTO5.js.map +7 -0
  111. package/dist/chunks/chunk-TNWB3U5Y.js +2077 -0
  112. package/dist/chunks/chunk-TNWB3U5Y.js.map +7 -0
  113. package/dist/chunks/chunk-U2IHWPCU.js +12 -0
  114. package/dist/chunks/chunk-U2IHWPCU.js.map +7 -0
  115. package/dist/{chunk-KAA5BGMQ.js → chunks/chunk-UNOY3VJ2.js} +1 -4
  116. package/dist/{chunk-KAA5BGMQ.js.map → chunks/chunk-UNOY3VJ2.js.map} +2 -2
  117. package/dist/{chunk-3TXNP6HH.js → chunks/chunk-UVDJL6ZZ.js} +97 -58
  118. package/dist/chunks/chunk-UVDJL6ZZ.js.map +7 -0
  119. package/dist/chunks/chunk-VNCW4C2Z.js +13452 -0
  120. package/dist/chunks/chunk-VNCW4C2Z.js.map +7 -0
  121. package/dist/chunks/chunk-W5EGGA44.js +15 -0
  122. package/dist/chunks/chunk-W5EGGA44.js.map +7 -0
  123. package/dist/chunks/chunk-XR2W3MAM.js +1533 -0
  124. package/dist/chunks/chunk-XR2W3MAM.js.map +7 -0
  125. package/dist/{chunk-QYFKRZQC.js → chunks/chunk-YIO5EBMQ.js} +423 -377
  126. package/dist/chunks/chunk-YIO5EBMQ.js.map +7 -0
  127. package/dist/chunks/chunk-ZBVLKZ5V.js +1062 -0
  128. package/dist/chunks/chunk-ZBVLKZ5V.js.map +7 -0
  129. package/dist/{chunk-E6YNABER.js → chunks/chunk-ZCLTZIVP.js} +1 -4
  130. package/dist/chunks/chunk-ZCLTZIVP.js.map +7 -0
  131. package/dist/chunks/client-SILZNM5N.js +42 -0
  132. package/dist/{config-6ZMBCL23.js → chunks/config-25HRTPSP.js} +48 -10
  133. package/dist/chunks/cost-tracker-Z2UZT2J5.js +28 -0
  134. package/dist/{customCommands-DNEJS3ZU.js → chunks/customCommands-TYMYZRG5.js} +11 -8
  135. package/dist/chunks/engine-MRVF6FK6.js +39 -0
  136. package/dist/{env-OFAXZ3XG.js → chunks/env-TJ5NOBEB.js} +7 -5
  137. package/dist/{kodeAgentSessionId-X6XWQW7B.js → chunks/kodeAgentSessionId-VTNISJ2L.js} +2 -4
  138. package/dist/chunks/kodeAgentSessionLoad-YB2RKBGJ.js +15 -0
  139. package/dist/chunks/kodeAgentSessionResume-DZSIVKVA.js +13 -0
  140. package/dist/chunks/kodeAgentStreamJson-X5PLS2S6.js +11 -0
  141. package/dist/{kodeAgentStreamJsonSession-GRWG3SPE.js → chunks/kodeAgentStreamJsonSession-RDXM4XYF.js} +38 -24
  142. package/dist/chunks/kodeAgentStreamJsonSession-RDXM4XYF.js.map +7 -0
  143. package/dist/{chunk-4RTX4AG4.js → chunks/kodeAgentStructuredStdio-SVGDSB4P.js} +14 -9
  144. package/dist/chunks/kodeAgentStructuredStdio-SVGDSB4P.js.map +7 -0
  145. package/dist/{kodeHooks-TDMXFWSO.js → chunks/kodeHooks-RVKYRJHG.js} +11 -9
  146. package/dist/{llm-XVXWYOHK.js → chunks/llm-62N6T5ZT.js} +1734 -1526
  147. package/dist/chunks/llm-62N6T5ZT.js.map +7 -0
  148. package/dist/chunks/llmLazy-ZUSSE3ZA.js +13 -0
  149. package/dist/{mentionProcessor-YD7YXYGF.js → chunks/mentionProcessor-RJW5UPJD.js} +46 -16
  150. package/dist/chunks/mentionProcessor-RJW5UPJD.js.map +7 -0
  151. package/dist/{messages-OFUJSPRV.js → chunks/messages-EEWWLPHN.js} +2 -6
  152. package/dist/chunks/model-5TIEKQPD.js +37 -0
  153. package/dist/{openai-5G5D5Q4B.js → chunks/openai-XXK3YZG4.js} +13 -10
  154. package/dist/{outputStyles-HLDXFQK3.js → chunks/outputStyles-FAJTXN2A.js} +6 -9
  155. package/dist/chunks/permissions-HO7INPWM.js +27 -0
  156. package/dist/{pluginRuntime-FPTKK6NY.js → chunks/pluginRuntime-C7K5ULK2.js} +31 -48
  157. package/dist/chunks/pluginRuntime-C7K5ULK2.js.map +7 -0
  158. package/dist/chunks/pluginValidation-DAM7WRTC.js +20 -0
  159. package/dist/chunks/registry-XYJXMOA5.js +60 -0
  160. package/dist/chunks/responsesStreaming-JNGE2P3D.js +8 -0
  161. package/dist/chunks/runNonTextPrintMode-SVBLCZQX.js +577 -0
  162. package/dist/chunks/runNonTextPrintMode-SVBLCZQX.js.map +7 -0
  163. package/dist/chunks/server-REXXF5IK.js +46 -0
  164. package/dist/{skillMarketplace-PSNKDINM.js → chunks/skillMarketplace-N4HVHNST.js} +8 -6
  165. package/dist/chunks/src-OROQIWP3.js +44 -0
  166. package/dist/chunks/src-QXLGGMUW.js +1647 -0
  167. package/dist/chunks/src-QXLGGMUW.js.map +7 -0
  168. package/dist/{cli-SRV2INSL.js → chunks/src-SSDT6MVP.js} +2659 -3384
  169. package/dist/chunks/src-SSDT6MVP.js.map +7 -0
  170. package/dist/chunks/theme-YBJUIMWK.js +10 -0
  171. package/dist/{toolPermissionContext-65L65VEZ.js → chunks/toolPermissionContext-MOCTRR7N.js} +2 -4
  172. package/dist/chunks/toolPermissionSettings-EV2EJAXL.js +18 -0
  173. package/dist/chunks/toolPermissionSettings-EV2EJAXL.js.map +7 -0
  174. package/dist/chunks/uuid-6577SO6X.js +7 -0
  175. package/dist/chunks/uuid-6577SO6X.js.map +7 -0
  176. package/dist/chunks/webOnlyMode-ALXX7UQY.js +66 -0
  177. package/dist/chunks/webOnlyMode-ALXX7UQY.js.map +7 -0
  178. package/dist/entrypoints/cli.js +10 -0
  179. package/dist/entrypoints/cli.js.map +7 -0
  180. package/dist/entrypoints/daemon.js +10 -0
  181. package/dist/entrypoints/daemon.js.map +7 -0
  182. package/dist/entrypoints/mcp.js +71 -0
  183. package/dist/entrypoints/mcp.js.map +7 -0
  184. package/dist/index.js +6 -7
  185. package/dist/index.js.map +3 -3
  186. package/dist/sdk/client.cjs +391 -0
  187. package/dist/sdk/client.cjs.map +7 -0
  188. package/dist/sdk/client.js +364 -0
  189. package/dist/sdk/client.js.map +7 -0
  190. package/dist/sdk/core.cjs +19932 -0
  191. package/dist/sdk/core.cjs.map +7 -0
  192. package/dist/sdk/core.js +19893 -0
  193. package/dist/sdk/core.js.map +7 -0
  194. package/dist/sdk/daemon-client.cjs +257 -0
  195. package/dist/sdk/daemon-client.cjs.map +7 -0
  196. package/dist/sdk/daemon-client.js +221 -0
  197. package/dist/sdk/daemon-client.js.map +7 -0
  198. package/dist/sdk/protocol.cjs +170 -0
  199. package/dist/sdk/protocol.cjs.map +7 -0
  200. package/dist/sdk/protocol.js +140 -0
  201. package/dist/sdk/protocol.js.map +7 -0
  202. package/dist/sdk/runtime-node.cjs +236 -0
  203. package/dist/sdk/runtime-node.cjs.map +7 -0
  204. package/dist/sdk/runtime-node.js +222 -0
  205. package/dist/sdk/runtime-node.js.map +7 -0
  206. package/dist/sdk/runtime.cjs +17 -0
  207. package/dist/sdk/runtime.cjs.map +7 -0
  208. package/dist/sdk/runtime.js +0 -0
  209. package/dist/sdk/runtime.js.map +7 -0
  210. package/dist/sdk/tools.cjs +30300 -0
  211. package/dist/sdk/tools.cjs.map +7 -0
  212. package/dist/sdk/tools.js +30282 -0
  213. package/dist/sdk/tools.js.map +7 -0
  214. package/dist/webui/assets/index-5hlfByVS.css +1 -0
  215. package/dist/webui/assets/index-BR9lm1lA.js +82 -0
  216. package/dist/webui/index.html +28 -0
  217. package/package.json +93 -22
  218. package/scripts/binary-utils.cjs +12 -4
  219. package/scripts/cli-acp-wrapper.cjs +3 -17
  220. package/scripts/cli-wrapper.cjs +5 -7
  221. package/scripts/postinstall.js +8 -4
  222. package/dist/REPL-GIU4ZIXM.js +0 -42
  223. package/dist/acp-H3VJ77YG.js +0 -1357
  224. package/dist/acp-H3VJ77YG.js.map +0 -7
  225. package/dist/agentsValidate-XP3CFN6F.js.map +0 -7
  226. package/dist/ask-3G5H5KD5.js.map +0 -7
  227. package/dist/autoUpdater-DNRMJWFQ.js +0 -17
  228. package/dist/chunk-2KWKUXLT.js.map +0 -7
  229. package/dist/chunk-2PMO2FS2.js.map +0 -7
  230. package/dist/chunk-3TXNP6HH.js.map +0 -7
  231. package/dist/chunk-4GAIJGRH.js.map +0 -7
  232. package/dist/chunk-4RTX4AG4.js.map +0 -7
  233. package/dist/chunk-54DNHKOD.js.map +0 -7
  234. package/dist/chunk-67PY5IX6.js +0 -34
  235. package/dist/chunk-67PY5IX6.js.map +0 -7
  236. package/dist/chunk-6DRDLOLP.js +0 -2613
  237. package/dist/chunk-6DRDLOLP.js.map +0 -7
  238. package/dist/chunk-7CQVZNQV.js +0 -1609
  239. package/dist/chunk-7CQVZNQV.js.map +0 -7
  240. package/dist/chunk-ABLVTESJ.js.map +0 -7
  241. package/dist/chunk-AIMIPK4B.js +0 -835
  242. package/dist/chunk-AIMIPK4B.js.map +0 -7
  243. package/dist/chunk-BHGTA6JQ.js.map +0 -7
  244. package/dist/chunk-CIG63V4E.js +0 -72
  245. package/dist/chunk-CIG63V4E.js.map +0 -7
  246. package/dist/chunk-E6YNABER.js.map +0 -7
  247. package/dist/chunk-EH34V7CY.js.map +0 -7
  248. package/dist/chunk-EZXMVTDU.js.map +0 -7
  249. package/dist/chunk-FH5CHM6L.js +0 -148
  250. package/dist/chunk-FH5CHM6L.js.map +0 -7
  251. package/dist/chunk-G6I7XROM.js.map +0 -7
  252. package/dist/chunk-HN4E4UUQ.js.map +0 -7
  253. package/dist/chunk-HSPVVDIW.js +0 -30198
  254. package/dist/chunk-HSPVVDIW.js.map +0 -7
  255. package/dist/chunk-IE2CG2TV.js.map +0 -7
  256. package/dist/chunk-K2MI4TPB.js.map +0 -7
  257. package/dist/chunk-MN77D2F7.js +0 -2931
  258. package/dist/chunk-MN77D2F7.js.map +0 -7
  259. package/dist/chunk-NQLEUHMS.js.map +0 -7
  260. package/dist/chunk-OIFQB3S4.js +0 -515
  261. package/dist/chunk-OIFQB3S4.js.map +0 -7
  262. package/dist/chunk-OWTG2W3A.js +0 -164
  263. package/dist/chunk-OWTG2W3A.js.map +0 -7
  264. package/dist/chunk-OZNRLY3E.js.map +0 -7
  265. package/dist/chunk-QYFKRZQC.js.map +0 -7
  266. package/dist/chunk-S6HRABTA.js.map +0 -7
  267. package/dist/chunk-SDGKPKDK.js.map +0 -7
  268. package/dist/chunk-SRZZFAS7.js.map +0 -7
  269. package/dist/chunk-UKHTVRJM.js +0 -47
  270. package/dist/chunk-UKHTVRJM.js.map +0 -7
  271. package/dist/chunk-UYXEDKOZ.js +0 -24
  272. package/dist/chunk-UYXEDKOZ.js.map +0 -7
  273. package/dist/chunk-VBXVYQYY.js +0 -145
  274. package/dist/chunk-VBXVYQYY.js.map +0 -7
  275. package/dist/chunk-WVHORZQ5.js +0 -17
  276. package/dist/chunk-WVHORZQ5.js.map +0 -7
  277. package/dist/chunk-WWUWDNWW.js +0 -49
  278. package/dist/chunk-WWUWDNWW.js.map +0 -7
  279. package/dist/chunk-Z33T5YN5.js +0 -654
  280. package/dist/chunk-Z33T5YN5.js.map +0 -7
  281. package/dist/chunk-ZQU3TXLC.js.map +0 -7
  282. package/dist/cli-SRV2INSL.js.map +0 -7
  283. package/dist/commands-TWH6PGVG.js +0 -46
  284. package/dist/context-JQIOOI4W.js +0 -30
  285. package/dist/costTracker-6SL26FDB.js +0 -19
  286. package/dist/kodeAgentSessionLoad-6N27AC5K.js +0 -18
  287. package/dist/kodeAgentSessionResume-HUSAEO24.js +0 -16
  288. package/dist/kodeAgentStreamJson-NXFN7TXH.js +0 -13
  289. package/dist/kodeAgentStreamJsonSession-GRWG3SPE.js.map +0 -7
  290. package/dist/kodeAgentStructuredStdio-HGWJT7CU.js +0 -10
  291. package/dist/llm-XVXWYOHK.js.map +0 -7
  292. package/dist/llmLazy-7TD5N7XP.js +0 -15
  293. package/dist/loader-AUXIJTY6.js +0 -28
  294. package/dist/mcp-BXJ3K7NZ.js +0 -49
  295. package/dist/mentionProcessor-YD7YXYGF.js.map +0 -7
  296. package/dist/model-KPYCXWBK.js +0 -30
  297. package/dist/pluginRuntime-FPTKK6NY.js.map +0 -7
  298. package/dist/pluginValidation-DSFXZ4GF.js +0 -17
  299. package/dist/prompts-LWLAJRS2.js +0 -48
  300. package/dist/query-HVPWL27C.js +0 -50
  301. package/dist/responsesStreaming-AW344PQO.js +0 -10
  302. package/dist/ripgrep-YOPCY2GO.js +0 -17
  303. package/dist/state-KNRWP3FO.js +0 -16
  304. package/dist/theme-7S2QN2FO.js +0 -14
  305. package/dist/toolPermissionSettings-GPOBH4IV.js +0 -18
  306. package/dist/tools-FZU2FZBD.js +0 -47
  307. package/dist/userInput-VHNBN2MW.js +0 -311
  308. package/dist/userInput-VHNBN2MW.js.map +0 -7
  309. package/dist/uuid-QN2CNKKN.js +0 -9
  310. /package/dist/{REPL-GIU4ZIXM.js.map → chunks/Doctor-M3J7GRTJ.js.map} +0 -0
  311. /package/dist/{autoUpdater-DNRMJWFQ.js.map → chunks/REPL-RQ6LO6S7.js.map} +0 -0
  312. /package/dist/{chunk-JC6NCUG5.js.map → chunks/ResumeConversation-6DMVBEGH.js.map} +0 -0
  313. /package/dist/{commands-TWH6PGVG.js.map → chunks/agentLoader-FCRG3TFJ.js.map} +0 -0
  314. /package/dist/{config-6ZMBCL23.js.map → chunks/autoUpdater-CNESBOKO.js.map} +0 -0
  315. /package/dist/{context-JQIOOI4W.js.map → chunks/chunk-4CRUCZR4.js.map} +0 -0
  316. /package/dist/{costTracker-6SL26FDB.js.map → chunks/chunk-54KOYG5C.js.map} +0 -0
  317. /package/dist/{customCommands-DNEJS3ZU.js.map → chunks/chunk-GCQCAXJZ.js.map} +0 -0
  318. /package/dist/{env-OFAXZ3XG.js.map → chunks/chunk-LB6TCPDI.js.map} +0 -0
  319. /package/dist/{kodeAgentSessionId-X6XWQW7B.js.map → chunks/client-SILZNM5N.js.map} +0 -0
  320. /package/dist/{kodeAgentSessionLoad-6N27AC5K.js.map → chunks/config-25HRTPSP.js.map} +0 -0
  321. /package/dist/{kodeAgentSessionResume-HUSAEO24.js.map → chunks/cost-tracker-Z2UZT2J5.js.map} +0 -0
  322. /package/dist/{kodeAgentStreamJson-NXFN7TXH.js.map → chunks/customCommands-TYMYZRG5.js.map} +0 -0
  323. /package/dist/{kodeAgentStructuredStdio-HGWJT7CU.js.map → chunks/engine-MRVF6FK6.js.map} +0 -0
  324. /package/dist/{kodeHooks-TDMXFWSO.js.map → chunks/env-TJ5NOBEB.js.map} +0 -0
  325. /package/dist/{llmLazy-7TD5N7XP.js.map → chunks/kodeAgentSessionId-VTNISJ2L.js.map} +0 -0
  326. /package/dist/{loader-AUXIJTY6.js.map → chunks/kodeAgentSessionLoad-YB2RKBGJ.js.map} +0 -0
  327. /package/dist/{mcp-BXJ3K7NZ.js.map → chunks/kodeAgentSessionResume-DZSIVKVA.js.map} +0 -0
  328. /package/dist/{messages-OFUJSPRV.js.map → chunks/kodeAgentStreamJson-X5PLS2S6.js.map} +0 -0
  329. /package/dist/{model-KPYCXWBK.js.map → chunks/kodeHooks-RVKYRJHG.js.map} +0 -0
  330. /package/dist/{openai-5G5D5Q4B.js.map → chunks/llmLazy-ZUSSE3ZA.js.map} +0 -0
  331. /package/dist/{outputStyles-HLDXFQK3.js.map → chunks/messages-EEWWLPHN.js.map} +0 -0
  332. /package/dist/{pluginValidation-DSFXZ4GF.js.map → chunks/model-5TIEKQPD.js.map} +0 -0
  333. /package/dist/{prompts-LWLAJRS2.js.map → chunks/openai-XXK3YZG4.js.map} +0 -0
  334. /package/dist/{query-HVPWL27C.js.map → chunks/outputStyles-FAJTXN2A.js.map} +0 -0
  335. /package/dist/{responsesStreaming-AW344PQO.js.map → chunks/permissions-HO7INPWM.js.map} +0 -0
  336. /package/dist/{ripgrep-YOPCY2GO.js.map → chunks/pluginValidation-DAM7WRTC.js.map} +0 -0
  337. /package/dist/{skillMarketplace-PSNKDINM.js.map → chunks/registry-XYJXMOA5.js.map} +0 -0
  338. /package/dist/{state-KNRWP3FO.js.map → chunks/responsesStreaming-JNGE2P3D.js.map} +0 -0
  339. /package/dist/{theme-7S2QN2FO.js.map → chunks/server-REXXF5IK.js.map} +0 -0
  340. /package/dist/{toolPermissionContext-65L65VEZ.js.map → chunks/skillMarketplace-N4HVHNST.js.map} +0 -0
  341. /package/dist/{toolPermissionSettings-GPOBH4IV.js.map → chunks/src-OROQIWP3.js.map} +0 -0
  342. /package/dist/{tools-FZU2FZBD.js.map → chunks/theme-YBJUIMWK.js.map} +0 -0
  343. /package/dist/{uuid-QN2CNKKN.js.map → chunks/toolPermissionContext-MOCTRR7N.js.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../apps/cli/src/ui/screens/ResumeConversation.tsx", "../../apps/cli/src/ui/screens/REPL/REPL.tsx", "../../apps/cli/src/ui/screens/REPL/REPLView.tsx", "../../apps/cli/src/ui/components/permissions/PermissionRequest.tsx", "../../apps/cli/src/ui/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.tsx", "../../apps/cli/src/ui/hooks/usePermissionRequestLogging.ts", "../../packages/core/src/utils/unaryLogging.ts", "../../apps/cli/src/ui/components/permissions/PermissionRequestTitle.tsx", "../../apps/cli/src/ui/components/permissions/FileEditPermissionRequest/FileEditToolDiff.tsx", "../../packages/core/src/utils/array.ts", "../../apps/cli/src/ui/utils/permissionModeCycleShortcut.ts", "../../apps/cli/src/ui/context/PermissionContext.tsx", "../../packages/core/src/types/PermissionMode.ts", "../../apps/cli/src/ui/context/permissionModeSideEffects.ts", "../../apps/cli/src/ui/components/permissions/BashPermissionRequest/BashPermissionRequest.tsx", "../../apps/cli/src/ui/components/permissions/hooks.ts", "../../apps/cli/src/ui/components/permissions/utils.ts", "../../apps/cli/src/ui/components/permissions/toolUseOptions.ts", "../../apps/cli/src/ui/components/permissions/FallbackPermissionRequest.tsx", "../../apps/cli/src/ui/hooks/useNotifyAfterTimeout.ts", "../../packages/core/src/services/notifier.ts", "../../apps/cli/src/ui/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.tsx", "../../apps/cli/src/ui/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.tsx", "../../apps/cli/src/ui/components/HighlightedCode.tsx", "../../apps/cli/src/ui/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.tsx", "../../apps/cli/src/ui/components/permissions/SlashCommandPermissionRequest/SlashCommandPermissionRequest.tsx", "../../apps/cli/src/ui/components/permissions/SkillPermissionRequest/SkillPermissionRequest.tsx", "../../apps/cli/src/ui/components/permissions/WebFetchPermissionRequest/WebFetchPermissionRequest.tsx", "../../apps/cli/src/ui/components/permissions/PlanModePermissionRequest/EnterPlanModePermissionRequest.tsx", "../../apps/cli/src/ui/components/permissions/PlanModePermissionRequest/ExitPlanModePermissionRequest.tsx", "../../apps/cli/src/utils/externalEditor.ts", "../../apps/cli/src/ui/components/permissions/PlanModePermissionRequest/ExitPlanModeOptions.ts", "../../apps/cli/src/ui/components/permissions/AskUserQuestionPermissionRequest/AskUserQuestionPermissionRequest.tsx", "../../apps/cli/src/ui/components/permissions/AskUserQuestionPermissionRequest/QuestionTabs.tsx", "../../apps/cli/src/ui/components/permissions/AskUserQuestionPermissionRequest/QuestionView.tsx", "../../apps/cli/src/ui/components/permissions/AskUserQuestionPermissionRequest/SubmitView.tsx", "../../apps/cli/src/ui/components/permissions/AskUserQuestionPermissionRequest/useAskUserQuestionKeyboard.ts", "../../apps/cli/src/ui/components/permissions/AskUserQuestionPermissionRequest/utils.ts", "../../apps/cli/src/ui/components/PromptInput/PromptInput.tsx", "../../packages/core/src/utils/startupProfile.ts", "../../apps/cli/src/ui/hooks/useArrowKeyHistory.ts", "../../apps/cli/src/ui/hooks/useStatusLine.ts", "../../packages/core/src/services/statusline.ts", "../../apps/cli/src/ui/hooks/useUnifiedCompletion/hook.ts", "../../apps/cli/src/utils/completion/context.ts", "../../apps/cli/src/utils/completion/fileSuggestions.ts", "../../apps/cli/src/utils/completion/advancedFuzzyMatcher.ts", "../../apps/cli/src/utils/completion/fuzzyMatcher.ts", "../../apps/cli/src/utils/completion/mentionSuggestions.ts", "../../apps/cli/src/utils/completion/slashCommandSuggestions.ts", "../../apps/cli/src/utils/completion/commonUnixCommands.ts", "../../apps/cli/src/utils/completion/unixCommandSuggestions.ts", "../../apps/cli/src/utils/completion/generateSuggestions.ts", "../../apps/cli/src/ui/hooks/useUnifiedCompletion/types.ts", "../../apps/cli/src/ui/hooks/useUnifiedCompletion/useAgentSuggestions.ts", "../../apps/cli/src/ui/hooks/useUnifiedCompletion/actions.ts", "../../apps/cli/src/ui/hooks/useUnifiedCompletion/useModelSuggestions.ts", "../../apps/cli/src/ui/hooks/useUnifiedCompletion/useSystemCommands.ts", "../../apps/cli/src/ui/hooks/useUnifiedCompletion/useAutoTrigger.ts", "../../apps/cli/src/ui/hooks/useUnifiedCompletion/useTabKey.ts", "../../apps/cli/src/ui/hooks/useUnifiedCompletion/useNavigationKeys.ts", "../../apps/cli/src/ui/utils/promptInputSpecialKey.ts", "../../packages/core/src/utils/hashCommand.ts", "../../apps/cli/src/ui/utils/processUserInput.tsx", "../../apps/cli/src/ui/components/Bug.tsx", "../../packages/core/src/utils/browser.ts", "../../apps/cli/src/commands/builtin/bug.tsx", "../../apps/cli/src/commands/builtin/clear.ts", "../../apps/cli/src/commands/builtin/compact.ts", "../../apps/cli/src/ui/components/Config.tsx", "../../apps/cli/src/commands/builtin/config.tsx", "../../apps/cli/src/commands/builtin/cost.ts", "../../apps/cli/src/commands/debug/ctx_viz.ts", "../../apps/cli/src/commands/builtin/doctor.ts", "../../apps/cli/src/ui/components/Help.tsx", "../../apps/cli/src/commands/builtin/help.tsx", "../../apps/cli/src/ui/components/ProjectOnboarding.tsx", "../../packages/core/src/constants/releaseNotes.ts", "../../apps/cli/src/commands/builtin/init.ts", "../../apps/cli/src/commands/debug/listen.ts", "../../apps/cli/src/utils/replStaticSplit.ts", "../../apps/cli/src/commands/debug/messages_debug.ts", "../../apps/cli/src/commands/builtin/login.tsx", "../../apps/cli/src/ui/components/ConsoleOAuthFlow.tsx", "../../packages/core/src/services/oauth.ts", "../../packages/core/src/constants/oauth.ts", "../../apps/cli/src/ui/components/ConsoleOAuthStatusMessage.tsx", "../../apps/cli/src/ui/components/Spinner.tsx", "../../apps/cli/src/ui/components/oauthTypes.ts", "../../packages/core/src/utils/auth.ts", "../../apps/cli/src/commands/builtin/logout.tsx", "../../apps/cli/src/commands/mcp/mcp.ts", "../../apps/cli/src/commands/plugin/plugin.ts", "../../apps/cli/src/commands/builtin/output-style.tsx", "../../apps/cli/src/commands/builtin/model.tsx", "../../apps/cli/src/ui/components/ModelConfig.tsx", "../../apps/cli/src/ui/components/ModelListManager.tsx", "../../apps/cli/src/commands/builtin/modelstatus.tsx", "../../apps/cli/src/ui/components/ModelStatusDisplay.tsx", "../../apps/cli/src/commands/builtin/onboarding.tsx", "../../apps/cli/src/commands/builtin/pr_comments.ts", "../../apps/cli/src/commands/builtin/refreshCommands.ts", "../../apps/cli/src/commands/builtin/release-notes.ts", "../../apps/cli/src/commands/builtin/review.ts", "../../apps/cli/src/commands/builtin/rename.ts", "../../apps/cli/src/commands/builtin/statusline.ts", "../../apps/cli/src/commands/builtin/tag.ts", "../../apps/cli/src/commands/builtin/todos.tsx", "../../apps/cli/src/commands/debug/resume.tsx", "../../apps/cli/src/commands/agent/agents.tsx", "../../apps/cli/src/commands/agent/agents/ui/AgentsUI.tsx", "../../apps/cli/src/commands/agent/agents/tooling.ts", "../../apps/cli/src/commands/agent/agents/storage.ts", "../../apps/cli/src/commands/agent/agents/generation.ts", "../../apps/cli/src/commands/agent/agents/ui/AgentMenu.tsx", "../../apps/cli/src/commands/agent/agents/ui/components.tsx", "../../apps/cli/src/commands/agent/agents/ui/AgentsListView.tsx", "../../apps/cli/src/commands/agent/agents/ui/utils.ts", "../../apps/cli/src/commands/agent/agents/ui/types.ts", "../../apps/cli/src/commands/agent/agents/ui/CreateAgentWizard.tsx", "../../apps/cli/src/commands/agent/agents/ui/wizard/Wizard.tsx", "../../apps/cli/src/commands/agent/agents/ui/wizard/types.ts", "../../apps/cli/src/commands/agent/agents/ui/wizard/steps/StepAgentType.tsx", "../../apps/cli/src/commands/agent/agents/ui/colors.ts", "../../apps/cli/src/commands/agent/agents/ui/wizard/steps/StepChooseColor.tsx", "../../apps/cli/src/commands/agent/agents/ui/ColorPicker.tsx", "../../apps/cli/src/commands/agent/agents/ui/wizard/steps/StepChooseLocation.tsx", "../../apps/cli/src/commands/agent/agents/ui/wizard/steps/StepChooseMethod.tsx", "../../apps/cli/src/commands/agent/agents/ui/wizard/steps/StepConfirm.tsx", "../../apps/cli/src/commands/agent/agents/ui/wizard/steps/StepDescription.tsx", "../../apps/cli/src/commands/agent/agents/ui/wizard/steps/StepGenerationPrompt.tsx", "../../apps/cli/src/commands/agent/agents/ui/wizard/steps/StepSelectModel.tsx", "../../apps/cli/src/commands/agent/agents/ui/wizard/steps/StepSelectTools.tsx", "../../apps/cli/src/commands/agent/agents/ui/wizard/ToolPicker.tsx", "../../apps/cli/src/commands/agent/agents/ui/wizard/steps/StepSystemPrompt.tsx", "../../apps/cli/src/commands/agent/agents/ui/DeleteConfirm.tsx", "../../apps/cli/src/commands/agent/agents/ui/EditAgent.tsx", "../../apps/cli/src/commands/agent/agents/ui/ViewAgent.tsx", "../../apps/cli/src/commands/registry.ts", "../../apps/cli/src/ui/components/messages/UserBashInputMessage.tsx", "../../apps/cli/src/ui/utils/slashCommands.tsx", "../../apps/cli/src/ui/utils/processUserInputHelpers.ts", "../../apps/cli/src/ui/components/PromptInput/pastes.ts", "../../apps/cli/src/ui/components/PromptInput/hashCommand.ts", "../../apps/cli/src/ui/components/PromptInput/submit.ts", "../../apps/cli/src/ui/components/PromptInput/PromptInputView.tsx", "../../apps/cli/src/ui/components/ModeIndicator.tsx", "../../apps/cli/src/ui/components/SentryErrorBoundary.ts", "../../apps/cli/src/ui/components/TokenWarning.tsx", "../../apps/cli/src/ui/components/PromptInput/PromptInputCompletionPanel.tsx", "../../apps/cli/src/ui/components/PromptInput/useExternalEdit.ts", "../../apps/cli/src/ui/components/PromptInput/useQuickModelSwitch.ts", "../../apps/cli/src/ui/components/RequestStatusIndicator.tsx", "../../apps/cli/src/ui/components/CostThresholdDialog.tsx", "../../apps/cli/src/ui/components/Link.tsx", "../../apps/cli/src/ui/components/binary-feedback/BinaryFeedback.tsx", "../../apps/cli/src/ui/components/binary-feedback/BinaryFeedbackView.tsx", "../../apps/cli/src/ui/components/Message.tsx", "../../apps/cli/src/ui/components/messages/UserToolResultMessage/UserToolResultMessage.tsx", "../../apps/cli/src/ui/components/messages/UserToolResultMessage/UserToolCanceledMessage.tsx", "../../apps/cli/src/ui/components/messages/UserToolResultMessage/UserToolErrorMessage.tsx", "../../apps/cli/src/ui/components/messages/UserToolResultMessage/UserToolRejectMessage.tsx", "../../apps/cli/src/ui/components/FallbackToolUseRejectedMessage.tsx", "../../apps/cli/src/ui/components/messages/UserToolResultMessage/utils.tsx", "../../apps/cli/src/ui/toolPresenters/registry.tsx", "../../apps/cli/src/ui/toolPresenters/GlobToolPresenter.tsx", "../../apps/cli/src/ui/components/Cost.tsx", "../../apps/cli/src/ui/toolPresenters/KillShellToolPresenter.tsx", "../../apps/cli/src/ui/toolPresenters/TaskOutputToolPresenter.tsx", "../../apps/cli/src/ui/toolPresenters/FileEditToolPresenter.tsx", "../../apps/cli/src/ui/components/FileEditToolUpdatedMessage.tsx", "../../apps/cli/src/ui/toolPresenters/FileWriteToolPresenter.tsx", "../../apps/cli/src/ui/components/messages/UserToolResultMessage/UserToolSuccessMessage.tsx", "../../apps/cli/src/ui/components/messages/AssistantToolUseMessage.tsx", "../../apps/cli/src/ui/components/ToolUseLoader.tsx", "../../apps/cli/src/ui/hooks/useInterval.ts", "../../packages/tools/src/tools/ai/ThinkTool/ThinkTool.tsx", "../../packages/tools/src/tools/ai/ThinkTool/prompt.ts", "../../apps/cli/src/ui/components/messages/AssistantThinkingMessage.tsx", "../../apps/cli/src/ui/components/messages/TaskToolMessage.tsx", "../../apps/cli/src/ui/components/messages/AssistantTextMessage.tsx", "../../apps/cli/src/ui/components/messages/AssistantBashOutputMessage.tsx", "../../apps/cli/src/ui/components/messages/AssistantLocalCommandOutputMessage.tsx", "../../apps/cli/src/ui/components/messages/UserKodingInputMessage.tsx", "../../apps/cli/src/ui/components/messages/UserCommandMessage.tsx", "../../apps/cli/src/ui/components/messages/UserPromptMessage.tsx", "../../apps/cli/src/ui/components/messages/UserTextMessage.tsx", "../../apps/cli/src/ui/components/messages/UserImageMessage.tsx", "../../apps/cli/src/ui/components/messages/AssistantRedactedThinkingMessage.tsx", "../../apps/cli/src/ui/components/binary-feedback/BinaryFeedbackOption.tsx", "../../apps/cli/src/ui/components/MessageSelector.tsx", "../../apps/cli/src/ui/screens/REPL/useReplController.tsx", "../../apps/cli/src/ui/hooks/useCostSummary.ts", "../../apps/cli/src/ui/hooks/useLogStartupTime.ts", "../../apps/cli/src/ui/hooks/useApiKeyVerification.ts", "../../apps/cli/src/ui/hooks/useCancelRequest.ts", "../../apps/cli/src/ui/hooks/useCanUseTool.ts", "../../apps/cli/src/ui/hooks/useLogMessages.ts", "../../apps/cli/src/ui/screens/REPL/useTranscriptItems.tsx", "../../apps/cli/src/ui/components/MessageResponse.tsx", "../../apps/cli/src/ui/screens/REPL/useRequestToolUsePermission.ts", "../../apps/cli/src/ui/screens/REPL/useReplQuery.ts", "../../apps/cli/src/ui/screens/REPL/useReplInit.ts", "../../apps/cli/src/ui/screens/REPL/promptInputProps.ts", "../../apps/cli/src/ui/screens/REPL/useMessageSelectorSelect.ts", "../../apps/cli/src/ui/components/SessionSelector.tsx"],
4
+ "sourcesContent": ["import React from 'react'\nimport { render } from 'ink'\nimport { REPL } from './REPL'\nimport { SessionSelector } from '#ui-ink/components/SessionSelector'\nimport type { KodeAgentSessionListItem } from '#protocol/utils/kodeAgentSessionResume'\nimport { logError } from '#core/utils/log'\nimport type { Tool } from '#core/tooling/Tool'\nimport type { Command } from '#cli-commands'\nimport { isDefaultSlowAndCapableModel } from '#core/utils/model'\nimport type { WrappedClient } from '#core/mcp/client'\nimport { loadKodeAgentSessionMessages } from '#protocol/utils/kodeAgentSessionLoad'\nimport { setKodeAgentSessionId } from '#protocol/utils/kodeAgentSessionId'\nimport { randomUUID } from 'crypto'\nimport { dateToFilename } from '#core/utils/log'\n\ntype Props = {\n cwd: string\n commands: Command[]\n context: { unmount?: () => void }\n sessions: KodeAgentSessionListItem[]\n tools: Tool[]\n verbose: boolean | undefined\n safeMode?: boolean\n debug?: boolean\n disableSlashCommands?: boolean\n mcpClients?: WrappedClient[]\n initialPrompt?: string\n forkSession?: boolean\n forkSessionId?: string | null\n initialUpdateVersion?: string | null\n initialUpdateCommands?: string[] | null\n}\n\nexport function ResumeConversation({\n cwd,\n context,\n commands,\n sessions,\n tools,\n verbose,\n safeMode,\n debug,\n disableSlashCommands,\n mcpClients,\n initialPrompt,\n forkSession,\n forkSessionId,\n initialUpdateVersion,\n initialUpdateCommands,\n}: Props): React.ReactNode {\n async function onSelect(index: number) {\n try {\n const selected = sessions[index]\n if (!selected) return\n context.unmount?.()\n\n const resumedFromSessionId = selected.sessionId\n const effectiveSessionId = forkSession\n ? forkSessionId?.trim() || randomUUID()\n : resumedFromSessionId\n setKodeAgentSessionId(effectiveSessionId)\n\n const messages = loadKodeAgentSessionMessages({\n cwd,\n sessionId: resumedFromSessionId,\n })\n const isDefaultModel = await isDefaultSlowAndCapableModel()\n\n render(\n <REPL\n commands={commands}\n debug={debug}\n disableSlashCommands={disableSlashCommands}\n initialPrompt={initialPrompt ?? ''}\n messageLogName={dateToFilename(new Date())}\n shouldShowPromptInput={true}\n verbose={verbose}\n tools={tools}\n safeMode={safeMode}\n mcpClients={mcpClients}\n initialMessages={messages}\n isDefaultModel={isDefaultModel}\n initialUpdateVersion={initialUpdateVersion}\n initialUpdateCommands={initialUpdateCommands}\n />,\n {\n exitOnCtrlC: false,\n },\n )\n } catch (e) {\n logError(`Failed to load conversation: ${e}`)\n throw e\n }\n }\n\n return <SessionSelector sessions={sessions} onSelect={onSelect} />\n}\n", "import type { ReactNode } from 'react'\nimport * as React from 'react'\nimport { REPLView } from './REPLView'\nimport { useReplController } from './useReplController'\nimport type { REPLProps } from './types'\n\nexport type { BinaryFeedbackContext } from './types'\n\nexport function REPL(props: REPLProps): ReactNode {\n const viewProps = useReplController(props)\n return <REPLView {...viewProps} />\n}\n", "import { Box, Newline, Static } from 'ink'\nimport * as React from 'react'\nimport type { ReactNode } from 'react'\nimport type { ToolUseConfirm } from '#ui-ink/components/permissions/PermissionRequest'\nimport { PermissionRequest } from '#ui-ink/components/permissions/PermissionRequest'\nimport PromptInput from '#ui-ink/components/PromptInput'\nimport { RequestStatusIndicator } from '#ui-ink/components/RequestStatusIndicator'\nimport { CostThresholdDialog } from '#ui-ink/components/CostThresholdDialog'\nimport { BinaryFeedback } from '#ui-ink/components/binary-feedback/BinaryFeedback'\nimport { MessageSelector } from '#ui-ink/components/MessageSelector'\nimport { PermissionProvider } from '#ui-ink/context/PermissionContext'\nimport {\n normalizeMessagesForAPI,\n type NormalizedMessage,\n} from '#core/utils/messages'\nimport type { Message as MessageType } from '#core/query'\nimport type { Tool } from '#core/tooling/Tool'\nimport type { TranscriptItem } from './useTranscriptItems'\nimport type { BinaryFeedbackContext } from './types'\n\nexport function REPLView({\n conversationKey,\n safeMode,\n debug,\n forkNumber,\n staticItems,\n transientItems,\n toolJSX,\n toolUseConfirm,\n setToolUseConfirm,\n binaryFeedbackContext,\n setBinaryFeedbackContext,\n isLoading,\n verbose,\n normalizedMessages,\n tools,\n erroredToolUseIDs,\n inProgressToolUseIDs,\n unresolvedToolUseIDs,\n showingCostDialog,\n onCostDialogDone,\n shouldShowPromptInput,\n isMessageSelectorVisible,\n promptInputProps,\n messageSelectorMessages,\n onMessageSelectorSelect,\n onMessageSelectorEscape,\n}: {\n conversationKey: string\n safeMode: boolean\n debug: boolean\n forkNumber: number\n staticItems: TranscriptItem[]\n transientItems: TranscriptItem[]\n toolJSX: { jsx: ReactNode | null; shouldHidePromptInput: boolean } | null\n toolUseConfirm: ToolUseConfirm | null\n setToolUseConfirm: (confirm: ToolUseConfirm | null) => void\n binaryFeedbackContext: BinaryFeedbackContext | null\n setBinaryFeedbackContext: (ctx: BinaryFeedbackContext | null) => void\n isLoading: boolean\n verbose: boolean\n normalizedMessages: NormalizedMessage[]\n tools: Tool[]\n erroredToolUseIDs: Set<string>\n inProgressToolUseIDs: Set<string>\n unresolvedToolUseIDs: Set<string>\n showingCostDialog: boolean\n onCostDialogDone: () => void\n shouldShowPromptInput: boolean\n isMessageSelectorVisible: boolean\n promptInputProps: React.ComponentProps<typeof PromptInput>\n messageSelectorMessages: MessageType[]\n onMessageSelectorSelect: (message: MessageType) => void | Promise<void>\n onMessageSelectorEscape: () => void\n}): React.ReactNode {\n return (\n <PermissionProvider\n conversationKey={conversationKey}\n isBypassPermissionsModeAvailable={!safeMode}\n >\n <React.Fragment>\n <React.Fragment key={`static-messages-${forkNumber}`}>\n <Static\n items={staticItems}\n children={(item, index) => (\n <React.Fragment key={index}>{item.jsx}</React.Fragment>\n )}\n />\n </React.Fragment>\n {transientItems.map(_ => _.jsx)}\n <Box\n borderColor=\"red\"\n borderStyle={debug ? 'single' : undefined}\n flexDirection=\"column\"\n width=\"100%\"\n >\n {!toolJSX &&\n !toolUseConfirm &&\n !binaryFeedbackContext &&\n isLoading && <RequestStatusIndicator />}\n {toolJSX ? toolJSX.jsx : null}\n {!toolJSX && binaryFeedbackContext && !isMessageSelectorVisible && (\n <BinaryFeedback\n m1={binaryFeedbackContext.m1}\n m2={binaryFeedbackContext.m2}\n resolve={result => {\n binaryFeedbackContext.resolve(result)\n setTimeout(() => setBinaryFeedbackContext(null), 0)\n }}\n verbose={verbose}\n normalizedMessages={normalizedMessages}\n tools={tools}\n debug={debug}\n erroredToolUseIDs={erroredToolUseIDs}\n inProgressToolUseIDs={inProgressToolUseIDs}\n unresolvedToolUseIDs={unresolvedToolUseIDs}\n />\n )}\n {!toolJSX &&\n toolUseConfirm &&\n !isMessageSelectorVisible &&\n !binaryFeedbackContext && (\n <PermissionRequest\n toolUseConfirm={toolUseConfirm}\n onDone={() => setToolUseConfirm(null)}\n verbose={verbose}\n />\n )}\n {!toolJSX &&\n !toolUseConfirm &&\n !isMessageSelectorVisible &&\n !binaryFeedbackContext &&\n showingCostDialog && (\n <CostThresholdDialog onDone={onCostDialogDone} />\n )}\n\n {!toolUseConfirm &&\n !toolJSX?.shouldHidePromptInput &&\n shouldShowPromptInput &&\n !isMessageSelectorVisible &&\n !binaryFeedbackContext &&\n !showingCostDialog && <PromptInput {...promptInputProps} />}\n </Box>\n {isMessageSelectorVisible && (\n <MessageSelector\n erroredToolUseIDs={erroredToolUseIDs}\n unresolvedToolUseIDs={unresolvedToolUseIDs}\n messages={normalizeMessagesForAPI(messageSelectorMessages)}\n onSelect={onMessageSelectorSelect}\n onEscape={onMessageSelectorEscape}\n tools={tools}\n />\n )}\n <Newline />\n </React.Fragment>\n </PermissionProvider>\n )\n}\n", "import { useInput } from 'ink'\nimport * as React from 'react'\nimport { Tool } from '#core/tooling/Tool'\nimport { AssistantMessage } from '#core/query'\nimport type { ToolUseContext } from '#core/tooling/Tool'\nimport { FileEditTool } from '#tools/tools/filesystem/FileEditTool/FileEditTool'\nimport { FileWriteTool } from '#tools/tools/filesystem/FileWriteTool/FileWriteTool'\nimport { BashTool } from '#tools/tools/system/BashTool/BashTool'\nimport { FileEditPermissionRequest } from './FileEditPermissionRequest/FileEditPermissionRequest'\nimport { BashPermissionRequest } from './BashPermissionRequest/BashPermissionRequest'\nimport { FallbackPermissionRequest } from './FallbackPermissionRequest'\nimport { useNotifyAfterTimeout } from '#ui-ink/hooks/useNotifyAfterTimeout'\nimport { FileWritePermissionRequest } from './FileWritePermissionRequest/FileWritePermissionRequest'\nimport { type CommandSubcommandPrefixResult } from '#core/utils/commands'\nimport { FilesystemPermissionRequest } from './FilesystemPermissionRequest/FilesystemPermissionRequest'\nimport { NotebookEditTool } from '#tools/tools/filesystem/NotebookEditTool/NotebookEditTool'\nimport { GlobTool } from '#tools/tools/filesystem/GlobTool/GlobTool'\nimport { GrepTool } from '#tools/tools/search/GrepTool/GrepTool'\nimport { FileReadTool } from '#tools/tools/filesystem/FileReadTool/FileReadTool'\nimport { PRODUCT_NAME } from '#core/constants/product'\nimport { SlashCommandTool } from '#tools/tools/interaction/SlashCommandTool/SlashCommandTool'\nimport { SkillTool } from '#tools/tools/interaction/SkillTool/SkillTool'\nimport { SlashCommandPermissionRequest } from './SlashCommandPermissionRequest/SlashCommandPermissionRequest'\nimport { SkillPermissionRequest } from './SkillPermissionRequest/SkillPermissionRequest'\nimport { WebFetchTool } from '#tools/tools/network/WebFetchTool/WebFetchTool'\nimport { WebFetchPermissionRequest } from './WebFetchPermissionRequest/WebFetchPermissionRequest'\nimport { EnterPlanModeTool } from '#tools/tools/interaction/PlanModeTool/EnterPlanModeTool'\nimport { ExitPlanModeTool } from '#tools/tools/interaction/PlanModeTool/ExitPlanModeTool'\nimport { EnterPlanModePermissionRequest } from './PlanModePermissionRequest/EnterPlanModePermissionRequest'\nimport { ExitPlanModePermissionRequest } from './PlanModePermissionRequest/ExitPlanModePermissionRequest'\nimport { AskUserQuestionTool } from '#tools/tools/interaction/AskUserQuestionTool/AskUserQuestionTool'\nimport { AskUserQuestionPermissionRequest } from './AskUserQuestionPermissionRequest/AskUserQuestionPermissionRequest'\nimport type { ToolPermissionContextUpdate } from '#core/types/toolPermissionContext'\n\nfunction permissionComponentForTool(tool: Tool) {\n switch (tool) {\n case FileEditTool:\n return FileEditPermissionRequest\n case FileWriteTool:\n return FileWritePermissionRequest\n case BashTool:\n return BashPermissionRequest\n case GlobTool:\n case GrepTool:\n case FileReadTool:\n case NotebookEditTool:\n return FilesystemPermissionRequest\n case SlashCommandTool:\n return SlashCommandPermissionRequest\n case SkillTool:\n return SkillPermissionRequest\n case WebFetchTool:\n return WebFetchPermissionRequest\n case EnterPlanModeTool:\n return EnterPlanModePermissionRequest\n case ExitPlanModeTool:\n return ExitPlanModePermissionRequest\n case AskUserQuestionTool:\n return AskUserQuestionPermissionRequest\n default:\n return FallbackPermissionRequest\n }\n}\n\nexport type PermissionRequestProps = {\n toolUseConfirm: ToolUseConfirm\n onDone(): void\n verbose: boolean\n}\n\nexport function toolUseConfirmGetPrefix(\n toolUseConfirm: ToolUseConfirm,\n): string | null {\n const prefix = toolUseConfirm.commandPrefix\n if (!prefix) return null\n if (prefix.commandInjectionDetected) return null\n if (!('commandPrefix' in prefix)) return null\n return prefix.commandPrefix ?? null\n}\n\nexport type ToolUseConfirm = {\n assistantMessage: AssistantMessage\n tool: Tool\n description: string\n input: { [key: string]: unknown }\n commandPrefix: CommandSubcommandPrefixResult | null\n toolUseContext: ToolUseContext\n suggestions?: ToolPermissionContextUpdate[]\n // NOTE: riskScore is carried through to support current permission UX.\n riskScore: number | null\n onAbort(): void\n onAllow(type: 'permanent' | 'temporary'): void\n onReject(rejectionMessage?: string): void\n}\n\n// NOTE: Permission rendering is centralized to keep UX consistent across tools/hosts.\nexport function PermissionRequest({\n toolUseConfirm,\n onDone,\n verbose,\n}: PermissionRequestProps): React.ReactNode {\n // Handle Ctrl+C\n useInput((input, key) => {\n if (key.ctrl && input === 'c') {\n onDone()\n toolUseConfirm.onReject()\n }\n })\n\n const toolName =\n toolUseConfirm.tool.userFacingName?.() || toolUseConfirm.tool.name || 'Tool'\n useNotifyAfterTimeout(\n `${PRODUCT_NAME} needs your permission to use ${toolName}`,\n )\n\n const PermissionComponent = permissionComponentForTool(toolUseConfirm.tool)\n\n return (\n <PermissionComponent\n toolUseConfirm={toolUseConfirm}\n onDone={onDone}\n verbose={verbose}\n />\n )\n}\n", "import { Select } from '#ui-ink/components/CustomSelect/select'\nimport chalk from 'chalk'\nimport { Box, Text, useInput } from 'ink'\nimport { basename, dirname, extname } from 'path'\nimport React, { useCallback, useMemo } from 'react'\nimport {\n UnaryEvent,\n usePermissionRequestLogging,\n} from '#ui-ink/hooks/usePermissionRequestLogging'\nimport { env } from '#core/utils/env'\nimport { getTheme } from '#core/utils/theme'\nimport { logUnaryEvent } from '#core/utils/unaryLogging'\nimport { type ToolUseConfirm } from '#ui-ink/components/permissions/PermissionRequest'\nimport {\n PermissionRequestTitle,\n textColorForRiskScore,\n} from '#ui-ink/components/permissions/PermissionRequestTitle'\nimport { FileEditToolDiff } from './FileEditToolDiff'\nimport { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\nimport { getPermissionModeCycleShortcut } from '#ui-ink/utils/permissionModeCycleShortcut'\nimport { usePermissionContext } from '#ui-ink/context/PermissionContext'\nimport { isPathInWorkingDirectories } from '#core/utils/permissions/fileToolPermissionEngine'\n\nfunction getOptions(args: {\n path: string\n modeCycleShortcut: string\n isInWorkingDir: boolean\n hasSessionSuggestion: boolean\n}) {\n const dirPath = dirname(args.path)\n const dirName = basename(dirPath) || 'this directory'\n\n const options = [\n {\n label: 'Yes',\n value: 'yes',\n },\n {\n label: `No, and provide instructions (${chalk.bold.hex(getTheme().warning)('esc')})`,\n value: 'no',\n },\n ]\n\n if (args.hasSessionSuggestion) {\n const shortcutHint = chalk.bold.hex(getTheme().warning)(\n `(${args.modeCycleShortcut})`,\n )\n const sessionLabel = args.isInWorkingDir\n ? `Yes, allow all edits during this session ${shortcutHint}`\n : `Yes, allow all edits in ${chalk.bold(`${dirName}/`)} during this session ${shortcutHint}`\n options.splice(1, 0, { label: sessionLabel, value: 'yes-session' })\n }\n\n return options\n}\n\ntype Props = {\n toolUseConfirm: ToolUseConfirm\n onDone(): void\n verbose: boolean\n}\n\nexport function FileEditPermissionRequest({\n toolUseConfirm,\n onDone,\n verbose,\n}: Props): React.ReactNode {\n const { columns } = useTerminalSize()\n const { applyToolPermissionUpdate, toolPermissionContext } =\n usePermissionContext()\n const { file_path, new_string, old_string } = toolUseConfirm.input as {\n file_path: string\n new_string: string\n old_string: string\n }\n const modeCycleShortcut = useMemo(() => getPermissionModeCycleShortcut(), [])\n const hasSessionSuggestion = (toolUseConfirm.suggestions?.length ?? 0) > 0\n const isInWorkingDir = isPathInWorkingDirectories(\n dirname(file_path),\n toolPermissionContext,\n )\n\n const unaryEvent = useMemo<UnaryEvent>(\n () => ({\n completion_type: 'str_replace_single',\n language_name: extractLanguageName(file_path),\n }),\n [file_path],\n )\n\n usePermissionRequestLogging(toolUseConfirm, unaryEvent)\n\n const handleChoice = useCallback(\n (newValue: string) => {\n switch (newValue) {\n case 'yes':\n extractLanguageName(file_path).then(language => {\n logUnaryEvent({\n completion_type: 'str_replace_single',\n event: 'accept',\n metadata: {\n language_name: language,\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n })\n // Note: We call onDone before onAllow to hide the\n // permission request before we render the next message\n onDone()\n toolUseConfirm.onAllow('temporary')\n return\n case 'yes-session':\n extractLanguageName(file_path).then(language => {\n logUnaryEvent({\n completion_type: 'str_replace_single',\n event: 'accept',\n metadata: {\n language_name: language,\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n })\n if (hasSessionSuggestion) {\n for (const update of toolUseConfirm.suggestions ?? []) {\n applyToolPermissionUpdate(update)\n }\n }\n onDone()\n toolUseConfirm.onAllow(\n hasSessionSuggestion ? 'permanent' : 'temporary',\n )\n return\n case 'no':\n extractLanguageName(file_path).then(language => {\n logUnaryEvent({\n completion_type: 'str_replace_single',\n event: 'reject',\n metadata: {\n language_name: language,\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n })\n // Note: We call onDone before onAllow to hide the\n // permission request before we render the next message\n onDone()\n toolUseConfirm.onReject()\n return\n }\n },\n [\n applyToolPermissionUpdate,\n file_path,\n hasSessionSuggestion,\n onDone,\n toolUseConfirm,\n ],\n )\n\n useInput((inputChar, key) => {\n if (!modeCycleShortcut.check(inputChar, key)) return\n if (!hasSessionSuggestion) return\n handleChoice('yes-session')\n return true\n })\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={textColorForRiskScore(toolUseConfirm.riskScore)}\n marginTop={1}\n paddingLeft={1}\n paddingRight={1}\n paddingBottom={1}\n >\n <PermissionRequestTitle\n title=\"Edit file\"\n riskScore={toolUseConfirm.riskScore}\n />\n <FileEditToolDiff\n file_path={file_path}\n new_string={new_string}\n old_string={old_string}\n verbose={verbose}\n width={columns - 12}\n />\n <Box flexDirection=\"column\">\n <Text>\n Do you want to make this edit to{' '}\n <Text bold>{basename(file_path)}</Text>?\n </Text>\n <Select\n options={getOptions({\n path: file_path,\n modeCycleShortcut: modeCycleShortcut.displayText,\n isInWorkingDir,\n hasSessionSuggestion,\n })}\n onChange={handleChoice}\n />\n </Box>\n </Box>\n )\n}\n\nasync function extractLanguageName(file_path: string): Promise<string> {\n const ext = extname(file_path)\n if (!ext) {\n return 'unknown'\n }\n const Highlight = (await import('highlight.js')) as unknown as {\n default: { getLanguage(ext: string): { name: string | undefined } }\n }\n return Highlight.default.getLanguage(ext.slice(1))?.name ?? 'unknown'\n}\n", "import { useEffect } from 'react'\n\nimport { logUnaryEvent, CompletionType } from '#core/utils/unaryLogging'\nimport { ToolUseConfirm } from '#ui-ink/components/permissions/PermissionRequest'\nimport { env } from '#core/utils/env'\n\nexport type UnaryEvent = {\n completion_type: CompletionType\n language_name: string | Promise<string>\n}\n\n/**\n * Logs permission request events via unary logging.\n * Can handle either a string or Promise<string> for language_name.\n */\nexport function usePermissionRequestLogging(\n toolUseConfirm: ToolUseConfirm,\n unaryEvent: UnaryEvent,\n): void {\n useEffect(() => {\n // Handle string or Promise language name\n const languagePromise = Promise.resolve(unaryEvent.language_name)\n\n // Log unary event once language is resolved\n languagePromise.then(language => {\n logUnaryEvent({\n completion_type: unaryEvent.completion_type,\n event: 'response',\n metadata: {\n language_name: language,\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n })\n }, [toolUseConfirm, unaryEvent])\n}\n", "export type CompletionType =\n | 'str_replace_single'\n | 'write_file_single'\n | 'tool_use_single'\n\ntype LogEvent = {\n completion_type: CompletionType\n event: 'accept' | 'reject' | 'response'\n metadata: {\n language_name: string\n message_id: string\n platform: string\n }\n}\n\nexport function logUnaryEvent(event: LogEvent): void {\n // intentionally no-op\n}\n", "import * as React from 'react'\nimport { Box, Text } from 'ink'\nimport { getTheme } from '#core/utils/theme'\n\nexport type RiskScoreCategory = 'low' | 'moderate' | 'high'\n\nexport function categoryForRiskScore(riskScore: number): RiskScoreCategory {\n return riskScore >= 70 ? 'high' : riskScore >= 30 ? 'moderate' : 'low'\n}\n\nfunction colorSchemeForRiskScoreCategory(category: RiskScoreCategory): {\n highlightColor: string\n textColor: string\n} {\n const theme = getTheme()\n switch (category) {\n case 'low':\n return {\n highlightColor: theme.success,\n textColor: theme.permission,\n }\n case 'moderate':\n return {\n highlightColor: theme.warning,\n textColor: theme.warning,\n }\n case 'high':\n return {\n highlightColor: theme.error,\n textColor: theme.error,\n }\n }\n}\n\nexport function textColorForRiskScore(riskScore: number | null): string {\n if (riskScore === null) {\n return getTheme().permission\n }\n const category = categoryForRiskScore(riskScore)\n return colorSchemeForRiskScoreCategory(category).textColor\n}\n\nexport function PermissionRiskScore({\n riskScore,\n}: {\n riskScore: number\n}): React.ReactNode {\n const category = categoryForRiskScore(riskScore)\n return <Text color={textColorForRiskScore(riskScore)}>Risk: {category}</Text>\n}\n\ntype Props = {\n title: string\n riskScore: number | null\n}\n\nexport function PermissionRequestTitle({\n title,\n riskScore,\n}: Props): React.ReactNode {\n return (\n <Box flexDirection=\"column\">\n <Text bold color={getTheme().permission}>\n {title}\n </Text>\n {riskScore !== null && <PermissionRiskScore riskScore={riskScore} />}\n </Box>\n )\n}\n", "import * as React from 'react'\nimport { existsSync, readFileSync } from 'fs'\nimport { useMemo } from 'react'\nimport { StructuredDiff } from '#ui-ink/components/StructuredDiff'\nimport { Box, Text } from 'ink'\nimport { getTheme } from '#core/utils/theme'\nimport { intersperse } from '#core/utils/array'\nimport { getCwd } from '#core/utils/state'\nimport { relative } from 'path'\nimport { getPatch } from '#core/utils/diff'\n\ntype Props = {\n file_path: string\n new_string: string\n old_string: string\n verbose: boolean\n useBorder?: boolean\n width: number\n}\n\nexport function FileEditToolDiff({\n file_path,\n new_string,\n old_string,\n verbose,\n useBorder = true,\n width,\n}: Props): React.ReactNode {\n const file = useMemo(\n () => (existsSync(file_path) ? readFileSync(file_path, 'utf8') : ''),\n [file_path],\n )\n const patch = useMemo(\n () =>\n getPatch({\n filePath: file_path,\n fileContents: file,\n oldStr: old_string,\n newStr: new_string,\n }),\n [file_path, file, old_string, new_string],\n )\n\n return (\n <Box flexDirection=\"column\">\n <Box\n borderColor={getTheme().secondaryBorder}\n borderStyle={useBorder ? 'round' : undefined}\n flexDirection=\"column\"\n paddingX={1}\n >\n <Box paddingBottom={1}>\n <Text bold>\n {verbose ? file_path : relative(getCwd(), file_path)}\n </Text>\n </Box>\n {intersperse(\n patch.map(_ => (\n <StructuredDiff\n key={_.newStart}\n patch={_}\n dim={false}\n width={width}\n />\n )),\n i => (\n <React.Fragment key={`ellipsis-${i}`}>\n <Text color={getTheme().secondaryText}>...</Text>\n </React.Fragment>\n ),\n )}\n </Box>\n </Box>\n )\n}\n", "export function intersperse<A>(as: A[], separator: (index: number) => A): A[] {\n return as.flatMap((a, i) => (i ? [separator(i), a] : [a]))\n}\n", "import semver from 'semver'\nimport type { Key } from 'ink'\n\nexport type InputShortcut = {\n displayText: string\n check: (input: string, key: Key) => boolean\n}\n\ntype RuntimeInfo = {\n platform: string\n bunVersion?: string\n nodeVersion?: string\n}\n\nfunction supportsShiftTabOnWindows(runtime: RuntimeInfo): boolean {\n if (runtime.platform !== 'win32') return true\n\n try {\n const bunVersion = runtime.bunVersion\n if (bunVersion) {\n return semver.satisfies(bunVersion, '>=1.2.23')\n }\n\n const nodeVersion = runtime.nodeVersion\n if (!nodeVersion) return false\n\n return semver.satisfies(nodeVersion, '>=22.17.0 <23.0.0 || >=24.2.0')\n } catch {\n return false\n }\n}\n\nfunction getRuntimeInfo(): RuntimeInfo {\n return {\n platform: process.platform,\n bunVersion: process.versions?.bun,\n nodeVersion: process.versions?.node,\n }\n}\n\nexport function __getPermissionModeCycleShortcutForTests(\n runtime: RuntimeInfo,\n): InputShortcut {\n // Reference CLI parity: on older Windows runtimes, Shift+Tab is unreliable in Ink.\n // In those cases, the reference CLI uses Alt+M instead.\n if (!supportsShiftTabOnWindows(runtime)) {\n return {\n displayText: 'alt+m',\n check: (input, key) =>\n Boolean(key.meta) && (input === 'm' || input === 'M'),\n }\n }\n\n return {\n displayText: 'shift+tab',\n check: (_input, key) => Boolean(key.tab) && Boolean(key.shift),\n }\n}\n\nexport function getPermissionModeCycleShortcut(): InputShortcut {\n return __getPermissionModeCycleShortcutForTests(getRuntimeInfo())\n}\n", "import React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useEffect,\n ReactNode,\n} from 'react'\nimport {\n PermissionMode,\n PermissionContext as IPermissionContext,\n getNextPermissionMode,\n MODE_CONFIGS,\n} from '#core/types/PermissionMode'\nimport {\n getPermissionModeForConversationKey,\n setPermissionModeForConversationKey,\n} from '#core/utils/permissionModeState'\nimport type {\n ToolPermissionContext as IToolPermissionContext,\n ToolPermissionContextUpdate,\n} from '#core/types/toolPermissionContext'\nimport { applyToolPermissionContextUpdate } from '#core/types/toolPermissionContext'\nimport {\n applyToolPermissionContextUpdateForConversationKey,\n getToolPermissionContextForConversationKey,\n setToolPermissionContextForConversationKey,\n} from '#core/utils/toolPermissionContextState'\nimport {\n enterPlanModeForConversationKey,\n exitPlanModeForConversationKey,\n setActivePlanConversationKey,\n} from '#core/utils/planMode'\nimport { getGlobalConfig, saveGlobalConfig } from '#core/utils/config'\nimport { __applyPermissionModeSideEffectsForTests } from './permissionModeSideEffects'\n\ninterface PermissionContextValue {\n permissionContext: IPermissionContext\n toolPermissionContext: IToolPermissionContext\n currentMode: PermissionMode\n conversationKey: string\n cycleMode: () => void\n setMode: (mode: PermissionMode) => void\n applyToolPermissionUpdate: (update: ToolPermissionContextUpdate) => void\n isToolAllowed: (toolName: string) => boolean\n getModeConfig: () => (typeof MODE_CONFIGS)[PermissionMode]\n}\n\nconst PermissionContext = createContext<PermissionContextValue | undefined>(\n undefined,\n)\n\ninterface PermissionProviderProps {\n children?: ReactNode\n conversationKey: string\n isBypassPermissionsModeAvailable?: boolean\n}\n\nexport { __applyPermissionModeSideEffectsForTests }\n\nexport function PermissionProvider({\n children,\n conversationKey,\n isBypassPermissionsModeAvailable = false,\n}: PermissionProviderProps) {\n const [toolPermissionContext, setToolPermissionContext] =\n useState<IToolPermissionContext>(() =>\n getToolPermissionContextForConversationKey({\n conversationKey,\n isBypassPermissionsModeAvailable,\n }),\n )\n const [permissionContext, setPermissionContext] =\n useState<IPermissionContext>(() => {\n const initialMode = getToolPermissionContextForConversationKey({\n conversationKey,\n isBypassPermissionsModeAvailable,\n }).mode\n const initialConfig = MODE_CONFIGS[initialMode]\n return {\n mode: initialMode,\n allowedTools: initialConfig.allowedTools,\n allowedPaths: [process.cwd()],\n restrictions: initialConfig.restrictions,\n metadata: {\n transitionCount: 0,\n },\n }\n })\n\n useEffect(() => {\n const toolCtx = getToolPermissionContextForConversationKey({\n conversationKey,\n isBypassPermissionsModeAvailable,\n })\n setToolPermissionContext(toolCtx)\n const config = MODE_CONFIGS[toolCtx.mode]\n setPermissionContext({\n mode: toolCtx.mode,\n allowedTools: config.allowedTools,\n allowedPaths: [process.cwd()],\n restrictions: config.restrictions,\n metadata: {\n transitionCount: 0,\n },\n })\n }, [conversationKey, isBypassPermissionsModeAvailable])\n\n useEffect(() => {\n setActivePlanConversationKey(conversationKey)\n if (permissionContext.mode === 'plan') {\n enterPlanModeForConversationKey(conversationKey)\n }\n }, [conversationKey, permissionContext.mode])\n\n const cycleMode = useCallback(() => {\n setPermissionContext(prev => {\n const nextMode = getNextPermissionMode(\n prev.mode,\n isBypassPermissionsModeAvailable,\n )\n const modeConfig = MODE_CONFIGS[nextMode]\n\n __applyPermissionModeSideEffectsForTests({\n conversationKey,\n previousMode: prev.mode,\n nextMode,\n recordPlanModeUse: true,\n })\n\n const updatedToolPermissionContext =\n applyToolPermissionContextUpdateForConversationKey({\n conversationKey,\n isBypassPermissionsModeAvailable,\n update: { type: 'setMode', mode: nextMode, destination: 'session' },\n })\n setToolPermissionContext(updatedToolPermissionContext)\n\n return {\n ...prev,\n mode: nextMode,\n allowedTools: modeConfig.allowedTools,\n restrictions: modeConfig.restrictions,\n metadata: {\n ...prev.metadata,\n previousMode: prev.mode,\n activatedAt: new Date().toISOString(),\n transitionCount: prev.metadata.transitionCount + 1,\n },\n }\n })\n }, [conversationKey, isBypassPermissionsModeAvailable])\n\n const setMode = useCallback(\n (mode: PermissionMode) => {\n setPermissionContext(prev => {\n const modeConfig = MODE_CONFIGS[mode]\n\n __applyPermissionModeSideEffectsForTests({\n conversationKey,\n previousMode: prev.mode,\n nextMode: mode,\n recordPlanModeUse: false,\n })\n\n const updatedToolPermissionContext =\n applyToolPermissionContextUpdateForConversationKey({\n conversationKey,\n isBypassPermissionsModeAvailable,\n update: { type: 'setMode', mode, destination: 'session' },\n })\n setToolPermissionContext(updatedToolPermissionContext)\n\n return {\n ...prev,\n mode,\n allowedTools: modeConfig.allowedTools,\n restrictions: modeConfig.restrictions,\n metadata: {\n ...prev.metadata,\n previousMode: prev.mode,\n activatedAt: new Date().toISOString(),\n transitionCount: prev.metadata.transitionCount + 1,\n },\n }\n })\n },\n [conversationKey],\n )\n\n const applyToolPermissionUpdate = useCallback(\n (update: ToolPermissionContextUpdate) => {\n setToolPermissionContext(prev => {\n const next = applyToolPermissionContextUpdate(prev, update)\n setToolPermissionContextForConversationKey({\n conversationKey,\n context: next,\n })\n return next\n })\n\n if (update.type === 'setMode') {\n setPermissionContext(prev => {\n const modeConfig = MODE_CONFIGS[update.mode]\n\n __applyPermissionModeSideEffectsForTests({\n conversationKey,\n previousMode: prev.mode,\n nextMode: update.mode,\n recordPlanModeUse: false,\n })\n\n return {\n ...prev,\n mode: update.mode,\n allowedTools: modeConfig.allowedTools,\n restrictions: modeConfig.restrictions,\n metadata: {\n ...prev.metadata,\n previousMode: prev.mode,\n activatedAt: new Date().toISOString(),\n transitionCount: prev.metadata.transitionCount + 1,\n },\n }\n })\n }\n },\n [conversationKey],\n )\n\n const isToolAllowed = useCallback(\n (toolName: string) => {\n const { allowedTools } = permissionContext\n\n // If '*' is in allowed tools, all tools are allowed\n if (allowedTools.includes('*')) {\n return true\n }\n\n // Check if specific tool is in allowed list\n return allowedTools.includes(toolName)\n },\n [permissionContext],\n )\n\n const getModeConfig = useCallback(() => {\n return MODE_CONFIGS[permissionContext.mode]\n }, [permissionContext.mode])\n\n const value: PermissionContextValue = {\n permissionContext,\n toolPermissionContext,\n currentMode: permissionContext.mode,\n conversationKey,\n cycleMode,\n setMode,\n applyToolPermissionUpdate,\n isToolAllowed,\n getModeConfig,\n }\n\n return (\n <PermissionContext.Provider value={value}>\n {children}\n </PermissionContext.Provider>\n )\n}\n\nexport function usePermissionContext(): PermissionContextValue {\n const context = useContext(PermissionContext)\n if (context === undefined) {\n throw new Error(\n 'usePermissionContext must be used within a PermissionProvider',\n )\n }\n return context\n}\n\n// Hook for components that need to respond to permission mode changes\nexport function usePermissionMode(): [\n PermissionMode,\n (mode: PermissionMode) => void,\n () => void,\n] {\n const { currentMode, setMode, cycleMode } = usePermissionContext()\n return [currentMode, setMode, cycleMode]\n}\n", "// Permission mode types retained for compatibility with earlier agent implementations\nexport type PermissionMode =\n | 'default'\n | 'acceptEdits'\n | 'plan'\n | 'bypassPermissions'\n | 'dontAsk'\n\nexport interface PermissionContext {\n mode: PermissionMode\n allowedTools: string[]\n allowedPaths: string[]\n restrictions: {\n readOnly: boolean\n requireConfirmation: boolean\n bypassValidation: boolean\n }\n metadata: {\n activatedAt?: string\n previousMode?: PermissionMode\n transitionCount: number\n }\n}\n\nexport interface ModeConfig {\n name: PermissionMode\n label: string\n icon: string\n color: string\n description: string\n allowedTools: string[]\n restrictions: {\n readOnly: boolean\n requireConfirmation: boolean\n bypassValidation: boolean\n }\n}\n\n// Mode configuration preserved for compatibility\nexport const MODE_CONFIGS: Record<PermissionMode, ModeConfig> = {\n default: {\n name: 'default',\n label: 'Default',\n icon: '',\n color: 'blue',\n description: 'Standard permission checking',\n allowedTools: ['*'],\n restrictions: {\n readOnly: false,\n requireConfirmation: true,\n bypassValidation: false,\n },\n },\n acceptEdits: {\n name: 'acceptEdits',\n label: 'Accept edits',\n icon: '\u23F5\u23F5',\n color: 'green',\n description: 'Auto-approve edit operations',\n allowedTools: ['*'],\n restrictions: {\n readOnly: false,\n requireConfirmation: false,\n bypassValidation: false,\n },\n },\n plan: {\n name: 'plan',\n label: 'Plan Mode',\n icon: '\u23F8',\n color: 'yellow',\n description: 'Research and planning - read-only tools only',\n allowedTools: [\n 'Read',\n 'Grep',\n 'Glob',\n 'WebSearch',\n 'WebFetch',\n 'AskUserQuestion',\n 'TodoWrite',\n 'Write',\n 'Edit',\n 'ExitPlanMode',\n 'KillShell',\n 'TaskOutput',\n 'ListMcpResourcesTool',\n 'ReadMcpResourceTool',\n 'mcp',\n ],\n restrictions: {\n readOnly: true,\n requireConfirmation: true,\n bypassValidation: false,\n },\n },\n bypassPermissions: {\n name: 'bypassPermissions',\n label: 'Bypass Permissions',\n icon: '\u23F5\u23F5',\n color: 'red',\n description: 'All permissions bypassed',\n allowedTools: ['*'],\n restrictions: {\n readOnly: false,\n requireConfirmation: false,\n bypassValidation: true,\n },\n },\n dontAsk: {\n name: 'dontAsk',\n label: \"Don't Ask\",\n icon: '\u23F5\u23F5',\n color: 'red',\n description: 'Auto-deny permission prompts',\n allowedTools: ['*'],\n restrictions: {\n readOnly: false,\n requireConfirmation: true,\n bypassValidation: false,\n },\n },\n}\n\n// Mode cycling function preserved from the existing workflow\nexport function getNextPermissionMode(\n currentMode: PermissionMode,\n isBypassAvailable: boolean = true,\n): PermissionMode {\n switch (currentMode) {\n case 'default':\n return 'acceptEdits'\n case 'acceptEdits':\n return 'plan'\n case 'plan':\n return isBypassAvailable ? 'bypassPermissions' : 'default'\n case 'bypassPermissions':\n return 'default'\n case 'dontAsk':\n return 'default'\n default:\n return 'default'\n }\n}\n", "import type { PermissionMode } from '#core/types/PermissionMode'\nimport {\n enterPlanModeForConversationKey,\n exitPlanModeForConversationKey,\n} from '#core/utils/planMode'\nimport { setPermissionModeForConversationKey } from '#core/utils/permissionModeState'\nimport { getGlobalConfig, saveGlobalConfig } from '#core/utils/config'\n\nexport function __applyPermissionModeSideEffectsForTests(args: {\n conversationKey: string\n previousMode: PermissionMode\n nextMode: PermissionMode\n recordPlanModeUse: boolean\n now?: () => number\n}): void {\n const now = args.now ?? Date.now\n\n if (\n args.recordPlanModeUse &&\n args.previousMode !== args.nextMode &&\n args.nextMode === 'plan'\n ) {\n const config = getGlobalConfig()\n saveGlobalConfig({ ...config, lastPlanModeUse: now() })\n }\n\n setPermissionModeForConversationKey({\n conversationKey: args.conversationKey,\n mode: args.nextMode,\n })\n\n if (args.previousMode !== 'plan' && args.nextMode === 'plan') {\n enterPlanModeForConversationKey(args.conversationKey)\n } else if (args.previousMode === 'plan' && args.nextMode !== 'plan') {\n exitPlanModeForConversationKey(args.conversationKey)\n }\n}\n", "import { Box, Text } from 'ink'\nimport React, { useMemo } from 'react'\nimport { UnaryEvent } from '#ui-ink/hooks/usePermissionRequestLogging'\nimport { savePermission } from '#core/permissions'\nimport { BashTool } from '#tools/tools/system/BashTool/BashTool'\nimport { getTheme } from '#core/utils/theme'\nimport { usePermissionRequestLogging } from '#ui-ink/components/permissions/hooks'\nimport {\n type ToolUseConfirm,\n toolUseConfirmGetPrefix,\n} from '#ui-ink/components/permissions/PermissionRequest'\nimport { PermissionRequestTitle } from '#ui-ink/components/permissions/PermissionRequestTitle'\nimport { logUnaryPermissionEvent } from '#ui-ink/components/permissions/utils'\nimport { Select } from '#ui-ink/components/CustomSelect/select'\nimport { toolUseOptions } from '#ui-ink/components/permissions/toolUseOptions'\n\ntype Props = {\n toolUseConfirm: ToolUseConfirm\n onDone(): void\n}\n\nexport function BashPermissionRequest({\n toolUseConfirm,\n onDone,\n}: Props): React.ReactNode {\n const theme = getTheme()\n\n // ok to use parse since we've already validated args earliers\n const { command, run_in_background, description } =\n BashTool.inputSchema.parse(toolUseConfirm.input)\n\n const unaryEvent = useMemo<UnaryEvent>(\n () => ({ completion_type: 'tool_use_single', language_name: 'none' }),\n [],\n )\n\n usePermissionRequestLogging(toolUseConfirm, unaryEvent)\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.permission}\n marginTop={1}\n paddingLeft={1}\n paddingRight={1}\n paddingBottom={1}\n >\n <PermissionRequestTitle\n title=\"Bash command\"\n riskScore={toolUseConfirm.riskScore}\n />\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Text>\n {BashTool.renderToolUseMessage({\n command,\n run_in_background,\n description,\n })}\n </Text>\n <Text color={theme.secondaryText}>{toolUseConfirm.description}</Text>\n </Box>\n\n <Box flexDirection=\"column\">\n <Text>Do you want to proceed?</Text>\n <Select\n options={toolUseOptions({ toolUseConfirm, command })}\n onChange={newValue => {\n switch (newValue) {\n case 'yes':\n logUnaryPermissionEvent(\n 'tool_use_single',\n toolUseConfirm,\n 'accept',\n )\n toolUseConfirm.onAllow('temporary')\n onDone()\n break\n case 'yes-dont-ask-again-prefix': {\n const prefix = toolUseConfirmGetPrefix(toolUseConfirm)\n if (prefix !== null) {\n logUnaryPermissionEvent(\n 'tool_use_single',\n toolUseConfirm,\n 'accept',\n )\n savePermission(\n toolUseConfirm.tool,\n toolUseConfirm.input,\n prefix,\n toolUseConfirm.toolUseContext,\n ).then(() => {\n toolUseConfirm.onAllow('permanent')\n onDone()\n })\n }\n break\n }\n case 'yes-dont-ask-again-full':\n logUnaryPermissionEvent(\n 'tool_use_single',\n toolUseConfirm,\n 'accept',\n )\n savePermission(\n toolUseConfirm.tool,\n toolUseConfirm.input,\n null, // Save without prefix\n toolUseConfirm.toolUseContext,\n ).then(() => {\n toolUseConfirm.onAllow('permanent')\n onDone()\n })\n break\n case 'no':\n logUnaryPermissionEvent(\n 'tool_use_single',\n toolUseConfirm,\n 'reject',\n )\n toolUseConfirm.onReject()\n onDone()\n break\n }\n }}\n />\n </Box>\n </Box>\n )\n}\n", "import { useEffect } from 'react'\nimport { logUnaryEvent, CompletionType } from '#core/utils/unaryLogging'\nimport { ToolUseConfirm } from '#ui-ink/components/permissions/PermissionRequest'\nimport { env } from '#core/utils/env'\n\ntype UnaryEventType = {\n completion_type: CompletionType\n language_name: string | Promise<string>\n}\n\n/**\n * Logs permission request events via unary logging.\n * Can handle either a string or Promise<string> for language_name.\n */\nexport function usePermissionRequestLogging(\n toolUseConfirm: ToolUseConfirm,\n unaryEvent: UnaryEventType,\n): void {\n useEffect(() => {\n // Handle string or Promise language name\n const languagePromise = Promise.resolve(unaryEvent.language_name)\n\n // Log unary event once language is resolved\n languagePromise.then(language => {\n logUnaryEvent({\n completion_type: unaryEvent.completion_type,\n event: 'response',\n metadata: {\n language_name: language,\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n })\n }, [toolUseConfirm, unaryEvent])\n}\n", "import { env } from '#core/utils/env'\nimport { CompletionType, logUnaryEvent } from '#core/utils/unaryLogging'\nimport { ToolUseConfirm } from './PermissionRequest'\n\nexport function logUnaryPermissionEvent(\n completion_type: CompletionType,\n {\n assistantMessage: {\n message: { id: message_id },\n },\n }: ToolUseConfirm,\n event: 'accept' | 'reject',\n): void {\n logUnaryEvent({\n completion_type,\n event,\n metadata: {\n language_name: 'none',\n message_id,\n platform: env.platform,\n },\n })\n}\n", "import { type Option } from '@inkjs/ui'\nimport chalk from 'chalk'\nimport {\n type ToolUseConfirm,\n toolUseConfirmGetPrefix,\n} from './PermissionRequest'\nimport { isUnsafeCompoundCommand } from '#core/utils/commands'\nimport { getCwd } from '#core/utils/state'\nimport { getTheme } from '#core/utils/theme'\nimport { type OptionSubtree } from '#ui-ink/components/CustomSelect/select'\n\nconst SHELL_KEYWORD_PREFIXES = new Set([\n // Shell control keywords: allowlisting these as a \"prefix\" is usually too broad/misleading.\n 'for',\n 'if',\n 'while',\n 'until',\n 'case',\n 'select',\n 'function',\n 'do',\n 'then',\n 'elif',\n 'else',\n 'fi',\n 'done',\n])\n\n/**\n * Generates options for the tool use confirmation dialog\n */\nexport function toolUseOptions({\n toolUseConfirm,\n command,\n}: {\n toolUseConfirm: ToolUseConfirm\n command: string\n}): (Option | OptionSubtree)[] {\n // Hide \"don't ask again\" options if the command is an unsafe compound command, or a potential command injection\n const showDontAskAgainOption =\n !isUnsafeCompoundCommand(command) &&\n toolUseConfirm.commandPrefix &&\n !toolUseConfirm.commandPrefix.commandInjectionDetected\n const prefix = toolUseConfirmGetPrefix(toolUseConfirm)\n const prefixBase =\n typeof prefix === 'string' ? prefix.trim().split(/\\s+/)[0] : null\n const preferFullCommandOverPrefix =\n typeof prefixBase === 'string' && SHELL_KEYWORD_PREFIXES.has(prefixBase)\n const showDontAskAgainPrefixOption =\n showDontAskAgainOption && prefix !== null && !preferFullCommandOverPrefix\n\n let dontShowAgainOptions: (Option | OptionSubtree)[] = []\n if (showDontAskAgainPrefixOption) {\n // Prefix option takes precedence over full command option\n dontShowAgainOptions = [\n {\n label: `Yes, and don't ask again for commands starting with ${chalk.bold(prefix)} in ${chalk.bold(getCwd())}`,\n value: 'yes-dont-ask-again-prefix',\n },\n ]\n } else if (showDontAskAgainOption) {\n dontShowAgainOptions = [\n {\n label: `Yes, and don't ask again for this exact command in ${chalk.bold(getCwd())}`,\n value: 'yes-dont-ask-again-full',\n },\n ]\n }\n\n return [\n {\n label: 'Yes',\n value: 'yes',\n },\n ...dontShowAgainOptions,\n {\n label: `No, and provide instructions (${chalk.bold.hex(getTheme().warning)('esc')})`,\n value: 'no',\n },\n ]\n}\n", "import { Box, Text } from 'ink'\nimport React, { useMemo } from 'react'\nimport { Select } from '#ui-ink/components/CustomSelect/select'\nimport { getTheme } from '#core/utils/theme'\nimport {\n PermissionRequestTitle,\n textColorForRiskScore,\n} from './PermissionRequestTitle'\nimport { logUnaryEvent } from '#core/utils/unaryLogging'\nimport { env } from '#core/utils/env'\nimport { getCwd } from '#core/utils/state'\nimport { savePermission } from '#core/permissions'\nimport {\n type ToolUseConfirm,\n toolUseConfirmGetPrefix,\n} from './PermissionRequest'\nimport chalk from 'chalk'\nimport {\n UnaryEvent,\n usePermissionRequestLogging,\n} from '#ui-ink/hooks/usePermissionRequestLogging'\n\ntype Props = {\n toolUseConfirm: ToolUseConfirm\n onDone(): void\n verbose: boolean\n}\n\nexport function FallbackPermissionRequest({\n toolUseConfirm,\n onDone,\n verbose,\n}: Props): React.ReactNode {\n const theme = getTheme()\n\n // NOTE: normalize \"(MCP)\" suffix for consistent display in the fallback UI.\n const originalUserFacingName = toolUseConfirm.tool.userFacingName()\n const userFacingName = originalUserFacingName.endsWith(' (MCP)')\n ? originalUserFacingName.slice(0, -6)\n : originalUserFacingName\n\n const unaryEvent = useMemo<UnaryEvent>(\n () => ({\n completion_type: 'tool_use_single',\n language_name: 'none',\n }),\n [],\n )\n\n usePermissionRequestLogging(toolUseConfirm, unaryEvent)\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={textColorForRiskScore(toolUseConfirm.riskScore)}\n marginTop={1}\n paddingLeft={1}\n paddingRight={1}\n paddingBottom={1}\n >\n <PermissionRequestTitle\n title=\"Tool use\"\n riskScore={toolUseConfirm.riskScore}\n />\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Text>\n {userFacingName}(\n {toolUseConfirm.tool.renderToolUseMessage(\n toolUseConfirm.input as never,\n { verbose },\n )}\n )\n {originalUserFacingName.endsWith(' (MCP)') ? (\n <Text color={theme.secondaryText}> (MCP)</Text>\n ) : (\n ''\n )}\n </Text>\n <Text color={theme.secondaryText}>{toolUseConfirm.description}</Text>\n </Box>\n\n <Box flexDirection=\"column\">\n <Text>Do you want to proceed?</Text>\n <Select\n options={[\n {\n label: 'Yes',\n value: 'yes',\n },\n {\n label: `Yes, and don't ask again for ${chalk.bold(userFacingName)} commands in ${chalk.bold(getCwd())}`,\n value: 'yes-dont-ask-again',\n },\n {\n label: `No, and provide instructions (${chalk.bold.hex(getTheme().warning)('esc')})`,\n value: 'no',\n },\n ]}\n onChange={newValue => {\n switch (newValue) {\n case 'yes':\n logUnaryEvent({\n completion_type: 'tool_use_single',\n event: 'accept',\n metadata: {\n language_name: 'none',\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n toolUseConfirm.onAllow('temporary')\n onDone()\n break\n case 'yes-dont-ask-again':\n logUnaryEvent({\n completion_type: 'tool_use_single',\n event: 'accept',\n metadata: {\n language_name: 'none',\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n savePermission(\n toolUseConfirm.tool,\n toolUseConfirm.input,\n toolUseConfirmGetPrefix(toolUseConfirm),\n toolUseConfirm.toolUseContext,\n ).then(() => {\n toolUseConfirm.onAllow('permanent')\n onDone()\n })\n break\n case 'no':\n logUnaryEvent({\n completion_type: 'tool_use_single',\n event: 'reject',\n metadata: {\n language_name: 'none',\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n toolUseConfirm.onReject()\n onDone()\n break\n }\n }}\n />\n </Box>\n </Box>\n )\n}\n", "import { useEffect } from 'react'\nimport { sendNotification } from '#core/services/notifier'\nimport { memoize } from 'lodash-es'\n\n// The time threshold in milliseconds for considering an interaction \"recent\" (6 seconds)\nconst DEFAULT_INTERACTION_THRESHOLD_MS = 6000\n\nconst STATE = {\n lastInteractionTime: Date.now(),\n}\n\nfunction updateLastInteractionTime(): void {\n STATE.lastInteractionTime = Date.now()\n}\n\nfunction getTimeSinceLastInteraction(): number {\n return Date.now() - STATE.lastInteractionTime\n}\n\nfunction hasRecentInteraction(threshold: number): boolean {\n return getTimeSinceLastInteraction() < threshold\n}\n\nfunction shouldNotify(threshold: number): boolean {\n return process.env.NODE_ENV !== 'test' && !hasRecentInteraction(threshold)\n}\n\n// Start tracking the time of the user's last interaction with the app\nconst init = memoize(() => process.stdin.on('data', updateLastInteractionTime))\n\n/**\n * Hook that manages desktop notifications after a timeout period.\n *\n * Shows a notification in two cases:\n * 1. Immediately if the app has been idle for longer than the threshold\n * 2. After the specified timeout if the user doesn't interact within that time\n *\n * @param message - The notification message to display\n * @param timeout - The timeout in milliseconds (defaults to 6000ms)\n */\nexport function useNotifyAfterTimeout(\n message: string,\n timeout: number = DEFAULT_INTERACTION_THRESHOLD_MS,\n): void {\n // Reset interaction time when hook is called to make sure that requests\n // that took a long time to complete don't pop up a notification right away\n useEffect(() => {\n init()\n updateLastInteractionTime()\n }, [])\n\n useEffect(() => {\n let hasNotified = false\n const timer = setInterval(() => {\n if (shouldNotify(timeout) && !hasNotified) {\n hasNotified = true\n sendNotification({\n message,\n })\n }\n }, timeout)\n\n return () => clearTimeout(timer)\n }, [message, timeout])\n}\n", "import { getGlobalConfig } from '#core/utils/config'\n\nexport type NotificationOptions = {\n message: string\n title?: string\n}\n\nfunction sendITerm2Notification({ message, title }: NotificationOptions): void {\n const displayString = title ? `${title}:\\n${message}` : message\n try {\n process.stdout.write(`\\x1b]9;\\n\\n${displayString}\\x07`)\n } catch {\n // Ignore errors\n }\n}\n\nfunction sendTerminalBell(): void {\n process.stdout.write('\\x07')\n}\n\nexport async function sendNotification(\n notif: NotificationOptions,\n): Promise<void> {\n const channel = getGlobalConfig().preferredNotifChannel\n switch (channel) {\n case 'iterm2':\n sendITerm2Notification(notif)\n break\n case 'terminal_bell':\n sendTerminalBell()\n break\n case 'iterm2_with_bell':\n sendITerm2Notification(notif)\n sendTerminalBell()\n break\n case 'notifications_disabled':\n // Do nothing\n break\n }\n}\n", "import { Box, Text, useInput } from 'ink'\nimport React, { useCallback, useMemo } from 'react'\nimport { Select } from '#ui-ink/components/CustomSelect/select'\nimport { basename, dirname, extname } from 'path'\nimport { getTheme } from '#core/utils/theme'\nimport {\n PermissionRequestTitle,\n textColorForRiskScore,\n} from '#ui-ink/components/permissions/PermissionRequestTitle'\nimport { logUnaryEvent } from '#core/utils/unaryLogging'\nimport { env } from '#core/utils/env'\nimport { type ToolUseConfirm } from '#ui-ink/components/permissions/PermissionRequest'\nimport { existsSync } from 'fs'\nimport chalk from 'chalk'\nimport {\n UnaryEvent,\n usePermissionRequestLogging,\n} from '#ui-ink/hooks/usePermissionRequestLogging'\nimport { FileWriteToolDiff } from './FileWriteToolDiff'\nimport { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\nimport { getPermissionModeCycleShortcut } from '#ui-ink/utils/permissionModeCycleShortcut'\nimport { usePermissionContext } from '#ui-ink/context/PermissionContext'\nimport { isPathInWorkingDirectories } from '#core/utils/permissions/fileToolPermissionEngine'\n\ntype Props = {\n toolUseConfirm: ToolUseConfirm\n onDone(): void\n verbose: boolean\n}\n\nexport function FileWritePermissionRequest({\n toolUseConfirm,\n onDone,\n verbose,\n}: Props): React.ReactNode {\n const { applyToolPermissionUpdate, toolPermissionContext } =\n usePermissionContext()\n const { file_path, content } = toolUseConfirm.input as {\n file_path: string\n content: string\n }\n const modeCycleShortcut = useMemo(() => getPermissionModeCycleShortcut(), [])\n const hasSessionSuggestion = (toolUseConfirm.suggestions?.length ?? 0) > 0\n const isInWorkingDir = isPathInWorkingDirectories(\n dirname(file_path),\n toolPermissionContext,\n )\n const sessionLabel = useMemo(() => {\n const dirPath = dirname(file_path)\n const dirName = basename(dirPath) || 'this directory'\n const shortcutHint = chalk.bold.hex(getTheme().warning)(\n `(${modeCycleShortcut.displayText})`,\n )\n return isInWorkingDir\n ? `Yes, allow all edits during this session ${shortcutHint}`\n : `Yes, allow all edits in ${chalk.bold(`${dirName}/`)} during this session ${shortcutHint}`\n }, [file_path, isInWorkingDir, modeCycleShortcut.displayText])\n const fileExists = useMemo(() => existsSync(file_path), [file_path])\n const unaryEvent = useMemo<UnaryEvent>(\n () => ({\n completion_type: 'write_file_single',\n language_name: extractLanguageName(file_path),\n }),\n [file_path],\n )\n const { columns } = useTerminalSize()\n usePermissionRequestLogging(toolUseConfirm, unaryEvent)\n\n const handleChoice = useCallback(\n (newValue: string) => {\n switch (newValue) {\n case 'yes':\n extractLanguageName(file_path).then(language => {\n logUnaryEvent({\n completion_type: 'write_file_single',\n event: 'accept',\n metadata: {\n language_name: language,\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n })\n onDone()\n toolUseConfirm.onAllow('temporary')\n return\n case 'yes-session':\n extractLanguageName(file_path).then(language => {\n logUnaryEvent({\n completion_type: 'write_file_single',\n event: 'accept',\n metadata: {\n language_name: language,\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n })\n if (hasSessionSuggestion) {\n for (const update of toolUseConfirm.suggestions ?? []) {\n applyToolPermissionUpdate(update)\n }\n }\n onDone()\n toolUseConfirm.onAllow(\n hasSessionSuggestion ? 'permanent' : 'temporary',\n )\n return\n case 'no':\n extractLanguageName(file_path).then(language => {\n logUnaryEvent({\n completion_type: 'write_file_single',\n event: 'reject',\n metadata: {\n language_name: language,\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n })\n onDone()\n toolUseConfirm.onReject()\n return\n }\n },\n [\n applyToolPermissionUpdate,\n file_path,\n hasSessionSuggestion,\n onDone,\n toolUseConfirm,\n ],\n )\n\n useInput((inputChar, key) => {\n if (!modeCycleShortcut.check(inputChar, key)) return\n if (!hasSessionSuggestion) return\n handleChoice('yes-session')\n return true\n })\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={textColorForRiskScore(toolUseConfirm.riskScore)}\n marginTop={1}\n paddingLeft={1}\n paddingRight={1}\n paddingBottom={1}\n >\n <PermissionRequestTitle\n title={`${fileExists ? 'Edit' : 'Create'} file`}\n riskScore={toolUseConfirm.riskScore}\n />\n <Box flexDirection=\"column\">\n <FileWriteToolDiff\n file_path={file_path}\n content={content}\n verbose={verbose}\n width={columns - 12}\n />\n </Box>\n <Box flexDirection=\"column\">\n <Text>\n Do you want to {fileExists ? 'make this edit to' : 'create'}{' '}\n <Text bold>{basename(file_path)}</Text>?\n </Text>\n <Select\n options={[\n {\n label: 'Yes',\n value: 'yes',\n },\n ...(hasSessionSuggestion\n ? [\n {\n label: sessionLabel,\n value: 'yes-session',\n },\n ]\n : []),\n {\n label: `No, and provide instructions (${chalk.bold.hex(getTheme().warning)('esc')})`,\n value: 'no',\n },\n ]}\n onChange={handleChoice}\n />\n </Box>\n </Box>\n )\n}\n\nasync function extractLanguageName(file_path: string): Promise<string> {\n const ext = extname(file_path)\n if (!ext) {\n return 'unknown'\n }\n const Highlight = (await import('highlight.js')) as unknown as {\n default: { getLanguage(ext: string): { name: string | undefined } }\n }\n return Highlight.default.getLanguage(ext.slice(1))?.name ?? 'unknown'\n}\n", "import * as React from 'react'\nimport { existsSync, readFileSync } from 'fs'\nimport { useMemo } from 'react'\nimport { StructuredDiff } from '#ui-ink/components/StructuredDiff'\nimport { Box, Text } from 'ink'\nimport { getTheme } from '#core/utils/theme'\nimport { intersperse } from '#core/utils/array'\nimport { getCwd } from '#core/utils/state'\nimport { extname, relative } from 'path'\nimport { detectFileEncoding } from '#core/utils/file'\nimport { HighlightedCode } from '#ui-ink/components/HighlightedCode'\nimport { getPatch } from '#core/utils/diff'\n\ntype Props = {\n file_path: string\n content: string\n verbose: boolean\n width: number\n}\n\nexport function FileWriteToolDiff({\n file_path,\n content,\n verbose,\n width,\n}: Props): React.ReactNode {\n const fileExists = useMemo(() => existsSync(file_path), [file_path])\n const oldContent = useMemo(() => {\n if (!fileExists) {\n return ''\n }\n const enc = detectFileEncoding(file_path)\n return readFileSync(file_path, enc)\n }, [file_path, fileExists])\n const hunks = useMemo(() => {\n if (!fileExists) {\n return null\n }\n return getPatch({\n filePath: file_path,\n fileContents: oldContent,\n oldStr: oldContent,\n newStr: content,\n })\n }, [fileExists, file_path, oldContent, content])\n\n return (\n <Box\n borderColor={getTheme().secondaryBorder}\n borderStyle=\"round\"\n flexDirection=\"column\"\n paddingX={1}\n >\n <Box paddingBottom={1}>\n <Text bold>{verbose ? file_path : relative(getCwd(), file_path)}</Text>\n </Box>\n {hunks ? (\n intersperse(\n hunks.map(_ => (\n <StructuredDiff\n key={_.newStart}\n patch={_}\n dim={false}\n width={width}\n />\n )),\n i => (\n <React.Fragment key={`ellipsis-${i}`}>\n <Text color={getTheme().secondaryText}>...</Text>\n </React.Fragment>\n ),\n )\n ) : (\n <HighlightedCode\n code={content || '(No content)'}\n language={extname(file_path).slice(1)}\n />\n )}\n </Box>\n )\n}\n", "import { highlight, supportsLanguage } from 'cli-highlight'\nimport { Text } from 'ink'\nimport React, { useMemo } from 'react'\nimport { logError } from '#core/utils/log'\n\ntype Props = {\n code: string\n language: string\n}\n\nexport function HighlightedCode({ code, language }: Props): React.ReactElement {\n const highlightedCode = useMemo(() => {\n try {\n if (supportsLanguage(language)) {\n return highlight(code, { language })\n } else {\n logError(\n `Language not supported while highlighting code, falling back to markdown: ${language}`,\n )\n return highlight(code, { language: 'markdown' })\n }\n } catch (e) {\n if (e instanceof Error && e.message.includes('Unknown language')) {\n logError(\n `Language not supported while highlighting code, falling back to markdown: ${e}`,\n )\n return highlight(code, { language: 'markdown' })\n }\n }\n }, [code, language])\n\n return <Text>{highlightedCode}</Text>\n}\n", "import { Box, Text, useInput } from 'ink'\nimport React, { useCallback, useMemo } from 'react'\nimport { Select } from '#ui-ink/components/CustomSelect/select'\nimport { getTheme } from '#core/utils/theme'\nimport {\n PermissionRequestTitle,\n textColorForRiskScore,\n} from '#ui-ink/components/permissions/PermissionRequestTitle'\nimport { logUnaryEvent } from '#core/utils/unaryLogging'\nimport { env } from '#core/utils/env'\nimport {\n type PermissionRequestProps,\n type ToolUseConfirm,\n} from '#ui-ink/components/permissions/PermissionRequest'\nimport chalk from 'chalk'\nimport {\n UnaryEvent,\n usePermissionRequestLogging,\n} from '#ui-ink/hooks/usePermissionRequestLogging'\nimport { FileEditTool } from '#tools/tools/filesystem/FileEditTool/FileEditTool'\nimport { FileWriteTool } from '#tools/tools/filesystem/FileWriteTool/FileWriteTool'\nimport { GrepTool } from '#tools/tools/search/GrepTool/GrepTool'\nimport { GlobTool } from '#tools/tools/filesystem/GlobTool/GlobTool'\nimport { FileReadTool } from '#tools/tools/filesystem/FileReadTool/FileReadTool'\nimport { NotebookEditTool } from '#tools/tools/filesystem/NotebookEditTool/NotebookEditTool'\nimport { FallbackPermissionRequest } from '#ui-ink/components/permissions/FallbackPermissionRequest'\nimport { toAbsolutePath } from '#core/utils/permissions/filesystem'\nimport { getCwd } from '#core/utils/state'\nimport { basename, dirname } from 'path'\nimport { statSync } from 'fs'\nimport { getPermissionModeCycleShortcut } from '#ui-ink/utils/permissionModeCycleShortcut'\nimport { usePermissionContext } from '#ui-ink/context/PermissionContext'\nimport { isPathInWorkingDirectories } from '#core/utils/permissions/fileToolPermissionEngine'\n\nfunction pathArgNameForToolUse(toolUseConfirm: ToolUseConfirm): string | null {\n switch (toolUseConfirm.tool) {\n case FileWriteTool:\n case FileEditTool:\n case FileReadTool: {\n return 'file_path'\n }\n case GlobTool:\n case GrepTool: {\n return 'path'\n }\n case NotebookEditTool: {\n return 'notebook_path'\n }\n }\n return null\n}\n\nfunction isMultiFile(toolUseConfirm: ToolUseConfirm): boolean {\n switch (toolUseConfirm.tool) {\n case GlobTool:\n case GrepTool: {\n return true\n }\n }\n return false\n}\n\nfunction pathToPermissionDirectory(path: string): string {\n try {\n const stats = statSync(path)\n if (stats.isDirectory()) return path\n } catch {\n // Treat missing/unstatable path as a file path.\n }\n return dirname(path)\n}\n\nfunction pathFromToolUse(toolUseConfirm: ToolUseConfirm): string | null {\n const pathArgName = pathArgNameForToolUse(toolUseConfirm)\n const input = toolUseConfirm.input\n if (pathArgName && pathArgName in input) {\n if (typeof input[pathArgName] === 'string') {\n return toAbsolutePath(input[pathArgName])\n } else {\n return toAbsolutePath(getCwd())\n }\n }\n return null\n}\n\nexport function FilesystemPermissionRequest({\n toolUseConfirm,\n onDone,\n verbose,\n}: PermissionRequestProps): React.ReactNode {\n const path = pathFromToolUse(toolUseConfirm)\n if (!path) {\n // Fall back to generic permission request if no path is found\n return (\n <FallbackPermissionRequest\n toolUseConfirm={toolUseConfirm}\n onDone={onDone}\n verbose={verbose}\n />\n )\n }\n return (\n <FilesystemPermissionRequestImpl\n toolUseConfirm={toolUseConfirm}\n path={path}\n onDone={onDone}\n verbose={verbose}\n />\n )\n}\n\nfunction getDontAskAgainOptions(\n toolUseConfirm: ToolUseConfirm,\n path: string,\n modeCycleShortcut: string,\n isInWorkingDir: boolean,\n hasSessionSuggestion: boolean,\n) {\n if (!hasSessionSuggestion) return []\n const permissionDirPath = pathToPermissionDirectory(path)\n const permissionDirName = basename(permissionDirPath) || 'this directory'\n\n if (toolUseConfirm.tool.isReadOnly(toolUseConfirm.input as never)) {\n const label = isInWorkingDir\n ? 'Yes, during this session'\n : `Yes, allow reading from ${chalk.bold(`${permissionDirName}/`)} during this session`\n return [{ label, value: 'yes-session' }]\n }\n\n // For write/edit tools, offer a session-scoped allow.\n const shortcutHint = chalk.bold.hex(getTheme().warning)(\n `(${modeCycleShortcut})`,\n )\n const label = isInWorkingDir\n ? `Yes, allow all edits during this session ${shortcutHint}`\n : `Yes, allow all edits in ${chalk.bold(`${permissionDirName}/`)} during this session ${shortcutHint}`\n return [{ label, value: 'yes-session' }]\n}\n\ntype Props = {\n toolUseConfirm: ToolUseConfirm\n path: string\n onDone(): void\n verbose: boolean\n}\n\nfunction FilesystemPermissionRequestImpl({\n toolUseConfirm,\n path,\n onDone,\n verbose,\n}: Props): React.ReactNode {\n const { applyToolPermissionUpdate, toolPermissionContext } =\n usePermissionContext()\n const modeCycleShortcut = useMemo(() => getPermissionModeCycleShortcut(), [])\n const userFacingName = toolUseConfirm.tool.userFacingName()\n const hasSessionSuggestion = (toolUseConfirm.suggestions?.length ?? 0) > 0\n\n const userFacingReadOrWrite = toolUseConfirm.tool.isReadOnly(\n toolUseConfirm.input as never,\n )\n ? 'Read'\n : 'Edit'\n const title = `${userFacingReadOrWrite} ${isMultiFile(toolUseConfirm) ? 'files' : 'file'}`\n\n const unaryEvent = useMemo<UnaryEvent>(\n () => ({\n completion_type: 'tool_use_single',\n language_name: 'none',\n }),\n [],\n )\n\n usePermissionRequestLogging(toolUseConfirm, unaryEvent)\n\n const permissionDirPath = useMemo(\n () => pathToPermissionDirectory(path),\n [path],\n )\n const isInWorkingDir = useMemo(\n () => isPathInWorkingDirectories(permissionDirPath, toolPermissionContext),\n [permissionDirPath, toolPermissionContext],\n )\n\n const handleChoice = useCallback(\n (newValue: string) => {\n switch (newValue) {\n case 'yes':\n logUnaryEvent({\n completion_type: 'tool_use_single',\n event: 'accept',\n metadata: {\n language_name: 'none',\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n onDone()\n toolUseConfirm.onAllow('temporary')\n return\n case 'yes-session':\n logUnaryEvent({\n completion_type: 'tool_use_single',\n event: 'accept',\n metadata: {\n language_name: 'none',\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n if (hasSessionSuggestion) {\n for (const update of toolUseConfirm.suggestions ?? []) {\n applyToolPermissionUpdate(update)\n }\n }\n onDone()\n toolUseConfirm.onAllow(\n hasSessionSuggestion ? 'permanent' : 'temporary',\n )\n return\n case 'no':\n logUnaryEvent({\n completion_type: 'tool_use_single',\n event: 'reject',\n metadata: {\n language_name: 'none',\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n onDone()\n toolUseConfirm.onReject()\n return\n }\n },\n [applyToolPermissionUpdate, hasSessionSuggestion, onDone, toolUseConfirm],\n )\n\n useInput((inputChar, key) => {\n if (!modeCycleShortcut.check(inputChar, key)) return\n if (toolUseConfirm.tool.isReadOnly(toolUseConfirm.input as never)) return\n if (!hasSessionSuggestion) return\n handleChoice('yes-session')\n return true\n })\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={textColorForRiskScore(toolUseConfirm.riskScore)}\n marginTop={1}\n paddingLeft={1}\n paddingRight={1}\n paddingBottom={1}\n >\n <PermissionRequestTitle\n title={title}\n riskScore={toolUseConfirm.riskScore}\n />\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Text>\n {userFacingName}(\n {toolUseConfirm.tool.renderToolUseMessage(\n toolUseConfirm.input as never,\n { verbose },\n )}\n )\n </Text>\n </Box>\n\n <Box flexDirection=\"column\">\n <Text>Do you want to proceed?</Text>\n <Select\n options={[\n {\n label: 'Yes',\n value: 'yes',\n },\n ...getDontAskAgainOptions(\n toolUseConfirm,\n path,\n modeCycleShortcut.displayText,\n isInWorkingDir,\n hasSessionSuggestion,\n ),\n {\n label: `No, and provide instructions (${chalk.bold.hex(getTheme().warning)('esc')})`,\n value: 'no',\n },\n ]}\n onChange={handleChoice}\n />\n </Box>\n </Box>\n )\n}\n", "import { Box, Text } from 'ink'\nimport React, { useMemo } from 'react'\nimport chalk from 'chalk'\nimport { Select } from '#ui-ink/components/CustomSelect/select'\nimport { savePermission } from '#core/permissions'\nimport {\n type PermissionRequestProps,\n type ToolUseConfirm,\n} from '#ui-ink/components/permissions/PermissionRequest'\nimport { getCwd } from '#core/utils/state'\nimport { getTheme } from '#core/utils/theme'\nimport {\n UnaryEvent,\n usePermissionRequestLogging,\n} from '#ui-ink/hooks/usePermissionRequestLogging'\nimport { PermissionRequestTitle } from '#ui-ink/components/permissions/PermissionRequestTitle'\nimport { logUnaryEvent } from '#core/utils/unaryLogging'\nimport { env } from '#core/utils/env'\n\nfunction parsePrefix(command: string): string | null {\n const trimmed = command.trim()\n if (!trimmed.startsWith('/')) return null\n const firstWord = trimmed.split(/\\s+/)[0]\n return firstWord || null\n}\n\nfunction hasArgs(command: string): boolean {\n return command.trim().includes(' ')\n}\n\nexport function SlashCommandPermissionRequest({\n toolUseConfirm,\n onDone,\n verbose,\n}: PermissionRequestProps): React.ReactNode {\n const theme = getTheme()\n const unaryEvent = useMemo<UnaryEvent>(\n () => ({ completion_type: 'tool_use_single', language_name: 'none' }),\n [],\n )\n\n usePermissionRequestLogging(toolUseConfirm, unaryEvent)\n\n const command =\n typeof toolUseConfirm.input.command === 'string'\n ? toolUseConfirm.input.command\n : ''\n const prefix = parsePrefix(command)\n const showPrefixOption = !!prefix && hasArgs(command)\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.permission}\n marginTop={1}\n paddingLeft={1}\n paddingRight={1}\n paddingBottom={1}\n >\n <PermissionRequestTitle title=\"Slash command\" riskScore={null} />\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Text>\n {toolUseConfirm.tool.userFacingName?.() || 'SlashCommand'}(\n {toolUseConfirm.tool.renderToolUseMessage(toolUseConfirm.input, {\n verbose,\n })}\n )\n </Text>\n <Text color={theme.secondaryText}>{toolUseConfirm.description}</Text>\n </Box>\n\n <Box flexDirection=\"column\">\n <Text>Do you want to proceed?</Text>\n <Select\n options={[\n { label: 'Yes', value: 'yes' },\n {\n label: `Yes, and don't ask again for ${chalk.bold(command)} in ${chalk.bold(getCwd())}`,\n value: 'yes-exact',\n },\n ...(showPrefixOption\n ? [\n {\n label: `Yes, and don't ask again for ${chalk.bold(prefix + ':*')} commands in ${chalk.bold(getCwd())}`,\n value: 'yes-prefix',\n },\n ]\n : []),\n {\n label: `No, and provide instructions (${chalk.bold.hex(getTheme().warning)('esc')})`,\n value: 'no',\n },\n ]}\n onChange={newValue => {\n switch (newValue) {\n case 'yes':\n logUnaryEvent({\n completion_type: 'tool_use_single',\n event: 'accept',\n metadata: {\n language_name: 'none',\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n toolUseConfirm.onAllow('temporary')\n onDone()\n break\n case 'yes-exact':\n logUnaryEvent({\n completion_type: 'tool_use_single',\n event: 'accept',\n metadata: {\n language_name: 'none',\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n savePermission(\n toolUseConfirm.tool,\n toolUseConfirm.input,\n null,\n toolUseConfirm.toolUseContext,\n ).then(() => {\n toolUseConfirm.onAllow('permanent')\n onDone()\n })\n break\n case 'yes-prefix':\n if (!prefix) {\n toolUseConfirm.onAllow('temporary')\n onDone()\n break\n }\n logUnaryEvent({\n completion_type: 'tool_use_single',\n event: 'accept',\n metadata: {\n language_name: 'none',\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n savePermission(\n toolUseConfirm.tool,\n toolUseConfirm.input,\n prefix,\n toolUseConfirm.toolUseContext,\n ).then(() => {\n toolUseConfirm.onAllow('permanent')\n onDone()\n })\n break\n case 'no':\n logUnaryEvent({\n completion_type: 'tool_use_single',\n event: 'reject',\n metadata: {\n language_name: 'none',\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n toolUseConfirm.onReject()\n onDone()\n break\n }\n }}\n />\n </Box>\n </Box>\n )\n}\n", "import { Box, Text } from 'ink'\nimport React, { useMemo } from 'react'\nimport chalk from 'chalk'\nimport { Select } from '#ui-ink/components/CustomSelect/select'\nimport { savePermission } from '#core/permissions'\nimport { type PermissionRequestProps } from '#ui-ink/components/permissions/PermissionRequest'\nimport { getCwd } from '#core/utils/state'\nimport { getTheme } from '#core/utils/theme'\nimport {\n UnaryEvent,\n usePermissionRequestLogging,\n} from '#ui-ink/hooks/usePermissionRequestLogging'\nimport { PermissionRequestTitle } from '#ui-ink/components/permissions/PermissionRequestTitle'\nimport { logUnaryEvent } from '#core/utils/unaryLogging'\nimport { env } from '#core/utils/env'\n\nexport function SkillPermissionRequest({\n toolUseConfirm,\n onDone,\n verbose,\n}: PermissionRequestProps): React.ReactNode {\n const theme = getTheme()\n const unaryEvent = useMemo<UnaryEvent>(\n () => ({ completion_type: 'tool_use_single', language_name: 'none' }),\n [],\n )\n\n usePermissionRequestLogging(toolUseConfirm, unaryEvent)\n\n const raw =\n typeof toolUseConfirm.input.skill === 'string'\n ? toolUseConfirm.input.skill\n : ''\n const skill = raw.trim().replace(/^\\//, '')\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.permission}\n marginTop={1}\n paddingLeft={1}\n paddingRight={1}\n paddingBottom={1}\n >\n <PermissionRequestTitle title=\"Skill\" riskScore={null} />\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Text>\n {toolUseConfirm.tool.userFacingName?.() || 'Skill'}(\n {toolUseConfirm.tool.renderToolUseMessage(toolUseConfirm.input, {\n verbose,\n })}\n )\n </Text>\n <Text color={theme.secondaryText}>{toolUseConfirm.description}</Text>\n </Box>\n\n <Box flexDirection=\"column\">\n <Text>Do you want to proceed?</Text>\n <Select\n options={[\n { label: 'Yes', value: 'yes' },\n {\n label: `Yes, and don't ask again for ${chalk.bold(skill)} in ${chalk.bold(getCwd())}`,\n value: 'yes-exact',\n },\n {\n label: `No, and provide instructions (${chalk.bold.hex(getTheme().warning)('esc')})`,\n value: 'no',\n },\n ]}\n onChange={newValue => {\n switch (newValue) {\n case 'yes':\n logUnaryEvent({\n completion_type: 'tool_use_single',\n event: 'accept',\n metadata: {\n language_name: 'none',\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n toolUseConfirm.onAllow('temporary')\n onDone()\n break\n case 'yes-exact':\n logUnaryEvent({\n completion_type: 'tool_use_single',\n event: 'accept',\n metadata: {\n language_name: 'none',\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n savePermission(\n toolUseConfirm.tool,\n toolUseConfirm.input,\n null,\n toolUseConfirm.toolUseContext,\n ).then(() => {\n toolUseConfirm.onAllow('permanent')\n onDone()\n })\n break\n case 'no':\n logUnaryEvent({\n completion_type: 'tool_use_single',\n event: 'reject',\n metadata: {\n language_name: 'none',\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n toolUseConfirm.onReject()\n onDone()\n break\n }\n }}\n />\n </Box>\n </Box>\n )\n}\n", "import { Box, Text, useInput } from 'ink'\nimport React, { useMemo } from 'react'\nimport chalk from 'chalk'\nimport { Select } from '#ui-ink/components/CustomSelect/select'\nimport { savePermission } from '#core/permissions'\nimport { getTheme } from '#core/utils/theme'\nimport { type PermissionRequestProps } from '#ui-ink/components/permissions/PermissionRequest'\nimport {\n UnaryEvent,\n usePermissionRequestLogging,\n} from '#ui-ink/hooks/usePermissionRequestLogging'\nimport { PermissionRequestTitle } from '#ui-ink/components/permissions/PermissionRequestTitle'\nimport { logUnaryEvent } from '#core/utils/unaryLogging'\nimport { env } from '#core/utils/env'\n\nfunction hostnameForUrl(url: unknown): string | null {\n if (typeof url !== 'string') return null\n try {\n return new URL(url).hostname\n } catch {\n return null\n }\n}\n\nexport function WebFetchPermissionRequest({\n toolUseConfirm,\n onDone,\n verbose,\n}: PermissionRequestProps): React.ReactNode {\n const theme = getTheme()\n const unaryEvent = useMemo<UnaryEvent>(\n () => ({ completion_type: 'tool_use_single', language_name: 'none' }),\n [],\n )\n\n usePermissionRequestLogging(toolUseConfirm, unaryEvent)\n\n const hostname = hostnameForUrl(toolUseConfirm.input.url)\n const hostLabel =\n hostname ??\n (typeof toolUseConfirm.input.url === 'string'\n ? toolUseConfirm.input.url\n : 'unknown')\n\n const reject = () => {\n logUnaryEvent({\n completion_type: 'tool_use_single',\n event: 'reject',\n metadata: {\n language_name: 'none',\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n toolUseConfirm.onReject()\n onDone()\n }\n\n useInput((_input, key) => {\n if (key.escape) {\n reject()\n }\n })\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.permission}\n marginTop={1}\n paddingLeft={1}\n paddingRight={1}\n paddingBottom={1}\n >\n <PermissionRequestTitle\n title=\"Network request outside of sandbox\"\n riskScore={null}\n />\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Box>\n <Text dimColor>Host:</Text>\n <Text> {hostLabel}</Text>\n </Box>\n <Box marginTop={1}>\n <Text>Do you want to allow this connection?</Text>\n </Box>\n <Box marginTop={1}>\n <Select\n options={[\n { label: 'Yes', value: 'yes' },\n ...(hostname\n ? [\n {\n label: `Yes, and don't ask again for ${chalk.bold(hostname)}`,\n value: 'yes-dont-ask-again',\n },\n ]\n : []),\n {\n label: `No, and tell Kode Agent what to do differently ${chalk.bold('(esc)')}`,\n value: 'no',\n },\n ]}\n onChange={newValue => {\n switch (newValue) {\n case 'yes':\n logUnaryEvent({\n completion_type: 'tool_use_single',\n event: 'accept',\n metadata: {\n language_name: 'none',\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n toolUseConfirm.onAllow('temporary')\n onDone()\n break\n case 'yes-dont-ask-again':\n logUnaryEvent({\n completion_type: 'tool_use_single',\n event: 'accept',\n metadata: {\n language_name: 'none',\n message_id: toolUseConfirm.assistantMessage.message.id,\n platform: env.platform,\n },\n })\n savePermission(\n toolUseConfirm.tool,\n toolUseConfirm.input,\n null,\n toolUseConfirm.toolUseContext,\n ).then(() => {\n toolUseConfirm.onAllow('permanent')\n onDone()\n })\n break\n case 'no':\n reject()\n break\n }\n }}\n />\n </Box>\n </Box>\n </Box>\n )\n}\n", "import { Box, Text, useInput } from 'ink'\nimport React from 'react'\nimport { Select } from '#ui-ink/components/CustomSelect/select'\nimport { PermissionRequestTitle } from '#ui-ink/components/permissions/PermissionRequestTitle'\nimport type { ToolUseConfirm } from '#ui-ink/components/permissions/PermissionRequest'\nimport { getTheme } from '#core/utils/theme'\nimport { usePermissionContext } from '#ui-ink/context/PermissionContext'\n\ntype Props = {\n toolUseConfirm: ToolUseConfirm\n onDone(): void\n}\n\nexport function EnterPlanModePermissionRequest({\n toolUseConfirm,\n onDone,\n}: Props): React.ReactNode {\n const theme = getTheme()\n const { setMode } = usePermissionContext()\n\n useInput((_input, key) => {\n if (key.escape) {\n toolUseConfirm.onReject()\n onDone()\n }\n })\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.permission}\n marginTop={1}\n paddingLeft={1}\n paddingRight={1}\n paddingBottom={1}\n >\n <PermissionRequestTitle title=\"Enter plan mode?\" riskScore={null} />\n\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Text>\n The assistant wants to enter plan mode to explore and design an\n implementation approach.\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" paddingX={2}>\n <Text dimColor>In plan mode, the assistant will:</Text>\n <Text dimColor> \u00B7 Explore the codebase thoroughly</Text>\n <Text dimColor> \u00B7 Identify existing patterns</Text>\n <Text dimColor> \u00B7 Design an implementation strategy</Text>\n <Text dimColor> \u00B7 Present a plan for your approval</Text>\n </Box>\n\n <Box flexDirection=\"column\" paddingX={2} marginTop={1}>\n <Text dimColor>\n No code changes will be made until you approve the plan.\n </Text>\n </Box>\n\n <Box flexDirection=\"column\">\n <Text>Would you like to proceed?</Text>\n <Select\n options={[\n { label: 'Yes, enter plan mode', value: 'yes' },\n { label: 'No, start implementing now', value: 'no' },\n ]}\n onChange={value => {\n if (value === 'yes') {\n setMode('plan')\n toolUseConfirm.onAllow('temporary')\n onDone()\n return\n }\n\n toolUseConfirm.onReject()\n onDone()\n }}\n />\n </Box>\n </Box>\n )\n}\n", "import { Box, Text, useInput } from 'ink'\nimport React, { useEffect, useMemo, useState } from 'react'\nimport { Select } from '#ui-ink/components/CustomSelect/select'\nimport TextInput from '#ui-ink/components/TextInput'\nimport { PermissionRequestTitle } from '#ui-ink/components/permissions/PermissionRequestTitle'\nimport type { ToolUseConfirm } from '#ui-ink/components/permissions/PermissionRequest'\nimport { getTheme } from '#core/utils/theme'\nimport { usePermissionContext } from '#ui-ink/context/PermissionContext'\nimport {\n getPlanConversationKey,\n getPlanFilePath,\n readPlanFile,\n} from '#core/utils/planMode'\nimport {\n launchExternalEditor,\n launchExternalEditorForFilePath,\n} from '#cli-utils/externalEditor'\nimport { writeFileSync } from 'fs'\nimport {\n type ExitPlanModeOptionValue,\n getExitPlanModeOptions,\n} from './ExitPlanModeOptions'\n\ntype Props = {\n toolUseConfirm: ToolUseConfirm\n onDone(): void\n verbose: boolean\n}\n\nexport { __getExitPlanModeOptionsForTests } from './ExitPlanModeOptions'\n\nfunction planPlaceholder(): string {\n return 'No plan found. Please write your plan to the plan file first.'\n}\n\nexport function ExitPlanModePermissionRequest({\n toolUseConfirm,\n onDone,\n}: Props): React.ReactNode {\n const theme = getTheme()\n const { setMode } = usePermissionContext()\n\n const conversationKey = getPlanConversationKey(toolUseConfirm.toolUseContext)\n const planFilePath = useMemo(\n () => getPlanFilePath(undefined, conversationKey),\n [conversationKey],\n )\n\n const inputPlan = toolUseConfirm.input.plan\n const planFromInput =\n typeof inputPlan === 'string' && inputPlan.trim().length > 0\n ? inputPlan\n : null\n const planSource: 'file' | 'input' = planFromInput ? 'input' : 'file'\n\n const [planText, setPlanText] = useState(() => {\n if (planSource === 'input') {\n return planFromInput!\n }\n const { content, exists } = readPlanFile(undefined, conversationKey)\n return exists ? content : planPlaceholder()\n })\n const [planExists, setPlanExists] = useState(() => {\n if (planSource === 'input') return false\n const { exists } = readPlanFile(undefined, conversationKey)\n return exists\n })\n const [planSaved, setPlanSaved] = useState(false)\n const [showRejectInput, setShowRejectInput] = useState(false)\n const [rejectFeedback, setRejectFeedback] = useState('')\n const [rejectError, setRejectError] = useState<string | null>(null)\n const [rejectCursorOffset, setRejectCursorOffset] = useState(0)\n const [focusedOption, setFocusedOption] =\n useState<ExitPlanModeOptionValue | null>(null)\n const [teammateCount, setTeammateCount] = useState(3)\n\n useEffect(() => {\n if (!planSaved) return\n const timeout = setTimeout(() => setPlanSaved(false), 5000)\n return () => clearTimeout(timeout)\n }, [planSaved])\n\n useInput((input, key) => {\n if (key.escape && !showRejectInput) {\n toolUseConfirm.onReject()\n onDone()\n return\n }\n\n if (key.tab && focusedOption === 'yes-launch-swarm') {\n setTeammateCount(prev => {\n const allowed = [2, 3, 4, 6, 8]\n const idx = Math.max(0, allowed.indexOf(prev))\n return allowed[(idx + 1) % allowed.length]!\n })\n return\n }\n\n if (!(key.ctrl && input.toLowerCase() === 'g')) return\n\n void (async () => {\n if (planSource === 'input') {\n const edited = await launchExternalEditor(planText)\n if (edited.text !== null) {\n setPlanText(edited.text)\n setPlanSaved(true)\n }\n return\n }\n\n if (!planExists) {\n const initial = planText === planPlaceholder() ? '# Plan\\n' : planText\n try {\n writeFileSync(planFilePath, initial, 'utf-8')\n } catch {\n // Fall back to editing a temp buffer.\n const edited = await launchExternalEditor(initial)\n if (edited.text !== null) {\n setPlanText(edited.text)\n setPlanSaved(true)\n }\n return\n }\n }\n\n const opened = await launchExternalEditorForFilePath(planFilePath)\n if (opened.ok) {\n const next = readPlanFile(undefined, conversationKey)\n setPlanExists(next.exists)\n setPlanText(next.exists ? next.content : planPlaceholder())\n setPlanSaved(true)\n }\n })()\n })\n\n const bypassAvailable =\n toolUseConfirm.toolUseContext.options?.safeMode !== true\n // The reference CLI's current build gates this option off (pc2 spreads an empty array),\n // but keeps the handler branches; keep runtime behavior 1:1 by defaulting to false.\n const launchSwarmAvailable = false\n const options = useMemo(\n () =>\n getExitPlanModeOptions({\n bypassAvailable,\n launchSwarmAvailable,\n teammateCount,\n }),\n [bypassAvailable, launchSwarmAvailable, teammateCount],\n )\n\n if (showRejectInput) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.permission}\n marginTop={1}\n paddingLeft={1}\n paddingRight={1}\n paddingBottom={1}\n >\n <PermissionRequestTitle title=\"No, keep planning\" riskScore={null} />\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Text dimColor>\n Type here to tell Kode Agent what to change (Enter submits, Esc\n cancels)\n </Text>\n {rejectError ? <Text color={theme.error}>{rejectError}</Text> : null}\n <TextInput\n value={rejectFeedback}\n onChange={value => {\n setRejectFeedback(value)\n setRejectError(null)\n }}\n onSubmit={() => {\n const trimmed = rejectFeedback.trim()\n if (!trimmed) {\n setRejectError('Please enter what you want changed.')\n return\n }\n toolUseConfirm.onReject(trimmed)\n onDone()\n }}\n onExit={() => {\n setShowRejectInput(false)\n setRejectFeedback('')\n setRejectError(null)\n }}\n columns={80}\n cursorOffset={rejectCursorOffset}\n onChangeCursorOffset={setRejectCursorOffset}\n />\n </Box>\n </Box>\n )\n }\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.permission}\n marginTop={1}\n paddingLeft={1}\n paddingRight={1}\n paddingBottom={1}\n >\n <PermissionRequestTitle title=\"Ready to code?\" riskScore={null} />\n\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Text>Here is Kode Agent&apos;s plan:</Text>\n <Box\n borderStyle=\"single\"\n borderColor={theme.secondaryBorder}\n borderDimColor\n borderLeft={false}\n borderRight={false}\n paddingX={1}\n paddingY={0}\n marginBottom={1}\n flexDirection=\"column\"\n >\n <Text>{planText}</Text>\n </Box>\n </Box>\n\n <Box flexDirection=\"column\" paddingX={2}>\n <Text dimColor>\n Tip: Press ctrl+g to edit{' '}\n {planSource === 'file' ? `plan file: ${planFilePath}` : 'plan text'}\n {planSaved ? ' \u00B7 Plan saved!' : ''}\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" marginTop={1}>\n <Text dimColor>Would you like to proceed?</Text>\n <Select\n options={options}\n onFocus={value => setFocusedOption(value as ExitPlanModeOptionValue)}\n onChange={value => {\n if (value === 'no') {\n setShowRejectInput(true)\n return\n }\n\n const nextMode =\n value === 'yes-bypass'\n ? 'bypassPermissions'\n : value === 'yes-accept'\n ? 'acceptEdits'\n : value === 'yes-launch-swarm'\n ? 'bypassPermissions'\n : 'default'\n\n setMode(nextMode)\n\n if (value === 'yes-launch-swarm') {\n toolUseConfirm.input.launchSwarm = true\n toolUseConfirm.input.teammateCount = teammateCount\n }\n\n toolUseConfirm.onAllow('temporary')\n onDone()\n }}\n />\n </Box>\n </Box>\n )\n}\n", "import { spawn, spawnSync } from 'child_process'\nimport { mkdtempSync, readFileSync, rmSync, writeFileSync } from 'fs'\nimport { tmpdir } from 'os'\nimport { join } from 'path'\n\ntype EditorCommand = {\n command: string\n args: string[]\n displayName: string\n shell?: boolean\n}\n\nconst isWindows = process.platform === 'win32'\n\nfunction isCommandAvailable(command: string): boolean {\n const checker = isWindows ? 'where' : 'which'\n const result = spawnSync(checker, [command], { stdio: 'ignore' })\n return result.status === 0\n}\n\nfunction resolveEditorCommand(): EditorCommand | null {\n const envEditor = process.env.VISUAL || process.env.EDITOR\n if (envEditor?.trim()) {\n return {\n command: envEditor.trim(),\n args: [],\n displayName: envEditor.trim(),\n shell: true, // Allow quoted paths or extra flags\n }\n }\n\n const candidates: EditorCommand[] = []\n\n if (isCommandAvailable('code')) {\n candidates.push({\n command: 'code',\n args: ['-w'],\n displayName: 'code -w',\n })\n }\n\n if (!isWindows) {\n if (isCommandAvailable('nano')) {\n candidates.push({\n command: 'nano',\n args: [],\n displayName: 'nano',\n })\n }\n if (isCommandAvailable('vim')) {\n candidates.push({\n command: 'vim',\n args: [],\n displayName: 'vim',\n })\n }\n if (isCommandAvailable('open')) {\n candidates.push({\n command: 'open',\n args: ['-W', '-t'],\n displayName: 'open -W -t',\n })\n }\n } else {\n candidates.push({\n command: 'notepad',\n args: [],\n displayName: 'notepad',\n })\n }\n\n return (\n candidates.find(candidate => isCommandAvailable(candidate.command)) ?? null\n )\n}\n\nfunction restoreStdinState(previouslyRaw: boolean): void {\n if (!process.stdin.isTTY) return\n process.stdin.resume()\n if (previouslyRaw && process.stdin.setRawMode) {\n process.stdin.setRawMode(true)\n }\n}\n\nfunction normalizeNewlines(text: string): string {\n return text.replace(/\\r\\n/g, '\\n')\n}\n\nexport type ExternalEditorResult =\n | { text: string; editorLabel: string }\n | { text: null; editorLabel?: string; error: Error }\n\nexport async function launchExternalEditor(\n initialText: string,\n): Promise<ExternalEditorResult> {\n const editorCommand = resolveEditorCommand()\n if (!editorCommand) {\n return {\n text: null,\n error: new Error(\n 'No editor found. Set $VISUAL or $EDITOR, or install code, nano, vim, or notepad.',\n ),\n }\n }\n\n const dir = mkdtempSync(join(tmpdir(), 'kode-edit-'))\n const filePath = join(dir, 'message.txt')\n writeFileSync(filePath, initialText, 'utf-8')\n\n const wasRaw = Boolean(process.stdin.isTTY && process.stdin.isRaw)\n if (process.stdin.isTTY) {\n process.stdin.pause()\n if (process.stdin.setRawMode) {\n process.stdin.setRawMode(false)\n }\n }\n\n try {\n await new Promise<void>((resolve, reject) => {\n const child = spawn(\n editorCommand.command,\n [...editorCommand.args, filePath],\n {\n stdio: 'inherit',\n shell: editorCommand.shell ?? false,\n },\n )\n\n child.on('error', reject)\n child.on('exit', (code, signal) => {\n if (code === 0 || code === null) {\n resolve()\n } else {\n reject(\n new Error(\n `Editor exited with code ${code}${signal ? ` (signal ${signal})` : ''}`,\n ),\n )\n }\n })\n })\n } catch (error) {\n restoreStdinState(wasRaw)\n rmSync(dir, { recursive: true, force: true })\n return {\n text: null,\n editorLabel: editorCommand.displayName,\n error: error as Error,\n }\n }\n\n restoreStdinState(wasRaw)\n\n try {\n const edited = normalizeNewlines(readFileSync(filePath, 'utf-8'))\n rmSync(dir, { recursive: true, force: true })\n return { text: edited, editorLabel: editorCommand.displayName }\n } catch (error) {\n rmSync(dir, { recursive: true, force: true })\n return {\n text: null,\n editorLabel: editorCommand.displayName,\n error: error as Error,\n }\n }\n}\n\nexport type ExternalEditorFileResult =\n | { ok: true; editorLabel: string }\n | { ok: false; editorLabel?: string; error: Error }\n\nexport async function launchExternalEditorForFilePath(\n filePath: string,\n): Promise<ExternalEditorFileResult> {\n const editorCommand = resolveEditorCommand()\n if (!editorCommand) {\n return {\n ok: false,\n error: new Error(\n 'No editor found. Set $VISUAL or $EDITOR, or install code, nano, vim, or notepad.',\n ),\n }\n }\n\n const wasRaw = Boolean(process.stdin.isTTY && process.stdin.isRaw)\n if (process.stdin.isTTY) {\n process.stdin.pause()\n if (process.stdin.setRawMode) {\n process.stdin.setRawMode(false)\n }\n }\n\n try {\n await new Promise<void>((resolve, reject) => {\n const child = spawn(\n editorCommand.command,\n [...editorCommand.args, filePath],\n {\n stdio: 'inherit',\n shell: editorCommand.shell ?? false,\n },\n )\n\n child.on('error', reject)\n child.on('exit', (code, signal) => {\n if (code === 0 || code === null) {\n resolve()\n } else {\n reject(\n new Error(\n `Editor exited with code ${code}${signal ? ` (signal ${signal})` : ''}`,\n ),\n )\n }\n })\n })\n } catch (error) {\n restoreStdinState(wasRaw)\n return {\n ok: false,\n editorLabel: editorCommand.displayName,\n error: error as Error,\n }\n }\n\n restoreStdinState(wasRaw)\n return { ok: true, editorLabel: editorCommand.displayName }\n}\n", "export type ExitPlanModeOptionValue =\n | 'yes-bypass'\n | 'yes-accept'\n | 'yes-launch-swarm'\n | 'yes-default'\n | 'no'\n\nexport type ExitPlanModeOption = {\n label: string\n value: ExitPlanModeOptionValue\n}\n\nexport function getExitPlanModeOptions(args: {\n bypassAvailable: boolean\n launchSwarmAvailable: boolean\n teammateCount: number\n}): ExitPlanModeOption[] {\n const options: ExitPlanModeOption[] = []\n\n options.push(\n args.bypassAvailable\n ? { label: 'Yes, and bypass permissions', value: 'yes-bypass' }\n : { label: 'Yes, and auto-accept edits', value: 'yes-accept' },\n )\n\n if (args.launchSwarmAvailable) {\n options.push({\n label: `Yes, and launch swarm (${args.teammateCount} teammates)`,\n value: 'yes-launch-swarm',\n })\n }\n\n options.push({\n label: 'Yes, and manually approve edits',\n value: 'yes-default',\n })\n options.push({ label: 'No, keep planning', value: 'no' })\n\n return options\n}\n\nexport function __getExitPlanModeOptionsForTests(args: {\n bypassAvailable: boolean\n launchSwarmAvailable: boolean\n teammateCount: number\n}): ExitPlanModeOption[] {\n return getExitPlanModeOptions(args)\n}\n", "import React, { useCallback, useMemo, useState } from 'react'\nimport { Box, Text } from 'ink'\nimport { getTheme } from '#core/utils/theme'\nimport { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\nimport type { PermissionRequestProps } from '#ui-ink/components/permissions/PermissionRequest'\nimport { AskUserQuestionTool } from '#tools/tools/interaction/AskUserQuestionTool/AskUserQuestionTool'\nimport { AskUserQuestionTabs } from './QuestionTabs'\nimport { AskUserQuestionView } from './QuestionView'\nimport { AskUserQuestionSubmitView } from './SubmitView'\nimport { useAskUserQuestionKeyboard } from './useAskUserQuestionKeyboard'\nimport type { Question, QuestionState } from './types'\nimport { getTabHeaders } from './utils'\n\nexport {\n applyMultiSelectNav as __applyMultiSelectNavForTests,\n applySingleSelectNav as __applySingleSelectNavForTests,\n formatMultiSelectAnswer as __formatMultiSelectAnswerForTests,\n getTabHeaders as __getTabHeadersForTests,\n getTrimmedOtherAnswer as __getTrimmedOtherAnswerForTests,\n isTextInputChar as __isTextInputCharForTests,\n} from './utils'\n\nexport function AskUserQuestionPermissionRequest({\n toolUseConfirm,\n onDone,\n}: PermissionRequestProps): React.ReactNode {\n const theme = getTheme()\n const { columns } = useTerminalSize()\n\n const parsed = useMemo(() => {\n const result = AskUserQuestionTool.inputSchema.safeParse(\n toolUseConfirm.input,\n )\n if (!result.success)\n return {\n questions: [] as Question[],\n initialAnswers: {} as Record<string, string>,\n }\n return {\n questions: (result.data.questions as Question[]) ?? [],\n initialAnswers:\n (result.data.answers as Record<string, string> | undefined) ?? {},\n }\n }, [toolUseConfirm.input])\n\n const questions = parsed.questions\n\n const [currentQuestionIndex, setCurrentQuestionIndex] = useState(0)\n const [focusedOptionIndex, setFocusedOptionIndex] = useState(0)\n const [isMultiSelectSubmitFocused, setIsMultiSelectSubmitFocused] =\n useState(false)\n const [answers, setAnswers] = useState<Record<string, string>>(\n parsed.initialAnswers,\n )\n const [questionStates, setQuestionStates] = useState<\n Record<string, QuestionState>\n >({})\n\n const currentQuestion = questions[currentQuestionIndex]\n const isSubmitTab = currentQuestionIndex === questions.length\n const hideSubmitTab = questions.length === 1 && !questions[0]?.multiSelect\n\n const maxTabIndex = hideSubmitTab\n ? Math.max(0, questions.length - 1)\n : questions.length\n const tabHeaders = useMemo(\n () =>\n getTabHeaders({\n questions,\n currentQuestionIndex,\n columns,\n hideSubmitTab,\n }),\n [questions, currentQuestionIndex, columns, hideSubmitTab],\n )\n\n const activeQuestionState: QuestionState | undefined =\n currentQuestion?.question\n ? questionStates[currentQuestion.question]\n : undefined\n const isOtherFocused =\n !isSubmitTab &&\n currentQuestion &&\n !isMultiSelectSubmitFocused &&\n focusedOptionIndex === currentQuestion.options.length\n\n const cancel = useCallback(() => {\n toolUseConfirm.onReject()\n onDone()\n }, [toolUseConfirm, onDone])\n\n const allowWithAnswers = useCallback(\n (nextAnswers: Record<string, string>) => {\n toolUseConfirm.input.answers = nextAnswers\n toolUseConfirm.onAllow('temporary')\n onDone()\n },\n [toolUseConfirm, onDone],\n )\n\n useAskUserQuestionKeyboard({\n questions,\n currentQuestionIndex,\n setCurrentQuestionIndex,\n focusedOptionIndex,\n setFocusedOptionIndex,\n isMultiSelectSubmitFocused,\n setIsMultiSelectSubmitFocused,\n answers,\n setAnswers,\n questionStates,\n setQuestionStates,\n maxTabIndex,\n hideSubmitTab,\n onCancel: cancel,\n onAllowWithAnswers: next => allowWithAnswers(next),\n })\n\n const allQuestionsAnswered =\n questions.every(q => q?.question && Boolean(answers[q.question])) ?? false\n\n if (questions.length === 0) {\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color={theme.error}>Invalid AskUserQuestion input.</Text>\n <Text dimColor>Press Esc to cancel.</Text>\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box\n borderTop\n borderColor={theme.secondaryText}\n flexDirection=\"column\"\n paddingTop={0}\n >\n <AskUserQuestionTabs\n theme={theme}\n questions={questions}\n currentQuestionIndex={currentQuestionIndex}\n maxTabIndex={maxTabIndex}\n hideSubmitTab={hideSubmitTab}\n tabHeaders={tabHeaders}\n answers={answers}\n />\n\n {!isSubmitTab && currentQuestion && (\n <AskUserQuestionView\n theme={theme}\n question={currentQuestion}\n questionState={activeQuestionState}\n otherText={\n questionStates[currentQuestion.question]?.textInputValue ?? ''\n }\n focusedOptionIndex={focusedOptionIndex}\n isOtherFocused={isOtherFocused}\n isMultiSelectSubmitFocused={isMultiSelectSubmitFocused}\n isLastQuestion={currentQuestionIndex === questions.length - 1}\n />\n )}\n\n {isSubmitTab && (\n <AskUserQuestionSubmitView\n theme={theme}\n questions={questions}\n answers={answers}\n allQuestionsAnswered={allQuestionsAnswered}\n onCancel={cancel}\n onSubmit={() => allowWithAnswers(answers)}\n />\n )}\n </Box>\n </Box>\n )\n}\n", "import React from 'react'\nimport { Box, Text } from 'ink'\nimport figures from 'figures'\n\nimport type { Theme } from '#core/utils/theme'\n\nimport type { Question } from './types'\n\nexport function AskUserQuestionTabs(props: {\n theme: Theme\n questions: Question[]\n currentQuestionIndex: number\n maxTabIndex: number\n hideSubmitTab: boolean\n tabHeaders: string[]\n answers: Record<string, string>\n}): React.ReactNode {\n const inverseText = props.theme.text === '#fff' ? '#000' : '#fff'\n const showArrows = !(props.questions.length === 1 && props.hideSubmitTab)\n const isSubmitTab = props.currentQuestionIndex === props.questions.length\n const rightArrowInactive = props.currentQuestionIndex === props.maxTabIndex\n\n return (\n <Box flexDirection=\"row\" marginBottom={1}>\n {showArrows && (\n <Text\n color={\n props.currentQuestionIndex === 0\n ? props.theme.secondaryText\n : undefined\n }\n >\n \u2190{' '}\n </Text>\n )}\n {props.questions.map((question, index) => {\n const isSelected = index === props.currentQuestionIndex\n const checkbox =\n question.question && props.answers[question.question]\n ? figures.checkboxOn\n : figures.checkboxOff\n const headerText =\n props.tabHeaders[index] ?? question.header ?? `Q${index + 1}`\n const tabText = ` ${checkbox} ${headerText} `\n\n return (\n <React.Fragment key={question.question || `question-${index}`}>\n <Text\n backgroundColor={isSelected ? props.theme.permission : undefined}\n color={isSelected ? inverseText : undefined}\n >\n {tabText}\n </Text>\n </React.Fragment>\n )\n })}\n {!props.hideSubmitTab && (\n <Text\n backgroundColor={isSubmitTab ? props.theme.permission : undefined}\n color={isSubmitTab ? inverseText : undefined}\n >\n {' '}\n {figures.tick} Submit{' '}\n </Text>\n )}\n {showArrows && (\n <Text\n color={rightArrowInactive ? props.theme.secondaryText : undefined}\n >\n {' '}\n \u2192\n </Text>\n )}\n </Box>\n )\n}\n", "import React from 'react'\nimport { Box, Text } from 'ink'\nimport figures from 'figures'\n\nimport type { Theme } from '#core/utils/theme'\n\nimport type { Question, QuestionState } from './types'\n\nexport function AskUserQuestionView(props: {\n theme: Theme\n question: Question\n questionState: QuestionState | undefined\n otherText: string\n focusedOptionIndex: number\n isOtherFocused: boolean\n isMultiSelectSubmitFocused: boolean\n isLastQuestion: boolean\n}): React.ReactNode {\n const rawSelected = props.questionState?.selectedValue\n const selectedValues = Array.isArray(rawSelected) ? rawSelected : []\n const otherSelected = props.question.multiSelect\n ? selectedValues.includes('__other__')\n : rawSelected === '__other__'\n\n const otherPlaceholder = props.question.multiSelect\n ? 'Type something'\n : 'Type something.'\n const otherLine =\n props.otherText.length > 0\n ? props.otherText\n : props.isOtherFocused || otherSelected\n ? otherPlaceholder\n : ''\n\n return (\n <>\n <Text bold>{props.question.question}</Text>\n\n <Box flexDirection=\"column\" marginTop={1}>\n {props.question.options.map((option, index) => {\n const isFocused =\n !props.isMultiSelectSubmitFocused &&\n index === props.focusedOptionIndex\n const isSelected = props.question.multiSelect\n ? selectedValues.includes(option.label)\n : rawSelected === option.label\n const pointer = isFocused ? figures.pointer : ' '\n const color = isFocused ? props.theme.kode : props.theme.text\n const indicator = props.question.multiSelect\n ? isSelected\n ? figures.checkboxOn\n : figures.checkboxOff\n : isSelected\n ? figures.tick\n : ' '\n return (\n <Box key={option.label} flexDirection=\"column\">\n <Text color={color}>\n {pointer} {indicator} {option.label}\n </Text>\n <Text color={props.theme.secondaryText}>\n {' '}\n {option.description}\n </Text>\n </Box>\n )\n })}\n\n <Box flexDirection=\"column\">\n <Text\n color={props.isOtherFocused ? props.theme.kode : props.theme.text}\n >\n {props.isOtherFocused ? figures.pointer : ' '}{' '}\n {props.question.multiSelect\n ? otherSelected\n ? figures.checkboxOn\n : figures.checkboxOff\n : otherSelected\n ? figures.tick\n : ' '}{' '}\n Other\n </Text>\n {(props.isOtherFocused ||\n otherSelected ||\n props.otherText.trim().length > 0) && (\n <Text color={props.theme.secondaryText}>\n {otherLine}\n {props.isOtherFocused && <Text color=\"gray\">\u258C</Text>}\n </Text>\n )}\n </Box>\n\n {props.question.multiSelect && (\n <Box marginTop={0}>\n <Text\n color={\n props.isMultiSelectSubmitFocused\n ? props.theme.kode\n : props.theme.text\n }\n bold={props.isMultiSelectSubmitFocused}\n >\n {props.isMultiSelectSubmitFocused ? figures.pointer : ' '}{' '}\n {props.isLastQuestion ? 'Submit' : 'Next'}\n </Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text color={props.theme.secondaryText} dimColor>\n Enter to select \u00B7 Tab/Arrow keys to navigate \u00B7 Esc to cancel\n </Text>\n </Box>\n </Box>\n </>\n )\n}\n", "import React from 'react'\nimport { Box, Text } from 'ink'\nimport figures from 'figures'\n\nimport type { Theme } from '#core/utils/theme'\nimport { Select } from '#ui-ink/components/CustomSelect/select'\n\nimport type { Question } from './types'\n\nexport function AskUserQuestionSubmitView(props: {\n theme: Theme\n questions: Question[]\n answers: Record<string, string>\n allQuestionsAnswered: boolean\n onCancel: () => void\n onSubmit: () => void\n}): React.ReactNode {\n return (\n <Box flexDirection=\"column\">\n <Text bold>Review your answers</Text>\n {!props.allQuestionsAnswered && (\n <Box marginTop={1}>\n <Text color={props.theme.warning}>\n {figures.warning} You have not answered all questions\n </Text>\n </Box>\n )}\n <Box flexDirection=\"column\" marginTop={1}>\n {props.questions\n .filter(q => q?.question && props.answers[q.question])\n .map(q => (\n <Box key={q.question} flexDirection=\"column\" marginLeft={1}>\n <Text>\n {figures.bullet} {q.question}\n </Text>\n <Box marginLeft={2}>\n <Text color={props.theme.success}>\n {figures.arrowRight} {props.answers[q.question]}\n </Text>\n </Box>\n </Box>\n ))}\n </Box>\n\n <Box marginTop={1}>\n <Text color={props.theme.secondaryText}>\n Ready to submit your answers?\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Select\n options={[\n { label: 'Submit answers', value: 'submit' },\n { label: 'Cancel', value: 'cancel' },\n ]}\n onChange={value => {\n if (value === 'cancel') {\n props.onCancel()\n return\n }\n if (value === 'submit') {\n props.onSubmit()\n }\n }}\n />\n </Box>\n </Box>\n )\n}\n", "import { useInput } from 'ink'\nimport type React from 'react'\n\nimport {\n applyMultiSelectNav,\n applySingleSelectNav,\n formatMultiSelectAnswer,\n getTrimmedOtherAnswer,\n isTextInputChar,\n} from './utils'\nimport type { Question, QuestionState } from './types'\n\nexport function useAskUserQuestionKeyboard(args: {\n questions: Question[]\n currentQuestionIndex: number\n setCurrentQuestionIndex: React.Dispatch<React.SetStateAction<number>>\n focusedOptionIndex: number\n setFocusedOptionIndex: React.Dispatch<React.SetStateAction<number>>\n isMultiSelectSubmitFocused: boolean\n setIsMultiSelectSubmitFocused: React.Dispatch<React.SetStateAction<boolean>>\n answers: Record<string, string>\n setAnswers: React.Dispatch<React.SetStateAction<Record<string, string>>>\n questionStates: Record<string, QuestionState>\n setQuestionStates: React.Dispatch<\n React.SetStateAction<Record<string, QuestionState>>\n >\n maxTabIndex: number\n hideSubmitTab: boolean\n onCancel: () => void\n onAllowWithAnswers: (answers: Record<string, string>) => void\n}): void {\n const currentQuestion = args.questions[args.currentQuestionIndex]\n const isSubmitTab = args.currentQuestionIndex === args.questions.length\n\n const setQuestionState = (\n questionText: string,\n next: Partial<QuestionState>,\n isMultiSelect: boolean,\n ) => {\n args.setQuestionStates(prev => {\n const existing = prev[questionText]\n const selectedValue =\n next.selectedValue ??\n existing?.selectedValue ??\n (isMultiSelect ? ([] as string[]) : '')\n const textInputValue =\n next.textInputValue ?? existing?.textInputValue ?? ''\n return {\n ...prev,\n [questionText]: { selectedValue, textInputValue },\n }\n })\n }\n\n const setAnswer = (\n questionText: string,\n answer: string,\n shouldAdvance: boolean,\n ) => {\n args.setAnswers(prev => ({ ...prev, [questionText]: answer }))\n if (shouldAdvance) {\n args.setCurrentQuestionIndex(prev => prev + 1)\n args.setFocusedOptionIndex(0)\n }\n }\n\n useInput((input, key) => {\n if (key.escape) {\n args.onCancel()\n return\n }\n\n const isMultiSelectQuestion =\n Boolean(currentQuestion?.multiSelect) && !isSubmitTab\n const isOtherFocused =\n !isSubmitTab &&\n currentQuestion &&\n !args.isMultiSelectSubmitFocused &&\n args.focusedOptionIndex === currentQuestion.options.length\n const isInTextInput = isOtherFocused\n const allowQuestionTabNav = !(isInTextInput && !isSubmitTab)\n\n if (!key.return && allowQuestionTabNav) {\n const prevQuestion =\n key.leftArrow || (!isMultiSelectQuestion && key.shift && key.tab)\n const nextQuestion =\n key.rightArrow || (!isMultiSelectQuestion && key.tab && !key.shift)\n\n if (prevQuestion && args.currentQuestionIndex > 0) {\n args.setCurrentQuestionIndex(prev => Math.max(0, prev - 1))\n args.setFocusedOptionIndex(0)\n args.setIsMultiSelectSubmitFocused(false)\n return\n }\n\n if (nextQuestion && args.currentQuestionIndex < args.maxTabIndex) {\n args.setCurrentQuestionIndex(prev =>\n Math.min(args.maxTabIndex, prev + 1),\n )\n args.setFocusedOptionIndex(0)\n args.setIsMultiSelectSubmitFocused(false)\n return\n }\n }\n\n if (isSubmitTab) return\n if (!currentQuestion) return\n\n const optionCount = currentQuestion.options.length + 1 // + Other\n const questionText = currentQuestion.question\n\n if (currentQuestion.multiSelect) {\n if (key.downArrow || key.upArrow || key.tab) {\n const next = applyMultiSelectNav({\n state: {\n focusedOptionIndex: args.focusedOptionIndex,\n isSubmitFocused: args.isMultiSelectSubmitFocused,\n },\n key: {\n downArrow: key.downArrow,\n upArrow: key.upArrow,\n tab: key.tab,\n shift: key.shift,\n },\n optionCount,\n })\n\n if (\n next.focusedOptionIndex !== args.focusedOptionIndex ||\n next.isSubmitFocused !== args.isMultiSelectSubmitFocused\n ) {\n args.setFocusedOptionIndex(next.focusedOptionIndex)\n args.setIsMultiSelectSubmitFocused(next.isSubmitFocused)\n }\n return\n }\n\n if (args.isMultiSelectSubmitFocused && (key.return || input === ' ')) {\n args.setCurrentQuestionIndex(prev => prev + 1)\n args.setFocusedOptionIndex(0)\n args.setIsMultiSelectSubmitFocused(false)\n return\n }\n\n if (isOtherFocused) {\n if (key.backspace || key.delete) {\n const existing =\n args.questionStates[questionText]?.textInputValue ?? ''\n const nextText = existing.slice(0, -1)\n const existingSelected =\n args.questionStates[questionText]?.selectedValue\n const selected = Array.isArray(existingSelected)\n ? existingSelected\n : []\n const trimmed = nextText.trim()\n const nextSelected = trimmed\n ? selected.includes('__other__')\n ? selected\n : [...selected, '__other__']\n : selected.filter(v => v !== '__other__')\n\n setQuestionState(\n questionText,\n { textInputValue: nextText, selectedValue: nextSelected },\n true,\n )\n args.setAnswers(prev => ({\n ...prev,\n [questionText]: formatMultiSelectAnswer(nextSelected, nextText),\n }))\n return\n }\n\n if (isTextInputChar(input, key)) {\n const existing =\n args.questionStates[questionText]?.textInputValue ?? ''\n const nextText = existing + input\n const existingSelected =\n args.questionStates[questionText]?.selectedValue\n const selected = Array.isArray(existingSelected)\n ? existingSelected\n : []\n const trimmed = nextText.trim()\n const nextSelected = trimmed\n ? selected.includes('__other__')\n ? selected\n : [...selected, '__other__']\n : selected.filter(v => v !== '__other__')\n\n setQuestionState(\n questionText,\n { textInputValue: nextText, selectedValue: nextSelected },\n true,\n )\n args.setAnswers(prev => ({\n ...prev,\n [questionText]: formatMultiSelectAnswer(nextSelected, nextText),\n }))\n return\n }\n }\n\n if (key.return || (input === ' ' && !isOtherFocused)) {\n const existing = args.questionStates[questionText]?.selectedValue\n const selected = Array.isArray(existing) ? existing : []\n const value = isOtherFocused\n ? '__other__'\n : currentQuestion.options[args.focusedOptionIndex]?.label\n if (!value) return\n\n const next = selected.includes(value)\n ? selected.filter(v => v !== value)\n : [...selected, value]\n\n setQuestionState(questionText, { selectedValue: next }, true)\n\n const otherText =\n args.questionStates[questionText]?.textInputValue ?? ''\n args.setAnswers(prev => ({\n ...prev,\n [questionText]: formatMultiSelectAnswer(next, otherText),\n }))\n }\n return\n }\n\n if (key.downArrow || key.upArrow) {\n args.setFocusedOptionIndex(prev =>\n applySingleSelectNav({\n focusedOptionIndex: prev,\n key: { downArrow: key.downArrow, upArrow: key.upArrow },\n optionCount,\n }),\n )\n return\n }\n\n if (isOtherFocused) {\n if (key.backspace || key.delete) {\n const existing = args.questionStates[questionText]?.textInputValue ?? ''\n setQuestionState(\n questionText,\n { textInputValue: existing.slice(0, -1) },\n false,\n )\n return\n }\n\n if (isTextInputChar(input, key)) {\n const existing = args.questionStates[questionText]?.textInputValue ?? ''\n setQuestionState(\n questionText,\n { textInputValue: existing + input },\n false,\n )\n return\n }\n }\n\n if (!key.return) return\n\n const isSelectingOther =\n args.focusedOptionIndex === currentQuestion.options.length\n\n if (isSelectingOther) {\n const otherText = args.questionStates[questionText]?.textInputValue ?? ''\n const trimmed = getTrimmedOtherAnswer(otherText)\n if (!trimmed) return\n\n const selectedValue = '__other__'\n setQuestionState(questionText, { selectedValue }, false)\n\n if (args.hideSubmitTab) {\n args.onAllowWithAnswers({ ...args.answers, [questionText]: trimmed })\n return\n }\n\n setAnswer(questionText, trimmed, true)\n return\n }\n\n const selectedValue =\n currentQuestion.options[args.focusedOptionIndex]?.label\n if (!selectedValue) return\n\n setQuestionState(questionText, { selectedValue }, false)\n\n if (args.hideSubmitTab) {\n args.onAllowWithAnswers({\n ...args.answers,\n [questionText]: selectedValue,\n })\n return\n }\n\n setAnswer(questionText, selectedValue, true)\n })\n}\n", "import figures from 'figures'\nimport stringWidth from 'string-width'\n\nimport type {\n MultiSelectNavKey,\n MultiSelectNavState,\n Question,\n SingleSelectNavKey,\n TextInputKey,\n} from './types'\n\nexport function isTextInputChar(\n input: unknown,\n key: TextInputKey,\n): input is string {\n if (key.ctrl || key.meta || key.tab) return false\n if (typeof input !== 'string' || input.length === 0) return false\n for (const char of input) {\n const code = char.codePointAt(0)\n if (code === undefined) return false\n if (code < 32 || code === 127) return false\n }\n return true\n}\n\nexport function applySingleSelectNav(args: {\n focusedOptionIndex: number\n key: SingleSelectNavKey\n optionCount: number\n}): number {\n const { focusedOptionIndex, key, optionCount } = args\n\n if (key.downArrow) return Math.min(optionCount - 1, focusedOptionIndex + 1)\n if (key.upArrow) return Math.max(0, focusedOptionIndex - 1)\n return focusedOptionIndex\n}\n\nexport function applyMultiSelectNav(args: {\n state: MultiSelectNavState\n key: MultiSelectNavKey\n optionCount: number\n}): MultiSelectNavState {\n const { state, key, optionCount } = args\n\n const nextKey = key.downArrow || (key.tab && !key.shift)\n const prevKey = key.upArrow || (key.tab && key.shift)\n\n if (state.isSubmitFocused) {\n if (prevKey) {\n return {\n focusedOptionIndex: Math.max(0, optionCount - 1),\n isSubmitFocused: false,\n }\n }\n return state\n }\n\n if (nextKey) {\n if (state.focusedOptionIndex >= optionCount - 1) {\n return { ...state, isSubmitFocused: true }\n }\n return { ...state, focusedOptionIndex: state.focusedOptionIndex + 1 }\n }\n\n if (prevKey) {\n return {\n ...state,\n focusedOptionIndex: Math.max(0, state.focusedOptionIndex - 1),\n }\n }\n\n return state\n}\n\nfunction truncateWithEllipsis(label: string, maxWidth: number): string {\n if (stringWidth(label) <= maxWidth) return label\n\n let candidate = label\n while (candidate.length > 1 && stringWidth(candidate + '\u2026') > maxWidth) {\n candidate = candidate.slice(0, -1)\n }\n return candidate.length ? candidate + '\u2026' : '\u2026'\n}\n\nexport function getTabHeaders(args: {\n questions: Question[]\n currentQuestionIndex: number\n columns: number\n hideSubmitTab: boolean\n}): string[] {\n const submitLabel = args.hideSubmitTab ? '' : ` ${figures.tick} Submit `\n const reserved =\n stringWidth('\u2190 ') + stringWidth(' \u2192') + stringWidth(submitLabel)\n const available = args.columns - reserved\n\n const headers = args.questions.map(\n (question, index) => question?.header || `Q${index + 1}`,\n )\n\n if (available <= 0) {\n return headers.map((header, index) =>\n index === args.currentQuestionIndex ? header.slice(0, 3) : '',\n )\n }\n\n const total = headers.reduce(\n (sum, header) => sum + 4 + stringWidth(header),\n 0,\n )\n if (total <= available) return headers\n\n const currentHeader = headers[args.currentQuestionIndex] ?? ''\n const currentTabWidth = 4 + stringWidth(currentHeader)\n const currentBudget = Math.min(currentTabWidth, Math.floor(available / 2))\n const remaining = available - currentBudget\n const otherCount = args.questions.length - 1\n const otherBudget = Math.max(\n 6,\n Math.floor(remaining / Math.max(otherCount, 1)),\n )\n\n return headers.map((header, index) => {\n const labelBudget =\n (index === args.currentQuestionIndex ? currentBudget : otherBudget) - 4\n if (stringWidth(header) <= labelBudget) return header\n\n const truncated = truncateWithEllipsis(header, labelBudget)\n if (index === args.currentQuestionIndex) return truncated\n if (truncated.length > 1) return truncated\n return truncateWithEllipsis(header[0] ?? header, labelBudget)\n })\n}\n\nexport function formatMultiSelectAnswer(\n selectedValues: string[],\n otherText: string,\n): string {\n const selections = selectedValues.filter(value => value !== '__other__')\n const trimmedOther = otherText.trim()\n if (selectedValues.includes('__other__') && trimmedOther) {\n selections.push(trimmedOther)\n }\n return selections.join(', ')\n}\n\nexport function getTrimmedOtherAnswer(otherText: string): string | null {\n const trimmed = otherText.trim()\n return trimmed.length > 0 ? trimmed : null\n}\n", "import { useInput, type Key } from 'ink'\nimport * as React from 'react'\nimport { memo, useCallback, useEffect, useMemo, useState } from 'react'\nimport { countTokens } from '#core/utils/tokens'\nimport { getTheme } from '#core/utils/theme'\nimport { getModelManager } from '#core/utils/model'\nimport { logStartupProfile } from '#core/utils/startupProfile'\nimport { getCwd } from '#core/utils/state'\nimport { usePermissionContext } from '#ui-ink/context/PermissionContext'\nimport { useArrowKeyHistory } from '#ui-ink/hooks/useArrowKeyHistory'\nimport { useDoublePress } from '#ui-ink/hooks/useDoublePress'\nimport { useStatusLine } from '#ui-ink/hooks/useStatusLine'\nimport { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\nimport { useUnifiedCompletion } from '#ui-ink/hooks/useUnifiedCompletion'\nimport { getPermissionModeCycleShortcut } from '#ui-ink/utils/permissionModeCycleShortcut'\nimport { getPromptInputSpecialKeyAction } from '#ui-ink/utils/promptInputSpecialKey'\nimport { setTerminalTitle } from '#cli-utils/terminal'\nimport { submitPrompt } from './submit'\nimport { usePromptPastes } from './pastes'\nimport type { PromptInputProps, PromptMode } from './types'\nimport { PromptInputView } from './PromptInputView'\nimport { useExternalEdit } from './useExternalEdit'\nimport { useQuickModelSwitch } from './useQuickModelSwitch'\n\nfunction exit(): never {\n setTerminalTitle('')\n process.exit(0)\n}\n\nfunction toPromptMode(value: string): { mode: PromptMode; text: string } {\n if (value.startsWith('!')) return { mode: 'bash', text: value.slice(1) }\n if (value.startsWith('#')) return { mode: 'koding', text: value.slice(1) }\n return { mode: 'prompt', text: value }\n}\n\nexport function PromptInput({\n commands,\n forkNumber,\n messageLogName,\n disableSlashCommands,\n isDisabled,\n isLoading,\n onQuery,\n verbose,\n messages,\n setToolJSX,\n tools,\n input,\n onInputChange,\n mode,\n onModeChange,\n submitCount,\n onSubmitCountChange,\n setIsLoading,\n abortController,\n setAbortController,\n onShowMessageSelector,\n setForkConvoWithMessagesOnTheNextRender,\n readFileTimestamps,\n onModelChange,\n}: PromptInputProps): React.ReactNode {\n useEffect(() => {\n if (!isDisabled && !isLoading) {\n logStartupProfile('prompt_ready')\n }\n }, [isDisabled, isLoading])\n\n const [exitMessage, setExitMessage] = useState<{\n show: boolean\n key?: string\n }>({ show: false })\n const [rewindMessagePending, setRewindMessagePending] = useState(false)\n const [message, setMessage] = useState<{ show: boolean; text?: string }>({\n show: false,\n })\n const [modelSwitchMessage, setModelSwitchMessage] = useState<{\n show: boolean\n text?: string\n }>({ show: false })\n const placeholder = ''\n const [cursorOffset, setCursorOffset] = useState<number>(input.length)\n const [currentPwd, setCurrentPwd] = useState<string>(() => getCwd())\n\n const { cycleMode, currentMode, toolPermissionContext } =\n usePermissionContext()\n const modeCycleShortcut = useMemo(() => getPermissionModeCycleShortcut(), [])\n const showQuickModelSwitchShortcut = modeCycleShortcut.displayText !== 'alt+m'\n const handleRewindConversation = useDoublePress(\n setRewindMessagePending,\n onShowMessageSelector,\n )\n\n const { columns, rows } = useTerminalSize()\n\n const onChange = useCallback(\n (value: string) => {\n const next = toPromptMode(value)\n if (next.mode !== mode) onModeChange(next.mode)\n onInputChange(next.text)\n setCursorOffset(next.text.length)\n },\n [mode, onInputChange, onModeChange],\n )\n\n const {\n suggestions,\n selectedIndex,\n isActive: completionActive,\n emptyDirMessage,\n } = useUnifiedCompletion({\n input,\n cursorOffset,\n onInputChange,\n setCursorOffset,\n commands,\n disableSlashCommands,\n })\n\n const statusLine = useStatusLine()\n const theme = getTheme()\n const tokenUsage = useMemo(() => countTokens(messages), [messages])\n\n const modelInfo = useMemo(() => {\n const current = getModelManager().getModel('main')\n return current\n ? {\n name: current.modelName,\n provider: current.provider,\n contextLength: current.contextLength,\n currentTokens: tokenUsage,\n }\n : null\n }, [tokenUsage, submitCount])\n\n const { resetHistory, onHistoryUp, onHistoryDown } = useArrowKeyHistory(\n (value: string, restoredMode: 'bash' | 'prompt') => {\n const next = toPromptMode(restoredMode === 'bash' ? `!${value}` : value)\n onModeChange(next.mode)\n onInputChange(next.text)\n setCursorOffset(next.text.length)\n },\n input,\n )\n\n const handleHistoryUp = () => {\n if (!completionActive) onHistoryUp()\n }\n const handleHistoryDown = () => {\n if (!completionActive) onHistoryDown()\n }\n\n const handleQuickModelSwitch = useQuickModelSwitch({\n messages,\n onSubmitCountChange,\n setModelSwitchMessage,\n onModelChange,\n })\n\n const { isEditingExternally, handleExternalEdit } = useExternalEdit({\n input,\n isLoading,\n isDisabled,\n onInputChange,\n setCursorOffset,\n setMessage,\n })\n\n const handleSpecialKey = useCallback(\n (inputChar: string, key: Key): boolean => {\n if (isEditingExternally) return true\n\n const action = getPromptInputSpecialKeyAction({\n inputChar,\n key,\n modeCycleShortcut,\n })\n\n if (action === 'modeCycle') {\n cycleMode()\n return true\n }\n\n if (action === 'modelSwitch') {\n if (!isLoading) handleQuickModelSwitch()\n return true\n }\n\n if (action === 'externalEditor') {\n void handleExternalEdit()\n return true\n }\n\n return false\n },\n [\n cycleMode,\n handleExternalEdit,\n handleQuickModelSwitch,\n isEditingExternally,\n isLoading,\n modeCycleShortcut,\n ],\n )\n\n const { pastedTexts, pastedImages, onImagePaste, onTextPaste, clearPastes } =\n usePromptPastes({\n input,\n cursorOffset,\n onInputChange,\n setCursorOffset,\n onModeChange,\n terminalRows: rows,\n })\n\n async function onSubmit(value: string, isSubmittingSlashCommand = false) {\n await submitPrompt({\n input: value,\n mode,\n completionActive,\n suggestionCount: suggestions.length,\n isSubmittingSlashCommand,\n isDisabled,\n isLoading,\n isEditingExternally,\n abortController,\n setIsLoading,\n setAbortController,\n onInputChange,\n onModeChange,\n setCursorOffset,\n onSubmitCountChange,\n onQuery,\n setToolJSX,\n commands,\n forkNumber,\n messageLogName,\n tools,\n verbose,\n disableSlashCommands,\n permissionMode: currentMode,\n toolPermissionContext,\n setForkConvoWithMessagesOnTheNextRender,\n readFileTimestamps,\n pastedTexts,\n pastedImages,\n clearPastes,\n resetHistory,\n setCurrentPwd,\n exit,\n })\n }\n\n useInput((inputChar, key) => {\n if (mode === 'bash' && (key.backspace || key.delete)) {\n if (input === '') onModeChange('prompt')\n return\n }\n\n if (mode === 'koding' && (key.backspace || key.delete)) {\n if (input === '') onModeChange('prompt')\n return\n }\n\n if (inputChar === '' && (key.escape || key.backspace || key.delete)) {\n onModeChange('prompt')\n }\n\n if (key.escape && messages.length > 0 && !input && !isLoading) {\n handleRewindConversation()\n return true\n }\n })\n\n const textInputColumns = columns - 6\n\n return (\n <PromptInputView\n mode={mode}\n theme={theme}\n currentPwd={currentPwd}\n modelInfo={modelInfo}\n input={input}\n cursorOffset={cursorOffset}\n setCursorOffset={setCursorOffset}\n onSubmit={onSubmit}\n onChange={onChange}\n isEditingExternally={isEditingExternally}\n isDisabled={isDisabled}\n isLoading={isLoading}\n completionActive={completionActive}\n suggestions={suggestions}\n selectedIndex={selectedIndex}\n emptyDirMessage={emptyDirMessage}\n handleHistoryUp={handleHistoryUp}\n handleHistoryDown={handleHistoryDown}\n resetHistory={resetHistory}\n placeholder={placeholder}\n submitCount={submitCount}\n onExit={exit}\n onExitMessage={(show, key) => setExitMessage({ show, key })}\n onMessage={(show, text) => setMessage({ show, text })}\n onImagePaste={onImagePaste}\n onTextPaste={onTextPaste}\n onSpecialKey={handleSpecialKey}\n exitMessage={exitMessage}\n message={message}\n rewindMessagePending={rewindMessagePending}\n modelSwitchMessage={modelSwitchMessage}\n statusLine={statusLine}\n currentMode={currentMode}\n modeCycleShortcutText={modeCycleShortcut.displayText}\n showQuickModelSwitchShortcut={showQuickModelSwitchShortcut}\n tokenUsage={tokenUsage}\n textInputColumns={textInputColumns}\n />\n )\n}\n\nexport default memo(PromptInput)\n", "type StartupEvent = 'first_render' | 'prompt_ready'\n\nfunction isTruthyEnv(value: string | undefined): boolean {\n if (!value) return false\n return ['1', 'true', 'yes', 'on'].includes(value.trim().toLowerCase())\n}\n\nfunction isEnabled(): boolean {\n return isTruthyEnv(process.env.KODE_STARTUP_PROFILE)\n}\n\nconst seen = new Set<StartupEvent>()\n\nexport function logStartupProfile(event: StartupEvent): void {\n if (!isEnabled()) return\n if (seen.has(event)) return\n seen.add(event)\n\n const ms = Math.round(process.uptime() * 1000)\n // Use stderr so we don't corrupt Ink's stdout rendering.\n process.stderr.write(`[startup] ${event}=${ms}ms\\n`)\n}\n", "import { useState } from 'react'\nimport { getHistory } from '#core/history'\n\nexport function useArrowKeyHistory(\n onSetInput: (value: string, mode: 'bash' | 'prompt') => void,\n currentInput: string,\n) {\n const [historyIndex, setHistoryIndex] = useState(0)\n const [lastTypedInput, setLastTypedInput] = useState('')\n\n const updateInput = (input: string | undefined) => {\n if (input !== undefined) {\n const mode = input.startsWith('!') ? 'bash' : 'prompt'\n const value = mode === 'bash' ? input.slice(1) : input\n onSetInput(value, mode)\n }\n }\n\n function onHistoryUp() {\n const latestHistory = getHistory()\n if (historyIndex < latestHistory.length) {\n if (historyIndex === 0 && currentInput.trim() !== '') {\n setLastTypedInput(currentInput)\n }\n const newIndex = historyIndex + 1\n setHistoryIndex(newIndex)\n updateInput(latestHistory[historyIndex])\n }\n }\n\n function onHistoryDown() {\n const latestHistory = getHistory()\n if (historyIndex > 1) {\n const newIndex = historyIndex - 1\n setHistoryIndex(newIndex)\n updateInput(latestHistory[newIndex - 1])\n } else if (historyIndex === 1) {\n setHistoryIndex(0)\n updateInput(lastTypedInput)\n }\n }\n\n function resetHistory() {\n setLastTypedInput('')\n setHistoryIndex(0)\n }\n\n return {\n historyIndex,\n setHistoryIndex,\n onHistoryUp,\n onHistoryDown,\n resetHistory,\n }\n}\n", "import { useEffect, useRef, useState } from 'react'\nimport { BunShell } from '#runtime/shell'\nimport { getStatusLineCommand } from '#core/services/statusline'\n\nfunction normalizeStatusLineText(value: string): string {\n const singleLine = value.replace(/\\r?\\n/g, ' ').trim()\n return singleLine.length > 300 ? `${singleLine.slice(0, 300)}\u2026` : singleLine\n}\n\nexport function useStatusLine(): string | null {\n const [text, setText] = useState<string | null>(null)\n const lastCommandRef = useRef<string | null>(null)\n const abortRef = useRef<AbortController | null>(null)\n\n useEffect(() => {\n const enabled =\n process.env.KODE_STATUSLINE_ENABLED === '1' ||\n process.env.NODE_ENV !== 'test'\n if (!enabled) return\n\n const shell = BunShell.getInstance()\n let alive = true\n\n const tick = async () => {\n const command = getStatusLineCommand()\n if (!command) {\n lastCommandRef.current = null\n abortRef.current?.abort()\n abortRef.current = null\n if (alive) setText(null)\n return\n }\n\n lastCommandRef.current = command\n abortRef.current?.abort()\n const ac = new AbortController()\n abortRef.current = ac\n\n const result = await shell.exec(command, ac.signal, 1000)\n if (!alive) return\n if (result.interrupted) return\n\n const raw =\n result.code === 0 ? result.stdout : result.stdout || result.stderr\n const next = raw ? normalizeStatusLineText(raw) : ''\n setText(next || null)\n }\n\n tick().catch(() => {})\n const id = setInterval(() => {\n tick().catch(() => {})\n }, 2000)\n\n return () => {\n alive = false\n clearInterval(id)\n abortRef.current?.abort()\n }\n }, [])\n\n return text\n}\n", "import {\n getSettingsFileCandidates,\n loadSettingsWithLegacyFallback,\n saveSettingsToPrimaryAndSyncLegacy,\n} from '#config'\n\ntype ClaudeUserSettings = {\n statusLine?: unknown\n [key: string]: unknown\n}\n\nfunction normalizeString(value: unknown): string | null {\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n return trimmed ? trimmed : null\n}\n\nexport function getClaudeUserSettingsPath(): string {\n const candidates = getSettingsFileCandidates({ destination: 'userSettings' })\n return candidates?.primary ?? ''\n}\n\nexport function getStatusLineCommand(): string | null {\n const loaded = loadSettingsWithLegacyFallback({\n destination: 'userSettings',\n migrateToPrimary: true,\n })\n const settings = (loaded.settings as ClaudeUserSettings | null) ?? {}\n\n const raw = settings.statusLine\n if (typeof raw === 'string') return normalizeString(raw)\n if (raw && typeof raw === 'object') {\n const cmd = (raw as { command?: unknown }).command\n return normalizeString(cmd)\n }\n return null\n}\n\nexport function setStatusLineCommand(command: string | null): void {\n const loaded = loadSettingsWithLegacyFallback({\n destination: 'userSettings',\n migrateToPrimary: true,\n })\n const existing = (loaded.settings as ClaudeUserSettings | null) ?? {}\n const next: ClaudeUserSettings = { ...existing }\n if (command === null) {\n delete next.statusLine\n } else {\n next.statusLine = command\n }\n saveSettingsToPrimaryAndSyncLegacy({\n destination: 'userSettings',\n settings: next,\n syncLegacyIfExists: true,\n })\n}\n", "import { useCallback, useState } from 'react'\nimport { getCwd } from '#core/utils/state'\nimport { getCompletionContext } from '#cli-utils/completion/context'\nimport { generateSuggestionsForContext } from '#cli-utils/completion/generateSuggestions'\nimport type {\n CompletionContext,\n UnifiedSuggestion,\n} from '#cli-utils/completion/types'\n\nimport type { CompletionState, UnifiedCompletionProps } from './types'\nimport { INITIAL_STATE } from './types'\nimport { useAgentSuggestions } from './useAgentSuggestions'\nimport { useCompletionActions } from './actions'\nimport { useModelSuggestions } from './useModelSuggestions'\nimport { useSystemCommands } from './useSystemCommands'\nimport { useUnifiedCompletionAutoTrigger } from './useAutoTrigger'\nimport { useUnifiedCompletionTabKey } from './useTabKey'\nimport { useUnifiedCompletionNavigationKeys } from './useNavigationKeys'\n\nexport function __getCompletionContextForTests(args: {\n input: string\n cursorOffset: number\n disableSlashCommands?: boolean\n}): CompletionContext | null {\n return getCompletionContext(args)\n}\n\nexport function useUnifiedCompletion({\n input,\n cursorOffset,\n onInputChange,\n setCursorOffset,\n commands,\n disableSlashCommands = false,\n}: UnifiedCompletionProps) {\n const [state, setState] = useState<CompletionState>(INITIAL_STATE)\n\n const updateState = useCallback((updates: Partial<CompletionState>) => {\n setState(prev => ({ ...prev, ...updates }))\n }, [])\n\n const resetCompletion = useCallback(() => {\n setState(prev => ({\n ...prev,\n suggestions: [],\n selectedIndex: 0,\n isActive: false,\n context: null,\n preview: null,\n emptyDirMessage: '',\n }))\n }, [])\n\n const activateCompletion = useCallback(\n (suggestions: UnifiedSuggestion[], context: CompletionContext) => {\n setState(prev => ({\n ...prev,\n suggestions,\n selectedIndex: 0,\n isActive: true,\n context,\n preview: null,\n }))\n },\n [],\n )\n\n const getWordAtCursor = useCallback((): CompletionContext | null => {\n return __getCompletionContextForTests({\n input,\n cursorOffset,\n disableSlashCommands,\n })\n }, [input, cursorOffset, disableSlashCommands])\n\n const { systemCommands, isLoadingCommands } = useSystemCommands()\n const agentSuggestions = useAgentSuggestions()\n const modelSuggestions = useModelSuggestions()\n\n const generateSuggestions = useCallback(\n (context: CompletionContext): UnifiedSuggestion[] =>\n generateSuggestionsForContext({\n context,\n commands,\n agentSuggestions,\n modelSuggestions,\n systemCommands,\n isLoadingCommands,\n cwd: getCwd(),\n }),\n [\n commands,\n agentSuggestions,\n modelSuggestions,\n systemCommands,\n isLoadingCommands,\n ],\n )\n\n const { completeWith } = useCompletionActions({\n input,\n onInputChange,\n setCursorOffset,\n })\n\n useUnifiedCompletionTabKey({\n input,\n state,\n getWordAtCursor,\n generateSuggestions,\n completeWith,\n activateCompletion,\n updateState,\n onInputChange,\n setCursorOffset,\n })\n\n useUnifiedCompletionNavigationKeys({\n input,\n state,\n resetCompletion,\n updateState,\n generateSuggestions,\n completeWith,\n activateCompletion,\n onInputChange,\n setCursorOffset,\n })\n\n useUnifiedCompletionAutoTrigger({\n input,\n cursorOffset,\n state,\n getWordAtCursor,\n generateSuggestions,\n activateCompletion,\n resetCompletion,\n })\n\n return {\n suggestions: state.suggestions,\n selectedIndex: state.selectedIndex,\n isActive: state.isActive,\n emptyDirMessage: state.emptyDirMessage,\n }\n}\n", "import type { CompletionContext } from './types'\n\nexport function getCompletionContext(args: {\n input: string\n cursorOffset: number\n disableSlashCommands?: boolean\n}): CompletionContext | null {\n const { input, cursorOffset } = args\n const disableSlashCommands = args.disableSlashCommands === true\n if (!input) return null\n\n let start = cursorOffset\n\n while (start > 0) {\n const char = input[start - 1]\n if (/\\\\s/.test(char)) break\n\n if (char === '@' && start < cursorOffset) {\n start--\n break\n }\n\n if (char === '/') {\n const collectedSoFar = input.slice(start, cursorOffset)\n\n if (collectedSoFar.includes('/') || collectedSoFar.includes('.')) {\n start--\n continue\n }\n\n if (start > 1) {\n const prevChar = input[start - 2]\n if (prevChar === '.' || prevChar === '~') {\n start--\n continue\n }\n }\n\n if (start === 1 || (start > 1 && /\\\\s/.test(input[start - 2]))) {\n start--\n break\n }\n\n start--\n continue\n }\n\n if (char === '.' && start > 0) {\n const nextChar = start < input.length ? input[start] : ''\n if (nextChar === '/' || nextChar === '.') {\n start--\n continue\n }\n }\n\n start--\n }\n\n const word = input.slice(start, cursorOffset)\n if (!word) return null\n\n if (word.startsWith('/')) {\n const beforeWord = input.slice(0, start).trim()\n const isCommand =\n beforeWord === '' && !word.includes('/', 1) && !disableSlashCommands\n return {\n type: isCommand ? 'command' : 'file',\n prefix: isCommand ? word.slice(1) : word,\n startPos: start,\n endPos: cursorOffset,\n }\n }\n\n if (word.startsWith('@')) {\n const content = word.slice(1)\n if (word.includes('@', 1)) return null\n return {\n type: 'agent',\n prefix: content,\n startPos: start,\n endPos: cursorOffset,\n }\n }\n\n return { type: 'file', prefix: word, startPos: start, endPos: cursorOffset }\n}\n", "import { existsSync, readdirSync, statSync } from 'fs'\nimport { basename, dirname, join, resolve } from 'path'\nimport type { UnifiedSuggestion } from './types'\n\nexport function generateFileSuggestions(args: {\n prefix: string\n cwd: string\n}): UnifiedSuggestion[] {\n const { prefix, cwd } = args\n\n try {\n const userPath = prefix || '.'\n const isAbsolutePath = userPath.startsWith('/')\n const isHomePath = userPath.startsWith('~')\n\n let searchPath: string\n if (isHomePath) {\n searchPath = userPath.replace('~', process.env.HOME || '')\n } else if (isAbsolutePath) {\n searchPath = userPath\n } else {\n searchPath = resolve(cwd, userPath)\n }\n\n const endsWithSlash = userPath.endsWith('/')\n const searchStat = existsSync(searchPath) ? statSync(searchPath) : null\n\n let searchDir: string\n let nameFilter: string\n\n if (endsWithSlash || searchStat?.isDirectory()) {\n searchDir = searchPath\n nameFilter = ''\n } else {\n searchDir = dirname(searchPath)\n nameFilter = basename(searchPath)\n }\n\n if (!existsSync(searchDir)) return []\n\n const showHidden = nameFilter.startsWith('.') || userPath.includes('/.')\n const entries = readdirSync(searchDir)\n .filter(entry => {\n if (!showHidden && entry.startsWith('.')) return false\n if (\n nameFilter &&\n !entry.toLowerCase().startsWith(nameFilter.toLowerCase())\n )\n return false\n return true\n })\n .sort((a, b) => {\n const aPath = join(searchDir, a)\n const bPath = join(searchDir, b)\n const aIsDir = statSync(aPath).isDirectory()\n const bIsDir = statSync(bPath).isDirectory()\n\n if (aIsDir && !bIsDir) return -1\n if (!aIsDir && bIsDir) return 1\n\n return a.toLowerCase().localeCompare(b.toLowerCase())\n })\n .slice(0, 25)\n\n return entries.map(entry => {\n const entryPath = join(searchDir, entry)\n const isDir = statSync(entryPath).isDirectory()\n const icon = isDir ? '\uD83D\uDCC1' : '\uD83D\uDCC4'\n\n let value: string\n\n if (userPath.includes('/')) {\n if (endsWithSlash) {\n value = userPath + entry + (isDir ? '/' : '')\n } else if (searchStat?.isDirectory()) {\n value = userPath + '/' + entry + (isDir ? '/' : '')\n } else {\n const userDir = userPath.includes('/')\n ? userPath.substring(0, userPath.lastIndexOf('/'))\n : ''\n value = userDir\n ? userDir + '/' + entry + (isDir ? '/' : '')\n : entry + (isDir ? '/' : '')\n }\n } else {\n if (searchStat?.isDirectory()) {\n value = userPath + '/' + entry + (isDir ? '/' : '')\n } else {\n value = entry + (isDir ? '/' : '')\n }\n }\n\n return {\n value,\n displayValue: `${icon} ${entry}${isDir ? '/' : ''}`,\n type: 'file' as const,\n score: isDir ? 80 : 70,\n }\n })\n } catch {\n return []\n }\n}\n", "/**\n * Advanced Fuzzy Matching Algorithm\n *\n * Key features:\n * - Hyphen-aware matching (dao \u2192 dao-qi-harmony)\n * - Numeric suffix matching (py3 \u2192 python3)\n * - Abbreviation matching (dq \u2192 dao-qi)\n * - Subsequence matching\n * - Word boundary bonus\n */\n\nexport interface MatchResult {\n score: number\n matched: boolean\n algorithm: string\n}\n\nexport class AdvancedFuzzyMatcher {\n /**\n * Main matching function - combines multiple algorithms\n */\n match(candidate: string, query: string): MatchResult {\n // Normalize inputs\n const text = candidate.toLowerCase()\n const pattern = query.toLowerCase()\n\n // Quick exact match - give HUGE score for exact matches\n if (text === pattern) {\n return { score: 10000, matched: true, algorithm: 'exact' }\n }\n\n // Try all algorithms and combine scores\n const algorithms = [\n this.exactPrefixMatch(text, pattern),\n this.hyphenAwareMatch(text, pattern),\n this.wordBoundaryMatch(text, pattern),\n this.abbreviationMatch(text, pattern),\n this.numericSuffixMatch(text, pattern),\n this.subsequenceMatch(text, pattern),\n this.fuzzySegmentMatch(text, pattern),\n ]\n\n // Get best score\n let bestScore = 0\n let bestAlgorithm = 'none'\n\n for (const result of algorithms) {\n if (result.score > bestScore) {\n bestScore = result.score\n bestAlgorithm = result.algorithm\n }\n }\n\n return {\n score: bestScore,\n matched: bestScore > 10,\n algorithm: bestAlgorithm,\n }\n }\n\n /**\n * Exact prefix matching\n */\n private exactPrefixMatch(\n text: string,\n pattern: string,\n ): { score: number; algorithm: string } {\n if (text.startsWith(pattern)) {\n const coverage = pattern.length / text.length\n // Higher base score for prefix matches to prioritize them\n return { score: 1000 + coverage * 500, algorithm: 'prefix' }\n }\n return { score: 0, algorithm: 'prefix' }\n }\n\n /**\n * Hyphen-aware matching (dao \u2192 dao-qi-harmony-designer)\n * Treats hyphens as optional word boundaries\n */\n private hyphenAwareMatch(\n text: string,\n pattern: string,\n ): { score: number; algorithm: string } {\n // Split by hyphens and try to match\n const words = text.split('-')\n\n // Check if pattern matches the beginning of hyphenated words\n if (words[0].startsWith(pattern)) {\n const coverage = pattern.length / words[0].length\n return { score: 300 + coverage * 100, algorithm: 'hyphen-prefix' }\n }\n\n // Check if pattern matches concatenated words (ignoring hyphens)\n const concatenated = words.join('')\n if (concatenated.startsWith(pattern)) {\n const coverage = pattern.length / concatenated.length\n return { score: 250 + coverage * 100, algorithm: 'hyphen-concat' }\n }\n\n // Check if pattern matches any word start\n for (let i = 0; i < words.length; i++) {\n if (words[i].startsWith(pattern)) {\n return { score: 200 - i * 10, algorithm: 'hyphen-word' }\n }\n }\n\n return { score: 0, algorithm: 'hyphen' }\n }\n\n /**\n * Word boundary matching (dq \u2192 dao-qi)\n * Matches characters at word boundaries\n */\n private wordBoundaryMatch(\n text: string,\n pattern: string,\n ): { score: number; algorithm: string } {\n const words = text.split(/[-_\\s]+/)\n let patternIdx = 0\n let score = 0\n let matched = false\n\n for (const word of words) {\n if (patternIdx >= pattern.length) break\n\n if (word[0] === pattern[patternIdx]) {\n score += 50 // Bonus for word boundary match\n patternIdx++\n matched = true\n\n // Try to match more characters in this word\n for (let i = 1; i < word.length && patternIdx < pattern.length; i++) {\n if (word[i] === pattern[patternIdx]) {\n score += 20\n patternIdx++\n }\n }\n }\n }\n\n if (matched && patternIdx === pattern.length) {\n return { score, algorithm: 'word-boundary' }\n }\n\n return { score: 0, algorithm: 'word-boundary' }\n }\n\n /**\n * Abbreviation matching (nde \u2192 node, daoqi \u2192 dao-qi)\n */\n private abbreviationMatch(\n text: string,\n pattern: string,\n ): { score: number; algorithm: string } {\n let textIdx = 0\n let patternIdx = 0\n let score = 0\n let lastMatchIdx = -1\n\n while (patternIdx < pattern.length && textIdx < text.length) {\n if (text[textIdx] === pattern[patternIdx]) {\n // Calculate position score\n const gap = lastMatchIdx === -1 ? 0 : textIdx - lastMatchIdx - 1\n\n if (textIdx === 0) {\n score += 50 // First character match\n } else if (lastMatchIdx >= 0 && gap === 0) {\n score += 30 // Consecutive match\n } else if (text[textIdx - 1] === '-' || text[textIdx - 1] === '_') {\n score += 40 // Word boundary match\n } else {\n score += Math.max(5, 20 - gap * 2) // Distance penalty\n }\n\n lastMatchIdx = textIdx\n patternIdx++\n }\n textIdx++\n }\n\n if (patternIdx === pattern.length) {\n // Bonus for compact matches\n const spread = lastMatchIdx / pattern.length\n if (spread <= 3) score += 50\n else if (spread <= 5) score += 30\n\n return { score, algorithm: 'abbreviation' }\n }\n\n return { score: 0, algorithm: 'abbreviation' }\n }\n\n /**\n * Numeric suffix matching (py3 \u2192 python3, np18 \u2192 node18)\n */\n private numericSuffixMatch(\n text: string,\n pattern: string,\n ): { score: number; algorithm: string } {\n // Check if pattern has numeric suffix\n const patternMatch = pattern.match(/^(.+?)(\\d+)$/)\n if (!patternMatch) return { score: 0, algorithm: 'numeric' }\n\n const [, prefix, suffix] = patternMatch\n\n // Check if text ends with same number\n if (!text.endsWith(suffix)) return { score: 0, algorithm: 'numeric' }\n\n // Check if prefix matches start of text\n const textWithoutSuffix = text.slice(0, -suffix.length)\n if (textWithoutSuffix.startsWith(prefix)) {\n const coverage = prefix.length / textWithoutSuffix.length\n return { score: 200 + coverage * 100, algorithm: 'numeric-suffix' }\n }\n\n // Check abbreviation match for prefix\n const abbrevResult = this.abbreviationMatch(textWithoutSuffix, prefix)\n if (abbrevResult.score > 0) {\n return { score: abbrevResult.score + 50, algorithm: 'numeric-abbrev' }\n }\n\n return { score: 0, algorithm: 'numeric' }\n }\n\n /**\n * Subsequence matching - characters appear in order\n */\n private subsequenceMatch(\n text: string,\n pattern: string,\n ): { score: number; algorithm: string } {\n let textIdx = 0\n let patternIdx = 0\n let score = 0\n\n while (patternIdx < pattern.length && textIdx < text.length) {\n if (text[textIdx] === pattern[patternIdx]) {\n score += 10\n patternIdx++\n }\n textIdx++\n }\n\n if (patternIdx === pattern.length) {\n // Penalty for spread\n const spread = textIdx / pattern.length\n score = Math.max(10, score - spread * 5)\n return { score, algorithm: 'subsequence' }\n }\n\n return { score: 0, algorithm: 'subsequence' }\n }\n\n /**\n * Fuzzy segment matching (dao \u2192 dao-qi-harmony)\n * Matches segments flexibly\n */\n private fuzzySegmentMatch(\n text: string,\n pattern: string,\n ): { score: number; algorithm: string } {\n // Remove hyphens and underscores for matching\n const cleanText = text.replace(/[-_]/g, '')\n const cleanPattern = pattern.replace(/[-_]/g, '')\n\n // Check if clean pattern is a prefix of clean text\n if (cleanText.startsWith(cleanPattern)) {\n const coverage = cleanPattern.length / cleanText.length\n return { score: 150 + coverage * 100, algorithm: 'fuzzy-segment' }\n }\n\n // Check if pattern appears anywhere in clean text\n const index = cleanText.indexOf(cleanPattern)\n if (index !== -1) {\n const positionPenalty = index * 5\n return {\n score: Math.max(50, 100 - positionPenalty),\n algorithm: 'fuzzy-contains',\n }\n }\n\n return { score: 0, algorithm: 'fuzzy-segment' }\n }\n}\n\n// Export singleton instance and helper functions\nexport const advancedMatcher = new AdvancedFuzzyMatcher()\n\nexport function matchAdvanced(candidate: string, query: string): MatchResult {\n return advancedMatcher.match(candidate, query)\n}\n\nexport function matchManyAdvanced(\n candidates: string[],\n query: string,\n minScore: number = 10,\n): Array<{ candidate: string; score: number; algorithm: string }> {\n return candidates\n .map(candidate => {\n const result = advancedMatcher.match(candidate, query)\n return {\n candidate,\n score: result.score,\n algorithm: result.algorithm,\n }\n })\n .filter(item => item.score >= minScore)\n .sort((a, b) => b.score - a.score)\n}\n", "/**\n * Fuzzy matching + scoring for command/terminal completion.\n *\n * Designed for scenarios where users type abbreviations like \"nde\" expecting \"node\".\n */\n\nexport interface MatchResult {\n score: number\n algorithm: string // Which algorithm contributed most to the score\n confidence: number // 0-1 confidence level\n}\n\nexport interface FuzzyMatcherConfig {\n // Algorithm weights (must sum to 1.0)\n weights: {\n prefix: number // Direct prefix matching (\"nod\" \u2192 \"node\")\n substring: number // Substring matching (\"ode\" \u2192 \"node\")\n abbreviation: number // Key chars matching (\"nde\" \u2192 \"node\")\n editDistance: number // Typo tolerance (\"noda\" \u2192 \"node\")\n popularity: number // Common command boost\n }\n\n // Scoring parameters\n minScore: number // Minimum score threshold\n maxEditDistance: number // Maximum edits allowed\n popularCommands: string[] // Commands to boost\n}\n\nconst DEFAULT_CONFIG: FuzzyMatcherConfig = {\n weights: {\n prefix: 0.35, // Strong weight for prefix matching\n substring: 0.2, // Good for partial matches\n abbreviation: 0.3, // Key for \"nde\"\u2192\"node\" cases\n editDistance: 0.1, // Typo tolerance\n popularity: 0.05, // Slight bias for common commands\n },\n minScore: 10, // Lower threshold for better matching\n maxEditDistance: 2,\n popularCommands: [\n 'node',\n 'npm',\n 'git',\n 'ls',\n 'cd',\n 'cat',\n 'grep',\n 'find',\n 'cp',\n 'mv',\n 'python',\n 'java',\n 'docker',\n 'curl',\n 'wget',\n 'vim',\n 'nano',\n ],\n}\n\nexport class FuzzyMatcher {\n private config: FuzzyMatcherConfig\n\n constructor(config: Partial<FuzzyMatcherConfig> = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config }\n\n // Normalize weights to sum to 1.0\n const weightSum = Object.values(this.config.weights).reduce(\n (a, b) => a + b,\n 0,\n )\n if (Math.abs(weightSum - 1.0) > 0.01) {\n Object.keys(this.config.weights).forEach(key => {\n this.config.weights[key as keyof typeof this.config.weights] /=\n weightSum\n })\n }\n }\n\n /**\n * Calculate fuzzy match score for a candidate against a query\n */\n match(candidate: string, query: string): MatchResult {\n const text = candidate.toLowerCase()\n const pattern = query.toLowerCase()\n\n // Quick perfect match exits\n if (text === pattern) {\n return { score: 1000, algorithm: 'exact', confidence: 1.0 }\n }\n if (text.startsWith(pattern)) {\n return {\n score: 900 + (10 - pattern.length),\n algorithm: 'prefix-exact',\n confidence: 0.95,\n }\n }\n\n // Run all algorithms\n const scores = {\n prefix: this.prefixScore(text, pattern),\n substring: this.substringScore(text, pattern),\n abbreviation: this.abbreviationScore(text, pattern),\n editDistance: this.editDistanceScore(text, pattern),\n popularity: this.popularityScore(text),\n }\n\n // Weighted combination\n const rawScore = Object.entries(scores).reduce(\n (total, [algorithm, score]) => {\n const weight =\n this.config.weights[algorithm as keyof typeof this.config.weights]\n return total + score * weight\n },\n 0,\n )\n\n // Length penalty (prefer shorter commands)\n const lengthPenalty = Math.max(0, text.length - 6) * 1.5\n const finalScore = Math.max(0, rawScore - lengthPenalty)\n\n // Determine primary algorithm and confidence\n const maxAlgorithm = Object.entries(scores).reduce(\n (max, [alg, score]) =>\n score > max.score ? { algorithm: alg, score } : max,\n { algorithm: 'none', score: 0 },\n )\n\n const confidence = Math.min(1.0, finalScore / 100)\n\n return {\n score: finalScore,\n algorithm: maxAlgorithm.algorithm,\n confidence,\n }\n }\n\n /**\n * Algorithm 1: Prefix Matching (like pinyin prefix)\n * Handles cases like \"nod\" \u2192 \"node\"\n */\n private prefixScore(text: string, pattern: string): number {\n if (!text.startsWith(pattern)) return 0\n\n // Score based on prefix length vs total length\n const coverage = pattern.length / text.length\n return 100 * coverage\n }\n\n /**\n * Algorithm 2: Substring Matching (like pinyin contains)\n * Handles cases like \"ode\" \u2192 \"node\", \"py3\" \u2192 \"python3\"\n */\n private substringScore(text: string, pattern: string): number {\n // Direct substring match\n const index = text.indexOf(pattern)\n if (index !== -1) {\n // Earlier position and better coverage = higher score\n const positionFactor = Math.max(0, 10 - index) / 10\n const coverageFactor = pattern.length / text.length\n return 80 * positionFactor * coverageFactor\n }\n\n // Special handling for numeric suffixes (py3 \u2192 python3)\n // Check if pattern ends with a number and try prefix match + number\n const numMatch = pattern.match(/^(.+?)(\\d+)$/)\n if (numMatch) {\n const [, prefix, num] = numMatch\n // Check if text starts with prefix and ends with the same number\n if (text.startsWith(prefix) && text.endsWith(num)) {\n // Good match for patterns like \"py3\" \u2192 \"python3\"\n const coverageFactor = pattern.length / text.length\n return 70 * coverageFactor + 20 // Bonus for numeric suffix match\n }\n }\n\n return 0\n }\n\n /**\n * Algorithm 3: Abbreviation Matching (key innovation)\n * Handles cases like \"nde\" \u2192 \"node\", \"pyt3\" \u2192 \"python3\", \"gp5\" \u2192 \"gpt-5\"\n */\n private abbreviationScore(text: string, pattern: string): number {\n let score = 0\n let textPos = 0\n let perfectStart = false\n let consecutiveMatches = 0\n let wordBoundaryMatches = 0\n\n // Split text by hyphens to handle word boundaries better\n const textWords = text.split('-')\n const textClean = text.replace(/-/g, '').toLowerCase()\n\n for (let i = 0; i < pattern.length; i++) {\n const char = pattern[i]\n let charFound = false\n\n // Try to find in clean text (no hyphens)\n for (let j = textPos; j < textClean.length; j++) {\n if (textClean[j] === char) {\n charFound = true\n\n // Check if this character is at a word boundary in original text\n let originalPos = 0\n let cleanPos = 0\n for (let k = 0; k < text.length; k++) {\n if (text[k] === '-') continue\n if (cleanPos === j) {\n originalPos = k\n break\n }\n cleanPos++\n }\n\n // Consecutive character bonus\n if (j === textPos) {\n consecutiveMatches++\n } else {\n consecutiveMatches = 1\n }\n\n // Position-sensitive scoring\n if (i === 0 && j === 0) {\n score += 50 // Perfect first character\n perfectStart = true\n } else if (originalPos === 0 || text[originalPos - 1] === '-') {\n score += 35 // Word boundary match\n wordBoundaryMatches++\n } else if (j <= 2) {\n score += 20 // Early position\n } else if (j <= 6) {\n score += 10 // Mid position\n } else {\n score += 5 // Late position\n }\n\n // Consecutive character bonus\n if (consecutiveMatches > 1) {\n score += consecutiveMatches * 5\n }\n\n textPos = j + 1\n break\n }\n }\n\n if (!charFound) return 0 // Invalid abbreviation\n }\n\n // Critical bonuses\n if (perfectStart) score += 30\n if (wordBoundaryMatches >= 2) score += 25 // Multiple word boundaries\n if (textPos <= textClean.length * 0.8) score += 15 // Compact abbreviation\n\n // Special bonus for number matching at end\n const lastPatternChar = pattern[pattern.length - 1]\n const lastTextChar = text[text.length - 1]\n if (/\\d/.test(lastPatternChar) && lastPatternChar === lastTextChar) {\n score += 25\n }\n\n return score\n }\n\n /**\n * Algorithm 4: Edit Distance (typo tolerance)\n * Handles cases like \"noda\" \u2192 \"node\"\n */\n private editDistanceScore(text: string, pattern: string): number {\n if (pattern.length > text.length + this.config.maxEditDistance) return 0\n\n // Simplified Levenshtein distance\n const dp: number[][] = []\n const m = pattern.length\n const n = text.length\n\n // Initialize DP table\n for (let i = 0; i <= m; i++) {\n dp[i] = []\n for (let j = 0; j <= n; j++) {\n if (i === 0) dp[i][j] = j\n else if (j === 0) dp[i][j] = i\n else {\n const cost = pattern[i - 1] === text[j - 1] ? 0 : 1\n dp[i][j] = Math.min(\n dp[i - 1][j] + 1, // deletion\n dp[i][j - 1] + 1, // insertion\n dp[i - 1][j - 1] + cost, // substitution\n )\n }\n }\n }\n\n const distance = dp[m][n]\n if (distance > this.config.maxEditDistance) return 0\n\n return Math.max(0, 30 - distance * 10)\n }\n\n /**\n * Algorithm 5: Command Popularity (like frequency in input method)\n * Boost common commands that users frequently type\n */\n private popularityScore(text: string): number {\n if (this.config.popularCommands.includes(text)) {\n return 40\n }\n\n // Short commands are often more commonly used\n if (text.length <= 5) return 10\n\n return 0\n }\n\n /**\n * Batch match multiple candidates and return sorted results\n */\n matchMany(\n candidates: string[],\n query: string,\n ): Array<{ candidate: string; result: MatchResult }> {\n return candidates\n .map(candidate => ({\n candidate,\n result: this.match(candidate, query),\n }))\n .filter(item => item.result.score >= this.config.minScore)\n .sort((a, b) => b.result.score - a.result.score)\n }\n}\n\n// Export convenience functions\nexport const defaultMatcher = new FuzzyMatcher()\n\nexport function matchCommand(command: string, query: string): MatchResult {\n return defaultMatcher.match(command, query)\n}\n\n// Import the advanced matcher\nimport { matchManyAdvanced } from './advancedFuzzyMatcher'\n\nexport function matchCommands(\n commands: string[],\n query: string,\n): Array<{ command: string; score: number }> {\n // Use the advanced matcher for better results\n return matchManyAdvanced(commands, query, 5) // Lower threshold for better matching\n .map(item => ({\n command: item.candidate,\n score: item.score,\n }))\n}\n", "import { matchCommands } from './fuzzyMatcher'\nimport type { UnifiedSuggestion } from './types'\n\nexport function generateMentionSuggestions(args: {\n prefix: string\n agentSuggestions: UnifiedSuggestion[]\n modelSuggestions: UnifiedSuggestion[]\n}): UnifiedSuggestion[] {\n const { prefix, agentSuggestions, modelSuggestions } = args\n const allSuggestions = [...agentSuggestions, ...modelSuggestions]\n\n if (!prefix) {\n return allSuggestions.sort((a, b) => {\n if (a.type === 'ask' && b.type === 'agent') return -1\n if (a.type === 'agent' && b.type === 'ask') return 1\n return b.score - a.score\n })\n }\n\n const candidates = allSuggestions.map(s => s.value)\n const matches = matchCommands(candidates, prefix)\n\n const fuzzyResults = matches\n .map(match => {\n const suggestion = allSuggestions.find(s => s.value === match.command)!\n return {\n ...suggestion,\n score: match.score,\n }\n })\n .sort((a, b) => {\n if (a.type === 'ask' && b.type === 'agent') return -1\n if (a.type === 'agent' && b.type === 'ask') return 1\n return b.score - a.score\n })\n\n return fuzzyResults\n}\n", "import type { Command } from '#cli-commands'\nimport type { UnifiedSuggestion } from './types'\n\nexport function generateSlashCommandSuggestions(args: {\n commands: Command[]\n prefix: string\n}): UnifiedSuggestion[] {\n const { commands, prefix } = args\n const filteredCommands = commands.filter(cmd => !cmd.isHidden)\n\n if (!prefix) {\n return filteredCommands.map(cmd => ({\n value: cmd.userFacingName(),\n displayValue: `/${cmd.userFacingName()}`,\n type: 'command' as const,\n score: 100,\n }))\n }\n\n return filteredCommands\n .filter(cmd => {\n const names = [cmd.userFacingName(), ...(cmd.aliases || [])]\n return names.some(name =>\n name.toLowerCase().startsWith(prefix.toLowerCase()),\n )\n })\n .map(cmd => ({\n value: cmd.userFacingName(),\n displayValue: `/${cmd.userFacingName()}`,\n type: 'command' as const,\n score:\n 100 -\n prefix.length +\n (cmd.userFacingName().startsWith(prefix) ? 10 : 0),\n }))\n}\n", "/**\n * Common Unix Commands Database\n *\n * A curated list of frequently used Unix/Linux commands.\n */\n\nfunction parseWords(text: string): readonly string[] {\n return text\n .trim()\n .split(/\\s+/)\n .map(word => word.trim())\n .filter(Boolean)\n}\n\nexport const COMMON_UNIX_COMMANDS: readonly string[] = parseWords(`\nls cd pwd mkdir rmdir rm cp mv touch cat less more head tail file stat ln readlink basename dirname find locate which whereis\ntype tree du df mount umount chmod chown chgrp umask setfacl getfacl lsattr chattr realpath mktemp rsync scp sftp ftp wget curl tar gzip\ngunzip zip unzip bzip2 bunzip2 xz unxz 7z rar unrar zcat zless grep egrep fgrep rg ag ack sed awk cut paste sort uniq\nwc tr col column expand unexpand fold fmt pr nl od hexdump xxd strings split csplit join comm diff sdiff vimdiff patch diffstat cmp\nmd5sum sha1sum sha256sum sha512sum base64 uuencode uudecode rev tac shuf jq yq xmllint tidy ps top htop atop iotop iftop nethogs pgrep pkill kill\nkillall jobs bg fg nohup disown nice renice ionice taskset pstree fuser lsof strace ltrace ptrace gdb valgrind time timeout watch screen tmux byobu\ndtach nmon dstat vmstat iostat mpstat ping ping6 traceroute tracepath mtr netstat ss ip ifconfig route arp hostname hostnamectl nslookup dig host whois nc\nnetcat ncat socat telnet ssh ssh-keygen ssh-copy-id ssh-add ssh-agent sshd tcpdump wireshark tshark nmap masscan zmap iptables ip6tables firewall-cmd ufw fail2ban nginx apache2 httpd\ncurl wget aria2 axel links lynx w3m elinks gcc g++ clang clang++ make cmake autoconf automake libtool pkg-config python3 pip pip3 pipenv poetry virtualenv\npyenv node npm uv npx yarn pnpm nvm volta deno bun tsx ruby gem bundle bundler rake rbenv rvm irb pry rails java javac\njar javadoc maven mvn gradle ant kotlin kotlinc go gofmt golint govet godoc rust rustc cargo rustup rustfmt git svn hg bzr cvs fossil\ntig gitk git-flow hub gh glab docker docker-compose podman kubectl helm minikube kind k3s vagrant terraform ansible puppet chef salt packer consul vault nomad\nvim vi nvim emacs nano pico ed code subl atom mysql mysqldump mysqladmin psql pg_dump pg_restore sqlite3 redis-cli mongo mongodump mongorestore cqlsh influx clickhouse-client\nmariadb cockroach etcdctl consul vault nomad jq yq xmlstarlet csvkit miller awk sed perl lua tcl sudo su passwd useradd userdel usermod groupadd groupdel\ngroupmod id who w last lastlog finger chfn chsh login logout exit systemctl service journalctl systemd-analyze init telinit runlevel shutdown reboot halt poweroff uptime\nuname hostname hostnamectl timedatectl localectl loginctl machinectl bootctl cron crontab at batch anacron systemd-run systemd-timer logrotate logger dmesg apt apt-get apt-cache dpkg dpkg-reconfigure aptitude\nsnap flatpak appimage alien yum dnf rpm zypper pacman yaourt yay makepkg abs aur brew port pkg emerge portage nix guix conda mamba micromamba\ntop htop atop btop gtop gotop bashtop bpytop glances nmon sar iostat mpstat vmstat pidstat free uptime tload slabtop powertop iotop iftop nethogs bmon\nnload speedtest speedtest-cli fast mtr smokeping gpg gpg2 openssl ssh-keygen ssh-keyscan ssl-cert certbot acme.sh mkcert step pass keepassxc-cli bitwarden 1password hashcat john hydra ncrack\nmedusa aircrack-ng chkrootkit rkhunter clamav clamscan freshclam aide tripwire samhain ossec wazuh bash sh zsh fish ksh tcsh csh dash ash elvish export alias\nunalias history fc source eval exec command builtin set unset env printenv echo printf read test expr let tar gzip gunzip bzip2 bunzip2 xz\nunxz lzma unlzma compress uncompress zip unzip 7z 7za rar unrar ar cpio pax ffmpeg ffplay ffprobe sox play rec mpg123 mpg321 ogg123 flac\nlame oggenc opusenc convert mogrify identify display import animate montage bc dc calc qalc units factor primes seq shuf random octave maxima sage r\njulia man info help apropos whatis whereis which type command hash tldr cheat howdoi stackoverflow explainshell date cal ncal timedatectl zdump tzselect hwclock ntpdate\nchrony timeshift yes true false sleep usleep seq jot shuf tee xargs parallel rush dsh pssh clusterssh terminator tilix alacritty kitty wezterm\n`)\n\n/**\n * Get common commands that exist on the current system.\n * @param systemCommands Array of commands available on the system\n * @returns Deduplicated intersection of common commands and system commands\n */\nexport function getCommonSystemCommands(systemCommands: string[]): string[] {\n const systemSet = new Set(systemCommands.map(cmd => cmd.toLowerCase()))\n const commonIntersection = COMMON_UNIX_COMMANDS.filter(cmd =>\n systemSet.has(cmd.toLowerCase()),\n )\n return Array.from(new Set(commonIntersection))\n}\n\n/**\n * Get a priority score for a command based on its position in the common list.\n * Earlier commands get higher priority (more commonly used).\n */\nexport function getCommandPriority(command: string): number {\n const index = COMMON_UNIX_COMMANDS.indexOf(command.toLowerCase())\n if (index === -1) return 0\n\n const maxScore = 100\n const score = maxScore - (index / COMMON_UNIX_COMMANDS.length) * maxScore\n return Math.round(score)\n}\n\n/**\n * Get essential fallback commands for when PATH is empty or unavailable.\n * These are the most basic commands that should always be available.\n */\nexport function getEssentialCommands(): string[] {\n return [\n 'ls',\n 'cd',\n 'pwd',\n 'cat',\n 'grep',\n 'find',\n 'which',\n 'man',\n 'cp',\n 'mv',\n 'rm',\n 'mkdir',\n 'touch',\n 'chmod',\n 'ps',\n 'top',\n 'kill',\n 'git',\n 'node',\n 'npm',\n 'python3',\n 'curl',\n 'wget',\n 'docker',\n 'vim',\n 'nano',\n 'echo',\n 'export',\n 'env',\n 'sudo',\n ]\n}\n\n/**\n * Get minimal fallback commands for error scenarios.\n * These are absolute minimum commands for basic functionality.\n */\nexport function getMinimalFallbackCommands(): string[] {\n return [\n 'ls',\n 'cd',\n 'pwd',\n 'cat',\n 'grep',\n 'find',\n 'git',\n 'node',\n 'npm',\n 'python3',\n 'vim',\n 'nano',\n ]\n}\n", "import { matchCommands } from './fuzzyMatcher'\nimport {\n getCommandPriority,\n getCommonSystemCommands,\n} from './commonUnixCommands'\nimport type { UnifiedSuggestion } from './types'\n\nexport function generateUnixCommandSuggestions(args: {\n prefix: string\n systemCommands: string[]\n isLoadingCommands: boolean\n}): UnifiedSuggestion[] {\n const { prefix, systemCommands, isLoadingCommands } = args\n if (!prefix) return []\n\n if (isLoadingCommands) {\n return [\n {\n value: 'loading...',\n displayValue: `\u23F3 Loading system commands...`,\n type: 'file' as const,\n score: 0,\n metadata: { isLoading: true },\n },\n ]\n }\n\n const commonCommands = getCommonSystemCommands(systemCommands)\n const uniqueCommands = Array.from(new Set(commonCommands))\n const matches = matchCommands(uniqueCommands, prefix)\n\n const boostedMatches = matches\n .map(match => {\n const priority = getCommandPriority(match.command)\n return {\n ...match,\n score: match.score + priority * 0.5,\n }\n })\n .sort((a, b) => b.score - a.score)\n\n let results = boostedMatches.slice(0, 8)\n\n const perfectMatches = boostedMatches.filter(m => m.score >= 900)\n if (perfectMatches.length > 0 && perfectMatches.length <= 3) {\n results = perfectMatches\n } else if (boostedMatches.length > 8) {\n const goodMatches = boostedMatches.filter(m => m.score >= 100)\n if (goodMatches.length <= 5) {\n results = goodMatches\n }\n }\n\n return results.map(item => ({\n value: item.command,\n displayValue: `$ ${item.command}`,\n type: 'command' as const,\n score: item.score,\n metadata: { isUnixCommand: true },\n }))\n}\n", "import type { Command } from '#cli-commands'\nimport type { CompletionContext, UnifiedSuggestion } from './types'\nimport { generateFileSuggestions } from './fileSuggestions'\nimport { generateMentionSuggestions } from './mentionSuggestions'\nimport { generateSlashCommandSuggestions } from './slashCommandSuggestions'\nimport { generateUnixCommandSuggestions } from './unixCommandSuggestions'\n\nexport function generateSuggestionsForContext(args: {\n context: CompletionContext\n commands: Command[]\n agentSuggestions: UnifiedSuggestion[]\n modelSuggestions: UnifiedSuggestion[]\n systemCommands: string[]\n isLoadingCommands: boolean\n cwd: string\n}): UnifiedSuggestion[] {\n const {\n context,\n commands,\n agentSuggestions,\n modelSuggestions,\n systemCommands,\n isLoadingCommands,\n cwd,\n } = args\n\n switch (context.type) {\n case 'command':\n return generateSlashCommandSuggestions({\n commands,\n prefix: context.prefix,\n })\n case 'agent': {\n const mentionSuggestions = generateMentionSuggestions({\n prefix: context.prefix,\n agentSuggestions,\n modelSuggestions,\n })\n const fileSuggestions = generateFileSuggestions({\n prefix: context.prefix,\n cwd,\n })\n\n const weightedSuggestions = [\n ...mentionSuggestions.map(s => ({\n ...s,\n weightedScore: s.score + 150,\n })),\n ...fileSuggestions.map(s => ({\n ...s,\n weightedScore: s.score + 10,\n })),\n ]\n\n return weightedSuggestions\n .sort((a, b) => b.weightedScore - a.weightedScore)\n .map(({ weightedScore, ...suggestion }) => suggestion)\n }\n case 'file': {\n const fileSuggestions = generateFileSuggestions({\n prefix: context.prefix,\n cwd,\n })\n const unixSuggestions = generateUnixCommandSuggestions({\n prefix: context.prefix,\n systemCommands,\n isLoadingCommands,\n })\n\n const mentionMatches = generateMentionSuggestions({\n prefix: context.prefix,\n agentSuggestions,\n modelSuggestions,\n }).map(s => ({\n ...s,\n isSmartMatch: true,\n displayValue: `\\u2192 ${s.displayValue}`,\n }))\n\n const weightedSuggestions = [\n ...unixSuggestions.map(s => ({\n ...s,\n sourceWeight: s.score >= 10000 ? 5000 : 200,\n weightedScore: s.score >= 10000 ? s.score + 5000 : s.score + 200,\n })),\n ...mentionMatches.map(s => ({\n ...s,\n sourceWeight: 50,\n weightedScore: s.score + 50,\n })),\n ...fileSuggestions.map(s => ({\n ...s,\n sourceWeight: 0,\n weightedScore: s.score,\n })),\n ]\n\n const seen = new Set<string>()\n const deduplicatedResults = weightedSuggestions\n .sort((a, b) => b.weightedScore - a.weightedScore)\n .filter(item => {\n if (seen.has(item.value)) return false\n seen.add(item.value)\n return true\n })\n .map(({ weightedScore, sourceWeight, ...suggestion }) => suggestion)\n\n return deduplicatedResults\n }\n default:\n return []\n }\n}\n", "import type {\n CompletionContext,\n UnifiedSuggestion,\n} from '#cli-utils/completion/types'\nimport type { Command } from '#cli-commands'\n\nexport interface UnifiedCompletionProps {\n input: string\n cursorOffset: number\n onInputChange: (value: string) => void\n setCursorOffset: (offset: number) => void\n commands: Command[]\n disableSlashCommands?: boolean\n onSubmit?: (value: string, isSubmittingSlashCommand?: boolean) => void\n}\n\nexport interface CompletionState {\n suggestions: UnifiedSuggestion[]\n selectedIndex: number\n isActive: boolean\n context: CompletionContext | null\n preview: {\n isActive: boolean\n originalInput: string\n wordRange: [number, number]\n } | null\n emptyDirMessage: string\n suppressUntil: number\n}\n\nexport const INITIAL_STATE: CompletionState = {\n suggestions: [],\n selectedIndex: 0,\n isActive: false,\n context: null,\n preview: null,\n emptyDirMessage: '',\n suppressUntil: 0,\n}\n", "import { useEffect, useState } from 'react'\n\nimport { getActiveAgents, type AgentConfig } from '#core/utils/agentLoader'\nimport { debug as debugLogger } from '#core/utils/debugLogger'\nimport { logError } from '#core/utils/log'\nimport type { UnifiedSuggestion } from '#cli-utils/completion/types'\n\nfunction findSmartBreak(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text\n\n const sentenceEndings = /[.!\u3002\uFF01]/\n const firstSentenceMatch = text.search(sentenceEndings)\n if (firstSentenceMatch !== -1) {\n const firstSentence = text.slice(0, firstSentenceMatch).trim()\n if (firstSentence.length >= 5) return firstSentence\n }\n\n const commaEndings = /[,\uFF0C]/g\n const commas: number[] = []\n let match: RegExpExecArray | null\n while ((match = commaEndings.exec(text)) !== null) {\n commas.push(match.index)\n }\n\n for (let i = commas.length - 1; i >= 0; i--) {\n const commaPos = commas[i]\n if (commaPos < maxLength) {\n const clause = text.slice(0, commaPos).trim()\n if (clause.length >= 5) return clause\n }\n }\n\n return text.slice(0, maxLength) + '...'\n}\n\nfunction compactWhenToUse(whenToUse: string): string {\n let shortDesc = whenToUse\n\n const prefixPatterns = [\n /^Use this agent when you need (assistance with: )?/i,\n /^Use PROACTIVELY (when|to) /i,\n /^Specialized in /i,\n /^Implementation specialist for /i,\n /^Design validation specialist\\.? Use PROACTIVELY to /i,\n /^Task validation specialist\\.? Use PROACTIVELY to /i,\n /^Requirements validation specialist\\.? Use PROACTIVELY to /i,\n ]\n\n for (const pattern of prefixPatterns) {\n shortDesc = shortDesc.replace(pattern, '')\n }\n\n shortDesc = findSmartBreak(shortDesc.trim(), 80)\n\n if (!shortDesc || shortDesc.length < 5) {\n shortDesc = findSmartBreak(whenToUse, 80)\n }\n\n return shortDesc\n}\n\nexport function useAgentSuggestions(): UnifiedSuggestion[] {\n const [agentSuggestions, setAgentSuggestions] = useState<UnifiedSuggestion[]>(\n [],\n )\n\n useEffect(() => {\n getActiveAgents()\n .then((agents: AgentConfig[]) => {\n const suggestions: UnifiedSuggestion[] = agents.map(config => ({\n value: `run-agent-${config.agentType}`,\n displayValue: `\uD83D\uDC64 run-agent-${config.agentType} :: ${compactWhenToUse(\n config.whenToUse,\n )}`,\n type: 'agent',\n score: 85,\n metadata: config,\n }))\n setAgentSuggestions(suggestions)\n })\n .catch(error => {\n logError(error)\n debugLogger.warn('UNIFIED_COMPLETION_AGENTS_LOAD_FAILED', {\n error: error instanceof Error ? error.message : String(error),\n })\n setAgentSuggestions([])\n })\n }, [])\n\n return agentSuggestions\n}\n", "import { useCallback } from 'react'\n\nimport type {\n CompletionContext,\n UnifiedSuggestion,\n} from '#cli-utils/completion/types'\n\nexport function useCompletionActions(args: {\n input: string\n onInputChange: (value: string) => void\n setCursorOffset: (offset: number) => void\n}): {\n completeWith: (\n suggestion: UnifiedSuggestion,\n context: CompletionContext,\n ) => void\n partialComplete: (prefix: string, context: CompletionContext) => void\n} {\n const completeWith = useCallback(\n (suggestion: UnifiedSuggestion, context: CompletionContext) => {\n let completion: string\n\n if (context.type === 'command') {\n completion = `/${suggestion.value} `\n } else if (context.type === 'agent') {\n if (suggestion.type === 'agent' || suggestion.type === 'ask') {\n completion = `@${suggestion.value} `\n } else {\n const isDirectory = suggestion.value.endsWith('/')\n completion = `@${suggestion.value}${isDirectory ? '' : ' '}`\n }\n } else {\n if (suggestion.isSmartMatch) {\n completion = `@${suggestion.value} `\n } else {\n const isDirectory = suggestion.value.endsWith('/')\n completion = suggestion.value + (isDirectory ? '' : ' ')\n }\n }\n\n let actualEndPos: number\n\n if (\n context.type === 'file' &&\n suggestion.value.startsWith('/') &&\n !suggestion.isSmartMatch\n ) {\n let end = context.startPos\n while (\n end < args.input.length &&\n args.input[end] !== ' ' &&\n args.input[end] !== '\\n'\n ) {\n end++\n }\n actualEndPos = end\n } else {\n const currentWord = args.input.slice(context.startPos)\n const nextSpaceIndex = currentWord.indexOf(' ')\n actualEndPos =\n nextSpaceIndex === -1\n ? args.input.length\n : context.startPos + nextSpaceIndex\n }\n\n const newInput =\n args.input.slice(0, context.startPos) +\n completion +\n args.input.slice(actualEndPos)\n args.onInputChange(newInput)\n args.setCursorOffset(context.startPos + completion.length)\n },\n [args],\n )\n\n const partialComplete = useCallback(\n (prefix: string, context: CompletionContext) => {\n const completion =\n context.type === 'command'\n ? `/${prefix}`\n : context.type === 'agent'\n ? `@${prefix}`\n : prefix\n\n const newInput =\n args.input.slice(0, context.startPos) +\n completion +\n args.input.slice(context.endPos)\n args.onInputChange(newInput)\n args.setCursorOffset(context.startPos + completion.length)\n },\n [args],\n )\n\n return { completeWith, partialComplete }\n}\n", "import { useEffect, useState } from 'react'\n\nimport { debug as debugLogger } from '#core/utils/debugLogger'\nimport { logError } from '#core/utils/log'\nimport { getModelManager } from '#core/utils/model'\nimport type { UnifiedSuggestion } from '#cli-utils/completion/types'\n\nexport function useModelSuggestions(): UnifiedSuggestion[] {\n const [modelSuggestions, setModelSuggestions] = useState<UnifiedSuggestion[]>(\n [],\n )\n\n useEffect(() => {\n try {\n const modelManager = getModelManager()\n const allModels = modelManager.getAllAvailableModelNames()\n\n const suggestions: UnifiedSuggestion[] = allModels.map(modelId => ({\n value: `ask-${modelId}`,\n displayValue: `\uD83E\uDD9C ask-${modelId} :: Consult ${modelId} for expert opinion and specialized analysis`,\n type: 'ask',\n score: 90,\n metadata: { modelId },\n }))\n\n setModelSuggestions(suggestions)\n } catch (error) {\n logError(error)\n debugLogger.warn('UNIFIED_COMPLETION_MODELS_LOAD_FAILED', {\n error: error instanceof Error ? error.message : String(error),\n })\n setModelSuggestions([])\n }\n }, [])\n\n return modelSuggestions\n}\n", "import { useCallback, useEffect, useState } from 'react'\n\nimport { debug as debugLogger } from '#core/utils/debugLogger'\nimport { logError } from '#core/utils/log'\nimport {\n getEssentialCommands,\n getMinimalFallbackCommands,\n} from '#cli-utils/completion/commonUnixCommands'\n\nexport function useSystemCommands(): {\n systemCommands: string[]\n isLoadingCommands: boolean\n} {\n const [systemCommands, setSystemCommands] = useState<string[]>([])\n const [isLoadingCommands, setIsLoadingCommands] = useState(false)\n\n const loadSystemCommands = useCallback(async () => {\n if (systemCommands.length > 0 || isLoadingCommands) return\n\n setIsLoadingCommands(true)\n try {\n const { readdirSync, statSync } = await import('fs')\n const pathDirs = (process.env.PATH || '').split(':').filter(Boolean)\n const commandSet = new Set<string>()\n\n getEssentialCommands().forEach(cmd => commandSet.add(cmd))\n\n for (const dir of pathDirs) {\n try {\n if (readdirSync && statSync) {\n const entries = readdirSync(dir)\n for (const entry of entries) {\n try {\n const fullPath = `${dir}/${entry}`\n const stats = statSync(fullPath)\n if (stats.isFile() && (stats.mode & 0o111) !== 0) {\n commandSet.add(entry)\n }\n } catch {\n // Skip files we can't stat\n }\n }\n }\n } catch {\n // Skip directories we can't read\n }\n }\n\n setSystemCommands(Array.from(commandSet).sort())\n } catch (error) {\n logError(error)\n debugLogger.warn('UNIFIED_COMPLETION_SYSTEM_COMMANDS_LOAD_FAILED', {\n error: error instanceof Error ? error.message : String(error),\n })\n setSystemCommands(getMinimalFallbackCommands())\n } finally {\n setIsLoadingCommands(false)\n }\n }, [systemCommands.length, isLoadingCommands])\n\n useEffect(() => {\n loadSystemCommands()\n }, [loadSystemCommands])\n\n return { systemCommands, isLoadingCommands }\n}\n", "import { useCallback, useEffect, useRef } from 'react'\n\nimport type {\n CompletionContext,\n UnifiedSuggestion,\n} from '#cli-utils/completion/types'\nimport type { CompletionState } from './types'\n\nfunction shouldAutoTrigger(context: CompletionContext): boolean {\n switch (context.type) {\n case 'command':\n case 'agent':\n return true\n case 'file': {\n const prefix = context.prefix\n if (\n prefix.startsWith('./') ||\n prefix.startsWith('../') ||\n prefix.startsWith('/') ||\n prefix.startsWith('~') ||\n prefix.includes('/')\n ) {\n return true\n }\n if (prefix.startsWith('.') && prefix.length >= 2) {\n return true\n }\n return false\n }\n default:\n return false\n }\n}\n\nexport function useUnifiedCompletionAutoTrigger(args: {\n input: string\n cursorOffset: number\n state: CompletionState\n getWordAtCursor: () => CompletionContext | null\n generateSuggestions: (context: CompletionContext) => UnifiedSuggestion[]\n activateCompletion: (\n suggestions: UnifiedSuggestion[],\n context: CompletionContext,\n ) => void\n resetCompletion: () => void\n}): void {\n const lastInputRef = useRef('')\n\n const shouldAutoHideSingleMatch = useCallback(\n (suggestion: UnifiedSuggestion, context: CompletionContext): boolean => {\n const currentInput = args.input.slice(context.startPos, context.endPos)\n\n if (context.type === 'file') {\n if (suggestion.value.endsWith('/')) return false\n if (currentInput === suggestion.value) return true\n if (\n currentInput.endsWith('/' + suggestion.value) ||\n currentInput.endsWith(suggestion.value)\n ) {\n return true\n }\n return false\n }\n\n if (context.type === 'command') {\n return currentInput === `/${suggestion.value}`\n }\n\n if (context.type === 'agent') {\n return currentInput === `@${suggestion.value}`\n }\n\n return false\n },\n [args.input],\n )\n\n useEffect(() => {\n if (lastInputRef.current === args.input) return\n\n const inputLengthChange = Math.abs(\n args.input.length - lastInputRef.current.length,\n )\n const isHistoryNavigation =\n (inputLengthChange > 10 ||\n (inputLengthChange > 5 &&\n !args.input.includes(lastInputRef.current.slice(-5)))) &&\n args.input !== lastInputRef.current\n\n lastInputRef.current = args.input\n\n if (args.state.preview?.isActive || Date.now() < args.state.suppressUntil) {\n return\n }\n\n if (isHistoryNavigation && args.state.isActive) {\n args.resetCompletion()\n return\n }\n\n const context = args.getWordAtCursor()\n\n if (context && shouldAutoTrigger(context)) {\n const newSuggestions = args.generateSuggestions(context)\n\n if (newSuggestions.length === 0) {\n args.resetCompletion()\n } else if (\n newSuggestions.length === 1 &&\n shouldAutoHideSingleMatch(newSuggestions[0], context)\n ) {\n args.resetCompletion()\n } else {\n args.activateCompletion(newSuggestions, context)\n }\n } else if (args.state.context) {\n const contextChanged =\n !context ||\n args.state.context.type !== context.type ||\n args.state.context.startPos !== context.startPos ||\n !context.prefix.startsWith(args.state.context.prefix)\n\n if (contextChanged) {\n args.resetCompletion()\n }\n }\n }, [args.input, args.cursorOffset])\n}\n", "import { useInput, type Key } from 'ink'\n\nimport type {\n CompletionContext,\n UnifiedSuggestion,\n} from '#cli-utils/completion/types'\nimport type { CompletionState } from './types'\n\nexport function __shouldHandleUnifiedCompletionTabKeyForTests(\n key: Key,\n): boolean {\n return Boolean(key.tab) && !Boolean(key.shift)\n}\n\nexport function useUnifiedCompletionTabKey(args: {\n input: string\n state: CompletionState\n getWordAtCursor: () => CompletionContext | null\n generateSuggestions: (context: CompletionContext) => UnifiedSuggestion[]\n completeWith: (\n suggestion: UnifiedSuggestion,\n context: CompletionContext,\n ) => void\n activateCompletion: (\n suggestions: UnifiedSuggestion[],\n context: CompletionContext,\n ) => void\n updateState: (updates: Partial<CompletionState>) => void\n onInputChange: (value: string) => void\n setCursorOffset: (offset: number) => void\n}): void {\n useInput((_inputChar, key) => {\n if (!__shouldHandleUnifiedCompletionTabKeyForTests(key)) return false\n\n const context = args.getWordAtCursor()\n if (!context) return false\n\n if (args.state.isActive && args.state.suggestions.length > 0) {\n const nextIndex =\n (args.state.selectedIndex + 1) % args.state.suggestions.length\n const nextSuggestion = args.state.suggestions[nextIndex]\n\n if (args.state.context) {\n const currentWord = args.input.slice(args.state.context.startPos)\n const wordEnd = currentWord.search(/\\\\s/)\n const actualEndPos =\n wordEnd === -1\n ? args.input.length\n : args.state.context.startPos + wordEnd\n\n let preview: string\n if (args.state.context.type === 'command') {\n preview = `/${nextSuggestion.value}`\n } else if (args.state.context.type === 'agent') {\n preview = `@${nextSuggestion.value}`\n } else if (nextSuggestion.isSmartMatch) {\n preview = `@${nextSuggestion.value}`\n } else {\n preview = nextSuggestion.value\n }\n\n const newInput =\n args.input.slice(0, args.state.context.startPos) +\n preview +\n args.input.slice(actualEndPos)\n\n args.onInputChange(newInput)\n args.setCursorOffset(args.state.context.startPos + preview.length)\n\n args.updateState({\n selectedIndex: nextIndex,\n preview: {\n isActive: true,\n originalInput: args.input,\n wordRange: [\n args.state.context.startPos,\n args.state.context.startPos + preview.length,\n ],\n },\n })\n }\n return true\n }\n\n const currentSuggestions = args.generateSuggestions(context)\n\n if (currentSuggestions.length === 0) {\n return false\n }\n if (currentSuggestions.length === 1) {\n args.completeWith(currentSuggestions[0], context)\n return true\n }\n\n args.activateCompletion(currentSuggestions, context)\n\n const firstSuggestion = currentSuggestions[0]\n const currentWord = args.input.slice(context.startPos)\n const wordEnd = currentWord.search(/\\\\s/)\n const actualEndPos =\n wordEnd === -1 ? args.input.length : context.startPos + wordEnd\n\n let preview: string\n if (context.type === 'command') {\n preview = `/${firstSuggestion.value}`\n } else if (context.type === 'agent') {\n preview = `@${firstSuggestion.value}`\n } else if (firstSuggestion.isSmartMatch) {\n preview = `@${firstSuggestion.value}`\n } else {\n preview = firstSuggestion.value\n }\n\n const newInput =\n args.input.slice(0, context.startPos) +\n preview +\n args.input.slice(actualEndPos)\n args.onInputChange(newInput)\n args.setCursorOffset(context.startPos + preview.length)\n\n args.updateState({\n preview: {\n isActive: true,\n originalInput: args.input,\n wordRange: [context.startPos, context.startPos + preview.length],\n },\n })\n\n return true\n })\n}\n", "import { useInput } from 'ink'\n\nimport type {\n CompletionContext,\n UnifiedSuggestion,\n} from '#cli-utils/completion/types'\nimport type { CompletionState } from './types'\n\nexport function useUnifiedCompletionNavigationKeys(args: {\n input: string\n state: CompletionState\n resetCompletion: () => void\n updateState: (updates: Partial<CompletionState>) => void\n generateSuggestions: (context: CompletionContext) => UnifiedSuggestion[]\n completeWith: (\n suggestion: UnifiedSuggestion,\n context: CompletionContext,\n ) => void\n activateCompletion: (\n suggestions: UnifiedSuggestion[],\n context: CompletionContext,\n ) => void\n onInputChange: (value: string) => void\n setCursorOffset: (offset: number) => void\n}): void {\n useInput((inputChar, key) => {\n if (\n key.return &&\n !key.shift &&\n !key.meta &&\n args.state.isActive &&\n args.state.suggestions.length > 0\n ) {\n const selectedSuggestion =\n args.state.suggestions[args.state.selectedIndex]\n if (selectedSuggestion && args.state.context) {\n let completion: string\n\n if (args.state.context.type === 'command') {\n completion = `/${selectedSuggestion.value} `\n } else if (args.state.context.type === 'agent') {\n completion = `@${selectedSuggestion.value} `\n } else if (selectedSuggestion.isSmartMatch) {\n completion = `@${selectedSuggestion.value} `\n } else {\n completion = selectedSuggestion.value + ' '\n }\n\n const currentWord = args.input.slice(args.state.context.startPos)\n const nextSpaceIndex = currentWord.indexOf(' ')\n const actualEndPos =\n nextSpaceIndex === -1\n ? args.input.length\n : args.state.context.startPos + nextSpaceIndex\n\n const newInput =\n args.input.slice(0, args.state.context.startPos) +\n completion +\n args.input.slice(actualEndPos)\n args.onInputChange(newInput)\n args.setCursorOffset(args.state.context.startPos + completion.length)\n }\n args.resetCompletion()\n return true\n }\n\n if (!args.state.isActive || args.state.suggestions.length === 0)\n return false\n\n const handleNavigation = (newIndex: number) => {\n const previewValue = args.state.suggestions[newIndex].value\n\n if (args.state.preview?.isActive && args.state.context) {\n const newInput =\n args.input.slice(0, args.state.context.startPos) +\n previewValue +\n args.input.slice(args.state.preview.wordRange[1])\n\n args.onInputChange(newInput)\n args.setCursorOffset(args.state.context.startPos + previewValue.length)\n\n args.updateState({\n selectedIndex: newIndex,\n preview: {\n ...args.state.preview,\n wordRange: [\n args.state.context.startPos,\n args.state.context.startPos + previewValue.length,\n ],\n },\n })\n } else {\n args.updateState({ selectedIndex: newIndex })\n }\n }\n\n if (key.downArrow) {\n const nextIndex =\n (args.state.selectedIndex + 1) % args.state.suggestions.length\n handleNavigation(nextIndex)\n return true\n }\n\n if (key.upArrow) {\n const nextIndex =\n args.state.selectedIndex === 0\n ? args.state.suggestions.length - 1\n : args.state.selectedIndex - 1\n handleNavigation(nextIndex)\n return true\n }\n\n if (inputChar === ' ') {\n args.resetCompletion()\n return false\n }\n\n if (key.rightArrow) {\n const selectedSuggestion =\n args.state.suggestions[args.state.selectedIndex]\n const isDirectory = selectedSuggestion.value.endsWith('/')\n\n if (!args.state.context) return false\n\n const currentWordAtContext = args.input.slice(\n args.state.context.startPos,\n args.state.context.startPos + selectedSuggestion.value.length,\n )\n\n if (currentWordAtContext !== selectedSuggestion.value) {\n args.completeWith(selectedSuggestion, args.state.context)\n }\n\n args.resetCompletion()\n\n if (isDirectory) {\n setTimeout(() => {\n if (!args.state.context) return\n const newContext: CompletionContext = {\n ...args.state.context,\n prefix: selectedSuggestion.value,\n endPos:\n args.state.context.startPos + selectedSuggestion.value.length,\n }\n\n const newSuggestions = args.generateSuggestions(newContext)\n\n if (newSuggestions.length > 0) {\n args.activateCompletion(newSuggestions, newContext)\n } else {\n args.updateState({\n emptyDirMessage: `Directory is empty: ${selectedSuggestion.value}`,\n })\n setTimeout(() => args.updateState({ emptyDirMessage: '' }), 3000)\n }\n }, 50)\n }\n\n return true\n }\n\n if (key.escape) {\n if (args.state.preview?.isActive && args.state.context) {\n args.onInputChange(args.state.preview.originalInput)\n args.setCursorOffset(\n args.state.context.startPos + args.state.context.prefix.length,\n )\n }\n\n args.resetCompletion()\n return true\n }\n\n return false\n })\n\n useInput((_inputChar, key) => {\n if (key.backspace || key.delete) {\n if (args.state.isActive) {\n args.resetCompletion()\n const suppressionTime = args.input.length > 10 ? 200 : 100\n args.updateState({\n suppressUntil: Date.now() + suppressionTime,\n })\n return true\n }\n }\n return false\n })\n}\n", "import type { Key } from 'ink'\nimport type { InputShortcut } from './permissionModeCycleShortcut'\n\ntype KeyWithOption = Key & { option?: boolean }\n\nexport type PromptInputSpecialKeyAction =\n | 'modeCycle'\n | 'modelSwitch'\n | 'externalEditor'\n | null\n\nexport function getPromptInputSpecialKeyAction(args: {\n inputChar: string\n key: KeyWithOption\n modeCycleShortcut: InputShortcut\n}): PromptInputSpecialKeyAction {\n if (args.modeCycleShortcut.check(args.inputChar, args.key)) {\n return 'modeCycle'\n }\n\n const optionOrMeta = Boolean(args.key.meta) || Boolean(args.key.option)\n\n if (\n args.inputChar === '\u00B5' ||\n (optionOrMeta && (args.inputChar === 'm' || args.inputChar === 'M'))\n ) {\n return 'modelSwitch'\n }\n\n if (\n args.inputChar === '\u00A9' ||\n (optionOrMeta && (args.inputChar === 'g' || args.inputChar === 'G'))\n ) {\n return 'externalEditor'\n }\n\n return null\n}\n\nexport function __getPromptInputSpecialKeyActionForTests(\n args: Parameters<typeof getPromptInputSpecialKeyAction>[0],\n): PromptInputSpecialKeyAction {\n return getPromptInputSpecialKeyAction(args)\n}\n", "import { join } from 'path'\nimport { readFileSync, writeFileSync } from 'fs'\nimport { logError } from '#core/utils/log'\n\nexport function handleHashCommand(interpreted: string): void {\n // Appends the AI-interpreted content to AGENTS.md.\n // If a legacy CLAUDE.md exists, it is also updated for compatibility.\n try {\n const cwd = process.cwd()\n const agentsPath = join(cwd, 'AGENTS.md')\n const legacyPath = join(cwd, 'CLAUDE.md')\n\n const filesToUpdate: Array<{ path: string; name: string }> = []\n\n // Always try to update AGENTS.md (create if not exists)\n filesToUpdate.push({ path: agentsPath, name: 'AGENTS.md' })\n\n // Update legacy CLAUDE.md only if it exists\n try {\n readFileSync(legacyPath, 'utf-8')\n filesToUpdate.push({ path: legacyPath, name: 'CLAUDE.md' })\n } catch {\n // CLAUDE.md doesn't exist, skip it\n }\n\n const now = new Date()\n const timezoneMatch = now.toString().match(/\\(([A-Z]+)\\)/)\n const timezone = timezoneMatch\n ? timezoneMatch[1]\n : now\n .toLocaleTimeString('en-us', { timeZoneName: 'short' })\n .split(' ')\n .pop()\n\n const timestamp = interpreted.includes(now.getFullYear().toString())\n ? ''\n : `\\n\\n_Added on ${now.toLocaleString()} ${timezone}_`\n\n const updatedFiles: string[] = []\n\n for (const file of filesToUpdate) {\n try {\n let existingContent = ''\n try {\n existingContent = readFileSync(file.path, 'utf-8').trim()\n } catch {\n // File doesn't exist yet, that's fine\n }\n\n const separator = existingContent ? '\\n\\n' : ''\n const newContent = `${existingContent}${separator}${interpreted}${timestamp}`\n writeFileSync(file.path, newContent, 'utf-8')\n updatedFiles.push(file.name)\n } catch (error) {\n logError(error)\n }\n }\n } catch (e) {\n logError(e)\n }\n}\n", "import { Box } from 'ink'\nimport type { Message, UserMessage } from '#core/query'\nimport { hasCommand } from '#cli-commands'\nimport { logError } from '#core/utils/log'\nimport { resolve } from 'path'\nimport type { ContentBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { setCwd, getCwd } from '#core/utils/state'\nimport chalk from 'chalk'\nimport * as React from 'react'\nimport { UserBashInputMessage } from '#ui-ink/components/messages/UserBashInputMessage'\nimport { Spinner } from '#ui-ink/components/Spinner'\nimport { BashTool } from '#tools/tools/system/BashTool/BashTool'\nimport { lastX } from '#core/utils/generators'\nimport type { SetToolJSXFn, ToolUseContext } from '#core/tooling/Tool'\nimport { createAssistantMessage, createUserMessage } from '#core/utils/messages'\nimport { getMessagesForSlashCommand } from './slashCommands'\nimport {\n coerceImageMediaType,\n extractAssistantText,\n} from './processUserInputHelpers'\n\nexport async function processUserInput(\n input: string,\n mode: 'bash' | 'prompt' | 'koding',\n setToolJSX: SetToolJSXFn<React.ReactNode>,\n context: ToolUseContext & {\n setForkConvoWithMessagesOnTheNextRender: (\n forkConvoWithMessages: Message[],\n ) => void\n options?: {\n isKodingRequest?: boolean\n kodingContext?: string\n }\n },\n pastedImages: Array<{\n placeholder: string\n data: string\n mediaType: string\n }> | null,\n): Promise<Message[]> {\n // Bash commands\n if (mode === 'bash') {\n const userMessage = createUserMessage(`<bash-input>${input}</bash-input>`)\n\n // Special case: cd\n if (input.startsWith('cd ')) {\n const oldCwd = getCwd()\n const newCwd = resolve(getCwd(), input.slice(3).trim())\n try {\n await setCwd(newCwd)\n return [\n userMessage,\n createAssistantMessage(\n `<bash-stdout>Changed directory to ${chalk.bold(`${newCwd}/`)}</bash-stdout>`,\n ),\n ]\n } catch (e) {\n logError(e)\n return [\n userMessage,\n createAssistantMessage(\n `<bash-stderr>cwd error: ${e instanceof Error ? e.message : String(e)}</bash-stderr>`,\n ),\n ]\n }\n }\n\n // All other bash commands\n setToolJSX({\n jsx: (\n <Box flexDirection=\"column\" marginTop={1}>\n <UserBashInputMessage\n addMargin={false}\n param={{ text: `<bash-input>${input}</bash-input>`, type: 'text' }}\n />\n <Spinner />\n </Box>\n ),\n shouldHidePromptInput: false,\n })\n try {\n const bashContext = {\n ...context,\n commandSource: 'user_bash_mode' as const,\n } satisfies ToolUseContext\n\n const validationResult = await BashTool.validateInput(\n { command: input },\n bashContext,\n )\n if (!validationResult.result) {\n return [userMessage, createAssistantMessage(validationResult.message)]\n }\n const lastChunk = await lastX(\n BashTool.call({ command: input }, bashContext),\n )\n if (lastChunk.type !== 'result') {\n return [\n userMessage,\n createAssistantMessage(\n '<bash-stderr>Command did not return a result.</bash-stderr>',\n ),\n ]\n }\n const { data } = lastChunk\n return [\n userMessage,\n createAssistantMessage(\n `<bash-stdout>${data.stdout}</bash-stdout><bash-stderr>${data.stderr}</bash-stderr>`,\n ),\n ]\n } catch (e) {\n return [\n userMessage,\n createAssistantMessage(\n `<bash-stderr>Command failed: ${e instanceof Error ? e.message : String(e)}</bash-stderr>`,\n ),\n ]\n } finally {\n setToolJSX(null)\n }\n }\n // Koding mode - special wrapper for display\n else if (mode === 'koding') {\n const userMessage = createUserMessage(\n `<koding-input>${input}</koding-input>`,\n )\n // Add the Koding flag to the message\n userMessage.options = {\n ...userMessage.options,\n isKodingRequest: true,\n }\n\n // Rest of koding processing is handled separately to capture assistant response\n return [userMessage]\n }\n\n // Slash commands\n if (context.options?.disableSlashCommands !== true && input.startsWith('/')) {\n const words = input.slice(1).split(' ')\n let commandName = words[0]\n if (words.length > 1 && words[1] === '(MCP)') {\n commandName = commandName + ' (MCP)'\n }\n if (!commandName) {\n return [\n createAssistantMessage('Commands are in the form `/command [args]`'),\n ]\n }\n\n // Check if it's a real command before processing\n if (!hasCommand(commandName, context.options.commands)) {\n // If not a real command, treat it as a regular user input\n\n return [createUserMessage(input)]\n }\n\n const args = input.slice(commandName.length + 2)\n const newMessages = await getMessagesForSlashCommand(\n commandName,\n args,\n setToolJSX,\n context,\n )\n\n // Local JSX commands\n if (newMessages.length === 0) {\n return []\n }\n\n // For invalid commands, preserve both the user message and error\n if (\n newMessages.length === 2 &&\n newMessages[0]!.type === 'user' &&\n newMessages[1]!.type === 'assistant'\n ) {\n const maybeContent = newMessages[1]!.message.content\n if (extractAssistantText(maybeContent).startsWith('Unknown command:')) {\n return newMessages\n }\n }\n\n // User-Assistant pair (eg. local commands)\n if (newMessages.length === 2) {\n return newMessages\n }\n\n // A valid command\n\n return newMessages\n }\n\n // Regular user prompt\n\n // Check if this is a Koding request that needs special handling\n const isKodingRequest = context.options?.isKodingRequest === true\n const kodingContextInfo = context.options?.kodingContext\n\n // Create base message\n let userMessage: UserMessage\n\n let processedInput =\n isKodingRequest && kodingContextInfo\n ? `${kodingContextInfo}\\n\\n${input}`\n : input\n\n // Process dynamic content for custom commands with ! and @ prefixes\n // This uses the same processing functions as custom commands to maintain consistency\n if (processedInput.includes('!`') || processedInput.includes('@')) {\n try {\n // Import functions from customCommands service to avoid code duplication\n const { executeBashCommands } =\n await import('#cli-services/customCommands')\n\n // Execute bash commands if present\n if (processedInput.includes('!`')) {\n processedInput = await executeBashCommands(processedInput)\n }\n\n // Process mentions for system reminder integration\n // Note: We don't call resolveFileReferences here anymore -\n // @file mentions should trigger Read tool usage via reminders, not embed content\n if (processedInput.includes('@')) {\n const { processMentions } =\n await import('#cli-services/mentionProcessor')\n await processMentions(processedInput)\n }\n } catch (error) {\n logError(error)\n // Continue with original input if processing fails\n }\n }\n\n if (pastedImages && pastedImages.length > 0) {\n const occurrences = pastedImages\n .map(img => ({ img, index: processedInput.indexOf(img.placeholder) }))\n .filter(o => o.index >= 0)\n .sort((a, b) => a.index - b.index)\n\n const blocks: ContentBlockParam[] = []\n let cursor = 0\n\n for (const { img, index } of occurrences) {\n const before = processedInput.slice(cursor, index)\n if (before) {\n blocks.push({ type: 'text', text: before })\n }\n blocks.push({\n type: 'image',\n source: {\n type: 'base64',\n media_type: coerceImageMediaType(img.mediaType),\n data: img.data,\n },\n })\n cursor = index + img.placeholder.length\n }\n\n const after = processedInput.slice(cursor)\n if (after) {\n blocks.push({ type: 'text', text: after })\n }\n\n if (!blocks.some(b => b.type === 'text')) {\n blocks.push({ type: 'text', text: '' })\n }\n\n userMessage = createUserMessage(blocks)\n } else {\n userMessage = createUserMessage(processedInput)\n }\n\n // Add the Koding flag to the message if needed\n if (isKodingRequest) {\n userMessage.options = {\n ...userMessage.options,\n isKodingRequest: true,\n }\n }\n\n return [userMessage]\n}\n", "import { Box, Text, useInput } from 'ink'\nimport * as React from 'react'\nimport { useState } from 'react'\n\nimport { GITHUB_ISSUES_REPO_URL } from '#core/constants/product'\nimport { MACRO } from '#core/constants/macros'\nimport { getGlobalConfig } from '#core/utils/config'\nimport { env } from '#core/utils/env'\nimport { openBrowser } from '#core/utils/browser'\nimport { getTheme } from '#core/utils/theme'\nimport { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\nimport { useExitOnCtrlCD } from '#ui-ink/hooks/useExitOnCtrlCD'\n\nimport TextInput from './TextInput'\n\ntype Props = {\n onDone(result: string): void\n}\n\ntype Step = 'userInput' | 'consent'\n\nexport function Bug({ onDone }: Props): React.ReactNode {\n const [step, setStep] = useState<Step>('userInput')\n const [cursorOffset, setCursorOffset] = useState(0)\n const [description, setDescription] = useState('')\n const textInputColumns = useTerminalSize().columns - 4\n\n const exitState = useExitOnCtrlCD(() => process.exit(0))\n\n const canContinue = description.trim().length > 0\n\n useInput((input, key) => {\n if (key.escape) {\n onDone('<bash-stderr>Bug report cancelled</bash-stderr>')\n return\n }\n\n if (step === 'consent' && (key.return || input === ' ')) {\n const issueUrl = createGitHubIssueUrl({\n title: (description.trim() || 'Bug Report').slice(0, 80),\n description: description.trim(),\n })\n void openBrowser(issueUrl)\n onDone('<bash-stdout>Opened GitHub issue</bash-stdout>')\n }\n })\n\n const theme = getTheme()\n\n return (\n <>\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.permission}\n paddingX={1}\n paddingBottom={1}\n gap={1}\n >\n <Text bold color={theme.permission}>\n Submit Bug Report\n </Text>\n\n {step === 'userInput' ? (\n <Box flexDirection=\"column\" gap={1}>\n <Text>\n Describe the issue below and include any errors you see:\n </Text>\n <TextInput\n value={description}\n onChange={setDescription}\n columns={textInputColumns}\n onSubmit={() => {\n if (canContinue) setStep('consent')\n }}\n onExitMessage={() =>\n onDone('<bash-stderr>Bug report cancelled</bash-stderr>')\n }\n cursorOffset={cursorOffset}\n onChangeCursorOffset={setCursorOffset}\n />\n {!canContinue ? (\n <Text dimColor>Enter a description to continue</Text>\n ) : null}\n </Box>\n ) : (\n <Box flexDirection=\"column\" gap={1}>\n <Text>This report will include:</Text>\n <Box marginLeft={2} flexDirection=\"column\">\n <Text>\n - Your description: <Text dimColor>{description}</Text>\n </Text>\n <Text>\n - Environment: <Text dimColor>{env.platform}</Text>,{' '}\n <Text dimColor>{env.terminal}</Text>,{' '}\n <Text dimColor>v{MACRO.VERSION || 'unknown'}</Text>\n </Text>\n <Text>- Model settings (no API keys)</Text>\n </Box>\n <Text>\n Press <Text bold>Enter</Text> to open GitHub and create an issue.\n </Text>\n </Box>\n )}\n </Box>\n\n <Box marginLeft={3}>\n <Text dimColor>\n {exitState.pending ? (\n <>Press {exitState.keyName} again to exit</>\n ) : step === 'userInput' ? (\n <>Enter to continue \u00B7 Esc to cancel</>\n ) : (\n <>Enter to open browser \u00B7 Esc to cancel</>\n )}\n </Text>\n </Box>\n </>\n )\n}\n\nfunction createGitHubIssueUrl(args: {\n title: string\n description: string\n}): string {\n const globalConfig = getGlobalConfig()\n const modelProfiles = globalConfig.modelProfiles || []\n const activeProfiles = modelProfiles.filter(p => p.isActive)\n\n let modelInfo = '## Models\\\\n'\n if (activeProfiles.length === 0) {\n modelInfo += '- No model profiles configured\\\\n'\n } else {\n for (const profile of activeProfiles) {\n modelInfo += `- ${profile.name}\\\\n`\n modelInfo += ` - provider: ${profile.provider}\\\\n`\n modelInfo += ` - model: ${profile.modelName}\\\\n`\n modelInfo += ` - baseURL: ${profile.baseURL}\\\\n`\n modelInfo += ` - maxTokens: ${profile.maxTokens}\\\\n`\n modelInfo += ` - contextLength: ${profile.contextLength}\\\\n`\n if (profile.reasoningEffort) {\n modelInfo += ` - reasoning effort: ${profile.reasoningEffort}\\\\n`\n }\n }\n }\n\n const body = encodeURIComponent(`\n## Bug Description\n${args.description}\n\n## Environment Info\n- Platform: ${env.platform}\n- Terminal: ${env.terminal}\n- Version: ${MACRO.VERSION || 'unknown'}\n\n${modelInfo}`)\n\n return `${GITHUB_ISSUES_REPO_URL}/new?title=${encodeURIComponent(args.title)}&body=${body}&labels=user-reported,bug`\n}\n", "import { execFileNoThrow } from './execFileNoThrow'\n\nexport async function openBrowser(url: string): Promise<boolean> {\n const platform = process.platform\n const command =\n platform === 'win32' ? 'start' : platform === 'darwin' ? 'open' : 'xdg-open'\n\n try {\n const { code } = await execFileNoThrow(command, [url])\n return code === 0\n } catch (_) {\n return false\n }\n}\n", "import type { Command } from '../types'\nimport { Bug } from '#ui-ink/components/Bug'\nimport * as React from 'react'\nimport { PRODUCT_NAME } from '#core/constants/product'\n\nconst bug = {\n type: 'local-jsx',\n name: 'bug',\n description: `Submit feedback about ${PRODUCT_NAME}`,\n isEnabled: true,\n isHidden: false,\n async call(onDone) {\n return <Bug onDone={onDone} />\n },\n userFacingName() {\n return 'bug'\n },\n} satisfies Command\n\nexport default bug\n", "import type { Command } from '../types'\nimport { getMessagesSetter } from '#core/messages'\nimport { getContext } from '#core/context'\nimport { getCodeStyle } from '#core/utils/style'\nimport { clearTerminal } from '#cli-utils/terminal'\nimport { getOriginalCwd, setCwd } from '#core/utils/state'\nimport { Message } from '#core/query'\nimport { resetReminderSession } from '#core/services/systemReminder'\nimport { resetFileFreshnessSession } from '#core/services/fileFreshness'\n\nexport async function clearConversation(context: {\n setForkConvoWithMessagesOnTheNextRender: (\n forkConvoWithMessages: Message[],\n ) => void\n}) {\n await clearTerminal()\n getMessagesSetter()([])\n context.setForkConvoWithMessagesOnTheNextRender([])\n getContext.cache.clear?.()\n getCodeStyle.cache.clear?.()\n await setCwd(getOriginalCwd())\n\n // Reset reminder and file freshness sessions to clean up state\n resetReminderSession()\n resetFileFreshnessSession()\n}\n\nconst clear = {\n type: 'local',\n name: 'clear',\n description: 'Clear conversation history and free up context',\n isEnabled: true,\n isHidden: false,\n async call(_, context) {\n clearConversation(context)\n return ''\n },\n userFacingName() {\n return 'clear'\n },\n} satisfies Command\n\nexport default clear\n", "import type { Command } from '../types'\nimport { getContext } from '#core/context'\nimport { getMessagesGetter, getMessagesSetter } from '#core/messages'\nimport { API_ERROR_MESSAGE_PREFIX } from '#core/ai/constants'\nimport { queryLLM } from '#core/ai/llmLazy'\nimport { getGlobalConfig } from '#core/utils/config'\nimport {\n createUserMessage,\n normalizeMessagesForAPI,\n} from '#core/utils/messages'\nimport { getCodeStyle } from '#core/utils/style'\nimport { clearTerminal } from '#cli-utils/terminal'\nimport { resetReminderSession } from '#core/services/systemReminder'\nimport { resetFileFreshnessSession } from '#core/services/fileFreshness'\n\nconst COMPRESSION_PROMPT = `Please provide a comprehensive summary of our conversation structured as follows:\n\n## Technical Context\nDevelopment environment, tools, frameworks, and configurations in use. Programming languages, libraries, and technical constraints. File structure, directory organization, and project architecture.\n\n## Project Overview \nMain project goals, features, and scope. Key components, modules, and their relationships. Data models, APIs, and integration patterns.\n\n## Code Changes\nFiles created, modified, or analyzed during our conversation. Specific code implementations, functions, and algorithms added. Configuration changes and structural modifications.\n\n## Debugging & Issues\nProblems encountered and their root causes. Solutions implemented and their effectiveness. Error messages, logs, and diagnostic information.\n\n## Current Status\nWhat we just completed successfully. Current state of the codebase and any ongoing work. Test results, validation steps, and verification performed.\n\n## Pending Tasks\nImmediate next steps and priorities. Planned features, improvements, and refactoring. Known issues, technical debt, and areas needing attention.\n\n## User Preferences\nCoding style, formatting, and organizational preferences. Communication patterns and feedback style. Tool choices and workflow preferences.\n\n## Key Decisions\nImportant technical decisions made and their rationale. Alternative approaches considered and why they were rejected. Trade-offs accepted and their implications.\n\nFocus on information essential for continuing the conversation effectively, including specific details about code, files, errors, and plans.`\n\nconst compact = {\n type: 'local',\n name: 'compact',\n description: 'Clear conversation history but keep a summary in context',\n isEnabled: true,\n isHidden: false,\n async call(\n _,\n {\n options: { tools },\n abortController,\n setForkConvoWithMessagesOnTheNextRender,\n },\n ) {\n const messages = getMessagesGetter()()\n\n const summaryRequest = createUserMessage(COMPRESSION_PROMPT)\n const compactPointer = getGlobalConfig().modelPointers?.compact\n\n const summaryResponse = await queryLLM(\n normalizeMessagesForAPI([...messages, summaryRequest]),\n [\n 'You are a helpful AI assistant tasked with creating comprehensive conversation summaries that preserve all essential context for continuing development work.',\n ],\n 0,\n tools,\n abortController.signal,\n {\n safeMode: false,\n model: compactPointer ? 'compact' : 'main', // \u4F7F\u7528\u6A21\u578B\u6307\u9488\uFF0C\u8BA9queryLLM\u7EDF\u4E00\u89E3\u6790\n prependCLISysprompt: true,\n },\n )\n\n const content = summaryResponse.message.content\n const summary =\n typeof content === 'string'\n ? content\n : content.length > 0 && content[0]?.type === 'text'\n ? content[0].text\n : null\n\n if (!summary) {\n throw new Error(\n `Failed to generate conversation summary - response did not contain valid text content - ${summaryResponse}`,\n )\n } else if (summary.startsWith(API_ERROR_MESSAGE_PREFIX)) {\n throw new Error(summary)\n }\n\n summaryResponse.message.usage = {\n input_tokens: 0,\n output_tokens: summaryResponse.message.usage.output_tokens,\n cache_creation_input_tokens: 0,\n cache_read_input_tokens: 0,\n }\n\n await clearTerminal()\n getMessagesSetter()([])\n setForkConvoWithMessagesOnTheNextRender([\n createUserMessage(\n `Context has been compressed using structured 8-section algorithm. All essential information has been preserved for seamless continuation.`,\n ),\n summaryResponse,\n ])\n getContext.cache.clear?.()\n getCodeStyle.cache.clear?.()\n resetFileFreshnessSession()\n\n // Reset reminder and file freshness sessions to clean up state\n resetReminderSession()\n\n return '' // not used (typesafety only)\n },\n userFacingName() {\n return 'compact'\n },\n} satisfies Command\n\nexport default compact\n", "import { Box, Text, useInput } from 'ink'\nimport * as React from 'react'\nimport { useState } from 'react'\nimport figures from 'figures'\nimport { getTheme } from '#core/utils/theme'\nimport {\n GlobalConfig,\n saveGlobalConfig,\n getGlobalConfig,\n} from '#core/utils/config'\nimport chalk from 'chalk'\nimport { useExitOnCtrlCD } from '#ui-ink/hooks/useExitOnCtrlCD'\nimport { getModelManager } from '#core/utils/model'\n\ntype Props = {\n onClose: () => void\n}\n\ntype Setting =\n | {\n id: string\n label: string\n value: boolean\n onChange(value: boolean): void\n type: 'boolean'\n disabled?: boolean\n }\n | {\n id: string\n label: string\n value: string\n options: string[]\n onChange(value: string): void\n type: 'enum'\n disabled?: boolean\n }\n | {\n id: string\n label: string\n value: string\n onChange(value: string): void\n type: 'string'\n disabled?: boolean\n }\n | {\n id: string\n label: string\n value: number\n onChange(value: number): void\n type: 'number'\n disabled?: boolean\n }\n\nexport function Config({ onClose }: Props): React.ReactNode {\n const [globalConfig, setGlobalConfig] = useState(getGlobalConfig())\n const initialConfig = React.useRef(getGlobalConfig())\n const [selectedIndex, setSelectedIndex] = useState(0)\n const exitState = useExitOnCtrlCD(() => process.exit(0))\n const [editingString, setEditingString] = useState(false)\n const [currentInput, setCurrentInput] = useState('')\n const [inputError, setInputError] = useState<string | null>(null)\n\n const modelManager = getModelManager()\n const activeProfiles = modelManager.getAvailableModels()\n\n const settings: Setting[] = [\n // Global settings\n {\n id: 'theme',\n label: 'Theme',\n value: globalConfig.theme ?? 'dark',\n options: ['dark', 'light'],\n onChange(theme: string) {\n const themeName: GlobalConfig['theme'] =\n theme === 'dark' ||\n theme === 'light' ||\n theme === 'light-daltonized' ||\n theme === 'dark-daltonized'\n ? theme\n : 'dark'\n const config = { ...getGlobalConfig(), theme: themeName }\n saveGlobalConfig(config)\n setGlobalConfig(config)\n },\n type: 'enum',\n },\n {\n id: 'verbose',\n label: 'Verbose mode',\n value: globalConfig.verbose ?? false,\n onChange(verbose: boolean) {\n const config = { ...getGlobalConfig(), verbose }\n saveGlobalConfig(config)\n setGlobalConfig(config)\n },\n type: 'boolean',\n },\n {\n id: 'stream',\n label: 'Stream responses',\n value: globalConfig.stream ?? true,\n onChange(stream: boolean) {\n const config = { ...getGlobalConfig(), stream }\n saveGlobalConfig(config)\n setGlobalConfig(config)\n },\n type: 'boolean',\n },\n ]\n\n const theme = getTheme()\n\n useInput((input, key) => {\n if (editingString) {\n if (key.return) {\n const currentSetting = settings[selectedIndex]\n if (!currentSetting) return\n\n if (currentSetting.type === 'string') {\n try {\n currentSetting.onChange(currentInput)\n setEditingString(false)\n setCurrentInput('')\n setInputError(null)\n } catch (error) {\n setInputError(\n error instanceof Error ? error.message : 'Invalid input',\n )\n }\n } else if (currentSetting.type === 'number') {\n const numValue = parseFloat(currentInput)\n if (isNaN(numValue)) {\n setInputError('Please enter a valid number')\n } else {\n try {\n currentSetting.onChange(numValue)\n setEditingString(false)\n setCurrentInput('')\n setInputError(null)\n } catch (error) {\n setInputError(\n error instanceof Error ? error.message : 'Invalid input',\n )\n }\n }\n }\n } else if (key.escape) {\n setEditingString(false)\n setCurrentInput('')\n setInputError(null)\n } else if (key.delete || key.backspace) {\n setCurrentInput(prev => prev.slice(0, -1))\n } else if (input) {\n setCurrentInput(prev => prev + input)\n }\n return\n }\n\n if (key.upArrow && !exitState.pending) {\n setSelectedIndex(prev => Math.max(0, prev - 1))\n } else if (key.downArrow && !exitState.pending) {\n setSelectedIndex(prev => Math.min(settings.length - 1, prev + 1))\n } else if (key.return && !exitState.pending) {\n const currentSetting = settings[selectedIndex]\n if (currentSetting?.disabled) return\n\n if (currentSetting?.type === 'boolean') {\n currentSetting.onChange(!currentSetting.value)\n } else if (currentSetting?.type === 'enum') {\n const currentIndex = currentSetting.options.indexOf(\n currentSetting.value,\n )\n const nextIndex = (currentIndex + 1) % currentSetting.options.length\n currentSetting.onChange(currentSetting.options[nextIndex])\n } else if (\n currentSetting?.type === 'string' ||\n currentSetting?.type === 'number'\n ) {\n setCurrentInput(String(currentSetting.value))\n setEditingString(true)\n setInputError(null)\n }\n } else if (key.escape && !exitState.pending) {\n // Check if config has changed\n const currentConfigString = JSON.stringify(getGlobalConfig())\n const initialConfigString = JSON.stringify(initialConfig.current)\n\n if (currentConfigString !== initialConfigString) {\n // Config has changed, save it\n saveGlobalConfig(getGlobalConfig())\n }\n\n onClose()\n }\n })\n\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n gap={1}\n >\n <Text bold>\n Configuration{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n\n {/* Model Configuration Summary */}\n <Box flexDirection=\"column\" marginY={1}>\n <Text bold color={theme.success}>\n Model Configuration:\n </Text>\n {activeProfiles.length === 0 ? (\n <Text color={theme.secondaryText}>\n No models configured. Use /model to add models.\n </Text>\n ) : (\n <Box flexDirection=\"column\" marginLeft={2}>\n {activeProfiles.map(profile => (\n <React.Fragment key={profile.modelName}>\n <Text color={theme.secondaryText}>\n \u2022 {profile.name} ({profile.provider})\n </Text>\n </React.Fragment>\n ))}\n <Box marginTop={1}>\n <Text color={theme.suggestion}>\n Use /model to manage model configurations\n </Text>\n </Box>\n </Box>\n )}\n </Box>\n\n {/* Settings List */}\n <Box flexDirection=\"column\">\n {settings.map((setting, index) => (\n <Box key={setting.id} flexDirection=\"column\">\n <Box flexDirection=\"row\" gap={1}>\n <Text\n color={\n index === selectedIndex\n ? theme.success\n : setting.disabled\n ? theme.secondaryText\n : theme.text\n }\n >\n {index === selectedIndex ? figures.pointer : ' '}{' '}\n {setting.label}\n </Text>\n <Text\n color={\n setting.disabled ? theme.secondaryText : theme.suggestion\n }\n >\n {setting.type === 'boolean'\n ? setting.value\n ? 'enabled'\n : 'disabled'\n : setting.type === 'enum'\n ? setting.value\n : String(setting.value)}\n </Text>\n </Box>\n {index === selectedIndex && editingString && (\n <Box flexDirection=\"column\" marginLeft={2}>\n <Text color={theme.suggestion}>\n Enter new value: {currentInput}\n </Text>\n {inputError && <Text color=\"red\">{inputError}</Text>}\n </Box>\n )}\n </Box>\n ))}\n </Box>\n\n <Box marginTop={1}>\n <Text dimColor>\n {editingString ? (\n 'Enter to save \u00B7 Esc to cancel'\n ) : (\n <>\n \u2191/\u2193 to navigate \u00B7 Enter to change \u00B7 Esc to close\n <Text color={theme.suggestion}>\n {' '}\n \u00B7 Use /model for model config\n </Text>\n </>\n )}\n </Text>\n </Box>\n </Box>\n </Box>\n )\n}\n", "import type { Command } from '../types'\nimport { Config } from '#ui-ink/components/Config'\nimport * as React from 'react'\n\nconst config = {\n type: 'local-jsx',\n name: 'config',\n description: 'Open config panel',\n isEnabled: true,\n isHidden: false,\n async call(onDone) {\n return <Config onClose={onDone} />\n },\n userFacingName() {\n return 'config'\n },\n} satisfies Command\n\nexport default config\n", "import type { Command } from '../types'\nimport { formatTotalCost } from '#core/cost-tracker'\n\nconst cost = {\n type: 'local',\n name: 'cost',\n description: 'Show the total cost and duration of the current session',\n isEnabled: true,\n isHidden: false,\n async call() {\n return formatTotalCost()\n },\n userFacingName() {\n return 'cost'\n },\n} satisfies Command\n\nexport default cost\n", "import type { Command } from '../types'\nimport type { Tool } from '#core/tooling/Tool'\nimport Table from 'cli-table3'\nimport { getSystemPrompt } from '#core/constants/prompts'\nimport { getContext } from '#core/context'\nimport { zodToJsonSchema } from 'zod-to-json-schema'\nimport { getMessagesGetter } from '#core/messages'\nimport { PROJECT_FILE } from '#core/constants/product'\n// Quick and dirty estimate of bytes per token for rough token counts\nconst BYTES_PER_TOKEN = 4\n\ninterface Section {\n title: string\n content: string\n}\n\ninterface ToolSummary {\n name: string\n description: string\n}\n\nfunction getContextSections(text: string): Section[] {\n const sections: Section[] = []\n\n // Find first <context> tag\n const firstContextIndex = text.indexOf('<context')\n\n // Everything before first tag is Core Sysprompt\n if (firstContextIndex > 0) {\n const coreSysprompt = text.slice(0, firstContextIndex).trim()\n if (coreSysprompt) {\n sections.push({\n title: 'Core Sysprompt',\n content: coreSysprompt,\n })\n }\n }\n\n let currentPos = firstContextIndex\n let nonContextContent = ''\n\n const regex = /<context\\s+name=\"([^\"]*)\">([\\s\\S]*?)<\\/context>/g\n let match: RegExpExecArray | null\n\n while ((match = regex.exec(text)) !== null) {\n // Collect text between context tags\n if (match.index > currentPos) {\n nonContextContent += text.slice(currentPos, match.index)\n }\n\n const [, name = 'Unnamed Section', content = ''] = match\n sections.push({\n title: name === 'codeStyle' ? `CodeStyle + ${PROJECT_FILE}'s` : name,\n content: content.trim(),\n })\n\n currentPos = match.index + match[0].length\n }\n\n // Collect remaining text after last tag\n if (currentPos < text.length) {\n nonContextContent += text.slice(currentPos)\n }\n\n // Add non-contextualized content if present\n const trimmedNonContext = nonContextContent.trim()\n if (trimmedNonContext) {\n sections.push({\n title: 'Non-contextualized Content',\n content: trimmedNonContext,\n })\n }\n\n return sections\n}\n\nfunction formatTokenCount(bytes: number): string {\n const tokens = bytes / BYTES_PER_TOKEN\n const k = tokens / 1000\n return `${Math.round(k * 10) / 10}k`\n}\n\nfunction formatByteCount(bytes: number): string {\n const kb = bytes / 1024\n return `${Math.round(kb * 10) / 10}kb`\n}\n\nfunction createSummaryTable(\n systemText: string,\n systemSections: Section[],\n tools: ToolSummary[],\n messages: unknown,\n): string {\n const table = new Table({\n head: ['Component', 'Tokens', 'Size', '% Used'],\n style: { head: ['bold'] },\n chars: {\n mid: '\u2500',\n 'left-mid': '\u251C',\n 'mid-mid': '\u253C',\n 'right-mid': '\u2524',\n },\n })\n\n const messagesStr = JSON.stringify(messages)\n const toolsStr = JSON.stringify(tools)\n\n // Calculate total for percentages\n const total = systemText.length + toolsStr.length + messagesStr.length\n const getPercentage = (n: number) => `${Math.round((n / total) * 100)}%`\n\n // System prompt and its sections\n table.push([\n 'System prompt',\n formatTokenCount(systemText.length),\n formatByteCount(systemText.length),\n getPercentage(systemText.length),\n ])\n for (const section of systemSections) {\n table.push([\n ` ${section.title}`,\n formatTokenCount(section.content.length),\n formatByteCount(section.content.length),\n getPercentage(section.content.length),\n ])\n }\n\n // Tools\n table.push([\n 'Tool definitions',\n formatTokenCount(toolsStr.length),\n formatByteCount(toolsStr.length),\n getPercentage(toolsStr.length),\n ])\n for (const tool of tools) {\n table.push([\n ` ${tool.name}`,\n formatTokenCount(tool.description.length),\n formatByteCount(tool.description.length),\n getPercentage(tool.description.length),\n ])\n }\n\n // Messages and total\n table.push(\n [\n 'Messages',\n formatTokenCount(messagesStr.length),\n formatByteCount(messagesStr.length),\n getPercentage(messagesStr.length),\n ],\n ['Total', formatTokenCount(total), formatByteCount(total), '100%'],\n )\n\n return table.toString()\n}\n\nconst command: Command = {\n name: 'ctx-viz',\n description:\n 'Show token usage breakdown for the current conversation context',\n isEnabled: true,\n isHidden: false,\n type: 'local',\n\n userFacingName() {\n return this.name\n },\n\n async call(_args: string, cmdContext: { options: { tools: Tool[] } }) {\n // Get tools and system prompt with injected context\n const [systemPromptRaw, sysContext] = await Promise.all([\n getSystemPrompt(),\n getContext(),\n ])\n\n const rawTools = cmdContext.options.tools\n\n // Full system prompt with context sections injected\n let systemPrompt = systemPromptRaw.join('\\n')\n for (const [name, content] of Object.entries(sysContext)) {\n systemPrompt += `\\n<context name=\"${name}\">${content}</context>`\n }\n\n // Get full tool definitions including prompts and schemas\n const tools = rawTools.map(t => {\n // Get full prompt and schema\n const fullPrompt = t.prompt({ safeMode: false })\n const schema = JSON.stringify(\n 'inputJSONSchema' in t && t.inputJSONSchema\n ? t.inputJSONSchema\n : zodToJsonSchema(t.inputSchema),\n )\n\n return {\n name: t.name,\n description: `${fullPrompt}\\n\\nSchema:\\n${schema}`,\n }\n })\n\n // Get current messages from REPL\n const messages = getMessagesGetter()()\n\n const sections = getContextSections(systemPrompt)\n return createSummaryTable(systemPrompt, sections, tools, messages)\n },\n}\n\nexport default command\n", "import React from 'react'\nimport type { Command } from '../types'\nimport { Doctor } from '#ui-ink/screens/Doctor'\nimport { PRODUCT_NAME } from '#core/constants/product'\n\nconst doctor: Command = {\n name: 'doctor',\n description: `Checks the health of your ${PRODUCT_NAME} installation`,\n isEnabled: true,\n isHidden: false,\n userFacingName() {\n return 'doctor'\n },\n type: 'local-jsx',\n call(onDone) {\n const element = React.createElement(Doctor, {\n onDone,\n doctorMode: true,\n })\n return Promise.resolve(element)\n },\n}\n\nexport default doctor\n", "import type { Command } from '#cli-commands'\nimport { PRODUCT_COMMAND, PRODUCT_NAME } from '#core/constants/product'\nimport {\n getCustomCommandDirectories,\n hasCustomCommands,\n type CustomCommandWithScope,\n} from '#cli-services/customCommands'\nimport * as React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { getTheme } from '#core/utils/theme'\nimport { PressEnterToContinue } from './PressEnterToContinue'\nimport { MACRO } from '#core/constants/macros'\n\n/**\n * Help Component - Interactive help system with progressive disclosure\n *\n * This component provides a comprehensive help interface that progressively\n * reveals information to avoid overwhelming users. It categorizes commands\n * into built-in and custom types, providing clear guidance on usage.\n *\n * The progressive disclosure pattern (count-based) ensures users can absorb\n * information at their own pace while maintaining a responsive interface.\n */\nfunction isCustomCommandWithScope(cmd: Command): cmd is CustomCommandWithScope {\n if (cmd.type !== 'prompt') return false\n const scope = (cmd as unknown as Record<string, unknown>).scope\n return scope === 'project' || scope === 'user'\n}\n\nexport function Help({\n commands,\n onClose,\n}: {\n commands: Command[]\n onClose: () => void\n}): React.ReactNode {\n const theme = getTheme()\n const moreHelp = `Learn more at: ${MACRO.README_URL}`\n\n // Filter out hidden commands from the help display\n const filteredCommands = commands.filter(cmd => !cmd.isHidden)\n\n // Custom commands loaded from disk carry a scope field.\n const customCommands = filteredCommands.filter(isCustomCommandWithScope)\n\n const builtInCommands = filteredCommands.filter(\n cmd => !isCustomCommandWithScope(cmd),\n )\n\n // Progressive disclosure state for managing information flow\n const [count, setCount] = React.useState(0)\n\n // Timer-based progressive disclosure to prevent information overload\n React.useEffect(() => {\n const timer = setTimeout(() => {\n if (count < 3) {\n setCount(count + 1)\n }\n }, 250)\n\n return () => clearTimeout(timer)\n }, [count])\n\n // Handle Enter key to close help\n useInput((_, key) => {\n if (key.return) onClose()\n })\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text bold color={theme.kode}>\n {`${PRODUCT_NAME} v${MACRO.VERSION}`}\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\">\n <Text>\n {PRODUCT_NAME} is a beta research preview. Always review{' '}\n {PRODUCT_NAME}&apos;s responses, especially when running code.{' '}\n {PRODUCT_NAME} has read access to files in the current directory and\n can run commands and edit files with your permission.\n </Text>\n </Box>\n\n {count >= 1 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text bold>Usage Modes:</Text>\n <Text>\n \u2022 REPL: <Text bold>{PRODUCT_COMMAND}</Text> (interactive session)\n </Text>\n <Text>\n \u2022 Non-interactive:{' '}\n <Text bold>{PRODUCT_COMMAND} -p &quot;question&quot;</Text>\n </Text>\n <Box marginTop={1}>\n <Text>\n Run <Text bold>{PRODUCT_COMMAND} -h</Text> for all command line\n options\n </Text>\n </Box>\n </Box>\n )}\n\n {count >= 2 && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Common Tasks:</Text>\n <Text>\n \u2022 Ask questions about your codebase{' '}\n <Text color={getTheme().secondaryText}>\n &gt; How does foo.py work?\n </Text>\n </Text>\n <Text>\n \u2022 Edit files{' '}\n <Text color={getTheme().secondaryText}>\n &gt; Update bar.ts to...\n </Text>\n </Text>\n <Text>\n \u2022 Fix errors{' '}\n <Text color={getTheme().secondaryText}>&gt; cargo build</Text>\n </Text>\n <Text>\n \u2022 Run commands{' '}\n <Text color={getTheme().secondaryText}>&gt; /help</Text>\n </Text>\n <Text>\n \u2022 Run bash commands{' '}\n <Text color={getTheme().secondaryText}>&gt; !ls</Text>\n </Text>\n </Box>\n )}\n\n {count >= 3 && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Built-in Commands:</Text>\n\n <Box flexDirection=\"column\">\n {builtInCommands.map((cmd, i) => (\n <Box key={i} marginLeft={1}>\n <Text bold>{`/${cmd.name}`}</Text>\n <Text> - {cmd.description}</Text>\n </Box>\n ))}\n </Box>\n\n {customCommands.length > 0 && (\n <>\n <Box marginTop={1}>\n <Text bold>Custom Commands:</Text>\n </Box>\n\n <Box flexDirection=\"column\">\n {customCommands.map((cmd, i) => (\n <Box key={i} marginLeft={1}>\n <Text bold color={theme.kode}>{`/${cmd.name}`}</Text>\n <Text> - {cmd.description}</Text>\n {cmd.aliases && cmd.aliases.length > 0 && (\n <Text color={theme.secondaryText}>\n {' '}\n (aliases: {cmd.aliases.join(', ')})\n </Text>\n )}\n {/* Show scope indicator for debugging */}\n {cmd.scope && (\n <Text color={theme.secondaryText}> [{cmd.scope}]</Text>\n )}\n </Box>\n ))}\n </Box>\n </>\n )}\n\n {/* Show custom command directory information */}\n {hasCustomCommands() || customCommands.length > 0 ? (\n <Box marginTop={1}>\n <Text color={theme.secondaryText}>\n Custom commands loaded from:\n </Text>\n <Text color={theme.secondaryText}>\n \u2022 {getCustomCommandDirectories().userClaudeCommands} (`.claude`\n user scope)\n </Text>\n <Text color={theme.secondaryText}>\n \u2022 {getCustomCommandDirectories().projectClaudeCommands}{' '}\n (`.claude` project scope)\n </Text>\n <Text color={theme.secondaryText}>Skills loaded from:</Text>\n <Text color={theme.secondaryText}>\n \u2022 {getCustomCommandDirectories().userClaudeSkills} (`.claude`\n user scope)\n </Text>\n <Text color={theme.secondaryText}>\n \u2022 {getCustomCommandDirectories().projectClaudeSkills} (`.claude`\n project scope)\n </Text>\n <Text color={theme.secondaryText}>\n Use /refresh-commands to reload after changes\n </Text>\n </Box>\n ) : (\n <Box marginTop={1}>\n <Text color={theme.secondaryText}>\n Create custom commands by adding `.md` files to:\n </Text>\n <Text color={theme.secondaryText}>\n \u2022 {getCustomCommandDirectories().userClaudeCommands} (`.claude`\n user scope)\n </Text>\n <Text color={theme.secondaryText}>\n \u2022 {getCustomCommandDirectories().projectClaudeCommands}{' '}\n (`.claude` project scope)\n </Text>\n <Text color={theme.secondaryText}>\n Create skills by adding directories containing `SKILL.md` to:\n </Text>\n <Text color={theme.secondaryText}>\n \u2022 {getCustomCommandDirectories().userClaudeSkills} (`.claude`\n user scope)\n </Text>\n <Text color={theme.secondaryText}>\n \u2022 {getCustomCommandDirectories().projectClaudeSkills} (`.claude`\n project scope)\n </Text>\n <Text color={theme.secondaryText}>\n Use /refresh-commands to reload after creation\n </Text>\n </Box>\n )}\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text color={theme.secondaryText}>{moreHelp}</Text>\n </Box>\n\n <Box marginTop={2}>\n <PressEnterToContinue />\n </Box>\n </Box>\n )\n}\n", "import type { Command } from '../types'\nimport { Help } from '#ui-ink/components/Help'\nimport * as React from 'react'\n\nconst help = {\n type: 'local-jsx',\n name: 'help',\n description: 'Show help and available commands',\n isEnabled: true,\n isHidden: false,\n async call(onDone, context) {\n return <Help commands={context.options?.commands || []} onClose={onDone} />\n },\n userFacingName() {\n return 'help'\n },\n} satisfies Command\n\nexport default help\n", "import * as React from 'react'\nimport { OrderedList } from '@inkjs/ui'\nimport { Box, Text } from 'ink'\nimport {\n getCurrentProjectConfig,\n getGlobalConfig,\n saveCurrentProjectConfig,\n saveGlobalConfig,\n} from '#core/utils/config'\nimport { existsSync } from 'fs'\nimport { join } from 'path'\nimport { homedir } from 'os'\nimport { getTheme } from '#core/utils/theme'\nimport { RELEASE_NOTES } from '#core/constants/releaseNotes'\nimport { gt } from 'semver'\nimport { isDirEmpty } from '#core/utils/file'\nimport { MACRO } from '#core/constants/macros'\nimport { PROJECT_FILE, PRODUCT_NAME } from '#core/constants/product'\n\n// Function to mark onboarding as complete\nexport function markProjectOnboardingComplete(): void {\n const projectConfig = getCurrentProjectConfig()\n if (!projectConfig.hasCompletedProjectOnboarding) {\n saveCurrentProjectConfig({\n ...projectConfig,\n hasCompletedProjectOnboarding: true,\n })\n }\n}\n\nfunction markReleaseNotesSeen(): void {\n const config = getGlobalConfig()\n saveGlobalConfig({\n ...config,\n lastReleaseNotesSeen: MACRO.VERSION,\n })\n}\n\ntype Props = {\n workspaceDir: string\n}\n\nexport default function ProjectOnboarding({\n workspaceDir,\n}: Props): React.ReactNode {\n // Check if project onboarding has already been completed\n const projectConfig = getCurrentProjectConfig()\n const showOnboarding = !projectConfig.hasCompletedProjectOnboarding\n\n // Get previous version from config\n const config = getGlobalConfig()\n const previousVersion = config.lastReleaseNotesSeen\n\n // Get release notes to show\n let releaseNotesToShow: string[] = []\n if (!previousVersion || gt(MACRO.VERSION, previousVersion)) {\n releaseNotesToShow = RELEASE_NOTES[MACRO.VERSION] || []\n }\n const hasReleaseNotes = releaseNotesToShow.length > 0\n\n // Mark release notes as seen when they're displayed without onboarding\n React.useEffect(() => {\n if (hasReleaseNotes && !showOnboarding) {\n markReleaseNotesSeen()\n }\n }, [hasReleaseNotes, showOnboarding])\n\n // We only want to show either onboarding OR release notes (with preference for onboarding)\n // If there's no onboarding to show and no release notes, return null\n if (!showOnboarding && !hasReleaseNotes) {\n return null\n }\n\n // Load what we need for onboarding\n // NOTE: This whole component is statically rendered Once\n const workspaceHasProjectGuide = existsSync(join(workspaceDir, PROJECT_FILE))\n const isWorkspaceDirEmpty = isDirEmpty(workspaceDir)\n const shouldRecommendProjectGuide =\n !workspaceHasProjectGuide && !isWorkspaceDirEmpty\n\n const theme = getTheme()\n\n return (\n <Box flexDirection=\"column\" gap={1} padding={1} paddingBottom={0}>\n {showOnboarding && (\n <>\n <Text color={theme.secondaryText}>Tips for getting started:</Text>\n <OrderedList>\n {/* Collect all the items that should be displayed */}\n {(() => {\n const items = []\n\n if (isWorkspaceDirEmpty) {\n items.push(\n <React.Fragment key=\"workspace\">\n <OrderedList.Item>\n <Text color={theme.secondaryText}>\n Ask {PRODUCT_NAME} to create a new app or clone a\n repository.\n </Text>\n </OrderedList.Item>\n </React.Fragment>,\n )\n }\n if (shouldRecommendProjectGuide) {\n items.push(\n <React.Fragment key=\"projectGuide\">\n <OrderedList.Item>\n <Text color={theme.secondaryText}>\n Run <Text color={theme.text}>/init</Text> to create\n a&nbsp;\n {PROJECT_FILE} file with instructions for {PRODUCT_NAME}\n .\n </Text>\n </OrderedList.Item>\n </React.Fragment>,\n )\n }\n\n items.push(\n <React.Fragment key=\"questions\">\n <OrderedList.Item>\n <Text color={theme.secondaryText}>\n Ask {PRODUCT_NAME} questions about your codebase.\n </Text>\n </OrderedList.Item>\n </React.Fragment>,\n )\n\n items.push(\n <React.Fragment key=\"changes\">\n <OrderedList.Item>\n <Text color={theme.secondaryText}>\n Ask {PRODUCT_NAME} to implement changes to your codebase.\n </Text>\n </OrderedList.Item>\n </React.Fragment>,\n )\n\n return items\n })()}\n </OrderedList>\n </>\n )}\n\n {!showOnboarding && hasReleaseNotes && (\n <Box\n borderColor={getTheme().secondaryBorder}\n flexDirection=\"column\"\n marginRight={1}\n >\n <Box flexDirection=\"column\" gap={0}>\n <Box marginBottom={1}>\n <Text>\uD83C\uDD95 What&apos;s new in v{MACRO.VERSION}:</Text>\n </Box>\n <Box flexDirection=\"column\" marginLeft={1}>\n {releaseNotesToShow.map((note, noteIndex) => (\n <React.Fragment key={noteIndex}>\n <Text color={getTheme().secondaryText}>\u2022 {note}</Text>\n </React.Fragment>\n ))}\n </Box>\n </Box>\n </Box>\n )}\n\n {workspaceDir === homedir() && (\n <Text color={getTheme().warning}>\n Note: You have launched <Text bold>Kode-cli</Text> in your home\n directory. For the best experience, launch it in a project directory\n instead.\n </Text>\n )}\n </Box>\n )\n}\n", "// Release notes for each version\n// Don't add more than 3 for any version, since these show up in the UI upon launch.\nexport const RELEASE_NOTES: Record<string, string[]> = {\n '0.1.178': [\n \"New release notes now show you what's changed since you last launched\",\n ],\n}\n", "import type { Command } from '../types'\nimport { markProjectOnboardingComplete } from '#ui-ink/components/ProjectOnboarding'\nimport { PROJECT_FILE } from '#core/constants/product'\nconst command = {\n type: 'prompt',\n name: 'init',\n description: `Initialize a new ${PROJECT_FILE} file with codebase documentation`,\n isEnabled: true,\n isHidden: false,\n progressMessage: 'analyzing your codebase',\n userFacingName() {\n return 'init'\n },\n async getPromptForCommand(_args: string) {\n // Mark onboarding as complete when init command is run\n markProjectOnboardingComplete()\n return [\n {\n role: 'user',\n content: [\n {\n type: 'text',\n text: `Please analyze this codebase and create a ${PROJECT_FILE} file containing:\n1. Build/lint/test commands - especially for running a single test\n2. Code style guidelines including imports, formatting, types, naming conventions, error handling, etc.\n\nThe file you create will be given to agentic coding agents (such as yourself) that operate in this repository. Make it about 20 lines long.\nIf there's already a ${PROJECT_FILE}, improve it.\nIf there are Cursor rules (in .cursor/rules/ or .cursorrules) or Copilot rules (in .github/copilot-instructions.md), make sure to include them.`,\n },\n ],\n },\n ]\n },\n} satisfies Command\n\nexport default command\n", "import type { Command } from '../types'\nimport { logError } from '#core/utils/log'\nimport { execFileNoThrow } from '#core/utils/execFileNoThrow'\n\nconst isEnabled =\n process.platform === 'darwin' &&\n ['iTerm.app', 'Apple_Terminal'].includes(process.env.TERM_PROGRAM || '')\n\nconst listen: Command = {\n type: 'local',\n name: 'listen',\n description: 'Activates speech recognition and transcribes speech to text',\n isEnabled: isEnabled,\n isHidden: isEnabled,\n userFacingName() {\n return 'listen'\n },\n async call(_, { abortController }) {\n // Start dictation using AppleScript\n const script = `tell application \"System Events\" to tell \u00AC\n(the first process whose frontmost is true) to tell \u00AC\nmenu bar 1 to tell \u00AC\nmenu bar item \"Edit\" to tell \u00AC\nmenu \"Edit\" to tell \u00AC\nmenu item \"Start Dictation\" to \u00AC\nif exists then click it`\n\n const { stderr, code } = await execFileNoThrow(\n 'osascript',\n ['-e', script],\n abortController.signal,\n )\n\n if (code !== 0) {\n logError(`Failed to start dictation: ${stderr}`)\n return 'Failed to start dictation'\n }\n return 'Dictation started. Press esc to stop.'\n },\n}\n\nexport default listen\n", "import type { NormalizedMessage } from '#core/utils/messages'\nimport { getToolUseID } from '#core/utils/messages'\nimport type { ProgressMessage } from '#core/query'\n\nfunction intersects<A>(a: Set<A>, b: Set<A>): boolean {\n if (a.size === 0 || b.size === 0) return false\n for (const item of a) {\n if (b.has(item)) return true\n }\n return false\n}\n\nexport function shouldRenderReplMessageStatically(\n message: NormalizedMessage,\n messages: NormalizedMessage[],\n unresolvedToolUseIDs: Set<string>,\n): boolean {\n switch (message.type) {\n case 'user':\n case 'assistant': {\n const toolUseID = getToolUseID(message)\n if (!toolUseID) {\n return true\n }\n if (unresolvedToolUseIDs.has(toolUseID)) {\n return false\n }\n\n const correspondingProgressMessage = messages.find(\n _ => _.type === 'progress' && _.toolUseID === toolUseID,\n ) as ProgressMessage | null\n if (!correspondingProgressMessage) {\n return true\n }\n\n return !intersects(\n unresolvedToolUseIDs,\n correspondingProgressMessage.siblingToolUseIDs,\n )\n }\n case 'progress':\n return !intersects(unresolvedToolUseIDs, message.siblingToolUseIDs)\n }\n}\n\n/**\n * Ink <Static> expects its `items` list to be append-only.\n *\n * If we include static-eligible messages that appear *after* a transient message,\n * later transitions (transient -> static) would insert into the middle of the list,\n * causing Ink to replay tail items into the scrollback (duplicates).\n *\n * To prevent this, the static portion must always be a prefix of the ordered\n * message list.\n */\nexport function getReplStaticPrefixLength(\n orderedMessages: NormalizedMessage[],\n allMessages: NormalizedMessage[],\n unresolvedToolUseIDs: Set<string>,\n): number {\n for (let i = 0; i < orderedMessages.length; i++) {\n const message = orderedMessages[i]!\n if (\n !shouldRenderReplMessageStatically(\n message,\n allMessages,\n unresolvedToolUseIDs,\n )\n ) {\n return i\n }\n }\n return orderedMessages.length\n}\n", "import type { Command } from '../types'\nimport { getMessagesGetter } from '#core/messages'\nimport type { ProgressMessage } from '#core/query'\nimport {\n extractTag,\n getInProgressToolUseIDs,\n getToolUseID,\n getUnresolvedToolUseIDs,\n isNotEmptyMessage,\n normalizeMessages,\n reorderMessages,\n type NormalizedMessage,\n} from '#core/utils/messages'\nimport { getReplStaticPrefixLength } from '#cli-utils/replStaticSplit'\nimport { CACHE_PATHS } from '#core/utils/log'\nimport { existsSync, readdirSync, readFileSync, statSync } from 'fs'\nimport { join } from 'path'\n\nfunction isDebugMode(): boolean {\n return (\n process.argv.includes('--debug') || process.argv.includes('--debug-verbose')\n )\n}\n\nfunction safeStringify(value: unknown): string {\n const seen = new WeakSet<object>()\n return JSON.stringify(\n value,\n (_key, val) => {\n if (typeof val === 'function') return '[Function]'\n if (typeof val === 'bigint') return val.toString()\n if (val && typeof val === 'object') {\n if (seen.has(val)) return '[Circular]'\n seen.add(val)\n }\n return val\n },\n 2,\n )\n}\n\nfunction getProgressText(message: ProgressMessage): string {\n const first = message.content.message.content[0]\n if (!first || first.type !== 'text') return ''\n const rawText = String(first.text ?? '')\n if (rawText.startsWith('<tool-progress>')) {\n return extractTag(rawText, 'tool-progress') ?? rawText\n }\n return rawText\n}\n\nfunction getLatestMessagesLogFile(): { path: string; mtimeMs: number } | null {\n const dir = CACHE_PATHS.messages()\n if (!existsSync(dir)) return null\n const files = readdirSync(dir).filter(f => f.endsWith('.json'))\n if (files.length === 0) return null\n\n let best: { path: string; mtimeMs: number } | null = null\n for (const file of files) {\n const fullPath = join(dir, file)\n let mtimeMs = 0\n try {\n mtimeMs = statSync(fullPath).mtimeMs\n } catch {\n continue\n }\n if (!best || mtimeMs > best.mtimeMs) {\n best = { path: fullPath, mtimeMs }\n }\n }\n return best\n}\n\ntype ToolUseSummary = {\n toolUseID: string\n toolName: string | null\n occurrencesInNormalized: number\n progressMessagesInNormalized: number\n progressReplacements: number\n sawQueuedWaiting: boolean\n}\n\nfunction summarizeToolUses(normalized: NormalizedMessage[]): {\n toolUseIDs: string[]\n duplicates: string[]\n byID: ToolUseSummary[]\n} {\n const toolUseNameById = new Map<string, string>()\n const toolUseCounts = new Map<string, number>()\n\n const progressCounts = new Map<string, number>()\n const sawQueuedWaiting = new Set<string>()\n\n for (const message of normalized) {\n const toolUseID = getToolUseID(message)\n if (toolUseID) {\n toolUseCounts.set(toolUseID, (toolUseCounts.get(toolUseID) ?? 0) + 1)\n if (message.type === 'assistant') {\n const first = message.message.content[0]\n if (first?.type === 'tool_use' && typeof first.name === 'string') {\n toolUseNameById.set(toolUseID, first.name)\n }\n }\n }\n\n if (message.type === 'progress') {\n progressCounts.set(\n message.toolUseID,\n (progressCounts.get(message.toolUseID) ?? 0) + 1,\n )\n if (getProgressText(message).trim() === 'Waiting\u2026') {\n sawQueuedWaiting.add(message.toolUseID)\n }\n }\n }\n\n const toolUseIDs = [...toolUseCounts.keys()]\n toolUseIDs.sort()\n\n const duplicates = toolUseIDs.filter(id => (toolUseCounts.get(id) ?? 0) > 1)\n\n const byID: ToolUseSummary[] = toolUseIDs.map(toolUseID => {\n const occurrencesInNormalized = toolUseCounts.get(toolUseID) ?? 0\n const progressMessagesInNormalized = progressCounts.get(toolUseID) ?? 0\n return {\n toolUseID,\n toolName: toolUseNameById.get(toolUseID) ?? null,\n occurrencesInNormalized,\n progressMessagesInNormalized,\n progressReplacements: Math.max(0, progressMessagesInNormalized - 1),\n sawQueuedWaiting: sawQueuedWaiting.has(toolUseID),\n }\n })\n\n return { toolUseIDs, duplicates, byID }\n}\n\nfunction summarizeOrderedMessages(ordered: NormalizedMessage[]): Array<{\n index: number\n uuid: string\n type: NormalizedMessage['type']\n toolUseID: string | null\n preview: string | null\n}> {\n return ordered.map((m, index) => {\n let preview: string | null = null\n if (m.type === 'progress') {\n preview = getProgressText(m).trim() || null\n } else if (m.type === 'assistant') {\n const first = m.message.content[0]\n if (first?.type === 'text') {\n preview = String(first.text ?? '').slice(0, 120)\n } else if (first?.type === 'tool_use') {\n const name = typeof first.name === 'string' ? first.name : 'UnknownTool'\n preview = `${name}(${safeStringify(first.input ?? {}).slice(0, 120)})`\n }\n } else if (m.type === 'user') {\n const content = m.message.content as unknown\n if (Array.isArray(content) && content.length > 0) {\n const first = content[0]\n if (first?.type === 'tool_result') {\n preview = `tool_result(${String(first.tool_use_id ?? '')})`\n } else if (first?.type === 'text') {\n preview = String(first.text ?? '').slice(0, 120)\n }\n } else if (typeof content === 'string') {\n preview = content.slice(0, 120)\n }\n }\n\n return {\n index,\n uuid: String(m.uuid),\n type: m.type,\n toolUseID: getToolUseID(m),\n preview,\n }\n })\n}\n\nconst command: Command = {\n name: 'messages-debug',\n description: 'Dump messages + derived UI state for debugging',\n isEnabled: isDebugMode(),\n isHidden: true,\n type: 'local',\n\n userFacingName() {\n return this.name\n },\n\n async call(args: string) {\n const wantFull = args.includes('--full') || args.includes('--json')\n\n const rawMessages = getMessagesGetter()()\n const normalized = normalizeMessages(rawMessages).filter(isNotEmptyMessage)\n const ordered = reorderMessages(normalized)\n const unresolvedToolUseIDs = getUnresolvedToolUseIDs(normalized)\n const inProgressToolUseIDs = getInProgressToolUseIDs(normalized)\n const replStaticPrefixLength = getReplStaticPrefixLength(\n ordered,\n normalized,\n unresolvedToolUseIDs,\n )\n\n const { toolUseIDs, duplicates, byID } = summarizeToolUses(normalized)\n\n const latestLog = getLatestMessagesLogFile()\n const latestLogContent =\n latestLog && existsSync(latestLog.path)\n ? (() => {\n try {\n return JSON.parse(readFileSync(latestLog.path, 'utf8'))\n } catch {\n return null\n }\n })()\n : null\n\n const payload = {\n projectMessagesDir: CACHE_PATHS.messages(),\n latestMessagesLog: latestLog\n ? { path: latestLog.path, mtimeMs: latestLog.mtimeMs }\n : null,\n latestMessagesLogJson: latestLogContent,\n summary: {\n rawMessageCount: rawMessages.length,\n normalizedMessageCount: normalized.length,\n orderedMessageCount: ordered.length,\n replStaticPrefixLength,\n unresolvedToolUseIDs: [...unresolvedToolUseIDs],\n inProgressToolUseIDs: [...inProgressToolUseIDs],\n toolUseIDs,\n duplicateToolUseIDs: duplicates,\n toolUseSummary: byID,\n },\n orderedMessages: summarizeOrderedMessages(ordered),\n ...(wantFull ? { rawMessages } : {}),\n }\n\n return safeStringify(payload)\n },\n}\n\nexport default command\n", "import * as React from 'react'\nimport type { Command } from '../types'\nimport { ConsoleOAuthFlow } from '#ui-ink/components/ConsoleOAuthFlow'\nimport { clearTerminal } from '#cli-utils/terminal'\nimport { isLoggedInToAnthropic } from '#core/utils/auth'\nimport { useExitOnCtrlCD } from '#ui-ink/hooks/useExitOnCtrlCD'\nimport { Box, Text } from 'ink'\nimport { clearConversation } from './clear'\n\nexport default () =>\n ({\n type: 'local-jsx',\n name: 'login',\n description: isLoggedInToAnthropic()\n ? 'Switch ShareAI Lab accounts'\n : 'Sign in with your ShareAI Lab account',\n isEnabled: true,\n isHidden: false,\n async call(onDone, context) {\n await clearTerminal()\n return (\n <Login\n onDone={async () => {\n clearConversation(context)\n onDone()\n }}\n />\n )\n },\n userFacingName() {\n return 'login'\n },\n }) satisfies Command\n\nfunction Login(props: { onDone: () => void }) {\n const exitState = useExitOnCtrlCD(props.onDone)\n return (\n <Box flexDirection=\"column\">\n <ConsoleOAuthFlow onDone={props.onDone} />\n <Box marginLeft={3}>\n <Text dimColor>\n {exitState.pending ? (\n <>Press {exitState.keyName} again to exit</>\n ) : (\n ''\n )}\n </Text>\n </Box>\n </Box>\n )\n}\n", "import React, { useEffect, useState, useCallback } from 'react'\nimport { Static, Box, Text, useInput } from 'ink'\nimport { OAuthService, createAndStoreApiKey } from '#core/services/oauth'\nimport { getTheme } from '#core/utils/theme'\nimport { ASCII_LOGO } from '#core/constants/product'\nimport { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\nimport { logError } from '#core/utils/log'\nimport { clearTerminal } from '#cli-utils/terminal'\nimport { WelcomeBox } from './Onboarding'\nimport { sendNotification } from '#core/services/notifier'\nimport { ConsoleOAuthStatusMessage } from './ConsoleOAuthStatusMessage'\nimport { PASTE_HERE_MSG, type OAuthStatus } from './oauthTypes'\n\ntype Props = {\n onDone(): void\n}\n\nexport function ConsoleOAuthFlow({ onDone }: Props): React.ReactNode {\n const [oauthStatus, setOAuthStatus] = useState<OAuthStatus>({\n state: 'idle',\n })\n const theme = getTheme()\n\n const [pastedCode, setPastedCode] = useState('')\n const [cursorOffset, setCursorOffset] = useState(0)\n const [oauthService] = useState(() => new OAuthService())\n // After a few seconds we suggest the user to copy/paste url if the\n // browser did not open automatically. In this flow we expect the user to\n // copy the code from the browser and paste it in the terminal\n const [showPastePrompt, setShowPastePrompt] = useState(false)\n // we need a special clearing state to correctly re-render Static elements\n const [isClearing, setIsClearing] = useState(false)\n\n const textInputColumns = useTerminalSize().columns - PASTE_HERE_MSG.length - 1\n\n useEffect(() => {\n if (isClearing) {\n clearTerminal()\n setIsClearing(false)\n }\n }, [isClearing])\n\n // Retry logic\n useEffect(() => {\n if (oauthStatus.state === 'about_to_retry') {\n setIsClearing(true)\n setTimeout(() => {\n setOAuthStatus(oauthStatus.nextState)\n }, 1000)\n }\n }, [oauthStatus])\n\n useInput(async (_, key) => {\n if (key.return) {\n if (oauthStatus.state === 'idle') {\n setOAuthStatus({ state: 'ready_to_start' })\n } else if (oauthStatus.state === 'success') {\n await clearTerminal() // needed to clear out Static components\n onDone()\n } else if (oauthStatus.state === 'error' && oauthStatus.toRetry) {\n setPastedCode('')\n setOAuthStatus({\n state: 'about_to_retry',\n nextState: oauthStatus.toRetry,\n })\n }\n }\n })\n\n async function handleSubmitCode(value: string, url: string) {\n try {\n // Expecting format \"authorizationCode#state\" from the authorization callback URL\n const [authorizationCode, state] = value.split('#')\n\n if (!authorizationCode || !state) {\n setOAuthStatus({\n state: 'error',\n message: 'Invalid code. Please make sure the full code was copied',\n toRetry: { state: 'waiting_for_login', url },\n })\n return\n }\n\n // Track which path the user is taking (manual code entry)\n\n oauthService.processCallback({\n authorizationCode,\n state,\n useManualRedirect: true,\n })\n } catch (err) {\n logError(err)\n setOAuthStatus({\n state: 'error',\n message: (err as Error).message,\n toRetry: { state: 'waiting_for_login', url },\n })\n }\n }\n\n const startOAuth = useCallback(async () => {\n try {\n const result = await oauthService\n .startOAuthFlow(async url => {\n setOAuthStatus({ state: 'waiting_for_login', url })\n setTimeout(() => setShowPastePrompt(true), 3000)\n })\n .catch(err => {\n // Handle token exchange errors specifically\n if (err.message.includes('Token exchange failed')) {\n setOAuthStatus({\n state: 'error',\n message:\n 'Failed to exchange authorization code for access token. Please try again.',\n toRetry: { state: 'ready_to_start' },\n })\n } else {\n // Handle other errors\n setOAuthStatus({\n state: 'error',\n message: err.message,\n toRetry: { state: 'ready_to_start' },\n })\n }\n throw err\n })\n\n setOAuthStatus({ state: 'creating_api_key' })\n\n const apiKey = await createAndStoreApiKey(result.accessToken).catch(\n err => {\n setOAuthStatus({\n state: 'error',\n message: 'Failed to create API key: ' + err.message,\n toRetry: { state: 'ready_to_start' },\n })\n\n throw err\n },\n )\n\n if (apiKey) {\n setOAuthStatus({ state: 'success', apiKey })\n sendNotification({ message: 'Kode login successful' })\n } else {\n setOAuthStatus({\n state: 'error',\n message:\n \"Unable to create API key. The server accepted the request but didn't return a key.\",\n toRetry: { state: 'ready_to_start' },\n })\n }\n } catch (err) {}\n }, [oauthService, setShowPastePrompt])\n\n useEffect(() => {\n if (oauthStatus.state === 'ready_to_start') {\n startOAuth()\n }\n }, [oauthStatus.state, startOAuth])\n\n // We need to render the copy-able URL statically to prevent Ink <Text> from inserting\n // newlines in the middle of the URL (this breaks Safari). Because <Static> components are\n // only rendered once top-to-bottom, we also need to make everything above the URL static.\n const staticItems: Record<string, React.JSX.Element> = {}\n if (!isClearing) {\n staticItems.header = (\n <Box key=\"header\" flexDirection=\"column\" gap={1}>\n <WelcomeBox />\n <Box paddingBottom={1} paddingLeft={1}>\n <Text color={theme.kode}>{ASCII_LOGO}</Text>\n </Box>\n </Box>\n )\n }\n if (oauthStatus.state === 'waiting_for_login' && showPastePrompt) {\n staticItems.urlToCopy = (\n <Box flexDirection=\"column\" key=\"urlToCopy\" gap={1} paddingBottom={1}>\n <Box paddingX={1}>\n <Text dimColor>\n Browser didn&apos;t open? Use the url below to sign in:\n </Text>\n </Box>\n <Box width={1000}>\n <Text dimColor>{oauthStatus.url}</Text>\n </Box>\n </Box>\n )\n }\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Static\n items={Object.keys(staticItems)}\n children={(item: string) => staticItems[item]}\n />\n <Box paddingLeft={1} flexDirection=\"column\" gap={1}>\n <ConsoleOAuthStatusMessage\n oauthStatus={oauthStatus}\n theme={theme}\n showPastePrompt={showPastePrompt}\n pastedCode={pastedCode}\n onPastedCodeChange={setPastedCode}\n cursorOffset={cursorOffset}\n onCursorOffsetChange={setCursorOffset}\n textInputColumns={textInputColumns}\n onSubmitCode={handleSubmitCode}\n />\n </Box>\n </Box>\n )\n}\n", "import * as crypto from 'crypto'\nimport * as http from 'http'\nimport { IncomingMessage, ServerResponse } from 'http'\nimport * as url from 'url'\n\nimport { OAUTH_CONFIG } from '#core/constants/oauth'\nimport { openBrowser } from '#core/utils/browser'\nimport { logError } from '#core/utils/log'\nimport {\n AccountInfo,\n getGlobalConfig,\n saveGlobalConfig,\n normalizeApiKeyForConfig,\n} from '#core/utils/config'\n\n// Base64URL encoding function (RFC 4648)\nfunction base64URLEncode(buffer: Buffer): string {\n return buffer\n .toString('base64')\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '')\n}\n\nfunction generateCodeVerifier(): string {\n return base64URLEncode(crypto.randomBytes(32))\n}\n\nasync function generateCodeChallenge(verifier: string): Promise<string> {\n const encoder = new TextEncoder()\n const data = encoder.encode(verifier)\n const digest = await crypto.subtle.digest('SHA-256', data)\n return base64URLEncode(Buffer.from(digest))\n}\n\ntype OAuthTokenExchangeResponse = {\n access_token: string\n account?: {\n uuid: string\n email_address: string\n }\n organization?: {\n uuid: string\n name: string\n }\n}\n\nexport type OAuthResult = {\n accessToken: string\n}\n\nexport class OAuthService {\n private server: http.Server | null = null\n private codeVerifier: string\n private expectedState: string | null = null\n private pendingCodePromise: {\n resolve: (result: {\n authorizationCode: string\n useManualRedirect: boolean\n }) => void\n reject: (err: Error) => void\n } | null = null\n\n constructor() {\n this.codeVerifier = generateCodeVerifier()\n }\n\n private generateAuthUrls(\n codeChallenge: string,\n state: string,\n ): { autoUrl: string; manualUrl: string } {\n function makeUrl(isManual: boolean): string {\n const authUrl = new URL(OAUTH_CONFIG.AUTHORIZE_URL)\n authUrl.searchParams.append('client_id', OAUTH_CONFIG.CLIENT_ID)\n authUrl.searchParams.append('response_type', 'code')\n authUrl.searchParams.append(\n 'redirect_uri',\n isManual\n ? OAUTH_CONFIG.MANUAL_REDIRECT_URL\n : `http://localhost:${OAUTH_CONFIG.REDIRECT_PORT}/callback`,\n )\n authUrl.searchParams.append('scope', OAUTH_CONFIG.SCOPES.join(' '))\n authUrl.searchParams.append('code_challenge', codeChallenge)\n authUrl.searchParams.append('code_challenge_method', 'S256')\n authUrl.searchParams.append('state', state)\n return authUrl.toString()\n }\n\n return {\n autoUrl: makeUrl(false),\n manualUrl: makeUrl(true),\n }\n }\n\n async startOAuthFlow(\n authURLHandler: (url: string) => Promise<void>,\n ): Promise<OAuthResult> {\n const codeChallenge = await generateCodeChallenge(this.codeVerifier)\n const state = base64URLEncode(crypto.randomBytes(32))\n this.expectedState = state\n const { autoUrl, manualUrl } = this.generateAuthUrls(codeChallenge, state)\n\n const onReady = async () => {\n await authURLHandler(manualUrl)\n await openBrowser(autoUrl)\n }\n\n const { authorizationCode, useManualRedirect } = await new Promise<{\n authorizationCode: string\n useManualRedirect: boolean\n }>((resolve, reject) => {\n this.pendingCodePromise = { resolve, reject }\n this.startLocalServer(state, onReady)\n })\n\n // Exchange code for tokens\n const {\n access_token: accessToken,\n account,\n organization,\n } = await this.exchangeCodeForTokens(\n authorizationCode,\n state,\n useManualRedirect,\n )\n\n // Store account info\n if (account) {\n const accountInfo: AccountInfo = {\n accountUuid: account.uuid,\n emailAddress: account.email_address,\n organizationUuid: organization?.uuid,\n }\n const config = getGlobalConfig()\n config.oauthAccount = accountInfo\n saveGlobalConfig(config)\n }\n\n return { accessToken }\n }\n\n private startLocalServer(state: string, onReady?: () => void): void {\n if (this.server) {\n this.closeServer()\n }\n this.server = http.createServer(\n (req: IncomingMessage, res: ServerResponse) => {\n const parsedUrl = url.parse(req.url || '', true)\n\n if (parsedUrl.pathname === '/callback') {\n const authorizationCode = parsedUrl.query.code as string\n const returnedState = parsedUrl.query.state as string\n\n if (!authorizationCode) {\n res.writeHead(400)\n res.end('Authorization code not found')\n if (this.pendingCodePromise) {\n this.pendingCodePromise.reject(\n new Error('No authorization code received'),\n )\n }\n return\n }\n\n if (returnedState !== state) {\n res.writeHead(400)\n res.end('Invalid state parameter')\n if (this.pendingCodePromise) {\n this.pendingCodePromise.reject(\n new Error('Invalid state parameter'), // Possible CSRF attack\n )\n }\n return\n }\n\n res.writeHead(302, {\n Location: OAUTH_CONFIG.SUCCESS_URL,\n })\n res.end()\n\n this.processCallback({\n authorizationCode,\n state,\n useManualRedirect: false,\n })\n } else {\n res.writeHead(404)\n res.end()\n }\n },\n )\n\n this.server.listen(OAUTH_CONFIG.REDIRECT_PORT, async () => {\n onReady?.()\n })\n\n this.server.on('error', (err: Error) => {\n const portError = err as NodeJS.ErrnoException\n if (portError.code === 'EADDRINUSE') {\n const error = new Error(\n `Port ${OAUTH_CONFIG.REDIRECT_PORT} is already in use. Please ensure no other applications are using this port.`,\n )\n logError(error)\n this.closeServer()\n if (this.pendingCodePromise) {\n this.pendingCodePromise.reject(error)\n }\n return\n } else {\n logError(err)\n this.closeServer()\n if (this.pendingCodePromise) {\n this.pendingCodePromise.reject(err)\n }\n return\n }\n })\n }\n\n private async exchangeCodeForTokens(\n authorizationCode: string,\n state: string,\n useManualRedirect: boolean = false,\n ): Promise<OAuthTokenExchangeResponse> {\n const requestBody = {\n grant_type: 'authorization_code',\n code: authorizationCode,\n redirect_uri: useManualRedirect\n ? OAUTH_CONFIG.MANUAL_REDIRECT_URL\n : `http://localhost:${OAUTH_CONFIG.REDIRECT_PORT}/callback`,\n client_id: OAUTH_CONFIG.CLIENT_ID,\n code_verifier: this.codeVerifier,\n state,\n }\n\n const response = await fetch(OAUTH_CONFIG.TOKEN_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestBody),\n })\n\n if (!response.ok) {\n throw new Error(`Token exchange failed: ${response.statusText}`)\n }\n\n const data = await response.json()\n return data\n }\n\n processCallback({\n authorizationCode,\n state,\n useManualRedirect,\n }: {\n authorizationCode: string\n state: string\n useManualRedirect: boolean\n }): void {\n this.closeServer()\n\n if (state !== this.expectedState) {\n if (this.pendingCodePromise) {\n this.pendingCodePromise.reject(\n new Error('Invalid state parameter'), // Possible CSRF attack\n )\n this.pendingCodePromise = null\n }\n return\n }\n\n if (this.pendingCodePromise) {\n this.pendingCodePromise.resolve({ authorizationCode, useManualRedirect })\n this.pendingCodePromise = null\n }\n }\n\n private closeServer(): void {\n if (this.server) {\n this.server.close()\n this.server = null\n }\n }\n}\n\nexport async function createAndStoreApiKey(\n accessToken: string,\n): Promise<string | null> {\n try {\n // Call create_api_key endpoint\n const createApiKeyResp = await fetch(OAUTH_CONFIG.API_KEY_URL, {\n method: 'POST',\n headers: { Authorization: `Bearer ${accessToken}` },\n })\n\n let apiKeyData\n let errorText = ''\n\n try {\n apiKeyData = await createApiKeyResp.json()\n } catch (_e) {\n // If response is not valid JSON, get as text for error logging\n errorText = await createApiKeyResp.text()\n }\n\n if (createApiKeyResp.ok && apiKeyData && apiKeyData.raw_key) {\n const apiKey = apiKeyData.raw_key\n\n // Store in global config\n const config = getGlobalConfig()\n\n // Note: API key is now managed per model profile\n\n // Add to approved list\n if (!config.customApiKeyResponses) {\n config.customApiKeyResponses = { approved: [], rejected: [] }\n }\n if (!config.customApiKeyResponses.approved) {\n config.customApiKeyResponses.approved = []\n }\n\n const normalizedKey = normalizeApiKeyForConfig(apiKey)\n if (!config.customApiKeyResponses.approved.includes(normalizedKey)) {\n config.customApiKeyResponses.approved.push(normalizedKey)\n }\n\n // Save config\n saveGlobalConfig(config)\n\n // Reset the Anthropic client to force creation with new API key\n try {\n const { resetAnthropicClient } = await import('#core/ai/llm')\n resetAnthropicClient()\n } catch {}\n\n return apiKey\n }\n\n return null\n } catch (error) {\n throw error\n }\n}\n", "const BASE_CONFIG = {\n REDIRECT_PORT: 54545,\n MANUAL_REDIRECT_URL: '/oauth/code/callback',\n SCOPES: ['org:create_api_key', 'user:profile'] as const,\n}\n\n// Production OAuth configuration - Used in normal operation\nconst PROD_OAUTH_CONFIG = {\n ...BASE_CONFIG,\n AUTHORIZE_URL: '',\n TOKEN_URL: '',\n API_KEY_URL: '',\n SUCCESS_URL: '',\n CLIENT_ID: '',\n} as const\n\n// Default to prod config, override with test/staging if enabled\nexport const OAUTH_CONFIG = PROD_OAUTH_CONFIG\n", "import React from 'react'\nimport { Box, Text } from 'ink'\nimport { PRODUCT_NAME } from '#core/constants/product'\nimport type { Theme } from '#core/utils/theme'\nimport { SimpleSpinner } from './Spinner'\nimport TextInput from './TextInput'\nimport type { OAuthStatus } from './oauthTypes'\nimport { PASTE_HERE_MSG } from './oauthTypes'\n\ntype Props = {\n oauthStatus: OAuthStatus\n theme: Theme\n showPastePrompt: boolean\n pastedCode: string\n onPastedCodeChange: (value: string) => void\n cursorOffset: number\n onCursorOffsetChange: (value: number) => void\n textInputColumns: number\n onSubmitCode: (value: string, url: string) => void | Promise<void>\n}\n\nexport function ConsoleOAuthStatusMessage(props: Props): React.ReactNode {\n const {\n oauthStatus,\n theme,\n showPastePrompt,\n pastedCode,\n onPastedCodeChange,\n cursorOffset,\n onCursorOffsetChange,\n textInputColumns,\n onSubmitCode,\n } = props\n\n switch (oauthStatus.state) {\n case 'idle':\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Text bold>\n {PRODUCT_NAME} is billed based on API usage through your ShareAI Lab\n account.\n </Text>\n\n <Box>\n <Text>\n Pricing may evolve as we move towards general availability.\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text color={theme.permission}>\n Press <Text bold>Enter</Text> to login to your ShareAI Lab\n account\u2026\n </Text>\n </Box>\n </Box>\n )\n\n case 'waiting_for_login':\n return (\n <Box flexDirection=\"column\" gap={1}>\n {!showPastePrompt && (\n <Box>\n <SimpleSpinner />\n <Text>Opening browser to sign in\u2026</Text>\n </Box>\n )}\n\n {showPastePrompt && (\n <Box>\n <Text>{PASTE_HERE_MSG}</Text>\n <TextInput\n value={pastedCode}\n onChange={onPastedCodeChange}\n onSubmit={(value: string) =>\n onSubmitCode(value, oauthStatus.url)\n }\n cursorOffset={cursorOffset}\n onChangeCursorOffset={onCursorOffsetChange}\n columns={textInputColumns}\n />\n </Box>\n )}\n </Box>\n )\n\n case 'creating_api_key':\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Box>\n <SimpleSpinner />\n <Text>Creating API key for Kode\u2026</Text>\n </Box>\n </Box>\n )\n\n case 'about_to_retry':\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Text color={theme.permission}>Retrying\u2026</Text>\n </Box>\n )\n\n case 'success':\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Text color={theme.success}>\n Login successful. Press <Text bold>Enter</Text> to continue\u2026\n </Text>\n </Box>\n )\n\n case 'error':\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Text color={theme.error}>OAuth error: {oauthStatus.message}</Text>\n\n {oauthStatus.toRetry && (\n <Box marginTop={1}>\n <Text color={theme.permission}>\n Press <Text bold>Enter</Text> to retry.\n </Text>\n </Box>\n )}\n </Box>\n )\n\n default:\n return null\n }\n}\n", "import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { useEffect, useRef, useState } from 'react'\nimport { getTheme } from '#core/utils/theme'\nimport { sample } from 'lodash-es'\nimport { getSessionState } from '#core/utils/sessionState'\n// NB: The third character in this string is an emoji that\n// renders on Windows consoles with a green background\nconst CHARACTERS =\n process.platform === 'darwin'\n ? ['\u00B7', '\u2722', '\u2733', '\u2217', '\u273B', '\u273D']\n : ['\u00B7', '\u2722', '*', '\u2217', '\u273B', '\u273D']\n\nconst MESSAGES = [\n 'Accomplishing',\n 'Actioning',\n 'Actualizing',\n 'Baking',\n 'Brewing',\n 'Calculating',\n 'Cerebrating',\n 'Churning',\n 'Coding',\n 'Coalescing',\n 'Cogitating',\n 'Computing',\n 'Conjuring',\n 'Considering',\n 'Cooking',\n 'Crafting',\n 'Creating',\n 'Crunching',\n 'Deliberating',\n 'Determining',\n 'Doing',\n 'Effecting',\n 'Finagling',\n 'Forging',\n 'Forming',\n 'Generating',\n 'Hatching',\n 'Herding',\n 'Honking',\n 'Hustling',\n 'Ideating',\n 'Inferring',\n 'Manifesting',\n 'Marinating',\n 'Moseying',\n 'Mulling',\n 'Mustering',\n 'Musing',\n 'Noodling',\n 'Percolating',\n 'Pondering',\n 'Processing',\n 'Puttering',\n 'Reticulating',\n 'Ruminating',\n 'Schlepping',\n 'Shucking',\n 'Simmering',\n 'Smooshing',\n 'Spinning',\n 'Stewing',\n 'Synthesizing',\n 'Thinking',\n 'Transmuting',\n 'Vibing',\n 'Working',\n]\n\nexport function Spinner(): React.ReactNode {\n const frames = [...CHARACTERS, ...[...CHARACTERS].reverse()]\n const [frame, setFrame] = useState(0)\n const [elapsedTime, setElapsedTime] = useState(0)\n const message = useRef(sample(MESSAGES))\n const startTime = useRef(Date.now())\n\n useEffect(() => {\n const timer = setInterval(() => {\n setFrame(f => (f + 1) % frames.length)\n }, 120)\n\n return () => clearInterval(timer)\n }, [frames.length])\n\n useEffect(() => {\n const timer = setInterval(() => {\n setElapsedTime(Math.floor((Date.now() - startTime.current) / 1000))\n }, 1000)\n\n return () => clearInterval(timer)\n }, [])\n\n return (\n <Box flexDirection=\"row\" marginTop={1}>\n <Box flexWrap=\"nowrap\" height={1} width={2}>\n <Text color={getTheme().kode}>{frames[frame]}</Text>\n </Box>\n <Text color={getTheme().kode}>{message.current}\u2026 </Text>\n <Text color={getTheme().secondaryText}>\n ({elapsedTime}s \u00B7 <Text bold>esc</Text> to interrupt)\n </Text>\n <Text color={getTheme().secondaryText}>\n \u00B7 {getSessionState('currentError')}\n </Text>\n </Box>\n )\n}\n\nexport function SimpleSpinner(): React.ReactNode {\n const frames = [...CHARACTERS, ...[...CHARACTERS].reverse()]\n const [frame, setFrame] = useState(0)\n\n useEffect(() => {\n const timer = setInterval(() => {\n setFrame(f => (f + 1) % frames.length)\n }, 120)\n\n return () => clearInterval(timer)\n }, [frames.length])\n\n return (\n <Box flexWrap=\"nowrap\" height={1} width={2}>\n <Text color={getTheme().kode}>{frames[frame]}</Text>\n </Box>\n )\n}\n", "export type OAuthStatus =\n | { state: 'idle' }\n | { state: 'ready_to_start' }\n | { state: 'waiting_for_login'; url: string }\n | { state: 'creating_api_key' }\n | { state: 'about_to_retry'; nextState: OAuthStatus }\n | { state: 'success'; apiKey: string }\n | {\n state: 'error'\n message: string\n toRetry?: OAuthStatus\n }\n\nexport const PASTE_HERE_MSG = 'Paste code here if prompted > '\n", "import { USE_BEDROCK, USE_VERTEX } from './model'\nimport { getGlobalConfig } from './config'\n\nexport function isAnthropicAuthEnabled(): boolean {\n return false\n // return !(USE_BEDROCK || USE_VERTEX)\n}\n\nexport function isLoggedInToAnthropic(): boolean {\n return false\n // const config = getGlobalConfig()\n // return !!config.primaryApiKey\n}\n", "import * as React from 'react'\nimport type { Command } from '../types'\nimport { getGlobalConfig, saveGlobalConfig } from '#core/utils/config'\nimport { clearTerminal } from '#cli-utils/terminal'\nimport { Text } from 'ink'\n\nexport default {\n type: 'local-jsx',\n name: 'logout',\n description: 'Sign out from your ShareAI Lab account',\n isEnabled: true,\n isHidden: false,\n async call() {\n await clearTerminal()\n\n const config = getGlobalConfig()\n\n config.oauthAccount = undefined\n config.hasCompletedOnboarding = false\n\n if (config.customApiKeyResponses?.approved) {\n config.customApiKeyResponses.approved = []\n }\n\n saveGlobalConfig(config)\n\n const message = (\n <Text>Successfully logged out from your ShareAI Lab account.</Text>\n )\n\n setTimeout(() => {\n process.exit(0)\n }, 200)\n\n return message\n },\n userFacingName() {\n return 'logout'\n },\n} satisfies Command\n", "import type { Command } from '../types'\nimport {\n getClients,\n getMcprcServerStatus,\n listMCPServers,\n} from '#core/mcp/client'\nimport { PRODUCT_COMMAND } from '#core/constants/product'\nimport chalk from 'chalk'\nimport { getTheme } from '#core/utils/theme'\nimport { getProjectMcpServerDefinitions } from '#core/utils/config'\n\nconst mcp = {\n type: 'local',\n name: 'mcp',\n description: 'Show MCP server connection status',\n isEnabled: true,\n isHidden: false,\n async call() {\n const servers = listMCPServers()\n const clients = await getClients()\n const theme = getTheme()\n const projectFileServers = getProjectMcpServerDefinitions()\n\n if (Object.keys(servers).length === 0) {\n return [\n '\u23BF No MCP servers configured.',\n `\u23BF - Create \\`.mcp.json\\` or \\`.mcprc\\` in this project, or run \\`${PRODUCT_COMMAND} mcp add\\`.`,\n `\u23BF - Run \\`${PRODUCT_COMMAND} mcp list\\` to view configured servers.`,\n ].join('\\n')\n }\n\n const clientByName = new Map<string, (typeof clients)[number]>()\n for (const client of clients) {\n clientByName.set(client.name, client)\n }\n\n const serverStatusLines = Object.keys(servers)\n .sort((a, b) => a.localeCompare(b))\n .map(name => {\n const client = clientByName.get(name)\n if (client?.type === 'connected') {\n return `\u23BF \u2022 ${name}: ${chalk.hex(theme.success)('connected')}`\n }\n if (client?.type === 'failed') {\n return `\u23BF \u2022 ${name}: ${chalk.hex(theme.error)('failed')}`\n }\n\n if (projectFileServers.servers[name]) {\n const approval = getMcprcServerStatus(name)\n if (approval === 'pending') {\n return `\u23BF \u2022 ${name}: ${chalk.hex(theme.warning)('pending approval')}`\n }\n if (approval === 'rejected') {\n return `\u23BF \u2022 ${name}: ${chalk.hex(theme.error)('rejected')}`\n }\n }\n\n return `\u23BF \u2022 ${name}: ${chalk.hex(theme.error)('disconnected')}`\n })\n\n return ['\u23BF MCP Server Status', ...serverStatusLines].join('\\n')\n },\n userFacingName() {\n return 'mcp'\n },\n} satisfies Command\n\nexport default mcp\n", "import type { Command } from '../types'\nimport { reloadCustomCommands } from '#cli-services/customCommands'\nimport {\n addMarketplace,\n disableSkillPlugin,\n enableSkillPlugin,\n installSkillPlugin,\n listEnabledInstalledPluginPackRoots,\n listInstalledSkillPlugins,\n listMarketplaces,\n refreshAllMarketplacesAsync,\n refreshMarketplaceAsync,\n removeMarketplace,\n uninstallSkillPlugin,\n} from '#cli-services/skillMarketplace'\nimport {\n formatValidationResult,\n validatePluginOrMarketplacePath,\n} from '#cli-services/pluginValidation'\nimport { getCwd } from '#core/utils/state'\nimport { parse } from 'shell-quote'\nimport { getSessionPlugins } from '#core/utils/sessionPlugins'\n\ntype PluginScope = 'user' | 'project' | 'local'\nconst PLUGIN_SCOPES: readonly PluginScope[] = ['user', 'project', 'local']\n\nfunction parseTokens(input: string): string[] {\n const parts = parse(input)\n const out: string[] = []\n for (const part of parts) {\n if (typeof part === 'string') out.push(part)\n }\n return out\n}\n\nfunction parseCommonFlags(tokens: string[]): {\n scope: PluginScope\n force: boolean\n json: boolean\n rest: string[]\n} {\n let scope: PluginScope = 'user'\n let force = false\n let json = false\n const rest: string[] = []\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i]!\n if ((token === '--scope' || token === '-s') && i + 1 < tokens.length) {\n const next = tokens[i + 1] as string\n if (PLUGIN_SCOPES.includes(next as PluginScope)) {\n scope = next as PluginScope\n i++\n continue\n }\n }\n if (token === '--force') {\n force = true\n continue\n }\n if (token === '--json') {\n json = true\n continue\n }\n rest.push(token)\n }\n\n return { scope, force, json, rest }\n}\n\nasync function refreshCommandsCache(): Promise<void> {\n reloadCustomCommands()\n const { getCommands } = await import('../registry')\n getCommands.cache.clear?.()\n}\n\nasync function refreshPluginRuntimeFromInstalls(): Promise<string[]> {\n const installedRoots = listEnabledInstalledPluginPackRoots()\n const existingRoots = getSessionPlugins().map(p => p.rootDir)\n const dirs = Array.from(new Set([...existingRoots, ...installedRoots]))\n if (dirs.length === 0) return []\n\n const { configureSessionPlugins } =\n await import('#cli-services/pluginRuntime')\n const { errors } = await configureSessionPlugins({ pluginDirs: dirs })\n return errors\n}\n\nconst plugin = {\n type: 'local',\n name: 'plugin',\n description: 'Manage plugins and marketplaces',\n isEnabled: true,\n isHidden: false,\n async call(args: string, _context: any) {\n const tokens = parseTokens(args)\n if (tokens.length === 0) {\n return [\n 'Usage:',\n ' /plugin marketplace add <source>',\n ' /plugin marketplace list [--json]',\n ' /plugin marketplace remove <name>',\n ' /plugin marketplace update [name]',\n ' /plugin install <plugin> [--scope user|project|local] [--force]',\n ' /plugin uninstall <plugin> [--scope user|project|local]',\n ' /plugin enable <plugin> [--scope user|project|local]',\n ' /plugin disable <plugin> [--scope user|project|local]',\n ' /plugin list [--scope user|project|local] [--json]',\n ' /plugin validate <path>',\n ].join('\\n')\n }\n\n const [subcommand, ...restTokens] = tokens\n\n if (subcommand === 'marketplace') {\n const [action, ...actionArgs] = restTokens\n const { json } = parseCommonFlags(actionArgs)\n\n if (action === 'add') {\n const source = actionArgs.filter(t => !t.startsWith('--')).join(' ')\n if (!source) return 'Usage: /plugin marketplace add <source>'\n const { name } = await addMarketplace(source)\n await refreshCommandsCache()\n return `\u2713 Successfully added marketplace: ${name}`\n }\n\n if (action === 'list') {\n const marketplaces = listMarketplaces()\n if (json) return JSON.stringify(marketplaces, null, 2)\n const names = Object.keys(marketplaces).sort()\n if (names.length === 0) return 'No marketplaces configured'\n const lines: string[] = ['Configured marketplaces:']\n for (const name of names) {\n const entry: any = marketplaces[name]\n lines.push(` - ${name}`)\n const src = entry?.source\n if (src?.source === 'github')\n lines.push(` Source: GitHub (${src.repo})`)\n else if (src?.source === 'git')\n lines.push(` Source: Git (${src.url})`)\n else if (src?.source === 'url')\n lines.push(` Source: URL (${src.url})`)\n else if (src?.source === 'directory')\n lines.push(` Source: Directory (${src.path})`)\n else if (src?.source === 'file')\n lines.push(` Source: File (${src.path})`)\n else if (src?.source === 'npm')\n lines.push(` Source: NPM (${src.package})`)\n }\n return lines.join('\\n')\n }\n\n if (action === 'remove' || action === 'rm') {\n const name = actionArgs[0]?.trim()\n if (!name) return 'Usage: /plugin marketplace remove <name>'\n removeMarketplace(name)\n await refreshCommandsCache()\n return `\u2713 Successfully removed marketplace: ${name}`\n }\n\n if (action === 'update') {\n const name = actionArgs[0]?.trim()\n if (name) {\n await refreshMarketplaceAsync(name)\n await refreshCommandsCache()\n return `\u2713 Successfully updated marketplace: ${name}`\n }\n const marketplaces = listMarketplaces()\n const names = Object.keys(marketplaces)\n if (names.length === 0) return 'No marketplaces configured'\n await refreshAllMarketplacesAsync()\n await refreshCommandsCache()\n return `\u2713 Successfully updated ${names.length} marketplace(s)`\n }\n\n return `Unknown marketplace subcommand: ${String(action || '')}`\n }\n\n if (subcommand === 'install') {\n const { scope, force, rest } = parseCommonFlags(restTokens)\n const pluginArg = rest[0]\n if (!pluginArg)\n return 'Usage: /plugin install <plugin> [--scope user|project|local] [--force]'\n const result = installSkillPlugin(pluginArg, { scope, force })\n const record = listInstalledSkillPlugins()[result.pluginSpec]\n const isPack = record?.kind === 'plugin-pack'\n const loadErrors = await refreshPluginRuntimeFromInstalls()\n await refreshCommandsCache()\n const lines: string[] = []\n lines.push(\n `\u2713 Installed ${result.pluginSpec} (scope=${scope})${isPack ? ' [plugin pack]' : ''}`,\n )\n if (!isPack) {\n lines.push(`Skills: ${result.installedSkills.join(', ') || '(none)'}`)\n }\n if (loadErrors.length > 0) {\n lines.push('', 'Warnings:', ...loadErrors.map(e => `- ${e}`))\n }\n return lines.join('\\n')\n }\n\n if (\n subcommand === 'uninstall' ||\n subcommand === 'remove' ||\n subcommand === 'rm'\n ) {\n const { scope, rest } = parseCommonFlags(restTokens)\n const pluginArg = rest[0]\n if (!pluginArg)\n return 'Usage: /plugin uninstall <plugin> [--scope user|project|local]'\n const result = uninstallSkillPlugin(pluginArg, { scope })\n const loadErrors = await refreshPluginRuntimeFromInstalls()\n await refreshCommandsCache()\n const lines: string[] = []\n lines.push(`\u2713 Uninstalled ${result.pluginSpec} (scope=${scope})`)\n if (result.removedSkills.length > 0) {\n lines.push(`Skills: ${result.removedSkills.join(', ')}`)\n }\n if (loadErrors.length > 0) {\n lines.push('', 'Warnings:', ...loadErrors.map(e => `- ${e}`))\n }\n return lines.join('\\n')\n }\n\n if (subcommand === 'enable') {\n const { scope, rest } = parseCommonFlags(restTokens)\n const pluginArg = rest[0]\n if (!pluginArg)\n return 'Usage: /plugin enable <plugin> [--scope user|project|local]'\n const result = enableSkillPlugin(pluginArg, { scope })\n const loadErrors = await refreshPluginRuntimeFromInstalls()\n await refreshCommandsCache()\n const lines: string[] = []\n lines.push(`\u2713 Enabled ${result.pluginSpec} (scope=${scope})`)\n if (loadErrors.length > 0) {\n lines.push('', 'Warnings:', ...loadErrors.map(e => `- ${e}`))\n }\n return lines.join('\\n')\n }\n\n if (subcommand === 'disable') {\n const { scope, rest } = parseCommonFlags(restTokens)\n const pluginArg = rest[0]\n if (!pluginArg)\n return 'Usage: /plugin disable <plugin> [--scope user|project|local]'\n const result = disableSkillPlugin(pluginArg, { scope })\n const loadErrors = await refreshPluginRuntimeFromInstalls()\n await refreshCommandsCache()\n const lines: string[] = []\n lines.push(`\u2713 Disabled ${result.pluginSpec} (scope=${scope})`)\n if (loadErrors.length > 0) {\n lines.push('', 'Warnings:', ...loadErrors.map(e => `- ${e}`))\n }\n return lines.join('\\n')\n }\n\n if (subcommand === 'list') {\n const { scope, json } = parseCommonFlags(restTokens)\n const cwd = getCwd()\n const all = listInstalledSkillPlugins()\n const filtered = Object.fromEntries(\n Object.entries(all).filter(([, record]) => {\n const r: any = record\n if (!r || r.scope !== scope) return false\n if (scope === 'user') return true\n return r.projectPath === cwd\n }),\n )\n if (json) return JSON.stringify(filtered, null, 2)\n const specs = Object.keys(filtered).sort()\n if (specs.length === 0) return 'No plugins installed'\n const lines: string[] = [`Installed plugins (scope=${scope}):`]\n for (const spec of specs) {\n const r: any = filtered[spec]\n const enabled = r?.isEnabled === false ? 'disabled' : 'enabled'\n lines.push(` - ${spec} (${enabled})`)\n }\n return lines.join('\\n')\n }\n\n if (subcommand === 'validate') {\n const target = restTokens.join(' ').trim()\n if (!target) {\n return [\n 'Usage: /plugin validate <path>',\n ' kode plugin validate <path>',\n ].join('\\n')\n }\n const result = validatePluginOrMarketplacePath(target)\n return `Validating ${result.fileType} manifest: ${result.filePath}\\n${formatValidationResult(result)}`\n }\n\n return `Unknown /plugin subcommand: ${subcommand}`\n },\n userFacingName() {\n return 'plugin'\n },\n} satisfies Command\n\nexport default plugin\n", "import React, { useMemo, useRef } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport chalk from 'chalk'\nimport type { Command } from '../types'\nimport { Select } from '#ui-ink/components/CustomSelect/select'\nimport { getTheme } from '#core/utils/theme'\nimport {\n DEFAULT_OUTPUT_STYLE,\n getAvailableOutputStyles,\n getCurrentOutputStyle,\n resolveOutputStyleName,\n setCurrentOutputStyle,\n} from '#cli-services/outputStyles'\n\nconst HELP_ARGS = new Set(['help', '-h', '--help'])\nconst CURRENT_ARGS = new Set(['?', 'current'])\n\nfunction normalizeStyleName(value: string): string {\n return value.trim()\n}\n\nfunction OutputStyleMenu({\n onDone,\n}: {\n onDone: (result?: string) => void\n}): React.ReactNode {\n const theme = getTheme()\n const doneRef = useRef(false)\n\n const styles = useMemo(() => getAvailableOutputStyles(), [])\n const styleNames = useMemo(() => {\n const names = Object.keys(styles)\n return names.sort((a, b) => {\n if (a === DEFAULT_OUTPUT_STYLE && b !== DEFAULT_OUTPUT_STYLE) return -1\n if (b === DEFAULT_OUTPUT_STYLE && a !== DEFAULT_OUTPUT_STYLE) return 1\n return a.localeCompare(b)\n })\n }, [styles])\n\n const rawCurrentStyle = getCurrentOutputStyle()\n const resolvedCurrentStyle =\n resolveOutputStyleName(rawCurrentStyle) ?? DEFAULT_OUTPUT_STYLE\n\n const finish = (msg?: string) => {\n if (doneRef.current) return\n doneRef.current = true\n onDone(msg)\n }\n\n useInput((_input, key) => {\n if (key.escape) {\n finish(`Kept output style as ${chalk.bold(rawCurrentStyle)}`)\n }\n })\n\n return (\n <>\n <Box\n flexDirection=\"column\"\n gap={1}\n padding={1}\n borderStyle=\"round\"\n borderColor={theme.secondary}\n >\n <Text bold>Output style</Text>\n <Text dimColor>Current: {resolvedCurrentStyle}</Text>\n <Text>Choose a style:</Text>\n <Select\n options={styleNames.map(name => ({ label: name, value: name }))}\n defaultValue={resolvedCurrentStyle}\n visibleOptionCount={Math.min(10, Math.max(5, styleNames.length))}\n onChange={value => {\n const next = normalizeStyleName(value)\n setCurrentOutputStyle(next)\n finish(`Set output style to ${chalk.bold(next)}`)\n }}\n />\n </Box>\n <Box marginLeft={3}>\n <Text dimColor>\u2191\u2193 Navigate \u00B7 Enter select \u00B7 Esc cancel</Text>\n </Box>\n </>\n )\n}\n\nconst outputStyle = {\n type: 'local-jsx',\n name: 'output-style',\n description: 'Set the output style directly or from a selection menu',\n isEnabled: true,\n isHidden: false,\n argumentHint: '[style]',\n userFacingName() {\n return 'output-style'\n },\n async call(onDone, _context, args) {\n const raw = (args ?? '').trim()\n\n if (CURRENT_ARGS.has(raw)) {\n const current = getCurrentOutputStyle()\n onDone(`Current output style: ${current}`)\n return null\n }\n\n if (HELP_ARGS.has(raw)) {\n onDone(\n 'Run /output-style to open the output style selection menu, or /output-style [styleName] to set the output style.',\n )\n return null\n }\n\n if (raw) {\n const resolved = resolveOutputStyleName(raw)\n if (!resolved) {\n onDone(`Invalid output style: ${raw}`)\n return null\n }\n setCurrentOutputStyle(resolved)\n onDone(`Set output style to ${chalk.bold(resolved)}`)\n return null\n }\n\n return <OutputStyleMenu onDone={onDone} />\n },\n} satisfies Command\n\nexport default outputStyle\n", "import React from 'react'\nimport { render } from 'ink'\nimport { ModelConfig } from '#ui-ink/components/ModelConfig'\nimport { enableConfigs } from '#core/utils/config'\nimport { triggerModelConfigChange } from '#core/messages'\n\nexport const help = 'Change your AI provider and model settings'\nexport const description = 'Change your AI provider and model settings'\nexport const isEnabled = true\nexport const isHidden = false\nexport const name = 'model'\nexport const type = 'local-jsx'\n\nexport function userFacingName(): string {\n return name\n}\n\nexport async function call(\n onDone: (result?: string) => void,\n context: any,\n): Promise<React.ReactNode> {\n const { abortController } = context\n enableConfigs()\n abortController?.abort?.()\n return (\n <ModelConfig\n onClose={() => {\n // Force ModelManager reload to ensure UI sync - wait for completion before closing\n import('#core/utils/model').then(({ reloadModelManager }) => {\n reloadModelManager()\n // \uD83D\uDD27 Critical fix: Trigger global UI refresh after model config changes\n // This ensures PromptInput component detects ModelManager singleton state changes\n triggerModelConfigChange()\n // Only close after reload is complete to ensure UI synchronization\n onDone()\n })\n }}\n />\n )\n}\n", "import { Box, Text, useInput } from 'ink'\nimport * as React from 'react'\nimport { useState, useCallback } from 'react'\nimport figures from 'figures'\nimport { getTheme } from '#core/utils/theme'\nimport {\n getGlobalConfig,\n ModelPointerType,\n setModelPointer,\n} from '#core/utils/config'\nimport { getModelManager, reloadModelManager } from '#core/utils/model'\nimport { ModelListManager } from './ModelListManager'\n\ntype Props = {\n onClose: () => void\n}\n\ntype ModelPointerSetting = {\n id: ModelPointerType | 'add-new'\n label: string\n description: string\n value: string\n options: Array<{ id: string; name: string }>\n type: 'modelPointer' | 'action'\n onChange(value?: string): void\n}\n\nexport function ModelConfig({ onClose }: Props): React.ReactNode {\n const config = getGlobalConfig()\n const theme = getTheme()\n const [selectedIndex, setSelectedIndex] = useState(0)\n const [showModelListManager, setShowModelListManager] = useState(false)\n const [refreshKey, setRefreshKey] = useState(0)\n const [isDeleteMode, setIsDeleteMode] = useState(false)\n\n const modelManager = getModelManager()\n\n // Get available models for cycling (memoized) - without \"Add New Model\" option\n const availableModels = React.useMemo((): Array<{\n id: string\n name: string\n }> => {\n const profiles = modelManager.getAvailableModels()\n return profiles.map(p => ({ id: p.modelName, name: p.name }))\n }, [modelManager, refreshKey]) // \u4F9D\u8D56refreshKey\u6765\u5F3A\u5236\u66F4\u65B0\n\n // Create menu items: model pointers + \"Add New Model\" as separate item\n const menuItems = React.useMemo(() => {\n const modelSettings: ModelPointerSetting[] = [\n {\n id: 'main',\n label: 'Main Model',\n description: 'Primary model for general tasks and conversations',\n value: config.modelPointers?.main || '',\n options: availableModels,\n type: 'modelPointer' as const,\n onChange: (value: string) => handleModelPointerChange('main', value),\n },\n {\n id: 'task',\n label: 'Task Model',\n description: 'Model for TaskTool sub-agents and automation',\n value: config.modelPointers?.task || '',\n options: availableModels,\n type: 'modelPointer' as const,\n onChange: (value: string) => handleModelPointerChange('task', value),\n },\n {\n id: 'compact',\n label: 'Compact Model',\n description:\n 'Model used for context compression when nearing the context window',\n value: config.modelPointers?.compact || '',\n options: availableModels,\n type: 'modelPointer' as const,\n onChange: (value: string) => handleModelPointerChange('compact', value),\n },\n {\n id: 'quick',\n label: 'Quick Model',\n description: 'Fast model for simple operations and utilities',\n value: config.modelPointers?.quick || '',\n options: availableModels,\n type: 'modelPointer' as const,\n onChange: (value: string) => handleModelPointerChange('quick', value),\n },\n ]\n\n // Add menu actions as separate menu items\n return [\n ...modelSettings,\n {\n id: 'manage-models',\n label: 'Manage Model List',\n description: 'View, add, and delete model configurations',\n value: '',\n options: [],\n type: 'action' as const,\n onChange: () => handleManageModels(),\n },\n ]\n }, [config.modelPointers, availableModels, refreshKey])\n\n const handleModelPointerChange = (\n pointer: ModelPointerType,\n modelId: string,\n ) => {\n // Direct model assignment\n setModelPointer(pointer, modelId)\n reloadModelManager()\n // Force re-render to show updated assignment\n setRefreshKey(prev => prev + 1)\n }\n\n const handleManageModels = () => {\n // Launch ModelListManager for model library management\n setShowModelListManager(true)\n }\n\n const handleModelConfigurationComplete = () => {\n // Model configuration is complete, return to model config screen\n setShowModelListManager(false)\n // \u89E6\u53D1\u7EC4\u4EF6\u5237\u65B0\uFF0C\u91CD\u65B0\u52A0\u8F7D\u53EF\u7528\u6A21\u578B\u5217\u8868\n setRefreshKey(prev => prev + 1)\n // \u5C06\u7126\u70B9\u91CD\u7F6E\u5230 \"Manage Model Library\" \u9009\u9879\n const manageIndex = menuItems.findIndex(item => item.id === 'manage-models')\n if (manageIndex !== -1) {\n setSelectedIndex(manageIndex)\n }\n }\n\n // Handle keyboard input\n const handleInput = useCallback(\n (input: string, key: any) => {\n if (key.escape) {\n if (isDeleteMode) {\n setIsDeleteMode(false) // Exit delete mode\n } else {\n onClose()\n }\n } else if (input === 'd' && !isDeleteMode) {\n setIsDeleteMode(true) // Enter delete mode\n } else if (key.upArrow) {\n setSelectedIndex(prev => Math.max(0, prev - 1))\n } else if (key.downArrow) {\n setSelectedIndex(prev => Math.min(menuItems.length - 1, prev + 1))\n } else if (key.return || input === ' ') {\n const setting = menuItems[selectedIndex]\n\n if (isDeleteMode && setting.type === 'modelPointer' && setting.value) {\n // Delete mode: clear the pointer assignment (not delete the model config)\n setModelPointer(setting.id as ModelPointerType, '')\n reloadModelManager()\n setRefreshKey(prev => prev + 1)\n setIsDeleteMode(false) // Exit delete mode after clearing assignment\n } else if (setting.type === 'modelPointer') {\n // Normal mode: cycle through available models\n if (setting.options.length === 0) {\n // No models available, redirect to model library management\n handleManageModels()\n return\n }\n const currentIndex = setting.options.findIndex(\n opt => opt.id === setting.value,\n )\n const nextIndex = (currentIndex + 1) % setting.options.length\n const nextOption = setting.options[nextIndex]\n if (nextOption) {\n setting.onChange(nextOption.id)\n }\n } else if (setting.type === 'action') {\n // Execute action (like \"Add New Model\")\n setting.onChange()\n }\n }\n },\n [selectedIndex, menuItems, onClose, isDeleteMode, modelManager],\n )\n\n useInput(handleInput, {\n isActive: !showModelListManager,\n })\n\n // If showing ModelListManager, render it directly\n if (showModelListManager) {\n return <ModelListManager onClose={handleModelConfigurationComplete} />\n }\n\n // Main configuration screen - completely following Config component layout\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={1}\n marginTop={1}\n >\n <Box flexDirection=\"column\" minHeight={2} marginBottom={1}>\n <Text bold>\n Model Configuration{isDeleteMode ? ' - CLEAR MODE' : ''}\n </Text>\n <Text dimColor>\n {isDeleteMode\n ? 'Press Enter/Space to clear selected pointer assignment, Esc to cancel'\n : availableModels.length === 0\n ? 'No models configured. Use \"Configure New Model\" to add your first model.'\n : 'Configure which models to use for different tasks. Space to cycle, Enter to configure.'}\n </Text>\n </Box>\n\n {menuItems.map((setting, i) => {\n const isSelected = i === selectedIndex\n let displayValue = ''\n let actionText = ''\n\n if (setting.type === 'modelPointer') {\n const currentModel = setting.options.find(\n opt => opt.id === setting.value,\n )\n displayValue = currentModel?.name || '(not configured)'\n actionText = isSelected ? ' [Space to cycle]' : ''\n } else if (setting.type === 'action') {\n displayValue = ''\n actionText = isSelected ? ' [Enter to configure]' : ''\n }\n\n return (\n <Box key={setting.id} flexDirection=\"column\">\n <Box>\n <Box width={44}>\n <Text color={isSelected ? 'blue' : undefined}>\n {isSelected ? figures.pointer : ' '} {setting.label}\n </Text>\n </Box>\n <Box>\n {setting.type === 'modelPointer' && (\n <Text\n color={\n displayValue !== '(not configured)'\n ? theme.success\n : theme.warning\n }\n >\n {displayValue}\n </Text>\n )}\n {actionText && <Text color=\"blue\">{actionText}</Text>}\n </Box>\n </Box>\n {isSelected && (\n <Box paddingLeft={2} marginBottom={1}>\n <Text dimColor>{setting.description}</Text>\n </Box>\n )}\n </Box>\n )\n })}\n\n <Box\n marginTop={1}\n paddingTop={1}\n borderTopColor={theme.secondaryBorder}\n borderStyle=\"single\"\n borderTop\n borderLeft={false}\n borderRight={false}\n borderBottom={false}\n >\n <Text dimColor>\n {isDeleteMode\n ? 'CLEAR MODE: Press Enter/Space to clear assignment, Esc to cancel'\n : availableModels.length === 0\n ? 'Use \u2191/\u2193 to navigate, Enter to configure new model, Esc to exit'\n : 'Use \u2191/\u2193 to navigate, Space to cycle models, Enter to configure, d to clear, Esc to exit'}\n </Text>\n </Box>\n </Box>\n )\n}\n", "import { Box, Text, useInput } from 'ink'\nimport * as React from 'react'\nimport { useState, useCallback } from 'react'\nimport figures from 'figures'\nimport { getTheme } from '#core/utils/theme'\nimport { getGlobalConfig, ModelPointerType } from '#core/utils/config'\nimport { getModelManager } from '#core/utils/model'\nimport { useExitOnCtrlCD } from '#ui-ink/hooks/useExitOnCtrlCD'\nimport { ModelSelector } from './ModelSelector'\n\ntype Props = {\n onClose: () => void\n}\n\nexport function ModelListManager({ onClose }: Props): React.ReactNode {\n const config = getGlobalConfig()\n const theme = getTheme()\n const [selectedIndex, setSelectedIndex] = useState(0)\n const [showModelSelector, setShowModelSelector] = useState(false)\n const [isDeleteMode, setIsDeleteMode] = useState(false)\n const [refreshKey, setRefreshKey] = useState(0)\n const exitState = useExitOnCtrlCD(onClose)\n\n const modelManager = getModelManager()\n const availableModels = modelManager.getAvailableModels()\n\n // Create menu items: existing models + \"Add New Model\"\n const menuItems = React.useMemo(() => {\n const modelItems = availableModels.map(model => ({\n id: model.modelName,\n name: model.name,\n provider: model.provider,\n usedBy: getModelUsage(model.modelName),\n type: 'model' as const,\n }))\n\n return [\n {\n id: 'add-new',\n name: '+ Add New Model',\n provider: '',\n usedBy: [],\n type: 'action' as const,\n },\n ...modelItems,\n ]\n }, [availableModels, config.modelPointers, refreshKey])\n\n // Check which pointers are using this model\n function getModelUsage(modelName: string): ModelPointerType[] {\n const usage: ModelPointerType[] = []\n const pointers: ModelPointerType[] = ['main', 'task', 'compact', 'quick']\n\n pointers.forEach(pointer => {\n if (config.modelPointers?.[pointer] === modelName) {\n usage.push(pointer)\n }\n })\n\n return usage\n }\n\n const handleDeleteModel = (modelName: string) => {\n // Remove the model\n modelManager.removeModel(modelName)\n\n // The removeModel function should already clear the pointers,\n // but let's ensure UI refreshes\n setRefreshKey(prev => prev + 1)\n setIsDeleteMode(false)\n }\n\n const handleAddNewModel = () => {\n setShowModelSelector(true)\n }\n\n const handleModelConfigurationComplete = () => {\n setShowModelSelector(false)\n setRefreshKey(prev => prev + 1)\n }\n\n // Handle keyboard input\n const handleInput = useCallback(\n (input: string, key: any) => {\n if (key.escape) {\n if (isDeleteMode) {\n setIsDeleteMode(false)\n } else {\n onClose()\n }\n } else if (input === 'd' && !isDeleteMode && availableModels.length > 1) {\n setIsDeleteMode(true)\n } else if (key.upArrow) {\n setSelectedIndex(prev => Math.max(0, prev - 1))\n } else if (key.downArrow) {\n setSelectedIndex(prev => Math.min(menuItems.length - 1, prev + 1))\n } else if (key.return || input === ' ') {\n const item = menuItems[selectedIndex]\n\n if (isDeleteMode && item.type === 'model') {\n // Prevent deleting the last model\n if (availableModels.length <= 1) {\n setIsDeleteMode(false) // Exit delete mode\n return\n }\n // Prevent deleting model that is currently set as main\n if (config.modelPointers?.main === item.id) {\n setIsDeleteMode(false) // Exit delete mode\n return\n }\n handleDeleteModel(item.id)\n } else if (item.type === 'action') {\n handleAddNewModel()\n }\n // Note: Remove any pointer switching functionality here\n }\n },\n [selectedIndex, menuItems, onClose, isDeleteMode, availableModels.length],\n )\n\n useInput(handleInput, { isActive: !showModelSelector })\n\n // If showing ModelSelector, render it directly\n if (showModelSelector) {\n return (\n <ModelSelector\n onDone={handleModelConfigurationComplete}\n onCancel={handleModelConfigurationComplete}\n skipModelType={true}\n isOnboarding={false}\n abortController={new AbortController()}\n />\n )\n }\n\n // Main model list screen\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={isDeleteMode ? 'red' : theme.secondaryBorder}\n paddingX={1}\n marginTop={1}\n >\n <Box flexDirection=\"column\" minHeight={2} marginBottom={1}>\n <Text bold color={isDeleteMode ? 'red' : undefined}>\n Manage Model List{isDeleteMode ? ' - DELETE MODE' : ''}\n {exitState.pending\n ? ` (press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n <Text dimColor>\n {isDeleteMode ? (\n availableModels.length <= 1 ? (\n 'Cannot delete the last model, Esc to cancel'\n ) : (\n 'Press Enter/Space to DELETE selected model (cannot delete main), Esc to cancel'\n )\n ) : (\n <>\n Navigate: \u2191\u2193 | Select: Enter |{' '}\n <Text bold color=\"red\">\n Delete: d\n </Text>{' '}\n | Exit: Esc\n </>\n )}\n </Text>\n </Box>\n\n {menuItems.map((item, i) => {\n const isSelected = i === selectedIndex\n\n return (\n <Box key={item.id} flexDirection=\"column\" marginBottom={1}>\n <Box>\n <Box width={50}>\n <Text\n color={\n isSelected ? (isDeleteMode ? 'red' : 'blue') : undefined\n }\n >\n {isSelected ? figures.pointer : ' '} {item.name}\n </Text>\n </Box>\n <Box>\n {item.type === 'model' && (\n <>\n <Text color={theme.secondaryText}>({item.provider})</Text>\n {item.usedBy.length > 0 && (\n <Box marginLeft={1}>\n <Text color={theme.success}>\n [Active: {item.usedBy.join(', ')}]\n </Text>\n </Box>\n )}\n {item.usedBy.length === 0 && (\n <Box marginLeft={1}>\n <Text color={theme.secondaryText}>[Available]</Text>\n </Box>\n )}\n </>\n )}\n {item.type === 'action' && (\n <Text color={theme.suggestion}>\n {isSelected ? '[Press Enter to add new model]' : ''}\n </Text>\n )}\n </Box>\n </Box>\n {isSelected && item.type === 'action' && (\n <Box paddingLeft={2} marginTop={1}>\n <Text dimColor>\n Configure a new model and add it to your library\n </Text>\n </Box>\n )}\n {isSelected &&\n isDeleteMode &&\n item.type === 'model' &&\n config.modelPointers?.main === item.id && (\n <Box paddingLeft={2} marginTop={1}>\n <Text color=\"yellow\">\n Cannot delete: This model is currently set as main\n </Text>\n </Box>\n )}\n </Box>\n )\n })}\n\n <Box\n marginTop={1}\n paddingTop={1}\n borderTopColor={theme.secondaryBorder}\n borderStyle=\"single\"\n borderTop\n borderLeft={false}\n borderRight={false}\n borderBottom={false}\n >\n <Text dimColor>\n {isDeleteMode ? (\n availableModels.length <= 1 ? (\n 'Cannot delete the last model - press Esc to cancel'\n ) : (\n 'DELETE MODE: Press Enter/Space to delete (cannot delete main model), Esc to cancel'\n )\n ) : availableModels.length <= 1 ? (\n 'Use \u2191/\u2193 to navigate, Enter to add new, Esc to exit (cannot delete last model)'\n ) : (\n <>\n Use \u2191/\u2193 to navigate,{' '}\n <Text bold color=\"red\">\n d to delete model\n </Text>\n , Enter to add new, Esc to exit\n </>\n )}\n </Text>\n </Box>\n </Box>\n )\n}\n", "import React from 'react'\nimport type { Command } from '../types'\nimport { ModelStatusDisplay } from '#ui-ink/components/ModelStatusDisplay'\n\nconst modelstatus: Command = {\n name: 'modelstatus',\n description: 'Display current model configuration and status',\n aliases: ['ms', 'model-status'],\n isEnabled: true,\n isHidden: false,\n userFacingName() {\n return 'modelstatus'\n },\n type: 'local-jsx',\n call(onDone) {\n return Promise.resolve(<ModelStatusDisplay onClose={onDone} />)\n },\n}\n\nexport default modelstatus\n", "import React from 'react'\nimport { Text, Box } from 'ink'\nimport { getModelManager } from '#core/utils/model'\nimport { getGlobalConfig } from '#core/utils/config'\nimport { useExitOnCtrlCD } from '#ui-ink/hooks/useExitOnCtrlCD'\nimport { getTheme } from '#core/utils/theme'\n\ntype Props = {\n onClose: () => void\n}\n\nexport function ModelStatusDisplay({ onClose }: Props): React.ReactNode {\n const theme = getTheme()\n const exitState = useExitOnCtrlCD(onClose)\n\n try {\n const modelManager = getModelManager()\n const config = getGlobalConfig()\n\n // \u663E\u793A\u6240\u6709\u6A21\u578B\u6307\u9488\u7684\u5F53\u524D\u72B6\u6001\n const pointers = ['main', 'task', 'compact', 'quick'] as const\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\n \uD83D\uDCCA Current Model Status{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n <Text> </Text>\n\n {pointers.map(pointer => {\n try {\n const model = modelManager.getModel(pointer)\n if (model && model.name && model.provider) {\n return (\n <Box key={pointer} flexDirection=\"column\" marginBottom={1}>\n <Text>\n \uD83C\uDFAF{' '}\n <Text bold color={theme.kode}>\n {pointer.toUpperCase()}\n </Text>{' '}\n \u2192 {model.name}\n </Text>\n <Text color={theme.secondaryText}>\n {' '}\n Provider: {model.provider}\n </Text>\n <Text color={theme.secondaryText}>\n {' '}\n Model: {model.modelName || 'unknown'}\n </Text>\n <Text color={theme.secondaryText}>\n {' '}\n Context:{' '}\n {model.contextLength\n ? Math.round(model.contextLength / 1000)\n : 'unknown'}\n k tokens\n </Text>\n <Text color={theme.secondaryText}>\n {' '}\n Active: {model.isActive ? '\u2705' : '\u274C'}\n </Text>\n </Box>\n )\n } else {\n return (\n <Box key={pointer} flexDirection=\"column\" marginBottom={1}>\n <Text>\n \uD83C\uDFAF{' '}\n <Text bold color={theme.kode}>\n {pointer.toUpperCase()}\n </Text>{' '}\n \u2192 <Text color={theme.error}>\u274C Not configured</Text>\n </Text>\n </Box>\n )\n }\n } catch (pointerError) {\n return (\n <Box key={pointer} flexDirection=\"column\" marginBottom={1}>\n <Text>\n \uD83C\uDFAF{' '}\n <Text bold color={theme.kode}>\n {pointer.toUpperCase()}\n </Text>{' '}\n \u2192{' '}\n <Text color={theme.error}>\n \u274C Error: {String(pointerError)}\n </Text>\n </Text>\n </Box>\n )\n }\n })}\n\n <Text> </Text>\n <Text bold>\uD83D\uDCDA Available Models:</Text>\n\n {(() => {\n try {\n const availableModels = modelManager.getAvailableModels() || []\n\n if (availableModels.length === 0) {\n return (\n <Text color={theme.secondaryText}> No models configured</Text>\n )\n }\n\n return availableModels.map((model, index) => {\n try {\n const isInUse = pointers.some(p => {\n try {\n return (\n modelManager.getModel(p)?.modelName === model.modelName\n )\n } catch {\n return false\n }\n })\n\n return (\n <Box key={index} flexDirection=\"column\" marginBottom={1}>\n <Text>\n {' '}\n {isInUse ? '\uD83D\uDD04' : '\uD83D\uDCA4'} {model.name || 'Unnamed'}{' '}\n <Text color={theme.secondaryText}>\n ({model.provider || 'unknown'})\n </Text>\n </Text>\n <Text color={theme.secondaryText}>\n {' '}\n Model: {model.modelName || 'unknown'}\n </Text>\n <Text color={theme.secondaryText}>\n {' '}\n Context:{' '}\n {model.contextLength\n ? Math.round(model.contextLength / 1000)\n : 'unknown'}\n k tokens\n </Text>\n {model.lastUsed && (\n <Text color={theme.secondaryText}>\n {' '}\n Last used: {new Date(model.lastUsed).toLocaleString()}\n </Text>\n )}\n </Box>\n )\n } catch (modelError) {\n return (\n <Box key={index} flexDirection=\"column\" marginBottom={1}>\n <Text color={theme.error}>\n {' '}\n \u274C Model error: {String(modelError)}\n </Text>\n </Box>\n )\n }\n })\n } catch (availableModelsError) {\n return (\n <Text color={theme.error}>\n \u274C Error loading available models:{' '}\n {String(availableModelsError)}\n </Text>\n )\n }\n })()}\n\n <Text> </Text>\n <Text bold>\uD83D\uDD27 Debug Info:</Text>\n <Text color={theme.secondaryText}>\n {' '}\n ModelProfiles: {config.modelProfiles?.length || 0} configured\n </Text>\n {(() => {\n const legacyDefaultModelId = (\n config as unknown as Record<string, unknown>\n ).defaultModelId\n const value =\n typeof legacyDefaultModelId === 'string' &&\n legacyDefaultModelId.length > 0\n ? legacyDefaultModelId\n : null\n return (\n <Text color={theme.secondaryText}>\n {' '}\n DefaultModelId: {value ?? 'not set'}\n </Text>\n )\n })()}\n {config.modelPointers && (\n <>\n <Text color={theme.secondaryText}>\n {' '}\n ModelPointers configured:{' '}\n {Object.keys(config.modelPointers).length > 0 ? 'Yes' : 'No'}\n </Text>\n {Object.entries(config.modelPointers).map(([pointer, modelId]) => (\n <React.Fragment key={pointer}>\n <Text color={theme.secondaryText}>\n {' '}\n {pointer}: {modelId || 'not set'}\n </Text>\n </React.Fragment>\n ))}\n </>\n )}\n </Box>\n )\n } catch (error) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.error}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\n \uD83D\uDCCA Model Status Error{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n <Text color={theme.error}>\n \u274C Error reading model status: {String(error)}\n </Text>\n </Box>\n )\n }\n}\n", "import * as React from 'react'\nimport type { Command } from '../types'\nimport { Onboarding } from '#ui-ink/components/Onboarding'\nimport { clearTerminal } from '#cli-utils/terminal'\nimport { getGlobalConfig, saveGlobalConfig } from '#core/utils/config'\nimport { clearConversation } from './clear'\n\nexport default {\n type: 'local-jsx',\n name: 'onboarding',\n description: 'Run through the onboarding flow',\n isEnabled: true,\n isHidden: false,\n async call(onDone, context) {\n await clearTerminal()\n const config = getGlobalConfig()\n saveGlobalConfig({\n ...config,\n theme: 'dark',\n })\n\n return (\n <Onboarding\n onDone={async () => {\n clearConversation(context)\n onDone()\n }}\n />\n )\n },\n userFacingName() {\n return 'onboarding'\n },\n} satisfies Command\n", "import type { Command } from '../types'\n\nexport default {\n type: 'prompt',\n name: 'pr-comments',\n description: 'Get comments from a GitHub pull request',\n progressMessage: 'fetching PR comments',\n isEnabled: true,\n isHidden: false,\n userFacingName() {\n return 'pr-comments'\n },\n async getPromptForCommand(args: string) {\n return [\n {\n role: 'user',\n content: [\n {\n type: 'text',\n text: `You are an AI assistant integrated into a git-based version control system. Your task is to fetch and display comments from a GitHub pull request.\n\nFollow these steps:\n\n1. Use \\`gh pr view --json number,headRepository\\` to get the PR number and repository info\n2. Use \\`gh api /repos/{owner}/{repo}/issues/{number}/comments\\` to get PR-level comments\n3. Use \\`gh api /repos/{owner}/{repo}/pulls/{number}/comments\\` to get review comments. Pay particular attention to the following fields: \\`body\\`, \\`diff_hunk\\`, \\`path\\`, \\`line\\`, etc. If the comment references some code, consider fetching it using eg \\`gh api /repos/{owner}/{repo}/contents/{path}?ref={branch} | jq .content -r | base64 -d\\`\n4. Parse and format all comments in a readable way\n5. Return ONLY the formatted comments, with no additional text\n\nFormat the comments as:\n\n## Comments\n\n[For each comment thread:]\n- @author file.ts#line:\n \\`\\`\\`diff\n [diff_hunk from the API response]\n \\`\\`\\`\n > quoted comment text\n \n [any replies indented]\n\nIf there are no comments, return \"No comments found.\"\n\nRemember:\n1. Only show the actual comments, no explanatory text\n2. Include both PR-level and code review comments\n3. Preserve the threading/nesting of comment replies\n4. Show the file and line number context for code review comments\n5. Use jq to parse the JSON responses from the GitHub API\n\n${args ? 'Additional user input: ' + args : ''}\n`,\n },\n ],\n },\n ]\n },\n} satisfies Command\n", "import type { Command } from '../types'\nimport { reloadCustomCommands } from '#cli-services/customCommands'\nimport { debug as debugLogger } from '#core/utils/debugLogger'\nimport { logError } from '#core/utils/log'\n\n/**\n * Refresh Commands - Reload custom commands from filesystem\n *\n * This command provides a runtime mechanism to refresh the custom commands\n * cache without restarting the application. It's particularly useful during\n * development or when users are actively creating/modifying custom commands.\n *\n * The command follows the standard local command pattern used throughout\n * the project and provides detailed feedback about the refresh operation.\n */\nfunction getCommandScope(cmd: Command): 'project' | 'user' | null {\n const scope = (cmd as unknown as Record<string, unknown>).scope\n if (scope === 'project' || scope === 'user') return scope\n return null\n}\n\nconst refreshCommands = {\n type: 'local',\n name: 'refresh-commands',\n description: 'Reload custom commands from filesystem',\n isEnabled: true,\n isHidden: false,\n async call(_, context) {\n try {\n // Clear custom commands cache to force filesystem rescan\n reloadCustomCommands()\n\n const { getCommands } = await import('../registry')\n\n // Clear the main commands cache to ensure full reload\n // This ensures that changes to custom commands are reflected in the main command list\n getCommands.cache.clear?.()\n\n // Reload commands to get updated count and validate the refresh\n const commands = await getCommands()\n let projectCommands = 0\n let userCommands = 0\n for (const cmd of commands) {\n const scope = getCommandScope(cmd)\n if (scope === 'project') projectCommands++\n if (scope === 'user') userCommands++\n }\n const customCommandsCount = projectCommands + userCommands\n\n // Provide detailed feedback about the refresh operation\n return `\u2705 Commands refreshed successfully!\n\nCustom commands reloaded: ${customCommandsCount}\n- Project commands: ${projectCommands}\n- User commands: ${userCommands}\n\nUse /help to see updated command list.`\n } catch (error) {\n logError(error)\n debugLogger.warn('REFRESH_COMMANDS_FAILED', {\n error: error instanceof Error ? error.message : String(error),\n })\n return '\u274C Failed to refresh commands. Check debug logs for details.'\n }\n },\n userFacingName() {\n return 'refresh-commands'\n },\n} satisfies Command\n\nexport default refreshCommands\n", "import { MACRO } from '#core/constants/macros'\nimport type { Command } from '../types'\nimport { RELEASE_NOTES } from '#core/constants/releaseNotes'\n\nconst releaseNotes: Command = {\n description: 'Show release notes for the current or specified version',\n isEnabled: false,\n isHidden: false,\n name: 'release-notes',\n userFacingName() {\n return 'release-notes'\n },\n type: 'local',\n async call(args) {\n const currentVersion = MACRO.VERSION\n\n // If a specific version is requested, show that version's notes\n const requestedVersion = args ? args.trim() : currentVersion\n\n // Get the requested version's notes\n const notes = RELEASE_NOTES[requestedVersion]\n\n if (!notes || notes.length === 0) {\n return `No release notes available for version ${requestedVersion}.`\n }\n\n const header = `Release notes for version ${requestedVersion}:`\n const formattedNotes = notes.map(note => `\u2022 ${note}`).join('\\n')\n\n return `${header}\\n\\n${formattedNotes}`\n },\n}\n\nexport default releaseNotes\n", "import type { Command } from '../types'\n\nexport default {\n type: 'prompt',\n name: 'review',\n description: 'Review a pull request',\n isEnabled: true,\n isHidden: false,\n progressMessage: 'reviewing pull request',\n userFacingName() {\n return 'review'\n },\n async getPromptForCommand(args) {\n return [\n {\n role: 'user',\n content: [\n {\n type: 'text',\n text: `\n You are an expert code reviewer. Follow these steps:\n\n 1. If no PR number is provided in the args, use Bash(\"gh pr list\") to show open PRs\n 2. If a PR number is provided, use Bash(\"gh pr view <number>\") to get PR details\n 3. Use Bash(\"gh pr diff <number>\") to get the diff\n 4. Analyze the changes and provide a thorough code review that includes:\n - Overview of what the PR does\n - Analysis of code quality and style\n - Specific suggestions for improvements\n - Any potential issues or risks\n \n Keep your review concise but thorough. Focus on:\n - Code correctness\n - Following project conventions\n - Performance implications\n - Test coverage\n - Security considerations\n\n Format your review with clear sections and bullet points.\n\n PR number: ${args}\n `,\n },\n ],\n },\n ]\n },\n} satisfies Command\n", "import type { Command } from '../types'\nimport { getCwd } from '#core/utils/state'\nimport { getKodeAgentSessionId } from '#protocol/utils/kodeAgentSessionId'\nimport { appendSessionCustomTitleRecord } from '#protocol/utils/kodeAgentSessionLog'\n\nconst rename = {\n type: 'local',\n name: 'rename',\n description: 'Set a custom title for the current session',\n isEnabled: true,\n isHidden: false,\n userFacingName() {\n return 'rename'\n },\n async call(args, _context) {\n const customTitle = args.trim()\n if (!customTitle) return 'Usage: /rename <title>'\n\n appendSessionCustomTitleRecord({\n cwd: getCwd(),\n sessionId: getKodeAgentSessionId(),\n customTitle,\n })\n\n return `Session renamed to: ${customTitle}`\n },\n} satisfies Command\n\nexport default rename\n", "import type { Command } from '../types'\n\nexport default {\n type: 'prompt',\n name: 'statusline',\n description: \"Set up Kode's status line UI\",\n isEnabled: true,\n isHidden: false,\n progressMessage: 'setting up statusLine',\n disableNonInteractive: true,\n allowedTools: ['Task', 'Read(~/**)', 'Edit(~/.kode/settings.json)'],\n userFacingName() {\n return 'statusline'\n },\n async getPromptForCommand(args) {\n const prompt =\n args.trim() || 'Configure my statusLine from my shell PS1 configuration'\n return [\n {\n role: 'user',\n content: [\n {\n type: 'text',\n text: `Create a Task with subagent_type \"statusline-setup\" and the prompt ${JSON.stringify(\n prompt,\n )}`,\n },\n ],\n },\n ]\n },\n} satisfies Command\n", "import type { Command } from '../types'\nimport { getCwd } from '#core/utils/state'\nimport { getKodeAgentSessionId } from '#protocol/utils/kodeAgentSessionId'\nimport { appendSessionTagRecord } from '#protocol/utils/kodeAgentSessionLog'\n\nconst tag = {\n type: 'local',\n name: 'tag',\n description: 'Set a tag for the current session',\n isEnabled: true,\n isHidden: false,\n userFacingName() {\n return 'tag'\n },\n async call(args, _context) {\n const value = args.trim()\n if (!value) return 'Usage: /tag <tag>'\n\n appendSessionTagRecord({\n cwd: getCwd(),\n sessionId: getKodeAgentSessionId(),\n tag: value,\n })\n\n return `Session tagged as: ${value}`\n },\n} satisfies Command\n\nexport default tag\n", "import type { Command } from '../types'\nimport { getTodoRenderModel } from '#core/utils/todoRenderModel'\nimport { getTodos } from '#core/utils/todoStorage'\nimport { Box, Text, useInput } from 'ink'\nimport * as React from 'react'\n\nfunction TodosView({\n agentId,\n onClose,\n}: {\n agentId?: string\n onClose: () => void\n}): React.ReactNode {\n useInput((input, key) => {\n if (key.escape || (key.ctrl && (input === 'c' || input === 'd'))) {\n onClose()\n }\n })\n\n const todos = getTodos(agentId)\n const model = getTodoRenderModel(todos)\n\n if (model.kind === 'empty') {\n return <Text>{model.message}</Text>\n }\n\n const count = model.items.length\n const label = count === 1 ? 'todo' : 'todos'\n\n return (\n <Box flexDirection=\"column\">\n <Text>\n <Text bold>\n {count} {label}\n </Text>\n <Text>:</Text>\n </Text>\n <Box marginTop={1} flexDirection=\"column\">\n {model.items.map((item, index) => (\n <Box key={index} flexDirection=\"row\">\n <Text dimColor={item.checkboxDim}>{item.checkbox} </Text>\n <Text\n bold={item.contentBold}\n dimColor={item.contentDim}\n strikethrough={item.contentStrikethrough}\n >\n {item.content}\n </Text>\n </Box>\n ))}\n </Box>\n </Box>\n )\n}\n\nconst todos = {\n type: 'local-jsx',\n name: 'todos',\n description: 'List current todo items',\n isEnabled: true,\n isHidden: false,\n async call(onDone, context) {\n return <TodosView agentId={context.agentId} onClose={onDone} />\n },\n userFacingName() {\n return 'todos'\n },\n} satisfies Command\n\nexport default todos\nexport { TodosView as TodosViewForTests }\n", "import * as React from 'react'\nimport type { Command } from '../types'\nimport { ResumeConversation } from '#ui-ink/screens/ResumeConversation'\nimport { render } from 'ink'\nimport { listKodeAgentSessions } from '#protocol/utils/kodeAgentSessionResume'\n\nexport default {\n type: 'local-jsx',\n name: 'resume',\n description: 'Resume a previous conversation',\n isEnabled: true,\n isHidden: false,\n userFacingName() {\n return 'resume'\n },\n async call(onDone, context) {\n const { commands = [], tools = [], verbose = false } = context.options || {}\n const cwd = process.cwd()\n const sessions = listKodeAgentSessions({ cwd })\n if (sessions.length === 0) {\n onDone('No conversation found to resume')\n return null\n }\n render(\n <ResumeConversation\n cwd={cwd}\n commands={commands}\n context={{ unmount: onDone }}\n sessions={sessions}\n tools={tools}\n verbose={verbose}\n />,\n )\n // This return is here for type only\n return null\n },\n} satisfies Command\n", "import React from 'react'\nimport { AgentsUI } from './agents/ui'\n\nexport default {\n name: 'agents',\n description: 'Manage agent configurations',\n type: 'local-jsx' as const,\n isEnabled: true,\n isHidden: false,\n\n async call(onExit: (message?: string) => void) {\n return <AgentsUI onExit={onExit} />\n },\n\n userFacingName() {\n return 'agents'\n },\n}\n", "import React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport { Text } from 'ink'\nimport chalk from 'chalk'\nimport {\n clearAgentCache,\n getActiveAgents,\n getAllAgents,\n type AgentConfig,\n} from '#core/utils/agentLoader'\nimport { getAvailableTools, type Tool } from '../tooling'\nimport { deleteAgent } from '../storage'\nimport { AgentMenu } from './AgentMenu'\nimport { AgentsListView } from './AgentsListView'\nimport { CreateAgentWizard } from './CreateAgentWizard'\nimport { DeleteConfirm } from './DeleteConfirm'\nimport { EditAgent } from './EditAgent'\nimport { Instructions, Panel } from './components'\nimport type { AgentWithOverride, ModeState } from './types'\nimport { ViewAgent } from './ViewAgent'\n\nfunction computeOverrides(args: {\n allAgents: AgentConfig[]\n activeAgents: AgentConfig[]\n}): AgentWithOverride[] {\n const activeByType = new Map<string, AgentConfig>()\n for (const agent of args.activeAgents)\n activeByType.set(agent.agentType, agent)\n return args.allAgents.map(agent => {\n const active = activeByType.get(agent.agentType)\n const overriddenBy =\n active && active.source !== agent.source ? active.source : undefined\n return { ...agent, ...(overriddenBy ? { overriddenBy } : {}) }\n })\n}\n\nexport function AgentsUI({ onExit }: { onExit: (message?: string) => void }) {\n const [mode, setMode] = useState<ModeState>({\n mode: 'list-agents',\n source: 'all',\n })\n const [loading, setLoading] = useState(true)\n const [allAgents, setAllAgents] = useState<AgentConfig[]>([])\n const [activeAgents, setActiveAgents] = useState<AgentConfig[]>([])\n const [tools, setTools] = useState<Tool[]>([])\n const [changes, setChanges] = useState<string[]>([])\n\n const refresh = useCallback(async () => {\n clearAgentCache()\n const [all, active] = await Promise.all([getAllAgents(), getActiveAgents()])\n setAllAgents(all)\n setActiveAgents(active)\n }, [])\n\n useEffect(() => {\n let mounted = true\n ;(async () => {\n try {\n const [toolList] = await Promise.all([getAvailableTools(), refresh()])\n if (!mounted) return\n setTools(toolList)\n } finally {\n if (mounted) setLoading(false)\n }\n })()\n return () => {\n mounted = false\n }\n }, [refresh])\n\n const agentsWithOverride = useMemo(\n () => computeOverrides({ allAgents, activeAgents }),\n [allAgents, activeAgents],\n )\n\n const listAgentsForSource = useMemo(() => {\n const bySource = {\n 'built-in': agentsWithOverride.filter(a => a.source === 'built-in'),\n userSettings: agentsWithOverride.filter(a => a.source === 'userSettings'),\n projectSettings: agentsWithOverride.filter(\n a => a.source === 'projectSettings',\n ),\n policySettings: agentsWithOverride.filter(\n a => a.source === 'policySettings',\n ),\n flagSettings: agentsWithOverride.filter(a => a.source === 'flagSettings'),\n plugin: agentsWithOverride.filter(a => a.source === 'plugin'),\n }\n\n if (mode.mode !== 'list-agents') return []\n\n if (mode.source === 'all') {\n return [\n ...bySource['built-in'],\n ...bySource.userSettings,\n ...bySource.projectSettings,\n ...bySource.policySettings,\n ...bySource.flagSettings,\n ...bySource.plugin,\n ]\n }\n if (mode.source === 'built-in') return bySource['built-in']\n if (mode.source === 'userSettings') return bySource.userSettings\n if (mode.source === 'projectSettings') return bySource.projectSettings\n if (mode.source === 'policySettings') return bySource.policySettings\n if (mode.source === 'flagSettings') return bySource.flagSettings\n if (mode.source === 'plugin') return bySource.plugin\n return []\n }, [agentsWithOverride, mode])\n\n const dismiss = useCallback(() => {\n if (changes.length > 0) {\n onExit(`Agent changes:\\\\n${changes.join('\\\\n')}`)\n return\n }\n onExit('Agents dialog dismissed')\n }, [changes, onExit])\n\n if (loading) {\n return (\n <>\n <Panel title=\"Agents\" subtitle=\"Loading\u2026\">\n <Text dimColor>Loading agents\u2026</Text>\n </Panel>\n <Instructions />\n </>\n )\n }\n\n if (mode.mode === 'list-agents') {\n return (\n <AgentsListView\n source={mode.source}\n agents={listAgentsForSource}\n changes={changes}\n onCreateNew={() =>\n setMode({ mode: 'create-agent', previousMode: mode })\n }\n onSelect={agent =>\n setMode({ mode: 'agent-menu', agent, previousMode: mode })\n }\n onBack={dismiss}\n />\n )\n }\n\n if (mode.mode === 'create-agent') {\n return (\n <CreateAgentWizard\n tools={tools}\n existingAgents={activeAgents}\n onCancel={() => setMode(mode.previousMode)}\n onComplete={async message => {\n setChanges(prev => [...prev, message])\n await refresh()\n setMode({ mode: 'list-agents', source: 'all' })\n }}\n />\n )\n }\n\n if (mode.mode === 'agent-menu') {\n return (\n <AgentMenu\n agent={mode.agent}\n onCancel={() => setMode(mode.previousMode)}\n onChoose={value => {\n if (value === 'back') setMode(mode.previousMode)\n else if (value === 'view')\n setMode({\n mode: 'view-agent',\n agent: mode.agent,\n previousMode: mode,\n })\n else if (value === 'edit')\n setMode({\n mode: 'edit-agent',\n agent: mode.agent,\n previousMode: mode,\n })\n else if (value === 'delete')\n setMode({\n mode: 'delete-confirm',\n agent: mode.agent,\n previousMode: mode,\n })\n }}\n />\n )\n }\n\n if (mode.mode === 'view-agent') {\n return (\n <ViewAgent\n agent={mode.agent}\n tools={tools}\n onBack={() => setMode(mode.previousMode)}\n />\n )\n }\n\n if (mode.mode === 'edit-agent') {\n return (\n <EditAgent\n agent={mode.agent}\n tools={tools}\n onBack={() => setMode(mode.previousMode)}\n onSaved={async message => {\n setChanges(prev => [...prev, message])\n await refresh()\n setMode(mode.previousMode)\n }}\n />\n )\n }\n\n if (mode.mode === 'delete-confirm') {\n return (\n <DeleteConfirm\n agent={mode.agent}\n onCancel={() => setMode(mode.previousMode)}\n onConfirm={async () => {\n await deleteAgent(mode.agent)\n setChanges(prev => [\n ...prev,\n `Deleted agent: ${chalk.bold(mode.agent.agentType)}`,\n ])\n await refresh()\n setMode({ mode: 'list-agents', source: 'all' })\n }}\n />\n )\n }\n\n return null\n}\n", "import { getMCPTools } from '#core/mcp/client'\nimport { debug as debugLogger } from '#core/utils/debugLogger'\nimport { logError } from '#core/utils/log'\n\nexport type Tool = {\n name: string\n description?: string | (() => Promise<string>)\n}\n\n// Tool categories for sophisticated selection\nexport const TOOL_CATEGORIES = {\n read: ['Read', 'Glob', 'Grep', 'LS'],\n edit: ['Edit', 'MultiEdit', 'Write', 'NotebookEdit'],\n execution: ['Bash', 'BashOutput', 'KillBash'],\n web: ['WebFetch', 'WebSearch'],\n other: ['TodoWrite', 'ExitPlanMode', 'Task'],\n} as const\n\nfunction getCoreTools(): Tool[] {\n const tools: Tool[] = [\n { name: 'Read', description: 'Read files from filesystem' },\n { name: 'Write', description: 'Write files to filesystem' },\n { name: 'Edit', description: 'Edit existing files' },\n { name: 'MultiEdit', description: 'Make multiple edits to files' },\n { name: 'NotebookEdit', description: 'Edit Jupyter notebooks' },\n { name: 'Bash', description: 'Execute bash commands' },\n { name: 'Glob', description: 'Find files matching patterns' },\n { name: 'Grep', description: 'Search file contents' },\n { name: 'LS', description: 'List directory contents' },\n { name: 'WebFetch', description: 'Fetch web content' },\n { name: 'WebSearch', description: 'Search the web' },\n { name: 'TodoWrite', description: 'Manage task lists' },\n ]\n\n // Hide agent orchestration/self-control tools for subagent configs\n return tools.filter(t => t.name !== 'Task' && t.name !== 'ExitPlanMode')\n}\n\nexport async function getAvailableTools(): Promise<Tool[]> {\n const availableTools: Tool[] = []\n availableTools.push(...getCoreTools())\n\n try {\n const mcpTools = await getMCPTools()\n if (Array.isArray(mcpTools) && mcpTools.length > 0) {\n availableTools.push(...mcpTools)\n }\n } catch (error) {\n logError(error)\n debugLogger.warn('AGENT_TOOLING_MCP_LOAD_FAILED', {\n error: error instanceof Error ? error.message : String(error),\n })\n }\n\n return availableTools\n}\n", "import {\n existsSync,\n mkdirSync,\n renameSync,\n unlinkSync,\n writeFileSync,\n} from 'fs'\nimport { join } from 'path'\nimport { homedir } from 'os'\n\nimport { getCwd } from '#core/utils/state'\nimport type { AgentConfig } from '#core/utils/agentLoader'\nimport { debug as debugLogger } from '#core/utils/debugLogger'\nimport { logError } from '#core/utils/log'\n\nimport { generateAgentFileContent } from './generation'\n\nexport type AgentLocation = 'user' | 'project'\n\nconst PRIMARY_FOLDER = '.claude'\nconst LEGACY_FOLDER = '.kode'\nconst AGENTS_DIR = 'agents'\n\nexport function getAgentDirectory(location: AgentLocation): string {\n if (location === 'user') {\n return join(homedir(), PRIMARY_FOLDER, AGENTS_DIR)\n }\n return join(getCwd(), PRIMARY_FOLDER, AGENTS_DIR)\n}\n\nfunction getLegacyAgentDirectory(location: AgentLocation): string {\n if (location === 'user') {\n return join(homedir(), LEGACY_FOLDER, AGENTS_DIR)\n }\n return join(getCwd(), LEGACY_FOLDER, AGENTS_DIR)\n}\n\nexport function getPrimaryAgentFilePath(\n location: AgentLocation,\n agentType: string,\n): string {\n return join(getAgentDirectory(location), `${agentType}.md`)\n}\n\nfunction getLegacyAgentFilePath(\n location: AgentLocation,\n agentType: string,\n): string {\n return join(getLegacyAgentDirectory(location), `${agentType}.md`)\n}\n\nexport function getAgentFilePath(agent: AgentConfig): string {\n if (agent.location === 'built-in' || agent.location === 'plugin') {\n throw new Error(`Cannot get file path for ${agent.location} agents`)\n }\n\n const location = agent.location as AgentLocation\n const primary = getPrimaryAgentFilePath(location, agent.agentType)\n if (existsSync(primary)) return primary\n\n const legacy = getLegacyAgentFilePath(location, agent.agentType)\n if (existsSync(legacy)) return legacy\n\n return primary\n}\n\nexport function ensureDirectoryExists(location: AgentLocation): string {\n const dir = getAgentDirectory(location)\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true })\n }\n return dir\n}\n\nexport async function saveAgent(\n location: AgentLocation,\n agentType: string,\n description: string,\n tools: string[],\n systemPrompt: string,\n model?: string,\n color?: string,\n throwIfExists: boolean = true,\n): Promise<void> {\n ensureDirectoryExists(location)\n\n const filePath = getPrimaryAgentFilePath(location, agentType)\n const legacyPath = getLegacyAgentFilePath(location, agentType)\n\n if (throwIfExists && (existsSync(filePath) || existsSync(legacyPath))) {\n throw new Error(`Agent file already exists: ${filePath}`)\n }\n\n const tempFile = `${filePath}.tmp.${Date.now()}.${Math.random()\n .toString(36)\n .substr(2, 9)}`\n\n const toolsForFile: string[] | '*' =\n Array.isArray(tools) && tools.length === 1 && tools[0] === '*' ? '*' : tools\n const content = generateAgentFileContent(\n agentType,\n description,\n toolsForFile,\n systemPrompt,\n model,\n color,\n )\n\n try {\n writeFileSync(tempFile, content, { encoding: 'utf-8', flag: 'wx' })\n\n if (throwIfExists && (existsSync(filePath) || existsSync(legacyPath))) {\n try {\n unlinkSync(tempFile)\n } catch {}\n throw new Error(`Agent file already exists: ${filePath}`)\n }\n\n renameSync(tempFile, filePath)\n } catch (error) {\n try {\n if (existsSync(tempFile)) {\n unlinkSync(tempFile)\n }\n } catch (cleanupError) {\n logError(cleanupError)\n debugLogger.warn('AGENT_STORAGE_TEMP_CLEANUP_FAILED', {\n error:\n cleanupError instanceof Error\n ? cleanupError.message\n : String(cleanupError),\n })\n }\n throw error\n }\n}\n\nexport async function updateAgent(\n agent: AgentConfig,\n description: string,\n tools: string[] | '*',\n systemPrompt: string,\n color?: string,\n model?: string,\n): Promise<void> {\n if (agent.location === 'built-in' || agent.location === 'plugin') {\n throw new Error(`Cannot update ${agent.location} agents`)\n }\n\n const toolsForFile = tools.length === 1 && tools[0] === '*' ? '*' : tools\n const content = generateAgentFileContent(\n agent.agentType,\n description,\n toolsForFile,\n systemPrompt,\n model,\n color,\n )\n\n const location = agent.location as AgentLocation\n const primaryPath = getPrimaryAgentFilePath(location, agent.agentType)\n const legacyPath = getLegacyAgentFilePath(location, agent.agentType)\n const filePath = existsSync(primaryPath)\n ? primaryPath\n : existsSync(legacyPath)\n ? legacyPath\n : primaryPath\n\n ensureDirectoryExists(location)\n writeFileSync(filePath, content, { encoding: 'utf-8', flag: 'w' })\n}\n\nexport async function deleteAgent(agent: AgentConfig): Promise<void> {\n if (agent.location === 'built-in' || agent.location === 'plugin') {\n throw new Error(`Cannot delete ${agent.location} agents`)\n }\n\n const location = agent.location as AgentLocation\n const primaryPath = getPrimaryAgentFilePath(location, agent.agentType)\n const legacyPath = getLegacyAgentFilePath(location, agent.agentType)\n\n if (existsSync(primaryPath)) {\n unlinkSync(primaryPath)\n }\n if (existsSync(legacyPath)) {\n unlinkSync(legacyPath)\n }\n}\n", "import { randomUUID } from 'crypto'\nimport type { AgentConfig } from '#core/utils/agentLoader'\nimport { debug as debugLogger } from '#core/utils/debugLogger'\nimport { logError } from '#core/utils/log'\nimport { createUserMessage } from '#core/utils/messages'\n\nexport type GeneratedAgent = {\n identifier: string\n whenToUse: string\n systemPrompt: string\n}\n\nexport async function generateAgentWithClaude(\n prompt: string,\n): Promise<GeneratedAgent> {\n const { queryModel } = await import('#core/ai/llm')\n\n const systemPrompt = `You are an expert at creating AI agent configurations. Based on the user's description, generate a specialized agent configuration.\n\nReturn your response as a JSON object with exactly these fields:\n- identifier: A short, kebab-case identifier for the agent (e.g., \"code-reviewer\", \"security-auditor\")\n- whenToUse: A clear description of when this agent should be used (50-200 words)\n- systemPrompt: A comprehensive system prompt that defines the agent's role, capabilities, and behavior (200-500 words)\n\nMake the agent highly specialized and effective for the described use case.`\n\n try {\n const messages = [createUserMessage(prompt)]\n const response = await queryModel('main', messages, [systemPrompt])\n\n let responseText = ''\n const content = response.message?.content as unknown\n if (typeof content === 'string') {\n responseText = content\n } else if (Array.isArray(content)) {\n const asRecord = (value: unknown): Record<string, unknown> | null => {\n if (!value || typeof value !== 'object') return null\n return value as Record<string, unknown>\n }\n const textBlock = content.find(block => {\n const record = asRecord(block)\n return record?.type === 'text' && typeof record.text === 'string'\n })\n const record = asRecord(textBlock)\n responseText =\n record && typeof record.text === 'string' ? record.text : ''\n }\n\n if (!responseText) {\n throw new Error('No text content in model response')\n }\n\n const MAX_JSON_SIZE = 100_000 // 100KB\n const MAX_FIELD_LENGTH = 10_000\n\n if (responseText.length > MAX_JSON_SIZE) {\n throw new Error('Response too large')\n }\n\n let parsed: any\n try {\n parsed = JSON.parse(responseText.trim())\n } catch {\n const startIdx = responseText.indexOf('{')\n const endIdx = responseText.lastIndexOf('}')\n\n if (startIdx === -1 || endIdx === -1 || startIdx >= endIdx) {\n throw new Error('No valid JSON found in model response')\n }\n\n const jsonStr = responseText.substring(startIdx, endIdx + 1)\n if (jsonStr.length > MAX_JSON_SIZE) {\n throw new Error('JSON content too large')\n }\n\n try {\n parsed = JSON.parse(jsonStr)\n } catch (parseError) {\n throw new Error(\n `Invalid JSON format: ${parseError instanceof Error ? parseError.message : 'Unknown error'}`,\n )\n }\n }\n\n const identifier = String(parsed.identifier || '')\n .slice(0, 100)\n .trim()\n const whenToUse = String(parsed.whenToUse || '')\n .slice(0, MAX_FIELD_LENGTH)\n .trim()\n const agentSystemPrompt = String(parsed.systemPrompt || '')\n .slice(0, MAX_FIELD_LENGTH)\n .trim()\n\n if (!identifier || !whenToUse || !agentSystemPrompt) {\n throw new Error(\n 'Invalid response structure: missing required fields (identifier, whenToUse, systemPrompt)',\n )\n }\n\n const sanitize = (str: string) => str.replace(/[\\x00-\\x1F\\x7F-\\x9F]/g, '')\n\n const cleanIdentifier = sanitize(identifier)\n if (!/^[a-zA-Z0-9-]+$/.test(cleanIdentifier)) {\n throw new Error(\n 'Invalid identifier format: only letters, numbers, and hyphens allowed',\n )\n }\n\n return {\n identifier: cleanIdentifier,\n whenToUse: sanitize(whenToUse),\n systemPrompt: sanitize(agentSystemPrompt),\n }\n } catch (error) {\n logError(error)\n debugLogger.warn('AGENT_GENERATION_FAILED', {\n error: error instanceof Error ? error.message : String(error),\n })\n\n const fallbackId = prompt\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .slice(0, 30)\n\n return {\n identifier: fallbackId || 'custom-agent',\n whenToUse: `Use this agent when you need assistance with: ${prompt}`,\n systemPrompt: `You are a specialized assistant focused on helping with ${prompt}. Provide expert-level assistance in this domain.`,\n }\n }\n}\n\nexport function validateAgentType(\n agentType: string,\n existingAgents: AgentConfig[] = [],\n): {\n isValid: boolean\n errors: string[]\n warnings: string[]\n} {\n const errors: string[] = []\n const warnings: string[] = []\n\n if (!agentType) {\n errors.push('Agent type is required')\n return { isValid: false, errors, warnings }\n }\n\n if (!/^[a-zA-Z]/.test(agentType)) {\n errors.push('Agent type must start with a letter')\n }\n\n if (!/^[a-zA-Z0-9-]+$/.test(agentType)) {\n errors.push('Agent type can only contain letters, numbers, and hyphens')\n }\n\n if (agentType.length < 3) {\n errors.push('Agent type must be at least 3 characters long')\n }\n\n if (agentType.length > 50) {\n errors.push('Agent type must be less than 50 characters')\n }\n\n const reserved = ['help', 'exit', 'quit', 'agents', 'task']\n if (reserved.includes(agentType.toLowerCase())) {\n errors.push('This name is reserved')\n }\n\n const duplicate = existingAgents.find(a => a.agentType === agentType)\n if (duplicate) {\n errors.push(\n `An agent with this name already exists in ${duplicate.location}`,\n )\n }\n\n if (agentType.includes('--')) {\n warnings.push('Consider avoiding consecutive hyphens')\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n warnings,\n }\n}\n\nexport type AgentDraftForValidation = {\n agentType?: string\n whenToUse?: string\n systemPrompt?: string\n selectedTools?: string[]\n}\n\nexport function validateAgentConfig(\n config: AgentDraftForValidation,\n existingAgents: AgentConfig[] = [],\n): {\n isValid: boolean\n errors: string[]\n warnings: string[]\n} {\n const errors: string[] = []\n const warnings: string[] = []\n\n if (config.agentType) {\n const typeValidation = validateAgentType(config.agentType, existingAgents)\n errors.push(...typeValidation.errors)\n warnings.push(...typeValidation.warnings)\n }\n\n if (!config.whenToUse) {\n errors.push('Description is required')\n } else if (config.whenToUse.length < 10) {\n warnings.push(\n 'Description should be more descriptive (at least 10 characters)',\n )\n }\n\n if (!config.systemPrompt) {\n errors.push('System prompt is required')\n } else if (config.systemPrompt.length < 20) {\n warnings.push(\n 'System prompt might be too short for effective agent behavior',\n )\n }\n\n if (!config.selectedTools || config.selectedTools.length === 0) {\n warnings.push('No tools selected - agent will have limited capabilities')\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n warnings,\n }\n}\n\nexport function generateAgentFileContent(\n agentType: string,\n description: string,\n tools: string[] | '*',\n systemPrompt: string,\n model?: string,\n color?: string,\n): string {\n // Match legacy `.claude` agent file generator format:\n // - description uses literal \"\\n\" escapes\n // - tools is an optional comma-separated scalar (omitted when \"*\" / inherit-all)\n const desc = description.replace(/\\n/g, '\\\\n')\n\n const toolsList =\n tools === '*'\n ? undefined\n : Array.isArray(tools) && tools.length === 1 && tools[0] === '*'\n ? undefined\n : Array.isArray(tools)\n ? tools\n : undefined\n\n const toolsLine =\n toolsList === undefined ? '' : `\\ntools: ${toolsList.join(', ')}`\n const modelLine = model ? `\\nmodel: ${model}` : ''\n const colorLine = color ? `\\ncolor: ${color}` : ''\n\n return `---\\nname: ${agentType}\\ndescription: ${desc}${toolsLine}${modelLine}${colorLine}\\n---\\n\\n${systemPrompt}\\n`\n}\n", "import React from 'react'\nimport { Box, useInput } from 'ink'\nimport { Select } from '#ui-ink/components/CustomSelect/select'\nimport { Instructions, Panel } from './components'\nimport type { AgentWithOverride } from './types'\n\nfunction isAgentMenuChoice(\n value: string,\n): value is 'view' | 'edit' | 'delete' | 'back' {\n return (\n value === 'view' ||\n value === 'edit' ||\n value === 'delete' ||\n value === 'back'\n )\n}\n\nexport function AgentMenu(props: {\n agent: AgentWithOverride\n onChoose: (value: 'view' | 'edit' | 'delete' | 'back') => void\n onCancel: () => void\n}) {\n useInput((_input, key) => {\n if (key.escape) props.onCancel()\n })\n\n const isBuiltIn = props.agent.source === 'built-in'\n const options = [\n { label: 'View agent', value: 'view' },\n ...(isBuiltIn\n ? []\n : [\n { label: 'Edit agent', value: 'edit' },\n { label: 'Delete agent', value: 'delete' },\n ]),\n { label: 'Back', value: 'back' },\n ]\n\n return (\n <>\n <Panel title={props.agent.agentType}>\n <Box flexDirection=\"column\" marginTop={1}>\n <Select\n options={options}\n onChange={value => {\n if (isAgentMenuChoice(value)) props.onChoose(value)\n }}\n />\n </Box>\n </Panel>\n <Instructions />\n </>\n )\n}\n", "import React from 'react'\nimport { Box, Text } from 'ink'\nimport { getTheme } from '#core/utils/theme'\n\nexport function Panel(props: {\n title: string\n subtitle?: string\n borderColor?: string\n titleColor?: string\n children?: React.ReactNode\n}) {\n const theme = getTheme()\n return (\n <Box\n borderStyle=\"round\"\n borderColor={props.borderColor ?? theme.suggestion}\n flexDirection=\"column\"\n >\n <Box flexDirection=\"column\" paddingX={1}>\n <Text bold color={props.titleColor ?? theme.text}>\n {props.title}\n </Text>\n {props.subtitle ? <Text dimColor>{props.subtitle}</Text> : null}\n </Box>\n <Box paddingX={1} flexDirection=\"column\">\n {props.children}\n </Box>\n </Box>\n )\n}\n\nexport function Instructions({\n instructions = 'Press \u2191\u2193 to navigate \u00B7 Enter to select \u00B7 Esc to go back',\n}: {\n instructions?: string\n}) {\n return (\n <Box marginLeft={3}>\n <Text dimColor>{instructions}</Text>\n </Box>\n )\n}\n", "import React, { useEffect, useMemo, useState } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport figures from 'figures'\nimport { getTheme } from '#core/utils/theme'\nimport { Instructions, Panel } from './components'\nimport type { AgentSourceFilter, AgentWithOverride } from './types'\nimport { formatModelShort, titleForSource } from './utils'\n\nexport function AgentsListView(props: {\n source: AgentSourceFilter\n agents: AgentWithOverride[]\n changes: string[]\n onCreateNew?: () => void\n onSelect: (agent: AgentWithOverride) => void\n onBack: () => void\n}) {\n const theme = getTheme()\n\n const selectableAgents = useMemo(() => {\n const nonBuiltIn = props.agents.filter(a => a.source !== 'built-in')\n if (props.source === 'all') {\n return [\n ...nonBuiltIn.filter(a => a.source === 'userSettings'),\n ...nonBuiltIn.filter(a => a.source === 'projectSettings'),\n ...nonBuiltIn.filter(a => a.source === 'policySettings'),\n ]\n }\n return nonBuiltIn\n }, [props.agents, props.source])\n\n const [selectedAgent, setSelectedAgent] = useState<AgentWithOverride | null>(\n null,\n )\n const [onCreateOption, setOnCreateOption] = useState(true)\n\n useEffect(() => {\n if (props.onCreateNew) {\n setOnCreateOption(true)\n setSelectedAgent(null)\n return\n }\n if (!selectedAgent && selectableAgents.length > 0) {\n setSelectedAgent(selectableAgents[0] ?? null)\n }\n }, [props.onCreateNew, selectableAgents, selectedAgent])\n\n useInput((_input, key) => {\n if (key.escape) {\n props.onBack()\n return\n }\n\n if (key.return) {\n if (onCreateOption && props.onCreateNew) {\n props.onCreateNew()\n return\n }\n if (selectedAgent) props.onSelect(selectedAgent)\n return\n }\n\n if (!key.upArrow && !key.downArrow) return\n\n const hasCreate = Boolean(props.onCreateNew)\n const navigableCount = selectableAgents.length + (hasCreate ? 1 : 0)\n if (navigableCount === 0) return\n\n const currentIndex = (() => {\n if (hasCreate && onCreateOption) return 0\n if (!selectedAgent) return hasCreate ? 0 : 0\n const idx = selectableAgents.findIndex(\n a =>\n a.agentType === selectedAgent.agentType &&\n a.source === selectedAgent.source,\n )\n if (idx < 0) return hasCreate ? 0 : 0\n return hasCreate ? idx + 1 : idx\n })()\n\n const nextIndex = key.upArrow\n ? currentIndex === 0\n ? navigableCount - 1\n : currentIndex - 1\n : currentIndex === navigableCount - 1\n ? 0\n : currentIndex + 1\n\n if (hasCreate && nextIndex === 0) {\n setOnCreateOption(true)\n setSelectedAgent(null)\n return\n }\n\n const agentIndex = hasCreate ? nextIndex - 1 : nextIndex\n const nextAgent = selectableAgents[agentIndex]\n if (nextAgent) {\n setOnCreateOption(false)\n setSelectedAgent(nextAgent)\n }\n })\n\n const renderCreateNew = () => (\n <Box>\n <Text color={onCreateOption ? theme.suggestion : undefined}>\n {onCreateOption ? `${figures.pointer} ` : ' '}\n </Text>\n <Text color={onCreateOption ? theme.suggestion : undefined}>\n Create new agent\n </Text>\n </Box>\n )\n\n const renderAgentRow = (agent: AgentWithOverride) => {\n const isBuiltIn = agent.source === 'built-in'\n const isSelected =\n !isBuiltIn &&\n !onCreateOption &&\n selectedAgent?.agentType === agent.agentType &&\n selectedAgent?.source === agent.source\n\n const dimmed = Boolean(isBuiltIn || agent.overriddenBy)\n const rowColor = isSelected ? theme.suggestion : undefined\n const pointer = isBuiltIn ? '' : isSelected ? `${figures.pointer} ` : ' '\n\n return (\n <Box key={`${agent.agentType}-${agent.source}`} flexDirection=\"row\">\n <Text dimColor={dimmed && !isSelected} color={rowColor}>\n {pointer}\n </Text>\n <Text dimColor={dimmed && !isSelected} color={rowColor}>\n {agent.agentType}\n </Text>\n <Text dimColor color={rowColor}>\n {' \u00B7 '}\n {formatModelShort(agent.model)}\n </Text>\n {agent.overriddenBy ? (\n <Text\n dimColor={!isSelected}\n color={isSelected ? theme.warning : undefined}\n >\n {' '}\n {figures.warning} overridden by {agent.overriddenBy}\n </Text>\n ) : null}\n </Box>\n )\n }\n\n const group = (label: string, agents: AgentWithOverride[]) => {\n if (agents.length === 0) return null\n const baseDir = agents[0]?.baseDir\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Box paddingLeft={2}>\n <Text bold dimColor>\n {label}\n </Text>\n {baseDir ? <Text dimColor> ({baseDir})</Text> : null}\n </Box>\n {agents.map(renderAgentRow)}\n </Box>\n )\n }\n\n const builtInSection = (label = 'Built-in (always available):') => {\n const builtIn = props.agents.filter(a => a.source === 'built-in')\n if (builtIn.length === 0) return null\n return (\n <Box flexDirection=\"column\" marginBottom={1} paddingLeft={2}>\n <Text bold dimColor>\n {label}\n </Text>\n {builtIn.map(renderAgentRow)}\n </Box>\n )\n }\n\n const notOverriddenCount = props.agents.filter(a => !a.overriddenBy).length\n const title = titleForSource(props.source)\n\n if (\n props.agents.length === 0 ||\n (props.source !== 'built-in' &&\n !props.agents.some(a => a.source !== 'built-in'))\n ) {\n return (\n <>\n <Panel title={title} subtitle=\"No agents found\">\n {props.onCreateNew ? (\n <Box marginY={1}>{renderCreateNew()}</Box>\n ) : null}\n <Text dimColor>\n No agents found. Create specialized subagents that Claude can\n delegate to.\n </Text>\n <Text dimColor>\n Each subagent has its own context window, custom system prompt, and\n specific tools.\n </Text>\n <Text dimColor>\n Try creating: Code Reviewer, Code Simplifier, Security Reviewer,\n Tech Lead, or UX Reviewer.\n </Text>\n {props.source !== 'built-in' &&\n props.agents.some(a => a.source === 'built-in') ? (\n <>\n <Box marginTop={1}>\n <Text dimColor>{'\u2500'.repeat(40)}</Text>\n </Box>\n {builtInSection()}\n </>\n ) : null}\n </Panel>\n <Instructions />\n </>\n )\n }\n\n return (\n <>\n <Panel title={title} subtitle={`${notOverriddenCount} agents`}>\n {props.changes.length > 0 ? (\n <Box marginTop={1}>\n <Text dimColor>{props.changes[props.changes.length - 1]}</Text>\n </Box>\n ) : null}\n\n <Box flexDirection=\"column\" marginTop={1}>\n {props.onCreateNew ? (\n <Box marginBottom={1}>{renderCreateNew()}</Box>\n ) : null}\n\n {props.source === 'all' ? (\n <>\n {group(\n 'User agents',\n props.agents.filter(a => a.source === 'userSettings'),\n )}\n {group(\n 'Project agents',\n props.agents.filter(a => a.source === 'projectSettings'),\n )}\n {group(\n 'Managed agents',\n props.agents.filter(a => a.source === 'policySettings'),\n )}\n {group(\n 'Plugin agents',\n props.agents.filter(a => a.source === 'plugin'),\n )}\n {group(\n 'CLI arg agents',\n props.agents.filter(a => a.source === 'flagSettings'),\n )}\n {builtInSection('Built-in agents (always available)')}\n </>\n ) : props.source === 'built-in' ? (\n <>\n <Text dimColor italic>\n Built-in agents are provided by default and cannot be modified.\n </Text>\n <Box marginTop={1} flexDirection=\"column\">\n {props.agents.map(renderAgentRow)}\n </Box>\n </>\n ) : (\n <Box flexDirection=\"column\">\n {props.agents\n .filter(a => a.source !== 'built-in')\n .map(renderAgentRow)}\n </Box>\n )}\n </Box>\n </Panel>\n <Instructions />\n </>\n )\n}\n", "import { spawn } from 'child_process'\nimport type { OptionSubtree } from '#ui-ink/components/CustomSelect/select'\nimport { getModelManager } from '#core/utils/model'\nimport type { AgentSourceFilter } from './types'\nimport { DEFAULT_AGENT_MODEL } from './types'\n\nexport function openInEditor(filePath: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const platform = process.platform\n let command: string\n let args: string[]\n\n switch (platform) {\n case 'darwin':\n command = 'open'\n args = [filePath]\n break\n case 'win32':\n command = 'cmd'\n args = ['/c', 'start', '', filePath]\n break\n default:\n command = 'xdg-open'\n args = [filePath]\n break\n }\n\n const child = spawn(command, args, { detached: true, stdio: 'ignore' })\n child.unref()\n child.on('error', err => reject(err))\n child.on('exit', code =>\n code === 0 ? resolve() : reject(new Error(`Editor exited with ${code}`)),\n )\n })\n}\n\nexport function titleForSource(source: AgentSourceFilter): string {\n switch (source) {\n case 'all':\n return 'Agents'\n case 'built-in':\n return 'Built-in agents'\n case 'plugin':\n return 'Plugin agents'\n case 'userSettings':\n return 'User agents'\n case 'projectSettings':\n return 'Project agents'\n case 'policySettings':\n return 'Managed agents'\n case 'flagSettings':\n return 'CLI arg agents'\n default:\n return 'Agents'\n }\n}\n\nexport function formatModelShort(model: string | undefined): string {\n const value = model || DEFAULT_AGENT_MODEL\n return value === 'inherit' ? 'inherit' : value\n}\n\nexport function formatModelLong(model: string | undefined): string {\n if (!model) return 'Sonnet (default)'\n if (model === 'inherit') return 'Inherit from parent'\n if (model === 'sonnet' || model === 'opus' || model === 'haiku') {\n return model.charAt(0).toUpperCase() + model.slice(1)\n }\n return model\n}\n\nexport function getToolNameFromSpec(spec: string): string {\n const trimmed = spec.trim()\n if (!trimmed) return trimmed\n const match = trimmed.match(/^([^(]+)\\\\(([^)]+)\\\\)$/)\n if (!match) return trimmed\n const toolName = match[1]?.trim()\n return toolName || trimmed\n}\n\nexport function parseMcpToolName(\n name: string,\n): { serverName: string; toolName: string } | null {\n if (!name.startsWith('mcp__')) return null\n const parts = name.split('__')\n if (parts.length < 3) return null\n return {\n serverName: parts[1] || 'unknown',\n toolName: parts.slice(2).join('__'),\n }\n}\n\nexport function toSelectableToolNames(\n toolSpecs: string[] | '*',\n): string[] | undefined {\n if (toolSpecs === '*') return undefined\n const names = toolSpecs.map(getToolNameFromSpec).filter(Boolean)\n if (names.includes('*')) return undefined\n return names\n}\n\nexport function modelOptions(): (\n | OptionSubtree\n | { label: string; value: string }\n)[] {\n const profiles = (() => {\n try {\n return getModelManager().getActiveModelProfiles() as Array<{\n name: string\n modelName: string\n provider?: string\n }>\n } catch {\n return []\n }\n })()\n\n const base: Array<{ label: string; value: string }> = [\n { value: 'sonnet', label: 'Task (alias: sonnet)' },\n { value: 'opus', label: 'Main (alias: opus)' },\n { value: 'haiku', label: 'Quick (alias: haiku)' },\n { value: 'inherit', label: 'Inherit from parent' },\n ]\n\n const extras: Array<{ label: string; value: string }> = []\n for (const profile of profiles) {\n if (!profile?.name) continue\n const value = profile.name\n if (base.some(o => o.value === value)) continue\n extras.push({\n value,\n label:\n profile.provider && profile.modelName\n ? `${profile.name} (${profile.provider}:${profile.modelName})`\n : profile.name,\n })\n }\n\n if (extras.length === 0) return base\n\n return [\n { header: 'Compatibility aliases', options: base },\n {\n header: 'Model profiles',\n options: extras.sort((a, b) => a.label.localeCompare(b.label)),\n },\n ]\n}\n", "import type { AgentConfig, AgentSource } from '#core/utils/agentLoader'\n\nexport type AgentSourceFilter =\n | 'all'\n | 'built-in'\n | 'userSettings'\n | 'projectSettings'\n | 'policySettings'\n | 'flagSettings'\n | 'plugin'\n\nexport type AgentWithOverride = AgentConfig & { overriddenBy?: AgentSource }\n\nexport const DEFAULT_AGENT_MODEL = 'sonnet'\n\nexport const COLOR_OPTIONS = [\n 'automatic',\n 'red',\n 'blue',\n 'green',\n 'yellow',\n 'purple',\n 'orange',\n 'pink',\n 'cyan',\n] as const\n\nexport type AgentColor = (typeof COLOR_OPTIONS)[number]\n\nexport type ModeState =\n | { mode: 'list-agents'; source: AgentSourceFilter }\n | {\n mode: 'create-agent'\n previousMode: { mode: 'list-agents'; source: AgentSourceFilter }\n }\n | {\n mode: 'agent-menu'\n agent: AgentWithOverride\n previousMode: { mode: 'list-agents'; source: AgentSourceFilter }\n }\n | {\n mode: 'view-agent'\n agent: AgentWithOverride\n previousMode: {\n mode: 'agent-menu'\n agent: AgentWithOverride\n previousMode: { mode: 'list-agents'; source: AgentSourceFilter }\n }\n }\n | {\n mode: 'edit-agent'\n agent: AgentWithOverride\n previousMode: {\n mode: 'agent-menu'\n agent: AgentWithOverride\n previousMode: { mode: 'list-agents'; source: AgentSourceFilter }\n }\n }\n | {\n mode: 'delete-confirm'\n agent: AgentWithOverride\n previousMode: {\n mode: 'agent-menu'\n agent: AgentWithOverride\n previousMode: { mode: 'list-agents'; source: AgentSourceFilter }\n }\n }\n", "import React, { useMemo } from 'react'\nimport chalk from 'chalk'\nimport type { AgentConfig } from '#core/utils/agentLoader'\nimport type { Tool } from '../tooling'\nimport { getPrimaryAgentFilePath, saveAgent } from '../storage'\nimport { openInEditor } from './utils'\nimport { Wizard, type WizardContextValue } from './wizard/Wizard'\nimport { wizardLocationToStorageLocation } from './wizard/types'\nimport { StepAgentType } from './wizard/steps/StepAgentType'\nimport { StepChooseColor } from './wizard/steps/StepChooseColor'\nimport { StepChooseLocation } from './wizard/steps/StepChooseLocation'\nimport { StepChooseMethod } from './wizard/steps/StepChooseMethod'\nimport { StepConfirm } from './wizard/steps/StepConfirm'\nimport { StepDescription } from './wizard/steps/StepDescription'\nimport { StepGenerationPrompt } from './wizard/steps/StepGenerationPrompt'\nimport { StepSelectModel } from './wizard/steps/StepSelectModel'\nimport { StepSelectTools } from './wizard/steps/StepSelectTools'\nimport { StepSystemPrompt } from './wizard/steps/StepSystemPrompt'\n\nexport function CreateAgentWizard(props: {\n tools: Tool[]\n existingAgents: AgentConfig[]\n onComplete: (message: string) => void\n onCancel: () => void\n}) {\n const steps = useMemo(() => {\n return [\n (ctx: WizardContextValue) => <StepChooseLocation ctx={ctx} />,\n (ctx: WizardContextValue) => <StepChooseMethod ctx={ctx} />,\n (ctx: WizardContextValue) => (\n <StepGenerationPrompt ctx={ctx} existingAgents={props.existingAgents} />\n ),\n (ctx: WizardContextValue) => (\n <StepAgentType ctx={ctx} existingAgents={props.existingAgents} />\n ),\n (ctx: WizardContextValue) => <StepSystemPrompt ctx={ctx} />,\n (ctx: WizardContextValue) => <StepDescription ctx={ctx} />,\n (ctx: WizardContextValue) => (\n <StepSelectTools ctx={ctx} tools={props.tools} />\n ),\n (ctx: WizardContextValue) => <StepSelectModel ctx={ctx} />,\n (ctx: WizardContextValue) => <StepChooseColor ctx={ctx} />,\n (ctx: WizardContextValue) => (\n <StepConfirm\n ctx={ctx}\n tools={props.tools}\n existingAgents={props.existingAgents}\n onSave={async (finalAgent, openEditor) => {\n const location = wizardLocationToStorageLocation(finalAgent.source)\n const tools = finalAgent.tools ?? ['*']\n await saveAgent(\n location,\n finalAgent.agentType,\n finalAgent.whenToUse,\n tools,\n finalAgent.systemPrompt,\n finalAgent.model,\n finalAgent.color,\n true,\n )\n\n if (openEditor) {\n const path = getPrimaryAgentFilePath(\n location,\n finalAgent.agentType,\n )\n await openInEditor(path)\n props.onComplete(\n `Created agent: ${chalk.bold(finalAgent.agentType)} and opened in editor. If you made edits, restart to load the latest version.`,\n )\n return\n }\n\n props.onComplete(\n `Created agent: ${chalk.bold(finalAgent.agentType)}`,\n )\n }}\n />\n ),\n ]\n }, [props])\n\n return <Wizard steps={steps} onCancel={props.onCancel} onDone={() => {}} />\n}\n", "import React, { useCallback, useMemo, useState } from 'react'\nimport { Instructions, Panel } from '../components'\nimport type { WizardData } from './types'\n\nexport type WizardContextValue = {\n stepIndex: number\n totalSteps: number\n wizardData: WizardData\n updateWizardData: (patch: Partial<WizardData>) => void\n goNext: () => void\n goBack: () => void\n goToStep: (index: number) => void\n cancel: () => void\n done: () => void\n}\n\nexport function Wizard(props: {\n steps: Array<(ctx: WizardContextValue) => React.ReactNode>\n initialData?: WizardData\n onCancel: () => void\n onDone: (data: WizardData) => void\n}) {\n const [stepIndex, setStepIndex] = useState(0)\n const [data, setData] = useState<WizardData>(props.initialData ?? {})\n const [history, setHistory] = useState<number[]>([])\n\n const goNext = useCallback(() => {\n setHistory(prev => [...prev, stepIndex])\n setStepIndex(prev => Math.min(prev + 1, props.steps.length - 1))\n }, [props.steps.length, stepIndex])\n\n const goBack = useCallback(() => {\n setHistory(prev => {\n if (prev.length === 0) {\n props.onCancel()\n return prev\n }\n const next = [...prev]\n const last = next.pop()\n if (typeof last === 'number') setStepIndex(last)\n return next\n })\n }, [props.onCancel])\n\n const goToStep = useCallback(\n (index: number) => {\n setHistory(prev => [...prev, stepIndex])\n setStepIndex(() => Math.max(0, Math.min(index, props.steps.length - 1)))\n },\n [props.steps.length, stepIndex],\n )\n\n const updateWizardData = useCallback((patch: Partial<WizardData>) => {\n setData(prev => ({ ...prev, ...patch }))\n }, [])\n\n const cancel = useCallback(() => props.onCancel(), [props.onCancel])\n const done = useCallback(() => props.onDone(data), [props, data])\n\n const ctx: WizardContextValue = useMemo(\n () => ({\n stepIndex,\n totalSteps: props.steps.length,\n wizardData: data,\n updateWizardData,\n goNext,\n goBack,\n goToStep,\n cancel,\n done,\n }),\n [\n data,\n done,\n goBack,\n goNext,\n goToStep,\n props.steps.length,\n stepIndex,\n updateWizardData,\n cancel,\n ],\n )\n\n return <>{props.steps[stepIndex]?.(ctx) ?? null}</>\n}\n\nexport function WizardPanel(props: {\n subtitle: string\n footerText?: string\n children?: React.ReactNode\n}) {\n return (\n <>\n <Panel title=\"Create new agent\" subtitle={props.subtitle}>\n {props.children}\n </Panel>\n <Instructions instructions={props.footerText} />\n </>\n )\n}\n", "export type WizardLocation = 'projectSettings' | 'userSettings'\nexport type WizardMethod = 'generate' | 'manual'\n\nexport type WizardFinalAgent = {\n agentType: string\n whenToUse: string\n systemPrompt: string\n tools: string[] | undefined\n model: string\n color?: string\n source: WizardLocation\n}\n\nexport type WizardData = {\n location?: WizardLocation\n method?: WizardMethod\n generationPrompt?: string\n agentType?: string\n whenToUse?: string\n systemPrompt?: string\n selectedTools?: string[] | undefined\n selectedModel?: string\n selectedColor?: string\n wasGenerated?: boolean\n isGenerating?: boolean\n finalAgent?: WizardFinalAgent\n}\n\nexport function wizardLocationToStorageLocation(\n location: WizardLocation,\n): 'project' | 'user' {\n return location === 'projectSettings' ? 'project' : 'user'\n}\n", "import React, { useState } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport TextInput from '#ui-ink/components/TextInput'\nimport type { AgentConfig } from '#core/utils/agentLoader'\nimport { validateAgentType } from '../../../generation'\nimport { themeColor } from '../../colors'\nimport { WizardPanel, type WizardContextValue } from '../Wizard'\n\nexport function StepAgentType(props: {\n ctx: WizardContextValue\n existingAgents: AgentConfig[]\n}) {\n const { ctx } = props\n const [value, setValue] = useState(ctx.wizardData.agentType ?? '')\n const [cursorOffset, setCursorOffset] = useState(value.length)\n const [error, setError] = useState<string | null>(null)\n const columns = 60\n\n useInput((_input, key) => {\n if (key.escape) ctx.goBack()\n })\n\n const onSubmit = (next: string) => {\n const trimmed = next.trim()\n const validation = validateAgentType(trimmed, props.existingAgents)\n if (!validation.isValid) {\n setError(validation.errors[0] ?? 'Invalid agent type')\n return\n }\n setError(null)\n ctx.updateWizardData({ agentType: trimmed })\n ctx.goNext()\n }\n\n return (\n <WizardPanel\n subtitle=\"Agent type (identifier)\"\n footerText=\"Press Enter to continue \u00B7 Esc to go back\"\n >\n <Box flexDirection=\"column\" marginTop={1} gap={1}>\n <Text>Enter a unique identifier for your agent:</Text>\n <TextInput\n value={value}\n onChange={setValue}\n columns={columns}\n onSubmit={onSubmit}\n cursorOffset={cursorOffset}\n onChangeCursorOffset={setCursorOffset}\n />\n <Text dimColor>e.g., code-reviewer, tech-lead, etc</Text>\n {error ? <Text color={themeColor('error')}>{error}</Text> : null}\n </Box>\n </WizardPanel>\n )\n}\n", "import { getTheme } from '#core/utils/theme'\n\nexport function panelBorderColor(kind: 'suggestion' | 'error'): string {\n const theme = getTheme()\n return kind === 'error' ? theme.error : theme.suggestion\n}\n\nexport function themeColor(\n kind: 'error' | 'warning' | 'success' | 'suggestion',\n): string {\n const theme = getTheme()\n switch (kind) {\n case 'error':\n return theme.error\n case 'warning':\n return theme.warning\n case 'success':\n return theme.success\n case 'suggestion':\n default:\n return theme.suggestion\n }\n}\n", "import React from 'react'\nimport { Box, useInput } from 'ink'\nimport { ColorPicker } from '../../ColorPicker'\nimport type { AgentColor } from '../../types'\nimport { DEFAULT_AGENT_MODEL } from '../../types'\nimport type { WizardFinalAgent } from '../types'\nimport { WizardPanel, type WizardContextValue } from '../Wizard'\n\nexport function StepChooseColor({ ctx }: { ctx: WizardContextValue }) {\n useInput((_input, key) => {\n if (key.escape) ctx.goBack()\n })\n\n const agentType = ctx.wizardData.agentType ?? 'agent'\n const onConfirm = (color: AgentColor) => {\n const selectedColor = color === 'automatic' ? undefined : color\n const finalAgent: WizardFinalAgent = {\n agentType: ctx.wizardData.agentType ?? agentType,\n whenToUse: ctx.wizardData.whenToUse ?? '',\n systemPrompt: ctx.wizardData.systemPrompt ?? '',\n tools: ctx.wizardData.selectedTools,\n model: ctx.wizardData.selectedModel ?? DEFAULT_AGENT_MODEL,\n ...(selectedColor ? { color: selectedColor } : {}),\n source: ctx.wizardData.location ?? 'projectSettings',\n }\n\n ctx.updateWizardData({\n selectedColor: selectedColor,\n finalAgent,\n })\n ctx.goNext()\n }\n\n return (\n <WizardPanel\n subtitle=\"Choose background color\"\n footerText=\"Press \u2191\u2193 to navigate \u00B7 Enter to select \u00B7 Esc to go back\"\n >\n <Box marginTop={1}>\n <ColorPicker\n agentName={agentType}\n currentColor=\"automatic\"\n onConfirm={onConfirm}\n />\n </Box>\n </WizardPanel>\n )\n}\n", "import React, { useState } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport figures from 'figures'\nimport { themeColor } from './colors'\nimport { COLOR_OPTIONS, type AgentColor } from './types'\n\nexport function ColorPicker(props: {\n agentName: string\n currentColor: AgentColor\n onConfirm: (color: AgentColor) => void\n}) {\n const [index, setIndex] = useState(\n Math.max(\n 0,\n COLOR_OPTIONS.findIndex(c => c === props.currentColor),\n ),\n )\n\n useInput((_input, key) => {\n if (key.upArrow) setIndex(i => (i > 0 ? i - 1 : COLOR_OPTIONS.length - 1))\n else if (key.downArrow)\n setIndex(i => (i < COLOR_OPTIONS.length - 1 ? i + 1 : 0))\n else if (key.return) props.onConfirm(COLOR_OPTIONS[index] ?? 'automatic')\n })\n\n return (\n <Box flexDirection=\"column\" gap={1}>\n {COLOR_OPTIONS.map((color, i) => {\n const focused = i === index\n const prefix = focused ? figures.pointer : ' '\n const label =\n color === 'automatic'\n ? 'Automatic color'\n : color.charAt(0).toUpperCase() + color.slice(1)\n return (\n <React.Fragment key={color}>\n <Text\n color={focused ? themeColor('suggestion') : undefined}\n bold={focused}\n >\n {prefix} {label}\n </Text>\n </React.Fragment>\n )\n })}\n </Box>\n )\n}\n", "import React from 'react'\nimport { Box, useInput } from 'ink'\nimport { Select } from '#ui-ink/components/CustomSelect/select'\nimport { WizardPanel, type WizardContextValue } from '../Wizard'\n\nexport function StepChooseLocation({ ctx }: { ctx: WizardContextValue }) {\n useInput((_input, key) => {\n if (key.escape) ctx.cancel()\n })\n\n return (\n <WizardPanel\n subtitle=\"Choose location\"\n footerText=\"Press \u2191\u2193 to navigate \u00B7 Enter to select \u00B7 Esc to cancel\"\n >\n <Box marginTop={1}>\n <Select\n options={[\n { label: 'Project (.claude/agents/)', value: 'projectSettings' },\n { label: 'Personal (~/.claude/agents/)', value: 'userSettings' },\n ]}\n onChange={value => {\n const location =\n value === 'projectSettings' ? 'projectSettings' : 'userSettings'\n ctx.updateWizardData({ location })\n ctx.goNext()\n }}\n />\n </Box>\n </WizardPanel>\n )\n}\n", "import React from 'react'\nimport { Box, useInput } from 'ink'\nimport { Select } from '#ui-ink/components/CustomSelect/select'\nimport { WizardPanel, type WizardContextValue } from '../Wizard'\nimport type { WizardMethod } from '../types'\n\nexport function StepChooseMethod({ ctx }: { ctx: WizardContextValue }) {\n useInput((_input, key) => {\n if (key.escape) ctx.goBack()\n })\n\n return (\n <WizardPanel subtitle=\"Creation method\">\n <Box marginTop={1}>\n <Select\n options={[\n { label: 'Generate with Claude (recommended)', value: 'generate' },\n { label: 'Manual configuration', value: 'manual' },\n ]}\n onChange={value => {\n const method: WizardMethod =\n value === 'manual' ? 'manual' : 'generate'\n ctx.updateWizardData({\n method,\n wasGenerated: method === 'generate',\n })\n if (method === 'generate') ctx.goNext()\n else ctx.goToStep(3)\n }}\n />\n </Box>\n </WizardPanel>\n )\n}\n", "import React, { useState } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport type { AgentConfig } from '#core/utils/agentLoader'\nimport type { Tool } from '../../../tooling'\nimport { validateAgentConfig, validateAgentType } from '../../../generation'\nimport { getPrimaryAgentFilePath } from '../../../storage'\nimport { themeColor } from '../../colors'\nimport { formatModelLong } from '../../utils'\nimport { WizardPanel, type WizardContextValue } from '../Wizard'\nimport type { WizardFinalAgent } from '../types'\n\nfunction validateFinalAgent(args: {\n finalAgent: WizardFinalAgent\n tools: Tool[]\n existingAgents: AgentConfig[]\n}): { errors: string[]; warnings: string[] } {\n const errors: string[] = []\n const warnings: string[] = []\n\n const typeValidation = validateAgentType(\n args.finalAgent.agentType,\n args.existingAgents,\n )\n errors.push(...typeValidation.errors)\n warnings.push(...typeValidation.warnings)\n\n const configValidation = validateAgentConfig({\n agentType: args.finalAgent.agentType,\n whenToUse: args.finalAgent.whenToUse,\n systemPrompt: args.finalAgent.systemPrompt,\n selectedTools: args.finalAgent.tools ?? ['*'],\n })\n errors.push(...configValidation.errors)\n warnings.push(...configValidation.warnings)\n\n const availableToolNames = new Set(args.tools.map(t => t.name))\n const selectedTools = args.finalAgent.tools ?? undefined\n if (selectedTools && selectedTools.length > 0) {\n const unknown = selectedTools.filter(t => !availableToolNames.has(t))\n if (unknown.length > 0)\n warnings.push(`Unrecognized tools: ${unknown.join(', ')}`)\n }\n\n return { errors, warnings }\n}\n\nexport function StepConfirm(props: {\n ctx: WizardContextValue\n tools: Tool[]\n existingAgents: AgentConfig[]\n onSave: (finalAgent: WizardFinalAgent, openEditor: boolean) => Promise<void>\n}) {\n const { ctx } = props\n const finalAgent = ctx.wizardData.finalAgent\n const [error, setError] = useState<string | null>(null)\n\n useInput((input, key) => {\n if (key.escape) ctx.goBack()\n else if (input === 'e') void doSave(true)\n else if (input === 's' || key.return) void doSave(false)\n })\n\n const toolSummary = (tools: string[] | undefined): string => {\n if (tools === undefined) return 'All tools'\n if (tools.length === 0) return 'None'\n if (tools.length === 1) return tools[0] || 'None'\n if (tools.length === 2) return tools.join(' and ')\n return `${tools.slice(0, -1).join(', ')}, and ${tools[tools.length - 1]}`\n }\n\n const doSave = async (openEditor: boolean) => {\n if (!finalAgent) return\n const { errors } = validateFinalAgent({\n finalAgent,\n tools: props.tools,\n existingAgents: props.existingAgents,\n })\n if (errors.length > 0) {\n setError(errors[0] ?? 'Invalid agent configuration')\n return\n }\n try {\n await props.onSave(finalAgent, openEditor)\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n }\n }\n\n if (!finalAgent) return null\n\n const validation = validateFinalAgent({\n finalAgent,\n tools: props.tools,\n existingAgents: props.existingAgents,\n })\n\n const locationPath =\n finalAgent.source === 'projectSettings'\n ? getPrimaryAgentFilePath('project', finalAgent.agentType)\n : getPrimaryAgentFilePath('user', finalAgent.agentType)\n\n const truncate = (text: string) =>\n text.length > 240 ? `${text.slice(0, 240)}\u2026` : text\n\n return (\n <WizardPanel\n subtitle=\"Confirm and save\"\n footerText=\"Press s/Enter to save \u00B7 e to edit in your editor \u00B7 Esc to cancel\"\n >\n <Box flexDirection=\"column\" marginTop={1} gap={1}>\n <Text>\n <Text bold>Name</Text>: {finalAgent.agentType}\n </Text>\n <Text>\n <Text bold>Location</Text>: {locationPath}\n </Text>\n <Text>\n <Text bold>Tools</Text>: {toolSummary(finalAgent.tools)}\n </Text>\n <Text>\n <Text bold>Model</Text>: {formatModelLong(finalAgent.model)}\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\">\n <Text>\n <Text bold>Description</Text> (tells Claude when to use this agent):\n </Text>\n <Box marginLeft={2} marginTop={1}>\n <Text>{truncate(finalAgent.whenToUse)}</Text>\n </Box>\n </Box>\n\n <Box marginTop={1} flexDirection=\"column\">\n <Text>\n <Text bold>System prompt</Text>:\n </Text>\n <Box marginLeft={2} marginTop={1}>\n <Text>{truncate(finalAgent.systemPrompt)}</Text>\n </Box>\n </Box>\n\n {validation.warnings.length > 0 ? (\n <Box marginTop={1} flexDirection=\"column\">\n <Text color={themeColor('warning')}>Warnings:</Text>\n {validation.warnings.map((w, i) => (\n <React.Fragment key={i}>\n <Text dimColor> \u2022 {w}</Text>\n </React.Fragment>\n ))}\n </Box>\n ) : null}\n\n {validation.errors.length > 0 ? (\n <Box marginTop={1} flexDirection=\"column\">\n <Text color={themeColor('error')}>Errors:</Text>\n {validation.errors.map((e, i) => (\n <React.Fragment key={i}>\n <Text color={themeColor('error')}> \u2022 {e}</Text>\n </React.Fragment>\n ))}\n </Box>\n ) : null}\n\n {error ? (\n <Box marginTop={1}>\n <Text color={themeColor('error')}>{error}</Text>\n </Box>\n ) : null}\n </Box>\n </WizardPanel>\n )\n}\n", "import React, { useState } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport TextInput from '#ui-ink/components/TextInput'\nimport { themeColor } from '../../colors'\nimport { WizardPanel, type WizardContextValue } from '../Wizard'\n\nexport function StepDescription({ ctx }: { ctx: WizardContextValue }) {\n const [value, setValue] = useState(ctx.wizardData.whenToUse ?? '')\n const [cursorOffset, setCursorOffset] = useState(value.length)\n const [error, setError] = useState<string | null>(null)\n const columns = Math.min(80, process.stdout.columns ?? 80)\n\n useInput((_input, key) => {\n if (key.escape) ctx.goBack()\n })\n\n const onSubmit = (next: string) => {\n const trimmed = next.trim()\n if (!trimmed) {\n setError('Description is required')\n return\n }\n setError(null)\n ctx.updateWizardData({ whenToUse: trimmed })\n ctx.goNext()\n }\n\n return (\n <WizardPanel\n subtitle=\"Description (tell Claude when to use this agent)\"\n footerText=\"Press Enter to continue \u00B7 Esc to go back\"\n >\n <Box flexDirection=\"column\" marginTop={1} gap={1}>\n <Text>When should Claude use this agent?</Text>\n <TextInput\n value={value}\n onChange={setValue}\n columns={columns}\n multiline\n onSubmit={onSubmit}\n cursorOffset={cursorOffset}\n onChangeCursorOffset={setCursorOffset}\n />\n {error ? <Text color={themeColor('error')}>{error}</Text> : null}\n </Box>\n </WizardPanel>\n )\n}\n", "import React, { useRef, useState } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport TextInput from '#ui-ink/components/TextInput'\nimport type { AgentConfig } from '#core/utils/agentLoader'\nimport { generateAgentWithClaude } from '../../../generation'\nimport { themeColor } from '../../colors'\nimport { WizardPanel, type WizardContextValue } from '../Wizard'\n\nexport function StepGenerationPrompt(props: {\n ctx: WizardContextValue\n existingAgents: AgentConfig[]\n}) {\n const { ctx } = props\n const [value, setValue] = useState(ctx.wizardData.generationPrompt ?? '')\n const [cursorOffset, setCursorOffset] = useState(value.length)\n const [isGenerating, setIsGenerating] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const abortRef = useRef<AbortController | null>(null)\n const columns = Math.min(80, process.stdout.columns ?? 80)\n\n useInput((_input, key) => {\n if (!key.escape) return\n if (isGenerating && abortRef.current) {\n abortRef.current.abort()\n abortRef.current = null\n setIsGenerating(false)\n setError('Generation cancelled')\n return\n }\n if (!isGenerating) {\n ctx.updateWizardData({\n generationPrompt: '',\n agentType: '',\n systemPrompt: '',\n whenToUse: '',\n wasGenerated: false,\n })\n setValue('')\n setCursorOffset(0)\n setError(null)\n ctx.goBack()\n }\n })\n\n const onSubmit = async () => {\n const trimmed = value.trim()\n if (!trimmed) {\n setError('Please describe what the agent should do')\n return\n }\n\n setError(null)\n setIsGenerating(true)\n ctx.updateWizardData({ generationPrompt: trimmed, isGenerating: true })\n\n const abort = new AbortController()\n abortRef.current = abort\n\n try {\n const existing = props.existingAgents.map(a => a.agentType)\n const generated = await generateAgentWithClaude(trimmed)\n if (existing.includes(generated.identifier)) {\n throw new Error(\n `Agent identifier already exists: ${generated.identifier}. Please try again.`,\n )\n }\n\n ctx.updateWizardData({\n agentType: generated.identifier,\n whenToUse: generated.whenToUse,\n systemPrompt: generated.systemPrompt,\n wasGenerated: true,\n isGenerating: false,\n })\n setIsGenerating(false)\n abortRef.current = null\n ctx.goToStep(6)\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n setError(message || 'Failed to generate agent')\n setIsGenerating(false)\n ctx.updateWizardData({ isGenerating: false })\n abortRef.current = null\n }\n }\n\n return (\n <WizardPanel subtitle=\"Describe the agent you want\">\n <Box flexDirection=\"column\" marginTop={1} gap={1}>\n <Text>What should this agent do?</Text>\n <Text dimColor>\n Describe a role like \u201Ccode reviewer\u201D, \u201Csecurity auditor\u201D, or \u201Ctech\n lead\u201D.\n </Text>\n <TextInput\n value={value}\n onChange={setValue}\n columns={columns}\n multiline\n onSubmit={onSubmit}\n cursorOffset={cursorOffset}\n onChangeCursorOffset={setCursorOffset}\n />\n {error ? <Text color={themeColor('error')}>{error}</Text> : null}\n {isGenerating ? <Text dimColor>Generating\u2026</Text> : null}\n </Box>\n </WizardPanel>\n )\n}\n", "import React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { Select } from '#ui-ink/components/CustomSelect/select'\nimport { modelOptions } from '../../utils'\nimport { DEFAULT_AGENT_MODEL } from '../../types'\nimport { WizardPanel, type WizardContextValue } from '../Wizard'\n\nexport function StepSelectModel({ ctx }: { ctx: WizardContextValue }) {\n useInput((_input, key) => {\n if (key.escape) ctx.goBack()\n })\n\n const options = modelOptions()\n const defaultValue = ctx.wizardData.selectedModel ?? DEFAULT_AGENT_MODEL\n\n return (\n <WizardPanel\n subtitle=\"Select model\"\n footerText=\"Press \u2191\u2193 to navigate \u00B7 Enter to select \u00B7 Esc to go back\"\n >\n <Box flexDirection=\"column\" marginTop={1} gap={1}>\n <Text dimColor>\n Model determines the agent&apos;s reasoning capabilities and speed.\n </Text>\n <Select\n options={options}\n defaultValue={defaultValue}\n onChange={value => {\n ctx.updateWizardData({ selectedModel: value })\n ctx.goNext()\n }}\n />\n </Box>\n </WizardPanel>\n )\n}\n", "import React from 'react'\nimport type { Tool } from '../../../tooling'\nimport { Instructions, Panel } from '../../components'\nimport { ToolPicker } from '../ToolPicker'\nimport type { WizardContextValue } from '../Wizard'\n\nexport function StepSelectTools(props: {\n ctx: WizardContextValue\n tools: Tool[]\n}) {\n const { ctx } = props\n const initialTools = ctx.wizardData.selectedTools\n return (\n <>\n <Panel title=\"Create new agent\" subtitle=\"Select tools\">\n <ToolPicker\n tools={props.tools}\n initialTools={initialTools}\n onComplete={selected => {\n ctx.updateWizardData({ selectedTools: selected })\n ctx.goNext()\n }}\n onCancel={ctx.goBack}\n />\n </Panel>\n <Instructions instructions=\"Press Enter to toggle selection \u00B7 \u2191\u2193 Navigate \u00B7 Esc to go back\" />\n </>\n )\n}\n", "import React, { useMemo, useState } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport figures from 'figures'\nimport type { Tool } from '../../tooling'\nimport { themeColor } from '../colors'\nimport { parseMcpToolName } from '../utils'\n\nexport function ToolPicker(props: {\n tools: Tool[]\n initialTools: string[] | undefined\n onComplete: (tools: string[] | undefined) => void\n onCancel: () => void\n}) {\n const normalizedTools = useMemo(() => {\n const unique = new Map<string, Tool>()\n for (const tool of props.tools) {\n if (!tool?.name) continue\n unique.set(tool.name, tool)\n }\n return Array.from(unique.values()).sort((a, b) =>\n a.name.localeCompare(b.name),\n )\n }, [props.tools])\n\n const allToolNames = useMemo(\n () => normalizedTools.map(t => t.name),\n [normalizedTools],\n )\n\n const initialSelectedNames = useMemo(() => {\n if (!props.initialTools) return allToolNames\n if (props.initialTools.includes('*')) return allToolNames\n const available = new Set(allToolNames)\n return props.initialTools.filter(t => available.has(t))\n }, [props.initialTools, allToolNames])\n\n const [selected, setSelected] = useState<string[]>(initialSelectedNames)\n const [cursorIndex, setCursorIndex] = useState(0)\n const [showAdvanced, setShowAdvanced] = useState(false)\n\n const selectedSet = useMemo(() => new Set(selected), [selected])\n const isAllSelected =\n selected.length === allToolNames.length && allToolNames.length > 0\n\n const toggleOne = (name: string) => {\n setSelected(prev =>\n prev.includes(name) ? prev.filter(x => x !== name) : [...prev, name],\n )\n }\n\n const toggleMany = (names: string[], enable: boolean) => {\n setSelected(prev => {\n if (enable) {\n const missing = names.filter(n => !prev.includes(n))\n return [...prev, ...missing]\n }\n return prev.filter(n => !names.includes(n))\n })\n }\n\n const complete = () => {\n const next =\n selected.length === allToolNames.length &&\n allToolNames.every(n => selected.includes(n))\n ? undefined\n : selected\n props.onComplete(next)\n }\n\n const categorized = useMemo(() => {\n const readOnly = new Set(['Read', 'Glob', 'Grep', 'LS'])\n const edit = new Set(['Edit', 'MultiEdit', 'Write', 'NotebookEdit'])\n const execution = new Set(['Bash', 'BashOutput', 'KillBash'])\n\n const buckets: Record<\n 'readOnly' | 'edit' | 'execution' | 'mcp' | 'other',\n string[]\n > = { readOnly: [], edit: [], execution: [], mcp: [], other: [] }\n\n for (const tool of normalizedTools) {\n const name = tool.name\n if (name.startsWith('mcp__')) buckets.mcp.push(name)\n else if (readOnly.has(name)) buckets.readOnly.push(name)\n else if (edit.has(name)) buckets.edit.push(name)\n else if (execution.has(name)) buckets.execution.push(name)\n else buckets.other.push(name)\n }\n\n return buckets\n }, [normalizedTools])\n\n const mcpServers = useMemo(() => {\n const byServer = new Map<string, string[]>()\n for (const name of categorized.mcp) {\n const parsed = parseMcpToolName(name)\n if (!parsed) continue\n const list = byServer.get(parsed.serverName) ?? []\n list.push(name)\n byServer.set(parsed.serverName, list)\n }\n return Array.from(byServer.entries())\n .map(([serverName, toolNames]) => ({ serverName, toolNames }))\n .sort((a, b) => a.serverName.localeCompare(b.serverName))\n }, [categorized.mcp])\n\n type Item = {\n id: string\n label: string\n isHeader?: boolean\n isToggle?: boolean\n action: () => void\n }\n\n const items: Item[] = useMemo(() => {\n const out: Item[] = []\n\n out.push({ id: 'continue', label: '[ Continue ]', action: complete })\n out.push({\n id: 'bucket-all',\n label: `${isAllSelected ? figures.checkboxOn : figures.checkboxOff} All tools`,\n action: () => toggleMany(allToolNames, !isAllSelected),\n })\n\n const bucketDefs: Array<{\n id: string\n label: string\n names: string[]\n }> = [\n {\n id: 'bucket-readonly',\n label: 'Read-only tools',\n names: categorized.readOnly,\n },\n { id: 'bucket-edit', label: 'Edit tools', names: categorized.edit },\n {\n id: 'bucket-execution',\n label: 'Execution tools',\n names: categorized.execution,\n },\n { id: 'bucket-mcp', label: 'MCP tools', names: categorized.mcp },\n { id: 'bucket-other', label: 'Other tools', names: categorized.other },\n ]\n\n for (const bucket of bucketDefs) {\n if (bucket.names.length === 0) continue\n const allInBucket = bucket.names.every(n => selectedSet.has(n))\n out.push({\n id: bucket.id,\n label: `${allInBucket ? figures.checkboxOn : figures.checkboxOff} ${bucket.label}`,\n action: () => toggleMany(bucket.names, !allInBucket),\n })\n }\n\n out.push({\n id: 'toggle-advanced',\n label: showAdvanced ? 'Hide advanced options' : 'Show advanced options',\n isToggle: true,\n action: () => setShowAdvanced(prev => !prev),\n })\n\n if (!showAdvanced) return out\n\n if (mcpServers.length > 0) {\n out.push({\n id: 'mcp-servers-header',\n label: 'MCP Servers:',\n isHeader: true,\n action: () => {},\n })\n for (const server of mcpServers) {\n const allServer = server.toolNames.every(n => selectedSet.has(n))\n out.push({\n id: `mcp-server-${server.serverName}`,\n label: `${allServer ? figures.checkboxOn : figures.checkboxOff} ${server.serverName} (${server.toolNames.length} tool${server.toolNames.length === 1 ? '' : 's'})`,\n action: () => toggleMany(server.toolNames, !allServer),\n })\n }\n }\n\n out.push({\n id: 'tools-header',\n label: 'Individual Tools:',\n isHeader: true,\n action: () => {},\n })\n for (const name of allToolNames) {\n let labelName = name\n const parsed = parseMcpToolName(name)\n if (parsed) labelName = `${parsed.toolName} (${parsed.serverName})`\n out.push({\n id: `tool-${name}`,\n label: `${selectedSet.has(name) ? figures.checkboxOn : figures.checkboxOff} ${labelName}`,\n action: () => toggleOne(name),\n })\n }\n\n return out\n }, [\n allToolNames,\n categorized,\n complete,\n isAllSelected,\n mcpServers,\n selectedSet,\n showAdvanced,\n ])\n\n useInput((_input, key) => {\n if (key.escape) {\n props.onCancel()\n return\n }\n\n if (key.return) {\n const item = items[cursorIndex]\n if (item && !item.isHeader) item.action()\n return\n }\n\n if (key.upArrow) {\n let next = cursorIndex - 1\n while (next > 0 && items[next]?.isHeader) next--\n setCursorIndex(Math.max(0, next))\n return\n }\n\n if (key.downArrow) {\n let next = cursorIndex + 1\n while (next < items.length - 1 && items[next]?.isHeader) next++\n setCursorIndex(Math.min(items.length - 1, next))\n return\n }\n })\n\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text\n color={cursorIndex === 0 ? themeColor('suggestion') : undefined}\n bold={cursorIndex === 0}\n >\n {cursorIndex === 0 ? `${figures.pointer} ` : ' '}[ Continue ]\n </Text>\n <Text dimColor>{'\u2500'.repeat(40)}</Text>\n {items.slice(1).map((item, idx) => {\n const index = idx + 1\n const focused = index === cursorIndex\n const prefix = item.isHeader\n ? ''\n : focused\n ? `${figures.pointer} `\n : ' '\n return (\n <React.Fragment key={item.id}>\n {item.isToggle ? <Text dimColor>{'\u2500'.repeat(40)}</Text> : null}\n <Text\n dimColor={item.isHeader}\n color={\n !item.isHeader && focused ? themeColor('suggestion') : undefined\n }\n bold={item.isToggle && focused}\n >\n {item.isToggle\n ? `${prefix}[ ${item.label} ]`\n : `${prefix}${item.label}`}\n </Text>\n </React.Fragment>\n )\n })}\n <Box marginTop={1} flexDirection=\"column\">\n <Text dimColor>\n {isAllSelected\n ? 'All tools selected'\n : `${selectedSet.size} of ${allToolNames.length} tools selected`}\n </Text>\n </Box>\n </Box>\n )\n}\n", "import React, { useState } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport TextInput from '#ui-ink/components/TextInput'\nimport { themeColor } from '../../colors'\nimport { WizardPanel, type WizardContextValue } from '../Wizard'\n\nexport function StepSystemPrompt({ ctx }: { ctx: WizardContextValue }) {\n const [value, setValue] = useState(ctx.wizardData.systemPrompt ?? '')\n const [cursorOffset, setCursorOffset] = useState(value.length)\n const [error, setError] = useState<string | null>(null)\n const columns = Math.min(80, process.stdout.columns ?? 80)\n\n useInput((_input, key) => {\n if (key.escape) ctx.goBack()\n })\n\n const onSubmit = (next: string) => {\n const trimmed = next.trim()\n if (!trimmed) {\n setError('System prompt is required')\n return\n }\n setError(null)\n ctx.updateWizardData({ systemPrompt: trimmed })\n ctx.goNext()\n }\n\n return (\n <WizardPanel\n subtitle=\"System prompt\"\n footerText=\"Press Enter to continue \u00B7 Esc to go back\"\n >\n <Box flexDirection=\"column\" marginTop={1} gap={1}>\n <Text>Enter the system prompt for your agent:</Text>\n <Text dimColor>Be comprehensive for best results</Text>\n <TextInput\n value={value}\n onChange={setValue}\n columns={columns}\n multiline\n onSubmit={onSubmit}\n cursorOffset={cursorOffset}\n onChangeCursorOffset={setCursorOffset}\n />\n {error ? <Text color={themeColor('error')}>{error}</Text> : null}\n </Box>\n </WizardPanel>\n )\n}\n", "import React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { Select } from '#ui-ink/components/CustomSelect/select'\nimport { panelBorderColor, themeColor } from './colors'\nimport { Instructions, Panel } from './components'\nimport type { AgentWithOverride } from './types'\n\nexport function DeleteConfirm(props: {\n agent: AgentWithOverride\n onConfirm: () => void\n onCancel: () => void\n}) {\n useInput((_input, key) => {\n if (key.escape) props.onCancel()\n })\n\n return (\n <>\n <Panel\n title=\"Delete agent\"\n borderColor={panelBorderColor('error')}\n titleColor={themeColor('error')}\n >\n <Box flexDirection=\"column\" gap={1}>\n <Text>\n Are you sure you want to delete the agent{' '}\n <Text bold>{props.agent.agentType}</Text>?\n </Text>\n <Box marginTop={1}>\n <Text dimColor>Source: {props.agent.source}</Text>\n </Box>\n <Box marginTop={1}>\n <Select\n options={[\n { label: 'Yes, delete', value: 'yes' },\n { label: 'No, cancel', value: 'no' },\n ]}\n onChange={value => {\n if (value === 'yes') props.onConfirm()\n else props.onCancel()\n }}\n />\n </Box>\n </Box>\n </Panel>\n <Instructions instructions=\"Press \u2191\u2193 to navigate, Enter to select, Esc to cancel\" />\n </>\n )\n}\n", "import React, { useMemo, useState } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport figures from 'figures'\nimport chalk from 'chalk'\nimport { Select } from '#ui-ink/components/CustomSelect/select'\nimport type { Tool } from '../tooling'\nimport { getPrimaryAgentFilePath, updateAgent } from '../storage'\nimport { themeColor } from './colors'\nimport { Instructions, Panel } from './components'\nimport { ColorPicker } from './ColorPicker'\nimport type { AgentWithOverride, AgentColor } from './types'\nimport { DEFAULT_AGENT_MODEL } from './types'\nimport {\n modelOptions,\n openInEditor,\n titleForSource,\n toSelectableToolNames,\n} from './utils'\nimport { ToolPicker } from './wizard/ToolPicker'\n\nexport function EditAgent(props: {\n agent: AgentWithOverride\n tools: Tool[]\n onSaved: (message: string) => void\n onBack: () => void\n}) {\n const [mode, setMode] = useState<\n 'menu' | 'edit-tools' | 'edit-model' | 'edit-color'\n >('menu')\n const [selectedIndex, setSelectedIndex] = useState(0)\n const [error, setError] = useState<string | null>(null)\n\n const menuItems = useMemo(\n () => [\n { label: 'Open in editor', action: 'open' as const },\n { label: 'Edit tools', action: 'edit-tools' as const },\n { label: 'Edit model', action: 'edit-model' as const },\n { label: 'Edit color', action: 'edit-color' as const },\n ],\n [],\n )\n\n const doOpen = async () => {\n try {\n const location =\n props.agent.source === 'projectSettings'\n ? 'project'\n : props.agent.source === 'userSettings'\n ? 'user'\n : null\n if (!location)\n throw new Error(`Cannot open ${props.agent.source} agent in editor`)\n const filePath = getPrimaryAgentFilePath(location, props.agent.agentType)\n await openInEditor(filePath)\n props.onSaved(\n `Opened ${props.agent.agentType} in editor. If you made edits, restart to load the latest version.`,\n )\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n }\n }\n\n const doUpdate = async (patch: {\n tools?: string[] | '*'\n model?: string\n color?: string\n }) => {\n try {\n await updateAgent(\n props.agent,\n props.agent.whenToUse,\n patch.tools ?? props.agent.tools,\n props.agent.systemPrompt,\n patch.color ?? props.agent.color,\n patch.model ?? props.agent.model,\n )\n props.onSaved(`Updated agent: ${chalk.bold(props.agent.agentType)}`)\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n }\n }\n\n useInput((_input, key) => {\n if (key.escape) {\n setError(null)\n if (mode === 'menu') props.onBack()\n else setMode('menu')\n }\n\n if (mode !== 'menu') return\n\n if (key.upArrow) setSelectedIndex(i => Math.max(0, i - 1))\n else if (key.downArrow)\n setSelectedIndex(i => Math.min(menuItems.length - 1, i + 1))\n else if (key.return) {\n const item = menuItems[selectedIndex]\n if (!item) return\n if (item.action === 'open') void doOpen()\n else setMode(item.action)\n }\n })\n\n if (mode === 'edit-tools') {\n return (\n <>\n <Panel title={`Edit agent: ${props.agent.agentType}`}>\n <ToolPicker\n tools={props.tools}\n initialTools={toSelectableToolNames(props.agent.tools)}\n onComplete={selected => {\n const tools = selected === undefined ? '*' : selected\n void doUpdate({ tools })\n setMode('menu')\n }}\n onCancel={() => setMode('menu')}\n />\n {error ? (\n <Box marginTop={1}>\n <Text color={themeColor('error')}>{error}</Text>\n </Box>\n ) : null}\n </Panel>\n <Instructions instructions=\"Press Enter to toggle selection \u00B7 \u2191\u2193 Navigate \u00B7 Esc to go back\" />\n </>\n )\n }\n\n if (mode === 'edit-model') {\n useInput((_input, key) => {\n if (key.escape) setMode('menu')\n })\n\n return (\n <>\n <Panel title={`Edit agent: ${props.agent.agentType}`}>\n <Box flexDirection=\"column\" gap={1} marginTop={1}>\n <Text dimColor>\n Model determines the agent&apos;s reasoning capabilities and\n speed.\n </Text>\n <Select\n options={modelOptions()}\n defaultValue={props.agent.model ?? DEFAULT_AGENT_MODEL}\n onChange={value => {\n void doUpdate({ model: value })\n setMode('menu')\n }}\n />\n </Box>\n {error ? (\n <Box marginTop={1}>\n <Text color={themeColor('error')}>{error}</Text>\n </Box>\n ) : null}\n </Panel>\n <Instructions />\n </>\n )\n }\n\n if (mode === 'edit-color') {\n return (\n <>\n <Panel title={`Edit agent: ${props.agent.agentType}`}>\n <Box marginTop={1}>\n <ColorPicker\n agentName={props.agent.agentType}\n currentColor={(props.agent.color as AgentColor) ?? 'automatic'}\n onConfirm={color => {\n void doUpdate({\n color: color === 'automatic' ? undefined : color,\n })\n setMode('menu')\n }}\n />\n </Box>\n {error ? (\n <Box marginTop={1}>\n <Text color={themeColor('error')}>{error}</Text>\n </Box>\n ) : null}\n </Panel>\n <Instructions />\n </>\n )\n }\n\n return (\n <>\n <Panel title={`Edit agent: ${props.agent.agentType}`}>\n <Box flexDirection=\"column\">\n <Text dimColor>Source: {titleForSource(props.agent.source)}</Text>\n <Box marginTop={1} flexDirection=\"column\">\n {menuItems.map((item, idx) => (\n <React.Fragment key={item.label}>\n <Text\n color={\n idx === selectedIndex ? themeColor('suggestion') : undefined\n }\n >\n {idx === selectedIndex ? `${figures.pointer} ` : ' '}\n {item.label}\n </Text>\n </React.Fragment>\n ))}\n </Box>\n {error ? (\n <Box marginTop={1}>\n <Text color={themeColor('error')}>{error}</Text>\n </Box>\n ) : null}\n </Box>\n </Panel>\n <Instructions />\n </>\n )\n}\n", "import React from 'react'\nimport { join } from 'path'\nimport { Box, Text, useInput } from 'ink'\nimport figures from 'figures'\nimport type { Tool } from '../tooling'\nimport { themeColor } from './colors'\nimport { Instructions, Panel } from './components'\nimport type { AgentWithOverride } from './types'\nimport { formatModelLong, getToolNameFromSpec } from './utils'\n\nexport function ViewAgent(props: {\n agent: AgentWithOverride\n tools: Tool[]\n onBack: () => void\n}) {\n useInput((_input, key) => {\n if (key.escape || key.return) props.onBack()\n })\n\n const toolNames = new Set(props.tools.map(t => t.name))\n const parsedTools = (() => {\n const toolSpec = props.agent.tools\n if (toolSpec === '*')\n return { hasWildcard: true, valid: [], invalid: [] as string[] }\n if (!toolSpec || toolSpec.length === 0)\n return { hasWildcard: false, valid: [], invalid: [] as string[] }\n const names = toolSpec.map(getToolNameFromSpec).filter(Boolean)\n const valid: string[] = []\n const invalid: string[] = []\n for (const name of names) {\n if (\n name.includes('*') &&\n Array.from(toolNames).some(t => t.startsWith(name.replace(/\\*+$/, '')))\n ) {\n valid.push(name)\n continue\n }\n if (toolNames.has(name)) valid.push(name)\n else invalid.push(name)\n }\n return { hasWildcard: false, valid, invalid }\n })()\n\n const sourceLine = (() => {\n if (props.agent.source === 'built-in') return 'Built-in'\n if (props.agent.source === 'plugin')\n return `Plugin: ${props.agent.baseDir ?? 'Unknown'}`\n const baseDir = props.agent.baseDir\n const file = `${props.agent.filename ?? props.agent.agentType}.md`\n if (props.agent.source === 'projectSettings')\n return join('.claude', 'agents', file)\n if (baseDir) return join(baseDir, file)\n return props.agent.source\n })()\n\n const toolsSummary = () => {\n if (parsedTools.hasWildcard) return 'All tools'\n if (\n !props.agent.tools ||\n props.agent.tools === '*' ||\n props.agent.tools.length === 0\n )\n return 'None'\n return (\n <>\n {parsedTools.valid.length > 0 ? parsedTools.valid.join(', ') : null}\n {parsedTools.invalid.length > 0 ? (\n <>\n <Text color={themeColor('warning')}>\n {' '}\n {figures.warning} Unrecognized: {parsedTools.invalid.join(', ')}\n </Text>\n </>\n ) : null}\n </>\n )\n }\n\n return (\n <>\n <Panel title={props.agent.agentType}>\n <Box flexDirection=\"column\" gap={1}>\n <Text dimColor>{sourceLine}</Text>\n <Box flexDirection=\"column\">\n <Text>\n <Text bold>Description</Text> (tells Claude when to use this\n agent):\n </Text>\n <Box marginLeft={2}>\n <Text>{props.agent.whenToUse}</Text>\n </Box>\n </Box>\n <Text>\n <Text bold>Tools</Text>: {toolsSummary()}\n </Text>\n <Text>\n <Text bold>Model</Text>: {formatModelLong(props.agent.model)}\n </Text>\n {props.agent.color ? (\n <Text>\n <Text bold>Color</Text>: {props.agent.color}\n </Text>\n ) : null}\n {props.agent.systemPrompt ? (\n <>\n <Text>\n <Text bold>System prompt</Text>:\n </Text>\n <Box marginLeft={2} marginRight={2}>\n <Text>{props.agent.systemPrompt}</Text>\n </Box>\n </>\n ) : null}\n </Box>\n </Panel>\n <Instructions instructions=\"Press Enter or Esc to go back\" />\n </>\n )\n}\n", "import bug from './builtin/bug'\nimport clear from './builtin/clear'\nimport compact from './builtin/compact'\nimport config from './builtin/config'\nimport cost from './builtin/cost'\nimport ctx_viz from './debug/ctx_viz'\nimport doctor from './builtin/doctor'\nimport help from './builtin/help'\nimport init from './builtin/init'\nimport listen from './debug/listen'\nimport messages_debug from './debug/messages_debug'\nimport login from './builtin/login'\nimport logout from './builtin/logout'\nimport mcp from './mcp/mcp'\nimport plugin from './plugin/plugin'\nimport outputStyle from './builtin/output-style'\nimport * as model from './builtin/model'\nimport modelstatus from './builtin/modelstatus'\nimport onboarding from './builtin/onboarding'\nimport pr_comments from './builtin/pr_comments'\nimport refreshCommands from './builtin/refreshCommands'\nimport releaseNotes from './builtin/release-notes'\nimport review from './builtin/review'\nimport rename from './builtin/rename'\nimport statusline from './builtin/statusline'\nimport tag from './builtin/tag'\nimport todos from './builtin/todos'\nimport resume from './debug/resume'\nimport agents from './agent/agents'\nimport { getMCPCommands } from '#core/mcp/client'\nimport { loadCustomCommands } from '#cli-services/customCommands'\nimport { memoize } from 'lodash-es'\nimport { isAnthropicAuthEnabled } from '#core/utils/auth'\nimport type { Command } from './types'\n\nexport type { Command } from './types'\n\nconst INTERNAL_ONLY_COMMANDS = [ctx_viz, resume, listen, messages_debug]\n\n// Declared as a function so that we don't run this until getCommands is called,\n// since underlying functions read from config, which can't be read at module initialization time\nconst COMMANDS = memoize((): Command[] => [\n agents,\n clear,\n compact,\n config,\n cost,\n doctor,\n help,\n init,\n outputStyle,\n statusline,\n mcp,\n plugin,\n model,\n modelstatus,\n onboarding,\n pr_comments,\n rename,\n tag,\n refreshCommands,\n releaseNotes,\n bug,\n review,\n todos,\n ...(isAnthropicAuthEnabled() ? [logout, login()] : []),\n ...INTERNAL_ONLY_COMMANDS,\n])\n\nexport const getCommands = memoize(async (): Promise<Command[]> => {\n const [mcpCommands, customCommands] = await Promise.all([\n getMCPCommands(),\n loadCustomCommands(),\n ])\n\n return [...mcpCommands, ...customCommands, ...COMMANDS()].filter(\n _ => _.isEnabled,\n )\n})\n\nexport function hasCommand(commandName: string, commands: Command[]): boolean {\n return commands.some(\n _ => _.userFacingName() === commandName || _.aliases?.includes(commandName),\n )\n}\n\nexport function getCommand(commandName: string, commands: Command[]): Command {\n const command = commands.find(\n _ => _.userFacingName() === commandName || _.aliases?.includes(commandName),\n ) as Command | undefined\n if (!command) {\n throw ReferenceError(\n `Command ${commandName} not found. Available commands: ${commands\n .map(_ => {\n const name = _.userFacingName()\n return _.aliases ? `${name} (aliases: ${_.aliases.join(', ')})` : name\n })\n .join(', ')}`,\n )\n }\n\n return command\n}\n", "import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { extractTag } from '#core/utils/messages'\nimport { getTheme } from '#core/utils/theme'\nimport { TextBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\n\ntype Props = {\n addMargin: boolean\n param: TextBlockParam\n}\n\nexport function UserBashInputMessage({\n param: { text },\n addMargin,\n}: Props): React.ReactNode {\n const input = extractTag(text, 'bash-input')\n if (!input) {\n return null\n }\n return (\n <Box flexDirection=\"column\" marginTop={addMargin ? 1 : 0} width=\"100%\">\n <Box>\n <Text color={getTheme().bashBorder}>!</Text>\n <Text color={getTheme().secondaryText}> {input}</Text>\n </Box>\n </Box>\n )\n}\n", "import * as React from 'react'\nimport type { Message } from '#core/query'\nimport { getCommand } from '#cli-commands'\nimport { MalformedCommandError } from '#core/utils/errors'\nimport { logError } from '#core/utils/log'\nimport type { SetToolJSXFn, ToolUseContext } from '#core/tooling/Tool'\nimport {\n createAssistantMessage,\n createUserMessage,\n NO_RESPONSE_REQUESTED,\n} from '#core/utils/messages'\n\nexport async function getMessagesForSlashCommand(\n commandName: string,\n args: string,\n setToolJSX: SetToolJSXFn<React.ReactNode>,\n context: ToolUseContext & {\n setForkConvoWithMessagesOnTheNextRender: (\n forkConvoWithMessages: Message[],\n ) => void\n },\n): Promise<Message[]> {\n try {\n const command = getCommand(commandName, context.options.commands)\n\n switch (command.type) {\n case 'local-jsx': {\n return new Promise(resolveMessages => {\n command\n .call(\n r => {\n setToolJSX(null)\n resolveMessages([\n createUserMessage(`<command-name>${command.userFacingName()}</command-name>\n <command-message>${command.userFacingName()}</command-message>\n <command-args>${args}</command-args>`),\n r\n ? createAssistantMessage(r)\n : createAssistantMessage(NO_RESPONSE_REQUESTED),\n ])\n },\n context,\n args,\n )\n .then(jsx => {\n if (!jsx) return\n setToolJSX({ jsx, shouldHidePromptInput: true })\n })\n })\n }\n\n case 'local': {\n const userMessage =\n createUserMessage(`<command-name>${command.userFacingName()}</command-name>\n <command-message>${command.userFacingName()}</command-message>\n <command-args>${args}</command-args>`)\n\n try {\n // Use the context's abortController for local commands\n const result = await command.call(args, {\n ...context,\n options: {\n commands: context.options.commands || [],\n tools: context.options.tools || [],\n slowAndCapableModel:\n context.options.slowAndCapableModel || 'main',\n },\n })\n\n return [\n userMessage,\n createAssistantMessage(\n `<local-command-stdout>${result}</local-command-stdout>`,\n ),\n ]\n } catch (e) {\n logError(e)\n return [\n userMessage,\n createAssistantMessage(\n `<local-command-stderr>${String(e)}</local-command-stderr>`,\n ),\n ]\n }\n }\n\n case 'prompt': {\n // Compatibility: emit a metadata message, then the expanded prompt.\n const commandName = command.userFacingName()\n const progressMessage = command.progressMessage || 'running'\n const metaMessage =\n createUserMessage(`<command-name>${commandName}</command-name>\n <command-message>${commandName} is ${progressMessage}\u2026</command-message>\n <command-args>${args}</command-args>`)\n\n const prompt = await command.getPromptForCommand(args)\n const expandedMessages = prompt.map(msg => {\n // Create a normal user message from the custom command content\n const userMessage = createUserMessage(\n typeof msg.content === 'string'\n ? msg.content\n : msg.content\n .map(block => (block.type === 'text' ? block.text : ''))\n .join('\\n'),\n )\n\n // Add metadata for tracking but don't wrap in special tags\n userMessage.options = {\n ...userMessage.options,\n isCustomCommand: true,\n commandName: command.userFacingName(),\n commandArgs: args,\n }\n\n return userMessage\n })\n\n return [metaMessage, ...expandedMessages]\n }\n }\n } catch (e) {\n if (e instanceof MalformedCommandError) {\n return [createAssistantMessage(e.message)]\n }\n throw e\n }\n}\n", "import type { ImageBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\n\ntype AnthropicImageMediaType = Extract<\n ImageBlockParam['source'],\n { type: 'base64' }\n>['media_type']\n\nconst ALLOWED_IMAGE_MEDIA_TYPES = new Set<AnthropicImageMediaType>([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n])\n\nexport function coerceImageMediaType(value: string): AnthropicImageMediaType {\n return ALLOWED_IMAGE_MEDIA_TYPES.has(value as AnthropicImageMediaType)\n ? (value as AnthropicImageMediaType)\n : 'image/png'\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== 'object') return null\n return value as Record<string, unknown>\n}\n\nexport function extractAssistantText(content: unknown): string {\n if (typeof content === 'string') return content\n if (!Array.isArray(content)) return ''\n const parts: string[] = []\n for (const block of content) {\n const record = asRecord(block)\n if (!record || record.type !== 'text') continue\n parts.push(String(record.text ?? ''))\n }\n return parts.join('')\n}\n", "import { useCallback, useEffect, useRef, useState } from 'react'\nimport {\n countLineBreaks,\n normalizeLineEndings,\n shouldTreatAsSpecialPaste,\n} from '#core/utils/paste'\nimport type { PromptMode } from './types'\n\nexport type PastedTextSegment = { placeholder: string; text: string }\nexport type PastedImageAttachment = {\n placeholder: string\n data: string\n mediaType: string\n}\n\nexport function expandPastedTextPlaceholders(args: {\n input: string\n pastedTexts: PastedTextSegment[]\n}): string {\n let next = args.input\n for (const { placeholder, text } of args.pastedTexts) {\n if (!next.includes(placeholder)) continue\n next = next.replace(placeholder, text)\n }\n return next\n}\n\nexport function usePromptPastes(args: {\n input: string\n cursorOffset: number\n onInputChange: (value: string) => void\n setCursorOffset: (value: number) => void\n onModeChange: (mode: PromptMode) => void\n terminalRows: number\n}) {\n const [pastedTexts, setPastedTexts] = useState<PastedTextSegment[]>([])\n const [pastedImages, setPastedImages] = useState<PastedImageAttachment[]>([])\n const pastedTextCounter = useRef(1)\n const pastedImageCounter = useRef(1)\n\n const onImagePaste = useCallback(\n (base64Image: string): string => {\n args.onModeChange('prompt')\n const placeholder = `[Image #${pastedImageCounter.current}]`\n pastedImageCounter.current += 1\n setPastedImages(prev => [\n ...prev,\n { placeholder, data: base64Image, mediaType: 'image/png' },\n ])\n return placeholder\n },\n [args],\n )\n\n const onTextPaste = useCallback(\n (rawText: string) => {\n const text = normalizeLineEndings(rawText)\n const newlineCount = countLineBreaks(text)\n\n if (\n !shouldTreatAsSpecialPaste(text, { terminalRows: args.terminalRows })\n ) {\n const newInput =\n args.input.slice(0, args.cursorOffset) +\n text +\n args.input.slice(args.cursorOffset)\n args.onInputChange(newInput)\n args.setCursorOffset(args.cursorOffset + text.length)\n return\n }\n\n const pasteId = pastedTextCounter.current\n pastedTextCounter.current += 1\n const pastedPrompt =\n newlineCount === 0\n ? `[Pasted text #${pasteId}]`\n : `[Pasted text #${pasteId} +${newlineCount} lines]`\n\n const newInput =\n args.input.slice(0, args.cursorOffset) +\n pastedPrompt +\n args.input.slice(args.cursorOffset)\n args.onInputChange(newInput)\n args.setCursorOffset(args.cursorOffset + pastedPrompt.length)\n setPastedTexts(prev => [...prev, { placeholder: pastedPrompt, text }])\n },\n [args],\n )\n\n const clearPastes = useCallback(() => {\n setPastedImages([])\n setPastedTexts([])\n }, [])\n\n useEffect(() => {\n setPastedTexts(prev => prev.filter(p => args.input.includes(p.placeholder)))\n setPastedImages(prev =>\n prev.filter(p => args.input.includes(p.placeholder)),\n )\n }, [args.input])\n\n return {\n pastedTexts,\n pastedImages,\n setPastedTexts,\n setPastedImages,\n onImagePaste,\n onTextPaste,\n clearPastes,\n }\n}\n", "type TextBlockLike = { type: 'text'; text: string }\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== 'object') return null\n return value as Record<string, unknown>\n}\n\nfunction extractMessageText(content: unknown): string {\n if (typeof content === 'string') return content\n if (!Array.isArray(content)) return ''\n const parts: string[] = []\n for (const block of content) {\n const record = asRecord(block)\n if (!record || record.type !== 'text') continue\n parts.push(String((record as TextBlockLike).text ?? ''))\n }\n return parts.join('\\n')\n}\n\nexport async function interpretHashCommand(input: string): Promise<string> {\n try {\n const { queryQuick } = await import('#core/ai/llm')\n\n const systemPrompt = [\n \"You're helping the user structure notes that will be added to their AGENTS.md file.\",\n \"Format the user's input into a well-structured note that will be useful for later reference.\",\n 'Add appropriate markdown formatting, headings, bullet points, or other structural elements as needed.',\n 'The goal is to transform the raw note into something that will be more useful when reviewed later.',\n 'You should keep the original meaning but make the structure clear.',\n ]\n\n const result = await queryQuick({\n systemPrompt,\n userPrompt: `Transform this note for AGENTS.md: ${input}`,\n })\n\n const text = extractMessageText(result.message.content)\n if (text.trim()) return text\n } catch {\n // Fall through to minimal formatting.\n }\n\n return `# ${input}\\n\\n_Added on ${new Date().toLocaleString()}_`\n}\n", "import type React from 'react'\nimport type { Command } from '#cli-commands'\nimport type { Message } from '#core/query'\nimport type { PermissionMode } from '#core/types/PermissionMode'\nimport type { ToolPermissionContext } from '#core/types/toolPermissionContext'\nimport type { SetToolJSXFn, Tool } from '#core/tooling/Tool'\nimport { addToHistory } from '#core/history'\nimport { logError } from '#core/utils/log'\nimport { handleHashCommand } from '#core/utils/hashCommand'\nimport { processUserInput } from '#ui-ink/utils/processUserInput'\nimport type { PromptMode } from './types'\nimport type { PastedImageAttachment, PastedTextSegment } from './pastes'\nimport { expandPastedTextPlaceholders } from './pastes'\nimport { interpretHashCommand } from './hashCommand'\nimport { getCwd } from '#core/utils/state'\n\nconst EXIT_COMMANDS = new Set(['exit', 'quit', ':q', ':q!', ':wq', ':wq!'])\n\nfunction getKodingContext(): string {\n return [\n 'The user is using Koding mode.',\n 'Format your response as a comprehensive, well-structured document suitable for adding to AGENTS.md.',\n 'Use proper markdown formatting with headings, lists, code blocks, etc.',\n 'The response should be complete and ready to add to AGENTS.md documentation.',\n ].join(' ')\n}\n\nexport async function submitPrompt(args: {\n input: string\n mode: PromptMode\n completionActive: boolean\n suggestionCount: number\n isSubmittingSlashCommand?: boolean\n isDisabled: boolean\n isLoading: boolean\n isEditingExternally: boolean\n abortController: AbortController | null\n setIsLoading: (isLoading: boolean) => void\n setAbortController: (abortController: AbortController | null) => void\n onInputChange: (value: string) => void\n onModeChange: (mode: PromptMode) => void\n setCursorOffset: (offset: number) => void\n onSubmitCountChange: (updater: (prev: number) => number) => void\n onQuery: (\n newMessages: Message[],\n abortController?: AbortController,\n ) => Promise<void>\n setToolJSX: SetToolJSXFn<React.ReactNode>\n commands: Command[]\n forkNumber: number\n messageLogName: string\n tools: Tool[]\n verbose: boolean\n disableSlashCommands?: boolean\n permissionMode: PermissionMode\n toolPermissionContext: ToolPermissionContext\n setForkConvoWithMessagesOnTheNextRender: (\n forkConvoWithMessages: Message[],\n ) => void\n readFileTimestamps: { [filename: string]: number }\n pastedTexts: PastedTextSegment[]\n pastedImages: PastedImageAttachment[]\n clearPastes: () => void\n resetHistory: () => void\n setCurrentPwd: (pwd: string) => void\n exit: () => never\n}): Promise<void> {\n if (args.isEditingExternally) return\n\n if (\n !args.isSubmittingSlashCommand &&\n args.completionActive &&\n args.suggestionCount > 0\n ) {\n return\n }\n\n if (!args.input) return\n if (args.isDisabled) return\n if (args.isLoading) return\n\n const trimmed = args.input.trim()\n if (!trimmed) return\n\n if (EXIT_COMMANDS.has(trimmed)) {\n args.exit()\n }\n\n const isKoding = args.mode === 'koding' || args.input.startsWith('#')\n const isKodingActionPrompt =\n isKoding &&\n args.input.match(/^(#\\s*)?(put|create|generate|write|give|provide)/i)\n\n if (isKoding && !isKodingActionPrompt) {\n try {\n const contentToInterpret =\n args.mode === 'koding' && !args.input.startsWith('#')\n ? args.input.trim()\n : args.input.substring(1).trim()\n const interpreted = await interpretHashCommand(contentToInterpret)\n handleHashCommand(interpreted)\n } catch (error) {\n logError(error)\n }\n\n args.onInputChange('')\n args.setCursorOffset(0)\n addToHistory(args.mode === 'koding' ? `#${args.input}` : args.input)\n args.resetHistory()\n args.onModeChange('prompt')\n return\n }\n\n const effectiveMode: PromptMode =\n isKodingActionPrompt && args.mode !== 'bash' ? 'prompt' : args.mode\n\n const finalInput = expandPastedTextPlaceholders({\n input:\n isKodingActionPrompt && args.mode === 'koding'\n ? args.input.trim()\n : args.input,\n pastedTexts: args.pastedTexts,\n })\n\n const imagesForMessage = args.pastedImages\n\n args.clearPastes()\n args.onInputChange('')\n args.setCursorOffset(0)\n args.onSubmitCountChange(prev => prev + 1)\n\n if (effectiveMode !== 'bash') {\n args.onModeChange('prompt')\n }\n\n args.setIsLoading(true)\n\n const controller = new AbortController()\n args.setAbortController(controller)\n\n const kodingContext = isKodingActionPrompt ? getKodingContext() : undefined\n\n let newMessages: Message[]\n try {\n newMessages = await processUserInput(\n finalInput,\n effectiveMode,\n args.setToolJSX,\n {\n options: {\n commands: args.commands,\n forkNumber: args.forkNumber,\n messageLogName: args.messageLogName,\n tools: args.tools,\n verbose: args.verbose,\n maxThinkingTokens: 0,\n permissionMode: args.permissionMode,\n toolPermissionContext: args.toolPermissionContext,\n disableSlashCommands: args.disableSlashCommands,\n isKodingRequest: isKodingActionPrompt ? true : undefined,\n kodingContext,\n },\n messageId: undefined,\n abortController: controller,\n readFileTimestamps: args.readFileTimestamps,\n setForkConvoWithMessagesOnTheNextRender:\n args.setForkConvoWithMessagesOnTheNextRender,\n },\n imagesForMessage.length > 0 ? imagesForMessage : null,\n )\n } catch (error) {\n args.setIsLoading(false)\n logError(error)\n return\n }\n\n if (newMessages.length === 0) {\n addToHistory(args.input)\n args.resetHistory()\n args.setIsLoading(false)\n return\n }\n\n const shouldUpdatePwdAfterBash = effectiveMode === 'bash'\n\n try {\n await args.onQuery(newMessages, controller)\n if (shouldUpdatePwdAfterBash) {\n args.setCurrentPwd(getCwd())\n }\n } catch (error) {\n logError(error)\n }\n\n for (const message of newMessages) {\n if (message.type !== 'user') continue\n const inputToAdd = effectiveMode === 'bash' ? `!${args.input}` : args.input\n addToHistory(inputToAdd)\n args.resetHistory()\n }\n}\n", "import { Box, Text, type Key } from 'ink'\nimport * as React from 'react'\nimport { CompactModeIndicator } from '#ui-ink/components/ModeIndicator'\nimport { SentryErrorBoundary } from '#ui-ink/components/SentryErrorBoundary'\nimport TextInput from '#ui-ink/components/TextInput'\nimport { TokenWarning } from '#ui-ink/components/TokenWarning'\nimport type { PermissionMode } from '#core/types/PermissionMode'\nimport type { Theme } from '#core/utils/theme'\nimport type { PromptMode } from './types'\nimport { PromptInputCompletionPanel } from './PromptInputCompletionPanel'\n\ntype ModelInfo = {\n name: string\n provider: string\n contextLength: number\n currentTokens: number\n} | null\n\ntype ExitMessageState = { show: boolean; key?: string }\ntype InlineMessageState = { show: boolean; text?: string }\n\ntype Suggestion = {\n type: string\n value: string\n displayValue: string\n metadata?: { color?: string }\n}\n\nexport function PromptInputView({\n mode,\n theme,\n currentPwd,\n modelInfo,\n input,\n cursorOffset,\n setCursorOffset,\n onSubmit,\n onChange,\n isEditingExternally,\n isDisabled,\n isLoading,\n completionActive,\n suggestions,\n selectedIndex,\n emptyDirMessage,\n handleHistoryUp,\n handleHistoryDown,\n resetHistory,\n placeholder,\n submitCount,\n onExit,\n onExitMessage,\n onMessage,\n onImagePaste,\n onTextPaste,\n onSpecialKey,\n exitMessage,\n message,\n rewindMessagePending,\n modelSwitchMessage,\n statusLine,\n currentMode,\n modeCycleShortcutText,\n showQuickModelSwitchShortcut,\n tokenUsage,\n textInputColumns,\n}: {\n mode: PromptMode\n theme: Theme\n currentPwd: string\n modelInfo: ModelInfo\n input: string\n cursorOffset: number\n setCursorOffset: (offset: number) => void\n onSubmit: (value: string, isSubmittingSlashCommand?: boolean) => void\n onChange: (value: string) => void\n isEditingExternally: boolean\n isDisabled: boolean\n isLoading: boolean\n completionActive: boolean\n suggestions: Suggestion[]\n selectedIndex: number\n emptyDirMessage: string\n handleHistoryUp: () => void\n handleHistoryDown: () => void\n resetHistory: () => void\n placeholder: string\n submitCount: number\n onExit: () => never\n onExitMessage: (show: boolean, key?: string) => void\n onMessage: (show: boolean, text?: string) => void\n onImagePaste: (base64Image: string) => string | void\n onTextPaste: (text: string) => void\n onSpecialKey: (input: string, key: Key) => boolean\n exitMessage: ExitMessageState\n message: InlineMessageState\n rewindMessagePending: boolean\n modelSwitchMessage: InlineMessageState\n statusLine: string | null\n currentMode: PermissionMode\n modeCycleShortcutText: string\n showQuickModelSwitchShortcut: boolean\n tokenUsage: number\n textInputColumns: number\n}): React.ReactNode {\n return (\n <Box flexDirection=\"column\">\n {/* Model info - top right of input */}\n {modelInfo && (\n <Box justifyContent=\"flex-end\" flexDirection=\"row\">\n <Text dimColor>\n [{modelInfo.provider}] {modelInfo.name}:{' '}\n {Math.round(modelInfo.currentTokens / 1000)}k /{' '}\n {Math.round(modelInfo.contextLength / 1000)}k\n </Text>\n </Box>\n )}\n\n {/* Input box */}\n <Box\n alignItems=\"flex-start\"\n justifyContent=\"flex-start\"\n borderTop={true}\n borderBottom={true}\n borderLeft={false}\n borderRight={false}\n borderColor={\n mode === 'bash'\n ? theme.bashBorder\n : mode === 'koding'\n ? theme.notingBorder\n : theme.inputBorder\n }\n borderDimColor={false}\n borderStyle=\"classic\"\n width=\"100%\"\n >\n <Box\n alignItems=\"flex-start\"\n alignSelf=\"flex-start\"\n flexWrap=\"nowrap\"\n justifyContent=\"flex-start\"\n width={3}\n >\n {mode === 'bash' ? (\n <Text color={theme.bashBorder}>&nbsp;!&nbsp;</Text>\n ) : mode === 'koding' ? (\n <Text color={theme.noting}>&nbsp;#&nbsp;</Text>\n ) : (\n <Text color={isLoading ? theme.secondaryText : undefined}>\n K&gt;&nbsp;\n </Text>\n )}\n </Box>\n <Box paddingRight={1}>\n <TextInput\n multiline\n focus={!isEditingExternally}\n onSubmit={onSubmit}\n onChange={onChange}\n value={input}\n onHistoryUp={handleHistoryUp}\n onHistoryDown={handleHistoryDown}\n onHistoryReset={resetHistory}\n placeholder={submitCount > 0 ? undefined : placeholder}\n onExit={onExit}\n onExitMessage={onExitMessage}\n onMessage={onMessage}\n onImagePaste={onImagePaste}\n columns={textInputColumns}\n isDimmed={isDisabled || isLoading || isEditingExternally}\n disableCursorMovementForUpDownKeys={completionActive}\n cursorOffset={cursorOffset}\n onChangeCursorOffset={setCursorOffset}\n onPaste={onTextPaste}\n onSpecialKey={onSpecialKey}\n />\n </Box>\n </Box>\n\n {/* PWD line - first line below input */}\n <Box flexDirection=\"row\" paddingX={1}>\n <Text dimColor>{currentPwd}</Text>\n </Box>\n\n {/* Status line - below PWD */}\n {!completionActive && suggestions.length === 0 && (\n <Box flexDirection=\"column\">\n <Box flexDirection=\"row\" justifyContent=\"space-between\" paddingX={1}>\n <Box justifyContent=\"flex-start\" gap={1}>\n {exitMessage.show ? (\n <Text dimColor>Press {exitMessage.key} again to exit</Text>\n ) : message.show ? (\n <Text dimColor>{message.text}</Text>\n ) : rewindMessagePending ? (\n <Text dimColor>Press Escape again to undo</Text>\n ) : modelSwitchMessage.show ? (\n <Text color={theme.success}>{modelSwitchMessage.text}</Text>\n ) : statusLine ? (\n <Text dimColor>{statusLine}</Text>\n ) : null}\n </Box>\n <SentryErrorBoundary\n children={\n <Box justifyContent=\"flex-end\" gap={1}>\n <TokenWarning tokenUsage={tokenUsage} />\n </Box>\n }\n />\n </Box>\n {mode === 'prompt' && currentMode !== 'default' && (\n <Box paddingX={1}>\n <CompactModeIndicator />\n </Box>\n )}\n </Box>\n )}\n\n {suggestions.length > 0 && (\n <PromptInputCompletionPanel\n theme={theme}\n suggestions={suggestions}\n selectedIndex={selectedIndex}\n emptyDirMessage={emptyDirMessage}\n tokenUsage={tokenUsage}\n />\n )}\n </Box>\n )\n}\n", "import React from 'react'\nimport { Box, Text } from 'ink'\nimport { usePermissionContext } from '#ui-ink/context/PermissionContext'\nimport { getTheme, type Theme } from '#core/utils/theme'\nimport { getPermissionModeCycleShortcut } from '#ui-ink/utils/permissionModeCycleShortcut'\nimport type { PermissionMode } from '#core/types/PermissionMode'\n\ninterface ModeIndicatorProps {\n showTransitionCount?: boolean\n}\n\nexport function ModeIndicator({\n showTransitionCount = false,\n}: ModeIndicatorProps) {\n const { currentMode, permissionContext } = usePermissionContext()\n const theme = getTheme()\n const shortcut = getPermissionModeCycleShortcut()\n\n // Don't show indicator for default mode unless explicitly requested\n if (currentMode === 'default' && !showTransitionCount) {\n return null\n }\n\n const indicator = __getModeIndicatorDisplayForTests({\n mode: currentMode,\n shortcutDisplayText: shortcut.displayText,\n theme,\n })\n\n return (\n <Box flexDirection=\"row\" justifyContent=\"space-between\" width=\"100%\">\n <Text color={indicator.color}>\n {indicator.mainText}\n {indicator.shortcutHintText ? (\n <Text dimColor>{indicator.shortcutHintText}</Text>\n ) : null}\n </Text>\n {showTransitionCount && (\n <Text color=\"gray\" dimColor>\n Switches: {permissionContext.metadata.transitionCount}\n </Text>\n )}\n </Box>\n )\n}\n\nexport function __getModeIndicatorDisplayForTests(args: {\n mode: PermissionMode\n shortcutDisplayText: string\n theme: Theme\n}): {\n shouldRender: boolean\n color: string\n mainText: string\n shortcutHintText: string\n} {\n if (args.mode === 'default') {\n return {\n shouldRender: false,\n color: args.theme.text,\n mainText: '',\n shortcutHintText: '',\n }\n }\n\n const icon = getModeIndicatorIcon(args.mode)\n const label = getModeIndicatorLabel(args.mode).toLowerCase()\n const color = getModeIndicatorColor(args.theme, args.mode)\n\n return {\n shouldRender: true,\n color,\n mainText: `${icon} ${label} on`,\n shortcutHintText: ` (${args.shortcutDisplayText} to cycle)`,\n }\n}\n\nfunction getModeIndicatorLabel(mode: PermissionMode): string {\n switch (mode) {\n case 'default':\n return 'Default'\n case 'plan':\n return 'Plan Mode'\n case 'acceptEdits':\n return 'Accept edits'\n case 'bypassPermissions':\n return 'Bypass Permissions'\n case 'dontAsk':\n return \"Don't Ask\"\n }\n}\n\nfunction getModeIndicatorIcon(mode: PermissionMode): string {\n switch (mode) {\n case 'default':\n return ''\n case 'plan':\n return '\u23F8'\n case 'acceptEdits':\n case 'bypassPermissions':\n case 'dontAsk':\n return '\u23F5\u23F5'\n }\n}\n\nfunction getModeIndicatorColor(theme: Theme, mode: PermissionMode): string {\n switch (mode) {\n case 'default':\n return theme.text\n case 'plan':\n return theme.planMode\n case 'acceptEdits':\n return theme.autoAccept\n case 'bypassPermissions':\n case 'dontAsk':\n return theme.error\n }\n}\n\n// Compact mode indicator for status bar\nexport function CompactModeIndicator() {\n const { currentMode } = usePermissionContext()\n const theme = getTheme()\n const shortcut = getPermissionModeCycleShortcut()\n\n if (currentMode === 'default') {\n return null\n }\n\n const indicator = __getModeIndicatorDisplayForTests({\n mode: currentMode,\n shortcutDisplayText: shortcut.displayText,\n theme,\n })\n\n return (\n <Text color={indicator.color}>\n {indicator.mainText}\n <Text dimColor>{indicator.shortcutHintText}</Text>\n </Text>\n )\n}\n", "import * as React from 'react'\nimport { logError } from '#core/utils/log'\n\ninterface Props {\n children: React.ReactNode\n}\n\ninterface State {\n hasError: boolean\n}\n\nexport class SentryErrorBoundary extends React.Component<Props, State> {\n state: State = { hasError: false }\n\n static getDerivedStateFromError(): State {\n return { hasError: true }\n }\n\n componentDidCatch(error: Error): void {\n // Don't report user-initiated cancellations to Sentry\n if (\n error.name === 'AbortError' ||\n error.message?.includes('abort') ||\n error.message?.includes('The operation was aborted')\n ) {\n return\n }\n logError(error)\n }\n\n render(): React.ReactNode {\n if (this.state.hasError) {\n return null\n }\n\n return this.props.children\n }\n}\n", "import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { getTheme } from '#core/utils/theme'\n\ntype Props = {\n tokenUsage: number\n}\n\nconst MAX_TOKENS = 190_000\nexport const WARNING_THRESHOLD = MAX_TOKENS * 0.6\nconst ERROR_THRESHOLD = MAX_TOKENS * 0.8\n\nexport function TokenWarning({ tokenUsage }: Props): React.ReactNode {\n const theme = getTheme()\n\n if (tokenUsage < WARNING_THRESHOLD) {\n return null\n }\n\n const isError = tokenUsage >= ERROR_THRESHOLD\n\n return (\n <Box flexDirection=\"row\">\n <Text color={isError ? theme.error : theme.warning}>\n Context low (\n {Math.max(0, 100 - Math.round((tokenUsage / MAX_TOKENS) * 100))}%\n remaining) &middot; Run /compact to compact & continue\n </Text>\n </Box>\n )\n}\n", "import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { SentryErrorBoundary } from '#ui-ink/components/SentryErrorBoundary'\nimport { TokenWarning } from '#ui-ink/components/TokenWarning'\nimport type { Theme } from '#core/utils/theme'\n\ntype Suggestion = {\n type: string\n value: string\n displayValue: string\n metadata?: { color?: string }\n}\n\nexport function PromptInputCompletionPanel({\n theme,\n suggestions,\n selectedIndex,\n emptyDirMessage,\n tokenUsage,\n}: {\n theme: Theme\n suggestions: Suggestion[]\n selectedIndex: number\n emptyDirMessage: string\n tokenUsage: number\n}): React.ReactNode {\n const renderedSuggestions = suggestions.map((suggestion, index) => {\n const isSelected = index === selectedIndex\n const isAgent = suggestion.type === 'agent'\n const displayColor = isSelected\n ? theme.suggestion\n : isAgent && suggestion.metadata?.color\n ? suggestion.metadata.color\n : undefined\n\n return (\n <Box\n key={`${suggestion.type}-${suggestion.value}-${index}`}\n flexDirection=\"row\"\n >\n <Text color={displayColor} dimColor={!isSelected && !displayColor}>\n {isSelected ? '\u25C6 ' : ' '}\n {suggestion.displayValue}\n </Text>\n </Box>\n )\n })\n\n return (\n <Box flexDirection=\"row\" justifyContent=\"space-between\" paddingX={2}>\n <Box flexDirection=\"column\">\n {renderedSuggestions}\n <Box marginTop={1} paddingX={3} borderStyle=\"round\" borderColor=\"gray\">\n <Text\n dimColor={!emptyDirMessage}\n color={emptyDirMessage ? 'yellow' : undefined}\n >\n {emptyDirMessage ||\n (() => {\n const selected = suggestions[selectedIndex]\n if (!selected) {\n return '\u2191\u2193 navigate \u2022 \u2192 accept \u2022 Tab cycle \u2022 Esc close'\n }\n if (selected.value.endsWith('/')) {\n return '\u2192 enter directory \u2022 \u2191\u2193 navigate \u2022 Tab cycle \u2022 Esc close'\n }\n if (selected.type === 'agent') {\n return '\u2192 select agent \u2022 \u2191\u2193 navigate \u2022 Tab cycle \u2022 Esc close'\n }\n return '\u2192 insert reference \u2022 \u2191\u2193 navigate \u2022 Tab cycle \u2022 Esc close'\n })()}\n </Text>\n </Box>\n </Box>\n <SentryErrorBoundary\n children={\n <Box justifyContent=\"flex-end\" gap={1}>\n <TokenWarning tokenUsage={tokenUsage} />\n </Box>\n }\n />\n </Box>\n )\n}\n", "import { useCallback, useState } from 'react'\nimport { launchExternalEditor } from '#cli-utils/externalEditor'\n\ntype InlineMessageState = { show: boolean; text?: string }\n\nexport function useExternalEdit(args: {\n input: string\n isLoading: boolean\n isDisabled: boolean\n onInputChange: (text: string) => void\n setCursorOffset: (offset: number) => void\n setMessage: (message: InlineMessageState) => void\n}) {\n const [isEditingExternally, setIsEditingExternally] = useState(false)\n\n const handleExternalEdit = useCallback(async () => {\n if (isEditingExternally || args.isLoading || args.isDisabled) return\n setIsEditingExternally(true)\n args.setMessage({ show: true, text: 'Opening external editor...' })\n\n const result = await launchExternalEditor(args.input)\n if (result.text !== null) {\n args.onInputChange(result.text)\n args.setCursorOffset(result.text.length)\n args.setMessage({\n show: true,\n text: `Loaded from ${result.editorLabel ?? 'editor'}`,\n })\n setTimeout(() => args.setMessage({ show: false }), 3000)\n } else {\n args.setMessage({\n show: true,\n text:\n ('error' in result && result.error?.message) ??\n 'External editor unavailable. Set $EDITOR or install code/nano/vim/notepad.',\n })\n setTimeout(() => args.setMessage({ show: false }), 4000)\n }\n\n setIsEditingExternally(false)\n }, [args, isEditingExternally])\n\n return { isEditingExternally, handleExternalEdit }\n}\n", "import { useCallback } from 'react'\nimport { countTokens } from '#core/utils/tokens'\nimport { getModelManager } from '#core/utils/model'\nimport type { Message } from '#core/query'\n\ntype InlineMessageState = { show: boolean; text?: string }\n\nexport function useQuickModelSwitch(args: {\n messages: Message[]\n onSubmitCountChange: (updater: (prev: number) => number) => void\n setModelSwitchMessage: (message: InlineMessageState) => void\n onModelChange?: () => void\n}) {\n return useCallback(() => {\n const modelManager = getModelManager()\n const currentTokens = countTokens(args.messages)\n const debugInfo = modelManager.getModelSwitchingDebugInfo()\n const switchResult = modelManager.switchToNextModel(currentTokens)\n\n if (switchResult.success && switchResult.modelName) {\n args.onModelChange?.()\n args.onSubmitCountChange(prev => prev + 1)\n args.setModelSwitchMessage({\n show: true,\n text:\n switchResult.message || `\u2705 Switched to ${switchResult.modelName}`,\n })\n setTimeout(() => args.setModelSwitchMessage({ show: false }), 3000)\n return\n }\n\n let errorMessage = switchResult.message\n if (!errorMessage) {\n if (debugInfo.totalModels === 0) {\n errorMessage = '\u274C No models configured. Use /model to add models.'\n } else if (debugInfo.activeModels === 0) {\n errorMessage = `\u274C No active models (${debugInfo.totalModels} total, all inactive). Use /model to activate models.`\n } else if (debugInfo.activeModels === 1) {\n const allModelNames = debugInfo.availableModels\n .map(m => `${m.name}${m.isActive ? '' : ' (inactive)'}`)\n .join(', ')\n errorMessage = `\u26A0\uFE0F Only 1 active model out of ${debugInfo.totalModels} total models: ${allModelNames}. ALL configured models will be activated for switching.`\n } else {\n errorMessage = `\u274C Model switching failed (${debugInfo.activeModels} active, ${debugInfo.totalModels} total models available)`\n }\n }\n\n args.setModelSwitchMessage({ show: true, text: errorMessage })\n setTimeout(() => args.setModelSwitchMessage({ show: false }), 6000)\n }, [args])\n}\n", "import { Box, Text } from 'ink'\nimport React, { useEffect, useMemo, useRef, useState } from 'react'\nimport { getTheme } from '#core/utils/theme'\nimport {\n getRequestStatus,\n subscribeRequestStatus,\n type RequestStatus,\n} from '#core/utils/requestStatus'\n\nconst CHARACTERS =\n process.platform === 'darwin'\n ? ['\u00B7', '\u2722', '\u2733', '\u2217', '\u273B', '\u273D']\n : ['\u00B7', '\u2722', '*', '\u2217', '\u273B', '\u273D']\n\nfunction getLabel(status: RequestStatus): string {\n switch (status.kind) {\n case 'thinking':\n return 'Thinking'\n case 'streaming':\n return 'Streaming'\n case 'tool':\n return status.detail ? `Running tool: ${status.detail}` : 'Running tool'\n case 'idle':\n return 'Working'\n }\n}\n\nexport function RequestStatusIndicator(): React.ReactNode {\n const frames = useMemo(\n () => [...CHARACTERS, ...[...CHARACTERS].reverse()],\n [],\n )\n const theme = getTheme()\n\n const [frame, setFrame] = useState(0)\n const [elapsedTime, setElapsedTime] = useState(0)\n const [status, setStatus] = useState<RequestStatus>(() => getRequestStatus())\n\n const requestStartTime = useRef<number | null>(null)\n\n useEffect(() => {\n return subscribeRequestStatus(next => {\n setStatus(next)\n if (next.kind !== 'idle' && requestStartTime.current === null) {\n requestStartTime.current = Date.now()\n }\n if (next.kind === 'idle') {\n requestStartTime.current = null\n setElapsedTime(0)\n }\n })\n }, [])\n\n useEffect(() => {\n const timer = setInterval(() => {\n setFrame(f => (f + 1) % frames.length)\n }, 120)\n return () => clearInterval(timer)\n }, [frames.length])\n\n useEffect(() => {\n const timer = setInterval(() => {\n if (requestStartTime.current === null) {\n setElapsedTime(0)\n return\n }\n setElapsedTime(Math.floor((Date.now() - requestStartTime.current) / 1000))\n }, 250)\n return () => clearInterval(timer)\n }, [])\n\n return (\n <Box flexDirection=\"row\" marginTop={1}>\n <Box flexWrap=\"nowrap\" height={1} width={2}>\n <Text color={theme.kode}>{frames[frame]}</Text>\n </Box>\n <Text color={theme.kode}>{getLabel(status)}\u2026 </Text>\n <Text color={theme.secondaryText}>\n ({elapsedTime}s \u00B7 <Text bold>esc</Text> to interrupt)\n </Text>\n </Box>\n )\n}\n", "import { Box, Text, useInput } from 'ink'\nimport React from 'react'\nimport { Select } from './CustomSelect/select'\nimport { getTheme } from '#core/utils/theme'\nimport Link from './Link'\n\ninterface Props {\n onDone: () => void\n}\n\nexport function CostThresholdDialog({ onDone }: Props): React.ReactNode {\n // Handle Ctrl+C, Ctrl+D and Esc\n useInput((input, key) => {\n if ((key.ctrl && (input === 'c' || input === 'd')) || key.escape) {\n onDone()\n }\n })\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n padding={1}\n borderColor={getTheme().secondaryBorder}\n >\n <Box marginBottom={1} flexDirection=\"column\">\n <Text bold>\n You&apos;ve spent $5 on AI model API calls this session.\n </Text>\n <Text>Learn more about monitoring your AI usage costs:</Text>\n <Link url=\"https://github.com/shareAI-lab/kode/blob/main/README.md\" />\n </Box>\n <Box>\n <Select\n options={[\n {\n value: 'ok',\n label: 'Got it, thanks!',\n },\n ]}\n onChange={onDone}\n />\n </Box>\n </Box>\n )\n}\n", "import InkLink from 'ink-link'\nimport { Text } from 'ink'\nimport React from 'react'\nimport { env } from '#core/utils/env'\n\ntype LinkProps = {\n url: string\n children?: React.ReactNode\n fallback?: boolean\n}\n\n// Terminals that support hyperlinks\nconst LINK_SUPPORTING_TERMINALS = ['iTerm.app', 'WezTerm', 'Hyper', 'VSCode']\n\nexport function supportsHyperlinks(): boolean {\n return LINK_SUPPORTING_TERMINALS.includes(env.terminal ?? '')\n}\n\nexport default function Link({ url, children, fallback = true }: LinkProps): React.ReactNode {\n const supportsLinks = supportsHyperlinks()\n const displayContent = children || url\n\n if (supportsLinks) {\n // Terminal supports clickable links\n return (\n <InkLink url={url} fallback={false}>\n <Text>{displayContent}</Text>\n </InkLink>\n )\n } else if (fallback && children) {\n // Show fallback format: text (URL) when we have custom display text\n return (\n <InkLink url={url} fallback={true}>\n <Text>{displayContent}</Text>\n </InkLink>\n )\n } else {\n // Just show the content without link wrapper\n return <Text>{displayContent}</Text>\n }\n}\n", "import { default as React, useCallback } from 'react'\nimport { useNotifyAfterTimeout } from '#ui-ink/hooks/useNotifyAfterTimeout'\nimport { AssistantMessage, BinaryFeedbackResult } from '#core/query'\nimport type { Tool } from '#core/tooling/Tool'\nimport type { NormalizedMessage } from '#core/utils/messages'\nimport { BinaryFeedbackView } from './BinaryFeedbackView'\nimport {\n type BinaryFeedbackChoose,\n getBinaryFeedbackResultForChoice,\n logBinaryFeedbackEvent,\n} from './utils'\nimport { PRODUCT_NAME } from '#core/constants/product'\n\ntype Props = {\n m1: AssistantMessage\n m2: AssistantMessage\n resolve: (result: BinaryFeedbackResult) => void\n debug: boolean\n erroredToolUseIDs: Set<string>\n inProgressToolUseIDs: Set<string>\n normalizedMessages: NormalizedMessage[]\n tools: Tool[]\n unresolvedToolUseIDs: Set<string>\n verbose: boolean\n}\n\nexport function BinaryFeedback({\n m1,\n m2,\n resolve,\n debug,\n erroredToolUseIDs,\n inProgressToolUseIDs,\n normalizedMessages,\n tools,\n unresolvedToolUseIDs,\n verbose,\n}: Props): React.ReactNode {\n const onChoose = useCallback<BinaryFeedbackChoose>(\n choice => {\n logBinaryFeedbackEvent(m1, m2, choice)\n resolve(getBinaryFeedbackResultForChoice(m1, m2, choice))\n },\n [m1, m2, resolve],\n )\n useNotifyAfterTimeout(\n `${PRODUCT_NAME} needs your input on a response comparison`,\n )\n return (\n <BinaryFeedbackView\n debug={debug}\n erroredToolUseIDs={erroredToolUseIDs}\n inProgressToolUseIDs={inProgressToolUseIDs}\n m1={m1}\n m2={m2}\n normalizedMessages={normalizedMessages}\n tools={tools}\n unresolvedToolUseIDs={unresolvedToolUseIDs}\n verbose={verbose}\n onChoose={onChoose}\n />\n )\n}\n", "import { Option, SelectProps } from '@inkjs/ui'\nimport chalk from 'chalk'\nimport { Box, Text, useInput } from 'ink'\nimport Link from 'ink-link'\nimport React, { useState } from 'react'\nimport { getTheme } from '#core/utils/theme'\nimport { Select } from '#ui-ink/components/CustomSelect/select'\nimport type { Tool } from '#core/tooling/Tool'\nimport type { NormalizedMessage } from '#core/utils/messages'\nimport { BinaryFeedbackOption } from './BinaryFeedbackOption'\nimport type { AssistantMessage } from '#core/query'\nimport type { BinaryFeedbackChoose } from './utils'\nimport { useExitOnCtrlCD } from '#ui-ink/hooks/useExitOnCtrlCD'\nimport { BinaryFeedbackChoice } from './utils'\nimport { PRODUCT_NAME } from '#core/constants/product'\n\nconst HELP_URL = 'https://go/cli-feedback'\n\ntype BinaryFeedbackOption = Option & { value: BinaryFeedbackChoice }\n\n// Make options a function to avoid early theme access during module initialization\nexport function getOptions(): BinaryFeedbackOption[] {\n return [\n {\n // This option combines the follow user intents:\n // - The two options look about equally good to me\n // - I don't feel confident enough to choose\n // - I don't want to choose right now\n label: 'Choose for me',\n value: 'no-preference',\n },\n {\n label: 'Left option looks better',\n value: 'prefer-left',\n },\n {\n label: 'Right option looks better',\n value: 'prefer-right',\n },\n {\n label: `Neither, and tell ${PRODUCT_NAME} what to do differently (${chalk.bold.hex(getTheme().warning)('esc')})`,\n value: 'neither',\n },\n ]\n}\n\ntype Props = {\n m1: AssistantMessage\n m2: AssistantMessage\n onChoose?: BinaryFeedbackChoose\n debug: boolean\n erroredToolUseIDs: Set<string>\n inProgressToolUseIDs: Set<string>\n normalizedMessages: NormalizedMessage[]\n tools: Tool[]\n unresolvedToolUseIDs: Set<string>\n verbose: boolean\n}\n\nexport function BinaryFeedbackView({\n m1,\n m2,\n onChoose,\n debug,\n erroredToolUseIDs,\n inProgressToolUseIDs,\n normalizedMessages,\n tools,\n unresolvedToolUseIDs,\n verbose,\n}: Props) {\n const theme = getTheme()\n const [focused, setFocus] = useState('no-preference')\n const [focusValue, setFocusValue] = useState<string | undefined>(undefined)\n const exitState = useExitOnCtrlCD(() => process.exit(1))\n\n useInput((_input, key) => {\n if (key.leftArrow) {\n setFocusValue('prefer-left')\n } else if (key.rightArrow) {\n setFocusValue('prefer-right')\n } else if (key.escape) {\n onChoose?.('neither')\n }\n })\n\n return (\n <>\n <Box\n flexDirection=\"column\"\n height=\"100%\"\n width=\"100%\"\n borderStyle=\"round\"\n borderColor={theme.permission}\n >\n <Box width=\"100%\" justifyContent=\"space-between\" paddingX={1}>\n <Text bold color={theme.permission}>\n [ANT-ONLY] Help train {PRODUCT_NAME}\n </Text>\n <Text>\n <Link url={HELP_URL}>[?]</Link>\n </Text>\n </Box>\n <Box flexDirection=\"row\" width=\"100%\" flexGrow={1} paddingTop={1}>\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n flexBasis={1}\n gap={1}\n borderStyle={focused === 'prefer-left' ? 'bold' : 'single'}\n borderColor={\n focused === 'prefer-left' ? theme.success : theme.secondaryBorder\n }\n marginRight={1}\n padding={1}\n >\n <BinaryFeedbackOption\n erroredToolUseIDs={erroredToolUseIDs}\n debug={debug}\n inProgressToolUseIDs={inProgressToolUseIDs}\n message={m1}\n normalizedMessages={normalizedMessages}\n tools={tools}\n unresolvedToolUseIDs={unresolvedToolUseIDs}\n verbose={verbose}\n />\n </Box>\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n flexBasis={1}\n gap={1}\n borderStyle={focused === 'prefer-right' ? 'bold' : 'single'}\n borderColor={\n focused === 'prefer-right' ? theme.success : theme.secondaryBorder\n }\n marginLeft={1}\n padding={1}\n >\n <BinaryFeedbackOption\n erroredToolUseIDs={erroredToolUseIDs}\n debug={debug}\n inProgressToolUseIDs={inProgressToolUseIDs}\n message={m2}\n normalizedMessages={normalizedMessages}\n tools={tools}\n unresolvedToolUseIDs={unresolvedToolUseIDs}\n verbose={verbose}\n />\n </Box>\n </Box>\n <Box flexDirection=\"column\" paddingTop={1} paddingX={1}>\n <Text>How do you want to proceed?</Text>\n <Select\n options={getOptions()}\n onFocus={setFocus}\n focusValue={focusValue}\n onChange={onChoose as SelectProps['onChange']}\n />\n </Box>\n </Box>\n {exitState.pending ? (\n <Box marginLeft={3}>\n <Text dimColor>Press {exitState.keyName} again to exit</Text>\n </Box>\n ) : (\n // Render a blank line so that the UI doesn't reflow when the exit message is shown\n <Text> </Text>\n )}\n </>\n )\n}\n", "import { Box } from 'ink'\nimport * as React from 'react'\nimport type { AssistantMessage, Message, UserMessage } from '#core/query'\nimport type {\n ContentBlock,\n DocumentBlockParam,\n ImageBlockParam,\n TextBlockParam,\n ThinkingBlockParam,\n ToolResultBlockParam,\n ToolUseBlockParam,\n} from '@anthropic-ai/sdk/resources/index.mjs'\nimport { Tool } from '#core/tooling/Tool'\nimport { logError } from '#core/utils/log'\nimport { UserToolResultMessage } from './messages/UserToolResultMessage/UserToolResultMessage'\nimport { AssistantToolUseMessage } from './messages/AssistantToolUseMessage'\nimport { AssistantTextMessage } from './messages/AssistantTextMessage'\nimport { UserTextMessage } from './messages/UserTextMessage'\nimport { UserImageMessage } from './messages/UserImageMessage'\nimport { NormalizedMessage } from '#core/utils/messages'\nimport { AssistantThinkingMessage } from './messages/AssistantThinkingMessage'\nimport { AssistantRedactedThinkingMessage } from './messages/AssistantRedactedThinkingMessage'\nimport { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\n\ntype Props = {\n message: UserMessage | AssistantMessage\n messages: NormalizedMessage[]\n // NOTE: addMargin is handled at this layer to keep message spacing consistent in the TUI.\n addMargin: boolean\n tools: Tool[]\n verbose: boolean\n debug: boolean\n erroredToolUseIDs: Set<string>\n inProgressToolUseIDs: Set<string>\n unresolvedToolUseIDs: Set<string>\n shouldAnimate: boolean\n shouldShowDot: boolean\n width?: number | string\n}\n\nexport function Message({\n message,\n messages,\n addMargin,\n tools,\n verbose,\n debug,\n erroredToolUseIDs,\n inProgressToolUseIDs,\n unresolvedToolUseIDs,\n shouldAnimate,\n shouldShowDot,\n width,\n}: Props): React.ReactNode {\n // Assistant message\n if (message.type === 'assistant') {\n return (\n <Box flexDirection=\"column\" width=\"100%\">\n {message.message.content.map((_, index) => (\n <AssistantMessage\n key={index}\n param={_}\n costUSD={message.costUSD}\n durationMs={message.durationMs}\n addMargin={addMargin}\n tools={tools}\n debug={debug}\n options={{ verbose }}\n erroredToolUseIDs={erroredToolUseIDs}\n inProgressToolUseIDs={inProgressToolUseIDs}\n unresolvedToolUseIDs={unresolvedToolUseIDs}\n shouldAnimate={shouldAnimate}\n shouldShowDot={shouldShowDot}\n width={width}\n />\n ))}\n </Box>\n )\n }\n\n // User message\n // NOTE: legacy user messages may store content as a string; normalize to blocks here.\n const content =\n typeof message.message.content === 'string'\n ? [{ type: 'text', text: message.message.content } as TextBlockParam]\n : message.message.content\n return (\n <Box flexDirection=\"column\" width=\"100%\">\n {content.map((_, index) => (\n <UserMessage\n key={index}\n message={message}\n messages={messages}\n addMargin={addMargin}\n tools={tools}\n param={_ as TextBlockParam}\n options={{ verbose }}\n />\n ))}\n </Box>\n )\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== 'object') return null\n return value as Record<string, unknown>\n}\n\nfunction getBlockType(value: unknown): string {\n const record = asRecord(value)\n return record && typeof record.type === 'string' ? record.type : ''\n}\n\nfunction UserMessage({\n message,\n messages,\n addMargin,\n tools,\n param,\n options: { verbose },\n}: {\n message: UserMessage\n messages: Message[]\n addMargin: boolean\n tools: Tool[]\n param:\n | TextBlockParam\n | DocumentBlockParam\n | ImageBlockParam\n | ToolUseBlockParam\n | ToolResultBlockParam\n options: {\n verbose: boolean\n }\n key?: React.Key\n}): React.ReactNode {\n const { columns } = useTerminalSize()\n switch (param.type) {\n case 'text':\n return <UserTextMessage addMargin={addMargin} param={param} />\n case 'image':\n return <UserImageMessage addMargin={addMargin} param={param} />\n case 'tool_result':\n return (\n <UserToolResultMessage\n param={param}\n message={message}\n messages={messages}\n tools={tools}\n verbose={verbose}\n width={columns - 5}\n />\n )\n }\n}\n\nfunction AssistantMessage({\n param,\n costUSD,\n durationMs,\n addMargin,\n tools,\n debug,\n options: { verbose },\n erroredToolUseIDs,\n inProgressToolUseIDs,\n unresolvedToolUseIDs,\n shouldAnimate,\n shouldShowDot,\n width,\n}: {\n param:\n | ContentBlock\n | TextBlockParam\n | ImageBlockParam\n | ThinkingBlockParam\n | ToolUseBlockParam\n | ToolResultBlockParam\n costUSD: number\n durationMs: number\n addMargin: boolean\n tools: Tool[]\n debug: boolean\n options: {\n verbose: boolean\n }\n erroredToolUseIDs: Set<string>\n inProgressToolUseIDs: Set<string>\n unresolvedToolUseIDs: Set<string>\n shouldAnimate: boolean\n shouldShowDot: boolean\n width?: number | string\n key?: React.Key\n}): React.ReactNode {\n const type = getBlockType(param)\n switch (type) {\n case 'tool_use':\n case 'server_tool_use':\n case 'mcp_tool_use': {\n const normalizedParam: ToolUseBlockParam =\n type === 'tool_use'\n ? (param as ToolUseBlockParam)\n : { ...(param as ToolUseBlockParam), type: 'tool_use' }\n return (\n <AssistantToolUseMessage\n param={normalizedParam}\n costUSD={costUSD}\n durationMs={durationMs}\n addMargin={addMargin}\n tools={tools}\n debug={debug}\n verbose={verbose}\n erroredToolUseIDs={erroredToolUseIDs}\n inProgressToolUseIDs={inProgressToolUseIDs}\n unresolvedToolUseIDs={unresolvedToolUseIDs}\n shouldAnimate={shouldAnimate}\n shouldShowDot={shouldShowDot}\n />\n )\n }\n case 'text':\n return (\n <AssistantTextMessage\n param={param as TextBlockParam}\n costUSD={costUSD}\n durationMs={durationMs}\n debug={debug}\n addMargin={addMargin}\n shouldShowDot={shouldShowDot}\n verbose={verbose}\n width={width}\n />\n )\n case 'redacted_thinking':\n return <AssistantRedactedThinkingMessage addMargin={addMargin} />\n case 'thinking':\n return (\n <AssistantThinkingMessage\n addMargin={addMargin}\n param={param as ThinkingBlockParam}\n />\n )\n default:\n logError(`Unable to render message type: ${type || '(unknown)'}`)\n return null\n }\n}\n", "import { ToolResultBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport * as React from 'react'\nimport { Tool } from '#core/tooling/Tool'\nimport { Message, UserMessage } from '#core/query'\nimport {\n CANCEL_MESSAGE,\n REJECT_MESSAGE,\n REJECT_MESSAGE_WITH_FEEDBACK_PREFIX,\n} from '#core/utils/messages'\nimport { UserToolCanceledMessage } from './UserToolCanceledMessage'\nimport { UserToolErrorMessage } from './UserToolErrorMessage'\nimport { UserToolRejectMessage } from './UserToolRejectMessage'\nimport { UserToolSuccessMessage } from './UserToolSuccessMessage'\n\ntype Props = {\n param: ToolResultBlockParam\n message: UserMessage\n messages: Message[]\n tools: Tool[]\n verbose: boolean\n width: number | string\n}\n\nexport function UserToolResultMessage({\n param,\n message,\n messages,\n tools,\n verbose,\n width,\n}: Props): React.ReactNode {\n const content = typeof param.content === 'string' ? param.content : null\n\n if (content === CANCEL_MESSAGE) {\n return <UserToolCanceledMessage />\n }\n\n if (\n content === REJECT_MESSAGE ||\n (param.is_error === true &&\n typeof content === 'string' &&\n content.startsWith(REJECT_MESSAGE_WITH_FEEDBACK_PREFIX))\n ) {\n return (\n <UserToolRejectMessage\n toolUseID={param.tool_use_id}\n tools={tools}\n messages={messages}\n verbose={verbose}\n />\n )\n }\n\n if (param.is_error) {\n return <UserToolErrorMessage param={param} verbose={verbose} />\n }\n\n return (\n <UserToolSuccessMessage\n param={param}\n message={message}\n messages={messages}\n tools={tools}\n verbose={verbose}\n width={width}\n />\n )\n}\n", "import { Text } from 'ink'\nimport * as React from 'react'\nimport { getTheme } from '#core/utils/theme'\n\nexport function UserToolCanceledMessage(): React.ReactNode {\n return (\n <Text>\n &nbsp;&nbsp;\u23BF &nbsp;\n <Text color={getTheme().error}>Interrupted by user</Text>\n </Text>\n )\n}\n", "import { ToolResultBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { getTheme } from '#core/utils/theme'\n\nconst MAX_RENDERED_LINES = 10\n\ntype Props = {\n param: ToolResultBlockParam\n verbose: boolean\n}\n\nexport function UserToolErrorMessage({\n param,\n verbose,\n}: Props): React.ReactNode {\n const error =\n typeof param.content === 'string' ? param.content.trim() : 'Error'\n return (\n <Box flexDirection=\"row\" width=\"100%\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Box flexDirection=\"column\">\n <Text color={getTheme().error}>\n {verbose\n ? error\n : error.split('\\n').slice(0, MAX_RENDERED_LINES).join('\\n') || ''}\n </Text>\n {!verbose && error.split('\\n').length > MAX_RENDERED_LINES && (\n <Text color={getTheme().secondaryText}>\n ... (+{error.split('\\n').length - MAX_RENDERED_LINES} lines)\n </Text>\n )}\n </Box>\n </Box>\n )\n}\n", "import * as React from 'react'\nimport { Tool } from '#core/tooling/Tool'\nimport { Message } from '#core/query'\nimport { FallbackToolUseRejectedMessage } from '#ui-ink/components/FallbackToolUseRejectedMessage'\nimport { useGetToolFromMessages } from './utils'\nimport { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\nimport { usePermissionContext } from '#ui-ink/context/PermissionContext'\nimport { renderInkToolUseRejectedMessage } from '#ui-ink/toolPresenters/registry'\n\ntype Props = {\n toolUseID: string\n messages: Message[]\n tools: Tool[]\n verbose: boolean\n}\n\nexport function UserToolRejectMessage({\n toolUseID,\n tools,\n messages,\n verbose,\n}: Props): React.ReactNode {\n const { columns } = useTerminalSize()\n const { conversationKey } = usePermissionContext()\n const { tool, toolUse } = useGetToolFromMessages(toolUseID, tools, messages)\n const input = tool.inputSchema.safeParse(toolUse.input)\n if (input.success) {\n return renderInkToolUseRejectedMessage(tool, input.data, {\n columns,\n verbose,\n conversationKey,\n })\n }\n return <FallbackToolUseRejectedMessage />\n}\n", "import * as React from 'react'\nimport { getTheme } from '#core/utils/theme'\nimport { Text } from 'ink'\nimport { PRODUCT_NAME } from '#core/constants/product'\n\nexport function FallbackToolUseRejectedMessage(): React.ReactNode {\n return (\n <Text>\n &nbsp;&nbsp;\u23BF &nbsp;\n <Text color={getTheme().error}>\n No (tell {PRODUCT_NAME} what to do differently)\n </Text>\n </Text>\n )\n}\n", "import { ToolUseBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { Message } from '#core/query'\nimport { useMemo } from 'react'\nimport { Tool } from '#core/tooling/Tool'\nimport { GlobTool } from '#tools/tools/filesystem/GlobTool/GlobTool'\nimport { GrepTool } from '#tools/tools/search/GrepTool/GrepTool'\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== 'object') return null\n if (Array.isArray(value)) return null\n return value as Record<string, unknown>\n}\n\nfunction toToolUseBlockParam(value: unknown): ToolUseBlockParam | null {\n const record = asRecord(value)\n if (!record) return null\n const type = record.type\n if (\n type !== 'tool_use' &&\n type !== 'server_tool_use' &&\n type !== 'mcp_tool_use'\n ) {\n return null\n }\n const id = typeof record.id === 'string' ? record.id : null\n const name = typeof record.name === 'string' ? record.name : null\n if (!id || !name) return null\n return { type: 'tool_use', id, name, input: record.input }\n}\n\nfunction getToolUseFromMessages(\n toolUseID: string,\n messages: Message[],\n): ToolUseBlockParam | null {\n let toolUse: ToolUseBlockParam | null = null\n for (const message of messages) {\n if (\n message.type !== 'assistant' ||\n !Array.isArray(message.message.content)\n ) {\n continue\n }\n for (const content of message.message.content) {\n const block = toToolUseBlockParam(content)\n if (!block) continue\n if (block.id === toolUseID) toolUse = block\n }\n }\n return toolUse\n}\n\nexport function useGetToolFromMessages(\n toolUseID: string,\n tools: Tool[],\n messages: Message[],\n) {\n return useMemo(() => {\n const toolUse = getToolUseFromMessages(toolUseID, messages)\n if (!toolUse) {\n throw new ReferenceError(\n `Tool use not found for tool_use_id ${toolUseID}`,\n )\n }\n // Hack: we don't expose GlobTool and GrepTool in getTools anymore,\n // but we still want to be able to load old transcripts.\n // NOTE: keep legacy Glob/Grep lookup for transcript compatibility.\n const tool = [...tools, GlobTool, GrepTool].find(\n _ => _.name === toolUse.name,\n )\n if (tool === GlobTool || tool === GrepTool) {\n }\n if (!tool) {\n throw new ReferenceError(`Tool not found for ${toolUse.name}`)\n }\n return { tool, toolUse }\n }, [toolUseID, messages, tools])\n}\n", "import * as React from 'react'\n\nimport type { Tool } from '#core/tooling/Tool'\nimport { FallbackToolUseRejectedMessage } from '#ui-ink/components/FallbackToolUseRejectedMessage'\n\nimport { renderGlobToolResultMessage } from './GlobToolPresenter'\nimport { renderKillShellToolResultMessage } from './KillShellToolPresenter'\nimport { renderTaskOutputToolResultMessage } from './TaskOutputToolPresenter'\nimport {\n renderFileEditToolResultMessage,\n renderFileEditToolUseRejectedMessage,\n} from './FileEditToolPresenter'\nimport {\n renderFileWriteToolResultMessage,\n renderFileWriteToolUseRejectedMessage,\n} from './FileWriteToolPresenter'\n\ntype ResultOptions = { verbose: boolean }\ntype RejectOptions = {\n columns: number\n verbose: boolean\n conversationKey: string\n}\n\ntype InkToolPresenter = {\n renderToolResultMessage?: (\n output: unknown,\n options: ResultOptions,\n ) => React.ReactNode\n renderToolUseRejectedMessage?: (\n input: unknown,\n options: RejectOptions,\n ) => React.ReactNode\n}\n\nconst inkPresentersByToolName: Record<string, InkToolPresenter> = {\n Glob: {\n renderToolResultMessage: output =>\n renderGlobToolResultMessage(\n output as Parameters<typeof renderGlobToolResultMessage>[0],\n ),\n },\n KillShell: {\n renderToolResultMessage: output =>\n renderKillShellToolResultMessage(\n output as Parameters<typeof renderKillShellToolResultMessage>[0],\n ),\n },\n TaskOutput: {\n renderToolResultMessage: (output, options) =>\n renderTaskOutputToolResultMessage(\n output as Parameters<typeof renderTaskOutputToolResultMessage>[0],\n options,\n ),\n },\n Edit: {\n renderToolResultMessage: (output, options) =>\n renderFileEditToolResultMessage(\n output as Parameters<typeof renderFileEditToolResultMessage>[0],\n options,\n ),\n renderToolUseRejectedMessage: (input, options) =>\n renderFileEditToolUseRejectedMessage(\n input as Parameters<typeof renderFileEditToolUseRejectedMessage>[0],\n options,\n ),\n },\n Write: {\n renderToolResultMessage: (output, options) =>\n renderFileWriteToolResultMessage(\n output as Parameters<typeof renderFileWriteToolResultMessage>[0],\n options,\n ),\n renderToolUseRejectedMessage: (input, options) =>\n renderFileWriteToolUseRejectedMessage(\n input as Parameters<typeof renderFileWriteToolUseRejectedMessage>[0],\n options,\n ),\n },\n}\n\nexport function renderInkToolResultMessage(\n tool: Tool,\n output: unknown,\n options: ResultOptions,\n): React.ReactNode {\n const presenter = inkPresentersByToolName[tool.name]\n if (presenter?.renderToolResultMessage) {\n return presenter.renderToolResultMessage(output, options)\n }\n return tool.renderToolResultMessage?.(output, options) ?? null\n}\n\nexport function renderInkToolUseRejectedMessage(\n tool: Tool,\n input: unknown,\n options: RejectOptions,\n): React.ReactNode {\n const presenter = inkPresentersByToolName[tool.name]\n if (presenter?.renderToolUseRejectedMessage) {\n const node = presenter.renderToolUseRejectedMessage(input, options)\n return node ?? <FallbackToolUseRejectedMessage />\n }\n\n if (typeof tool.renderToolUseRejectedMessage === 'function') {\n const node = tool.renderToolUseRejectedMessage(input, options)\n return node ?? <FallbackToolUseRejectedMessage />\n }\n\n return <FallbackToolUseRejectedMessage />\n}\n", "import { Box, Text } from 'ink'\nimport React from 'react'\nimport { isAbsolute, relative, resolve } from 'path'\n\nimport { Cost } from '#ui-ink/components/Cost'\nimport { FallbackToolUseRejectedMessage } from '#ui-ink/components/FallbackToolUseRejectedMessage'\nimport { getCwd } from '#core/utils/state'\n\ntype Input = { pattern: string; path?: string }\n\ntype Output = {\n durationMs: number\n numFiles: number\n filenames: string[]\n truncated: boolean\n}\n\nexport function renderGlobToolUseMessage(\n { pattern, path }: Input,\n { verbose }: { verbose: boolean },\n): string {\n const absolutePath = path\n ? isAbsolute(path)\n ? path\n : resolve(getCwd(), path)\n : undefined\n const relativePath = absolutePath\n ? relative(getCwd(), absolutePath)\n : undefined\n return `pattern: \"${pattern}\"${relativePath || verbose ? `, path: \"${verbose ? absolutePath : relativePath}\"` : ''}`\n}\n\nexport function renderGlobToolUseRejectedMessage(): React.ReactElement {\n return <FallbackToolUseRejectedMessage />\n}\n\nexport function renderGlobToolResultMessage(output: Output | string) {\n // Handle string content for backward compatibility\n if (typeof output === 'string') {\n output = JSON.parse(output) as Output\n }\n\n return (\n <Box justifyContent=\"space-between\" width=\"100%\">\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;Found </Text>\n <Text bold>{output.numFiles} </Text>\n <Text>\n {output.numFiles === 0 || output.numFiles > 1 ? 'files' : 'file'}\n </Text>\n </Box>\n <Cost costUSD={0} durationMs={output.durationMs} debug={false} />\n </Box>\n )\n}\n", "import * as React from 'react'\nimport { Box, Text } from 'ink'\n\ntype Props = {\n costUSD: number\n durationMs: number\n debug: boolean\n}\n\nexport function Cost({ costUSD, durationMs, debug }: Props): React.ReactNode {\n if (!debug) {\n return null\n }\n\n const durationInSeconds = (durationMs / 1000).toFixed(1)\n return (\n <Box flexDirection=\"column\" minWidth={23} width={23}>\n <Text dimColor>\n Cost: ${costUSD.toFixed(4)} ({durationInSeconds}s)\n </Text>\n </Box>\n )\n}\n", "import { Box, Text } from 'ink'\nimport React from 'react'\n\nimport { FallbackToolUseRejectedMessage } from '#ui-ink/components/FallbackToolUseRejectedMessage'\n\ntype Input = { shell_id: string }\ntype Output = { message: string; shell_id: string }\n\nexport function renderKillShellToolUseMessage({ shell_id }: Input): string {\n return `Kill shell: ${shell_id}`\n}\n\nexport function renderKillShellToolUseRejectedMessage(): React.ReactElement {\n return <FallbackToolUseRejectedMessage />\n}\n\nexport function renderKillShellToolResultMessage(output: Output) {\n return (\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text>Shell {output.shell_id} killed</Text>\n </Box>\n )\n}\n", "import { Box, Text } from 'ink'\nimport React from 'react'\n\nimport { getTheme } from '#core/utils/theme'\nimport { maybeTruncateVerboseToolOutput } from '#core/utils/toolOutputDisplay'\n\ntype TaskType = 'local_bash' | 'local_agent' | 'remote_agent'\ntype TaskStatus = 'running' | 'pending' | 'completed' | 'failed' | 'killed'\n\ntype TaskSummary = {\n task_id: string\n task_type: TaskType\n status: TaskStatus\n description: string\n output?: string\n exitCode?: number | null\n prompt?: string\n result?: string\n error?: string\n}\n\ntype Output = {\n retrieval_status: 'success' | 'timeout' | 'not_ready'\n task: TaskSummary | null\n}\n\nexport function renderTaskOutputToolUseMessageFromNormalized(input: {\n block?: boolean\n}): string {\n if (input.block === false) return 'non-blocking'\n return ''\n}\n\nexport function renderTaskOutputToolResultMessage(\n output: Output,\n { verbose }: { verbose: boolean },\n) {\n const theme = getTheme()\n\n if (\n output.retrieval_status === 'timeout' ||\n output.retrieval_status === 'not_ready'\n ) {\n return (\n <Box>\n <Text color={theme.secondaryText}>Task is still running\u2026</Text>\n </Box>\n )\n }\n\n if (!output.task) {\n return (\n <Box>\n <Text color={theme.secondaryText}>No task output available</Text>\n </Box>\n )\n }\n\n if (output.task.task_type === 'local_agent') {\n const lines = output.task.result ? output.task.result.split('\\n').length : 0\n if (!verbose) {\n return (\n <Box>\n <Text color={theme.secondaryText}>\n Read output (ctrl+o to expand)\n </Text>\n </Box>\n )\n }\n return (\n <Box flexDirection=\"column\">\n <Text>\n {output.task.description} ({lines} lines)\n </Text>\n {output.task.prompt ? (\n <Box paddingLeft={2}>\n <Text color={theme.secondaryText}>{output.task.prompt}</Text>\n </Box>\n ) : null}\n {output.task.result ? (\n <Box paddingLeft={2} marginTop={1}>\n <Text>\n {\n maybeTruncateVerboseToolOutput(output.task.result, {\n maxLines: 200,\n maxChars: 40_000,\n }).text\n }\n </Text>\n </Box>\n ) : null}\n {output.task.error ? (\n <Box flexDirection=\"column\" marginTop={1} paddingLeft={2}>\n <Text color={theme.error} bold>\n Error:\n </Text>\n <Text color={theme.error}>{output.task.error}</Text>\n </Box>\n ) : null}\n </Box>\n )\n }\n\n // local_bash\n const content = output.task.output?.trimEnd() ?? ''\n if (!verbose) {\n return (\n <Box>\n <Text color={theme.secondaryText}>\n {content.length > 0\n ? 'Read output (ctrl+o to expand)'\n : '(No content)'}\n </Text>\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\">\n <Text color={theme.secondaryText}>{output.task.description}</Text>\n {content ? (\n <Box paddingLeft={2} marginTop={1}>\n <Text>\n {\n maybeTruncateVerboseToolOutput(content, {\n maxLines: 200,\n maxChars: 40_000,\n }).text\n }\n </Text>\n </Box>\n ) : null}\n </Box>\n )\n}\n", "import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { readFileSync } from 'fs'\nimport { isAbsolute, relative, resolve } from 'path'\n\nimport { FileEditToolUpdatedMessage } from '#ui-ink/components/FileEditToolUpdatedMessage'\nimport { StructuredDiff } from '#ui-ink/components/StructuredDiff'\nimport { FallbackToolUseRejectedMessage } from '#ui-ink/components/FallbackToolUseRejectedMessage'\nimport { intersperse } from '#core/utils/array'\nimport { detectFileEncoding } from '#core/utils/file'\nimport { getCwd } from '#core/utils/state'\nimport { getTheme } from '#core/utils/theme'\nimport { normalizeLineEndings } from '#core/utils/paste'\nimport { getPatch } from '#core/utils/diff'\nimport { logError } from '#core/utils/log'\n\nexport function renderFileEditToolResultMessage(\n output: { filePath: string; structuredPatch?: any[] },\n options: { verbose: boolean },\n): React.ReactNode {\n // Reference CLI parity: result messages stay compact by default.\n const verbose = false\n return (\n <FileEditToolUpdatedMessage\n filePath={output.filePath}\n structuredPatch={output.structuredPatch}\n verbose={verbose}\n />\n )\n}\n\nexport function renderFileEditToolUseRejectedMessage(\n input: {\n file_path?: string\n old_string?: string\n new_string?: string\n replace_all?: boolean\n } = {},\n options: { columns: number; verbose: boolean } = {\n columns: 80,\n verbose: false,\n },\n): React.ReactNode {\n try {\n const { file_path, old_string, new_string, replace_all } = input\n const { columns, verbose } = options\n\n if (!file_path) {\n return <FallbackToolUseRejectedMessage />\n }\n\n const fullFilePath = isAbsolute(file_path)\n ? file_path\n : resolve(getCwd(), file_path)\n\n let originalFile = ''\n let updatedFile = ''\n\n if (old_string === '') {\n originalFile = ''\n updatedFile = normalizeLineEndings(new_string ?? '')\n } else {\n const enc = detectFileEncoding(fullFilePath)\n const fileContent = readFileSync(fullFilePath, enc)\n originalFile = normalizeLineEndings(fileContent ?? '')\n\n const normalizedOldString = normalizeLineEndings(old_string ?? '')\n const normalizedNewString = normalizeLineEndings(new_string ?? '')\n const oldStringForReplace =\n normalizedNewString === '' &&\n !normalizedOldString.endsWith('\\n') &&\n originalFile.includes(normalizedOldString + '\\n')\n ? normalizedOldString + '\\n'\n : normalizedOldString\n\n updatedFile = Boolean(replace_all)\n ? originalFile.split(oldStringForReplace).join(normalizedNewString)\n : originalFile.replace(oldStringForReplace, () => normalizedNewString)\n\n if (updatedFile === originalFile) {\n throw new Error(\n 'Original and edited file match exactly. Failed to apply edit.',\n )\n }\n }\n\n const patch = getPatch({\n filePath: file_path,\n fileContents: originalFile,\n oldStr: originalFile,\n newStr: updatedFile,\n })\n\n return (\n <Box flexDirection=\"column\">\n <Text>\n {' '}\u23BF{' '}\n <Text color={getTheme().error}>\n User rejected {old_string === '' ? 'write' : 'update'} to{' '}\n </Text>\n <Text bold>\n {verbose ? file_path : relative(getCwd(), file_path)}\n </Text>\n </Text>\n {intersperse(\n patch.map(patch => (\n <Box flexDirection=\"column\" paddingLeft={5} key={patch.newStart}>\n <StructuredDiff patch={patch} dim={true} width={columns - 12} />\n </Box>\n )),\n i => (\n <Box paddingLeft={5} key={`ellipsis-${i}`}>\n <Text color={getTheme().secondaryText}>...</Text>\n </Box>\n ),\n )}\n </Box>\n )\n } catch (error) {\n // Handle the case where while we were showing the diff, the user manually made the change.\n // NOTE: When the file changes during diff rendering, fall back to a minimal message.\n logError(error)\n return (\n <Box flexDirection=\"column\">\n <Text>{' '}\u23BF (No changes)</Text>\n </Box>\n )\n }\n}\n", "import { Hunk } from 'diff'\nimport { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { intersperse } from '#core/utils/array'\nimport { StructuredDiff } from './StructuredDiff'\nimport { getTheme } from '#core/utils/theme'\nimport { getCwd } from '#core/utils/state'\nimport { relative } from 'path'\nimport { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\n\ntype Props = {\n filePath: string\n structuredPatch?: Hunk[]\n verbose: boolean\n}\n\nexport function FileEditToolUpdatedMessage({\n filePath,\n structuredPatch,\n verbose,\n}: Props): React.ReactNode {\n const { columns } = useTerminalSize()\n const patches = Array.isArray(structuredPatch) ? structuredPatch : []\n const numAdditions = patches.reduce(\n (count, hunk) => count + hunk.lines.filter(_ => _.startsWith('+')).length,\n 0,\n )\n const numRemovals = patches.reduce(\n (count, hunk) => count + hunk.lines.filter(_ => _.startsWith('-')).length,\n 0,\n )\n\n return (\n <Box flexDirection=\"column\">\n <Text>\n {' '}\u23BF Updated{' '}\n <Text bold>{verbose ? filePath : relative(getCwd(), filePath)}</Text>\n {numAdditions > 0 || numRemovals > 0 ? ' with ' : ''}\n {numAdditions > 0 ? (\n <>\n <Text bold>{numAdditions}</Text>{' '}\n {numAdditions > 1 ? 'additions' : 'addition'}\n </>\n ) : null}\n {numAdditions > 0 && numRemovals > 0 ? ' and ' : null}\n {numRemovals > 0 ? (\n <>\n <Text bold>{numRemovals}</Text>{' '}\n {numRemovals > 1 ? 'removals' : 'removal'}\n </>\n ) : null}\n </Text>\n {patches.length > 0 &&\n intersperse(\n patches.map(_ => (\n <Box flexDirection=\"column\" paddingLeft={5} key={_.newStart}>\n <StructuredDiff patch={_} dim={false} width={columns - 12} />\n </Box>\n )),\n i => (\n <Box paddingLeft={5} key={`ellipsis-${i}`}>\n <Text color={getTheme().secondaryText}>...</Text>\n </Box>\n ),\n )}\n </Box>\n )\n}\n", "import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { readFileSync } from 'fs'\nimport { EOL } from 'os'\nimport { extname, isAbsolute, relative, resolve } from 'path'\n\nimport { FileEditToolUpdatedMessage } from '#ui-ink/components/FileEditToolUpdatedMessage'\nimport { HighlightedCode } from '#ui-ink/components/HighlightedCode'\nimport { StructuredDiff } from '#ui-ink/components/StructuredDiff'\nimport { FallbackToolUseRejectedMessage } from '#ui-ink/components/FallbackToolUseRejectedMessage'\nimport { intersperse } from '#core/utils/array'\nimport { detectFileEncoding } from '#core/utils/file'\nimport { fileExistsBun } from '#runtime/file'\nimport { logError } from '#core/utils/log'\nimport { getCwd } from '#core/utils/state'\nimport { getTheme } from '#core/utils/theme'\nimport { getPatch } from '#core/utils/diff'\n\nconst MAX_LINES_TO_RENDER = 5\n\nexport function renderFileWriteToolResultMessage(\n output: {\n filePath: string\n content: string\n structuredPatch?: any[]\n type: 'create' | 'update'\n },\n options: { verbose: boolean },\n): React.ReactNode {\n // Reference CLI parity: result messages stay compact by default.\n const verbose = false\n\n switch (output.type) {\n case 'create': {\n const contentWithFallback = output.content || '(No content)'\n const numLines = output.content.split(EOL).length\n\n return (\n <Box flexDirection=\"column\">\n <Text>\n {' '}\u23BF Wrote {numLines} lines to{' '}\n <Text bold>\n {verbose ? output.filePath : relative(getCwd(), output.filePath)}\n </Text>\n </Text>\n <Box flexDirection=\"column\" paddingLeft={5}>\n <HighlightedCode\n code={\n verbose\n ? contentWithFallback\n : contentWithFallback\n .split('\\n')\n .slice(0, MAX_LINES_TO_RENDER)\n .filter(_ => _.trim() !== '')\n .join('\\n')\n }\n language={extname(output.filePath).slice(1)}\n />\n {!verbose && numLines > MAX_LINES_TO_RENDER && (\n <Text color={getTheme().secondaryText}>\n ... (+{numLines - MAX_LINES_TO_RENDER} lines)\n </Text>\n )}\n </Box>\n </Box>\n )\n }\n case 'update':\n return (\n <FileEditToolUpdatedMessage\n filePath={output.filePath}\n structuredPatch={output.structuredPatch}\n verbose={verbose}\n />\n )\n }\n}\n\nexport function renderFileWriteToolUseRejectedMessage(\n input: { file_path?: string; content?: string } = {},\n options: { columns: number; verbose: boolean } = {\n columns: 80,\n verbose: false,\n },\n): React.ReactNode {\n try {\n const { file_path, content } = input\n const { columns, verbose } = options\n\n if (!file_path) {\n return <FallbackToolUseRejectedMessage />\n }\n\n const fullFilePath = isAbsolute(file_path)\n ? file_path\n : resolve(getCwd(), file_path)\n const oldFileExists = fileExistsBun(fullFilePath)\n const enc = oldFileExists ? detectFileEncoding(fullFilePath) : 'utf-8'\n const oldContent = oldFileExists ? readFileSync(fullFilePath, enc) : null\n const type = oldContent ? 'update' : 'create'\n const patch = getPatch({\n filePath: file_path,\n fileContents: oldContent ?? '',\n oldStr: oldContent ?? '',\n newStr: content ?? '',\n })\n\n return (\n <Box flexDirection=\"column\">\n <Text>\n {' '}\u23BF{' '}\n <Text color={getTheme().error}>\n User rejected {type === 'update' ? 'update' : 'write'} to{' '}\n </Text>\n <Text bold>\n {verbose ? file_path : relative(getCwd(), file_path)}\n </Text>\n </Text>\n {intersperse(\n patch.map(_ => (\n <Box flexDirection=\"column\" paddingLeft={5} key={_.newStart}>\n <StructuredDiff patch={_} dim={true} width={columns - 12} />\n </Box>\n )),\n i => (\n <Box paddingLeft={5} key={`ellipsis-${i}`}>\n <Text color={getTheme().secondaryText}>...</Text>\n </Box>\n ),\n )}\n </Box>\n )\n } catch (error) {\n // Handle the case where while we were showing the diff, the user manually made the change.\n // NOTE: When the file changes during diff rendering, fall back to a minimal message.\n logError(error)\n return (\n <Box flexDirection=\"column\">\n <Text>{' '}\u23BF (No changes)</Text>\n </Box>\n )\n }\n}\n", "import { ToolResultBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { Box } from 'ink'\nimport * as React from 'react'\nimport { Tool } from '#core/tooling/Tool'\nimport { Message, UserMessage } from '#core/query'\nimport { useGetToolFromMessages } from './utils'\nimport { renderInkToolResultMessage } from '#ui-ink/toolPresenters/registry'\n\ntype Props = {\n param: ToolResultBlockParam\n message: UserMessage\n messages: Message[]\n verbose: boolean\n tools: Tool[]\n width: number | string\n}\n\nexport function UserToolSuccessMessage({\n param,\n message,\n messages,\n tools,\n verbose,\n width,\n}: Props): React.ReactNode {\n const { tool } = useGetToolFromMessages(param.tool_use_id, tools, messages)\n\n return (\n // NOTE: tool_result is rendered under the user message container for parity with the legacy transcript shape.\n <Box flexDirection=\"column\" width={width}>\n {renderInkToolResultMessage(tool, message.toolUseResult!.data as never, {\n verbose,\n })}\n </Box>\n )\n}\n", "import { Box, Text } from 'ink'\nimport React from 'react'\nimport { logError } from '#core/utils/log'\nimport { ToolUseBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { Tool } from '#core/tooling/Tool'\nimport { Cost } from '#ui-ink/components/Cost'\nimport { ToolUseLoader } from '#ui-ink/components/ToolUseLoader'\nimport { getTheme } from '#core/utils/theme'\nimport { BLACK_CIRCLE } from '#core/constants/figures'\nimport { ThinkTool } from '#tools/tools/ai/ThinkTool/ThinkTool'\nimport { AssistantThinkingMessage } from './AssistantThinkingMessage'\nimport { TaskToolMessage } from './TaskToolMessage'\nimport { resolveToolNameAlias } from '#core/utils/toolNameAliases'\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== 'object') return null\n if (Array.isArray(value)) return null\n return value as Record<string, unknown>\n}\n\nfunction getSubagentType(input: unknown): string | null {\n const record = asRecord(input)\n const value = record?.subagent_type\n return typeof value === 'string' ? value : null\n}\n\ntype Props = {\n param: ToolUseBlockParam\n costUSD: number\n durationMs: number\n addMargin: boolean\n tools: Tool[]\n debug: boolean\n verbose: boolean\n erroredToolUseIDs: Set<string>\n inProgressToolUseIDs: Set<string>\n unresolvedToolUseIDs: Set<string>\n shouldAnimate: boolean\n shouldShowDot: boolean\n}\n\nexport function AssistantToolUseMessage({\n param,\n costUSD,\n durationMs,\n addMargin,\n tools,\n debug,\n verbose,\n erroredToolUseIDs,\n inProgressToolUseIDs,\n unresolvedToolUseIDs,\n shouldAnimate,\n shouldShowDot,\n}: Props): React.ReactNode {\n const resolvedName = resolveToolNameAlias(param.name).resolvedName\n const tool = tools.find(_ => _.name === resolvedName)\n if (!tool) {\n logError(`Tool ${param.name} not found`)\n return null\n }\n const isQueued =\n !inProgressToolUseIDs.has(param.id) && unresolvedToolUseIDs.has(param.id)\n // Keeping color undefined makes the OS use the default color regardless of appearance\n const color = isQueued ? getTheme().secondaryText : undefined\n\n // Handle thinking tool with specialized rendering\n if (tool === ThinkTool) {\n const { thought } = ThinkTool.inputSchema.parse(param.input)\n return (\n <AssistantThinkingMessage\n param={{ thinking: thought, signature: '', type: 'thinking' }}\n addMargin={addMargin}\n />\n )\n }\n\n const parsedInput = tool.inputSchema.safeParse(param.input)\n const userFacingToolName = tool.userFacingName\n ? tool.userFacingName(parsedInput.success ? parsedInput.data : undefined)\n : tool.name\n\n const hasToolName = userFacingToolName.trim().length > 0\n const hasInputObject =\n param.input &&\n typeof param.input === 'object' &&\n Object.keys(param.input as { [key: string]: unknown }).length > 0\n const toolMessage = hasInputObject\n ? tool.renderToolUseMessage(param.input as never, { verbose })\n : null\n const hasToolMessage =\n React.isValidElement(toolMessage) ||\n (typeof toolMessage === 'string' && toolMessage.trim().length > 0)\n\n // Reference CLI parity: tools with empty userFacingName and null/empty tool message\n // should not render a tool-use line at all (e.g., AskUserQuestion/TodoWrite).\n if (!hasToolName && !hasToolMessage) {\n return null\n }\n return (\n <Box\n flexDirection=\"row\"\n justifyContent=\"space-between\"\n marginTop={addMargin ? 1 : 0}\n width=\"100%\"\n >\n <Box>\n <Box\n flexWrap=\"nowrap\"\n minWidth={userFacingToolName.length + (shouldShowDot ? 2 : 0)}\n >\n {shouldShowDot &&\n (isQueued ? (\n <Box minWidth={2}>\n <Text color={color}>{BLACK_CIRCLE}</Text>\n </Box>\n ) : (\n <ToolUseLoader\n shouldAnimate={shouldAnimate}\n isUnresolved={unresolvedToolUseIDs.has(param.id)}\n isError={erroredToolUseIDs.has(param.id)}\n />\n ))}\n {tool.name === 'Task' && param.input ? (\n <TaskToolMessage\n agentType={\n parsedInput.success\n ? (getSubagentType(parsedInput.data) ?? 'general-purpose')\n : 'general-purpose'\n }\n bold={Boolean(!isQueued)}\n children={String(userFacingToolName || '')}\n />\n ) : (\n hasToolName && (\n <Text color={color} bold={!isQueued}>\n {userFacingToolName}\n </Text>\n )\n )}\n </Box>\n <Box flexWrap=\"nowrap\">\n {hasToolMessage &&\n (() => {\n // If the tool returns a React component, render it directly\n if (React.isValidElement(toolMessage)) {\n if (!hasToolName) return toolMessage\n return (\n <Box flexDirection=\"row\">\n <Text color={color}>(</Text>\n {toolMessage}\n <Text color={color}>)</Text>\n </Box>\n )\n }\n\n if (typeof toolMessage !== 'string') return null\n\n if (!hasToolName) {\n return <Text color={color}>{toolMessage}</Text>\n }\n\n // If it's a string, wrap it in Text\n return <Text color={color}>({toolMessage})</Text>\n })()}\n <Text color={color}>\u2026</Text>\n </Box>\n </Box>\n <Cost costUSD={costUSD} durationMs={durationMs} debug={debug} />\n </Box>\n )\n}\n", "import { Box, Text } from 'ink'\nimport React from 'react'\nimport { useInterval } from '#ui-ink/hooks/useInterval'\nimport { getTheme } from '#core/utils/theme'\nimport { BLACK_CIRCLE } from '#core/constants/figures'\n\ntype Props = {\n isError: boolean\n isUnresolved: boolean\n shouldAnimate: boolean\n}\n\nexport function ToolUseLoader({\n isError,\n isUnresolved,\n shouldAnimate,\n}: Props): React.ReactNode {\n const [isVisible, setIsVisible] = React.useState(true)\n\n useInterval(() => {\n if (!shouldAnimate) {\n return\n }\n // To avoid flickering when the tool use confirm is visible, we set the loader to be visible\n // when the tool use confirm is visible.\n setIsVisible(_ => !_)\n }, 600)\n\n const color = isUnresolved\n ? getTheme().secondaryText\n : isError\n ? getTheme().error\n : getTheme().success\n\n return (\n <Box minWidth={2}>\n <Text color={color}>{isVisible ? BLACK_CIRCLE : ' '}</Text>\n </Box>\n )\n}\n", "import { useEffect, useRef } from 'react'\n\n/**\n * A custom hook that runs a callback at a specified interval.\n * The interval is cleared when the component unmounts.\n * The interval is also cleared and restarted if the delay changes.\n */\nexport function useInterval(callback: () => void, delay: number): void {\n const savedCallback = useRef(callback)\n\n // Remember the latest callback\n useEffect(() => {\n savedCallback.current = callback\n }, [callback])\n\n // Set up the interval\n useEffect(() => {\n function tick() {\n savedCallback.current()\n }\n\n const id = setInterval(tick, delay)\n return () => clearInterval(id)\n }, [delay])\n}\n", "import { z } from 'zod'\nimport React from 'react'\nimport { Text } from 'ink'\nimport { Tool } from '#core/tooling/Tool'\nimport { DESCRIPTION, PROMPT } from './prompt'\nimport { getTheme } from '#core/utils/theme'\nimport { USE_BEDROCK, USE_VERTEX } from '#core/utils/model'\n\nconst thinkToolSchema = z.object({\n thought: z.string().describe('Your thoughts.'),\n})\n\nexport const ThinkTool = {\n name: 'Think',\n userFacingName: () => 'Think',\n description: async () => DESCRIPTION,\n inputSchema: thinkToolSchema,\n isEnabled: async () => Boolean(process.env.THINK_TOOL),\n isReadOnly: () => true,\n isConcurrencySafe: () => true, // ThinkTool is read-only, safe for concurrent execution\n needsPermissions: () => false,\n prompt: async () => PROMPT,\n\n async *call(input, { messageId }) {\n yield {\n type: 'result',\n resultForAssistant: 'Your thought has been logged.',\n data: { thought: input.thought },\n }\n },\n\n // This is never called -- it's special-cased in AssistantToolUseMessage\n renderToolUseMessage(input) {\n return input.thought\n },\n\n renderToolUseRejectedMessage() {\n return (\n <Text>\n {' '}\u23BF &nbsp;\n <Text color={getTheme().error}>Thought cancelled</Text>\n </Text>\n )\n },\n\n renderResultForAssistant: () => 'Your thought has been logged.',\n} satisfies Tool<typeof thinkToolSchema>\n", "export const DESCRIPTION = 'This is a no-op tool that logs a thought.'\nexport const PROMPT = `Use the tool to think about something. It will not obtain new information or make any changes to the repository, but just log the thought. Use it when complex reasoning or brainstorming is needed. \n\nCommon use cases:\n1. When exploring a repository and discovering the source of a bug, call this tool to brainstorm several unique ways of fixing the bug, and assess which change(s) are likely to be simplest and most effective\n2. After receiving test results, use this tool to brainstorm ways to fix failing tests\n3. When planning a complex refactoring, use this tool to outline different approaches and their tradeoffs\n4. When designing a new feature, use this tool to think through architecture decisions and implementation details\n5. When debugging a complex issue, use this tool to organize your thoughts and hypotheses\n\nThe tool simply logs your thought process for better transparency and does not execute any code or make changes.`\n", "import React from 'react'\nimport { Box, Text } from 'ink'\nimport { getTheme } from '#core/utils/theme'\nimport { applyMarkdown } from '#core/utils/markdown'\nimport {\n ThinkingBlock,\n ThinkingBlockParam,\n} from '@anthropic-ai/sdk/resources/index.mjs'\n\ntype Props = {\n param: ThinkingBlock | ThinkingBlockParam\n addMargin: boolean\n}\n\nexport function AssistantThinkingMessage({\n param: { thinking },\n addMargin = false,\n}: Props): React.ReactNode {\n if (!thinking || thinking.trim().length === 0) {\n return null\n }\n\n return (\n <Box\n flexDirection=\"column\"\n gap={1}\n marginTop={addMargin ? 1 : 0}\n width=\"100%\"\n >\n <Text color={getTheme().secondaryText} italic>\n \u273B Thinking\u2026\n </Text>\n <Box paddingLeft={2}>\n <Text color={getTheme().secondaryText} italic>\n {applyMarkdown(thinking)}\n </Text>\n </Box>\n </Box>\n )\n}\n", "import React, { useEffect, useState, useMemo } from 'react'\nimport { Text } from 'ink'\nimport { getAgentByType } from '#core/utils/agentLoader'\nimport { getTheme } from '#core/utils/theme'\n\ninterface Props {\n agentType: string\n children: React.ReactNode\n bold?: boolean\n}\n\n// Simple cache to prevent re-fetching agent configs\nconst agentConfigCache = new Map<string, any>()\n\nexport function TaskToolMessage({ agentType, children, bold = true }: Props) {\n const theme = getTheme()\n const [agentConfig, setAgentConfig] = useState<any>(() => {\n // Return cached config immediately if available\n return agentConfigCache.get(agentType) || null\n })\n\n useEffect(() => {\n // Skip if already cached\n if (agentConfigCache.has(agentType)) {\n setAgentConfig(agentConfigCache.get(agentType))\n return\n }\n\n // Load and cache agent configuration\n let mounted = true\n getAgentByType(agentType)\n .then(config => {\n if (mounted) {\n agentConfigCache.set(agentType, config)\n setAgentConfig(config)\n }\n })\n .catch(() => {\n // Silently handle errors to prevent console noise\n if (mounted) {\n agentConfigCache.set(agentType, null)\n }\n })\n\n return () => {\n mounted = false\n }\n }, [agentType])\n\n // Memoize color calculation to prevent unnecessary re-renders\n const color = useMemo(() => {\n return agentConfig?.color || theme.text\n }, [agentConfig?.color, theme.text])\n\n return (\n <Text color={color} bold={bold}>\n {children}\n </Text>\n )\n}\n", "import { TextBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport React from 'react'\nimport { AssistantBashOutputMessage } from './AssistantBashOutputMessage'\nimport { AssistantLocalCommandOutputMessage } from './AssistantLocalCommandOutputMessage'\nimport { getTheme } from '#core/utils/theme'\nimport { Box, Text } from 'ink'\nimport { Cost } from '#ui-ink/components/Cost'\nimport {\n API_ERROR_MESSAGE_PREFIX,\n CREDIT_BALANCE_TOO_LOW_ERROR_MESSAGE,\n INVALID_API_KEY_ERROR_MESSAGE,\n PROMPT_TOO_LONG_ERROR_MESSAGE,\n} from '#core/ai/constants'\nimport {\n CANCEL_MESSAGE,\n INTERRUPT_MESSAGE,\n INTERRUPT_MESSAGE_FOR_TOOL_USE,\n isEmptyMessageText,\n NO_RESPONSE_REQUESTED,\n extractTag,\n} from '#core/utils/messages'\nimport { BLACK_CIRCLE } from '#core/constants/figures'\nimport { applyMarkdown } from '#core/utils/markdown'\nimport { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\n\ntype Props = {\n param: TextBlockParam\n costUSD: number\n durationMs: number\n debug: boolean\n addMargin: boolean\n shouldShowDot: boolean\n verbose?: boolean\n width?: number | string\n}\n\nexport function AssistantTextMessage({\n param: { text },\n costUSD,\n durationMs,\n debug,\n addMargin,\n shouldShowDot,\n verbose,\n}: Props): React.ReactNode {\n const { columns } = useTerminalSize()\n if (isEmptyMessageText(text)) {\n return null\n }\n\n // Tool progress messages should render as raw text (no markdown parsing).\n if (text.startsWith('<tool-progress>')) {\n const raw = extractTag(text, 'tool-progress') ?? ''\n if (raw.trim().length === 0) return null\n return <Text color={getTheme().secondaryText}>{raw}</Text>\n }\n\n // Reference CLI parity: background bash completion notification (Rt1).\n if (text.startsWith('<bash-notification>')) {\n const status = (extractTag(text, 'status') ?? '').trim()\n const summary = (extractTag(text, 'summary') ?? '').trim()\n if (!summary) return null\n\n const theme = getTheme()\n const color =\n status === 'completed'\n ? theme.success\n : status === 'failed'\n ? theme.error\n : status === 'killed'\n ? theme.warning\n : theme.secondaryText\n\n return (\n <Box>\n <Text color={color}>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text>{summary}</Text>\n </Box>\n )\n }\n\n // Reference CLI parity: async agent completion notification.\n if (text.startsWith('<agent-notification>')) {\n const status = (extractTag(text, 'status') ?? '').trim()\n const summary = (extractTag(text, 'summary') ?? '').trim()\n if (!summary) return null\n\n const theme = getTheme()\n const color =\n status === 'completed'\n ? theme.success\n : status === 'failed'\n ? theme.error\n : status === 'killed'\n ? theme.warning\n : theme.secondaryText\n\n return (\n <Box>\n <Text color={color}>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text>{summary}</Text>\n </Box>\n )\n }\n\n // Reference CLI parity: remote task completion notification.\n if (text.startsWith('<task-notification>')) {\n const status = (extractTag(text, 'status') ?? '').trim()\n const summary = (extractTag(text, 'summary') ?? '').trim()\n if (!summary) return null\n\n const theme = getTheme()\n const color =\n status === 'completed'\n ? theme.success\n : status === 'failed'\n ? theme.error\n : status === 'killed'\n ? theme.warning\n : theme.secondaryText\n\n return (\n <Box>\n <Text color={color}>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text>{summary}</Text>\n </Box>\n )\n }\n\n // Show bash output\n if (text.startsWith('<bash-stdout') || text.startsWith('<bash-stderr')) {\n return <AssistantBashOutputMessage content={text} verbose={verbose} />\n }\n\n // Show command output\n if (\n text.startsWith('<local-command-stdout') ||\n text.startsWith('<local-command-stderr')\n ) {\n return <AssistantLocalCommandOutputMessage content={text} />\n }\n\n if (text.startsWith(API_ERROR_MESSAGE_PREFIX)) {\n return (\n <Text>\n &nbsp;&nbsp;\u23BF &nbsp;\n <Text color={getTheme().error}>\n {text === API_ERROR_MESSAGE_PREFIX\n ? `${API_ERROR_MESSAGE_PREFIX}: Please wait a moment and try again.`\n : text}\n </Text>\n </Text>\n )\n }\n\n switch (text) {\n // Local JSX commands don't need a response, but we still want the assistant to see them\n // Tool results render their own interrupt messages\n case NO_RESPONSE_REQUESTED:\n case INTERRUPT_MESSAGE_FOR_TOOL_USE:\n return null\n\n case INTERRUPT_MESSAGE:\n case CANCEL_MESSAGE:\n return (\n <Text>\n &nbsp;&nbsp;\u23BF &nbsp;\n <Text color={getTheme().error}>Interrupted by user</Text>\n </Text>\n )\n\n case PROMPT_TOO_LONG_ERROR_MESSAGE:\n return (\n <Text>\n &nbsp;&nbsp;\u23BF &nbsp;\n <Text color={getTheme().error}>\n Context low &middot; Run /compact to compact & continue\n </Text>\n </Text>\n )\n\n case CREDIT_BALANCE_TOO_LOW_ERROR_MESSAGE:\n return (\n <Text>\n &nbsp;&nbsp;\u23BF &nbsp;\n <Text color={getTheme().error}>\n Credit balance too low &middot; Add funds in your provider billing\n settings\n </Text>\n </Text>\n )\n\n case INVALID_API_KEY_ERROR_MESSAGE:\n return (\n <Text>\n &nbsp;&nbsp;\u23BF &nbsp;\n <Text color={getTheme().error}>{INVALID_API_KEY_ERROR_MESSAGE}</Text>\n </Text>\n )\n\n default:\n return (\n <Box\n alignItems=\"flex-start\"\n flexDirection=\"row\"\n justifyContent=\"space-between\"\n marginTop={addMargin ? 1 : 0}\n width=\"100%\"\n >\n <Box flexDirection=\"row\">\n {shouldShowDot && (\n <Box minWidth={2}>\n <Text color={getTheme().text}>{BLACK_CIRCLE}</Text>\n </Box>\n )}\n <Box flexDirection=\"column\" width={columns - 6}>\n <Text>{applyMarkdown(text)}</Text>\n </Box>\n </Box>\n <Cost costUSD={costUSD} durationMs={durationMs} debug={debug} />\n </Box>\n )\n }\n}\n", "import * as React from 'react'\nimport BashToolResultMessage from '#tools/tools/system/BashTool/BashToolResultMessage'\nimport { extractTag } from '#core/utils/messages'\n\nexport function AssistantBashOutputMessage({\n content,\n verbose,\n}: {\n content: string\n verbose?: boolean\n}): React.ReactNode {\n const stdout = extractTag(content, 'bash-stdout') ?? ''\n const stderr = extractTag(content, 'bash-stderr') ?? ''\n const stdoutLines = stdout.split('\\n').length\n const stderrLines = stderr.split('\\n').length\n return (\n <BashToolResultMessage\n content={{ stdout, stdoutLines, stderr, stderrLines }}\n verbose={!!verbose}\n />\n )\n}\n", "import * as React from 'react'\nimport { extractTag } from '#core/utils/messages'\nimport { getTheme } from '#core/utils/theme'\nimport { Box, Text } from 'ink'\n\nexport function AssistantLocalCommandOutputMessage({\n content,\n}: {\n content: string\n}): React.ReactNode[] {\n const stdout = extractTag(content, 'local-command-stdout')\n const stderr = extractTag(content, 'local-command-stderr')\n if (!stdout && !stderr) {\n return []\n }\n const theme = getTheme()\n let insides = [\n format(stdout?.trim(), theme.text),\n format(stderr?.trim(), theme.error),\n ].filter(Boolean)\n\n if (insides.length === 0) {\n insides = [\n <React.Fragment key=\"0\">\n <Text>(No output)</Text>\n </React.Fragment>,\n ]\n }\n\n return [\n <Box key=\"0\" gap={1}>\n <Box>\n <Text color={theme.secondaryText}>{' '}\u23BF </Text>\n </Box>\n {insides.map((_, index) => (\n <Box key={index} flexDirection=\"column\">\n {_}\n </Box>\n ))}\n </Box>,\n ]\n}\n\nfunction format(content: string | undefined, color: string): React.ReactNode {\n if (!content) {\n return null\n }\n return <Text color={color}>{content}</Text>\n}\n", "import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { extractTag } from '#core/utils/messages'\nimport { getTheme } from '#core/utils/theme'\nimport { TextBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\n\ntype Props = {\n addMargin: boolean\n param: TextBlockParam\n}\n\nexport function UserKodingInputMessage({\n param: { text },\n addMargin,\n}: Props): React.ReactNode {\n const input = extractTag(text, 'koding-input')\n if (!input) {\n return null\n }\n return (\n <Box flexDirection=\"column\" marginTop={addMargin ? 1 : 0} width=\"100%\">\n <Box>\n <Text color={getTheme().noting}>#</Text>\n <Text color={getTheme().secondaryText}> {input}</Text>\n </Box>\n </Box>\n )\n}\n", "import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { getTheme } from '#core/utils/theme'\nimport { extractTag } from '#core/utils/messages'\nimport { TextBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\n\ntype Props = {\n addMargin: boolean\n param: TextBlockParam\n}\n\nexport function UserCommandMessage({\n addMargin,\n param: { text },\n}: Props): React.ReactNode {\n const commandName =\n extractTag(text, 'command-name') ?? extractTag(text, 'command-message')\n const args = extractTag(text, 'command-args')\n if (!commandName) {\n return null\n }\n\n const theme = getTheme()\n return (\n <Box flexDirection=\"column\" marginTop={addMargin ? 1 : 0} width=\"100%\">\n <Text color={theme.secondaryText}>\n &gt; /{commandName} {args}\n </Text>\n </Box>\n )\n}\n", "import React from 'react'\nimport { TextBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { Box, Text } from 'ink'\nimport { getTheme } from '#core/utils/theme'\nimport { logError } from '#core/utils/log'\nimport { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\n\ntype Props = {\n addMargin: boolean\n param: TextBlockParam\n}\n\nexport function UserPromptMessage({\n addMargin,\n param: { text },\n}: Props): React.ReactNode {\n const { columns } = useTerminalSize()\n if (!text) {\n logError('No content found in user prompt message')\n return null\n }\n\n const theme = getTheme()\n return (\n <Box flexDirection=\"row\" marginTop={addMargin ? 1 : 0} width=\"100%\">\n <Box minWidth={2} width={2}>\n <Text color={theme.kode}>&gt;</Text>\n </Box>\n <Box flexDirection=\"column\" width={columns - 4}>\n <Text color={theme.kode} wrap=\"wrap\">\n {text}\n </Text>\n </Box>\n </Box>\n )\n}\n", "import { TextBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { UserBashInputMessage } from './UserBashInputMessage'\nimport { UserKodingInputMessage } from './UserKodingInputMessage'\nimport { UserCommandMessage } from './UserCommandMessage'\nimport { UserPromptMessage } from './UserPromptMessage'\nimport * as React from 'react'\nimport { NO_CONTENT_MESSAGE } from '#core/ai/constants'\n\ntype Props = {\n addMargin: boolean\n param: TextBlockParam\n}\n\nexport function UserTextMessage({ addMargin, param }: Props): React.ReactNode {\n if (param.text.trim() === NO_CONTENT_MESSAGE) {\n return null\n }\n\n // Koding inputs!\n if (param.text.includes('<koding-input>')) {\n return <UserKodingInputMessage addMargin={addMargin} param={param} />\n }\n\n // Bash inputs!\n if (param.text.includes('<bash-input>')) {\n return <UserBashInputMessage addMargin={addMargin} param={param} />\n }\n\n // Slash commands/\n if (\n param.text.includes('<command-name>') ||\n param.text.includes('<command-message>')\n ) {\n return <UserCommandMessage addMargin={addMargin} param={param} />\n }\n\n // User prompts>\n return <UserPromptMessage addMargin={addMargin} param={param} />\n}\n", "import React from 'react'\nimport type { ImageBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { Box, Text } from 'ink'\nimport { getTheme } from '#core/utils/theme'\n\ntype Props = {\n addMargin: boolean\n param: ImageBlockParam\n}\n\nfunction formatBytes(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes <= 0) return ''\n const units = ['B', 'KB', 'MB', 'GB']\n let value = bytes\n let unitIndex = 0\n while (value >= 1024 && unitIndex < units.length - 1) {\n value /= 1024\n unitIndex++\n }\n const rounded = unitIndex === 0 ? String(Math.round(value)) : value.toFixed(1)\n return `${rounded} ${units[unitIndex]}`\n}\n\nexport function UserImageMessage({ addMargin, param }: Props): React.ReactNode {\n const theme = getTheme()\n const source = param.source\n const base64Source =\n source &&\n typeof source === 'object' &&\n 'type' in source &&\n source.type === 'base64'\n ? source\n : null\n const mediaType = base64Source?.media_type\n\n const approxBytes = base64Source\n ? Math.floor((base64Source.data.length * 3) / 4)\n : 0\n\n const sizeLabel = formatBytes(approxBytes)\n const details = [mediaType, sizeLabel].filter(Boolean).join(' \u00B7 ')\n\n return (\n <Box flexDirection=\"row\" marginTop={addMargin ? 1 : 0} width=\"100%\">\n <Box minWidth={2} width={2}>\n <Text color={theme.secondaryText}>&gt;</Text>\n </Box>\n <Text color={theme.secondaryText}>\n [Image]{details ? ` ${details}` : ''}\n </Text>\n </Box>\n )\n}\n", "import React from 'react'\nimport { Box, Text } from 'ink'\nimport { getTheme } from '#core/utils/theme'\n\ntype Props = {\n addMargin: boolean\n}\n\nexport function AssistantRedactedThinkingMessage({\n addMargin = false,\n}: Props): React.ReactNode {\n return (\n <Box marginTop={addMargin ? 1 : 0}>\n <Text color={getTheme().secondaryText} italic>\n \u273B Thinking\u2026\n </Text>\n </Box>\n )\n}\n", "import { FileEditTool } from '#tools/tools/filesystem/FileEditTool/FileEditTool'\nimport { FileEditToolDiff } from '#ui-ink/components/permissions/FileEditPermissionRequest/FileEditToolDiff'\nimport { Message } from '#ui-ink/components/Message'\nimport { normalizeMessages, type NormalizedMessage } from '#core/utils/messages'\nimport type { Tool } from '#core/tooling/Tool'\nimport { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\nimport { FileWriteTool } from '#tools/tools/filesystem/FileWriteTool/FileWriteTool'\nimport { FileWriteToolDiff } from '#ui-ink/components/permissions/FileWritePermissionRequest/FileWriteToolDiff'\nimport type { AssistantMessage } from '#core/query'\nimport * as React from 'react'\nimport { Box } from 'ink'\n\ntype Props = {\n debug: boolean\n erroredToolUseIDs: Set<string>\n inProgressToolUseIDs: Set<string>\n message: AssistantMessage\n normalizedMessages: NormalizedMessage[]\n tools: Tool[]\n unresolvedToolUseIDs: Set<string>\n verbose: boolean\n}\n\nexport function BinaryFeedbackOption({\n debug,\n erroredToolUseIDs,\n inProgressToolUseIDs,\n message,\n normalizedMessages,\n tools,\n unresolvedToolUseIDs,\n verbose,\n}: Props): React.ReactNode {\n const { columns } = useTerminalSize()\n return normalizeMessages([message])\n .filter(_ => _.type !== 'progress')\n .map((_, index) => (\n <Box flexDirection=\"column\" key={index}>\n <Message\n addMargin={false}\n erroredToolUseIDs={erroredToolUseIDs}\n debug={debug}\n inProgressToolUseIDs={inProgressToolUseIDs}\n message={_}\n messages={normalizedMessages}\n shouldAnimate={false}\n shouldShowDot={true}\n tools={tools}\n unresolvedToolUseIDs={unresolvedToolUseIDs}\n verbose={verbose}\n width={columns / 2 - 6}\n />\n <AdditionalContext message={_} verbose={verbose} />\n </Box>\n ))\n}\n\nfunction AdditionalContext({\n message,\n verbose,\n}: {\n message: NormalizedMessage\n verbose: boolean\n}) {\n const { columns } = useTerminalSize()\n if (message.type !== 'assistant') {\n return null\n }\n const content = message.message.content[0]!\n switch (content.type) {\n case 'tool_use':\n switch (content.name) {\n case FileEditTool.name: {\n const input = FileEditTool.inputSchema.safeParse(content.input)\n if (!input.success) {\n return null\n }\n return (\n <FileEditToolDiff\n file_path={input.data.file_path}\n new_string={input.data.new_string}\n old_string={input.data.old_string}\n verbose={verbose}\n width={columns / 2 - 12}\n />\n )\n }\n case FileWriteTool.name: {\n const input = FileWriteTool.inputSchema.safeParse(content.input)\n if (!input.success) {\n return null\n }\n return (\n <FileWriteToolDiff\n file_path={input.data.file_path}\n content={input.data.content}\n verbose={verbose}\n width={columns / 2 - 12}\n />\n )\n }\n default:\n return null\n }\n default:\n return null\n }\n}\n", "import { Box, Text, useInput } from 'ink'\nimport * as React from 'react'\nimport { useMemo, useState, useEffect } from 'react'\nimport figures from 'figures'\nimport { getTheme } from '#core/utils/theme'\nimport { Message as MessageComponent } from './Message'\nimport { randomUUID } from 'crypto'\nimport { type Tool } from '#core/tooling/Tool'\nimport {\n createUserMessage,\n isEmptyMessageText,\n isNotEmptyMessage,\n normalizeMessages,\n} from '#core/utils/messages'\nimport type { AssistantMessage, UserMessage } from '#core/query'\nimport { useExitOnCtrlCD } from '#ui-ink/hooks/useExitOnCtrlCD'\n\ntype Props = {\n erroredToolUseIDs: Set<string>\n messages: (UserMessage | AssistantMessage)[]\n onSelect: (message: UserMessage) => void\n onEscape: () => void\n tools: Tool[]\n unresolvedToolUseIDs: Set<string>\n}\n\nconst MAX_VISIBLE_MESSAGES = 7\n\nexport function MessageSelector({\n erroredToolUseIDs,\n messages,\n onSelect,\n onEscape,\n tools,\n unresolvedToolUseIDs,\n}: Props): React.ReactNode {\n const currentUUID = useMemo(randomUUID, [])\n\n useEffect(() => {}, [])\n\n function handleSelect(message: UserMessage) {\n const indexFromEnd = messages.length - 1 - messages.indexOf(message)\n onSelect(message)\n }\n\n function handleEscape() {\n onEscape()\n }\n\n // Add current prompt as a virtual message\n const allItems = useMemo(\n () => [\n // Filter out tool results\n ...messages\n .filter(\n _ =>\n !(\n _.type === 'user' &&\n Array.isArray(_.message.content) &&\n _.message.content[0]?.type === 'tool_result'\n ),\n )\n // Filter out assistant messages, until we have a way to kick off the tool use loop from REPL\n .filter(_ => _.type !== 'assistant'),\n { ...createUserMessage(''), uuid: currentUUID } as UserMessage,\n ],\n [messages, currentUUID],\n )\n const [selectedIndex, setSelectedIndex] = useState(allItems.length - 1)\n\n const exitState = useExitOnCtrlCD(() => process.exit(0))\n\n useInput((input, key) => {\n if (key.tab || key.escape) {\n handleEscape()\n return\n }\n if (key.return) {\n handleSelect(allItems[selectedIndex]!)\n return\n }\n if (key.upArrow) {\n if (key.ctrl || key.shift || key.meta) {\n // Jump to top with any modifier key\n setSelectedIndex(0)\n } else {\n setSelectedIndex(prev => Math.max(0, prev - 1))\n }\n }\n if (key.downArrow) {\n if (key.ctrl || key.shift || key.meta) {\n // Jump to bottom with any modifier key\n setSelectedIndex(allItems.length - 1)\n } else {\n setSelectedIndex(prev => Math.min(allItems.length - 1, prev + 1))\n }\n }\n\n // Handle number keys (1-9)\n const num = Number(input)\n if (!isNaN(num) && num >= 1 && num <= Math.min(9, allItems.length)) {\n if (!allItems[num - 1]) {\n return\n }\n handleSelect(allItems[num - 1]!)\n }\n })\n\n const firstVisibleIndex = Math.max(\n 0,\n Math.min(\n selectedIndex - Math.floor(MAX_VISIBLE_MESSAGES / 2),\n allItems.length - MAX_VISIBLE_MESSAGES,\n ),\n )\n\n const normalizedMessages = useMemo(\n () => normalizeMessages(messages).filter(isNotEmptyMessage),\n [messages],\n )\n\n return (\n <>\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={getTheme().secondaryBorder}\n height={4 + Math.min(MAX_VISIBLE_MESSAGES, allItems.length) * 2}\n paddingX={1}\n marginTop={1}\n >\n <Box flexDirection=\"column\" minHeight={2} marginBottom={1}>\n <Text bold>Jump to a previous message</Text>\n <Text dimColor>This will fork the conversation</Text>\n </Box>\n {allItems\n .slice(firstVisibleIndex, firstVisibleIndex + MAX_VISIBLE_MESSAGES)\n .map((msg, index) => {\n const actualIndex = firstVisibleIndex + index\n const isSelected = actualIndex === selectedIndex\n const isCurrent = msg.uuid === currentUUID\n\n return (\n <Box key={msg.uuid} flexDirection=\"row\" height={2} minHeight={2}>\n <Box width={7}>\n {isSelected ? (\n <Text color=\"blue\" bold>\n {figures.pointer} {firstVisibleIndex + index + 1}{' '}\n </Text>\n ) : (\n <Text>\n {' '}\n {firstVisibleIndex + index + 1}{' '}\n </Text>\n )}\n </Box>\n <Box height={1} overflow=\"hidden\" width={100}>\n {isCurrent ? (\n <Box width=\"100%\">\n <Text dimColor italic>\n {'(current)'}\n </Text>\n </Box>\n ) : Array.isArray(msg.message.content) &&\n msg.message.content[0]?.type === 'text' &&\n isEmptyMessageText(msg.message.content[0].text) ? (\n <Text dimColor italic>\n (empty message)\n </Text>\n ) : (\n <MessageComponent\n message={msg}\n messages={normalizedMessages}\n addMargin={false}\n tools={tools}\n verbose={false}\n debug={false}\n erroredToolUseIDs={erroredToolUseIDs}\n inProgressToolUseIDs={new Set()}\n unresolvedToolUseIDs={unresolvedToolUseIDs}\n shouldAnimate={false}\n shouldShowDot={false}\n />\n )}\n </Box>\n </Box>\n )\n })}\n </Box>\n <Box marginLeft={3}>\n <Text dimColor>\n {exitState.pending ? (\n <>Press {exitState.keyName} again to exit</>\n ) : (\n <>\u2191/\u2193 to select \u00B7 Enter to confirm \u00B7 Tab/Esc to cancel</>\n )}\n </Text>\n </Box>\n </>\n )\n}\n", "import { Box } from 'ink'\nimport * as React from 'react'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { Logo } from '#ui-ink/components/Logo'\nimport ProjectOnboarding from '#ui-ink/components/ProjectOnboarding'\nimport type { ToolUseConfirm } from '#ui-ink/components/permissions/PermissionRequest'\nimport PromptInput from '#ui-ink/components/PromptInput'\nimport type { BinaryFeedbackResult } from '#core/query'\nimport { getTotalCost } from '#core/cost-tracker'\nimport { useCostSummary } from '#ui-ink/hooks/useCostSummary'\nimport { useLogStartupTime } from '#ui-ink/hooks/useLogStartupTime'\nimport { useApiKeyVerification } from '#ui-ink/hooks/useApiKeyVerification'\nimport { useCancelRequest } from '#ui-ink/hooks/useCancelRequest'\nimport useCanUseTool from '#ui-ink/hooks/useCanUseTool'\nimport { useLogMessages } from '#ui-ink/hooks/useLogMessages'\nimport {\n setMessagesGetter,\n setMessagesSetter,\n setModelConfigChangeHandler,\n} from '#core/messages'\nimport type { Message as MessageType } from '#core/query'\nimport { getGlobalConfig, saveGlobalConfig } from '#core/utils/config'\nimport { getNextAvailableLogForkNumber } from '#core/utils/log'\nimport { clearTerminal } from '#cli-utils/terminal'\nimport { getOriginalCwd } from '#core/utils/state'\nimport { useTranscriptItems } from './useTranscriptItems'\nimport { useRequestToolUsePermission } from './useRequestToolUsePermission'\nimport { useReplQuery } from './useReplQuery'\nimport { useReplInit } from './useReplInit'\nimport { buildPromptInputProps } from './promptInputProps'\nimport { useMessageSelectorSelect } from './useMessageSelectorSelect'\nimport type { BinaryFeedbackContext, REPLProps } from './types'\n\nexport function useReplController(props: REPLProps) {\n const debug = props.debug ?? false\n const disableSlashCommands = props.disableSlashCommands ?? false\n const safeMode = Boolean(props.safeMode)\n const mcpClients = props.mcpClients ?? []\n const isDefaultModel = props.isDefaultModel ?? true\n const updateAvailableVersion = props.initialUpdateVersion ?? null\n const updateCommands = props.initialUpdateCommands ?? null\n\n const [verboseConfig] = useState(\n () => props.verbose ?? getGlobalConfig().verbose,\n )\n const verbose = verboseConfig\n\n const [forkNumber, setForkNumber] = useState(\n getNextAvailableLogForkNumber(\n props.messageLogName,\n props.initialForkNumber ?? 0,\n 0,\n ),\n )\n const [uiRefreshCounter, setUiRefreshCounter] = useState(0)\n\n const [\n forkConvoWithMessagesOnTheNextRender,\n setForkConvoWithMessagesOnTheNextRender,\n ] = useState<MessageType[] | null>(null)\n\n const [abortController, setAbortController] =\n useState<AbortController | null>(null)\n const [isLoading, setIsLoading] = useState(false)\n const [toolJSX, setToolJSX] = useState<{\n jsx: React.ReactNode | null\n shouldHidePromptInput: boolean\n } | null>(null)\n const [toolUseConfirm, setToolUseConfirm] = useState<ToolUseConfirm | null>(\n null,\n )\n const [messages, setMessages] = useState<MessageType[]>(\n props.initialMessages ?? [],\n )\n const [inputValue, setInputValue] = useState('')\n const [inputMode, setInputMode] = useState<'bash' | 'prompt' | 'koding'>(\n 'prompt',\n )\n const [submitCount, setSubmitCount] = useState(0)\n const [isMessageSelectorVisible, setIsMessageSelectorVisible] =\n useState(false)\n const [showCostDialog, setShowCostDialog] = useState(false)\n const [haveShownCostDialog, setHaveShownCostDialog] = useState(\n getGlobalConfig().hasAcknowledgedCostThreshold,\n )\n const [binaryFeedbackContext, setBinaryFeedbackContext] =\n useState<BinaryFeedbackContext | null>(null)\n\n const getBinaryFeedbackResponse = useCallback(\n (m1: BinaryFeedbackContext['m1'], m2: BinaryFeedbackContext['m2']) => {\n return new Promise<BinaryFeedbackResult>(resolvePromise => {\n setBinaryFeedbackContext({ m1, m2, resolve: resolvePromise })\n })\n },\n [],\n )\n\n const readFileTimestampsRef = useRef<{ [filename: string]: number }>({})\n\n const { status: apiKeyStatus, reverify } = useApiKeyVerification()\n\n const onCancel = useCallback(() => {\n if (!isLoading) return\n setIsLoading(false)\n if (toolUseConfirm) {\n toolUseConfirm.onAbort()\n return\n }\n if (abortController && !abortController.signal.aborted) {\n abortController.abort()\n }\n }, [abortController, isLoading, toolUseConfirm])\n\n useCancelRequest(\n setToolJSX,\n setToolUseConfirm,\n setBinaryFeedbackContext,\n onCancel,\n isLoading,\n isMessageSelectorVisible,\n abortController?.signal,\n )\n\n useEffect(() => {\n if (!forkConvoWithMessagesOnTheNextRender) return\n setForkNumber(prev => prev + 1)\n setForkConvoWithMessagesOnTheNextRender(null)\n setMessages(forkConvoWithMessagesOnTheNextRender)\n }, [forkConvoWithMessagesOnTheNextRender])\n\n useEffect(() => {\n const totalCost = getTotalCost()\n if (totalCost >= 5 && !showCostDialog && !haveShownCostDialog) {\n setShowCostDialog(true)\n }\n }, [messages, showCostDialog, haveShownCostDialog])\n\n const canUseTool = useCanUseTool(setToolUseConfirm)\n const requestToolUsePermission = useRequestToolUsePermission({\n setToolUseConfirm,\n })\n\n const onQuery = useReplQuery({\n disableSlashCommands,\n messages,\n setMessages,\n commands: props.commands,\n forkNumber,\n messageLogName: props.messageLogName,\n tools: props.tools,\n mcpClients,\n verbose,\n safeMode,\n requestToolUsePermission,\n canUseTool,\n readFileTimestamps: readFileTimestampsRef.current,\n setToolJSX,\n getBinaryFeedbackResponse,\n setAbortController,\n setIsLoading,\n })\n\n const onInit = useReplInit({\n initialPrompt: props.initialPrompt,\n commands: props.commands,\n forkNumber,\n messageLogName: props.messageLogName,\n tools: props.tools,\n mcpClients,\n verbose,\n safeMode,\n messages,\n setToolJSX,\n readFileTimestamps: readFileTimestampsRef.current,\n setForkConvoWithMessagesOnTheNextRender,\n reverify,\n setIsLoading,\n setAbortController,\n setHaveShownCostDialog,\n onQuery,\n })\n\n useCostSummary()\n\n useEffect(() => {\n setMessagesGetter(() => messages)\n setMessagesSetter(setMessages)\n }, [messages])\n\n useEffect(() => {\n setModelConfigChangeHandler(() => setUiRefreshCounter(prev => prev + 1))\n }, [])\n\n useLogMessages(messages, props.messageLogName, forkNumber)\n useLogStartupTime()\n\n useEffect(() => {\n onInit()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const transcript = useTranscriptItems({\n messages,\n tools: props.tools,\n verbose,\n debug,\n toolJSX,\n toolUseConfirm,\n isMessageSelectorVisible,\n forkNumber,\n })\n\n const staticItems = useMemo(\n () => [\n {\n jsx: (\n <Box flexDirection=\"column\" key={`logo${forkNumber}`}>\n <Logo\n mcpClients={mcpClients}\n isDefaultModel={isDefaultModel}\n updateBannerVersion={updateAvailableVersion}\n updateBannerCommands={updateCommands}\n />\n <ProjectOnboarding workspaceDir={getOriginalCwd()} />\n </Box>\n ),\n },\n ...transcript.items.slice(0, transcript.replStaticPrefixLength),\n ],\n [\n forkNumber,\n transcript.items,\n transcript.replStaticPrefixLength,\n mcpClients,\n isDefaultModel,\n updateAvailableVersion,\n updateCommands,\n ],\n )\n\n const transientItems = useMemo(\n () => transcript.items.slice(transcript.replStaticPrefixLength),\n [transcript.items, transcript.replStaticPrefixLength],\n )\n\n const showingCostDialog = !isLoading && showCostDialog\n const conversationKey = `${props.messageLogName}:${forkNumber}`\n\n const onCostDialogDone = useCallback(() => {\n setShowCostDialog(false)\n setHaveShownCostDialog(true)\n const projectConfig = getGlobalConfig()\n saveGlobalConfig({ ...projectConfig, hasAcknowledgedCostThreshold: true })\n }, [])\n\n const promptInputProps = buildPromptInputProps({\n commands: props.commands,\n forkNumber,\n messageLogName: props.messageLogName,\n tools: props.tools,\n disableSlashCommands,\n isDisabled: apiKeyStatus === 'invalid',\n isLoading,\n onQuery,\n debug,\n verbose,\n messages,\n setToolJSX,\n input: inputValue,\n onInputChange: setInputValue,\n mode: inputMode,\n onModeChange: setInputMode,\n submitCount,\n onSubmitCountChange: setSubmitCount,\n setIsLoading,\n setAbortController,\n uiRefreshCounter,\n onShowMessageSelector: () => setIsMessageSelectorVisible(prev => !prev),\n setForkConvoWithMessagesOnTheNextRender,\n readFileTimestamps: readFileTimestampsRef.current,\n abortController,\n })\n\n const handleMessageSelectorSelect = useMessageSelectorSelect({\n messages,\n setIsMessageSelectorVisible,\n setMessages,\n setForkConvoWithMessagesOnTheNextRender,\n setInputValue,\n onCancel,\n })\n\n return {\n conversationKey,\n safeMode,\n debug,\n forkNumber,\n staticItems,\n transientItems,\n toolJSX,\n toolUseConfirm,\n setToolUseConfirm,\n binaryFeedbackContext,\n setBinaryFeedbackContext,\n isLoading,\n verbose,\n normalizedMessages: transcript.normalizedMessages,\n tools: props.tools,\n erroredToolUseIDs: transcript.erroredToolUseIDs,\n inProgressToolUseIDs: transcript.inProgressToolUseIDs,\n unresolvedToolUseIDs: transcript.unresolvedToolUseIDs,\n showingCostDialog,\n onCostDialogDone,\n shouldShowPromptInput: props.shouldShowPromptInput,\n isMessageSelectorVisible,\n promptInputProps,\n messageSelectorMessages: messages,\n onMessageSelectorSelect: handleMessageSelectorSelect,\n onMessageSelectorEscape: () => setIsMessageSelectorVisible(false),\n }\n}\n", "import { useEffect } from 'react'\nimport { registerCostSummaryOnExit } from '#core/cost-tracker'\n\nexport function useCostSummary(): void {\n useEffect(() => {\n return registerCostSummaryOnExit()\n }, [])\n}\n", "import { useRef } from 'react'\nimport { logStartupProfile } from '#core/utils/startupProfile'\n\nexport function useLogStartupTime(): void {\n const didLog = useRef(false)\n if (!didLog.current) {\n didLog.current = true\n logStartupProfile('first_render')\n }\n}\n", "import { useCallback, useState } from 'react'\n\nexport type VerificationStatus =\n | 'loading'\n | 'valid'\n | 'invalid'\n | 'missing'\n | 'error'\n\nexport type ApiKeyVerificationResult = {\n status: VerificationStatus\n reverify: () => Promise<void>\n error: Error | null\n}\n\nexport function useApiKeyVerification(): ApiKeyVerificationResult {\n // const [status, setStatus] = useState<VerificationStatus>(() => 'missing')\n // const [error, setError] = useState<Error | null>(null)\n\n // const verify = useCallback(async (): Promise<void> => {\n // if (isDefaultApiKey()) {\n // setStatus('valid')\n // return\n // }\n\n // try {\n // const isValid = await verifyApiKey(apiKey)\n // const newStatus = isValid ? 'valid' : 'invalid'\n // setStatus(newStatus)\n // return\n // } catch (error) {\n // // This happens when there an error response from the API but it's not an invalid API key error\n // // In this case, we still mark the API key as invalid - but we also log the error so we can\n // // display it to the user to be more helpful\n // setError(error as Error)\n // const newStatus = 'error' as const\n // setStatus(newStatus)\n // return\n // }\n // }, [])\n\n return {\n status: 'valid',\n reverify: async () => {},\n error: null,\n }\n}\n", "import { useInput } from 'ink'\nimport { ToolUseConfirm } from '#ui-ink/components/permissions/PermissionRequest'\nimport { BinaryFeedbackContext } from '#ui-ink/screens/REPL'\nimport type { SetToolJSXFn } from '#core/tooling/Tool'\nimport type { ReactNode } from 'react'\n\nexport function useCancelRequest(\n setToolJSX: SetToolJSXFn<ReactNode>,\n setToolUseConfirm: (toolUseConfirm: ToolUseConfirm | null) => void,\n setBinaryFeedbackContext: (bfContext: BinaryFeedbackContext | null) => void,\n onCancel: () => void,\n isLoading: boolean,\n isMessageSelectorVisible: boolean,\n abortSignal?: AbortSignal,\n) {\n useInput((_, key) => {\n if (!key.escape) {\n return\n }\n if (abortSignal?.aborted) {\n return\n }\n if (!abortSignal) {\n return\n }\n if (!isLoading) {\n return\n }\n if (isMessageSelectorVisible) {\n // Esc closes the message selector\n return\n }\n\n setToolJSX(null)\n setToolUseConfirm(null)\n setBinaryFeedbackContext(null)\n onCancel()\n })\n}\n", "import React, { useCallback } from 'react'\nimport { hasPermissionsToUseTool } from '#core/permissions'\nimport { BashTool, inputSchema } from '#tools/tools/system/BashTool/BashTool'\nimport { getCommandSubcommandPrefix } from '#core/utils/commands'\nimport {\n REJECT_MESSAGE,\n REJECT_MESSAGE_WITH_FEEDBACK_PREFIX,\n} from '#core/utils/messages'\nimport type { Tool as ToolType, ToolUseContext } from '#core/tooling/Tool'\nimport { AssistantMessage } from '#core/query'\nimport { ToolUseConfirm } from '#ui-ink/components/permissions/PermissionRequest'\nimport { AbortError } from '#core/utils/errors'\nimport { logError } from '#core/utils/log'\nimport type { ToolPermissionContextUpdate } from '#core/types/toolPermissionContext'\n\ntype SetState<T> = React.Dispatch<React.SetStateAction<T>>\n\nexport type CanUseToolFn = (\n tool: ToolType,\n input: { [key: string]: unknown },\n toolUseContext: ToolUseContext,\n assistantMessage: AssistantMessage,\n) => Promise<\n | { result: true }\n | {\n result: false\n message: string\n shouldPromptUser?: boolean\n suggestions?: ToolPermissionContextUpdate[]\n }\n>\n\nfunction useCanUseTool(\n setToolUseConfirm: SetState<ToolUseConfirm | null>,\n): CanUseToolFn {\n return useCallback<CanUseToolFn>(\n async (tool, input, toolUseContext, assistantMessage) => {\n return new Promise(resolve => {\n function logCancelledEvent() {}\n\n function resolveWithCancelledAndAbortAllToolCalls(message?: string) {\n resolve({\n result: false,\n message: message\n ? `${REJECT_MESSAGE_WITH_FEEDBACK_PREFIX}${message}`\n : REJECT_MESSAGE,\n })\n // Trigger a synthetic assistant message in query(), to cancel\n // any other pending tool uses and stop further requests to the\n // API and wait for user input.\n toolUseContext.abortController.abort()\n }\n\n if (toolUseContext.abortController.signal.aborted) {\n logCancelledEvent()\n resolveWithCancelledAndAbortAllToolCalls()\n return\n }\n\n return hasPermissionsToUseTool(\n tool,\n input,\n toolUseContext,\n assistantMessage,\n )\n .then(async result => {\n // Has permissions to use tool, granted in config\n if (result.result === true) {\n resolve({ result: true })\n return\n }\n\n const deniedResult = result as Extract<\n typeof result,\n { result: false }\n >\n\n if (deniedResult.shouldPromptUser === false) {\n resolve({ result: false, message: deniedResult.message })\n return\n }\n\n const [description, commandPrefix] = await Promise.all([\n typeof tool.description === 'function'\n ? tool.description(input as never)\n : Promise.resolve(tool.description ?? `Tool: ${tool.name}`),\n tool === BashTool\n ? getCommandSubcommandPrefix(\n inputSchema.parse(input).command, // already validated upstream, so ok to parse (as opposed to safeParse)\n toolUseContext.abortController.signal,\n )\n : Promise.resolve(null),\n ])\n\n if (toolUseContext.abortController.signal.aborted) {\n logCancelledEvent()\n resolveWithCancelledAndAbortAllToolCalls()\n return\n }\n\n // Does not have permissions to use tool, ask the user\n setToolUseConfirm({\n assistantMessage,\n tool,\n description,\n input,\n commandPrefix,\n toolUseContext,\n suggestions: deniedResult.suggestions,\n riskScore: null,\n onAbort() {\n logCancelledEvent()\n resolveWithCancelledAndAbortAllToolCalls()\n },\n onAllow(type) {\n if (type === 'permanent') {\n } else {\n }\n resolve({ result: true })\n },\n onReject(rejectionMessage) {\n resolveWithCancelledAndAbortAllToolCalls(rejectionMessage)\n },\n })\n })\n .catch(error => {\n if (error instanceof AbortError) {\n logCancelledEvent()\n resolveWithCancelledAndAbortAllToolCalls()\n } else {\n logError(error)\n }\n })\n })\n },\n [setToolUseConfirm],\n )\n}\n\nexport default useCanUseTool\n", "import { useEffect } from 'react'\nimport { type Message } from '#core/query'\nimport { overwriteLog, getMessagesPath } from '#core/utils/log'\n\nexport function useLogMessages(\n messages: Message[],\n messageLogName: string,\n forkNumber: number,\n): void {\n useEffect(() => {\n overwriteLog(\n getMessagesPath(messageLogName, forkNumber, 0),\n messages.filter(_ => _.type !== 'progress'),\n { conversationKey: `${messageLogName}:${forkNumber}` },\n )\n }, [messages, messageLogName, forkNumber])\n}\n", "import { Box } from 'ink'\nimport type { ToolUseBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport * as React from 'react'\nimport { useMemo } from 'react'\nimport type { ReactNode } from 'react'\nimport { Message } from '#ui-ink/components/Message'\nimport { MessageResponse } from '#ui-ink/components/MessageResponse'\nimport type { Message as MessageType } from '#core/query'\nimport type { Tool } from '#core/tooling/Tool'\nimport {\n getErroredToolUseMessages,\n getInProgressToolUseIDs,\n getToolUseID,\n getUnresolvedToolUseIDs,\n INTERRUPT_MESSAGE,\n isNotEmptyMessage,\n normalizeMessages,\n reorderMessages,\n type NormalizedMessage,\n} from '#core/utils/messages'\nimport { getReplStaticPrefixLength } from '#cli-utils/replStaticSplit'\n\nexport type TranscriptItem = { jsx: ReactNode }\n\nexport function useTranscriptItems(args: {\n messages: MessageType[]\n tools: Tool[]\n verbose: boolean\n debug: boolean\n toolJSX: { jsx: ReactNode | null; shouldHidePromptInput: boolean } | null\n toolUseConfirm: unknown | null\n isMessageSelectorVisible: boolean\n forkNumber: number\n}): {\n normalizedMessages: NormalizedMessage[]\n orderedMessages: NormalizedMessage[]\n unresolvedToolUseIDs: Set<string>\n inProgressToolUseIDs: Set<string>\n erroredToolUseIDs: Set<string>\n replStaticPrefixLength: number\n items: TranscriptItem[]\n} {\n const normalizedMessages = useMemo(\n () => normalizeMessages(args.messages).filter(isNotEmptyMessage),\n [args.messages],\n )\n\n const unresolvedToolUseIDs = useMemo(\n () => getUnresolvedToolUseIDs(normalizedMessages),\n [normalizedMessages],\n )\n\n const inProgressToolUseIDs = useMemo(\n () => getInProgressToolUseIDs(normalizedMessages),\n [normalizedMessages],\n )\n\n const erroredToolUseIDs = useMemo(\n () =>\n new Set(\n getErroredToolUseMessages(normalizedMessages).map(\n _ => (_.message.content[0]! as ToolUseBlockParam).id,\n ),\n ),\n [normalizedMessages],\n )\n\n const orderedMessages = useMemo(\n () => reorderMessages(normalizedMessages),\n [normalizedMessages],\n )\n\n const replStaticPrefixLength = useMemo(\n () =>\n getReplStaticPrefixLength(\n orderedMessages,\n normalizedMessages,\n unresolvedToolUseIDs,\n ),\n [orderedMessages, normalizedMessages, unresolvedToolUseIDs],\n )\n\n const items = useMemo(() => {\n return orderedMessages.map((message, index) => {\n const toolUseID = getToolUseID(message)\n const isInStaticPrefix = index < replStaticPrefixLength\n\n const rendered =\n message.type === 'progress' ? (\n message.content.message.content[0]?.type === 'text' &&\n message.content.message.content[0].text === INTERRUPT_MESSAGE ? (\n <Message\n message={message.content}\n messages={message.normalizedMessages}\n addMargin={false}\n tools={message.tools}\n verbose={args.verbose}\n debug={args.debug}\n erroredToolUseIDs={new Set()}\n inProgressToolUseIDs={new Set()}\n unresolvedToolUseIDs={new Set()}\n shouldAnimate={false}\n shouldShowDot={false}\n />\n ) : (\n <MessageResponse\n children={\n <Message\n message={message.content}\n messages={message.normalizedMessages}\n addMargin={false}\n tools={message.tools}\n verbose={args.verbose}\n debug={args.debug}\n erroredToolUseIDs={new Set()}\n inProgressToolUseIDs={new Set()}\n unresolvedToolUseIDs={\n new Set([\n (message.content.message.content[0]! as ToolUseBlockParam)\n .id,\n ])\n }\n shouldAnimate={false}\n shouldShowDot={false}\n />\n }\n />\n )\n ) : (\n <Message\n message={message}\n messages={normalizedMessages}\n addMargin={true}\n tools={args.tools}\n verbose={args.verbose}\n debug={args.debug}\n erroredToolUseIDs={erroredToolUseIDs}\n inProgressToolUseIDs={inProgressToolUseIDs}\n shouldAnimate={\n !args.toolJSX &&\n !args.toolUseConfirm &&\n !args.isMessageSelectorVisible &&\n (!toolUseID || inProgressToolUseIDs.has(toolUseID))\n }\n shouldShowDot={true}\n unresolvedToolUseIDs={unresolvedToolUseIDs}\n />\n )\n\n if (args.debug) {\n return {\n jsx: (\n <Box\n borderStyle=\"single\"\n borderColor={isInStaticPrefix ? 'green' : 'red'}\n key={message.uuid}\n width=\"100%\"\n >\n {rendered}\n </Box>\n ),\n }\n }\n\n return {\n jsx: (\n <Box key={message.uuid} width=\"100%\">\n {rendered}\n </Box>\n ),\n }\n })\n }, [\n args.debug,\n args.isMessageSelectorVisible,\n args.toolJSX,\n args.toolUseConfirm,\n args.tools,\n args.verbose,\n erroredToolUseIDs,\n inProgressToolUseIDs,\n normalizedMessages,\n orderedMessages,\n replStaticPrefixLength,\n unresolvedToolUseIDs,\n ])\n\n return {\n normalizedMessages,\n orderedMessages,\n unresolvedToolUseIDs,\n inProgressToolUseIDs,\n erroredToolUseIDs,\n replStaticPrefixLength,\n items,\n }\n}\n", "import { Box, Text } from 'ink'\nimport * as React from 'react'\n\ntype Props = {\n children: React.ReactNode\n}\n\nexport function MessageResponse({ children }: Props): React.ReactNode {\n return (\n <Box flexDirection=\"row\">\n <Text>{' '}\u23BF &nbsp;</Text>\n <Box flexDirection=\"column\" flexGrow={1}>\n {children}\n </Box>\n </Box>\n )\n}\n", "import { useCallback } from 'react'\nimport type { Tool, ToolUseContext } from '#core/tooling/Tool'\nimport type { CommandSubcommandPrefixResult } from '#core/utils/commands'\nimport type { ToolPermissionContextUpdate } from '#core/types/toolPermissionContext'\nimport { createAssistantMessage } from '#core/utils/messages'\nimport type { ToolUseConfirm } from '#ui-ink/components/permissions/PermissionRequest'\n\ntype PermissionDecision =\n | { result: true; type: 'permanent' | 'temporary' }\n | { result: false; rejectionMessage?: string }\n\nexport function useRequestToolUsePermission(args: {\n setToolUseConfirm: (confirm: ToolUseConfirm | null) => void\n}) {\n return useCallback(\n async (\n request: {\n tool: Tool\n description: string\n input: { [key: string]: unknown }\n commandPrefix: CommandSubcommandPrefixResult | null\n suggestions?: ToolPermissionContextUpdate[]\n riskScore: number | null\n },\n toolUseContext: ToolUseContext,\n ): Promise<PermissionDecision> => {\n return await new Promise<PermissionDecision>(resolve => {\n if (toolUseContext.abortController.signal.aborted) {\n resolve({ result: false })\n return\n }\n\n const assistantMessage = createAssistantMessage('')\n if (toolUseContext.messageId) {\n assistantMessage.message.id = toolUseContext.messageId\n }\n\n const toolUseConfirm: ToolUseConfirm = {\n assistantMessage,\n tool: request.tool,\n description: request.description,\n input: request.input,\n commandPrefix: request.commandPrefix ?? null,\n toolUseContext,\n suggestions: request.suggestions,\n riskScore: request.riskScore ?? null,\n onAbort() {\n resolve({ result: false })\n toolUseContext.abortController.abort()\n },\n onAllow(type) {\n resolve({ result: true, type })\n },\n onReject(rejectionMessage) {\n resolve({ result: false, rejectionMessage })\n },\n }\n\n args.setToolUseConfirm(toolUseConfirm)\n })\n },\n [args],\n )\n}\n", "import { useCallback, type ReactNode } from 'react'\nimport { getSystemPrompt } from '#core/constants/prompts'\nimport { getContext } from '#core/context'\nimport { getMaxThinkingTokens } from '#core/utils/thinking'\nimport { getLastAssistantMessageId } from '#core/utils/messages'\nimport { runTurn } from '#core/engine'\nimport { handleHashCommand } from '#core/utils/hashCommand'\nimport { logError } from '#core/utils/log'\nimport { debug as debugLogger } from '#core/utils/debugLogger'\nimport { getToolPermissionContextForConversationKey } from '#core/utils/toolPermissionContextState'\nimport type {\n AssistantMessage,\n BinaryFeedbackResult,\n Message as MessageType,\n} from '#core/query'\nimport type { CanUseToolFn } from '#core/permissions/canUseTool'\nimport type { SetToolJSXFn, Tool, ToolUseContext } from '#core/tooling/Tool'\nimport type { WrappedClient } from '#core/mcp/client'\nimport { markProjectOnboardingComplete } from '#ui-ink/components/ProjectOnboarding'\nimport type { Command } from '#cli-commands'\nimport {\n getOutputStyleSystemPromptAdditions,\n getCurrentOutputStyleDefinition,\n} from '#cli-services/outputStyles'\n\nexport function useReplQuery(args: {\n disableSlashCommands: boolean\n messages: MessageType[]\n setMessages: React.Dispatch<React.SetStateAction<MessageType[]>>\n commands: Command[]\n forkNumber: number\n messageLogName: string\n tools: Tool[]\n mcpClients: WrappedClient[]\n verbose: boolean\n safeMode: boolean\n requestToolUsePermission: NonNullable<\n ToolUseContext['options']\n >['requestToolUsePermission']\n canUseTool: CanUseToolFn\n readFileTimestamps: { [filename: string]: number }\n setToolJSX: SetToolJSXFn<ReactNode>\n getBinaryFeedbackResponse: (\n m1: AssistantMessage,\n m2: AssistantMessage,\n ) => Promise<BinaryFeedbackResult>\n setAbortController: (abortController: AbortController | null) => void\n setIsLoading: (isLoading: boolean) => void\n}): (\n newMessages: MessageType[],\n passedAbortController?: AbortController,\n) => Promise<void> {\n return useCallback(\n async (\n newMessages: MessageType[],\n passedAbortController?: AbortController,\n ) => {\n const controllerToUse = passedAbortController || new AbortController()\n if (!passedAbortController) {\n args.setAbortController(controllerToUse)\n }\n\n const isKodingRequest =\n newMessages.length > 0 &&\n newMessages[0].type === 'user' &&\n newMessages[0].options?.isKodingRequest === true\n\n args.setMessages(oldMessages => [...oldMessages, ...newMessages])\n\n markProjectOnboardingComplete()\n\n const lastMessage = newMessages[newMessages.length - 1]!\n if (lastMessage.type === 'assistant') {\n args.setAbortController(null)\n args.setIsLoading(false)\n return\n }\n\n const outputStyle = getCurrentOutputStyleDefinition()\n const [systemPrompt, context, maxThinkingTokens] = await Promise.all([\n getSystemPrompt({\n disableSlashCommands: args.disableSlashCommands,\n outputStyleActive: outputStyle !== null,\n keepCodingInstructions: outputStyle?.keepCodingInstructions,\n }),\n getContext(),\n getMaxThinkingTokens([...args.messages, lastMessage]),\n ])\n\n let lastAssistantMessage: MessageType | null = null\n\n for await (const message of runTurn({\n messages: [...args.messages, lastMessage],\n systemPrompt,\n context,\n canUseTool: args.canUseTool,\n toolUseContext: {\n options: {\n commands: args.commands,\n forkNumber: args.forkNumber,\n messageLogName: args.messageLogName,\n tools: args.tools,\n mcpClients: args.mcpClients,\n verbose: args.verbose,\n safeMode: args.safeMode,\n maxThinkingTokens,\n requestToolUsePermission: args.requestToolUsePermission,\n isKodingRequest: isKodingRequest || undefined,\n toolPermissionContext: getToolPermissionContextForConversationKey({\n conversationKey: `${args.messageLogName}:${args.forkNumber}`,\n isBypassPermissionsModeAvailable: !args.safeMode,\n }),\n getCustomSystemPromptAdditions: getOutputStyleSystemPromptAdditions,\n },\n messageId: getLastAssistantMessageId([...args.messages, lastMessage]),\n readFileTimestamps: args.readFileTimestamps,\n abortController: controllerToUse,\n setToolJSX: args.setToolJSX,\n },\n getBinaryFeedbackResponse: args.getBinaryFeedbackResponse,\n })) {\n args.setMessages(oldMessages => [...oldMessages, message])\n if (message.type === 'assistant') {\n lastAssistantMessage = message\n }\n }\n\n if (\n isKodingRequest &&\n lastAssistantMessage &&\n lastAssistantMessage.type === 'assistant'\n ) {\n try {\n const content =\n typeof lastAssistantMessage.message.content === 'string'\n ? lastAssistantMessage.message.content\n : lastAssistantMessage.message.content\n .filter(block => block.type === 'text')\n .map(block => (block.type === 'text' ? block.text : ''))\n .join('\\n')\n\n if (content && content.trim().length > 0) {\n handleHashCommand(content)\n }\n } catch (error) {\n logError(error)\n debugLogger.error('REPL_KODING_SAVE_PROJECT_DOCS_ERROR', { error })\n }\n }\n\n args.setIsLoading(false)\n },\n [args],\n )\n}\n", "import { useCallback } from 'react'\nimport { addToHistory } from '#core/history'\nimport { getGlobalConfig } from '#core/utils/config'\nimport { getLastAssistantMessageId } from '#core/utils/messages'\nimport { processUserInput } from '#ui-ink/utils/processUserInput'\nimport type { Command } from '#cli-commands'\nimport type { Message as MessageType } from '#core/query'\nimport type { WrappedClient } from '#core/mcp/client'\nimport type { ToolUseContext, Tool } from '#core/tooling/Tool'\nimport { getToolPermissionContextForConversationKey } from '#core/utils/toolPermissionContextState'\n\nexport function useReplInit(args: {\n initialPrompt: string | undefined\n commands: Command[]\n forkNumber: number\n messageLogName: string\n tools: Tool[]\n mcpClients: WrappedClient[]\n verbose: boolean\n safeMode: boolean\n messages: MessageType[]\n setToolJSX: (jsx: any) => void\n readFileTimestamps: { [filename: string]: number }\n setForkConvoWithMessagesOnTheNextRender: (messages: MessageType[]) => void\n reverify: () => void\n setIsLoading: (isLoading: boolean) => void\n setAbortController: (abortController: AbortController | null) => void\n setHaveShownCostDialog: (value: boolean) => void\n onQuery: (\n newMessages: MessageType[],\n passedAbortController?: AbortController,\n ) => Promise<void>\n}) {\n return useCallback(async () => {\n args.reverify()\n\n if (!args.initialPrompt) return\n\n args.setIsLoading(true)\n const controller = new AbortController()\n args.setAbortController(controller)\n\n try {\n const newMessages = await processUserInput(\n args.initialPrompt,\n 'prompt',\n args.setToolJSX,\n {\n abortController: controller,\n options: {\n commands: args.commands,\n forkNumber: args.forkNumber,\n messageLogName: args.messageLogName,\n tools: args.tools,\n mcpClients: args.mcpClients,\n verbose: args.verbose,\n maxThinkingTokens: 0,\n toolPermissionContext: getToolPermissionContextForConversationKey({\n conversationKey: `${args.messageLogName}:${args.forkNumber}`,\n isBypassPermissionsModeAvailable: !args.safeMode,\n }),\n } satisfies ToolUseContext['options'],\n messageId: getLastAssistantMessageId(args.messages),\n setForkConvoWithMessagesOnTheNextRender:\n args.setForkConvoWithMessagesOnTheNextRender,\n readFileTimestamps: args.readFileTimestamps,\n } satisfies ToolUseContext & {\n setForkConvoWithMessagesOnTheNextRender: (\n forkConvoWithMessages: MessageType[],\n ) => void\n },\n null,\n )\n\n if (newMessages.length) {\n for (const message of newMessages) {\n if (message.type === 'user') addToHistory(args.initialPrompt)\n }\n await args.onQuery(newMessages, controller)\n } else {\n addToHistory(args.initialPrompt)\n }\n\n args.setHaveShownCostDialog(\n Boolean(getGlobalConfig().hasAcknowledgedCostThreshold),\n )\n } finally {\n args.setIsLoading(false)\n args.setAbortController(null)\n }\n }, [args])\n}\n", "import type React from 'react'\nimport type PromptInput from '#ui-ink/components/PromptInput'\n\ntype PromptInputProps = React.ComponentProps<typeof PromptInput>\n\nexport function buildPromptInputProps(args: {\n commands: PromptInputProps['commands']\n forkNumber: PromptInputProps['forkNumber']\n messageLogName: PromptInputProps['messageLogName']\n tools: PromptInputProps['tools']\n disableSlashCommands: boolean\n isDisabled: boolean\n isLoading: PromptInputProps['isLoading']\n onQuery: PromptInputProps['onQuery']\n debug: PromptInputProps['debug']\n verbose: PromptInputProps['verbose']\n messages: PromptInputProps['messages']\n setToolJSX: PromptInputProps['setToolJSX']\n input: PromptInputProps['input']\n onInputChange: PromptInputProps['onInputChange']\n mode: PromptInputProps['mode']\n onModeChange: PromptInputProps['onModeChange']\n submitCount: PromptInputProps['submitCount']\n onSubmitCountChange: PromptInputProps['onSubmitCountChange']\n setIsLoading: PromptInputProps['setIsLoading']\n setAbortController: PromptInputProps['setAbortController']\n uiRefreshCounter: PromptInputProps['uiRefreshCounter']\n onShowMessageSelector: PromptInputProps['onShowMessageSelector']\n setForkConvoWithMessagesOnTheNextRender: PromptInputProps['setForkConvoWithMessagesOnTheNextRender']\n readFileTimestamps: PromptInputProps['readFileTimestamps']\n abortController: PromptInputProps['abortController']\n}): PromptInputProps {\n return {\n commands: args.commands,\n forkNumber: args.forkNumber,\n messageLogName: args.messageLogName,\n tools: args.tools,\n disableSlashCommands: args.disableSlashCommands,\n isDisabled: args.isDisabled,\n isLoading: args.isLoading,\n onQuery: args.onQuery,\n debug: args.debug,\n verbose: args.verbose,\n messages: args.messages,\n setToolJSX: args.setToolJSX,\n input: args.input,\n onInputChange: args.onInputChange,\n mode: args.mode,\n onModeChange: args.onModeChange,\n submitCount: args.submitCount,\n onSubmitCountChange: args.onSubmitCountChange,\n setIsLoading: args.setIsLoading,\n setAbortController: args.setAbortController,\n uiRefreshCounter: args.uiRefreshCounter,\n onShowMessageSelector: args.onShowMessageSelector,\n setForkConvoWithMessagesOnTheNextRender:\n args.setForkConvoWithMessagesOnTheNextRender,\n readFileTimestamps: args.readFileTimestamps,\n abortController: args.abortController,\n }\n}\n", "import type React from 'react'\nimport { useCallback } from 'react'\nimport { clearTerminal } from '#cli-utils/terminal'\nimport type { Message as MessageType } from '#core/query'\n\nexport function useMessageSelectorSelect(args: {\n messages: MessageType[]\n setIsMessageSelectorVisible: React.Dispatch<React.SetStateAction<boolean>>\n setMessages: React.Dispatch<React.SetStateAction<MessageType[]>>\n setForkConvoWithMessagesOnTheNextRender: React.Dispatch<\n React.SetStateAction<MessageType[] | null>\n >\n setInputValue: React.Dispatch<React.SetStateAction<string>>\n onCancel: () => void\n}) {\n return useCallback(\n async (message: MessageType) => {\n args.setIsMessageSelectorVisible(false)\n if (!args.messages.includes(message)) return\n args.onCancel()\n\n setImmediate(async () => {\n await clearTerminal()\n args.setMessages([])\n args.setForkConvoWithMessagesOnTheNextRender(\n args.messages.slice(0, args.messages.indexOf(message)),\n )\n if (\n message.type === 'user' &&\n typeof message.message.content === 'string'\n ) {\n args.setInputValue(message.message.content)\n }\n })\n },\n [args],\n )\n}\n", "import React from 'react'\nimport { Box, Text } from 'ink'\nimport { Select } from './CustomSelect/select'\nimport { getTheme } from '#core/utils/theme'\nimport { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\nimport { formatDate } from '#core/utils/log'\nimport type { KodeAgentSessionListItem } from '#protocol/utils/kodeAgentSessionResume'\n\ntype SessionSelectorProps = {\n sessions: KodeAgentSessionListItem[]\n onSelect: (index: number) => void\n}\n\nexport function SessionSelector({\n sessions,\n onSelect,\n}: SessionSelectorProps): React.ReactNode {\n const { rows, columns } = useTerminalSize()\n if (sessions.length === 0) return null\n\n const visibleCount = rows - 3\n const hiddenCount = Math.max(0, sessions.length - visibleCount)\n\n const indexWidth = 7\n const modifiedWidth = 21\n const createdWidth = 21\n const tagWidth = 10\n\n const options = sessions.map((s, i) => {\n const index = `[${i}]`.padEnd(indexWidth)\n const modified = formatDate(\n s.modifiedAt ?? s.createdAt ?? new Date(0),\n ).padEnd(modifiedWidth)\n const created = formatDate(\n s.createdAt ?? s.modifiedAt ?? new Date(0),\n ).padEnd(createdWidth)\n const tag = (s.tag ? `#${s.tag}` : '').padEnd(tagWidth)\n\n const name = s.customTitle ?? s.slug ?? s.sessionId\n const summary = s.summary ? s.summary.split('\\n')[0] : ''\n\n const labelTxt = `${index}${modified}${created}${tag}${name}${summary ? ` \u2014 ${summary}` : ''}`\n const truncated =\n labelTxt.length > columns - 2\n ? `${labelTxt.slice(0, columns - 5)}...`\n : labelTxt\n\n return { label: truncated, value: String(i) }\n })\n\n return (\n <Box flexDirection=\"column\" height=\"100%\" width=\"100%\">\n <Box paddingLeft={9}>\n <Text bold color={getTheme().text}>\n Modified\n </Text>\n <Text>{' '}</Text>\n <Text bold color={getTheme().text}>\n Created\n </Text>\n <Text>{' '}</Text>\n <Text bold color={getTheme().text}>\n Tag\n </Text>\n <Text>{' '}</Text>\n <Text bold color={getTheme().text}>\n Session\n </Text>\n </Box>\n <Select\n options={options}\n onChange={value => onSelect(parseInt(value, 10))}\n visibleOptionCount={visibleCount}\n />\n {hiddenCount > 0 && (\n <Box paddingLeft={2}>\n <Text color={getTheme().secondaryText}>and {hiddenCount} more\u2026</Text>\n </Box>\n )}\n </Box>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "render", "React", "Box", "Static", "React", "useInput", "React", "Box", "Text", "React", "useCallback", "useMemo", "React", "Box", "Text", "Box", "Text", "React", "useEffect", "config", "useEffect", "config", "React", "useMemo", "useCallback", "React", "Box", "Text", "Box", "Text", "React", "useMemo", "useEffect", "usePermissionRequestLogging", "useEffect", "chalk", "command", "chalk", "command", "description", "useMemo", "usePermissionRequestLogging", "React", "Box", "Text", "Box", "Text", "React", "useMemo", "chalk", "userFacingName", "useMemo", "React", "Box", "Text", "chalk", "useEffect", "useEffect", "Box", "Text", "useInput", "React", "useCallback", "useMemo", "basename", "dirname", "extname", "existsSync", "chalk", "React", "existsSync", "readFileSync", "useMemo", "Box", "Text", "extname", "relative", "Text", "React", "useMemo", "useMemo", "React", "Text", "useMemo", "existsSync", "readFileSync", "Box", "Text", "relative", "extname", "useMemo", "dirname", "basename", "chalk", "existsSync", "extractLanguageName", "useCallback", "useInput", "React", "Box", "Text", "extname", "Box", "Text", "useInput", "React", "useCallback", "useMemo", "chalk", "basename", "dirname", "dirname", "React", "basename", "label", "chalk", "useMemo", "userFacingName", "useCallback", "useInput", "Box", "Text", "Box", "Text", "React", "useMemo", "chalk", "command", "useMemo", "React", "Box", "Text", "chalk", "Box", "Text", "React", "useMemo", "chalk", "useMemo", "React", "Box", "Text", "chalk", "Box", "Text", "useInput", "React", "useMemo", "chalk", "url", "useMemo", "useInput", "React", "Box", "Text", "chalk", "Box", "Text", "useInput", "React", "useInput", "React", "Box", "Text", "Box", "Text", "useInput", "React", "useEffect", "useMemo", "useState", "readFileSync", "command", "resolve", "writeFileSync", "useMemo", "useState", "useEffect", "useInput", "writeFileSync", "React", "Box", "Text", "React", "useCallback", "useMemo", "useState", "Box", "Text", "React", "Box", "Text", "React", "Box", "Text", "figures", "React", "Box", "Text", "figures", "React", "Box", "Text", "figures", "useInput", "figures", "useInput", "selectedValue", "useMemo", "useState", "useCallback", "React", "Box", "Text", "useInput", "useInput", "React", "useCallback", "useEffect", "useMemo", "useState", "useState", "useState", "useEffect", "useState", "useState", "useEffect", "command", "useCallback", "useState", "existsSync", "statSync", "basename", "dirname", "join", "config", "cost", "name", "command", "seen", "useEffect", "useState", "useState", "useEffect", "config", "useCallback", "useEffect", "useState", "useState", "useEffect", "useCallback", "useEffect", "useState", "useState", "useCallback", "readdirSync", "statSync", "useEffect", "useCallback", "useEffect", "useRef", "useInput", "currentWord", "wordEnd", "actualEndPos", "preview", "newInput", "useInput", "useState", "useCallback", "join", "readFileSync", "writeFileSync", "join", "readFileSync", "writeFileSync", "Box", "Box", "Text", "useInput", "React", "useState", "url", "command", "useState", "description", "useInput", "Box", "Text", "React", "Box", "Text", "useInput", "React", "useState", "figures", "useState", "theme", "config", "useInput", "Box", "Text", "figures", "React", "name", "React", "React", "React", "Box", "Text", "useInput", "useInput", "Box", "Text", "React", "React", "Box", "Text", "existsSync", "join", "config", "existsSync", "join", "Box", "Text", "command", "isEnabled", "existsSync", "readdirSync", "readFileSync", "statSync", "join", "seen", "name", "command", "React", "React", "useEffect", "useState", "useCallback", "Box", "Text", "useInput", "resolve", "config", "React", "Box", "Text", "Box", "Text", "React", "useEffect", "useRef", "useState", "useState", "useRef", "useEffect", "Box", "Text", "React", "Box", "Text", "useState", "useEffect", "useInput", "url", "useCallback", "React", "Box", "Text", "Box", "Text", "Box", "Text", "React", "Text", "config", "chalk", "name", "chalk", "parse", "parse", "getCommands", "name", "React", "useMemo", "useRef", "Box", "Text", "useInput", "chalk", "useRef", "useMemo", "useInput", "chalk", "React", "Box", "Text", "name", "help", "isEnabled", "React", "Box", "Text", "useInput", "React", "useState", "useCallback", "figures", "Box", "Text", "useInput", "React", "useState", "useCallback", "figures", "config", "useState", "useCallback", "useInput", "Box", "Text", "figures", "config", "useState", "useCallback", "useInput", "Box", "Text", "figures", "help", "isEnabled", "React", "reloadModelManager", "React", "React", "Text", "Box", "config", "React", "Box", "Text", "React", "React", "config", "getCommands", "Box", "Text", "useInput", "React", "todos", "React", "React", "React", "useCallback", "useEffect", "useMemo", "useState", "Text", "chalk", "existsSync", "writeFileSync", "join", "homedir", "asRecord", "record", "config", "description", "join", "homedir", "existsSync", "description", "writeFileSync", "React", "Box", "useInput", "React", "Box", "Text", "React", "Box", "Text", "useInput", "React", "Box", "React", "useEffect", "useMemo", "useState", "Box", "Text", "useInput", "figures", "spawn", "resolve", "command", "spawn", "name", "useMemo", "useState", "useEffect", "useInput", "React", "Box", "Text", "figures", "React", "useMemo", "chalk", "React", "useCallback", "useMemo", "useState", "useState", "useCallback", "useMemo", "React", "React", "useState", "Box", "Text", "useInput", "useState", "useInput", "React", "Box", "Text", "React", "Box", "useInput", "React", "useState", "Box", "Text", "useInput", "figures", "useState", "useInput", "React", "Box", "figures", "Text", "useInput", "React", "Box", "React", "Box", "useInput", "useInput", "React", "Box", "React", "Box", "useInput", "useInput", "React", "Box", "React", "useState", "Box", "Text", "useInput", "useState", "useInput", "React", "Box", "Text", "React", "useState", "Box", "Text", "useInput", "useState", "useInput", "React", "Box", "Text", "React", "useRef", "useState", "Box", "Text", "useInput", "useState", "useRef", "useInput", "React", "Box", "Text", "React", "Box", "Text", "useInput", "useInput", "React", "Box", "Text", "React", "React", "useMemo", "useState", "Box", "Text", "useInput", "figures", "useMemo", "useState", "name", "figures", "useInput", "React", "Box", "Text", "React", "React", "useState", "Box", "Text", "useInput", "useState", "useInput", "React", "Box", "Text", "useMemo", "React", "chalk", "React", "Box", "Text", "useInput", "useInput", "React", "Box", "Text", "React", "useMemo", "useState", "Box", "Text", "useInput", "figures", "chalk", "useState", "useMemo", "chalk", "useInput", "React", "Box", "Text", "figures", "React", "join", "Box", "Text", "useInput", "figures", "useInput", "name", "join", "React", "Text", "figures", "Box", "useState", "useCallback", "useEffect", "useMemo", "React", "Text", "chalk", "React", "memoize", "memoize", "command", "name", "resolve", "chalk", "React", "Box", "Text", "React", "Box", "Text", "command", "commandName", "userMessage", "resolve", "chalk", "Box", "useCallback", "useEffect", "useRef", "useState", "useState", "useRef", "useCallback", "newInput", "useEffect", "asRecord", "Box", "Text", "React", "React", "Box", "Text", "React", "Text", "React", "Box", "Text", "React", "Box", "Text", "Box", "Text", "React", "Box", "Text", "Box", "Text", "useCallback", "useState", "useState", "useCallback", "useCallback", "useCallback", "useEffect", "useState", "useMemo", "useCallback", "useInput", "Box", "Text", "React", "useEffect", "useMemo", "useRef", "useState", "CHARACTERS", "useMemo", "useState", "useRef", "useEffect", "React", "Box", "Text", "Box", "Text", "useInput", "React", "Text", "React", "url", "React", "Text", "useInput", "React", "Box", "Text", "React", "useCallback", "chalk", "Box", "Text", "useInput", "Link", "React", "useState", "Box", "React", "React", "Text", "React", "Text", "Box", "Text", "React", "Box", "Text", "React", "React", "Text", "Text", "useMemo", "asRecord", "type", "name", "useMemo", "React", "Box", "Text", "React", "React", "Box", "Text", "debug", "React", "Box", "Text", "Box", "Text", "React", "React", "Box", "Text", "Box", "Text", "React", "React", "Box", "Text", "Box", "Text", "React", "readFileSync", "relative", "resolve", "Box", "Text", "React", "relative", "Box", "Text", "relative", "resolve", "readFileSync", "Box", "Text", "relative", "patch", "Box", "Text", "React", "readFileSync", "extname", "isAbsolute", "relative", "resolve", "Box", "Text", "relative", "extname", "isAbsolute", "resolve", "readFileSync", "type", "Box", "React", "Box", "Box", "Text", "React", "Box", "Text", "React", "useEffect", "useRef", "React", "Box", "Text", "React", "Text", "React", "Text", "React", "Box", "Text", "React", "Box", "Text", "React", "useEffect", "useState", "useMemo", "Text", "useState", "useEffect", "config", "useMemo", "React", "Text", "asRecord", "debug", "React", "Box", "Text", "React", "React", "React", "Box", "Text", "Box", "Text", "debug", "React", "Text", "Box", "Box", "Text", "React", "Box", "Text", "Box", "Text", "React", "Box", "Text", "React", "Box", "Text", "React", "Box", "Text", "React", "React", "Box", "Text", "React", "Box", "Text", "React", "Box", "Text", "React", "Box", "Text", "debug", "Box", "asRecord", "type", "React", "Box", "debug", "getOptions", "chalk", "debug", "useState", "useInput", "React", "Box", "Text", "Link", "resolve", "debug", "useCallback", "React", "Box", "Text", "useInput", "React", "useMemo", "useState", "useEffect", "figures", "useMemo", "useEffect", "useState", "useInput", "Box", "Text", "figures", "debug", "Static", "Box", "Box", "React", "useCallback", "useEffect", "useMemo", "useRef", "useState", "useEffect", "useEffect", "useRef", "useRef", "useInput", "useCallback", "useCallback", "resolve", "description", "type", "useEffect", "useEffect", "Box", "React", "useMemo", "Box", "Text", "React", "useMemo", "Box", "useCallback", "useCallback", "resolve", "type", "useCallback", "useCallback", "outputStyle", "useCallback", "useCallback", "useCallback", "useCallback", "debug", "useState", "useCallback", "useRef", "useEffect", "useMemo", "Box", "React", "Box", "Text", "tag", "name", "React", "Box", "Text", "randomUUID", "debug", "randomUUID", "render", "React"]
7
+ }