@shareai-lab/kode 2.1.7 → 2.1.8

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 (167) hide show
  1. package/dist/chunks/{Doctor-3L35GQEA.js → Doctor-EGKBZIML.js} +9 -9
  2. package/dist/chunks/{LogList-JRBIMZK3.js → LogList-GDNOSBDQ.js} +7 -7
  3. package/dist/chunks/{REPL-Z7OH54ZY.js → REPL-6K3HERPA.js} +36 -36
  4. package/dist/chunks/{ResumeConversation-FBJEGMQU.js → ResumeConversation-YHP7BVER.js} +38 -38
  5. package/dist/chunks/{agentLoader-5P4SDNYY.js → agentLoader-DL3TATCS.js} +5 -5
  6. package/dist/chunks/{agentsValidate-MIUUPRQH.js → agentsValidate-CRBB7MRN.js} +6 -6
  7. package/dist/chunks/{ask-OTK6JY6Y.js → ask-VCIR7UL2.js} +16 -16
  8. package/dist/chunks/{autoUpdater-KLQX5DHG.js → autoUpdater-CEH5ETUW.js} +4 -4
  9. package/dist/chunks/{chunk-6GWQEETK.js → chunk-2T4Q7LE2.js} +4 -4
  10. package/dist/chunks/{chunk-YVPUEUBP.js → chunk-37WA4WY2.js} +2 -2
  11. package/dist/chunks/{chunk-S2XSG5L7.js → chunk-3F4IGSES.js} +1 -1
  12. package/dist/chunks/{chunk-HZHMIZGJ.js → chunk-4YSVR4M5.js} +2 -2
  13. package/dist/chunks/{chunk-NCTAWXV7.js → chunk-5PWMLLZZ.js} +1 -1
  14. package/dist/chunks/{chunk-C7NZLWIA.js → chunk-7FUCXSBS.js} +1 -1
  15. package/dist/chunks/{chunk-5CWBMOLZ.js → chunk-7NNQSSSB.js} +4 -4
  16. package/dist/chunks/{chunk-UOCIKFUW.js → chunk-AJQ2UPE4.js} +4 -4
  17. package/dist/chunks/{chunk-T3SKZPKI.js → chunk-AQTMF2G6.js} +3 -3
  18. package/dist/chunks/{chunk-K5RJXSIY.js → chunk-BIUJ2KCG.js} +3 -3
  19. package/dist/chunks/{chunk-JZ6TDDXP.js → chunk-BUPSIQAQ.js} +1 -1
  20. package/dist/chunks/{chunk-3C435W3Q.js → chunk-D34CKHL4.js} +19 -19
  21. package/dist/chunks/{chunk-7XYEUUGY.js → chunk-DIBHCLFW.js} +1 -1
  22. package/dist/chunks/{chunk-L3G2KW3R.js → chunk-EGWOQ5JS.js} +3 -3
  23. package/dist/chunks/{chunk-VLC7N6VV.js → chunk-EWJ6VEH6.js} +1 -1
  24. package/dist/chunks/{chunk-Q5UM4EKB.js → chunk-FRYYGI6N.js} +1 -1
  25. package/dist/chunks/{chunk-QPVADKH4.js → chunk-HQWE3TGT.js} +2 -2
  26. package/dist/chunks/{chunk-2ZW3X7UO.js → chunk-HTIDBTYD.js} +7 -7
  27. package/dist/chunks/{chunk-P7DGVS3A.js → chunk-IRECSUZZ.js} +34 -32
  28. package/dist/chunks/chunk-IRECSUZZ.js.map +7 -0
  29. package/dist/chunks/{chunk-MIIJHURF.js → chunk-JFO7DT2K.js} +1 -1
  30. package/dist/chunks/{chunk-AIFYUWAJ.js → chunk-K2CWFG3O.js} +1 -1
  31. package/dist/chunks/{chunk-OHI43FZV.js → chunk-KBU26G53.js} +29 -29
  32. package/dist/chunks/{chunk-OHI43FZV.js.map → chunk-KBU26G53.js.map} +2 -2
  33. package/dist/chunks/{chunk-GAENNHAB.js → chunk-KD5LMP2A.js} +2 -2
  34. package/dist/chunks/{chunk-X3FNDZH3.js → chunk-LXPPZ433.js} +1 -1
  35. package/dist/chunks/{chunk-QMZROKLT.js → chunk-MKGO2NMQ.js} +2 -2
  36. package/dist/chunks/{chunk-IIU3EEO6.js → chunk-MN6E4VHJ.js} +1 -1
  37. package/dist/chunks/{chunk-NVIIGNRI.js → chunk-NJOTGF2H.js} +1 -1
  38. package/dist/chunks/{chunk-PHBGBKGF.js → chunk-NY3SPCJN.js} +1 -1
  39. package/dist/chunks/{chunk-2KPPALZS.js → chunk-OIZNJRB4.js} +12 -10
  40. package/dist/chunks/chunk-OIZNJRB4.js.map +7 -0
  41. package/dist/chunks/{chunk-NQXQWWU7.js → chunk-P22FIYOC.js} +5 -5
  42. package/dist/chunks/{chunk-MN7PCCBR.js → chunk-QIEQRWMR.js} +2 -2
  43. package/dist/chunks/{chunk-DEQKKV43.js → chunk-R3EPQ7RK.js} +2 -2
  44. package/dist/chunks/{chunk-I3BXG3L6.js → chunk-SI7L5UCG.js} +2 -2
  45. package/dist/chunks/{chunk-L2KQYYWQ.js → chunk-STFQ32ME.js} +10 -10
  46. package/dist/chunks/{chunk-NJQA5TMT.js → chunk-T6QB2CGD.js} +2 -2
  47. package/dist/chunks/{chunk-JQ4UWMEI.js → chunk-TE2DS54K.js} +3 -3
  48. package/dist/chunks/{chunk-RENQ7FKI.js → chunk-UT5S3MDX.js} +5 -5
  49. package/dist/chunks/{chunk-5X2WIGMG.js → chunk-XK73FTJT.js} +1 -1
  50. package/dist/chunks/{chunk-5X2WIGMG.js.map → chunk-XK73FTJT.js.map} +1 -1
  51. package/dist/chunks/{chunk-2UAFIDOG.js → chunk-XZLHIUJA.js} +2 -2
  52. package/dist/chunks/{chunk-STJ7IA4I.js → chunk-ZIW3FRN5.js} +4 -4
  53. package/dist/chunks/{client-CQTZ2TDK.js → client-GA7TIEHM.js} +5 -5
  54. package/dist/chunks/{customCommands-JX4IHR6N.js → customCommands-ZKVONPFU.js} +5 -5
  55. package/dist/chunks/{engine-5XVTLRCC.js → engine-Q3PEQEX6.js} +15 -15
  56. package/dist/chunks/{env-AC3HPJYK.js → env-BT27KPZA.js} +3 -3
  57. package/dist/chunks/{kodeAgentSessionLoad-OCDNJBDW.js → kodeAgentSessionLoad-HV2N3LBW.js} +3 -3
  58. package/dist/chunks/{kodeAgentSessionResume-MX2JYZWS.js → kodeAgentSessionResume-23AXP5CM.js} +3 -3
  59. package/dist/chunks/{kodeHooks-FG4H3PCA.js → kodeHooks-VJ3AO5R3.js} +4 -4
  60. package/dist/chunks/{llm-LWWXFYJV.js → llm-5CEO3S3M.js} +13 -13
  61. package/dist/chunks/{llmLazy-57BHTMWO.js → llmLazy-W7ZM4DSR.js} +1 -1
  62. package/dist/chunks/{mcpCli-ACYQDE2P.js → mcpCli-RW5XGGTL.js} +5 -5
  63. package/dist/chunks/{mentionProcessor-WGFUC4CO.js → mentionProcessor-PEDB5MT3.js} +6 -6
  64. package/dist/chunks/{model-C6XJELK3.js → model-AAFSAVXQ.js} +5 -5
  65. package/dist/chunks/{openai-YPCUNJV6.js → openai-JYNI7IAS.js} +5 -5
  66. package/dist/chunks/{permissions-R7ISL4FQ.js → permissions-HOZM2H7J.js} +6 -6
  67. package/dist/chunks/{pluginRuntime-O5S4YTHA.js → pluginRuntime-DHJU5L6L.js} +3 -3
  68. package/dist/chunks/{pluginValidation-UO7G2L6E.js → pluginValidation-4BT6JQYH.js} +7 -7
  69. package/dist/chunks/{registry-H6Z7RGKW.js → registry-NILWZGYM.js} +29 -29
  70. package/dist/chunks/{ripgrep-ZQQGUPQG.js → ripgrep-U7RJNDR2.js} +4 -4
  71. package/dist/chunks/{runNonTextPrintMode-3C22ZQVQ.js → runNonTextPrintMode-JZ4OJJHG.js} +9 -9
  72. package/dist/chunks/{server-4XRF6KBY.js → server-ME5EMD43.js} +25 -25
  73. package/dist/chunks/{server-JEVQGAGS.js → server-YAYUUCYM.js} +27 -27
  74. package/dist/chunks/{skillMarketplace-DY2BV5DL.js → skillMarketplace-RIL7L56S.js} +4 -4
  75. package/dist/chunks/{src-KGXLCQ5T.js → src-7GM23W7O.js} +70 -70
  76. package/dist/chunks/{src-CE25ME6Y.js → src-GW44D7T3.js} +27 -27
  77. package/dist/chunks/{src-WIIICKMW.js → src-QBZN7LKA.js} +24 -24
  78. package/dist/chunks/{thinking-4KNMONEN.js → thinking-37PAW3YD.js} +6 -6
  79. package/dist/chunks/{toolPermissionSettings-EX3GBT7L.js → toolPermissionSettings-QACTQRWS.js} +4 -4
  80. package/dist/chunks/{webOnlyMode-RKACEWYY.js → webOnlyMode-2HLMSPA2.js} +1 -1
  81. package/dist/entrypoints/cli.js +1 -1
  82. package/dist/entrypoints/daemon.js +1 -1
  83. package/dist/entrypoints/mcp.js +25 -25
  84. package/dist/index.js +5 -5
  85. package/dist/sdk/core.cjs +1 -1
  86. package/dist/sdk/core.cjs.map +1 -1
  87. package/dist/sdk/core.js +1 -1
  88. package/dist/sdk/core.js.map +1 -1
  89. package/dist/sdk/tools.cjs +8 -4
  90. package/dist/sdk/tools.cjs.map +2 -2
  91. package/dist/sdk/tools.js +8 -4
  92. package/dist/sdk/tools.js.map +2 -2
  93. package/package.json +1 -1
  94. package/dist/chunks/chunk-2KPPALZS.js.map +0 -7
  95. package/dist/chunks/chunk-P7DGVS3A.js.map +0 -7
  96. /package/dist/chunks/{Doctor-3L35GQEA.js.map → Doctor-EGKBZIML.js.map} +0 -0
  97. /package/dist/chunks/{LogList-JRBIMZK3.js.map → LogList-GDNOSBDQ.js.map} +0 -0
  98. /package/dist/chunks/{REPL-Z7OH54ZY.js.map → REPL-6K3HERPA.js.map} +0 -0
  99. /package/dist/chunks/{ResumeConversation-FBJEGMQU.js.map → ResumeConversation-YHP7BVER.js.map} +0 -0
  100. /package/dist/chunks/{agentLoader-5P4SDNYY.js.map → agentLoader-DL3TATCS.js.map} +0 -0
  101. /package/dist/chunks/{agentsValidate-MIUUPRQH.js.map → agentsValidate-CRBB7MRN.js.map} +0 -0
  102. /package/dist/chunks/{ask-OTK6JY6Y.js.map → ask-VCIR7UL2.js.map} +0 -0
  103. /package/dist/chunks/{autoUpdater-KLQX5DHG.js.map → autoUpdater-CEH5ETUW.js.map} +0 -0
  104. /package/dist/chunks/{chunk-6GWQEETK.js.map → chunk-2T4Q7LE2.js.map} +0 -0
  105. /package/dist/chunks/{chunk-YVPUEUBP.js.map → chunk-37WA4WY2.js.map} +0 -0
  106. /package/dist/chunks/{chunk-S2XSG5L7.js.map → chunk-3F4IGSES.js.map} +0 -0
  107. /package/dist/chunks/{chunk-HZHMIZGJ.js.map → chunk-4YSVR4M5.js.map} +0 -0
  108. /package/dist/chunks/{chunk-NCTAWXV7.js.map → chunk-5PWMLLZZ.js.map} +0 -0
  109. /package/dist/chunks/{chunk-C7NZLWIA.js.map → chunk-7FUCXSBS.js.map} +0 -0
  110. /package/dist/chunks/{chunk-5CWBMOLZ.js.map → chunk-7NNQSSSB.js.map} +0 -0
  111. /package/dist/chunks/{chunk-UOCIKFUW.js.map → chunk-AJQ2UPE4.js.map} +0 -0
  112. /package/dist/chunks/{chunk-T3SKZPKI.js.map → chunk-AQTMF2G6.js.map} +0 -0
  113. /package/dist/chunks/{chunk-K5RJXSIY.js.map → chunk-BIUJ2KCG.js.map} +0 -0
  114. /package/dist/chunks/{chunk-JZ6TDDXP.js.map → chunk-BUPSIQAQ.js.map} +0 -0
  115. /package/dist/chunks/{chunk-3C435W3Q.js.map → chunk-D34CKHL4.js.map} +0 -0
  116. /package/dist/chunks/{chunk-7XYEUUGY.js.map → chunk-DIBHCLFW.js.map} +0 -0
  117. /package/dist/chunks/{chunk-L3G2KW3R.js.map → chunk-EGWOQ5JS.js.map} +0 -0
  118. /package/dist/chunks/{chunk-VLC7N6VV.js.map → chunk-EWJ6VEH6.js.map} +0 -0
  119. /package/dist/chunks/{chunk-Q5UM4EKB.js.map → chunk-FRYYGI6N.js.map} +0 -0
  120. /package/dist/chunks/{chunk-QPVADKH4.js.map → chunk-HQWE3TGT.js.map} +0 -0
  121. /package/dist/chunks/{chunk-2ZW3X7UO.js.map → chunk-HTIDBTYD.js.map} +0 -0
  122. /package/dist/chunks/{chunk-MIIJHURF.js.map → chunk-JFO7DT2K.js.map} +0 -0
  123. /package/dist/chunks/{chunk-AIFYUWAJ.js.map → chunk-K2CWFG3O.js.map} +0 -0
  124. /package/dist/chunks/{chunk-GAENNHAB.js.map → chunk-KD5LMP2A.js.map} +0 -0
  125. /package/dist/chunks/{chunk-X3FNDZH3.js.map → chunk-LXPPZ433.js.map} +0 -0
  126. /package/dist/chunks/{chunk-QMZROKLT.js.map → chunk-MKGO2NMQ.js.map} +0 -0
  127. /package/dist/chunks/{chunk-IIU3EEO6.js.map → chunk-MN6E4VHJ.js.map} +0 -0
  128. /package/dist/chunks/{chunk-NVIIGNRI.js.map → chunk-NJOTGF2H.js.map} +0 -0
  129. /package/dist/chunks/{chunk-PHBGBKGF.js.map → chunk-NY3SPCJN.js.map} +0 -0
  130. /package/dist/chunks/{chunk-NQXQWWU7.js.map → chunk-P22FIYOC.js.map} +0 -0
  131. /package/dist/chunks/{chunk-MN7PCCBR.js.map → chunk-QIEQRWMR.js.map} +0 -0
  132. /package/dist/chunks/{chunk-DEQKKV43.js.map → chunk-R3EPQ7RK.js.map} +0 -0
  133. /package/dist/chunks/{chunk-I3BXG3L6.js.map → chunk-SI7L5UCG.js.map} +0 -0
  134. /package/dist/chunks/{chunk-L2KQYYWQ.js.map → chunk-STFQ32ME.js.map} +0 -0
  135. /package/dist/chunks/{chunk-NJQA5TMT.js.map → chunk-T6QB2CGD.js.map} +0 -0
  136. /package/dist/chunks/{chunk-JQ4UWMEI.js.map → chunk-TE2DS54K.js.map} +0 -0
  137. /package/dist/chunks/{chunk-RENQ7FKI.js.map → chunk-UT5S3MDX.js.map} +0 -0
  138. /package/dist/chunks/{chunk-2UAFIDOG.js.map → chunk-XZLHIUJA.js.map} +0 -0
  139. /package/dist/chunks/{chunk-STJ7IA4I.js.map → chunk-ZIW3FRN5.js.map} +0 -0
  140. /package/dist/chunks/{client-CQTZ2TDK.js.map → client-GA7TIEHM.js.map} +0 -0
  141. /package/dist/chunks/{customCommands-JX4IHR6N.js.map → customCommands-ZKVONPFU.js.map} +0 -0
  142. /package/dist/chunks/{engine-5XVTLRCC.js.map → engine-Q3PEQEX6.js.map} +0 -0
  143. /package/dist/chunks/{env-AC3HPJYK.js.map → env-BT27KPZA.js.map} +0 -0
  144. /package/dist/chunks/{kodeAgentSessionLoad-OCDNJBDW.js.map → kodeAgentSessionLoad-HV2N3LBW.js.map} +0 -0
  145. /package/dist/chunks/{kodeAgentSessionResume-MX2JYZWS.js.map → kodeAgentSessionResume-23AXP5CM.js.map} +0 -0
  146. /package/dist/chunks/{kodeHooks-FG4H3PCA.js.map → kodeHooks-VJ3AO5R3.js.map} +0 -0
  147. /package/dist/chunks/{llm-LWWXFYJV.js.map → llm-5CEO3S3M.js.map} +0 -0
  148. /package/dist/chunks/{llmLazy-57BHTMWO.js.map → llmLazy-W7ZM4DSR.js.map} +0 -0
  149. /package/dist/chunks/{mcpCli-ACYQDE2P.js.map → mcpCli-RW5XGGTL.js.map} +0 -0
  150. /package/dist/chunks/{mentionProcessor-WGFUC4CO.js.map → mentionProcessor-PEDB5MT3.js.map} +0 -0
  151. /package/dist/chunks/{model-C6XJELK3.js.map → model-AAFSAVXQ.js.map} +0 -0
  152. /package/dist/chunks/{openai-YPCUNJV6.js.map → openai-JYNI7IAS.js.map} +0 -0
  153. /package/dist/chunks/{permissions-R7ISL4FQ.js.map → permissions-HOZM2H7J.js.map} +0 -0
  154. /package/dist/chunks/{pluginRuntime-O5S4YTHA.js.map → pluginRuntime-DHJU5L6L.js.map} +0 -0
  155. /package/dist/chunks/{pluginValidation-UO7G2L6E.js.map → pluginValidation-4BT6JQYH.js.map} +0 -0
  156. /package/dist/chunks/{registry-H6Z7RGKW.js.map → registry-NILWZGYM.js.map} +0 -0
  157. /package/dist/chunks/{ripgrep-ZQQGUPQG.js.map → ripgrep-U7RJNDR2.js.map} +0 -0
  158. /package/dist/chunks/{runNonTextPrintMode-3C22ZQVQ.js.map → runNonTextPrintMode-JZ4OJJHG.js.map} +0 -0
  159. /package/dist/chunks/{server-4XRF6KBY.js.map → server-ME5EMD43.js.map} +0 -0
  160. /package/dist/chunks/{server-JEVQGAGS.js.map → server-YAYUUCYM.js.map} +0 -0
  161. /package/dist/chunks/{skillMarketplace-DY2BV5DL.js.map → skillMarketplace-RIL7L56S.js.map} +0 -0
  162. /package/dist/chunks/{src-KGXLCQ5T.js.map → src-7GM23W7O.js.map} +0 -0
  163. /package/dist/chunks/{src-CE25ME6Y.js.map → src-GW44D7T3.js.map} +0 -0
  164. /package/dist/chunks/{src-WIIICKMW.js.map → src-QBZN7LKA.js.map} +0 -0
  165. /package/dist/chunks/{thinking-4KNMONEN.js.map → thinking-37PAW3YD.js.map} +0 -0
  166. /package/dist/chunks/{toolPermissionSettings-EX3GBT7L.js.map → toolPermissionSettings-QACTQRWS.js.map} +0 -0
  167. /package/dist/chunks/{webOnlyMode-RKACEWYY.js.map → webOnlyMode-2HLMSPA2.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../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", "../../apps/cli/src/ui/utils/permissionModeCycleShortcut.ts", "../../apps/cli/src/ui/contexts/PermissionContext.tsx", "../../apps/cli/src/ui/contexts/permissionModeSideEffects.ts", "../../apps/cli/src/ui/components/permissions/PermissionRequestDetails.tsx", "../../apps/cli/src/ui/components/permissions/liveToolPermissionContext.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", "../../apps/cli/src/ui/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.tsx", "../../apps/cli/src/ui/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.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/ExitPlanModePermissionRequest.tsx", "../../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/utils.ts", "../../apps/cli/src/ui/components/permissions/AskUserQuestionPermissionRequest/useAskUserQuestionKeyboard.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/hooks/useUndoBuffer.ts", "../../apps/cli/src/ui/utils/promptInputSpecialKey.ts", "../../packages/core/src/utils/contextWindowPercentages.ts", "../../packages/core/src/utils/hashCommand.ts", "../../apps/cli/src/ui/utils/processUserInput.tsx", "../../apps/cli/src/ui/components/messages/UserBashInputMessage.tsx", "../../apps/cli/src/ui/components/messages/UserBackgroundTaskInputMessage.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/types.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/PendingPrompts.tsx", "../../apps/cli/src/ui/components/PromptInput/QueuedPrompts.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", "../../packages/core/src/utils/array.ts", "../../apps/cli/src/ui/toolPresenters/FileWriteToolPresenter.tsx", "../../apps/cli/src/ui/components/HighlightedCode.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/AssistantBackgroundTaskOutputMessage.tsx", "../../apps/cli/src/ui/components/messages/AssistantLocalCommandOutputMessage.tsx", "../../apps/cli/src/ui/contexts/TransientViewportContext.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/hooks/useFlickerDetector.ts", "../../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/overlays/ShortcutsScreen.tsx", "../../apps/cli/src/ui/screens/overlays/CommandPaletteScreen.tsx", "../../apps/cli/src/ui/screens/overlays/HistorySearchScreen.tsx", "../../apps/cli/src/ui/screens/overlays/ModelPickerScreen.tsx", "../../apps/cli/src/ui/screens/overlays/ThinkingToggleScreen.tsx", "../../apps/cli/src/ui/screens/REPL/useTranscriptItems.tsx", "../../apps/cli/src/ui/components/MessageResponse.tsx", "../../apps/cli/src/utils/markdownSplit.ts", "../../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"],
4
- "sourcesContent": ["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, Static, Text, type DOMElement, measureElement } from 'ink'\nimport * as React from 'react'\nimport {\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport type { ReactNode } from 'react'\n\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/contexts/PermissionContext'\nimport { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\nimport { useFlickerDetector } from '#ui-ink/hooks/useFlickerDetector'\nimport type { NormalizedMessage } 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'\nimport { TransientViewportProvider } from '#ui-ink/contexts/TransientViewportContext'\n\nconst VIEWPORT_SAFE_MARGIN_ROWS = 1\nconst MEASURE_DEBOUNCE_MS = 400\n\nexport function REPLView({\n conversationKey,\n safeMode,\n debug,\n forkNumber,\n staticItems,\n transientItems,\n toolJSX,\n toolUseConfirm,\n setToolUseConfirm,\n toast,\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: {\n jsx: ReactNode | null\n shouldHidePromptInput: boolean\n displayMode?: 'inline' | 'fullscreen'\n } | null\n toolUseConfirm: ToolUseConfirm | null\n setToolUseConfirm: (confirm: ToolUseConfirm | null) => void\n toast: string | null\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 const rootUiRef = useRef<DOMElement | null>(null)\n const mainControlsRef = useRef<DOMElement | null>(null)\n const messageSelectorRef = useRef<DOMElement | null>(null)\n const lastMeasureKeyRef = useRef('')\n const lastMeasureAtRef = useRef(0)\n const { rows, columns } = useTerminalSize()\n useFlickerDetector(\n rootUiRef,\n rows,\n debug || Boolean(process.env.KODE_DEBUG_FLICKER),\n )\n\n const isFullScreenToolView = toolJSX?.displayMode === 'fullscreen'\n const hasToolJSX = Boolean(toolJSX)\n const hasToolUseConfirm = Boolean(toolUseConfirm)\n const hasBinaryFeedback = Boolean(binaryFeedbackContext)\n const hasToast = Boolean(toast)\n\n const [mainControlsHeight, setMainControlsHeight] = useState(0)\n const [messageSelectorHeight, setMessageSelectorHeight] = useState(0)\n\n useLayoutEffect(() => {\n if (rows <= 0 || columns <= 0) return\n const measureKey = [\n rows,\n columns,\n isMessageSelectorVisible ? 1 : 0,\n isFullScreenToolView ? 1 : 0,\n hasToolJSX ? 1 : 0,\n hasToolUseConfirm ? 1 : 0,\n hasBinaryFeedback ? 1 : 0,\n showingCostDialog ? 1 : 0,\n shouldShowPromptInput ? 1 : 0,\n hasToast ? 1 : 0,\n isLoading ? 1 : 0,\n messageSelectorMessages.length,\n ].join(':')\n\n const now = Date.now()\n if (\n measureKey === lastMeasureKeyRef.current &&\n now - lastMeasureAtRef.current < 200\n ) {\n return\n }\n\n lastMeasureKeyRef.current = measureKey\n lastMeasureAtRef.current = now\n\n if (mainControlsRef.current) {\n const measured = measureElement(mainControlsRef.current).height\n setMainControlsHeight(prev => (prev === measured ? prev : measured))\n } else {\n setMainControlsHeight(prev => (prev === 0 ? prev : 0))\n }\n\n if (messageSelectorRef.current) {\n const measured = measureElement(messageSelectorRef.current).height\n setMessageSelectorHeight(prev => (prev === measured ? prev : measured))\n } else {\n setMessageSelectorHeight(prev => (prev === 0 ? prev : 0))\n }\n }, [\n rows,\n columns,\n isMessageSelectorVisible,\n isFullScreenToolView,\n hasToolJSX,\n hasToolUseConfirm,\n hasBinaryFeedback,\n showingCostDialog,\n shouldShowPromptInput,\n hasToast,\n isLoading,\n messageSelectorMessages.length,\n ])\n\n const transientMaxHeight = Math.max(\n 1,\n rows -\n mainControlsHeight -\n messageSelectorHeight -\n VIEWPORT_SAFE_MARGIN_ROWS,\n )\n const transientViewportValue = useMemo(\n () => ({ maxHeight: transientMaxHeight }),\n [transientMaxHeight],\n )\n\n return (\n <TransientViewportProvider value={transientViewportValue}>\n <PermissionProvider\n conversationKey={conversationKey}\n isBypassPermissionsModeAvailable={!safeMode}\n >\n {isFullScreenToolView && toolJSX ? (\n <Box ref={rootUiRef} flexDirection=\"column\" width=\"100%\">\n {toolJSX.jsx}\n </Box>\n ) : (\n <Box ref={rootUiRef} flexDirection=\"column\" width=\"100%\">\n <Static key={`static-${forkNumber}`} items={staticItems}>\n {(item: TranscriptItem) => item.jsx}\n </Static>\n\n <Box flexDirection=\"column\" width=\"100%\">\n {transientItems.map(item => item.jsx)}\n {/* Status indicator at bottom of messages, above controls */}\n {!toolJSX &&\n !toolUseConfirm &&\n !binaryFeedbackContext &&\n isLoading && <RequestStatusIndicator />}\n </Box>\n\n <Box\n ref={mainControlsRef}\n borderColor=\"red\"\n borderStyle={debug ? 'single' : undefined}\n flexDirection=\"column\"\n width=\"100%\"\n >\n {toast &&\n !toolUseConfirm &&\n !toolJSX &&\n !binaryFeedbackContext && (\n <Box paddingX={1} marginTop={1}>\n <Text color=\"yellow\" dimColor wrap=\"truncate-end\">\n {toast}\n </Text>\n </Box>\n )}\n\n {toolJSX ? toolJSX.jsx : null}\n\n {!toolJSX &&\n binaryFeedbackContext &&\n !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\n {!toolJSX &&\n toolUseConfirm &&\n !isMessageSelectorVisible &&\n !binaryFeedbackContext && (\n <PermissionRequest\n toolUseConfirm={toolUseConfirm}\n onDone={() => setToolUseConfirm(null)}\n verbose={verbose}\n />\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 && (\n <PromptInput\n key={`prompt-${conversationKey}`}\n {...promptInputProps}\n />\n )}\n </Box>\n\n {isMessageSelectorVisible && (\n <Box ref={messageSelectorRef} flexDirection=\"column\" width=\"100%\">\n <MessageSelector\n erroredToolUseIDs={erroredToolUseIDs}\n unresolvedToolUseIDs={unresolvedToolUseIDs}\n messages={messageSelectorMessages}\n onSelect={onMessageSelectorSelect}\n onEscape={onMessageSelectorEscape}\n tools={tools}\n />\n </Box>\n )}\n </Box>\n )}\n </PermissionProvider>\n </TransientViewportProvider>\n )\n}\n", "import * 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 { ExitPlanModeTool } from '#tools/tools/interaction/PlanModeTool/ExitPlanModeTool'\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'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\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 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 blockedPath?: string\n decisionReason?: string\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 and Esc (reject).\n useKeypress(\n (input, key) => {\n if (key.ctrl && input === 'c') {\n onDone()\n toolUseConfirm.onReject()\n return true\n }\n\n if (key.escape) {\n onDone()\n toolUseConfirm.onReject()\n return true\n }\n },\n // Let tool-specific permission UIs intercept Esc first (e.g. WebFetch logging).\n { priority: -10 },\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 } 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 { textColorForRiskScore } 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/contexts/PermissionContext'\nimport { isPathInWorkingDirectories } from '#core/utils/permissions/fileToolPermissionEngine'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\nimport { PermissionRequestDetails } from '#ui-ink/components/permissions/PermissionRequestDetails'\nimport { applyToolPermissionUpdatesToLiveToolUseContext } from '../liveToolPermissionContext'\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: 'Allow once',\n value: 'yes',\n },\n {\n label: `Deny 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 ? `Allow all edits during this session ${shortcutHint}`\n : `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 layout = useScreenLayout()\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 applyToolPermissionUpdatesToLiveToolUseContext({\n toolUseContext: toolUseConfirm.toolUseContext,\n updates: toolUseConfirm.suggestions ?? [],\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 useKeypress((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 marginTop={1} width=\"100%\">\n <ScreenFrame\n title=\"Edit file permission\"\n titleColor={textColorForRiskScore(toolUseConfirm.riskScore)}\n paddingX={layout.paddingX}\n paddingY={layout.tightLayout ? 0 : layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\" gap={layout.gap}>\n <PermissionRequestDetails toolUseConfirm={toolUseConfirm} />\n <FileEditToolDiff\n file_path={file_path}\n new_string={new_string}\n old_string={old_string}\n verbose={verbose}\n width={Math.max(10, columns - layout.paddingX * 2 - 2)}\n enableScrolling={true}\n />\n\n <Box flexDirection=\"column\">\n <Text>\n Allow this edit to <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\n <Text dimColor wrap=\"truncate-end\">\n Enter to confirm \u00B7 Esc to reject \u00B7 PgUp/PgDn scroll diff\n {hasSessionSuggestion\n ? ` \u00B7 ${modeCycleShortcut.displayText} allow session`\n : ''}\n </Text>\n </Box>\n </ScreenFrame>\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 { Box, Text } from 'ink'\nimport { getCwd } from '#core/utils/state'\nimport { relative } from 'path'\nimport { getPatch } from '#core/utils/diff'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\nimport { getWindowedList } from '#ui-ink/primitives/list/windowedList'\nimport { structuredDiffLines } from '#ui-ink/components/StructuredDiff'\nimport figures from 'figures'\n\ntype Props = {\n file_path: string\n new_string: string\n old_string: string\n verbose: boolean\n width: number\n enableScrolling?: boolean\n maxVisibleRows?: number\n}\n\nexport function FileEditToolDiff({\n file_path,\n new_string,\n old_string,\n verbose,\n width,\n enableScrolling = false,\n maxVisibleRows,\n}: Props): React.ReactNode {\n const { rows } = useTerminalSize()\n const safeWidth = Math.max(10, Math.floor(width))\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 const diffLines = useMemo(() => {\n const lines: React.ReactNode[] = []\n for (let i = 0; i < patch.length; i += 1) {\n const hunk = patch[i]\n if (!hunk) continue\n lines.push(\n ...structuredDiffLines({ patch: hunk, width: safeWidth, dim: false }),\n )\n if (i < patch.length - 1) {\n lines.push(\n <Text key={`ellipsis-${i}`} dimColor>\n ...\n </Text>,\n )\n }\n }\n return lines\n }, [patch, safeWidth])\n\n const totalRows =\n maxVisibleRows ?? Math.max(6, Math.min(14, Math.floor(rows * 0.35)))\n const [focusIndex, setFocusIndex] = React.useState(0)\n\n React.useEffect(() => {\n setFocusIndex(prev => {\n if (diffLines.length === 0) return 0\n return Math.max(0, Math.min(prev, diffLines.length - 1))\n })\n }, [diffLines.length])\n\n const window = useMemo(\n () =>\n getWindowedList({\n itemCount: diffLines.length,\n focusIndex,\n maxVisible: totalRows,\n indicatorRows: 2,\n }),\n [diffLines.length, focusIndex, totalRows],\n )\n\n useKeypress(\n (_input, key) => {\n if (!enableScrolling) return\n if (diffLines.length <= window.visibleCount) return\n\n if (key.pageUp) {\n setFocusIndex(prev => Math.max(0, prev - window.visibleCount))\n return true\n }\n if (key.pageDown) {\n setFocusIndex(prev =>\n Math.min(\n Math.max(0, diffLines.length - 1),\n prev + window.visibleCount,\n ),\n )\n return true\n }\n if (key.home) {\n setFocusIndex(0)\n return true\n }\n if (key.end) {\n setFocusIndex(Math.max(0, diffLines.length - 1))\n return true\n }\n },\n { isActive: enableScrolling },\n )\n\n const topIndicator = window.showUpIndicator ? `${figures.arrowUp} More` : ' '\n const bottomIndicator = window.showDownIndicator\n ? `${figures.arrowDown} More`\n : ' '\n\n return (\n <Box flexDirection=\"column\">\n <Text bold wrap=\"truncate-end\">\n {file_path}\n </Text>\n\n {enableScrolling ? (\n <Text dimColor wrap=\"truncate-end\">\n PgUp/PgDn scroll \u00B7 Home/End\n </Text>\n ) : null}\n\n <Box flexDirection=\"column\" width=\"100%\">\n <Text dimColor wrap=\"truncate-end\">\n {topIndicator}\n </Text>\n {diffLines.slice(window.start, window.end).map((line, idx) => (\n <Box key={`${window.start + idx}`}>{line}</Box>\n ))}\n <Text dimColor wrap=\"truncate-end\">\n {bottomIndicator}\n </Text>\n </Box>\n </Box>\n )\n}\n", "import semver from 'semver'\nimport type { Key } from '#ui-ink/hooks/useKeypress'\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 // Compatibility: on older Windows runtimes, Shift+Tab is unreliable in Ink.\n // In those cases, fall back to 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 useRef,\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 subscribeToolPermissionContextUpdates,\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 const permissionContextRef = useRef(permissionContext)\n useEffect(() => {\n permissionContextRef.current = permissionContext\n }, [permissionContext])\n\n const toolPermissionContextRef = useRef(toolPermissionContext)\n useEffect(() => {\n toolPermissionContextRef.current = toolPermissionContext\n }, [toolPermissionContext])\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 return subscribeToolPermissionContextUpdates(event => {\n if (event.conversationKey !== conversationKey) return\n\n setToolPermissionContext(event.context)\n\n const nextMode = event.context.mode\n setPermissionContext(prev => {\n if (prev.mode === nextMode) return prev\n const config = MODE_CONFIGS[nextMode]\n return {\n ...prev,\n mode: nextMode,\n allowedTools: config.allowedTools,\n restrictions: config.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 useEffect(() => {\n setActivePlanConversationKey(conversationKey)\n if (permissionContext.mode === 'plan') {\n enterPlanModeForConversationKey(conversationKey)\n }\n }, [conversationKey, permissionContext.mode])\n\n const cycleMode = useCallback(() => {\n const prev = permissionContextRef.current\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 toolPermissionContextRef.current = updatedToolPermissionContext\n setToolPermissionContext(updatedToolPermissionContext)\n\n const nextPermissionContext: IPermissionContext = {\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 permissionContextRef.current = nextPermissionContext\n setPermissionContext(nextPermissionContext)\n }, [conversationKey, isBypassPermissionsModeAvailable])\n\n const setMode = useCallback(\n (mode: PermissionMode) => {\n const prev = permissionContextRef.current\n if (prev.mode === mode) return\n\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 toolPermissionContextRef.current = updatedToolPermissionContext\n setToolPermissionContext(updatedToolPermissionContext)\n\n const nextPermissionContext: IPermissionContext = {\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 permissionContextRef.current = nextPermissionContext\n setPermissionContext(nextPermissionContext)\n },\n [conversationKey, isBypassPermissionsModeAvailable],\n )\n\n const applyToolPermissionUpdate = useCallback(\n (update: ToolPermissionContextUpdate) => {\n const previousToolCtx = toolPermissionContextRef.current\n const nextToolCtx = applyToolPermissionContextUpdate(\n previousToolCtx,\n update,\n )\n toolPermissionContextRef.current = nextToolCtx\n setToolPermissionContext(nextToolCtx)\n setToolPermissionContextForConversationKey({\n conversationKey,\n context: nextToolCtx,\n })\n\n if (update.type === 'setMode') {\n const prev = permissionContextRef.current\n if (prev.mode === update.mode) return\n\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 const nextPermissionContext: IPermissionContext = {\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 permissionContextRef.current = nextPermissionContext\n setPermissionContext(nextPermissionContext)\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", "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 React, { useMemo } from 'react'\nimport { Box, Text } from 'ink'\n\nimport type { ToolUseConfirm } from './PermissionRequest'\n\nfunction formatAgentLabel(agentId: string): string {\n if (agentId === 'main') return 'Agent: main'\n return `Agent: ${agentId}`\n}\n\nfunction formatModeLabel(mode: unknown): string | null {\n if (\n mode !== 'default' &&\n mode !== 'plan' &&\n mode !== 'acceptEdits' &&\n mode !== 'dontAsk' &&\n mode !== 'bypassPermissions'\n ) {\n return null\n }\n return `Mode: ${mode}`\n}\n\nexport function __buildPermissionRequestDetailsLinesForTests(\n toolUseConfirm: ToolUseConfirm,\n): string[] {\n const agentId =\n typeof toolUseConfirm.toolUseContext.agentId === 'string'\n ? toolUseConfirm.toolUseContext.agentId.trim()\n : ''\n\n const mode =\n toolUseConfirm.toolUseContext.options?.toolPermissionContext?.mode\n const modeLabel = formatModeLabel(mode)\n\n const headerParts: string[] = []\n if (agentId) headerParts.push(formatAgentLabel(agentId))\n if (modeLabel) headerParts.push(modeLabel)\n const header = headerParts.length > 0 ? headerParts.join(' \u00B7 ') : null\n\n const blockedPath =\n typeof toolUseConfirm.blockedPath === 'string'\n ? toolUseConfirm.blockedPath.trim()\n : ''\n const decisionReason =\n typeof toolUseConfirm.decisionReason === 'string'\n ? toolUseConfirm.decisionReason.trim()\n : ''\n\n const lines: string[] = []\n if (header) lines.push(header)\n if (decisionReason) lines.push(`Reason: ${decisionReason}`)\n if (blockedPath) lines.push(`Path: ${blockedPath}`)\n return lines\n}\n\nexport function PermissionRequestDetails({\n toolUseConfirm,\n}: {\n toolUseConfirm: ToolUseConfirm\n}): React.ReactNode {\n const lines = useMemo(\n () => __buildPermissionRequestDetailsLinesForTests(toolUseConfirm),\n [toolUseConfirm],\n )\n if (lines.length === 0) return null\n\n return (\n <Box flexDirection=\"column\">\n {lines.map((line, idx) => (\n <Text key={idx} dimColor wrap=\"truncate-end\">\n {line}\n </Text>\n ))}\n </Box>\n )\n}\n", "import type { ToolUseContext } from '#core/tooling/Tool'\nimport type { ToolPermissionContextUpdate } from '#core/types/toolPermissionContext'\nimport {\n applyToolPermissionContextUpdate,\n createDefaultToolPermissionContext,\n type ToolPermissionContext,\n} from '#core/types/toolPermissionContext'\n\nexport function applyToolPermissionUpdatesToLiveToolUseContext(args: {\n toolUseContext: ToolUseContext\n updates: ToolPermissionContextUpdate[]\n}): ToolPermissionContext | null {\n if (args.updates.length === 0) return null\n\n const toolUseContext = args.toolUseContext\n toolUseContext.options ??= {}\n\n const safeMode = toolUseContext.options.safeMode === true\n let next =\n toolUseContext.options.toolPermissionContext ??\n createDefaultToolPermissionContext({\n isBypassPermissionsModeAvailable: !safeMode,\n })\n\n for (const update of args.updates) {\n next = applyToolPermissionContextUpdate(next, update)\n }\n\n toolUseContext.options.toolPermissionContext = next\n return next\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 { textColorForRiskScore } 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'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\nimport { PermissionRequestDetails } from '#ui-ink/components/permissions/PermissionRequestDetails'\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 const layout = useScreenLayout()\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 marginTop={1} width=\"100%\">\n <ScreenFrame\n title=\"Bash command permission\"\n titleColor={textColorForRiskScore(toolUseConfirm.riskScore)}\n paddingX={layout.paddingX}\n paddingY={layout.tightLayout ? 0 : layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Box flexDirection=\"column\">\n <Text wrap=\"truncate-end\">\n {BashTool.renderToolUseMessage({\n command,\n run_in_background,\n description,\n })}\n </Text>\n <Text dimColor wrap=\"truncate-end\">\n {toolUseConfirm.description}\n </Text>\n <PermissionRequestDetails toolUseConfirm={toolUseConfirm} />\n </Box>\n\n <Box flexDirection=\"column\">\n <Text>Allow this command?</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\n <Text dimColor wrap=\"truncate-end\">\n Enter to confirm \u00B7 Esc to reject\n </Text>\n </Box>\n </ScreenFrame>\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: `Always allow 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: `Always allow this exact command in ${chalk.bold(getCwd())}`,\n value: 'yes-dont-ask-again-full',\n },\n ]\n }\n\n return [\n {\n label: 'Allow once',\n value: 'yes',\n },\n ...dontShowAgainOptions,\n {\n label: `Deny 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'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\nimport { PermissionRequestDetails } from './PermissionRequestDetails'\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 const layout = useScreenLayout()\n\n // NOTE: normalize \"(MCP)\" suffix for consistent display in the fallback UI.\n const originalUserFacingName =\n toolUseConfirm.tool.userFacingName?.() ||\n toolUseConfirm.tool.name ||\n 'Tool'\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 marginTop={1} width=\"100%\">\n <ScreenFrame\n title=\"Tool use permission\"\n titleColor={textColorForRiskScore(toolUseConfirm.riskScore)}\n paddingX={layout.paddingX}\n paddingY={layout.tightLayout ? 0 : layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Box flexDirection=\"column\">\n <Text wrap=\"truncate-end\">\n {userFacingName}(\n {toolUseConfirm.tool.renderToolUseMessage(\n toolUseConfirm.input as never,\n { verbose },\n )}\n )\n {originalUserFacingName.endsWith(' (MCP)') ? (\n <Text dimColor> (MCP)</Text>\n ) : (\n ''\n )}\n </Text>\n <Text dimColor wrap=\"truncate-end\">\n {toolUseConfirm.description}\n </Text>\n <PermissionRequestDetails toolUseConfirm={toolUseConfirm} />\n </Box>\n\n <Box flexDirection=\"column\">\n <Text>Allow this tool use?</Text>\n <Select\n options={[\n {\n label: 'Allow once',\n value: 'yes',\n },\n {\n label: `Always allow ${chalk.bold(userFacingName)} 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\n <Text dimColor wrap=\"truncate-end\">\n Enter to confirm \u00B7 Esc to reject\n </Text>\n </Box>\n </ScreenFrame>\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 () => clearInterval(timer)\n }, [message, timeout])\n}\n", "import { Box, Text } 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 { textColorForRiskScore } 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/contexts/PermissionContext'\nimport { isPathInWorkingDirectories } from '#core/utils/permissions/fileToolPermissionEngine'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\nimport { PermissionRequestDetails } from '#ui-ink/components/permissions/PermissionRequestDetails'\nimport { applyToolPermissionUpdatesToLiveToolUseContext } from '../liveToolPermissionContext'\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 layout = useScreenLayout()\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 ? `Allow all edits during this session ${shortcutHint}`\n : `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 applyToolPermissionUpdatesToLiveToolUseContext({\n toolUseContext: toolUseConfirm.toolUseContext,\n updates: toolUseConfirm.suggestions ?? [],\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 useKeypress((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 marginTop={1} width=\"100%\">\n <ScreenFrame\n title={`${fileExists ? 'Edit' : 'Create'} file permission`}\n titleColor={textColorForRiskScore(toolUseConfirm.riskScore)}\n paddingX={layout.paddingX}\n paddingY={layout.tightLayout ? 0 : layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\" gap={layout.gap}>\n <PermissionRequestDetails toolUseConfirm={toolUseConfirm} />\n <FileWriteToolDiff\n file_path={file_path}\n content={content}\n verbose={verbose}\n width={Math.max(10, columns - layout.paddingX * 2 - 2)}\n enableScrolling={true}\n />\n\n <Box flexDirection=\"column\">\n <Text>\n Allow {fileExists ? 'this edit to' : 'creating'}{' '}\n <Text bold>{basename(file_path)}</Text>?\n </Text>\n <Select\n options={[\n {\n label: 'Allow once',\n value: 'yes',\n },\n ...(hasSessionSuggestion\n ? [\n {\n label: sessionLabel,\n value: 'yes-session',\n },\n ]\n : []),\n {\n label: `Deny and provide instructions (${chalk.bold.hex(getTheme().warning)('esc')})`,\n value: 'no',\n },\n ]}\n onChange={handleChoice}\n />\n </Box>\n\n <Text dimColor wrap=\"truncate-end\">\n Enter to confirm \u00B7 Esc to reject \u00B7 PgUp/PgDn scroll preview\n {hasSessionSuggestion\n ? ` \u00B7 ${modeCycleShortcut.displayText} allow session`\n : ''}\n </Text>\n </Box>\n </ScreenFrame>\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 { Box, Text } from 'ink'\nimport { getCwd } from '#core/utils/state'\nimport { extname, relative } from 'path'\nimport { detectFileEncoding } from '#core/utils/file'\nimport { getPatch } from '#core/utils/diff'\nimport figures from 'figures'\nimport wrapAnsi from 'wrap-ansi'\nimport { highlight, supportsLanguage } from 'cli-highlight'\nimport { logError } from '#core/utils/log'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\nimport { getWindowedList } from '#ui-ink/primitives/list/windowedList'\nimport { structuredDiffLines } from '#ui-ink/components/StructuredDiff'\n\ntype Props = {\n file_path: string\n content: string\n verbose: boolean\n width: number\n enableScrolling?: boolean\n maxVisibleRows?: number\n}\n\nexport function FileWriteToolDiff({\n file_path,\n content,\n verbose,\n width,\n enableScrolling = false,\n maxVisibleRows,\n}: Props): React.ReactNode {\n const { rows } = useTerminalSize()\n const safeWidth = Math.max(10, Math.floor(width))\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 const language = extname(file_path).slice(1)\n const highlightedCode = useMemo(() => {\n try {\n if (supportsLanguage(language)) {\n return highlight(content || '(No content)', { language })\n }\n return highlight(content || '(No content)', { language: 'markdown' })\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(content || '(No content)', { language: 'markdown' })\n }\n return content || '(No content)'\n }\n }, [content, language])\n\n const previewLines = useMemo(() => {\n if (!hunks) {\n const wrapped = wrapAnsi(highlightedCode, safeWidth, {\n hard: true,\n trim: false,\n })\n return wrapped\n .split('\\n')\n .map((line, i) => <Text key={`code-${i}`}>{line}</Text>)\n }\n\n const lines: React.ReactNode[] = []\n for (let i = 0; i < hunks.length; i += 1) {\n const hunk = hunks[i]\n if (!hunk) continue\n lines.push(\n ...structuredDiffLines({ patch: hunk, width: safeWidth, dim: false }),\n )\n if (i < hunks.length - 1) {\n lines.push(\n <Text key={`ellipsis-${i}`} dimColor>\n ...\n </Text>,\n )\n }\n }\n return lines\n }, [highlightedCode, hunks, safeWidth])\n\n const totalRows =\n maxVisibleRows ?? Math.max(6, Math.min(14, Math.floor(rows * 0.35)))\n const [focusIndex, setFocusIndex] = React.useState(0)\n\n React.useEffect(() => {\n setFocusIndex(prev => {\n if (previewLines.length === 0) return 0\n return Math.max(0, Math.min(prev, previewLines.length - 1))\n })\n }, [previewLines.length])\n\n const window = useMemo(\n () =>\n getWindowedList({\n itemCount: previewLines.length,\n focusIndex,\n maxVisible: totalRows,\n indicatorRows: 2,\n }),\n [focusIndex, previewLines.length, totalRows],\n )\n\n useKeypress(\n (_input, key) => {\n if (!enableScrolling) return\n if (previewLines.length <= window.visibleCount) return\n\n if (key.pageUp) {\n setFocusIndex(prev => Math.max(0, prev - window.visibleCount))\n return true\n }\n if (key.pageDown) {\n setFocusIndex(prev =>\n Math.min(\n Math.max(0, previewLines.length - 1),\n prev + window.visibleCount,\n ),\n )\n return true\n }\n if (key.home) {\n setFocusIndex(0)\n return true\n }\n if (key.end) {\n setFocusIndex(Math.max(0, previewLines.length - 1))\n return true\n }\n },\n { isActive: enableScrolling },\n )\n\n const topIndicator = window.showUpIndicator ? `${figures.arrowUp} More` : ' '\n const bottomIndicator = window.showDownIndicator\n ? `${figures.arrowDown} More`\n : ' '\n\n return (\n <Box flexDirection=\"column\">\n <Text bold wrap=\"truncate-end\">\n {file_path}\n </Text>\n {enableScrolling ? (\n <Text dimColor wrap=\"truncate-end\">\n PgUp/PgDn scroll \u00B7 Home/End\n </Text>\n ) : null}\n <Box flexDirection=\"column\" width=\"100%\">\n <Text dimColor wrap=\"truncate-end\">\n {topIndicator}\n </Text>\n {previewLines.slice(window.start, window.end).map((line, idx) => (\n <Box key={`${window.start + idx}`}>{line}</Box>\n ))}\n <Text dimColor wrap=\"truncate-end\">\n {bottomIndicator}\n </Text>\n </Box>\n </Box>\n )\n}\n", "import { Box, Text } from 'ink'\nimport React, { useCallback, useMemo } from 'react'\nimport { Select } from '#ui-ink/components/CustomSelect/select'\nimport { getTheme } from '#core/utils/theme'\nimport { textColorForRiskScore } 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/contexts/PermissionContext'\nimport { isPathInWorkingDirectories } from '#core/utils/permissions/fileToolPermissionEngine'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\nimport { PermissionRequestDetails } from '#ui-ink/components/permissions/PermissionRequestDetails'\nimport { applyToolPermissionUpdatesToLiveToolUseContext } from '../liveToolPermissionContext'\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 ? 'Allow during this session'\n : `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 ? `Allow all edits during this session ${shortcutHint}`\n : `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 layout = useScreenLayout()\n const modeCycleShortcut = useMemo(() => getPermissionModeCycleShortcut(), [])\n const userFacingName =\n toolUseConfirm.tool.userFacingName?.() ||\n toolUseConfirm.tool.name ||\n 'Tool'\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 canQuickAllowSession =\n hasSessionSuggestion &&\n !toolUseConfirm.tool.isReadOnly(toolUseConfirm.input as never)\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 applyToolPermissionUpdatesToLiveToolUseContext({\n toolUseContext: toolUseConfirm.toolUseContext,\n updates: toolUseConfirm.suggestions ?? [],\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 useKeypress((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 marginTop={1} width=\"100%\">\n <ScreenFrame\n title={`${title} permission`}\n titleColor={textColorForRiskScore(toolUseConfirm.riskScore)}\n paddingX={layout.paddingX}\n paddingY={layout.tightLayout ? 0 : layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Box flexDirection=\"column\">\n <Text wrap=\"truncate-end\">\n {userFacingName}(\n {toolUseConfirm.tool.renderToolUseMessage(\n toolUseConfirm.input as never,\n { verbose },\n )}\n )\n </Text>\n <PermissionRequestDetails toolUseConfirm={toolUseConfirm} />\n </Box>\n\n <Box flexDirection=\"column\">\n <Text>Allow this action?</Text>\n <Select\n options={[\n {\n label: 'Allow once',\n value: 'yes',\n },\n ...getDontAskAgainOptions(\n toolUseConfirm,\n path,\n modeCycleShortcut.displayText,\n isInWorkingDir,\n hasSessionSuggestion,\n ),\n {\n label: `Deny and provide instructions (${chalk.bold.hex(getTheme().warning)('esc')})`,\n value: 'no',\n },\n ]}\n onChange={handleChoice}\n />\n </Box>\n\n <Text dimColor wrap=\"truncate-end\">\n Enter to confirm \u00B7 Esc to reject\n {canQuickAllowSession\n ? ` \u00B7 ${modeCycleShortcut.displayText} allow this session`\n : ''}\n </Text>\n </Box>\n </ScreenFrame>\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 { logUnaryEvent } from '#core/utils/unaryLogging'\nimport { env } from '#core/utils/env'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\nimport { PermissionRequestDetails } from '#ui-ink/components/permissions/PermissionRequestDetails'\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 layout = useScreenLayout()\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 marginTop={1} width=\"100%\">\n <ScreenFrame\n title=\"Slash command permission\"\n titleColor={theme.permission}\n paddingX={layout.paddingX}\n paddingY={layout.tightLayout ? 0 : layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Box flexDirection=\"column\">\n <Text wrap=\"truncate-end\">\n {toolUseConfirm.tool.userFacingName?.() || 'SlashCommand'}(\n {toolUseConfirm.tool.renderToolUseMessage(toolUseConfirm.input, {\n verbose,\n })}\n )\n </Text>\n <Text dimColor wrap=\"truncate-end\">\n {toolUseConfirm.description}\n </Text>\n <PermissionRequestDetails toolUseConfirm={toolUseConfirm} />\n </Box>\n\n <Box flexDirection=\"column\">\n <Text>Allow this command?</Text>\n <Select\n options={[\n { label: 'Allow once', value: 'yes' },\n {\n label: `Always allow ${chalk.bold(command)} in ${chalk.bold(getCwd())}`,\n value: 'yes-exact',\n },\n ...(showPrefixOption\n ? [\n {\n label: `Always allow ${chalk.bold(prefix + ':*')} in ${chalk.bold(getCwd())}`,\n value: 'yes-prefix',\n },\n ]\n : []),\n {\n label: `Deny 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\n <Text dimColor wrap=\"truncate-end\">\n Enter to confirm \u00B7 Esc to reject\n </Text>\n </Box>\n </ScreenFrame>\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 { logUnaryEvent } from '#core/utils/unaryLogging'\nimport { env } from '#core/utils/env'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\nimport { PermissionRequestDetails } from '#ui-ink/components/permissions/PermissionRequestDetails'\n\nexport function SkillPermissionRequest({\n toolUseConfirm,\n onDone,\n verbose,\n}: PermissionRequestProps): React.ReactNode {\n const theme = getTheme()\n const layout = useScreenLayout()\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 marginTop={1} width=\"100%\">\n <ScreenFrame\n title=\"Skill permission\"\n titleColor={theme.permission}\n paddingX={layout.paddingX}\n paddingY={layout.tightLayout ? 0 : layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Box flexDirection=\"column\">\n <Text wrap=\"truncate-end\">\n {toolUseConfirm.tool.userFacingName?.() || 'Skill'}(\n {toolUseConfirm.tool.renderToolUseMessage(toolUseConfirm.input, {\n verbose,\n })}\n )\n </Text>\n <Text dimColor wrap=\"truncate-end\">\n {toolUseConfirm.description}\n </Text>\n <PermissionRequestDetails toolUseConfirm={toolUseConfirm} />\n </Box>\n\n <Box flexDirection=\"column\">\n <Text>Allow this skill?</Text>\n <Select\n options={[\n { label: 'Allow once', value: 'yes' },\n {\n label: `Always allow ${chalk.bold(skill)} in ${chalk.bold(getCwd())}`,\n value: 'yes-exact',\n },\n {\n label: `Deny 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\n <Text dimColor wrap=\"truncate-end\">\n Enter to confirm \u00B7 Esc to reject\n </Text>\n </Box>\n </ScreenFrame>\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 { 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 { logUnaryEvent } from '#core/utils/unaryLogging'\nimport { env } from '#core/utils/env'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\nimport { PermissionRequestDetails } from '#ui-ink/components/permissions/PermissionRequestDetails'\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 layout = useScreenLayout()\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 useKeypress((_input, key) => {\n if (key.escape) {\n reject()\n return true\n }\n })\n\n return (\n <Box marginTop={1} width=\"100%\">\n <ScreenFrame\n title=\"Network permission\"\n titleColor={theme.permission}\n paddingX={layout.paddingX}\n paddingY={layout.tightLayout ? 0 : layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Box>\n <Text dimColor>Host:</Text>\n <Text wrap=\"truncate-end\"> {hostLabel}</Text>\n </Box>\n <PermissionRequestDetails toolUseConfirm={toolUseConfirm} />\n\n <Box flexDirection=\"column\">\n <Text>Do you want to allow this connection?</Text>\n <Select\n options={[\n { label: 'Allow once', value: 'yes' },\n ...(hostname\n ? [\n {\n label: `Always allow ${chalk.bold(hostname)}`,\n value: 'yes-dont-ask-again',\n },\n ]\n : []),\n {\n label: `Deny and provide instructions ${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\n <Text dimColor wrap=\"truncate-end\">\n Enter to confirm \u00B7 Esc to reject\n </Text>\n </Box>\n </ScreenFrame>\n </Box>\n )\n}\n", "import { Box, Text } from 'ink'\nimport React, { useEffect, useMemo, useState } from 'react'\nimport figures from 'figures'\nimport type { ToolUseConfirm } from '#ui-ink/components/permissions/PermissionRequest'\nimport { getTheme } from '#core/utils/theme'\nimport { usePermissionContext } from '#ui-ink/contexts/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'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\nimport { getWindowedList } from '#ui-ink/primitives/list/windowedList'\nimport { wrapLines } from '#ui-ink/primitives/text/wrapLines'\nimport { getPermissionModeCycleShortcut } from '#ui-ink/utils/permissionModeCycleShortcut'\nimport type { PermissionMode } from '#core/types/PermissionMode'\nimport { applyToolPermissionContextUpdateForConversationKey } from '#core/utils/toolPermissionContextState'\nimport { getMessagesSetter } from '#core/messages'\nimport { getContext } from '#core/context'\nimport { getCodeStyle } from '#core/utils/style'\nimport { resetReminderSession } from '#core/services/systemReminder'\nimport { resetFileFreshnessSession } from '#core/services/fileFreshness'\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\nfunction clearConversationContextForPlanExit(): void {\n getMessagesSetter()([])\n getContext.cache.clear?.()\n getCodeStyle.cache.clear?.()\n resetReminderSession()\n resetFileFreshnessSession()\n}\n\nexport function ExitPlanModePermissionRequest({\n toolUseConfirm,\n onDone,\n}: Props): React.ReactNode {\n const theme = getTheme()\n const layout = useScreenLayout()\n const { columns, rows } = useTerminalSize()\n const { setMode } = usePermissionContext()\n const modeCycleShortcut = useMemo(() => getPermissionModeCycleShortcut(), [])\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 [rejectDraft, setRejectDraft] = useState('')\n const [focusedOptionIndex, setFocusedOptionIndex] = useState(0)\n const [planFocusIndex, setPlanFocusIndex] = useState(0)\n\n useEffect(() => {\n if (!planSaved) return\n const timeout = setTimeout(() => setPlanSaved(false), 5000)\n return () => clearTimeout(timeout)\n }, [planSaved])\n\n const planViewportWidth = Math.max(20, columns - layout.paddingX * 2 - 2)\n const planLines = useMemo(\n () => wrapLines(planText.split('\\n'), planViewportWidth),\n [planText, planViewportWidth],\n )\n\n useEffect(() => {\n setPlanFocusIndex(prev => {\n if (planLines.length === 0) return 0\n return Math.max(0, Math.min(prev, planLines.length - 1))\n })\n }, [planLines.length])\n\n const planViewportRows = Math.max(6, Math.min(14, Math.floor(rows * 0.4)))\n const planWindow = useMemo(\n () =>\n getWindowedList({\n itemCount: planLines.length,\n focusIndex: planFocusIndex,\n maxVisible: planViewportRows,\n indicatorRows: 2,\n }),\n [planFocusIndex, planLines.length, planViewportRows],\n )\n\n const showExitWithoutPlan =\n planSource === 'file' && (!planExists || planText.trim().length === 0)\n\n const bypassAvailable =\n toolUseConfirm.toolUseContext.options?.safeMode !== true\n const options = useMemo(() => {\n return getExitPlanModeOptions({ bypassAvailable })\n }, [bypassAvailable])\n\n useEffect(() => {\n setFocusedOptionIndex(prev =>\n Math.max(0, Math.min(prev, options.length - 1)),\n )\n }, [options.length])\n\n useEffect(() => {\n if (!showExitWithoutPlan) return\n setFocusedOptionIndex(prev => Math.max(0, Math.min(prev, 1)))\n }, [showExitWithoutPlan])\n\n const applyPermissionMode = (nextMode: PermissionMode) => {\n const conversationKey = getPlanConversationKey(\n toolUseConfirm.toolUseContext,\n )\n const safeMode = toolUseConfirm.toolUseContext.options?.safeMode === true\n const updatedToolPermissionContext =\n applyToolPermissionContextUpdateForConversationKey({\n conversationKey,\n isBypassPermissionsModeAvailable: !safeMode,\n update: { type: 'setMode', mode: nextMode, destination: 'session' },\n })\n\n toolUseConfirm.toolUseContext.options ??= {}\n toolUseConfirm.toolUseContext.options.toolPermissionContext =\n updatedToolPermissionContext\n\n setMode(nextMode)\n }\n\n const handleApprove = (value: ExitPlanModeOptionValue) => {\n const clearContext =\n value !== 'yes-accept-edits-keep-context' &&\n value !== 'yes-default-keep-context'\n\n let nextMode: PermissionMode = 'default'\n switch (value) {\n case 'yes-bypass-permissions':\n nextMode = 'bypassPermissions'\n break\n case 'yes-accept-edits':\n nextMode = 'acceptEdits'\n break\n case 'yes-default':\n nextMode = 'default'\n break\n case 'yes-accept-edits-keep-context':\n nextMode = bypassAvailable ? 'bypassPermissions' : 'acceptEdits'\n break\n case 'yes-default-keep-context':\n nextMode = 'default'\n break\n case 'no':\n return\n default: {\n const neverValue: never = value\n throw new Error(`Unexpected ExitPlanMode option: ${String(neverValue)}`)\n }\n }\n\n applyPermissionMode(nextMode)\n\n if (clearContext) {\n clearConversationContextForPlanExit()\n }\n\n toolUseConfirm.onAllow('temporary')\n onDone()\n }\n\n useKeypress((input, key) => {\n if (key.escape) {\n toolUseConfirm.onReject()\n onDone()\n return true\n }\n\n if (showExitWithoutPlan) {\n if (key.upArrow) {\n setFocusedOptionIndex(0)\n return true\n }\n\n if (key.downArrow) {\n setFocusedOptionIndex(1)\n return true\n }\n\n if (key.return) {\n if (focusedOptionIndex === 0) {\n applyPermissionMode('default')\n toolUseConfirm.onAllow('temporary')\n onDone()\n return true\n }\n\n toolUseConfirm.onReject()\n onDone()\n return true\n }\n\n return\n }\n\n if (modeCycleShortcut.check(input, key)) {\n const quickValue: ExitPlanModeOptionValue = bypassAvailable\n ? 'yes-bypass-permissions'\n : 'yes-accept-edits'\n handleApprove(quickValue)\n return true\n }\n\n if (key.pageUp && !showExitWithoutPlan) {\n setPlanFocusIndex(prev => Math.max(0, prev - planWindow.visibleCount))\n return true\n }\n\n if (key.pageDown && !showExitWithoutPlan) {\n setPlanFocusIndex(prev =>\n Math.min(\n Math.max(0, planLines.length - 1),\n prev + planWindow.visibleCount,\n ),\n )\n return true\n }\n\n if (key.home && !showExitWithoutPlan) {\n setPlanFocusIndex(0)\n return true\n }\n\n if (key.end && !showExitWithoutPlan) {\n setPlanFocusIndex(Math.max(0, planLines.length - 1))\n return true\n }\n\n if (key.upArrow) {\n setFocusedOptionIndex(prev => Math.max(0, prev - 1))\n return true\n }\n\n if (key.downArrow) {\n setFocusedOptionIndex(prev => Math.min(options.length - 1, prev + 1))\n return true\n }\n\n const focusedOption = options[focusedOptionIndex]\n\n if (key.return) {\n if (focusedOption?.type === 'input') {\n const trimmed = rejectDraft.trim()\n if (!trimmed) return true\n toolUseConfirm.onReject(trimmed)\n onDone()\n return true\n }\n\n if (focusedOption && 'value' in focusedOption) {\n handleApprove(focusedOption.value)\n return true\n }\n }\n\n if (focusedOption?.type === 'input') {\n if (key.backspace || key.delete) {\n setRejectDraft(prev => prev.slice(0, -1))\n return true\n }\n\n if (key.paste || key.insertable) {\n if (input.length > 0) {\n setRejectDraft(prev => prev + input)\n }\n return true\n }\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 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 if (showExitWithoutPlan) {\n const yesIsFocused = focusedOptionIndex === 0\n const noIsFocused = focusedOptionIndex === 1\n\n return (\n <Box marginTop={1} width=\"100%\">\n <ScreenFrame\n title=\"Exit plan mode?\"\n titleColor={theme.planMode}\n paddingX={layout.paddingX}\n paddingY={layout.tightLayout ? 0 : layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Text>Agent wants to exit plan mode</Text>\n <Box flexDirection=\"column\">\n <Box paddingLeft={2} paddingRight={1}>\n {yesIsFocused ? (\n <Text color={theme.kode}>{figures.pointer}</Text>\n ) : null}\n <Text\n bold={yesIsFocused}\n color={yesIsFocused ? theme.kode : theme.text}\n >\n Yes\n </Text>\n </Box>\n <Box paddingLeft={2} paddingRight={1}>\n {noIsFocused ? (\n <Text color={theme.kode}>{figures.pointer}</Text>\n ) : null}\n <Text\n bold={noIsFocused}\n color={noIsFocused ? theme.kode : theme.text}\n >\n No\n </Text>\n </Box>\n </Box>\n <Text dimColor wrap=\"truncate-end\">\n Enter to confirm \u00B7 Esc to exit\n </Text>\n </Box>\n </ScreenFrame>\n </Box>\n )\n }\n\n const topIndicator = planWindow.showUpIndicator\n ? `${figures.arrowUp} More`\n : ' '\n const bottomIndicator = planWindow.showDownIndicator\n ? `${figures.arrowDown} More`\n : ' '\n\n return (\n <Box marginTop={1} width=\"100%\">\n <ScreenFrame\n title=\"Ready to code?\"\n titleColor={theme.planMode}\n paddingX={layout.paddingX}\n paddingY={layout.tightLayout ? 0 : layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Box flexDirection=\"column\">\n <Text dimColor wrap=\"truncate-end\">\n Plan preview \u00B7 PgUp/PgDn scroll\n </Text>\n <Box flexDirection=\"column\" width=\"100%\">\n <Text dimColor wrap=\"truncate-end\">\n {topIndicator}\n </Text>\n {planLines\n .slice(planWindow.start, planWindow.end)\n .map((line, idx) => (\n <Box key={`${planWindow.start + idx}`}>\n <Text wrap=\"truncate-end\">{line}</Text>\n </Box>\n ))}\n <Text dimColor wrap=\"truncate-end\">\n {bottomIndicator}\n </Text>\n </Box>\n </Box>\n\n <Text dimColor wrap=\"truncate-end\">\n Tip: Ctrl+G to edit{' '}\n {planSource === 'file' ? planFilePath : 'plan text'}\n {planSaved ? ' \u00B7 Plan saved!' : ''}\n </Text>\n\n <Box flexDirection=\"column\">\n <Text dimColor>Would you like to proceed?</Text>\n <Box flexDirection=\"column\">\n {options.map((option, idx) => {\n const isFocused = idx === focusedOptionIndex\n\n if (option.type === 'input') {\n const placeholder = option.placeholder\n const suffix =\n rejectDraft.length > 0 ? rejectDraft : placeholder\n const suffixColor =\n rejectDraft.length > 0 ? theme.text : theme.secondaryText\n\n return (\n <Box key={option.value} paddingLeft={2} paddingRight={1}>\n {isFocused ? (\n <Text color={theme.kode}>{figures.pointer}</Text>\n ) : null}\n <Text\n bold={isFocused}\n color={isFocused ? theme.kode : theme.text}\n wrap=\"truncate-end\"\n >\n {option.label}\n </Text>\n <Text dimColor> {figures.arrowRight} </Text>\n <Text color={suffixColor} wrap=\"truncate-end\">\n {suffix}\n </Text>\n </Box>\n )\n }\n\n return (\n <Box key={option.value} paddingLeft={2} paddingRight={1}>\n {isFocused ? (\n <Text color={theme.kode}>{figures.pointer}</Text>\n ) : null}\n <Text\n bold={isFocused}\n color={isFocused ? theme.kode : theme.text}\n wrap=\"truncate-end\"\n >\n {option.label}\n </Text>\n </Box>\n )\n })}\n </Box>\n </Box>\n\n <Text dimColor wrap=\"truncate-end\">\n Enter to confirm \u00B7 Esc to exit \u00B7 {modeCycleShortcut.displayText}{' '}\n quick select\n </Text>\n </Box>\n </ScreenFrame>\n </Box>\n )\n}\n", "export type ExitPlanModeOptionValue =\n | 'yes-bypass-permissions'\n | 'yes-accept-edits'\n | 'yes-default'\n | 'yes-accept-edits-keep-context'\n | 'yes-default-keep-context'\n | 'no'\n\nexport type ExitPlanModeOption =\n | {\n type?: 'option'\n label: string\n value: Exclude<ExitPlanModeOptionValue, 'no'>\n }\n | {\n type: 'input'\n label: string\n value: 'no'\n placeholder: string\n }\n\nexport function getExitPlanModeOptions(args: {\n bypassAvailable: boolean\n}): ExitPlanModeOption[] {\n const options: ExitPlanModeOption[] = []\n\n options.push(\n args.bypassAvailable\n ? {\n label: 'Yes, clear context and bypass permissions',\n value: 'yes-bypass-permissions',\n }\n : {\n label: 'Yes, clear context and auto-accept edits (shift+tab)',\n value: 'yes-accept-edits',\n },\n )\n options.push({\n label: 'Yes, and manually approve edits',\n value: 'yes-default',\n })\n\n options.push({\n label: args.bypassAvailable\n ? 'Yes, and bypass permissions'\n : 'Yes, auto-accept edits',\n value: 'yes-accept-edits-keep-context',\n })\n\n options.push({\n label: 'Yes, manually approve edits',\n value: 'yes-default-keep-context',\n })\n\n options.push({\n type: 'input',\n label: 'No, keep planning',\n value: 'no',\n placeholder: 'Type here to tell Kode Agent what to change',\n })\n\n return options\n}\n\nexport function __getExitPlanModeOptionsForTests(args: {\n bypassAvailable: boolean\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 }\n return {\n questions: (result.data.questions as Question[]) ?? [],\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 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 const toolUseId =\n toolUseConfirm.toolUseContext.toolUseId ??\n toolUseConfirm.toolUseContext.messageId\n const options = (toolUseConfirm.toolUseContext.options ??= {})\n if (toolUseId) {\n options.askUserQuestionAnswersByToolUseId ??= {}\n options.askUserQuestionAnswersByToolUseId[toolUseId] = nextAnswers\n } else {\n options.askUserQuestionAnswers = nextAnswers\n }\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>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 figures from 'figures'\nimport { getCachedStringWidth } from '#cli-utils/textWidth'\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 (getCachedStringWidth(label) <= maxWidth) return label\n\n let candidate = label\n while (\n candidate.length > 1 &&\n getCachedStringWidth(candidate + '\u2026') > maxWidth\n ) {\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 getCachedStringWidth('\u2190 ') +\n getCachedStringWidth(' \u2192') +\n getCachedStringWidth(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 + getCachedStringWidth(header),\n 0,\n )\n if (total <= available) return headers\n\n const currentHeader = headers[args.currentQuestionIndex] ?? ''\n const currentTabWidth = 4 + getCachedStringWidth(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 (getCachedStringWidth(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 type React from 'react'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\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 useKeypress((input, key) => {\n if (key.escape) {\n args.onCancel()\n return true\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 * as React from 'react'\nimport {\n memo,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} 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 { MACRO } from '#core/constants/macros'\nimport { getCwd, getOriginalCwd } from '#core/utils/state'\nimport { getMessagesPath } from '#core/utils/log'\nimport { getTotalAPIDuration, getTotalDuration } from '#core/cost-tracker'\nimport {\n getCurrentProjectConfig,\n getGlobalConfigCached,\n saveCurrentProjectConfig,\n} from '#core/utils/config'\nimport { usePermissionContext } from '#ui-ink/contexts/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 { useKeypress, type Key } from '#ui-ink/hooks/useKeypress'\nimport { useUndoBuffer } from '#ui-ink/hooks/useUndoBuffer'\nimport { KEYPRESS_PRIORITY } from '#ui-ink/constants/keypressPriority'\nimport { getPermissionModeCycleShortcut } from '#ui-ink/utils/permissionModeCycleShortcut'\nimport { getPromptInputSpecialKeyAction } from '#ui-ink/utils/promptInputSpecialKey'\nimport { setTerminalTitle } from '#cli-utils/terminal'\nimport { Cursor, countWrappedLines } from '#cli-utils/Cursor'\nimport { getCurrentOutputStyle } from '#cli-services/outputStyles'\nimport { BunShell } from '#runtime/shell'\nimport { listBackgroundAgentTaskSnapshots } from '#core/utils/backgroundTasks'\nimport { computeContextWindowPercentages } from '#core/utils/contextWindowPercentages'\nimport { submitPrompt } from './submit'\nimport {\n usePromptPastes,\n type PastedImageAttachment,\n type PastedTextSegment,\n} from './pastes'\nimport { toggleBashMode, type PromptInputProps, type PromptMode } from './types'\nimport { PromptInputView } from './PromptInputView'\nimport { useExternalEdit } from './useExternalEdit'\nimport { useQuickModelSwitch } from './useQuickModelSwitch'\nimport { getKodeAgentSessionId } from '#protocol/utils/kodeAgentSessionId'\n\nconst PROMPT_DRAFT_KEY = 'repl'\n\nfunction exit(): never {\n setTerminalTitle('')\n process.exit(0)\n}\n\nexport function PromptInput({\n commands,\n forkNumber,\n messageLogName,\n initialPrompt,\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 uiRefreshCounter,\n onShowMessageSelector,\n setForkConvoWithMessagesOnTheNextRender,\n readFileTimestamps,\n onModelChange,\n onManageTasks,\n restorePastes,\n onRestorePastesApplied,\n draftPastes,\n onDraftPastesChange,\n}: PromptInputProps): React.ReactNode {\n type QueuedPrompt = {\n seq: number\n input: string\n mode: PromptMode\n pastedTexts: PastedTextSegment[]\n pastedImages: PastedImageAttachment[]\n }\n\n type PromptStash = {\n input: string\n mode: PromptMode\n cursorOffset: number\n pastedTexts: PastedTextSegment[]\n pastedImages: PastedImageAttachment[]\n }\n\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 [clearInputPending, setClearInputPending] = useState(false)\n const [rewindPending, setRewindPending] = 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 const [queuedPrompts, setQueuedPrompts] = useState<QueuedPrompt[]>([])\n const [pendingPrompts, setPendingPrompts] = useState<QueuedPrompt[]>([])\n const nextQueuedPromptSeqRef = useRef(0)\n const [promptStash, setPromptStash] = useState<PromptStash | null>(null)\n const onHistoryUserInputRef = useRef<() => void>(() => {})\n const editorMode = getGlobalConfigCached().editorMode ?? 'normal'\n const [vimMode, setVimMode] = useState<'INSERT' | 'NORMAL'>('INSERT')\n\n useEffect(() => {\n if (editorMode !== 'vim') return\n setVimMode('INSERT')\n }, [editorMode])\n\n const { cycleMode, currentMode, toolPermissionContext } =\n usePermissionContext()\n const modeCycleShortcut = useMemo(() => getPermissionModeCycleShortcut(), [])\n const showQuickModelSwitchShortcut = modeCycleShortcut.displayText !== 'alt+m'\n\n const handleExitMessage = useCallback((show: boolean, key?: string) => {\n setExitMessage(prev =>\n prev.show === show && prev.key === key ? prev : { show, key },\n )\n }, [])\n\n const handleInlineMessage = useCallback((show: boolean, text?: string) => {\n setMessage(prev =>\n prev.show === show && prev.text === text ? prev : { show, text },\n )\n }, [])\n const handleClearInput = useDoublePress(setClearInputPending, () => {\n clearPastes()\n onInputChange('')\n setCursorOffset(0)\n })\n const handleRewind = useDoublePress(setRewindPending, () => {\n onShowMessageSelector()\n })\n\n const {\n pushToBuffer: pushUndoSnapshot,\n undo: undoOnce,\n canUndo,\n clearBuffer: clearUndoBuffer,\n } = useUndoBuffer<{\n mode: PromptMode\n pastedTexts: PastedTextSegment[]\n pastedImages: PastedImageAttachment[]\n }>({ maxBufferSize: 50, debounceMs: 200 })\n\n const cursorOffsetRef = useRef(cursorOffset)\n useEffect(() => {\n cursorOffsetRef.current = cursorOffset\n }, [cursorOffset])\n\n const { columns, rows } = useTerminalSize()\n const textInputColumns = Math.max(1, columns - 6)\n // Prevent the prompt input from growing unbounded and overflowing the viewport,\n // which can cause flicker/ghost lines on small terminals.\n const textInputMaxHeight = Math.max(1, Math.min(8, Math.floor(rows / 3)))\n const inputLineCount = useMemo(\n () => countWrappedLines(input, textInputColumns, textInputMaxHeight + 1),\n [input, textInputColumns, textInputMaxHeight],\n )\n const inputBoxHeight = Math.min(inputLineCount, textInputMaxHeight) + 2\n\n const onChange = useCallback(\n (value: string) => {\n onHistoryUserInputRef.current()\n\n // Only check for mode prefix when in 'prompt' mode\n // In other modes (bash/koding/background), just update the input directly\n if (mode === 'prompt') {\n if (value.startsWith('!') || value.startsWith('$')) {\n onModeChange('bash')\n return\n }\n if (value.startsWith('&')) {\n onModeChange('background')\n return\n }\n if (value.startsWith('#')) {\n onModeChange('koding')\n return\n }\n }\n\n onInputChange(value)\n },\n [mode, onInputChange, onModeChange],\n )\n\n const theme = getTheme()\n const tokenUsage = useMemo(() => countTokens(messages), [messages])\n const totalCostUSD = useMemo(() => {\n let total = 0\n for (const message of messages) {\n if (message.type === 'assistant') total += message.costUSD\n }\n return total\n }, [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 }, [submitCount, tokenUsage, uiRefreshCounter])\n\n const statusLineUsage = useMemo(() => {\n let totalInputTokens = 0\n let totalOutputTokens = 0\n\n let currentUsage: null | {\n input_tokens: number\n output_tokens: number\n cache_creation_input_tokens: number\n cache_read_input_tokens: number\n } = null\n\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i]\n if (!message || message.type !== 'assistant') continue\n const usage = (message.message as unknown as { usage?: unknown }).usage\n if (!usage || typeof usage !== 'object') continue\n\n const rec = usage as Record<string, unknown>\n const inputTokens = rec.input_tokens\n const outputTokens = rec.output_tokens\n if (typeof inputTokens !== 'number' || typeof outputTokens !== 'number') {\n continue\n }\n\n currentUsage = {\n input_tokens: inputTokens,\n output_tokens: outputTokens,\n cache_creation_input_tokens:\n typeof rec.cache_creation_input_tokens === 'number'\n ? rec.cache_creation_input_tokens\n : 0,\n cache_read_input_tokens:\n typeof rec.cache_read_input_tokens === 'number'\n ? rec.cache_read_input_tokens\n : 0,\n }\n break\n }\n\n for (const message of messages) {\n if (!message || message.type !== 'assistant') continue\n const usage = (message.message as unknown as { usage?: unknown }).usage\n if (!usage || typeof usage !== 'object') continue\n const rec = usage as Record<string, unknown>\n const inputTokens = rec.input_tokens\n const outputTokens = rec.output_tokens\n if (typeof inputTokens !== 'number' || typeof outputTokens !== 'number') {\n continue\n }\n totalInputTokens += inputTokens\n totalOutputTokens += outputTokens\n }\n\n return { totalInputTokens, totalOutputTokens, currentUsage }\n }, [messages])\n\n const statusLineInput = useMemo(() => {\n const profile = getModelManager().getModel('main')\n const outputStyleName = getCurrentOutputStyle()\n const transcriptPath = getMessagesPath(messageLogName, forkNumber, 0)\n\n const currentUsage = statusLineUsage.currentUsage\n const contextWindowSize =\n typeof profile?.contextLength === 'number' ? profile.contextLength : 0\n\n const { used_percentage, remaining_percentage } =\n computeContextWindowPercentages({\n currentUsage,\n contextWindowSize,\n })\n const exceeds200kTokens = currentUsage\n ? currentUsage.input_tokens +\n currentUsage.output_tokens +\n currentUsage.cache_creation_input_tokens +\n currentUsage.cache_read_input_tokens >\n 200000\n : false\n\n return {\n session_id: getKodeAgentSessionId(),\n transcript_path: transcriptPath,\n cwd: currentPwd,\n model: {\n id: profile?.modelName ?? '',\n display_name: profile?.name ?? profile?.modelName ?? '',\n },\n workspace: {\n current_dir: currentPwd,\n project_dir: getOriginalCwd(),\n },\n version: MACRO.VERSION,\n output_style: { name: outputStyleName },\n cost: {\n total_cost_usd: totalCostUSD,\n total_duration_ms: getTotalDuration(),\n total_api_duration_ms: getTotalAPIDuration(),\n },\n context_window: {\n total_input_tokens: statusLineUsage.totalInputTokens,\n total_output_tokens: statusLineUsage.totalOutputTokens,\n context_window_size: contextWindowSize,\n current_usage: currentUsage,\n used_percentage,\n remaining_percentage,\n },\n exceeds_200k_tokens: exceeds200kTokens,\n ...(editorMode === 'vim' ? { vim: { mode: vimMode } } : {}),\n kode: {\n conversation: { messageLogName, forkNumber },\n permission_mode: toolPermissionContext.mode,\n model: {\n provider: profile?.provider ?? null,\n },\n },\n }\n }, [\n currentPwd,\n editorMode,\n forkNumber,\n messageLogName,\n statusLineUsage,\n toolPermissionContext.mode,\n totalCostUSD,\n vimMode,\n ])\n\n const { text: statusLineText, padding: statusLinePadding } =\n useStatusLine(statusLineInput)\n\n const defaultStatusLine = useMemo(() => {\n const parts: string[] = []\n if (editorMode === 'vim' && vimMode === 'INSERT') {\n parts.push('-- INSERT --')\n } else if (mode === 'bash') {\n parts.push('$ bash')\n } else if (mode === 'background') {\n parts.push('& background')\n } else if (mode === 'koding') {\n parts.push('# koding')\n } else {\n parts.push('? shortcuts')\n }\n\n parts.push(isLoading ? 'Enter send \u00B7 Tab queue' : 'Enter send')\n\n if (pendingPrompts.length > 0) {\n parts.push(`pending ${pendingPrompts.length}`)\n }\n\n if (queuedPrompts.length > 0) {\n parts.push(`queued ${queuedPrompts.length}`)\n parts.push('Alt+\u2191 edit')\n }\n\n return parts.join(' \u00B7 ')\n }, [editorMode, isLoading, mode, pendingPrompts.length, queuedPrompts.length, vimMode])\n\n const effectiveStatusLine = statusLineText ?? defaultStatusLine\n\n const toastMessage = useMemo(() => ({ show: false as const }), [])\n\n const compact = rows < 16\n const modelInfoRows = !compact && modelInfo ? 1 : 0\n const pwdRows = compact ? 0 : 1\n const completionReservedRows = inputBoxHeight + modelInfoRows + pwdRows + 1\n const completionEnabled = rows >= 10 && rows - completionReservedRows >= 2\n\n const {\n suggestions,\n selectedIndex,\n isActive: completionActive,\n emptyDirMessage,\n resetCompletion,\n } = useUnifiedCompletion({\n input,\n cursorOffset,\n onInputChange,\n setCursorOffset,\n commands,\n disableSlashCommands,\n isEnabled: completionEnabled,\n })\n const completionVisible =\n completionEnabled && completionActive && suggestions.length > 0\n const visibleSuggestions = completionVisible ? suggestions : []\n\n const {\n pastedTexts,\n pastedImages,\n setPastedTexts,\n setPastedImages,\n onImagePaste,\n onTextPaste,\n clearPastes,\n } = usePromptPastes({\n input,\n cursorOffset,\n onInputChange,\n setCursorOffset,\n onModeChange,\n terminalRows: rows,\n })\n\n // Codex-style prompt queue shortcuts:\n // - Tab queues while a turn is running (and does not send immediately)\n // - Alt+Up pops the most recent queued/pending message for editing\n useKeypress(\n (_inputChar, key) => {\n if (isEditingExternally) return\n if (isDisabled) return\n\n if (\n key.meta &&\n key.upArrow &&\n !key.shift &&\n !key.ctrl\n ) {\n const draftForQueue: QueuedPrompt | null =\n input.trim().length > 0 || pastedTexts.length > 0 || pastedImages.length > 0\n ? {\n seq: nextQueuedPromptSeqRef.current++,\n input,\n mode,\n pastedTexts: [...pastedTexts],\n pastedImages: [...pastedImages],\n }\n : null\n\n const latest =\n queuedPrompts.length > 0\n ? queuedPrompts.reduce((best, item) =>\n item.seq > best.seq ? item : best,\n )\n : null\n if (!latest) return\n\n if (completionActive) resetCompletion()\n clearSavedPromptDraftBestEffort()\n if (draftForQueue) {\n setQueuedPrompts(prev => [...prev, draftForQueue])\n }\n setQueuedPrompts(prev => prev.filter(item => item !== latest))\n clearPastes()\n onModeChange(latest.mode)\n onInputChange(latest.input)\n setPastedTexts(latest.pastedTexts)\n setPastedImages(latest.pastedImages)\n setCursorOffset(latest.input.length)\n return true\n }\n\n if (\n isLoading &&\n key.tab &&\n !key.shift &&\n (input.trim().length > 0 ||\n pastedTexts.length > 0 ||\n pastedImages.length > 0)\n ) {\n if (completionActive) resetCompletion()\n clearSavedPromptDraftBestEffort()\n clearUndoBuffer()\n setQueuedPrompts(prev => [\n ...prev,\n {\n seq: nextQueuedPromptSeqRef.current++,\n input,\n mode,\n pastedTexts: [...pastedTexts],\n pastedImages: [...pastedImages],\n },\n ])\n clearPastes()\n onInputChange('')\n setCursorOffset(0)\n return true\n }\n },\n { priority: KEYPRESS_PRIORITY.REPL_CONTROLLER },\n )\n\n const lastRestorePastesIdRef = useRef<number | null>(null)\n useLayoutEffect(() => {\n if (!restorePastes) return\n if (lastRestorePastesIdRef.current === restorePastes.id) return\n lastRestorePastesIdRef.current = restorePastes.id\n\n setPastedTexts(restorePastes.pastedTexts)\n setPastedImages(restorePastes.pastedImages)\n onDraftPastesChange?.({\n pastedTexts: restorePastes.pastedTexts,\n pastedImages: restorePastes.pastedImages,\n })\n onRestorePastesApplied?.(restorePastes.id)\n }, [\n onDraftPastesChange,\n onRestorePastesApplied,\n restorePastes,\n setPastedImages,\n setPastedTexts,\n ])\n\n const didRestoreDraftPastesRef = useRef(false)\n useLayoutEffect(() => {\n if (didRestoreDraftPastesRef.current) return\n if (restorePastes) return\n if (!draftPastes) return\n if (pastedTexts.length > 0 || pastedImages.length > 0) {\n didRestoreDraftPastesRef.current = true\n return\n }\n if (\n draftPastes.pastedTexts.length === 0 &&\n draftPastes.pastedImages.length === 0\n ) {\n didRestoreDraftPastesRef.current = true\n return\n }\n\n setPastedTexts(draftPastes.pastedTexts)\n setPastedImages(draftPastes.pastedImages)\n didRestoreDraftPastesRef.current = true\n }, [\n draftPastes,\n pastedImages.length,\n pastedTexts.length,\n restorePastes,\n setPastedImages,\n setPastedTexts,\n ])\n\n const didSkipDraftPastesSyncRef = useRef(false)\n useLayoutEffect(() => {\n if (!onDraftPastesChange) return\n if (!didSkipDraftPastesSyncRef.current) {\n didSkipDraftPastesSyncRef.current = true\n return\n }\n onDraftPastesChange({ pastedTexts, pastedImages })\n }, [onDraftPastesChange, pastedImages, pastedTexts])\n\n const didRestoreDraftRef = useRef(false)\n useEffect(() => {\n if (didRestoreDraftRef.current) return\n // Only attempt to restore a saved draft once per PromptInput mount.\n // Otherwise, clearing the input (e.g. after submit) can cause the last saved\n // draft to \"pop back\" into the input.\n didRestoreDraftRef.current = true\n if (initialPrompt && initialPrompt.trim()) return\n\n const hasPendingInput =\n input.trim().length > 0 ||\n pastedTexts.length > 0 ||\n pastedImages.length > 0\n if (hasPendingInput) return\n\n try {\n const draft = getCurrentProjectConfig().promptDrafts?.[PROMPT_DRAFT_KEY]\n if (!draft || typeof draft.text !== 'string' || !draft.text.trim()) return\n\n const nextMode = draft.mode\n const rawOffset =\n typeof draft.cursorOffset === 'number'\n ? draft.cursorOffset\n : draft.text.length\n const clampedOffset = Math.min(Math.max(0, rawOffset), draft.text.length)\n\n didRestoreDraftRef.current = true\n onModeChange(nextMode)\n onInputChange(draft.text)\n setCursorOffset(clampedOffset)\n } catch {\n // best-effort\n }\n }, [\n initialPrompt,\n input,\n onInputChange,\n onModeChange,\n pastedImages.length,\n pastedTexts.length,\n ])\n\n const lastPersistedDraftRef = useRef<{\n text: string\n mode: PromptMode\n cursorOffset: number\n } | null>(null)\n const draftPersistTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(\n null,\n )\n useEffect(() => {\n if (initialPrompt && initialPrompt.trim()) return\n\n const normalizedCursor = Math.min(Math.max(0, cursorOffset), input.length)\n const shouldClearDraft = input.trim().length === 0 && mode === 'prompt'\n const nextSnapshot = {\n text: input,\n mode,\n cursorOffset: normalizedCursor,\n }\n\n const prev = lastPersistedDraftRef.current\n const unchanged =\n prev &&\n prev.text === nextSnapshot.text &&\n prev.mode === nextSnapshot.mode &&\n prev.cursorOffset === nextSnapshot.cursorOffset\n\n if (shouldClearDraft && !prev) return\n if (!shouldClearDraft && unchanged) return\n\n if (draftPersistTimeoutRef.current) {\n clearTimeout(draftPersistTimeoutRef.current)\n draftPersistTimeoutRef.current = null\n }\n\n draftPersistTimeoutRef.current = setTimeout(() => {\n try {\n const projectConfig = getCurrentProjectConfig()\n const promptDrafts = { ...(projectConfig.promptDrafts ?? {}) }\n\n if (shouldClearDraft) {\n delete promptDrafts[PROMPT_DRAFT_KEY]\n lastPersistedDraftRef.current = null\n } else {\n promptDrafts[PROMPT_DRAFT_KEY] = {\n text: nextSnapshot.text,\n mode: nextSnapshot.mode,\n cursorOffset: nextSnapshot.cursorOffset,\n updatedAt: Date.now(),\n }\n lastPersistedDraftRef.current = nextSnapshot\n }\n\n saveCurrentProjectConfig({ ...projectConfig, promptDrafts })\n } catch {\n // best-effort\n }\n draftPersistTimeoutRef.current = null\n }, 400)\n\n return () => {\n if (draftPersistTimeoutRef.current) {\n clearTimeout(draftPersistTimeoutRef.current)\n draftPersistTimeoutRef.current = null\n }\n }\n }, [cursorOffset, initialPrompt, input, mode])\n\n const { resetHistory, onHistoryUp, onHistoryDown, onUserInput, historyIndex, isInFastBrowseMode } =\n useArrowKeyHistory({\n current: {\n text: input,\n mode,\n cursorOffset,\n extra: { pastedTexts, pastedImages },\n },\n emptyExtra: { pastedTexts: [], pastedImages: [] },\n onRestore: snapshot => {\n setPastedTexts(snapshot.extra.pastedTexts)\n setPastedImages(snapshot.extra.pastedImages)\n onModeChange(snapshot.mode)\n onInputChange(snapshot.text)\n setCursorOffset(snapshot.cursorOffset)\n },\n buildExtraFromHistoryEntry: entry => ({\n pastedTexts: entry.pastedTexts,\n pastedImages: [],\n }),\n })\n onHistoryUserInputRef.current = onUserInput\n\n const historyHintTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const lastHistoryHintTimeRef = useRef<number>(0)\n useEffect(() => {\n if (historyIndex < 2) return\n\n const now = Date.now()\n // Don't show again within 10 seconds of last hint\n if (now - lastHistoryHintTimeRef.current < 10000) return\n // Clear existing timeout if any\n if (historyHintTimeoutRef.current) {\n clearTimeout(historyHintTimeoutRef.current)\n historyHintTimeoutRef.current = null\n }\n\n lastHistoryHintTimeRef.current = now\n handleInlineMessage(true, 'Tip: Ctrl+R to search history')\n\n historyHintTimeoutRef.current = setTimeout(() => {\n setMessage(prev => {\n if (!prev.show) return prev\n if (prev.text !== 'Tip: Ctrl+R to search history') return prev\n return { show: false }\n })\n historyHintTimeoutRef.current = null\n }, 5000)\n }, [handleInlineMessage, historyIndex])\n\n useEffect(() => {\n return () => {\n if (historyHintTimeoutRef.current) {\n clearTimeout(historyHintTimeoutRef.current)\n }\n }\n }, [])\n\n const handleHistoryUp = () => {\n if (completionActive) resetCompletion()\n onHistoryUp()\n }\n const handleHistoryDown = () => {\n if (completionActive) resetCompletion()\n\n if (\n typeof onManageTasks === 'function' &&\n historyIndex === 0 &&\n input.length === 0\n ) {\n const hasBackgroundTasks =\n BunShell.getInstance().listBackgroundShells().length > 0 ||\n listBackgroundAgentTaskSnapshots().length > 0\n if (hasBackgroundTasks) {\n onManageTasks()\n return\n }\n }\n\n 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 === 'bashModeToggle') {\n onModeChange(toggleBashMode(mode))\n return true\n }\n\n if (action === 'modelSwitch') {\n // Allow model switching while a turn is running. The change will apply to\n // subsequent model requests / the next turn, depending on the engine.\n handleQuickModelSwitch()\n return true\n }\n\n if (action === 'externalEditor') {\n void handleExternalEdit()\n return true\n }\n\n if (\n editorMode === 'vim' &&\n vimMode === 'NORMAL' &&\n key.insertable &&\n !key.ctrl &&\n !key.meta &&\n inputChar.length === 1\n ) {\n const cursor = Cursor.fromText(\n input,\n textInputColumns,\n cursorOffsetRef.current,\n )\n\n const applyCursor = (nextCursor: Cursor) => {\n if (nextCursor.text !== input) onInputChange(nextCursor.text)\n setCursorOffset(nextCursor.offset)\n }\n\n switch (inputChar) {\n case 'h':\n applyCursor(cursor.left())\n return true\n case 'j':\n applyCursor(cursor.down())\n return true\n case 'k':\n applyCursor(cursor.up())\n return true\n case 'l':\n applyCursor(cursor.right())\n return true\n case '0':\n applyCursor(cursor.startOfLine())\n return true\n case '$':\n applyCursor(cursor.endOfLine())\n return true\n case 'w':\n applyCursor(cursor.nextWord())\n return true\n case 'b':\n applyCursor(cursor.prevWord())\n return true\n case 'x':\n applyCursor(cursor.del())\n return true\n case 'i':\n setVimMode('INSERT')\n return true\n case 'I':\n applyCursor(cursor.startOfLine())\n setVimMode('INSERT')\n return true\n case 'a':\n applyCursor(cursor.right())\n setVimMode('INSERT')\n return true\n case 'A':\n applyCursor(cursor.endOfLine())\n setVimMode('INSERT')\n return true\n default:\n return true\n }\n }\n\n return false\n },\n [\n cycleMode,\n editorMode,\n handleExternalEdit,\n handleQuickModelSwitch,\n isEditingExternally,\n isLoading,\n mode,\n modeCycleShortcut,\n onInputChange,\n onModeChange,\n input,\n textInputColumns,\n vimMode,\n ],\n )\n\n useEffect(() => {\n const signature = [\n `mode:${mode}`,\n `input:${input}`,\n ...pastedTexts.map(p => `text:${p.placeholder}`),\n ...pastedImages.map(p => `image:${p.placeholder}`),\n ].join('\\n')\n\n pushUndoSnapshot({\n signature,\n text: input,\n cursorOffset: cursorOffsetRef.current,\n extra: {\n mode,\n pastedTexts: [...pastedTexts],\n pastedImages: [...pastedImages],\n },\n })\n }, [input, mode, pastedImages, pastedTexts, pushUndoSnapshot])\n\n const clearSavedPromptDraftBestEffort = useCallback(() => {\n try {\n if (draftPersistTimeoutRef.current) {\n clearTimeout(draftPersistTimeoutRef.current)\n draftPersistTimeoutRef.current = null\n }\n\n const projectConfig = getCurrentProjectConfig()\n const existing = projectConfig.promptDrafts?.[PROMPT_DRAFT_KEY]\n if (!existing) {\n lastPersistedDraftRef.current = null\n return\n }\n\n const promptDrafts = { ...(projectConfig.promptDrafts ?? {}) }\n delete promptDrafts[PROMPT_DRAFT_KEY]\n saveCurrentProjectConfig({ ...projectConfig, promptDrafts })\n lastPersistedDraftRef.current = null\n } catch {\n // best-effort\n }\n }, [])\n\n async function onSubmit(value: string, isSubmittingSlashCommand = false) {\n if (isEditingExternally) return\n\n if (\n !isSubmittingSlashCommand &&\n completionVisible &&\n suggestions.length > 0\n ) {\n return\n }\n\n if (!value) return\n if (isDisabled) return\n if (!value.trim()) return\n\n if (isLoading) {\n // Enter always \"sends\". While a turn is running, treat it as a pending submission\n // (distinct from Tab-queued tasks) and auto-run it when the current turn completes.\n if (completionActive) resetCompletion()\n clearSavedPromptDraftBestEffort()\n clearUndoBuffer()\n setPendingPrompts(prev => [\n ...prev,\n {\n seq: nextQueuedPromptSeqRef.current++,\n input: value,\n mode,\n pastedTexts: [...pastedTexts],\n pastedImages: [...pastedImages],\n },\n ])\n clearPastes()\n onInputChange('')\n setCursorOffset(0)\n return\n }\n\n clearSavedPromptDraftBestEffort()\n clearUndoBuffer()\n\n await submitPrompt({\n input: value,\n mode,\n completionActive: completionVisible,\n suggestionCount: completionVisible ? suggestions.length : 0,\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 onShowMessageSelector,\n readFileTimestamps,\n pastedTexts,\n pastedImages,\n clearPastes,\n resetHistory,\n setCurrentPwd,\n exit,\n })\n }\n\n const [isQueueDrainInFlight, setIsQueueDrainInFlight] = useState(false)\n useEffect(() => {\n if (isQueueDrainInFlight) return\n if (isLoading) return\n if (isDisabled) return\n if (isEditingExternally) return\n\n const next = pendingPrompts[0] ?? queuedPrompts[0]\n if (!next) return\n\n setIsQueueDrainInFlight(true)\n if (pendingPrompts.length > 0) {\n setPendingPrompts(prev => prev.slice(1))\n } else {\n setQueuedPrompts(prev => prev.slice(1))\n }\n\n void (async () => {\n try {\n await submitPrompt({\n input: next.input,\n mode: next.mode,\n completionActive: false,\n suggestionCount: 0,\n isSubmittingSlashCommand: false,\n isDisabled,\n isLoading: false,\n isEditingExternally,\n abortController,\n setIsLoading,\n setAbortController,\n // Do not clobber the user's current draft while draining the queue.\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 onShowMessageSelector,\n readFileTimestamps,\n pastedTexts: next.pastedTexts,\n pastedImages: next.pastedImages,\n clearPastes: () => {},\n resetHistory: () => {},\n setCurrentPwd,\n exit,\n })\n } finally {\n setIsQueueDrainInFlight(false)\n }\n })()\n }, [\n abortController,\n commands,\n currentMode,\n disableSlashCommands,\n forkNumber,\n input,\n isDisabled,\n isEditingExternally,\n isLoading,\n messageLogName,\n onQuery,\n onSubmitCountChange,\n pendingPrompts,\n queuedPrompts,\n readFileTimestamps,\n isQueueDrainInFlight,\n setAbortController,\n setCurrentPwd,\n setForkConvoWithMessagesOnTheNextRender,\n setIsLoading,\n setToolJSX,\n toolPermissionContext,\n tools,\n verbose,\n ])\n\n useKeypress(\n (inputChar, key) => {\n if (clearInputPending && !key.escape) {\n setClearInputPending(false)\n }\n if (rewindPending && !key.escape) {\n setRewindPending(false)\n }\n\n if (key.escape && editorMode === 'vim' && vimMode === 'INSERT') {\n setVimMode('NORMAL')\n return true\n }\n\n if (key.ctrl && inputChar === 's') {\n setClearInputPending(false)\n\n if (\n input.trim() === '' &&\n pastedTexts.length === 0 &&\n pastedImages.length === 0 &&\n promptStash\n ) {\n onModeChange(promptStash.mode)\n onInputChange(promptStash.input)\n setPastedTexts(promptStash.pastedTexts)\n setPastedImages(promptStash.pastedImages)\n setCursorOffset(promptStash.cursorOffset)\n setPromptStash(null)\n return true\n }\n\n if (\n input.trim() !== '' ||\n pastedTexts.length > 0 ||\n pastedImages.length > 0\n ) {\n setPromptStash({\n input,\n mode,\n cursorOffset,\n pastedTexts: [...pastedTexts],\n pastedImages: [...pastedImages],\n })\n clearPastes()\n onInputChange('')\n setCursorOffset(0)\n return true\n }\n\n return true\n }\n\n if (key.ctrl && inputChar === '_') {\n setClearInputPending(false)\n if (!canUndo) return true\n\n const snapshot = undoOnce()\n if (!snapshot) return true\n\n setPastedTexts(snapshot.extra.pastedTexts)\n setPastedImages(snapshot.extra.pastedImages)\n onModeChange(snapshot.extra.mode)\n onInputChange(snapshot.text)\n setCursorOffset(snapshot.cursorOffset)\n return true\n }\n\n // Handle mode exit when input is empty and user presses backspace/delete/escape\n if (\n (mode === 'bash' || mode === 'background' || mode === 'koding') &&\n input === '' &&\n (key.backspace || key.delete || key.escape)\n ) {\n onModeChange('prompt')\n return true\n }\n\n if (\n key.escape &&\n !isLoading &&\n mode === 'prompt' &&\n !completionVisible &&\n input.length === 0 &&\n pastedTexts.length === 0 &&\n pastedImages.length === 0\n ) {\n setClearInputPending(false)\n handleRewind()\n return true\n }\n\n if (\n key.escape &&\n !isLoading &&\n (input.length > 0 || pastedTexts.length > 0 || pastedImages.length > 0)\n ) {\n setRewindPending(false)\n handleClearInput()\n return true\n }\n },\n { priority: KEYPRESS_PRIORITY.INPUT },\n )\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 pendingPrompts={pendingPrompts.map(item => item.input)}\n queuedPrompts={queuedPrompts.map(item => item.input)}\n completionActive={completionVisible}\n historyIndex={historyIndex}\n suggestions={visibleSuggestions}\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={handleExitMessage}\n onMessage={handleInlineMessage}\n onImagePaste={onImagePaste}\n onTextPaste={onTextPaste}\n onSpecialKey={handleSpecialKey}\n exitMessage={exitMessage}\n message={message}\n clearInputPending={clearInputPending}\n rewindPending={rewindPending}\n modelSwitchMessage={modelSwitchMessage}\n toastMessage={toastMessage}\n statusLine={effectiveStatusLine}\n statusLinePadding={statusLinePadding}\n currentMode={currentMode}\n modeCycleShortcutText={modeCycleShortcut.displayText}\n showQuickModelSwitchShortcut={showQuickModelSwitchShortcut}\n tokenUsage={tokenUsage}\n textInputColumns={textInputColumns}\n textInputMaxHeight={textInputMaxHeight}\n completionReservedRows={completionReservedRows}\n isInFastBrowseMode={isInFastBrowseMode}\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 { useCallback, useEffect, useRef, useState } from 'react'\nimport { getHistoryWithPastes } from '#core/history'\nimport type { PromptMode } from '#ui-ink/components/PromptInput/types'\n\nconst FAST_BROWSE_WINDOW_MS = 1500\n\nexport type ArrowKeyHistorySnapshot<Extra> = {\n text: string\n mode: PromptMode\n cursorOffset: number\n extra: Extra\n}\n\nexport function useArrowKeyHistory<Extra>(args: {\n current: ArrowKeyHistorySnapshot<Extra>\n emptyExtra: Extra\n onRestore: (snapshot: ArrowKeyHistorySnapshot<Extra>) => void\n buildExtraFromHistoryEntry?: (entry: {\n display: string\n pastedTexts: Array<{ placeholder: string; text: string }>\n }) => Extra\n}) {\n const { current, emptyExtra, onRestore, buildExtraFromHistoryEntry } = args\n\n const [historyIndex, setHistoryIndex] = useState(0)\n const historyIndexRef = useRef(0)\n useEffect(() => {\n historyIndexRef.current = historyIndex\n }, [historyIndex])\n\n const draftSnapshotRef = useRef<ArrowKeyHistorySnapshot<Extra> | null>(null)\n const historySnapshotRef = useRef<\n | Array<{\n display: string\n pastedTexts: Array<{ placeholder: string; text: string }>\n }>\n | null\n >(null)\n const lastHistoryNavTimeRef = useRef(0)\n\n const currentRef = useRef(current)\n useEffect(() => {\n currentRef.current = current\n }, [current])\n\n const getHistorySnapshot = () => {\n if (!historySnapshotRef.current) {\n historySnapshotRef.current = getHistoryWithPastes()\n }\n return historySnapshotRef.current\n }\n\n const updateFromHistoryEntry = (\n entry:\n | {\n display: string\n pastedTexts: Array<{ placeholder: string; text: string }>\n }\n | undefined,\n cursor: 'start' | 'end',\n ) => {\n if (entry === undefined) return\n let mode: PromptMode = 'prompt'\n let text = entry.display\n if (entry.display.startsWith('!')) {\n mode = 'bash'\n text = entry.display.slice(1)\n } else if (entry.display.startsWith('&')) {\n mode = 'background'\n text = entry.display.slice(1)\n } else if (entry.display.startsWith('#')) {\n mode = 'koding'\n text = entry.display.slice(1)\n }\n onRestore({\n text,\n mode,\n cursorOffset: cursor === 'start' ? 0 : text.length,\n extra: buildExtraFromHistoryEntry\n ? buildExtraFromHistoryEntry(entry)\n : emptyExtra,\n })\n }\n\n function onHistoryUp() {\n const latestHistory = getHistorySnapshot()\n const prev = historyIndexRef.current\n if (prev >= latestHistory.length) return\n\n if (prev === 0) draftSnapshotRef.current = currentRef.current\n updateFromHistoryEntry(latestHistory[prev], 'start')\n\n const next = prev + 1\n historyIndexRef.current = next\n lastHistoryNavTimeRef.current = Date.now()\n setHistoryIndex(next)\n }\n\n function onHistoryDown() {\n const latestHistory = getHistorySnapshot()\n const prev = historyIndexRef.current\n if (prev > 1) {\n const next = prev - 1\n updateFromHistoryEntry(latestHistory[next - 1], 'end')\n historyIndexRef.current = next\n lastHistoryNavTimeRef.current = Date.now()\n setHistoryIndex(next)\n return\n }\n\n if (prev === 1) {\n onRestore(draftSnapshotRef.current ?? currentRef.current)\n draftSnapshotRef.current = null\n historyIndexRef.current = 0\n lastHistoryNavTimeRef.current = Date.now()\n setHistoryIndex(0)\n return\n }\n }\n\n const isInFastBrowseMode = useCallback(() => {\n return Date.now() - lastHistoryNavTimeRef.current < FAST_BROWSE_WINDOW_MS\n }, [])\n\n const onUserInput = useCallback(() => {\n if (historyIndexRef.current === 0) return\n historyIndexRef.current = 0\n draftSnapshotRef.current = null\n historySnapshotRef.current = null\n setHistoryIndex(0)\n }, [])\n\n function resetHistory() {\n historyIndexRef.current = 0\n setHistoryIndex(0)\n draftSnapshotRef.current = null\n historySnapshotRef.current = null\n }\n\n return {\n historyIndex,\n setHistoryIndex,\n onHistoryUp,\n onHistoryDown,\n onUserInput,\n resetHistory,\n isInFastBrowseMode,\n }\n}\n", "import { useEffect, useRef, useState } from 'react'\nimport { BunShell } from '#runtime/shell'\nimport { getStatusLineConfig } from '#core/services/statusline'\nimport { listBackgroundAgentTaskSnapshots } from '#core/utils/backgroundTasks'\n\nfunction serializeStatusLineInput(value: unknown): string {\n try {\n return JSON.stringify(value ?? {}, null, 0) + '\\n'\n } catch {\n return '{}\\n'\n }\n}\n\nfunction buildDynamicStatusLineInput(\n baseInput: unknown,\n shell: BunShell,\n): Record<string, unknown> {\n const base =\n baseInput && typeof baseInput === 'object' && !Array.isArray(baseInput)\n ? (baseInput as Record<string, unknown>)\n : {}\n\n const existingKode =\n base.kode && typeof base.kode === 'object' && !Array.isArray(base.kode)\n ? (base.kode as Record<string, unknown>)\n : {}\n\n const shells = shell.listBackgroundShells()\n const runningShells = shells.filter(\n proc => proc.code === null && !proc.interrupted && !proc.killed,\n ).length\n\n const agents = listBackgroundAgentTaskSnapshots()\n const runningAgents = agents.filter(task => task.status === 'running').length\n\n const tasks = {\n total: shells.length + agents.length,\n running: runningShells + runningAgents,\n bash: { total: shells.length, running: runningShells },\n agents: { total: agents.length, running: runningAgents },\n }\n\n return {\n ...base,\n kode: {\n ...existingKode,\n tasks,\n },\n }\n}\n\nexport function useStatusLine(input?: unknown): {\n text: string | null\n padding: number\n} {\n const [state, setState] = useState<{ text: string | null; padding: number }>({\n text: null,\n padding: 0,\n })\n const lastCommandRef = useRef<string | null>(null)\n const abortRef = useRef<AbortController | null>(null)\n const inputRef = useRef<unknown>(input)\n const tickRef = useRef<(() => void) | null>(null)\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n useEffect(() => {\n inputRef.current = input\n\n if (!tickRef.current) return\n if (debounceRef.current) clearTimeout(debounceRef.current)\n debounceRef.current = setTimeout(() => {\n tickRef.current?.()\n }, 300)\n\n return () => {\n if (debounceRef.current) clearTimeout(debounceRef.current)\n debounceRef.current = null\n }\n }, [input])\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 config = getStatusLineConfig()\n const command = config?.command ?? null\n const padding = config?.padding ?? 0\n\n if (!command) {\n lastCommandRef.current = null\n abortRef.current?.abort()\n abortRef.current = null\n if (alive) setState({ text: null, padding: 0 })\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, 5000, {\n stdin: serializeStatusLineInput(\n buildDynamicStatusLineInput(inputRef.current, shell),\n ),\n })\n if (!alive) return\n if (result.interrupted) return\n\n const raw = result.code === 0 ? result.stdout : ''\n const next = raw\n ? raw\n .trim()\n .split(/\\r?\\n/)\n .flatMap(line => {\n const trimmed = line.trim()\n return trimmed ? [trimmed] : []\n })\n .join('\\n')\n : ''\n if (alive) setState({ text: next || null, padding })\n }\n\n tickRef.current = () => {\n tick().catch(() => {})\n }\n\n tick().catch(() => {})\n\n const intervalId = setInterval(() => {\n tickRef.current?.()\n }, 1000)\n\n return () => {\n alive = false\n abortRef.current?.abort()\n tickRef.current = null\n clearInterval(intervalId)\n }\n }, [])\n\n return state\n}\n", "import {\n getSettingsFileCandidates,\n loadSettingsWithLegacyFallback,\n saveSettingsToPrimaryAndSyncLegacy,\n} from '#config'\nimport { getDisableAllHooksState } from '#core/hooks/disableAllHooks'\nimport { getCwd } from '#core/utils/state'\n\ntype UserSettings = {\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\nfunction normalizePadding(value: unknown): number | null {\n if (typeof value !== 'number') return null\n if (!Number.isFinite(value)) return null\n const rounded = Math.floor(value)\n return rounded >= 0 ? rounded : null\n}\n\nexport function getUserSettingsPath(): string {\n const candidates = getSettingsFileCandidates({ destination: 'userSettings' })\n return candidates?.primary ?? ''\n}\n\nexport type StatusLineConfig = {\n type: 'command'\n command: string\n padding?: number\n}\n\nexport function getStatusLineConfig(): StatusLineConfig | null {\n const hooksDisabled = getDisableAllHooksState({\n projectDir: getCwd(),\n }).disabled\n if (hooksDisabled) return null\n\n const loaded = loadSettingsWithLegacyFallback({\n destination: 'userSettings',\n migrateToPrimary: true,\n })\n const settings = (loaded.settings as UserSettings | null) ?? {}\n\n const raw = settings.statusLine\n if (typeof raw === 'string') {\n const command = normalizeString(raw)\n return command ? { type: 'command', command } : null\n }\n if (raw && typeof raw === 'object') {\n const record = raw as Record<string, unknown>\n const typeRaw = record.type\n if (typeRaw !== undefined && typeRaw !== 'command') return null\n\n const command = normalizeString(record.command)\n if (!command) return null\n\n const padding = normalizePadding(record.padding)\n return {\n type: 'command',\n command,\n ...(padding !== null ? { padding } : {}),\n }\n }\n return null\n}\n\nexport function getStatusLineCommand(): string | null {\n return getStatusLineConfig()?.command ?? null\n}\n\nexport function getStatusLinePadding(): number {\n return getStatusLineConfig()?.padding ?? 0\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 UserSettings | null) ?? {}\n const next: UserSettings = { ...existing }\n if (command === null) {\n delete next.statusLine\n } else {\n const normalized = normalizeString(command)\n if (!normalized) {\n delete next.statusLine\n } else {\n const existingPadding =\n existing.statusLine &&\n typeof existing.statusLine === 'object' &&\n !Array.isArray(existing.statusLine)\n ? normalizePadding(\n (existing.statusLine as Record<string, unknown>).padding,\n )\n : null\n\n next.statusLine = {\n type: 'command',\n command: normalized,\n ...(existingPadding !== null ? { padding: existingPadding } : {}),\n }\n }\n }\n saveSettingsToPrimaryAndSyncLegacy({\n destination: 'userSettings',\n settings: next,\n syncLegacyIfExists: true,\n })\n}\n", "import { useCallback, useEffect, 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 isEnabled = true,\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 useEffect(() => {\n if (!isEnabled && state.isActive) {\n resetCompletion()\n }\n }, [isEnabled, resetCompletion, state.isActive])\n\n useUnifiedCompletionTabKey({\n input,\n state,\n getWordAtCursor,\n generateSuggestions,\n completeWith,\n activateCompletion,\n updateState,\n onInputChange,\n setCursorOffset,\n isEnabled,\n })\n\n useUnifiedCompletionNavigationKeys({\n input,\n state,\n resetCompletion,\n updateState,\n generateSuggestions,\n completeWith,\n activateCompletion,\n onInputChange,\n setCursorOffset,\n isEnabled,\n })\n\n useUnifiedCompletionAutoTrigger({\n input,\n cursorOffset,\n state,\n getWordAtCursor,\n generateSuggestions,\n activateCompletion,\n resetCompletion,\n isEnabled,\n })\n\n return {\n suggestions: state.suggestions,\n selectedIndex: state.selectedIndex,\n isActive: state.isActive && isEnabled,\n emptyDirMessage: state.emptyDirMessage,\n resetCompletion,\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 isCommand = !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 trigger: '/',\n }\n }\n\n if (word.startsWith('@')) {\n const content = word.slice(1)\n if (word.includes('@', 1)) return null\n return {\n type: 'file',\n prefix: content,\n startPos: start,\n endPos: cursorOffset,\n trigger: '@',\n }\n }\n\n return {\n type: 'file',\n prefix: word,\n startPos: start,\n endPos: cursorOffset,\n trigger: null,\n }\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\nfunction buildCommandDescription(cmd: Command): string {\n const parts: string[] = []\n if (cmd.description) parts.push(cmd.description)\n if (cmd.argumentHint) parts.push(`Args: ${cmd.argumentHint}`)\n return parts.join('\\n')\n}\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 description: buildCommandDescription(cmd),\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 description: buildCommandDescription(cmd),\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'\nimport { existsSync } from 'fs'\nimport { homedir } from 'os'\nimport { join } from 'path'\nimport { LEGACY_CONFIG_DIRNAME } from '#core/compat/legacyPaths'\n\nfunction generateSpecialFileRootSuggestions(args: {\n prefix: string\n cwd: string\n}): UnifiedSuggestion[] {\n const prefix = args.prefix ?? ''\n const shouldSuggestRoots =\n prefix === '' || prefix.startsWith('.') || prefix.startsWith('~')\n if (!shouldSuggestRoots) return []\n\n const candidates: Array<{\n value: string\n displayValue: string\n existsAt: string\n }> = [\n {\n value: '.kode/',\n displayValue: '\uD83D\uDCC1 .kode/',\n existsAt: join(args.cwd, '.kode'),\n },\n {\n value: `${LEGACY_CONFIG_DIRNAME}/`,\n displayValue: `\uD83D\uDCC1 ${LEGACY_CONFIG_DIRNAME}/`,\n existsAt: join(args.cwd, LEGACY_CONFIG_DIRNAME),\n },\n {\n value: '~/.kode/',\n displayValue: '\uD83D\uDCC1 ~/.kode/',\n existsAt: join(homedir(), '.kode'),\n },\n {\n value: `~/${LEGACY_CONFIG_DIRNAME}/`,\n displayValue: `\uD83D\uDCC1 ~/${LEGACY_CONFIG_DIRNAME}/`,\n existsAt: join(homedir(), LEGACY_CONFIG_DIRNAME),\n },\n ]\n\n const out: UnifiedSuggestion[] = []\n for (const c of candidates) {\n if (!c.value.toLowerCase().startsWith(prefix.toLowerCase())) continue\n if (!existsSync(c.existsAt)) continue\n out.push({\n value: c.value,\n displayValue: c.displayValue,\n type: 'file',\n score: 120,\n metadata: c.value.includes(LEGACY_CONFIG_DIRNAME)\n ? { color: 'dim' }\n : undefined,\n })\n }\n\n return out\n}\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 isAtFilePath = context.trigger === '@'\n const specialRootSuggestions = isAtFilePath\n ? generateSpecialFileRootSuggestions({\n prefix: context.prefix,\n cwd,\n })\n : []\n const fileSuggestions = generateFileSuggestions({\n prefix: context.prefix,\n cwd,\n })\n const unixSuggestions = isAtFilePath\n ? []\n : 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: isAtFilePath ? 5 : 50,\n weightedScore: s.score + (isAtFilePath ? 5 : 50),\n })),\n ...fileSuggestions.map(s => ({\n ...s,\n sourceWeight: isAtFilePath ? 150 : 0,\n weightedScore: s.score + (isAtFilePath ? 150 : 0),\n })),\n ...specialRootSuggestions.map(s => ({\n ...s,\n sourceWeight: isAtFilePath ? 250 : 0,\n weightedScore: s.score + (isAtFilePath ? 250 : 0),\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 isEnabled?: 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 const atPrefix = context.trigger === '@'\n completion = `${atPrefix ? '@' : ''}${suggestion.value}${\n isDirectory ? '' : ' '\n }`\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 : context.trigger === '@'\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 const next = Array.from(commandSet).sort()\n setSystemCommands(next)\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 { 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 __computeAutoTriggerActionForTests(args: {\n input: string\n previousInput: string\n now: number\n lastInputTime: number\n isEnabled: boolean\n state: CompletionState\n context: CompletionContext | null\n generateSuggestions: (context: CompletionContext) => UnifiedSuggestion[]\n}): {\n nextLastInput: string\n nextLastInputTime: number\n action: 'none' | 'reset' | 'activate'\n suggestions?: UnifiedSuggestion[]\n context?: CompletionContext\n} {\n if (args.previousInput === args.input) {\n return {\n nextLastInput: args.previousInput,\n nextLastInputTime: args.lastInputTime,\n action: 'none',\n }\n }\n\n if (!args.isEnabled) {\n return {\n nextLastInput: args.input,\n nextLastInputTime: args.lastInputTime,\n action: args.state.isActive ? 'reset' : 'none',\n }\n }\n\n const timeSinceLastInput = args.now - args.lastInputTime\n const isPossiblyIMEInput = timeSinceLastInput > 0 && timeSinceLastInput < 150\n\n const inputLengthChange = Math.abs(\n args.input.length - args.previousInput.length,\n )\n const isHistoryNavigation =\n (inputLengthChange > 10 ||\n (inputLengthChange > 5 &&\n !args.input.includes(args.previousInput.slice(-5)))) &&\n args.input !== args.previousInput\n\n const shouldAutoHideSingleMatch = (\n suggestion: UnifiedSuggestion,\n context: CompletionContext,\n ): 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\n const nextLastInputTime = args.now\n const nextLastInput = args.input\n\n if (args.state.preview?.isActive || args.now < args.state.suppressUntil) {\n return { nextLastInput, nextLastInputTime, action: 'none' }\n }\n\n if (isHistoryNavigation && args.state.isActive) {\n return { nextLastInput, nextLastInputTime, action: 'reset' }\n }\n\n // \u7ACB\u5373\u5173\u95ED\u8865\u5168\u9762\u677F\u5982\u679C context \u4E0D\u5B58\u5728\u4F46\u9762\u677F\u4ECD\u7136\u6FC0\u6D3B\n // \u8FD9\u89E3\u51B3\u4E86\u5220\u9664 \"/\" \u6216 \"@\" \u540E\u8865\u5168\u9762\u677F\u4E0D\u5173\u95ED\u7684\u95EE\u9898\n if (!args.context && args.state.isActive) {\n return { nextLastInput, nextLastInputTime, action: 'reset' }\n }\n\n // \u5982\u679C\u53EF\u80FD\u662F IME \u8F93\u5165\u4E14\u9762\u677F\u672A\u6FC0\u6D3B\uFF0C\u6682\u65F6\u4E0D\u89E6\u53D1\u8865\u5168\n // \u8FD9\u53EF\u4EE5\u51CF\u5C11\u4E2D\u6587\u8F93\u5165\u65F6\u7684\u5E72\u6270\n if (isPossiblyIMEInput && !args.state.isActive) {\n return { nextLastInput, nextLastInputTime, action: 'none' }\n }\n\n if (args.context && shouldAutoTrigger(args.context)) {\n const newSuggestions = args.generateSuggestions(args.context)\n\n if (newSuggestions.length === 0) {\n return { nextLastInput, nextLastInputTime, action: 'reset' }\n }\n\n if (\n newSuggestions.length === 1 &&\n shouldAutoHideSingleMatch(newSuggestions[0], args.context)\n ) {\n return { nextLastInput, nextLastInputTime, action: 'reset' }\n }\n\n return {\n nextLastInput,\n nextLastInputTime,\n action: 'activate',\n suggestions: newSuggestions,\n context: args.context,\n }\n }\n\n if (args.state.context) {\n const current = args.context\n const previous = args.state.context\n const contextChanged =\n !current ||\n previous.type !== current.type ||\n previous.startPos !== current.startPos ||\n !current.prefix.startsWith(previous.prefix)\n\n if (contextChanged) {\n return { nextLastInput, nextLastInputTime, action: 'reset' }\n }\n }\n\n return { nextLastInput, nextLastInputTime, action: 'none' }\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 isEnabled: boolean\n}): void {\n const lastInputRef = useRef('')\n const lastInputTimeRef = useRef(0)\n\n useEffect(() => {\n const now = Date.now()\n const context = args.getWordAtCursor()\n const result = __computeAutoTriggerActionForTests({\n input: args.input,\n previousInput: lastInputRef.current,\n now,\n lastInputTime: lastInputTimeRef.current,\n isEnabled: args.isEnabled,\n state: args.state,\n context,\n generateSuggestions: args.generateSuggestions,\n })\n\n lastInputRef.current = result.nextLastInput\n lastInputTimeRef.current = result.nextLastInputTime\n\n if (result.action === 'reset') {\n args.resetCompletion()\n return\n }\n\n if (result.action === 'activate' && result.suggestions && result.context) {\n args.activateCompletion(result.suggestions, result.context)\n }\n }, [args.input, args.cursorOffset, args.isEnabled, args.state.isActive])\n}\n", "import { useKeypress, type Key } from '#ui-ink/hooks/useKeypress'\nimport { KEYPRESS_PRIORITY } from '#ui-ink/constants/keypressPriority'\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 isEnabled: boolean\n}): void {\n useKeypress(\n (_inputChar, key) => {\n if (!args.isEnabled) return false\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 (\n nextSuggestion.isSmartMatch ||\n args.state.context.trigger === '@'\n ) {\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 || context.trigger === '@') {\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 { priority: KEYPRESS_PRIORITY.COMPLETION },\n )\n}\n", "import { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { KEYPRESS_PRIORITY } from '#ui-ink/constants/keypressPriority'\n\nimport type {\n CompletionContext,\n UnifiedSuggestion,\n} from '#cli-utils/completion/types'\nimport type { CompletionState } from './types'\n\nfunction getPreviewText(\n suggestion: UnifiedSuggestion,\n context: CompletionContext,\n): string {\n if (context.type === 'command') return `/${suggestion.value}`\n if (context.type === 'agent') return `@${suggestion.value}`\n if (suggestion.isSmartMatch) return `@${suggestion.value}`\n if (context.type === 'file' && context.trigger === '@') {\n return `@${suggestion.value}`\n }\n return suggestion.value\n}\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 isEnabled: boolean\n}): void {\n useKeypress(\n (inputChar, key) => {\n if (!args.isEnabled) return false\n\n // When completion is active, don't let history navigation take over\n const preferHistoryNavigation =\n !args.state.isActive &&\n !args.input.includes('\\n') &&\n !key.ctrl &&\n !key.meta\n\n if (preferHistoryNavigation && (key.upArrow || key.downArrow)) {\n return false\n }\n\n // Enter key: close completion panel without filling, let normal submit handle it\n if (\n key.return &&\n !key.shift &&\n !key.meta &&\n args.state.isActive &&\n args.state.suggestions.length > 0\n ) {\n // Restore original input if preview was active\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 args.resetCompletion()\n // Return false to let normal Enter/submit behavior take over\n return false\n }\n\n if (!args.state.isActive || args.state.suggestions.length === 0)\n return false\n\n const handleNavigation = (newIndex: number) => {\n if (!args.state.context) {\n args.updateState({ selectedIndex: newIndex })\n return\n }\n\n const suggestion = args.state.suggestions[newIndex]\n const previewValue = getPreviewText(suggestion, args.state.context)\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(\n args.state.context.startPos + previewValue.length,\n )\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 const handleUp =\n key.upArrow || (key.ctrl && inputChar === 'p') ? true : false\n const handleDown =\n key.downArrow || (key.ctrl && inputChar === 'n') ? true : false\n\n if (handleDown) {\n const nextIndex =\n (args.state.selectedIndex + 1) % args.state.suggestions.length\n handleNavigation(nextIndex)\n return true\n }\n\n if (handleUp) {\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 args.completeWith(selectedSuggestion, args.state.context)\n\n args.resetCompletion()\n\n if (isDirectory) {\n setTimeout(() => {\n if (!args.state.context) return\n const inserted = getPreviewText(\n selectedSuggestion,\n args.state.context,\n )\n const nextEndPos = args.state.context.startPos + inserted.length\n const newContext: CompletionContext = {\n ...args.state.context,\n prefix: selectedSuggestion.value,\n endPos: nextEndPos,\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 { priority: KEYPRESS_PRIORITY.COMPLETION },\n )\n\n useKeypress(\n (_inputChar, key) => {\n if (!args.isEnabled) return false\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 // Don't consume: allow the input field to process the deletion.\n return false\n }\n }\n return false\n },\n { priority: KEYPRESS_PRIORITY.COMPLETION },\n )\n}\n", "import { useCallback, useEffect, useMemo, useRef, useState } from 'react'\n\ntype UndoEntry<TExtra> = {\n signature: string\n text: string\n cursorOffset: number\n extra: TExtra\n timestamp: number\n}\n\ntype UndoBufferState<TExtra> = {\n entries: UndoEntry<TExtra>[]\n cursor: number\n}\n\nexport function useUndoBuffer<TExtra>(args: {\n maxBufferSize: number\n debounceMs: number\n}) {\n const { maxBufferSize, debounceMs } = args\n\n const [state, setState] = useState<UndoBufferState<TExtra>>({\n entries: [],\n cursor: -1,\n })\n const stateRef = useRef(state)\n useEffect(() => {\n stateRef.current = state\n }, [state])\n\n const pendingRef = useRef<Omit<UndoEntry<TExtra>, 'timestamp'> | null>(null)\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const lastPushAtRef = useRef(0)\n\n const flushPending = useCallback(() => {\n const pending = pendingRef.current\n if (!pending) return\n\n const timestamp = Date.now()\n lastPushAtRef.current = timestamp\n pendingRef.current = null\n\n setState(prev => {\n const base =\n prev.cursor >= 0 ? prev.entries.slice(0, prev.cursor + 1) : prev.entries\n\n const last = base[base.length - 1]\n if (last && last.signature === pending.signature) {\n return { ...prev, cursor: base.length - 1, entries: base }\n }\n\n const next = [...base, { ...pending, timestamp }]\n const clipped =\n next.length > maxBufferSize ? next.slice(-maxBufferSize) : next\n return { entries: clipped, cursor: clipped.length - 1 }\n })\n }, [maxBufferSize])\n\n const pushToBuffer = useCallback(\n (entry: Omit<UndoEntry<TExtra>, 'timestamp'>) => {\n pendingRef.current = entry\n\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n timeoutRef.current = null\n }\n\n const now = Date.now()\n if (now - lastPushAtRef.current < debounceMs) {\n timeoutRef.current = setTimeout(() => {\n timeoutRef.current = null\n flushPending()\n }, debounceMs)\n return\n }\n\n flushPending()\n },\n [debounceMs, flushPending],\n )\n\n const undo = useCallback((): UndoEntry<TExtra> | null => {\n const current = stateRef.current\n if (current.cursor <= 0 || current.entries.length === 0) return null\n\n const nextCursor = current.cursor - 1\n const snapshot = current.entries[nextCursor] ?? null\n setState({ ...current, cursor: nextCursor })\n return snapshot\n }, [])\n\n const clearBuffer = useCallback(() => {\n pendingRef.current = null\n lastPushAtRef.current = 0\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n timeoutRef.current = null\n }\n setState({ entries: [], cursor: -1 })\n }, [])\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n timeoutRef.current = null\n }\n }\n }, [])\n\n const canUndo = useMemo(\n () => state.cursor > 0 && state.entries.length > 1,\n [state.cursor, state.entries.length],\n )\n\n return {\n pushToBuffer,\n undo,\n canUndo,\n clearBuffer,\n }\n}\n", "import type { Key } from '#ui-ink/hooks/useKeypress'\nimport type { InputShortcut } from './permissionModeCycleShortcut'\n\ntype KeyWithOption = Key & { option?: boolean }\n\nexport type PromptInputSpecialKeyAction =\n | 'modeCycle'\n | 'modelSwitch'\n | 'externalEditor'\n | 'bashModeToggle'\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 args.inputChar === '\u03BC' ||\n (optionOrMeta && (args.inputChar === 'm' || args.inputChar === 'M')) ||\n (args.key.ctrl && (args.inputChar === 'm' || args.inputChar === 'M'))\n ) {\n return 'modelSwitch'\n }\n\n if (\n args.inputChar === '\\x07' ||\n args.inputChar === '\u00A9' ||\n (args.key.ctrl && (args.inputChar === 'g' || args.inputChar === 'G')) ||\n (optionOrMeta && (args.inputChar === 'g' || args.inputChar === 'G'))\n ) {\n return 'externalEditor'\n }\n\n if (\n args.inputChar === '\\x02' ||\n args.inputChar === '\u222B' ||\n (args.key.ctrl && (args.inputChar === 'b' || args.inputChar === 'B')) ||\n (optionOrMeta && (args.inputChar === 'b' || args.inputChar === 'B'))\n ) {\n return 'bashModeToggle'\n }\n\n return null\n}\n\nexport function __getPromptInputSpecialKeyActionForTests(\n args: Parameters<typeof getPromptInputSpecialKeyAction>[0],\n): PromptInputSpecialKeyAction {\n return getPromptInputSpecialKeyAction(args)\n}\n", "export type ContextWindowUsage = {\n input_tokens: number\n output_tokens?: number\n cache_creation_input_tokens?: number\n cache_read_input_tokens?: number\n}\n\nexport function computeContextWindowPercentages(args: {\n currentUsage: ContextWindowUsage | null | undefined\n contextWindowSize: number | null | undefined\n}): {\n used_percentage: number | null\n remaining_percentage: number | null\n} {\n const currentUsage = args.currentUsage ?? null\n const contextWindowSize = args.contextWindowSize ?? null\n\n if (!currentUsage || !contextWindowSize || contextWindowSize <= 0) {\n return { used_percentage: null, remaining_percentage: null }\n }\n\n const usedTokens =\n currentUsage.input_tokens +\n (currentUsage.cache_creation_input_tokens ?? 0) +\n (currentUsage.cache_read_input_tokens ?? 0)\n\n const raw = Math.round((usedTokens / contextWindowSize) * 100)\n const used = Math.min(100, Math.max(0, raw))\n return { used_percentage: used, remaining_percentage: 100 - used }\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 { getCommand, 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 { getCwd } from '#core/utils/state'\nimport chalk from 'chalk'\nimport * as React from 'react'\nimport { UserBashInputMessage } from '#ui-ink/components/messages/UserBashInputMessage'\nimport { UserBackgroundTaskInputMessage } from '#ui-ink/components/messages/UserBackgroundTaskInputMessage'\nimport { BashSpinner } 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 { switchCwdForResume } from '#cli-utils/switchCwdForResume'\nimport { getMessagesForSlashCommand } from './slashCommands'\nimport {\n coerceImageMediaType,\n extractAssistantText,\n} from './processUserInputHelpers'\nimport type { SetForkConvoWithMessagesOnTheNextRender } from '#ui-ink/types/conversationReset'\n\nexport async function processUserInput(\n input: string,\n mode: 'bash' | 'background' | 'prompt' | 'koding',\n setToolJSX: SetToolJSXFn<React.ReactNode>,\n context: ToolUseContext & {\n setForkConvoWithMessagesOnTheNextRender: SetForkConvoWithMessagesOnTheNextRender\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 const inputTrimmedStart = input.trimStart()\n\n // Bash commands\n if (mode === 'bash' || mode === 'background') {\n const tagName =\n mode === 'background' ? 'background-task-input' : 'bash-input'\n const userMessage = createUserMessage(`<${tagName}>${input}</${tagName}>`)\n\n // Special case: cd\n if (mode === 'bash' && input.startsWith('cd ')) {\n const newCwd = resolve(getCwd(), input.slice(3).trim())\n try {\n await switchCwdForResume(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 {mode === 'background' ? (\n <UserBackgroundTaskInputMessage\n addMargin={false}\n param={{\n text: `<background-task-input>${input}</background-task-input>`,\n type: 'text',\n }}\n />\n ) : (\n <UserBashInputMessage\n addMargin={false}\n param={{\n text: `<bash-input>${input}</bash-input>`,\n type: 'text',\n }}\n />\n )}\n <BashSpinner />\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(\n mode === 'background'\n ? { command: input, run_in_background: true }\n : { command: input },\n bashContext,\n ),\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, resultForAssistant } = lastChunk\n\n if (mode === 'background') {\n const content = resultForAssistant || 'Background task started.'\n return [\n userMessage,\n createAssistantMessage(\n `<background-task-output>${content}</background-task-output>`,\n ),\n ]\n }\n\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 (\n context.options?.disableSlashCommands !== true &&\n inputTrimmedStart.startsWith('/')\n ) {\n const words = inputTrimmedStart.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 // Slash commands can carry per-command `allowedTools` constraints. These must be\n // merged into the same permission engine as persisted rules, and inherited by\n // any forked sub-agent context spawned by the command.\n try {\n const cmd = getCommand(commandName, context.options.commands)\n const allowedTools = Array.isArray(cmd.allowedTools)\n ? cmd.allowedTools\n : []\n if (allowedTools.length > 0) {\n const prev = Array.isArray(context.options?.commandAllowedTools)\n ? context.options.commandAllowedTools\n : []\n context.options = {\n ...(context.options ?? {}),\n commandAllowedTools: [...new Set([...prev, ...allowedTools])],\n }\n }\n } catch (error) {\n logError(error)\n }\n\n const args = inputTrimmedStart.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 } 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 const theme = getTheme()\n return (\n <Box flexDirection=\"column\" marginTop={addMargin ? 1 : 0} width=\"100%\">\n <Box>\n <Text color={theme.bashBorder} bold>$</Text>\n <Text bold> {input}</Text>\n </Box>\n </Box>\n )\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 UserBackgroundTaskInputMessage({\n param: { text },\n addMargin,\n}: Props): React.ReactNode {\n const input = extractTag(text, 'background-task-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}>&amp;</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'\nimport type { SetForkConvoWithMessagesOnTheNextRender } from '#ui-ink/types/conversationReset'\n\nexport async function getMessagesForSlashCommand(\n commandName: string,\n args: string,\n setToolJSX: SetToolJSXFn<React.ReactNode>,\n context: ToolUseContext & {\n setForkConvoWithMessagesOnTheNextRender: SetForkConvoWithMessagesOnTheNextRender\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 let didMountJsx = false\n command\n .call(\n r => {\n setToolJSX(null)\n\n // Interactive local JSX commands (fullscreen overlays, selectors, etc.)\n // should not pollute the transcript with command meta messages unless\n // they explicitly return output.\n if (didMountJsx) {\n if (!r || r === NO_RESPONSE_REQUESTED) {\n resolveMessages([])\n return\n }\n resolveMessages([createAssistantMessage(r)])\n return\n }\n\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 didMountJsx = true\n setToolJSX({\n jsx,\n shouldHidePromptInput: true,\n displayMode: command.ui?.displayMode ?? 'inline',\n })\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 const baseOptions = context.options ?? {}\n // Use the context's abortController for local commands\n const result = await command.call(args, {\n ...context,\n options: {\n ...baseOptions,\n commands: baseOptions.commands ?? [],\n tools: baseOptions.tools ?? [],\n slowAndCapableModel: baseOptions.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\nfunction extractPastedTextId(placeholder: string): number | null {\n const match = placeholder.match(/\\[Pasted text #(\\d+)(?: \\+\\d+ lines)?\\]/)\n if (!match?.[1]) return null\n const id = Number(match[1])\n if (!Number.isFinite(id) || id <= 0) return null\n return id\n}\n\nfunction extractImageId(placeholder: string): number | null {\n const match = placeholder.match(/\\[Image #(\\d+)\\]/)\n if (!match?.[1]) return null\n const id = Number(match[1])\n if (!Number.isFinite(id) || id <= 0) return null\n return id\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, setPastedTextsState] = useState<PastedTextSegment[]>([])\n const [pastedImages, setPastedImagesState] = useState<\n PastedImageAttachment[]\n >([])\n const pastedTextCounter = useRef(1)\n const pastedImageCounter = useRef(1)\n\n const setPastedTexts = useCallback(\n (\n next:\n | PastedTextSegment[]\n | ((prev: PastedTextSegment[]) => PastedTextSegment[]),\n ) => {\n setPastedTextsState(prev => {\n const resolved = typeof next === 'function' ? next(prev) : next\n\n let maxId = 0\n for (const segment of resolved) {\n const id = extractPastedTextId(segment.placeholder)\n if (id && id > maxId) maxId = id\n }\n if (maxId >= pastedTextCounter.current) {\n pastedTextCounter.current = maxId + 1\n }\n\n return resolved\n })\n },\n [],\n )\n\n const setPastedImages = useCallback(\n (\n next:\n | PastedImageAttachment[]\n | ((prev: PastedImageAttachment[]) => PastedImageAttachment[]),\n ) => {\n setPastedImagesState(prev => {\n const resolved = typeof next === 'function' ? next(prev) : next\n\n let maxId = 0\n for (const segment of resolved) {\n const id = extractImageId(segment.placeholder)\n if (id && id > maxId) maxId = id\n }\n if (maxId >= pastedImageCounter.current) {\n pastedImageCounter.current = maxId + 1\n }\n\n return resolved\n })\n },\n [],\n )\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'\nimport type { SetForkConvoWithMessagesOnTheNextRender } from '#ui-ink/types/conversationReset'\n\nconst EXIT_COMMANDS = new Set(['exit', 'quit', ':q', ':q!', ':wq', ':wq!'])\n\nfunction extractPasteId(placeholder: string): number | null {\n const match = placeholder.match(\n /\\[(Pasted text|Image|\\.\\.\\.Truncated text) #(\\d+)(?: \\+\\d+ lines)?(\\.)*\\]/,\n )\n if (!match?.[2]) return null\n if (match[1] !== 'Pasted text') return null\n const id = Number(match[2])\n if (!Number.isFinite(id) || id <= 0) return null\n return id\n}\n\nfunction buildHistoryPastedContents(\n pastedTexts: PastedTextSegment[],\n): Record<number, { id: number; type: 'text'; content: string }> {\n const out: Record<number, { id: number; type: 'text'; content: string }> = {}\n for (const pasted of pastedTexts) {\n const id = extractPasteId(pasted.placeholder)\n if (!id) continue\n out[id] = { id, type: 'text', content: pasted.text }\n }\n return out\n}\n\nfunction addPromptToHistory(args: {\n display: string\n pastedTexts: PastedTextSegment[]\n}): void {\n const pastedContents = buildHistoryPastedContents(args.pastedTexts)\n if (Object.keys(pastedContents).length > 0) {\n addToHistory({ display: args.display, pastedContents })\n return\n }\n addToHistory(args.display)\n}\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: SetForkConvoWithMessagesOnTheNextRender\n onShowMessageSelector?: () => 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 addPromptToHistory({\n display: args.mode === 'koding' ? `#${args.input}` : args.input,\n pastedTexts: args.pastedTexts,\n })\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' && effectiveMode !== 'background') {\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 openMessageSelector: args.onShowMessageSelector,\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 addPromptToHistory({ display: args.input, pastedTexts: args.pastedTexts })\n args.resetHistory()\n args.setIsLoading(false)\n return\n }\n\n const shouldUpdatePwdAfterBash =\n effectiveMode === 'bash' || effectiveMode === 'background'\n\n // Save prompt to history immediately after we successfully construct the user messages.\n // This ensures history is preserved even if the query is aborted (e.g. Escape) or errors mid-flight.\n const inputToAdd =\n effectiveMode === 'bash'\n ? `!${args.input}`\n : effectiveMode === 'background'\n ? `&${args.input}`\n : args.input\n\n if (newMessages.some(message => message.type === 'user')) {\n addPromptToHistory({ display: inputToAdd, pastedTexts: args.pastedTexts })\n args.resetHistory()\n }\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", "import type { ReactNode } from 'react'\nimport type { Command } from '#cli-commands'\nimport type { Message } from '#core/query'\nimport type { SetToolJSXFn } from '#core/tooling/Tool'\nimport type { Tool } from '#core/tooling/Tool'\nimport type { SetForkConvoWithMessagesOnTheNextRender } from '#ui-ink/types/conversationReset'\n\nexport type PromptMode = 'bash' | 'background' | 'prompt' | 'koding'\n\nexport function toggleBashMode(current: PromptMode): PromptMode {\n return current === 'bash' ? 'prompt' : 'bash'\n}\n\nexport type PromptInputProps = {\n commands: Command[]\n forkNumber: number\n messageLogName: string\n initialPrompt?: string\n disableSlashCommands?: boolean\n isDisabled: boolean\n isLoading: boolean\n onQuery: (\n newMessages: Message[],\n abortController?: AbortController,\n ) => Promise<void>\n debug: boolean\n verbose: boolean\n messages: Message[]\n setToolJSX: SetToolJSXFn<ReactNode>\n tools: Tool[]\n input: string\n onInputChange: (value: string) => void\n mode: PromptMode\n onModeChange: (mode: PromptMode) => void\n submitCount: number\n onSubmitCountChange: (updater: (prev: number) => number) => void\n setIsLoading: (isLoading: boolean) => void\n setAbortController: (abortController: AbortController | null) => void\n onShowMessageSelector: () => void\n setForkConvoWithMessagesOnTheNextRender: SetForkConvoWithMessagesOnTheNextRender\n readFileTimestamps: { [filename: string]: number }\n abortController: AbortController | null\n onModelChange?: () => void\n uiRefreshCounter?: number\n onManageTasks?: () => void\n shortcutsOpen?: boolean\n restorePastes?: {\n id: number\n pastedTexts: Array<{ placeholder: string; text: string }>\n pastedImages: Array<{\n placeholder: string\n data: string\n mediaType: string\n }>\n }\n onRestorePastesApplied?: (id: number) => void\n draftPastes?: {\n pastedTexts: Array<{ placeholder: string; text: string }>\n pastedImages: Array<{\n placeholder: string\n data: string\n mediaType: string\n }>\n }\n onDraftPastesChange?: (next: {\n pastedTexts: Array<{ placeholder: string; text: string }>\n pastedImages: Array<{\n placeholder: string\n data: string\n mediaType: string\n }>\n }) => void\n}\n", "import { Box, Text } 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 { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\nimport type { Key } from '#ui-ink/hooks/useKeypress'\nimport type { PermissionMode } from '#core/types/PermissionMode'\nimport type { Theme } from '#core/utils/theme'\nimport type { PromptMode } from './types'\nimport { PromptInputCompletionPanel } from './PromptInputCompletionPanel'\nimport { PendingPrompts } from './PendingPrompts'\nimport { QueuedPrompts } from './QueuedPrompts'\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 }\ntype ToastMessageState = {\n show: boolean\n text?: string\n kind?: 'info' | 'success' | 'warning' | 'error'\n}\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 pendingPrompts,\n queuedPrompts,\n completionActive,\n historyIndex,\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 clearInputPending,\n rewindPending,\n modelSwitchMessage,\n toastMessage,\n statusLine,\n statusLinePadding,\n currentMode,\n modeCycleShortcutText,\n showQuickModelSwitchShortcut,\n tokenUsage,\n textInputColumns,\n textInputMaxHeight,\n completionReservedRows,\n isInFastBrowseMode,\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 pendingPrompts: string[]\n queuedPrompts: string[]\n completionActive: boolean\n historyIndex: number\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 clearInputPending: boolean\n rewindPending: boolean\n modelSwitchMessage: InlineMessageState\n toastMessage: ToastMessageState\n statusLine: string | null\n statusLinePadding: number\n currentMode: PermissionMode\n modeCycleShortcutText: string\n showQuickModelSwitchShortcut: boolean\n tokenUsage: number\n textInputColumns: number\n textInputMaxHeight: number\n completionReservedRows: number\n isInFastBrowseMode: () => boolean\n}): React.ReactNode {\n const { rows, columns } = useTerminalSize()\n const compact = rows < 16\n const showStatusLine = rows > 8\n\n return (\n <Box flexDirection=\"column\">\n {/* Model info - top right of input */}\n {modelInfo && !compact && (\n <Box justifyContent=\"flex-end\" flexDirection=\"row\">\n <Text dimColor wrap=\"truncate-end\">\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 {pendingPrompts.length > 0 && (\n <PendingPrompts pendingPrompts={pendingPrompts} width={columns} />\n )}\n\n {queuedPrompts.length > 0 && (\n <QueuedPrompts queuedPrompts={queuedPrompts} width={columns} />\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' || mode === 'background'\n ? theme.bashBorder\n : mode === 'koding'\n ? theme.notingBorder\n : theme.inputBorder\n }\n borderDimColor={false}\n borderStyle=\"single\"\n width=\"100%\"\n >\n <Box\n alignItems=\"flex-start\"\n alignSelf=\"flex-start\"\n flexWrap=\"nowrap\"\n justifyContent=\"flex-start\"\n width={2}\n >\n {mode === 'bash' ? (\n <Text color={theme.bashBorder}>$&nbsp;</Text>\n ) : mode === 'background' ? (\n <Text color={theme.bashBorder}>&amp;&nbsp;</Text>\n ) : mode === 'koding' ? (\n <Text color={theme.noting}>#&nbsp;</Text>\n ) : (\n <Text color={isLoading ? theme.secondaryText : undefined}>\n {'\\u276F'}&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 maxHeight={textInputMaxHeight}\n isDimmed={isDisabled || isLoading || isEditingExternally}\n disableCursorMovementForUpDownKeys={() =>\n completionActive ||\n historyIndex > 0 ||\n !input.includes('\\n') ||\n isInFastBrowseMode()\n }\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 {!compact && (\n <Box flexDirection=\"row\" paddingX={1}>\n <Text dimColor wrap=\"truncate-end\">\n {currentPwd}\n </Text>\n </Box>\n )}\n\n {/* Status line - below PWD */}\n {!completionActive && suggestions.length === 0 && showStatusLine && (\n <Box flexDirection=\"column\">\n <Box\n flexDirection=\"row\"\n justifyContent=\"space-between\"\n paddingX={1 + Math.max(0, statusLinePadding)}\n >\n <Box justifyContent=\"flex-start\" gap={1}>\n {exitMessage.show ? (\n <Text dimColor wrap=\"truncate-end\">\n Press {exitMessage.key} again to exit\n </Text>\n ) : message.show ? (\n <Text dimColor wrap=\"truncate-end\">\n {message.text}\n </Text>\n ) : rewindPending ? (\n <Text dimColor wrap=\"truncate-end\">\n Press Escape again to rewind\n </Text>\n ) : clearInputPending ? (\n <Text dimColor wrap=\"truncate-end\">\n Press Escape again to clear input\n </Text>\n ) : modelSwitchMessage.show ? (\n <Text color={theme.success} wrap=\"truncate-end\">\n {modelSwitchMessage.text}\n </Text>\n ) : toastMessage.show ? (\n <Text\n color={\n toastMessage.kind === 'error'\n ? theme.error\n : toastMessage.kind === 'warning'\n ? theme.warning\n : toastMessage.kind === 'success'\n ? theme.success\n : theme.secondaryText\n }\n wrap=\"truncate-end\"\n >\n {toastMessage.text}\n </Text>\n ) : statusLine ? (\n <Text dimColor wrap=\"truncate-end\">\n {statusLine}\n </Text>\n ) : null}\n </Box>\n {!compact && (\n <SentryErrorBoundary\n children={\n <Box justifyContent=\"flex-end\" gap={1}>\n <TokenWarning tokenUsage={tokenUsage} />\n </Box>\n }\n />\n )}\n </Box>\n {!compact && mode === 'prompt' && currentMode !== 'default' && (\n <Box paddingX={1}>\n <CompactModeIndicator />\n </Box>\n )}\n </Box>\n )}\n\n {completionActive && suggestions.length > 0 && (\n <PromptInputCompletionPanel\n theme={theme}\n suggestions={suggestions}\n selectedIndex={selectedIndex}\n emptyDirMessage={emptyDirMessage}\n tokenUsage={tokenUsage}\n reservedRows={completionReservedRows}\n />\n )}\n </Box>\n )\n}\n", "import React from 'react'\nimport { Box, Text } from 'ink'\nimport { usePermissionContext } from '#ui-ink/contexts/PermissionContext'\nimport { getTheme, type Theme } from '#core/utils/theme'\nimport { getPermissionModeCycleShortcut } from '#ui-ink/utils/permissionModeCycleShortcut'\nimport type { PermissionMode } from '#core/types/PermissionMode'\nimport { normalizePermissionMode } 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 const normalized = normalizePermissionMode(currentMode)\n\n const indicator = __getModeIndicatorDisplayForTests({\n mode: normalized,\n shortcutDisplayText: shortcut.displayText,\n theme,\n })\n\n if (!indicator.shouldRender && !showTransitionCount) {\n return null\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 const normalized = normalizePermissionMode(args.mode)\n\n const icon = getModeIndicatorIcon(normalized)\n const label = getModeIndicatorLabel(normalized).toLowerCase()\n const color = getModeIndicatorColor(args.theme, normalized)\n\n return {\n shouldRender: true,\n color,\n mainText: icon ? `${icon} ${label} mode` : `${label} mode`,\n shortcutHintText: ` (${args.shortcutDisplayText} to cycle)`,\n }\n}\n\nfunction getModeIndicatorLabel(mode: PermissionMode): string {\n switch (normalizePermissionMode(mode)) {\n case 'yolo':\n return 'YOLO'\n case 'cautious':\n return 'Ask'\n case 'plan':\n return 'Plan'\n case 'acceptEdits':\n return 'Accept Edits'\n case 'bypassPermissions':\n return 'Bypass'\n case 'dontAsk':\n return \"Don't Ask\"\n default:\n return 'Unknown'\n }\n}\n\nfunction getModeIndicatorIcon(mode: PermissionMode): string {\n switch (normalizePermissionMode(mode)) {\n case 'yolo':\n return ''\n case 'cautious':\n return '??'\n case 'plan':\n return '||'\n case 'acceptEdits':\n return '>>'\n case 'bypassPermissions':\n return '\uD83D\uDE80'\n case 'dontAsk':\n return 'X'\n default:\n return ''\n }\n}\n\nfunction getModeIndicatorColor(theme: Theme, mode: PermissionMode): string {\n switch (normalizePermissionMode(mode)) {\n case 'yolo':\n return theme.secondaryText\n case 'cautious':\n return theme.warning\n case 'plan':\n return theme.success\n case 'acceptEdits':\n return theme.autoAccept\n case 'bypassPermissions':\n case 'dontAsk':\n return theme.error\n default:\n return theme.secondaryText\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 const normalized = normalizePermissionMode(currentMode)\n\n const indicator = __getModeIndicatorDisplayForTests({\n mode: normalized,\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} wrap=\"truncate-end\">\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'\nimport { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\nimport wrapAnsi from 'wrap-ansi'\n\ntype Suggestion = {\n type: string\n value: string\n displayValue: string\n description?: string\n metadata?: { color?: string }\n}\n\nconst MAX_COMPLETION_PANEL_ROWS = 10\n\n// \u4F7F\u7528 React.memo \u4F18\u5316\u5EFA\u8BAE\u5217\u8868\u6E32\u67D3\nconst SuggestionItem = React.memo(\n ({\n suggestion,\n isSelected,\n theme,\n }: {\n suggestion: Suggestion\n isSelected: boolean\n theme: Theme\n }) => {\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 flexDirection=\"row\">\n <Text\n bold\n color={displayColor}\n dimColor={!isSelected && !displayColor}\n wrap=\"truncate-end\"\n >\n {isSelected ? '> ' : ' '}\n {suggestion.displayValue}\n </Text>\n </Box>\n )\n },\n (prevProps, nextProps) => {\n // \u53EA\u5728\u9009\u4E2D\u72B6\u6001\u6216\u5EFA\u8BAE\u5185\u5BB9\u6539\u53D8\u65F6\u91CD\u65B0\u6E32\u67D3\n return (\n prevProps.isSelected === nextProps.isSelected &&\n prevProps.suggestion.value === nextProps.suggestion.value &&\n prevProps.suggestion.displayValue === nextProps.suggestion.displayValue\n )\n },\n)\n\nSuggestionItem.displayName = 'SuggestionItem'\n\n// \u4F7F\u7528 React.memo \u4F18\u5316\u5E2E\u52A9\u6587\u672C\u7EC4\u4EF6\nconst HelpText = React.memo(\n ({\n emptyDirMessage,\n selectedSuggestion,\n maxWidth,\n }: {\n emptyDirMessage: string\n selectedSuggestion?: Suggestion\n maxWidth: number\n }) => {\n const getHelpMessage = () => {\n if (emptyDirMessage) return emptyDirMessage\n if (!selectedSuggestion) {\n return '\u2191\u2193 navigate \u2022 \u2192 accept \u2022 Tab cycle \u2022 Esc close'\n }\n if (selectedSuggestion.value.endsWith('/')) {\n return '\u2192 enter directory \u2022 \u2191\u2193 navigate \u2022 Tab cycle \u2022 Esc close'\n }\n if (selectedSuggestion.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\n const commandDescription =\n !emptyDirMessage &&\n selectedSuggestion?.type === 'command' &&\n typeof selectedSuggestion.description === 'string'\n ? selectedSuggestion.description.trim()\n : ''\n\n if (commandDescription) {\n const wrapped = wrapAnsi(commandDescription, Math.max(1, maxWidth), {\n hard: true,\n trim: false,\n })\n const lines = wrapped.split('\\n')\n\n // Keep help text to a single terminal row to avoid layout jumps/flicker\n // when the completion panel is shown on small terminals.\n const firstLine = (lines[0] ?? '').replace(/\\s+$/g, '')\n const limited =\n lines.length > 1 && firstLine.length > 0 ? `${firstLine}\u2026` : firstLine\n return (\n <Text dimColor wrap=\"truncate-end\">\n {limited}\n </Text>\n )\n }\n\n return (\n <Text\n dimColor={!emptyDirMessage}\n color={emptyDirMessage ? 'yellow' : undefined}\n wrap=\"truncate-end\"\n >\n {getHelpMessage()}\n </Text>\n )\n },\n (prevProps, nextProps) => {\n return (\n prevProps.emptyDirMessage === nextProps.emptyDirMessage &&\n prevProps.selectedSuggestion?.value ===\n nextProps.selectedSuggestion?.value &&\n prevProps.selectedSuggestion?.description ===\n nextProps.selectedSuggestion?.description &&\n prevProps.maxWidth === nextProps.maxWidth\n )\n },\n)\n\nHelpText.displayName = 'HelpText'\n\nexport function __getSuggestionWindowForTests(args: {\n rows: number\n selectedIndex: number\n suggestionCount: number\n reservedRows?: number\n}) {\n const reservedRows = Math.max(1, args.reservedRows ?? 10)\n const panelRows = Math.min(\n MAX_COMPLETION_PANEL_ROWS,\n Math.max(1, args.rows - reservedRows),\n )\n const showHelp = panelRows >= 4\n const helpRows = showHelp ? 1 : 0\n const listRows = Math.max(1, panelRows - helpRows)\n\n const suggestionCount = Math.max(0, args.suggestionCount)\n const selectedIndex = Math.max(\n 0,\n Math.min(args.selectedIndex, Math.max(0, suggestionCount - 1)),\n )\n\n if (suggestionCount === 0) {\n return {\n startIndex: 0,\n endIndex: 0,\n hiddenAbove: 0,\n hiddenBelow: 0,\n showHelp,\n showTopEllipsis: false,\n showBottomEllipsis: false,\n }\n }\n\n const canShowEllipsis = listRows >= 3\n let showTopEllipsis = canShowEllipsis\n let showBottomEllipsis = canShowEllipsis\n\n let startIndex = 0\n let endIndex = 0\n let hiddenAbove = 0\n let hiddenBelow = 0\n\n for (let i = 0; i < 3; i += 1) {\n const ellipsisRows =\n (showTopEllipsis ? 1 : 0) + (showBottomEllipsis ? 1 : 0)\n const visibleCount = Math.max(\n 1,\n Math.min(suggestionCount, listRows - ellipsisRows),\n )\n\n startIndex = Math.max(\n 0,\n Math.min(\n selectedIndex - Math.floor(visibleCount / 2),\n suggestionCount - visibleCount,\n ),\n )\n endIndex = startIndex + visibleCount\n hiddenAbove = startIndex\n hiddenBelow = Math.max(0, suggestionCount - endIndex)\n\n const nextShowTop = canShowEllipsis && hiddenAbove > 0\n const nextShowBottom = canShowEllipsis && hiddenBelow > 0\n\n if (\n nextShowTop === showTopEllipsis &&\n nextShowBottom === showBottomEllipsis\n ) {\n break\n }\n showTopEllipsis = nextShowTop\n showBottomEllipsis = nextShowBottom\n }\n\n return {\n startIndex,\n endIndex,\n hiddenAbove,\n hiddenBelow,\n showHelp,\n showTopEllipsis,\n showBottomEllipsis,\n }\n}\n\nexport const PromptInputCompletionPanel = React.memo(\n function PromptInputCompletionPanel({\n theme,\n suggestions,\n selectedIndex,\n emptyDirMessage,\n tokenUsage,\n reservedRows = 10,\n }: {\n theme: Theme\n suggestions: Suggestion[]\n selectedIndex: number\n emptyDirMessage: string\n tokenUsage: number\n reservedRows?: number\n }): React.ReactNode {\n const { rows, columns } = useTerminalSize()\n const helpWidth = Math.max(1, columns - 6)\n const window = __getSuggestionWindowForTests({\n rows,\n selectedIndex,\n suggestionCount: suggestions.length,\n reservedRows,\n })\n const visibleSuggestions = suggestions.slice(\n window.startIndex,\n window.endIndex,\n )\n\n const selectedSuggestion = suggestions[selectedIndex]\n\n return (\n <Box flexDirection=\"row\" justifyContent=\"space-between\" paddingX={2}>\n <Box flexDirection=\"column\">\n {window.showTopEllipsis && window.hiddenAbove > 0 && (\n <Text\n dimColor\n wrap=\"truncate-end\"\n >{`... ${window.hiddenAbove} more above ...`}</Text>\n )}\n {visibleSuggestions.map((suggestion, index) => (\n <SuggestionItem\n key={`${suggestion.type}-${suggestion.value}-${window.startIndex + index}`}\n suggestion={suggestion}\n isSelected={window.startIndex + index === selectedIndex}\n theme={theme}\n />\n ))}\n {window.showBottomEllipsis && window.hiddenBelow > 0 && (\n <Text\n dimColor\n wrap=\"truncate-end\"\n >{`... ${window.hiddenBelow} more below ...`}</Text>\n )}\n {window.showHelp && (\n <HelpText\n emptyDirMessage={emptyDirMessage}\n selectedSuggestion={selectedSuggestion}\n maxWidth={helpWidth}\n />\n )}\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 (prevProps, nextProps) => {\n // \u53EA\u5728\u8FD9\u4E9B\u5173\u952E\u5C5E\u6027\u6539\u53D8\u65F6\u91CD\u65B0\u6E32\u67D3\u6574\u4E2A\u9762\u677F\uFF08\u4FDD\u8BC1\u6B63\u786E\u6027\uFF1A\u4E0D\u8981\u5BF9 suggestions \u505A\u4E0D\u5B89\u5168\u7684\u201C\u62BD\u6837\u6BD4\u8F83\u201D\uFF09\n return (\n prevProps.theme === nextProps.theme &&\n prevProps.selectedIndex === nextProps.selectedIndex &&\n prevProps.suggestions === nextProps.suggestions &&\n prevProps.emptyDirMessage === nextProps.emptyDirMessage &&\n prevProps.tokenUsage === nextProps.tokenUsage &&\n prevProps.reservedRows === nextProps.reservedRows\n )\n },\n)\n", "import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { useMemo } from 'react'\nimport { wrapLines } from '#ui-ink/primitives/text/wrapLines'\nimport { getCachedStringWidth } from '#cli-utils/textWidth'\n\nconst FIRST_LINE_PREFIX = ' \u203A '\nconst WRAPPED_LINE_PREFIX = ' '\nconst MORE_PENDING_PREFIX = ' \u2026 '\nconst ELLIPSIS_LINE = ' \u2026'\n\nexport function __getPendingPromptLinesForTests(args: {\n pendingPrompts: string[]\n width: number\n maxMessages?: number\n maxLinesPerMessage?: number\n}): string[] {\n const safeWidth = Math.max(1, args.width)\n const maxMessages = Math.max(1, args.maxMessages ?? 6)\n const maxLinesPerMessage = Math.max(1, args.maxLinesPerMessage ?? 3)\n if (safeWidth < 8) return []\n if (args.pendingPrompts.length === 0) return []\n\n const hiddenEarlierCount = Math.max(0, args.pendingPrompts.length - maxMessages)\n const visiblePrompts =\n hiddenEarlierCount > 0\n ? args.pendingPrompts.slice(-maxMessages)\n : args.pendingPrompts\n\n const prefixWidth = getCachedStringWidth(WRAPPED_LINE_PREFIX)\n const contentWidth = Math.max(1, safeWidth - prefixWidth)\n\n const lines: string[] = []\n\n if (hiddenEarlierCount > 0) {\n lines.push(`${MORE_PENDING_PREFIX}(+${hiddenEarlierCount} earlier)`)\n }\n\n for (const raw of visiblePrompts) {\n const message = raw.trim()\n if (!message) continue\n\n const wrapped = wrapLines(message.split('\\n'), contentWidth)\n const visible = wrapped.slice(0, maxLinesPerMessage)\n\n visible.forEach((line, index) => {\n lines.push(\n index === 0\n ? `${FIRST_LINE_PREFIX}${line}`\n : `${WRAPPED_LINE_PREFIX}${line}`,\n )\n })\n\n if (wrapped.length > maxLinesPerMessage) {\n lines.push(ELLIPSIS_LINE)\n }\n }\n\n return lines\n}\n\nexport function PendingPrompts({\n pendingPrompts,\n width,\n}: {\n pendingPrompts: string[]\n width: number\n}): React.ReactNode {\n const lines = useMemo(\n () => __getPendingPromptLinesForTests({ pendingPrompts, width }),\n [pendingPrompts, width],\n )\n\n if (lines.length === 0) return null\n\n return (\n <Box flexDirection=\"column\">\n {lines.map((line, index) => (\n <Text key={index} wrap=\"truncate-end\">\n {line}\n </Text>\n ))}\n </Box>\n )\n}\n\n", "import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { useMemo } from 'react'\nimport { wrapLines } from '#ui-ink/primitives/text/wrapLines'\nimport { getCachedStringWidth } from '#cli-utils/textWidth'\n\nconst FIRST_LINE_PREFIX = ' \u21B3 '\nconst WRAPPED_LINE_PREFIX = ' '\nconst MORE_QUEUED_PREFIX = ' \u2026 '\nconst ELLIPSIS_LINE = ' \u2026'\n\nexport function __getQueuedPromptLinesForTests(args: {\n queuedPrompts: string[]\n width: number\n maxMessages?: number\n maxLinesPerMessage?: number\n}): string[] {\n const safeWidth = Math.max(1, args.width)\n const maxMessages = Math.max(1, args.maxMessages ?? 8)\n const maxLinesPerMessage = Math.max(1, args.maxLinesPerMessage ?? 3)\n if (safeWidth < 8) return []\n if (args.queuedPrompts.length === 0) return []\n\n const hiddenEarlierCount = Math.max(0, args.queuedPrompts.length - maxMessages)\n const visiblePrompts =\n hiddenEarlierCount > 0\n ? args.queuedPrompts.slice(-maxMessages)\n : args.queuedPrompts\n\n const prefixWidth = getCachedStringWidth(WRAPPED_LINE_PREFIX)\n const contentWidth = Math.max(1, safeWidth - prefixWidth)\n\n const lines: string[] = []\n\n if (hiddenEarlierCount > 0) {\n lines.push(`${MORE_QUEUED_PREFIX}(+${hiddenEarlierCount} earlier)`)\n }\n\n for (const raw of visiblePrompts) {\n const message = raw.trim()\n if (!message) continue\n\n const wrapped = wrapLines(message.split('\\n'), contentWidth)\n const visible = wrapped.slice(0, maxLinesPerMessage)\n\n visible.forEach((line, index) => {\n lines.push(\n index === 0 ? `${FIRST_LINE_PREFIX}${line}` : `${WRAPPED_LINE_PREFIX}${line}`,\n )\n })\n\n if (wrapped.length > maxLinesPerMessage) {\n lines.push(ELLIPSIS_LINE)\n }\n }\n\n return lines\n}\n\nexport function QueuedPrompts({\n queuedPrompts,\n width,\n}: {\n queuedPrompts: string[]\n width: number\n}): React.ReactNode {\n const lines = useMemo(\n () => __getQueuedPromptLinesForTests({ queuedPrompts, width }),\n [queuedPrompts, width],\n )\n\n if (lines.length === 0) return null\n\n return (\n <Box flexDirection=\"column\">\n {lines.map((line, index) => (\n <Text key={index} dimColor italic wrap=\"truncate-end\">\n {line}\n </Text>\n ))}\n </Box>\n )\n}\n\n", "import { useCallback, useState } from 'react'\nimport { launchExternalEditor } from '#cli-utils/externalEditor'\nimport { terminalCapabilityManager } from '#ui-ink/utils/terminalCapabilityManager'\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 terminalCapabilityManager.enableSupportedModes()\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: switchResult.message || `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 = 'No models configured. Use /model to add models.'\n } else if (debugInfo.activeModels === 0) {\n errorMessage = `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 = `Only 1 active model out of ${debugInfo.totalModels} total models: ${allModelNames}. All configured models will be activated for switching.`\n } else {\n errorMessage = `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, 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 SPINNER_FRAMES = ['\u280B', '\u2819', '\u2839', '\u2838', '\u283C', '\u2834', '\u2826', '\u2827', '\u2807', '\u280F']\n\nfunction getLabel(status: RequestStatus): string {\n switch (status.kind) {\n case 'thinking':\n return 'Prefilling'\n case 'streaming':\n return 'Decoding'\n default:\n return ''\n }\n}\n\nfunction formatDuration(seconds: number): string {\n if (seconds < 60) {\n return `${seconds}s`\n }\n if (seconds < 3600) {\n const minutes = Math.floor(seconds / 60)\n const secs = seconds % 60\n return `${minutes}m ${secs}s`\n }\n const hours = Math.floor(seconds / 3600)\n const minutes = Math.floor((seconds % 3600) / 60)\n const secs = seconds % 60\n return `${hours}h ${minutes}m ${secs}s`\n}\n\nfunction formatTokens(tokens: number): string {\n if (tokens >= 1000) {\n return `${(tokens / 1000).toFixed(1)}k`\n }\n return tokens.toString()\n}\n\nfunction getTokenDisplay(status: RequestStatus): string {\n if (status.kind === 'thinking' && status.inputTokens) {\n return ` \u00B7 \u2191 ${formatTokens(status.inputTokens)}`\n }\n if (status.kind === 'streaming' && status.outputTokens !== undefined) {\n return ` \u00B7 \u2193 ${formatTokens(status.outputTokens)}`\n }\n return ''\n}\n\nexport function RequestStatusIndicator(): React.ReactNode {\n const frames = SPINNER_FRAMES\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>(Date.now())\n\n useEffect(() => {\n const initialStatus = getRequestStatus()\n if (initialStatus.kind !== 'idle') {\n requestStartTime.current = Date.now()\n }\n\n return subscribeRequestStatus(next => {\n setStatus(next)\n if (next.kind !== 'idle') {\n setElapsedTime(Math.floor((Date.now() - requestStartTime.current) / 1000))\n }\n if (next.kind === 'idle') {\n requestStartTime.current = Date.now()\n setElapsedTime(0)\n }\n })\n }, [])\n\n useEffect(() => {\n const timer = setInterval(() => {\n setFrame(f => (f + 1) % frames.length)\n }, 80)\n return () => clearInterval(timer)\n }, [frames.length])\n\n useEffect(() => {\n const timer = setInterval(() => {\n setElapsedTime(Math.floor((Date.now() - requestStartTime.current) / 1000))\n }, 1000)\n return () => clearInterval(timer)\n }, [])\n\n if (status.kind === 'tool' || status.kind === 'idle') {\n return null\n }\n\n return (\n <Box flexDirection=\"row\" marginTop={1}>\n <Text color={theme.kode} bold>\n {frames[frame]} {getLabel(status)}\n </Text>\n <Text color={theme.secondaryText}>\n {' '}:: {formatDuration(elapsedTime)} (Esc to interrupt)\n {getTokenDisplay(status)}\n </Text>\n </Box>\n )\n}\n", "import { Box, Text } from 'ink'\nimport React from 'react'\nimport { Select } from './CustomSelect/select'\nimport { getTheme } from '#core/utils/theme'\nimport Link from './Link'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\n\ninterface Props {\n onDone: () => void\n}\n\nexport function CostThresholdDialog({ onDone }: Props): React.ReactNode {\n const layout = useScreenLayout()\n\n // Handle Ctrl+C, Ctrl+D and Esc\n useKeypress((input, key) => {\n if ((key.ctrl && (input === 'c' || input === 'd')) || key.escape) {\n onDone()\n }\n })\n\n return (\n <Box marginTop={1} width=\"100%\">\n <ScreenFrame\n title=\"Usage cost notice\"\n paddingX={layout.paddingX}\n paddingY={layout.tightLayout ? 0 : layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Box flexDirection=\"column\">\n <Text bold>\n You&apos;ve spent $5 on AI model API calls this session.\n </Text>\n <Text dimColor>\n Learn more about monitoring your AI usage costs:\n </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 <Text dimColor wrap=\"truncate-end\">\n Esc to close\n </Text>\n </Box>\n </ScreenFrame>\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({\n url,\n children,\n fallback = true,\n}: 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 } 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'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\nimport { Divider } from '#ui-ink/primitives/components/Divider'\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 { rows, columns } = useTerminalSize()\n const [focused, setFocus] = useState('no-preference')\n const [focusValue, setFocusValue] = useState<string | undefined>(undefined)\n const exitState = useExitOnCtrlCD(() => process.exit(1))\n\n // Keep a bottom margin to avoid terminal scroll/flicker when Ink re-renders near the last row.\n // Reserve 1 row for the exit/hint line rendered outside the bordered panel.\n const panelHeight = Math.max(1, rows - 2)\n\n useKeypress((_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={panelHeight}\n width=\"100%\"\n paddingX={1}\n >\n <Box width=\"100%\" justifyContent=\"space-between\">\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 <Divider width={Math.max(1, columns - 2)} />\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}>\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 isTransient?: boolean\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 isTransient,\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 isTransient={isTransient}\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 isTransient,\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 isTransient?: boolean\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 isTransient={isTransient}\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/contexts/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 return `pattern: \"${pattern}\"${absolutePath ? `, path: \"${absolutePath}\"` : ''}`\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 // Compatibility: 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>{fullFilePath}</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\nconst MAX_HUNKS_TO_RENDER = 4\nconst MAX_DIFF_LINES_TO_RENDER = 200\n\nfunction truncateHunks(hunks: Hunk[]): {\n hunks: Hunk[]\n hiddenHunks: number\n hiddenLines: number\n} {\n if (hunks.length === 0) {\n return { hunks: [], hiddenHunks: 0, hiddenLines: 0 }\n }\n\n let remainingLines = MAX_DIFF_LINES_TO_RENDER\n const kept: Hunk[] = []\n let hiddenLines = 0\n\n for (const hunk of hunks) {\n if (kept.length >= MAX_HUNKS_TO_RENDER) {\n hiddenLines += hunk.lines.length\n continue\n }\n\n if (remainingLines <= 0) {\n hiddenLines += hunk.lines.length\n continue\n }\n\n if (hunk.lines.length <= remainingLines) {\n kept.push(hunk)\n remainingLines -= hunk.lines.length\n continue\n }\n\n const visible = hunk.lines.slice(0, remainingLines)\n hiddenLines += hunk.lines.length - visible.length\n kept.push({\n ...hunk,\n lines: [...visible, `... (+${hiddenLines} more diff lines)`],\n })\n remainingLines = 0\n }\n\n const hiddenHunks = Math.max(0, hunks.length - kept.length)\n return { hunks: kept, hiddenHunks, hiddenLines }\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 const diff = React.useMemo(() => truncateHunks(patches), [patches])\n\n return (\n <Box flexDirection=\"column\">\n <Text>\n {' '}\u23BF Updated <Text bold>{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 {verbose &&\n diff.hunks.length > 0 &&\n intersperse(\n diff.hunks.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 {verbose && diff.hiddenLines > 0 && (\n <Box paddingLeft={5} marginTop={1}>\n <Text color={getTheme().secondaryText}>\n ... (+{diff.hiddenLines} more diff lines hidden)\n </Text>\n </Box>\n )}\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 { 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 // Compatibility: 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>{output.filePath}</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 { 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 { ToolResultBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { Box, Text } 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 if (!message.toolUseResult) {\n const contentText = typeof param.content === 'string' ? param.content : null\n return (\n <Box flexDirection=\"column\" width={width}>\n <Text dimColor wrap=\"truncate-end\">\n Tool output unavailable (missing persisted tool result data).\n </Text>\n {contentText ? <Text>{contentText}</Text> : null}\n </Box>\n )\n }\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 { 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 theme = getTheme()\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 const isError = erroredToolUseIDs.has(param.id)\n const isInProgress = inProgressToolUseIDs.has(param.id)\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 // Compatibility: 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\n // Determine colors based on state\n const toolNameColor = isQueued\n ? theme.secondaryText\n : isError\n ? theme.error\n : theme.kode\n const paramColor = theme.secondaryText\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 flexWrap=\"nowrap\">\n {shouldShowDot && (\n <ToolUseLoader\n shouldAnimate={shouldAnimate}\n isUnresolved={unresolvedToolUseIDs.has(param.id)}\n isError={isError}\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={!isQueued}\n children={String(userFacingToolName || '')}\n />\n ) : (\n hasToolName && (\n <Text color={toolNameColor} bold={!isQueued} wrap=\"truncate-end\">\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={paramColor}>(</Text>\n {toolMessage}\n <Text color={paramColor}>)</Text>\n </Box>\n )\n }\n\n if (typeof toolMessage !== 'string') return null\n\n if (!hasToolName) {\n return (\n <Text color={paramColor} wrap=\"truncate-end\">\n {toolMessage}\n </Text>\n )\n }\n\n // If it's a string, wrap it in Text with dimmed parameters\n return (\n <Text color={paramColor} wrap=\"truncate-end\">\n ({toolMessage})\n </Text>\n )\n })()}\n {isInProgress && (\n <Text color={paramColor} wrap=\"truncate-end\">\n ...\n </Text>\n )}\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 {\n CHECKMARK,\n CROSS,\n DIAMOND_HOLLOW,\n DIAMOND_FILLED,\n} from '#core/constants/figures'\n\nconst SPINNER_FRAMES = ['\u280B', '\u2819', '\u2839', '\u2838', '\u283C', '\u2834', '\u2826', '\u2827', '\u2807', '\u280F']\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 [frameIndex, setFrameIndex] = React.useState(0)\n\n useInterval(() => {\n if (!shouldAnimate) {\n return\n }\n setFrameIndex(i => (i + 1) % SPINNER_FRAMES.length)\n }, 80)\n\n const theme = getTheme()\n\n if (shouldAnimate) {\n return (\n <Box minWidth={2}>\n <Text color={theme.kode}>{SPINNER_FRAMES[frameIndex]} </Text>\n </Box>\n )\n }\n\n if (isError) {\n return (\n <Box minWidth={2}>\n <Text color={theme.error}>{CROSS} </Text>\n </Box>\n )\n }\n\n if (isUnresolved) {\n return (\n <Box minWidth={2}>\n <Text color={theme.secondaryText}>{DIAMOND_HOLLOW} </Text>\n </Box>\n )\n }\n\n return (\n <Box minWidth={2}>\n <Text color=\"green\">{CHECKMARK} </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, { useState, useEffect } 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\nconst PROGRESS_FRAMES = ['/', '-', '\\\\', '|']\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 const [progressFrame, setProgressFrame] = useState(0)\n const theme = getTheme()\n\n useEffect(() => {\n const timer = setInterval(() => {\n setProgressFrame(f => (f + 1) % PROGRESS_FRAMES.length)\n }, 150)\n return () => clearInterval(timer)\n }, [])\n\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={theme.kode} bold>\n {'\u25C6'} [Thinking {PROGRESS_FRAMES[progressFrame]}]\n </Text>\n <Box paddingLeft={2}>\n <Text color={theme.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 { AssistantBackgroundTaskOutputMessage } from './AssistantBackgroundTaskOutputMessage'\nimport { AssistantLocalCommandOutputMessage } from './AssistantLocalCommandOutputMessage'\nimport { getTheme } from '#core/utils/theme'\nimport { Box, Text } from 'ink'\nimport { Cost } from '#ui-ink/components/Cost'\nimport { MaxSizedText } from '#ui-ink/components/MaxSizedText'\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 { RECORD_CIRCLE } from '#core/constants/figures'\nimport { applyMarkdown } from '#core/utils/markdown'\nimport { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\nimport { useTransientViewport } from '#ui-ink/contexts/TransientViewportContext'\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 isTransient?: boolean\n}\n\nexport function AssistantTextMessage({\n param: { text },\n costUSD,\n durationMs,\n debug,\n addMargin,\n shouldShowDot,\n verbose,\n isTransient,\n}: Props): React.ReactNode {\n const { columns, rows } = useTerminalSize()\n const transientViewport = useTransientViewport()\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 // Compatibility: background bash completion notification.\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 // Compatibility: 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 // Compatibility: 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 const contentWidth = Math.max(1, columns - 6)\n const defaultTransientMaxHeight = Math.max(1, rows - 10)\n const viewportMaxHeight = transientViewport.maxHeight\n const maxHeight = isTransient\n ? Math.max(\n 1,\n Math.min(defaultTransientMaxHeight, viewportMaxHeight ?? Infinity),\n )\n : undefined\n\n // Show bash output\n if (text.startsWith('<bash-stdout') || text.startsWith('<bash-stderr')) {\n return (\n <AssistantBashOutputMessage\n content={text}\n verbose={verbose}\n maxHeight={maxHeight}\n maxWidth={contentWidth}\n />\n )\n }\n\n // Show background task output\n if (text.startsWith('<background-task-output')) {\n return <AssistantBackgroundTaskOutputMessage 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 (\n <AssistantLocalCommandOutputMessage\n content={text}\n maxHeight={maxHeight}\n maxWidth={contentWidth}\n />\n )\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 const content = applyMarkdown(text)\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().kode}>{RECORD_CIRCLE}</Text>\n </Box>\n )}\n <Box flexDirection=\"column\" width={contentWidth}>\n {maxHeight ? (\n <MaxSizedText\n text={content}\n maxWidth={contentWidth}\n maxHeight={maxHeight}\n overflowDirection=\"bottom\"\n />\n ) : (\n <Text>{content}</Text>\n )}\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 maxHeight,\n maxWidth,\n}: {\n content: string\n verbose?: boolean\n maxHeight?: number\n maxWidth?: number\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 maxHeight={maxHeight}\n maxWidth={maxWidth}\n />\n )\n}\n", "import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { extractTag } from '#core/utils/messages'\nimport { getTheme } from '#core/utils/theme'\n\nconst MAX_RENDERED_LINES = 5\n\nfunction renderTruncatedContent(\n lines: string[],\n maxLines: number = MAX_RENDERED_LINES,\n): { lines: string[]; truncated: boolean; hiddenCount: number } {\n if (lines.length <= maxLines) {\n return { lines, truncated: false, hiddenCount: 0 }\n }\n return {\n lines: lines.slice(-maxLines),\n truncated: true,\n hiddenCount: lines.length - maxLines,\n }\n}\n\nexport function AssistantBackgroundTaskOutputMessage({\n content,\n verbose = false,\n}: {\n content: string\n verbose?: boolean\n}): React.ReactNode {\n const message = extractTag(content, 'background-task-output')\n if (!message) {\n return null\n }\n\n const theme = getTheme()\n const allLines = message.split(/\\r?\\n/).filter(l => l.trim().length > 0)\n\n if (allLines.length === 0) {\n return null\n }\n\n const { lines, truncated, hiddenCount } = verbose\n ? { lines: allLines, truncated: false, hiddenCount: 0 }\n : renderTruncatedContent(allLines)\n\n return (\n <Box flexDirection=\"column\">\n {truncated && (\n <Box flexDirection=\"row\">\n <Text color={theme.secondaryText}>\n &nbsp;&nbsp;\u23BF &nbsp;... {hiddenCount} lines hidden, showing last{' '}\n {MAX_RENDERED_LINES} lines\n </Text>\n </Box>\n )}\n {lines.map((line, index) => (\n <Box key={index} flexDirection=\"row\">\n <Text>\n &nbsp;&nbsp;\u23BF &nbsp;\n <Text color={theme.secondaryText}>{line}</Text>\n </Text>\n </Box>\n ))}\n </Box>\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'\nimport { MaxSizedText } from '#ui-ink/components/MaxSizedText'\n\nexport function AssistantLocalCommandOutputMessage({\n content,\n maxHeight,\n maxWidth,\n}: {\n content: string\n maxHeight?: number\n maxWidth?: number\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, maxHeight, maxWidth),\n format(stderr?.trim(), theme.error, maxHeight, maxWidth),\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(\n content: string | undefined,\n color: string,\n maxHeight?: number,\n maxWidth?: number,\n): React.ReactNode {\n if (!content) {\n return null\n }\n if (maxHeight && maxWidth) {\n return (\n <MaxSizedText\n text={content}\n maxHeight={maxHeight}\n maxWidth={maxWidth}\n overflowDirection=\"bottom\"\n />\n )\n }\n return <Text color={color}>{content}</Text>\n}\n", "import * as React from 'react'\nimport { useCallback, useMemo, useRef, useState } from 'react'\n\nexport type TransientViewportConstraints = {\n /**\n * Maximum number of rows transient (actively changing) transcript content\n * should occupy. When undefined, components should fall back to their own\n * defaults.\n */\n maxHeight?: number\n\n /**\n * When true, components should actively constrain their height to prevent\n * content overflow that causes flickering. When false, overflow is allowed\n * (e.g., during transitions or when intentionally exceeding bounds).\n */\n constrainHeight?: boolean\n\n /**\n * Report that content would overflow the viewport.\n * Used for telemetry and debugging flickering issues.\n */\n reportOverflow?: (actualHeight: number) => void\n}\n\nconst TransientViewportContext =\n React.createContext<TransientViewportConstraints>({})\n\nexport function TransientViewportProvider({\n value,\n children,\n}: {\n value: TransientViewportConstraints\n children: React.ReactNode\n}): React.ReactNode {\n return (\n <TransientViewportContext.Provider value={value}>\n {children}\n </TransientViewportContext.Provider>\n )\n}\n\nexport function useTransientViewport(): TransientViewportConstraints {\n return React.useContext(TransientViewportContext)\n}\n\n/**\n * Hook for components that need to track and report overflow.\n * Returns a ref callback and the effective max height to use.\n */\nexport function useConstrainedHeight(defaultMaxHeight?: number): {\n effectiveMaxHeight: number | undefined\n shouldConstrain: boolean\n} {\n const { maxHeight, constrainHeight } = useTransientViewport()\n\n return useMemo(\n () => ({\n effectiveMaxHeight: maxHeight ?? defaultMaxHeight,\n shouldConstrain: constrainHeight ?? true,\n }),\n [maxHeight, defaultMaxHeight, constrainHeight],\n )\n}\n\n/**\n * Enhanced provider that includes overflow tracking.\n */\nexport function TransientViewportProviderWithTracking({\n maxHeight,\n constrainHeight = true,\n onOverflow,\n children,\n}: {\n maxHeight: number\n constrainHeight?: boolean\n onOverflow?: (actualHeight: number) => void\n children: React.ReactNode\n}): React.ReactNode {\n const lastOverflowRef = useRef(0)\n const OVERFLOW_THROTTLE_MS = 200\n\n const reportOverflow = useCallback(\n (actualHeight: number) => {\n const now = Date.now()\n if (now - lastOverflowRef.current < OVERFLOW_THROTTLE_MS) return\n lastOverflowRef.current = now\n onOverflow?.(actualHeight)\n },\n [onOverflow],\n )\n\n const value = useMemo<TransientViewportConstraints>(\n () => ({\n maxHeight,\n constrainHeight,\n reportOverflow,\n }),\n [maxHeight, constrainHeight, reportOverflow],\n )\n\n return (\n <TransientViewportContext.Provider value={value}>\n {children}\n </TransientViewportContext.Provider>\n )\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} bold>\n {'\\u276F'}\n </Text>\n </Box>\n <Box flexDirection=\"column\" width={columns - 4}>\n <Text color={theme.kode} bold 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 { UserBackgroundTaskInputMessage } from './UserBackgroundTaskInputMessage'\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 // Background tasks!\n if (param.text.includes('<background-task-input>')) {\n return (\n <UserBackgroundTaskInputMessage addMargin={addMargin} param={param} />\n )\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 } from 'ink'\nimport * as React from 'react'\nimport { useEffect, useMemo, useState } from 'react'\nimport figures from 'figures'\nimport { getTheme } from '#core/utils/theme'\nimport { randomUUID } from 'crypto'\nimport type { Tool } from '#core/tooling/Tool'\nimport { createUserMessage, stripSystemMessages } from '#core/utils/messages'\nimport type { Message as MessageType, UserMessage } from '#core/query'\nimport { useExitOnCtrlCD } from '#ui-ink/hooks/useExitOnCtrlCD'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\n\ntype Props = {\n erroredToolUseIDs: Set<string>\n messages: MessageType[]\n onSelect: (message: MessageType) => void | Promise<void>\n onEscape: () => void\n tools: Tool[]\n unresolvedToolUseIDs: Set<string>\n}\n\nconst MAX_VISIBLE_MESSAGES = 7\nconst SELECTOR_OVERHEAD_ROWS = 7\nconst SELECTOR_RESERVED_ROWS = 4\nconst INDEX_WIDTH = 7\n\nfunction extractUserMessageText(content: unknown): string {\n if (typeof content === 'string') return content\n if (!Array.isArray(content)) return ''\n\n const parts: string[] = []\n for (const block of content) {\n if (!block || typeof block !== 'object') continue\n const record = block as { type?: unknown; text?: unknown }\n if (record.type !== 'text') continue\n parts.push(String(record.text ?? ''))\n }\n\n return parts.join('\\n')\n}\n\nfunction isToolResultOnlyMessage(message: UserMessage): boolean {\n if (!Array.isArray(message.message.content)) return false\n\n let hasToolResult = false\n let hasText = false\n for (const block of message.message.content) {\n if (!block || typeof block !== 'object') continue\n const record = block as { type?: unknown; text?: unknown }\n if (record.type === 'tool_result') {\n hasToolResult = true\n continue\n }\n if (record.type === 'text') {\n const text = String(record.text ?? '')\n if (text.trim()) hasText = true\n }\n }\n\n return hasToolResult && !hasText\n}\n\nexport function MessageSelector({\n messages,\n onSelect,\n onEscape,\n}: Props): React.ReactNode {\n const currentUUID = useMemo(() => randomUUID(), [])\n const { rows } = useTerminalSize()\n\n function handleSelect(message: MessageType) {\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 const filtered = messages.filter(\n (message): message is UserMessage =>\n message.type === 'user' && !isToolResultOnlyMessage(message),\n )\n return [\n ...filtered,\n { ...createUserMessage(''), uuid: currentUUID } as UserMessage,\n ]\n }, [messages, currentUUID])\n const [selectedIndex, setSelectedIndex] = useState(allItems.length - 1)\n\n useEffect(() => {\n setSelectedIndex(previous => {\n if (allItems.length === 0) return 0\n return Math.min(previous, allItems.length - 1)\n })\n }, [allItems.length])\n\n const exitState = useExitOnCtrlCD(() => process.exit(0))\n\n useKeypress((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 maxVisibleCount = Math.max(\n 1,\n rows - SELECTOR_OVERHEAD_ROWS - SELECTOR_RESERVED_ROWS,\n )\n const targetVisibleCount = Math.min(MAX_VISIBLE_MESSAGES, maxVisibleCount)\n const visibleCount = Math.min(allItems.length, targetVisibleCount)\n\n const firstVisibleIndex = Math.max(\n 0,\n Math.min(\n selectedIndex - Math.floor(visibleCount / 2),\n allItems.length - visibleCount,\n ),\n )\n const visibleItems = allItems.slice(\n firstVisibleIndex,\n firstVisibleIndex + visibleCount,\n )\n const missingRows = Math.max(0, targetVisibleCount - visibleItems.length)\n\n return (\n <>\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={getTheme().secondaryBorder}\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 {visibleItems.map((msg, index) => {\n const actualIndex = firstVisibleIndex + index\n const isSelected = actualIndex === selectedIndex\n const isCurrent = msg.uuid === currentUUID\n\n const cleanedText = stripSystemMessages(\n extractUserMessageText(msg.message.content),\n )\n const firstLine =\n cleanedText\n .split('\\n')\n .map(line => line.trim())\n .find(Boolean) ?? ''\n const isEmpty = !firstLine\n\n return (\n <Box key={msg.uuid} flexDirection=\"row\" height={1} minHeight={1}>\n <Box width={INDEX_WIDTH}>\n {isSelected ? (\n <Text color=\"blue\" bold>\n {figures.pointer} {actualIndex + 1}{' '}\n </Text>\n ) : (\n <Text>\n {' '}\n {actualIndex + 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 ) : (\n <Text dimColor={isEmpty} italic={isEmpty} wrap=\"truncate-end\">\n {isEmpty ? '(empty message)' : firstLine}\n </Text>\n )}\n </Box>\n </Box>\n )\n })}\n {missingRows > 0\n ? Array.from({ length: missingRows }).map((_, idx) => (\n <Box key={`empty-${idx}`} flexDirection=\"row\" height={1}>\n <Box width={INDEX_WIDTH}>\n <Text> </Text>\n </Box>\n <Text> </Text>\n </Box>\n ))\n : null}\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 { type DOMElement, measureElement } from 'ink'\nimport { useCallback, useEffect, useRef } from 'react'\nimport { debug as debugLogger } from '#core/utils/debugLogger'\n\nconst MIN_MEASURE_INTERVAL_MS = 100\n\n/**\n * Debug-only hook that detects when the UI renders taller than the terminal.\n * This is a strong signal of a viewport sizing bug that causes scroll/flicker.\n *\n * Enable with `KODE_DEBUG_FLICKER=1` or by passing `enabled=true`.\n */\nexport function useFlickerDetector(\n rootUiRef: React.RefObject<DOMElement | null>,\n terminalHeight: number,\n enabled: boolean,\n): void {\n const lastMeasureRef = useRef(0)\n\n useEffect(() => {\n if (!enabled) return\n if (!rootUiRef.current) return\n if (!Number.isFinite(terminalHeight) || terminalHeight <= 0) return\n\n const now = Date.now()\n if (now - lastMeasureRef.current < MIN_MEASURE_INTERVAL_MS) return\n lastMeasureRef.current = now\n\n const measurement = measureElement(rootUiRef.current)\n const isOverflowing = measurement.height > terminalHeight\n\n if (isOverflowing) {\n debugLogger.ui('FLICKER_DETECTED', {\n contentHeight: measurement.height,\n terminalHeight,\n timestamp: now,\n })\n }\n }, [enabled, rootUiRef, terminalHeight])\n}\n\n/**\n * Simpler version that just returns whether content is currently overflowing.\n * Use this for basic overflow prevention without history tracking.\n */\nexport function useIsOverflowing(\n rootUiRef: React.RefObject<DOMElement | null>,\n terminalHeight: number,\n): boolean {\n const isOverflowingRef = useRef(false)\n const lastMeasureRef = useRef(0)\n\n useEffect(() => {\n if (!rootUiRef.current) return\n if (!Number.isFinite(terminalHeight) || terminalHeight <= 0) return\n\n const now = Date.now()\n if (now - lastMeasureRef.current < MIN_MEASURE_INTERVAL_MS) return\n lastMeasureRef.current = now\n\n const measurement = measureElement(rootUiRef.current)\n isOverflowingRef.current = measurement.height > terminalHeight\n })\n\n return isOverflowingRef.current\n}\n\n/**\n * Hook that provides a callback to check overflow on demand.\n * Useful for components that need to verify height before rendering.\n */\nexport function useOverflowCheck(\n rootUiRef: React.RefObject<DOMElement | null>,\n terminalHeight: number,\n): () => boolean {\n return useCallback(() => {\n if (!rootUiRef.current) return false\n if (!Number.isFinite(terminalHeight) || terminalHeight <= 0) return false\n\n const measurement = measureElement(rootUiRef.current)\n return measurement.height > terminalHeight\n }, [rootUiRef, terminalHeight])\n}\n", "import { Box } from 'ink'\nimport * as React from 'react'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport ReactReconciler from 'react-reconciler'\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 {\n useApiKeyVerification,\n type VerificationStatus,\n} 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 { getGlobalConfigCached, saveGlobalConfig } from '#core/utils/config'\nimport { getNextAvailableLogForkNumber, logError } from '#core/utils/log'\nimport { getOriginalCwd } from '#core/utils/state'\nimport { MACRO } from '#core/constants/macros'\nimport { subscribeAgentReloads } from '#core/agent/events'\nimport { subscribeCustomCommandReloads } from '#cli-services/customCommands'\nimport { HelpScreen } from '#ui-ink/screens/overlays/HelpScreen'\nimport { ShortcutsScreen } from '#ui-ink/screens/overlays/ShortcutsScreen'\nimport { ConfigScreen } from '#ui-ink/screens/overlays/ConfigScreen'\nimport { OpenFileScreen } from '#ui-ink/screens/overlays/OpenFileScreen'\nimport { ConsoleScreen } from '#ui-ink/screens/overlays/ConsoleScreen'\nimport { NotificationsScreen } from '#ui-ink/screens/overlays/NotificationsScreen'\nimport { TranscriptScreen } from '#ui-ink/screens/overlays/TranscriptScreen'\nimport { CommandPaletteScreen } from '#ui-ink/screens/overlays/CommandPaletteScreen'\nimport { TasksScreen } from '#ui-ink/screens/overlays/TasksScreen'\nimport { TodosScreen } from '#ui-ink/screens/overlays/TodosScreen'\nimport { HistorySearchScreen } from '#ui-ink/screens/overlays/HistorySearchScreen'\nimport { ModelPickerScreen } from '#ui-ink/screens/overlays/ModelPickerScreen'\nimport { ThinkingToggleScreen } from '#ui-ink/screens/overlays/ThinkingToggleScreen'\nimport { ModelConfig } from '#ui-ink/components/ModelConfig'\nimport { Doctor } from '#ui-ink/screens/Doctor'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { submitPrompt } from '#ui-ink/components/PromptInput/submit'\nimport { useTranscriptItems, type TranscriptItem } 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'\nimport { ensureLspManagerInitialized } from '#tools/tools/system/LspTool/call'\nimport { describeToolPermissionRuleSource } from '#core/permissions/ruleString'\nimport { triggerModelConfigChange } from '#core/messages'\nimport {\n clearViewport,\n enterAlternateScreen,\n exitAlternateScreen,\n} from '#cli-utils/terminal'\nimport { getModelManager } from '#core/utils/model'\nimport { getToolPermissionContextForConversationKey } from '#core/utils/toolPermissionContextState'\nimport type { PromptMode } from '#ui-ink/components/PromptInput/types'\nimport { KEYPRESS_PRIORITY } from '#ui-ink/constants/keypressPriority'\nimport { terminalCapabilityManager } from '#ui-ink/utils/terminalCapabilityManager'\nimport type {\n ForkConvoWithMessagesOptions,\n SetForkConvoWithMessagesOnTheNextRender,\n} from '#ui-ink/types/conversationReset'\n\nconst batchedUpdates: ((fn: () => void) => void) | null =\n typeof (ReactReconciler as any)?.batchedUpdates === 'function'\n ? ((ReactReconciler as any).batchedUpdates as (fn: () => void) => void)\n : typeof (ReactReconciler as any)?.default?.batchedUpdates === 'function'\n ? ((ReactReconciler as any).default.batchedUpdates as (\n fn: () => void,\n ) => void)\n : null\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, setUpdateAvailableVersion] = useState<\n string | null\n >(() => props.initialUpdateVersion ?? null)\n const [updateCommands, setUpdateCommands] = useState<string[] | null>(() =>\n props.initialUpdateCommands ? [...props.initialUpdateCommands] : null,\n )\n\n const [verbose, setVerbose] = useState(() => {\n return props.verbose ?? getGlobalConfigCached().verbose\n })\n\n const [commands, setCommands] = useState(() => props.commands)\n\n useEffect(() => {\n if (process.env.NODE_ENV === 'test') return\n if (updateAvailableVersion || updateCommands) return\n\n let cancelled = false\n ;(async () => {\n try {\n const [{ getLatestVersion, getUpdateCommandSuggestions }, semverMod] =\n await Promise.all([\n import('#core/utils/autoUpdater'),\n import('semver'),\n ])\n\n const semverModule = semverMod as unknown as Record<string, unknown>\n const semver =\n typeof semverModule.gt === 'function'\n ? semverModule\n : typeof (semverModule.default as any)?.gt === 'function'\n ? (semverModule.default as any)\n : null\n if (!semver) return\n\n const latest = await getLatestVersion()\n if (!latest || typeof latest !== 'string') return\n\n if (!semver.gt(latest, MACRO.VERSION)) return\n const cmds = await getUpdateCommandSuggestions()\n\n if (cancelled) return\n setUpdateAvailableVersion(latest)\n setUpdateCommands(cmds)\n } catch {\n // best-effort only\n }\n })()\n\n return () => {\n cancelled = true\n }\n }, [updateAvailableVersion, updateCommands])\n\n const [forkNumber, setForkNumber] = useState(\n getNextAvailableLogForkNumber(\n props.messageLogName,\n props.initialForkNumber ?? 0,\n 0,\n ),\n )\n const initialForkNumberRef = useRef(forkNumber)\n const [uiRefreshCounter, setUiRefreshCounter] = useState(0)\n\n const [\n pendingForkConvoWithMessages,\n setPendingForkConvoWithMessages,\n ] = useState<{\n messages: MessageType[]\n options?: ForkConvoWithMessagesOptions\n } | null>(null)\n const pendingForkConvoWithMessagesRef = useRef<{\n messages: MessageType[]\n options?: ForkConvoWithMessagesOptions\n } | null>(null)\n\n const setForkConvoWithMessagesOnTheNextRender =\n useCallback<SetForkConvoWithMessagesOnTheNextRender>((messages, options) => {\n const request = { messages, options }\n pendingForkConvoWithMessagesRef.current = request\n setPendingForkConvoWithMessages(request)\n }, [])\n\n // Returns true if a pending fork/reset request should suppress appending new messages.\n // Side effect: clears pendingForkConvoWithMessagesRef when returning true.\n const checkPendingForkAndSuppressAppend = useCallback(\n (newMessages: MessageType[]): boolean => {\n const pending = pendingForkConvoWithMessagesRef.current\n if (!pending) return false\n if (newMessages.length === 0) return false\n const last = newMessages[newMessages.length - 1]\n if (!last || last.type !== 'assistant') return false\n // A fork/reset was requested during this command; don't append the\n // command metadata messages to the soon-to-be-replaced transcript.\n pendingForkConvoWithMessagesRef.current = null\n return true\n },\n [],\n )\n\n const [abortController, setAbortController] =\n useState<AbortController | null>(null)\n const [isLoading, setIsLoading] = useState(false)\n type ToolView = {\n jsx: React.ReactNode | null\n shouldHidePromptInput: boolean\n displayMode?: 'inline' | 'fullscreen'\n }\n\n const [toolViewStack, setToolViewStack] = useState<ToolView[]>([])\n const toolViewStackRef = useRef<ToolView[]>(toolViewStack)\n useEffect(() => {\n toolViewStackRef.current = toolViewStack\n }, [toolViewStack])\n\n const toolJSX: ToolView | null =\n toolViewStack.length > 0 ? toolViewStack[toolViewStack.length - 1] : null\n\n const toolJSXRef = useRef<typeof toolJSX>(toolJSX)\n useEffect(() => {\n toolJSXRef.current = toolJSX\n }, [toolJSX])\n\n const ephemeralFullscreenAltScreenRef = useRef(false)\n useEffect(() => {\n return () => {\n if (ephemeralFullscreenAltScreenRef.current) {\n ephemeralFullscreenAltScreenRef.current = false\n exitAlternateScreen()\n }\n }\n }, [])\n\n const setToolViewStackWithClear = useCallback(\n (nextStack: ToolView[]) => {\n const prevMode = toolJSXRef.current?.displayMode\n const nextTop = nextStack.length\n ? nextStack[nextStack.length - 1]\n : null\n const nextMode = nextTop?.displayMode\n\n const prevFull = prevMode === 'fullscreen'\n const nextFull = nextMode === 'fullscreen'\n\n const maybeApplyPendingForkConvoWithMessages = (): void => {\n const request = pendingForkConvoWithMessagesRef.current\n if (!request) return\n\n pendingForkConvoWithMessagesRef.current = null\n\n if (request.options?.clearViewport) {\n // Don't await; ordering of writes on stdout is preserved and this keeps\n // the transition to the restored main buffer from flashing.\n void clearViewport()\n }\n\n const applyStateUpdates = () => {\n setPendingForkConvoWithMessages(null)\n setForkNumber(prev => prev + 1)\n setMessages(request.messages)\n\n if (request.options?.resetInput) {\n setInputMode('prompt')\n setInputValue('')\n setRestorePastes(undefined)\n setDraftPastes({ pastedTexts: [], pastedImages: [] })\n }\n }\n\n if (batchedUpdates) {\n batchedUpdates(applyStateUpdates)\n return\n }\n applyStateUpdates()\n }\n\n const screenReaderEnv =\n process.env.KODE_SCREEN_READER ?? process.env.SCREENREADER\n const canUseAltScreen =\n process.stdin.isTTY && process.stdout.isTTY && !screenReaderEnv\n\n const useEphemeralAltScreen =\n canUseAltScreen && getGlobalConfigCached().useAlternateBuffer !== true\n\n const doSetState = () => {\n toolViewStackRef.current = nextStack\n toolJSXRef.current = nextTop\n setToolViewStack(nextStack)\n }\n\n // When running in the main buffer (scrollback enabled), opening a fullscreen\n // TUI view leaves the entire screen in scrollback. To preserve scrollback\n // while keeping fullscreen dialogs clean, temporarily switch to the\n // terminal alternate screen for fullscreen tool views.\n if (useEphemeralAltScreen) {\n if (!prevFull && nextFull) {\n enterAlternateScreen()\n // Switching buffers can reset terminal modes (kitty/modifyOtherKeys/bracketed paste)\n // in some terminals; re-assert what we detected at startup so keybindings keep working.\n terminalCapabilityManager.enableSupportedModes()\n void clearViewport()\n doSetState()\n ephemeralFullscreenAltScreenRef.current = true\n return\n } else if (prevFull && !nextFull) {\n if (ephemeralFullscreenAltScreenRef.current) {\n ephemeralFullscreenAltScreenRef.current = false\n exitAlternateScreen()\n terminalCapabilityManager.enableSupportedModes()\n }\n\n // Apply any pending transcript fork/reset immediately when leaving a\n // fullscreen tool view so the restored main buffer doesn't flash the\n // pre-overlay frame (e.g. `/resume`).\n maybeApplyPendingForkConvoWithMessages()\n } else if (\n prevFull &&\n nextFull &&\n ephemeralFullscreenAltScreenRef.current\n ) {\n // Ensure clean transitions between fullscreen tool screens.\n doSetState()\n return\n }\n } else {\n if (prevFull !== nextFull) {\n // Avoid explicit terminal clears here; the UI should remain within the viewport\n // and rely on Ink's reconciliation to keep transitions stable.\n if (prevFull && !nextFull) {\n maybeApplyPendingForkConvoWithMessages()\n }\n doSetState()\n return\n }\n }\n\n doSetState()\n },\n [setToolViewStack],\n )\n const setToolJSXWithClear = useCallback(\n (next: ToolView | null) => {\n setToolViewStackWithClear(next ? [next] : [])\n },\n [setToolViewStackWithClear],\n )\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<PromptMode>('prompt')\n const [restorePastes, setRestorePastes] = useState<\n | {\n id: number\n pastedTexts: Array<{ placeholder: string; text: string }>\n pastedImages: Array<{\n placeholder: string\n data: string\n mediaType: string\n }>\n }\n | undefined\n >(undefined)\n const [draftPastes, setDraftPastes] = useState<{\n pastedTexts: Array<{ placeholder: string; text: string }>\n pastedImages: Array<{\n placeholder: string\n data: string\n mediaType: string\n }>\n }>({ pastedTexts: [], pastedImages: [] })\n const [sessionThinkingMode, setSessionThinkingMode] = useState<\n 'enabled' | 'auto' | null\n >(null)\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 getGlobalConfigCached().hasAcknowledgedCostThreshold,\n )\n const [binaryFeedbackContext, setBinaryFeedbackContext] =\n useState<BinaryFeedbackContext | null>(null)\n const [toast, setToast] = useState<string | null>(null)\n const toastTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const dismissToolView = useCallback(() => {\n const current = toolViewStackRef.current\n if (current.length === 0) return\n setToolViewStackWithClear(current.slice(0, -1))\n }, [setToolViewStackWithClear])\n\n const openToolView = useCallback(\n (view: NonNullable<typeof toolJSX>) => {\n setToolViewStackWithClear([...toolViewStackRef.current, view])\n },\n [setToolViewStackWithClear],\n )\n\n const openTasksScreen = useCallback(() => {\n openToolView({\n jsx: <TasksScreen onDone={dismissToolView} />,\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n }, [dismissToolView, openToolView])\n\n const openTodosScreen = useCallback(() => {\n openToolView({\n jsx: <TodosScreen agentId=\"main\" onDone={dismissToolView} />,\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n }, [dismissToolView, openToolView])\n\n type ReplOnQueryFn = (\n newMessages: MessageType[],\n passedAbortController?: AbortController,\n ) => Promise<void>\n\n const apiKeyStatusRef = useRef<VerificationStatus>('loading')\n const onQueryRef = useRef<ReplOnQueryFn | null>(null)\n\n const openHistorySearchScreen = useCallback(() => {\n openToolView({\n jsx: (\n <HistorySearchScreen\n onDone={result => {\n dismissToolView()\n\n if (result.action === 'cancel') return\n\n const selected = result.value\n const pastedTexts = result.pastedTexts\n const mode: PromptMode = selected.startsWith('!')\n ? 'bash'\n : selected.startsWith('&')\n ? 'background'\n : selected.startsWith('#')\n ? 'koding'\n : 'prompt'\n const text =\n mode === 'bash' || mode === 'background' || mode === 'koding'\n ? selected.slice(1)\n : selected\n\n if (result.action === 'accept') {\n setInputMode(mode)\n setInputValue(text)\n setRestorePastes({\n id: Date.now(),\n pastedTexts,\n pastedImages: [],\n })\n return\n }\n\n if (isLoading || apiKeyStatusRef.current !== 'valid') {\n setInputMode(mode)\n setInputValue(text)\n setRestorePastes({\n id: Date.now(),\n pastedTexts,\n pastedImages: [],\n })\n return\n }\n\n void (async () => {\n const conversationKey = `${props.messageLogName}:${forkNumber}`\n const toolPermissionContext =\n getToolPermissionContextForConversationKey({\n conversationKey,\n isBypassPermissionsModeAvailable: !safeMode,\n })\n\n const exit = (): never => {\n process.exit(0)\n }\n\n await submitPrompt({\n input: text,\n mode,\n completionActive: false,\n suggestionCount: 0,\n isSubmittingSlashCommand: false,\n isDisabled: apiKeyStatusRef.current !== 'valid',\n isLoading: false,\n isEditingExternally: false,\n abortController,\n setIsLoading,\n setAbortController,\n onInputChange: setInputValue,\n onModeChange: setInputMode,\n setCursorOffset: () => {},\n onSubmitCountChange: setSubmitCount,\n onQuery: async (...args) => {\n await onQueryRef.current?.(...args)\n },\n setToolJSX: setToolJSXWithClear,\n commands,\n forkNumber,\n messageLogName: props.messageLogName,\n tools: props.tools,\n verbose,\n disableSlashCommands,\n permissionMode: toolPermissionContext.mode,\n toolPermissionContext,\n setForkConvoWithMessagesOnTheNextRender,\n readFileTimestamps: readFileTimestampsRef.current,\n pastedTexts,\n pastedImages: [],\n clearPastes: () => {},\n resetHistory: () => {},\n setCurrentPwd: () => {},\n exit,\n })\n })()\n }}\n />\n ),\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n }, [\n abortController,\n commands,\n disableSlashCommands,\n dismissToolView,\n forkNumber,\n isLoading,\n openToolView,\n props.messageLogName,\n props.tools,\n safeMode,\n setAbortController,\n setForkConvoWithMessagesOnTheNextRender,\n setIsLoading,\n setToolJSXWithClear,\n verbose,\n ])\n\n useKeypress(\n (inputChar, key) => {\n const hasModal =\n Boolean(toolJSX) ||\n Boolean(toolUseConfirm) ||\n Boolean(binaryFeedbackContext) ||\n showingCostDialog ||\n isMessageSelectorVisible\n\n if (key.ctrl && inputChar === 'c' && isLoading) {\n setToolJSXWithClear(null)\n setToolUseConfirm(null)\n setBinaryFeedbackContext(null)\n onCancel()\n return true\n }\n\n if (hasModal) return\n\n if (key.ctrl && inputChar === 't') {\n openTodosScreen()\n return true\n }\n\n if (key.ctrl && inputChar === 'o') {\n openToolView({\n jsx: (\n <TranscriptScreen\n onDone={dismissToolView}\n label={`${props.messageLogName}-${forkNumber}`}\n initialFollow={true}\n />\n ),\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return true\n }\n\n if (key.ctrl && inputChar === 'r') {\n openHistorySearchScreen()\n return true\n }\n\n if (key.meta && inputChar === 't') {\n const effectiveThinkingMode =\n sessionThinkingMode ?? getGlobalConfigCached().thinkingMode ?? 'auto'\n const currentValue = effectiveThinkingMode === 'enabled'\n const isMidConversation =\n messages.some(m => m.type === 'assistant') ||\n messages.some(m => m.type === 'user' && !(m as any)?.isMeta)\n\n openToolView({\n jsx: (\n <ThinkingToggleScreen\n currentValue={currentValue}\n isMidConversation={isMidConversation}\n onSelect={enabled => {\n setSessionThinkingMode(enabled ? 'enabled' : 'auto')\n showToast(`Thinking: ${enabled ? 'ON' : 'OFF'}`)\n }}\n onDone={dismissToolView}\n />\n ),\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return true\n }\n\n if (key.meta && inputChar === 'p') {\n openToolView({\n jsx: (\n <ModelPickerScreen\n onDone={dismissToolView}\n onSelectModel={modelName => {\n const modelManager = getModelManager()\n modelManager.setPointer('main', modelName)\n triggerModelConfigChange()\n }}\n />\n ),\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return true\n }\n\n if (inputChar === '?' && inputValue.trim().length === 0) {\n openToolView({\n jsx: <ShortcutsScreen onDone={dismissToolView} />,\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return true\n }\n\n if (key.name === 'f1') {\n openToolView({\n jsx: <HelpScreen commands={commands} onDone={dismissToolView} />,\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return true\n }\n\n if (key.name === 'f2') {\n openToolView({\n jsx: <ConfigScreen onClose={dismissToolView} />,\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return true\n }\n\n if (key.name === 'f3') {\n openToolView({\n jsx: <OpenFileScreen onDone={dismissToolView} />,\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return true\n }\n\n if (key.name === 'f4') {\n openToolView({\n jsx: <ConsoleScreen onDone={dismissToolView} />,\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return true\n }\n\n if (key.name === 'f5') {\n openToolView({\n jsx: <NotificationsScreen onDone={dismissToolView} />,\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return true\n }\n\n if (key.name === 'f6') {\n openToolView({\n jsx: (\n <TranscriptScreen\n onDone={dismissToolView}\n label={`${props.messageLogName}-${forkNumber}`}\n />\n ),\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return true\n }\n\n if (key.name === 'f8') {\n openTasksScreen()\n return true\n }\n\n if (key.name === 'f7') {\n openToolView({\n jsx: (\n <CommandPaletteScreen\n onDone={action => {\n if (!action) {\n dismissToolView()\n return\n }\n\n if (action === 'help') {\n openToolView({\n jsx: (\n <HelpScreen\n commands={commands}\n onDone={dismissToolView}\n />\n ),\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return\n }\n\n if (action === 'config') {\n openToolView({\n jsx: <ConfigScreen onClose={dismissToolView} />,\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return\n }\n\n if (action === 'open') {\n openToolView({\n jsx: <OpenFileScreen onDone={dismissToolView} />,\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return\n }\n\n if (action === 'console') {\n openToolView({\n jsx: <ConsoleScreen onDone={dismissToolView} />,\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return\n }\n\n if (action === 'notifications') {\n openToolView({\n jsx: <NotificationsScreen onDone={dismissToolView} />,\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return\n }\n\n if (action === 'transcript') {\n openToolView({\n jsx: (\n <TranscriptScreen\n onDone={dismissToolView}\n label={`${props.messageLogName}-${forkNumber}`}\n />\n ),\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return\n }\n\n if (action === 'doctor') {\n openToolView({\n jsx: <Doctor onDone={dismissToolView} doctorMode={true} />,\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return\n }\n\n if (action === 'model') {\n try {\n abortController?.abort?.()\n } catch {}\n setIsLoading(false)\n\n openToolView({\n jsx: (\n <ModelConfig\n onClose={() => {\n import('#core/utils/model').then(\n ({ reloadModelManager }) => {\n reloadModelManager()\n triggerModelConfigChange()\n dismissToolView()\n },\n )\n }}\n />\n ),\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return\n }\n\n dismissToolView()\n }}\n />\n ),\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return true\n }\n },\n { priority: KEYPRESS_PRIORITY.REPL_CONTROLLER },\n )\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 useEffect(() => {\n apiKeyStatusRef.current = apiKeyStatus\n }, [apiKeyStatus])\n\n useEffect(() => {\n // Best-effort eager init so the first LSP tool call doesn't pay process startup latency.\n void ensureLspManagerInitialized().catch(() => {})\n }, [])\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 setToolJSXWithClear,\n setToolUseConfirm,\n setBinaryFeedbackContext,\n onCancel,\n isLoading,\n isMessageSelectorVisible,\n abortController?.signal,\n )\n\n useEffect(() => {\n if (!pendingForkConvoWithMessages) return\n\n // If a fullscreen tool view is still mounted, we may still be on the\n // alternate screen buffer (ephemeral fullscreen mode). Wait until the view\n // is dismissed so clears apply to the active REPL buffer.\n if (toolJSX?.displayMode === 'fullscreen') return\n\n const request = pendingForkConvoWithMessages\n setPendingForkConvoWithMessages(null)\n pendingForkConvoWithMessagesRef.current = null\n\n // For non-fullscreen forks, handle clearViewport synchronously then update state\n // This matches the old pattern where clearTerminal was called before state updates\n const applyStateUpdates = () => {\n setForkNumber(prev => prev + 1)\n setMessages(request.messages)\n\n if (request.options?.resetInput) {\n setInputMode('prompt')\n setInputValue('')\n setRestorePastes(undefined)\n setDraftPastes({ pastedTexts: [], pastedImages: [] })\n }\n }\n\n // clearViewport is async but we don't need to await it - the terminal\n // writes are ordered on stdout, so the clear happens before React renders\n if (request.options?.clearViewport) {\n void clearViewport()\n }\n\n if (batchedUpdates) {\n batchedUpdates(applyStateUpdates)\n } else {\n applyStateUpdates()\n }\n }, [pendingForkConvoWithMessages, toolJSX?.displayMode])\n\n useEffect(() => {\n const totalCost = getTotalCost()\n if (totalCost >= 5 && !showCostDialog && !haveShownCostDialog) {\n setShowCostDialog(true)\n }\n }, [messages, showCostDialog, haveShownCostDialog])\n\n const showToast = useCallback((text: string) => {\n setToast(text)\n if (toastTimeoutRef.current) {\n clearTimeout(toastTimeoutRef.current)\n }\n toastTimeoutRef.current = setTimeout(() => setToast(null), 6000)\n }, [])\n\n const ultrathinkToastActiveRef = useRef(false)\n useEffect(() => {\n if (inputMode === 'bash' || inputMode === 'background') {\n ultrathinkToastActiveRef.current = false\n return\n }\n\n const hasUltrathink = /\\bultrathink\\b/i.test(inputValue)\n const effectiveThinkingMode =\n sessionThinkingMode ?? getGlobalConfigCached().thinkingMode ?? 'auto'\n\n if (\n hasUltrathink &&\n !ultrathinkToastActiveRef.current &&\n effectiveThinkingMode === 'auto'\n ) {\n showToast('Thinking on')\n }\n\n ultrathinkToastActiveRef.current = hasUltrathink\n }, [inputMode, inputValue, sessionThinkingMode, showToast])\n\n useEffect(() => {\n return subscribeAgentReloads(event => {\n const count = event.changedPaths.length\n showToast(\n count > 0\n ? `Agents reloaded (${count} file${count === 1 ? '' : 's'})`\n : 'Agents reloaded',\n )\n })\n }, [showToast])\n\n useEffect(() => {\n let cancelled = false\n const unsubscribe = subscribeCustomCommandReloads(event => {\n const count = event.changedPaths.length\n showToast(\n count > 0\n ? `Commands reloaded (${count} change${count === 1 ? '' : 's'})`\n : 'Commands reloaded',\n )\n\n void (async () => {\n try {\n const { getCommands } = await import('#cli-commands')\n const next = await getCommands()\n if (cancelled) return\n setCommands(next)\n setUiRefreshCounter(prev => prev + 1)\n } catch (error) {\n logError(error)\n }\n })()\n })\n\n return () => {\n cancelled = true\n unsubscribe()\n }\n }, [showToast])\n\n useEffect(() => {\n return () => {\n if (toastTimeoutRef.current) {\n clearTimeout(toastTimeoutRef.current)\n toastTimeoutRef.current = null\n }\n }\n }, [])\n\n const canUseTool = useCanUseTool(setToolUseConfirm, {\n onPermissionRuleWarnings: warnings => {\n const first = warnings[0]\n const example = first\n ? `${first.rule} (${describeToolPermissionRuleSource(first.source)})`\n : ''\n const fix = first?.fix ? ` Fix: ${first.fix}` : ''\n showToast(\n `Permission rules: ${warnings.length} unreachable rule${\n warnings.length === 1 ? '' : 's'\n } detected${example ? ` (e.g. ${example})` : ''}.${fix}`,\n )\n },\n })\n const requestToolUsePermission = useRequestToolUsePermission({\n setToolUseConfirm,\n })\n\n const onQuery = useReplQuery({\n disableSlashCommands,\n systemPromptOverride: props.systemPromptOverride,\n appendSystemPrompt: props.appendSystemPrompt,\n messages,\n setMessages,\n commands,\n forkNumber,\n messageLogName: props.messageLogName,\n thinkingMode:\n sessionThinkingMode ?? getGlobalConfigCached().thinkingMode ?? 'auto',\n tools: props.tools,\n mcpClients,\n verbose,\n safeMode,\n checkPendingForkAndSuppressAppend,\n requestToolUsePermission,\n canUseTool,\n readFileTimestamps: readFileTimestampsRef.current,\n setToolJSX: setToolJSXWithClear,\n getBinaryFeedbackResponse,\n setAbortController,\n setIsLoading,\n })\n useEffect(() => {\n onQueryRef.current = onQuery\n }, [onQuery])\n\n const onInit = useReplInit({\n initialPrompt: props.initialPrompt,\n commands,\n forkNumber,\n messageLogName: props.messageLogName,\n tools: props.tools,\n mcpClients,\n verbose,\n safeMode,\n messages,\n setToolJSX: setToolJSXWithClear,\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 staticItemsRef = useRef<TranscriptItem[]>([])\n const printedKeysRef = useRef<Set<string>>(new Set())\n const lastForkNumberRef = useRef<number>(forkNumber)\n\n const staticItems = useMemo(() => {\n // Reset when forkNumber changes (conversation fork)\n if (lastForkNumberRef.current !== forkNumber) {\n lastForkNumberRef.current = forkNumber\n staticItemsRef.current = []\n printedKeysRef.current = new Set()\n }\n\n const items: TranscriptItem[] = []\n\n // Always include logo as first item\n const logoKey = `logo-${forkNumber}`\n items.push({\n key: logoKey,\n jsx: (\n <Box flexDirection=\"column\" key={logoKey}>\n <Logo\n mcpClients={mcpClients}\n isDefaultModel={isDefaultModel}\n updateBannerVersion={updateAvailableVersion}\n updateBannerCommands={updateCommands}\n />\n <ProjectOnboarding workspaceDir={getOriginalCwd()} />\n </Box>\n ),\n })\n\n items.push(...transcript.items.slice(0, transcript.replStaticPrefixLength))\n\n // Only add items that haven't been printed yet\n const newItems: TranscriptItem[] = []\n for (const item of items) {\n if (!printedKeysRef.current.has(item.key)) {\n printedKeysRef.current.add(item.key)\n newItems.push(item)\n }\n }\n\n // Append new items to the stable array\n if (newItems.length > 0) {\n staticItemsRef.current = [...staticItemsRef.current, ...newItems]\n }\n\n return staticItemsRef.current\n }, [\n forkNumber,\n isDefaultModel,\n mcpClients,\n transcript.items,\n transcript.replStaticPrefixLength,\n updateAvailableVersion,\n updateCommands,\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 = getGlobalConfigCached()\n saveGlobalConfig({ ...projectConfig, hasAcknowledgedCostThreshold: true })\n }, [])\n\n const promptInputProps = buildPromptInputProps({\n commands,\n forkNumber,\n messageLogName: props.messageLogName,\n initialPrompt: props.initialPrompt,\n tools: props.tools,\n disableSlashCommands,\n isDisabled: apiKeyStatus !== 'valid',\n isLoading,\n onQuery,\n debug,\n verbose,\n messages,\n setToolJSX: setToolJSXWithClear,\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 onManageTasks: openTasksScreen,\n restorePastes,\n onRestorePastesApplied: id => {\n setRestorePastes(prev => {\n if (!prev) return prev\n if (prev.id !== id) return prev\n return undefined\n })\n },\n draftPastes,\n onDraftPastesChange: setDraftPastes,\n })\n\n const handleMessageSelectorSelect = useMessageSelectorSelect({\n messages,\n setIsMessageSelectorVisible,\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 toast,\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 { 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'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { KEYPRESS_PRIORITY } from '#ui-ink/constants/keypressPriority'\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 useKeypress(\n (_, 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 return true\n },\n { priority: KEYPRESS_PRIORITY.REPL_CONTROLLER + 1 },\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 { 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'\nimport type { UnreachablePermissionRuleWarning } from '#core/permissions'\nimport { findUnreachablePermissionRules } from '#core/permissions'\nimport {\n resolveToolDescription,\n type Tool as ToolType,\n type ToolUseContext,\n} from '#core/tooling/Tool'\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 options?: {\n onPermissionRuleWarnings?: (\n warnings: UnreachablePermissionRuleWarning[],\n ) => void\n },\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 resolveToolDescription(tool, input as never),\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 blockedPath:\n typeof deniedResult.blockedPath === 'string'\n ? deniedResult.blockedPath\n : undefined,\n decisionReason:\n typeof deniedResult.decisionReason === 'string'\n ? deniedResult.decisionReason\n : undefined,\n riskScore:\n typeof deniedResult.riskScore === 'number'\n ? deniedResult.riskScore\n : null,\n onAbort() {\n logCancelledEvent()\n resolveWithCancelledAndAbortAllToolCalls()\n },\n onAllow(type) {\n if (type === 'permanent') {\n const ctx = toolUseContext.options?.toolPermissionContext\n if (ctx) {\n const warnings = findUnreachablePermissionRules(ctx)\n if (warnings.length > 0) {\n options?.onPermissionRuleWarnings?.(warnings)\n }\n }\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 React, { useCallback, useMemo, useRef } from 'react'\nimport { Box, Text } from 'ink'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\nimport { getTheme } from '#core/utils/theme'\nimport { getPermissionModeCycleShortcut } from '#ui-ink/utils/permissionModeCycleShortcut'\n\ntype Props = {\n onDone: () => void\n}\n\nexport function ShortcutsScreen({ onDone }: Props): React.ReactNode {\n const theme = getTheme()\n const layout = useScreenLayout()\n const exitState = { pending: false, keyName: null } as const\n const didDoneRef = useRef(false)\n\n const safeOnDone = useCallback(() => {\n if (didDoneRef.current) return\n didDoneRef.current = true\n onDone()\n }, [onDone])\n\n const modeCycleShortcut = useMemo(() => getPermissionModeCycleShortcut(), [])\n\n useKeypress((input, key) => {\n const inputChar = input.length === 1 ? input : ''\n if (key.escape || inputChar === '?' || (key.ctrl && inputChar === 'c')) {\n safeOnDone()\n return true\n }\n })\n\n const leftWidth = 22\n const middleWidth = 35\n\n return (\n <ScreenFrame\n title=\"Shortcuts\"\n exitState={exitState}\n paddingX={layout.paddingX}\n paddingY={layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"row\" gap={Math.max(2, layout.gap)} paddingX={1}>\n <Box flexDirection=\"column\" width={leftWidth}>\n <Text dimColor>! for bash mode</Text>\n <Text dimColor>/ for commands</Text>\n <Text dimColor>@ for file paths</Text>\n <Text dimColor>&amp; for background</Text>\n <Text dimColor>ctrl/opt + b bash mode</Text>\n </Box>\n\n <Box flexDirection=\"column\" width={middleWidth}>\n <Text dimColor>double tap esc to clear input</Text>\n <Text dimColor>\n {modeCycleShortcut.displayText.replace('+', ' + ')} to auto-accept\n edits\n </Text>\n <Text dimColor>ctrl + o for transcript output</Text>\n <Text dimColor>ctrl + t to show todos</Text>\n <Text dimColor>shift + enter for newline</Text>\n </Box>\n\n <Box flexDirection=\"column\">\n <Text dimColor>ctrl + _ to undo</Text>\n <Text dimColor>ctrl + v to paste images</Text>\n <Text dimColor>ctrl/opt + m switch model</Text>\n <Text dimColor>ctrl/opt + g ext editor</Text>\n <Text dimColor>\n <Text color={theme.secondaryText}>Esc</Text> to close\n </Text>\n </Box>\n </Box>\n </ScreenFrame>\n )\n}\n", "import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { Box, Text } from 'ink'\nimport figures from 'figures'\nimport { getTheme } from '#core/utils/theme'\nimport TextInput from '#ui-ink/components/TextInput'\nimport type { Key } from '#ui-ink/hooks/useKeypress'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\n\ntype PaletteAction = {\n id:\n | 'help'\n | 'config'\n | 'open'\n | 'console'\n | 'notifications'\n | 'transcript'\n | 'model'\n | 'doctor'\n label: string\n hint?: string\n shortcut?: string\n}\n\nconst VIEWPORT_SAFE_MARGIN_ROWS = 1\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n\nfunction getDefaultActions(): PaletteAction[] {\n return [\n {\n id: 'help',\n label: 'Help',\n shortcut: 'F1',\n hint: 'Keybindings and commands',\n },\n { id: 'config', label: 'Config', shortcut: 'F2', hint: 'Global settings' },\n {\n id: 'open',\n label: 'Open File',\n shortcut: 'F3',\n hint: 'Quick open + external editor',\n },\n {\n id: 'console',\n label: 'Console',\n shortcut: 'F4',\n hint: 'Captured stdout/stderr (TUI guard)',\n },\n {\n id: 'notifications',\n label: 'Notifications',\n shortcut: 'F5',\n hint: 'In-app inbox',\n },\n {\n id: 'transcript',\n label: 'Transcript',\n shortcut: 'F6',\n hint: 'Scroll + copy conversation',\n },\n { id: 'model', label: 'Models', hint: 'Provider + model settings' },\n { id: 'doctor', label: 'Doctor', hint: 'Terminal capability check' },\n ]\n}\n\nfunction normalizeQuery(value: string): string {\n return value.trim().toLowerCase()\n}\n\nfunction matchesQuery(action: PaletteAction, query: string): boolean {\n if (!query) return true\n const haystack = `${action.id} ${action.label} ${action.hint ?? ''} ${\n action.shortcut ?? ''\n }`.toLowerCase()\n return haystack.includes(query)\n}\n\nexport function CommandPaletteScreen({\n onDone,\n}: {\n onDone: (result?: PaletteAction['id']) => void\n}): React.ReactNode {\n const theme = getTheme()\n const layout = useScreenLayout()\n const { rows, columns } = layout\n const exitState = { pending: false, keyName: null } as const\n\n const paddingY = layout.paddingY\n const gap = layout.gap\n const paddingX = layout.paddingX\n\n const [query, setQuery] = useState('')\n const [cursorOffset, setCursorOffset] = useState(0)\n const [focusedIndex, setFocusedIndex] = useState(0)\n const [status, setStatus] = useState<string | null>(null)\n\n const actions = useMemo(() => getDefaultActions(), [])\n const normalizedQuery = useMemo(() => normalizeQuery(query), [query])\n const filtered = useMemo(\n () => actions.filter(action => matchesQuery(action, normalizedQuery)),\n [actions, normalizedQuery],\n )\n\n useEffect(() => {\n setFocusedIndex(prev => clamp(prev, 0, Math.max(0, filtered.length - 1)))\n }, [filtered.length])\n\n const headerRows = 4\n const footerRows = 1\n const reservedLines =\n (layout.tightLayout ? 8 : layout.compactLayout ? 10 : 12) +\n paddingY * 2 +\n gap * 4\n const availableForList = Math.max(\n 3,\n rows - reservedLines - headerRows - footerRows - VIEWPORT_SAFE_MARGIN_ROWS,\n )\n const visibleOptionCount = Math.max(\n 3,\n Math.min(10, filtered.length || 10, availableForList),\n )\n\n const clampedFocus =\n filtered.length === 0 ? 0 : clamp(focusedIndex, 0, filtered.length - 1)\n const half = Math.floor(visibleOptionCount / 2)\n const start = Math.max(\n 0,\n Math.min(\n clampedFocus - half,\n Math.max(0, filtered.length - visibleOptionCount),\n ),\n )\n const end = Math.min(filtered.length, start + visibleOptionCount)\n const showUp = start > 0\n const showDown = end < filtered.length\n\n const runSelection = useCallback(() => {\n const action = filtered[clampedFocus]\n if (!action) {\n setStatus(filtered.length === 0 ? 'No matches' : 'Nothing selected')\n return\n }\n onDone(action.id)\n }, [clampedFocus, filtered, onDone])\n\n const onSpecialKey = useCallback(\n (_input: string, key: Key): boolean => {\n if (key.escape) {\n onDone()\n return true\n }\n\n if (key.return) {\n runSelection()\n return true\n }\n\n const inputChar = _input.length === 1 ? _input : ''\n const isUp =\n key.upArrow || (key.ctrl && (inputChar === 'p' || inputChar === 'k'))\n const isDown =\n key.downArrow || (key.ctrl && (inputChar === 'n' || inputChar === 'j'))\n\n if (filtered.length === 0) {\n if (\n isUp ||\n isDown ||\n key.pageUp ||\n key.pageDown ||\n key.home ||\n key.end\n ) {\n return true\n }\n return false\n }\n\n if (isUp) {\n setFocusedIndex(prev => clamp(prev - 1, 0, filtered.length - 1))\n return true\n }\n if (isDown) {\n setFocusedIndex(prev => clamp(prev + 1, 0, filtered.length - 1))\n return true\n }\n if (key.pageUp) {\n setFocusedIndex(prev =>\n clamp(prev - visibleOptionCount, 0, filtered.length - 1),\n )\n return true\n }\n if (key.pageDown) {\n setFocusedIndex(prev =>\n clamp(prev + visibleOptionCount, 0, filtered.length - 1),\n )\n return true\n }\n if (key.home || (key.ctrl && inputChar === 'a')) {\n setFocusedIndex(0)\n return true\n }\n if (key.end || (key.ctrl && inputChar === 'e')) {\n setFocusedIndex(filtered.length - 1)\n return true\n }\n\n return false\n },\n [filtered.length, onDone, runSelection, visibleOptionCount],\n )\n\n const visible = useMemo(\n () => filtered.slice(start, end),\n [end, filtered, start],\n )\n const selected = filtered[clampedFocus]\n\n return (\n <ScreenFrame\n title=\"Command Palette\"\n exitState={exitState}\n paddingX={paddingX}\n paddingY={paddingY}\n gap={gap}\n >\n <Box flexDirection=\"column\" gap={gap}>\n <Box flexDirection=\"column\">\n <Text dimColor wrap=\"truncate-end\">\n Type to filter. Enter to run. Esc to close.\n </Text>\n <Box flexDirection=\"row\" gap={1}>\n <Text color={theme.secondaryText}>{figures.pointerSmall}</Text>\n <TextInput\n placeholder=\"Search\u2026\"\n value={query}\n onChange={value => {\n setQuery(value)\n setCursorOffset(value.length)\n setStatus(null)\n }}\n onSubmit={() => runSelection()}\n onExit={() => onDone()}\n columns={Math.max(10, columns - paddingX * 2 - 4)}\n cursorOffset={cursorOffset}\n onChangeCursorOffset={setCursorOffset}\n showCursor={true}\n focus={true}\n disableCursorMovementForUpDownKeys={true}\n onSpecialKey={onSpecialKey}\n />\n </Box>\n </Box>\n\n <Box flexDirection=\"column\" gap={0}>\n <Text dimColor wrap=\"truncate-end\">\n {status ??\n (filtered.length === 0\n ? 'No matches'\n : `Showing ${visible.length} of ${filtered.length}`)}\n </Text>\n <Box flexDirection=\"column\" width=\"100%\">\n <Text dimColor wrap=\"truncate-end\">\n {showUp ? `${figures.arrowUp} More` : ' '}\n </Text>\n {visible.map((action, idx) => {\n const absoluteIndex = start + idx\n const isFocused = absoluteIndex === clampedFocus\n const suffix = action.shortcut ? ` \u00B7 ${action.shortcut}` : ''\n return (\n <Box key={action.id} flexDirection=\"row\" gap={1}>\n <Text color={isFocused ? theme.kode : theme.secondaryText}>\n {isFocused ? figures.pointer : ' '}\n </Text>\n <Text\n color={isFocused ? theme.text : theme.secondaryText}\n bold={isFocused}\n wrap=\"truncate-end\"\n >\n {action.label}\n {suffix}\n </Text>\n </Box>\n )\n })}\n <Text dimColor wrap=\"truncate-end\">\n {showDown ? `${figures.arrowDown} More` : ' '}\n </Text>\n </Box>\n </Box>\n\n {selected ? (\n <Box flexDirection=\"column\">\n <Text color={theme.secondaryText} wrap=\"truncate-end\">\n {selected.hint ?? ''}\n </Text>\n </Box>\n ) : null}\n\n <Box marginTop={layout.tightLayout ? 0 : 1}>\n <Text dimColor wrap=\"truncate-end\">\n \u2191/\u2193 \u00B7 PgUp/PgDn \u00B7 Home/End \u00B7 Enter run \u00B7 Esc close\n </Text>\n </Box>\n </Box>\n </ScreenFrame>\n )\n}\n", "import React, { useCallback, useMemo, useState } from 'react'\nimport { Box, Text } from 'ink'\nimport figures from 'figures'\n\nimport { getGlobalHistoryWithPastes } from '#core/history'\nimport { getTheme } from '#core/utils/theme'\nimport TextInput from '#ui-ink/components/TextInput'\nimport type { Key } from '#ui-ink/hooks/useKeypress'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { KEYPRESS_PRIORITY } from '#ui-ink/constants/keypressPriority'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\n\nfunction normalizeQuery(value: string): string {\n return value.trim().toLowerCase()\n}\n\nfunction matchesQuery(haystack: string, query: string): boolean {\n if (!query) return true\n return haystack.toLowerCase().includes(query)\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n\nexport type HistorySearchDoneResult =\n | {\n action: 'accept'\n value: string\n pastedTexts: Array<{ placeholder: string; text: string }>\n }\n | {\n action: 'execute'\n value: string\n pastedTexts: Array<{ placeholder: string; text: string }>\n }\n | { action: 'cancel' }\n\nexport function HistorySearchScreen({\n onDone,\n}: {\n onDone: (result: HistorySearchDoneResult) => void\n}): React.ReactNode {\n const theme = getTheme()\n const layout = useScreenLayout()\n const exitState = { pending: false, keyName: null } as const\n\n const [query, setQuery] = useState('')\n const [cursorOffset, setCursorOffset] = useState(0)\n const [selectedIndex, setSelectedIndex] = useState(0)\n const [status, setStatus] = useState<string | null>(null)\n\n const normalizedQuery = useMemo(() => normalizeQuery(query), [query])\n const history = useMemo(() => getGlobalHistoryWithPastes(), [])\n const filtered = useMemo(\n () => history.filter(item => matchesQuery(item.display, normalizedQuery)),\n [history, normalizedQuery],\n )\n\n const clampedSelection = filtered.length\n ? clamp(selectedIndex, 0, filtered.length - 1)\n : 0\n\n const acceptSelection = useCallback(() => {\n const selected = filtered[clampedSelection]\n if (!selected) {\n setStatus(filtered.length === 0 ? 'No matches' : 'Nothing selected')\n return\n }\n onDone({\n action: 'accept',\n value: selected.display,\n pastedTexts: selected.pastedTexts,\n })\n }, [clampedSelection, filtered, onDone])\n\n const executeSelection = useCallback(() => {\n const selected = filtered[clampedSelection]\n if (!selected) {\n setStatus(filtered.length === 0 ? 'No matches' : 'Nothing selected')\n return\n }\n onDone({\n action: 'execute',\n value: selected.display,\n pastedTexts: selected.pastedTexts,\n })\n }, [clampedSelection, filtered, onDone])\n\n const cycleNext = useCallback(() => {\n if (filtered.length === 0) return\n setSelectedIndex(prev => (prev + 1) % filtered.length)\n }, [filtered.length])\n\n const onSpecialKey = useCallback(\n (input: string, key: Key): boolean => {\n const inputChar = input.length === 1 ? input : ''\n\n if (key.ctrl && inputChar === 'c') {\n onDone({ action: 'cancel' })\n return true\n }\n\n if (key.ctrl && key.return) {\n executeSelection()\n return true\n }\n\n if (key.tab) {\n acceptSelection()\n return true\n }\n\n if (key.return) {\n acceptSelection()\n return true\n }\n\n if (key.ctrl && inputChar === 'r') {\n cycleNext()\n return true\n }\n\n if (key.escape) {\n if (query.trim()) {\n setQuery('')\n setCursorOffset(0)\n setSelectedIndex(0)\n setStatus(null)\n return true\n }\n onDone({ action: 'cancel' })\n return true\n }\n\n if (key.upArrow) {\n if (filtered.length === 0) return true\n setSelectedIndex(prev => clamp(prev - 1, 0, filtered.length - 1))\n return true\n }\n if (key.downArrow) {\n if (filtered.length === 0) return true\n setSelectedIndex(prev => clamp(prev + 1, 0, filtered.length - 1))\n return true\n }\n\n return false\n },\n [\n acceptSelection,\n cycleNext,\n executeSelection,\n filtered.length,\n onDone,\n query,\n ],\n )\n\n useKeypress(\n (input, key) => {\n if (key.ctrl && input === 'c') {\n onDone({ action: 'cancel' })\n return true\n }\n },\n { priority: KEYPRESS_PRIORITY.FULLSCREEN_OVERLAY },\n )\n\n const shortcutLine =\n 'Type to filter \u00B7 \u2191/\u2193 select \u00B7 Enter accept \u00B7 Ctrl+Enter execute \u00B7 Esc clear/back \u00B7 Ctrl+R next \u00B7 Ctrl+C cancel'\n\n return (\n <ScreenFrame\n title=\"History Search\"\n exitState={exitState}\n paddingX={layout.paddingX}\n paddingY={layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Text dimColor wrap=\"truncate-end\">\n {shortcutLine}\n </Text>\n\n <Box flexDirection=\"row\" gap={1}>\n <Text color={theme.secondaryText}>{figures.pointerSmall}</Text>\n <TextInput\n placeholder=\"Search history\u2026\"\n value={query}\n onChange={value => {\n setQuery(value)\n setCursorOffset(value.length)\n setStatus(null)\n setSelectedIndex(0)\n }}\n onSubmit={() => acceptSelection()}\n onExit={() => onDone({ action: 'cancel' })}\n columns={Math.max(10, layout.columns - layout.paddingX * 2 - 4)}\n cursorOffset={cursorOffset}\n onChangeCursorOffset={setCursorOffset}\n showCursor={true}\n focus={true}\n disableCursorMovementForUpDownKeys={true}\n onSpecialKey={onSpecialKey}\n />\n </Box>\n\n <Box flexDirection=\"column\">\n <Text dimColor wrap=\"truncate-end\">\n {status ??\n (filtered.length === 0\n ? 'No matches'\n : `Showing ${filtered.length} matches`)}\n </Text>\n\n {filtered.length > 0 ? (\n filtered.slice(0, 12).map((item, idx) => {\n const isSelected = idx === clampedSelection\n return (\n <Text\n key={`${idx}:${item.display}`}\n color={isSelected ? theme.text : theme.secondaryText}\n wrap=\"truncate-end\"\n bold={isSelected}\n >\n {isSelected ? figures.pointer : ' '} {item.display}\n </Text>\n )\n })\n ) : (\n <Text dimColor>(empty)</Text>\n )}\n </Box>\n\n <Text dimColor wrap=\"truncate-end\">\n Tip: history includes bash commands with a leading `!`\n </Text>\n </Box>\n </ScreenFrame>\n )\n}\n", "import React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport { Box, Text } from 'ink'\nimport figures from 'figures'\n\nimport { getModelManager } from '#core/utils/model'\nimport { getTheme } from '#core/utils/theme'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { KEYPRESS_PRIORITY } from '#ui-ink/constants/keypressPriority'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n\nexport function ModelPickerScreen({\n onDone,\n onSelectModel,\n}: {\n onDone: () => void\n onSelectModel: (modelName: string) => void\n}): React.ReactNode {\n const theme = getTheme()\n const layout = useScreenLayout()\n const exitState = { pending: false, keyName: null } as const\n\n const modelManager = useMemo(() => getModelManager(), [])\n const currentMainModelName = modelManager.getModelName('main')\n const models = useMemo(\n () => modelManager.getAllConfiguredModels(),\n [modelManager],\n )\n\n const initialIndex = useMemo(() => {\n if (!currentMainModelName) return 0\n const idx = models.findIndex(m => m.modelName === currentMainModelName)\n return idx >= 0 ? idx : 0\n }, [currentMainModelName, models])\n\n const [selectedIndex, setSelectedIndex] = useState(initialIndex)\n const [status, setStatus] = useState<string | null>(null)\n\n useEffect(() => {\n setSelectedIndex(prev => clamp(prev, 0, Math.max(0, models.length - 1)))\n }, [models.length])\n\n const confirm = useCallback(() => {\n const selected = models[selectedIndex]\n if (!selected) {\n setStatus(\n models.length === 0 ? 'No models configured' : 'Nothing selected',\n )\n return\n }\n onSelectModel(selected.modelName)\n onDone()\n }, [models, onDone, onSelectModel, selectedIndex])\n\n useKeypress(\n (input, key) => {\n const inputChar = input.length === 1 ? input : ''\n\n if (\n key.escape ||\n (key.ctrl && inputChar === 'c') ||\n (key.meta && inputChar === 'p')\n ) {\n onDone()\n return true\n }\n\n if (key.return) {\n confirm()\n return true\n }\n\n if (key.upArrow || inputChar === 'k') {\n setSelectedIndex(prev =>\n clamp(prev - 1, 0, Math.max(0, models.length - 1)),\n )\n return true\n }\n\n if (key.downArrow || inputChar === 'j') {\n setSelectedIndex(prev =>\n clamp(prev + 1, 0, Math.max(0, models.length - 1)),\n )\n return true\n }\n\n return\n },\n { priority: KEYPRESS_PRIORITY.FULLSCREEN_OVERLAY },\n )\n\n const shortcutLine = '\u2191/\u2193 select \u00B7 Enter apply \u00B7 Esc/Ctrl+C close'\n\n return (\n <ScreenFrame\n title=\"Model Picker\"\n exitState={exitState}\n paddingX={layout.paddingX}\n paddingY={layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Text dimColor wrap=\"truncate-end\">\n {shortcutLine}\n </Text>\n\n <Text dimColor wrap=\"truncate-end\">\n {status ??\n (models.length > 0\n ? `Current: ${currentMainModelName ?? '(none)'}`\n : 'No models configured. Use /model to add models.')}\n </Text>\n\n <Box flexDirection=\"column\">\n {models.length > 0 ? (\n models.slice(0, 16).map((model, idx) => {\n const isSelected = idx === selectedIndex\n const label = `${model.name} (${model.provider}) \u00B7 ${model.modelName}${\n model.isActive ? '' : ' (inactive)'\n }`\n return (\n <Text\n key={model.modelName}\n color={isSelected ? theme.text : theme.secondaryText}\n bold={isSelected}\n wrap=\"truncate-end\"\n >\n {isSelected ? figures.pointer : ' '} {label}\n </Text>\n )\n })\n ) : (\n <Text dimColor>(empty)</Text>\n )}\n </Box>\n </Box>\n </ScreenFrame>\n )\n}\n", "import React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport { Box, Text } from 'ink'\nimport figures from 'figures'\n\nimport { getTheme } from '#core/utils/theme'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { KEYPRESS_PRIORITY } from '#ui-ink/constants/keypressPriority'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\n\ntype ThinkingToggleOption = {\n value: boolean\n label: string\n description: string\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n\nexport function ThinkingToggleScreen({\n currentValue,\n isMidConversation,\n onSelect,\n onDone,\n}: {\n currentValue: boolean\n isMidConversation: boolean\n onSelect: (value: boolean) => void\n onDone: () => void\n}): React.ReactNode {\n const theme = getTheme()\n const layout = useScreenLayout()\n const exitState = { pending: false, keyName: null } as const\n\n const options: ThinkingToggleOption[] = useMemo(\n () => [\n {\n value: true,\n label: 'Enabled',\n description: 'The model will think before responding',\n },\n {\n value: false,\n label: 'Disabled',\n description: 'The model will respond without extended thinking',\n },\n ],\n [],\n )\n\n const initialIndex = currentValue ? 0 : 1\n const [selectedIndex, setSelectedIndex] = useState(initialIndex)\n\n useEffect(() => {\n setSelectedIndex(prev => clamp(prev, 0, Math.max(0, options.length - 1)))\n }, [options.length])\n\n const confirm = useCallback(() => {\n const option = options[selectedIndex]\n if (!option) return\n onSelect(option.value)\n onDone()\n }, [onDone, onSelect, options, selectedIndex])\n\n useKeypress(\n (input, key) => {\n const inputChar = input.length === 1 ? input : ''\n\n if (\n key.escape ||\n (key.ctrl && inputChar === 'c') ||\n (key.meta && inputChar === 't')\n ) {\n onDone()\n return true\n }\n\n if (key.return) {\n confirm()\n return true\n }\n\n if (key.upArrow || inputChar === 'k') {\n setSelectedIndex(prev =>\n clamp(prev - 1, 0, Math.max(0, options.length - 1)),\n )\n return true\n }\n\n if (key.downArrow || inputChar === 'j') {\n setSelectedIndex(prev =>\n clamp(prev + 1, 0, Math.max(0, options.length - 1)),\n )\n return true\n }\n\n return\n },\n { priority: KEYPRESS_PRIORITY.FULLSCREEN_OVERLAY },\n )\n\n const shortcutLine = '\u2191/\u2193 select \u00B7 Enter confirm \u00B7 Esc/Ctrl+C close'\n\n return (\n <ScreenFrame\n title=\"Toggle thinking mode\"\n exitState={exitState}\n paddingX={layout.paddingX}\n paddingY={layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Text dimColor wrap=\"truncate-end\">\n {shortcutLine}\n </Text>\n\n <Box flexDirection=\"column\">\n <Text dimColor wrap=\"truncate-end\">\n Enable or disable thinking for this session.\n </Text>\n {isMidConversation && (\n <Text color={theme.warning}>\n Changing mid-conversation may reduce quality. For best results,\n set this at the start of a session.\n </Text>\n )}\n </Box>\n\n <Box flexDirection=\"column\">\n {options.map((option, idx) => {\n const isSelected = idx === selectedIndex\n return (\n <Text\n key={option.label}\n color={isSelected ? theme.text : theme.secondaryText}\n bold={isSelected}\n wrap=\"truncate-end\"\n >\n {isSelected ? figures.pointer : ' '} {option.label} \u2014{' '}\n {option.description}\n </Text>\n )\n })}\n </Box>\n </Box>\n </ScreenFrame>\n )\n}\n", "import { Box } from 'ink'\nimport type {\n TextBlock,\n ToolUseBlockParam,\n} from '@anthropic-ai/sdk/resources/index.mjs'\nimport * as React from 'react'\nimport { useMemo, useRef } 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 type { UUID } from '#core/types/common'\nimport { getReplStaticPrefixLength } from '#cli-utils/replStaticSplit'\nimport { findSafeSplitPoint } from '#cli-utils/markdownSplit'\n\nconst MAX_TRANSIENT_TAIL_LENGTH = 2000\nconst MIN_TRANSIENT_CHUNK_LENGTH = 400\n\ntype ChunkState = {\n chunks: string[]\n prefixText: string\n}\n\ntype RenderMessage = {\n message: NormalizedMessage\n key: string\n isTransient: boolean\n}\n\nfunction cloneAssistantTextMessage(\n message: NormalizedMessage,\n text: string,\n uuid: UUID,\n includeCost: boolean,\n): NormalizedMessage {\n const assistant = message as Extract<NormalizedMessage, { type: 'assistant' }>\n const baseContent = Array.isArray(assistant.message.content)\n ? assistant.message.content[0]\n : {\n type: 'text',\n text: String(assistant.message.content ?? ''),\n citations: [],\n }\n const textBlock: TextBlock = {\n ...(baseContent as TextBlock),\n citations: (baseContent as TextBlock).citations ?? [],\n text,\n }\n\n return {\n ...assistant,\n uuid,\n costUSD: includeCost ? assistant.costUSD : 0,\n durationMs: includeCost ? assistant.durationMs : 0,\n message: {\n ...assistant.message,\n content: [textBlock],\n },\n }\n}\n\nfunction isAssistantTextMessage(message: NormalizedMessage): boolean {\n if (message.type !== 'assistant') return false\n if (!Array.isArray(message.message.content)) return false\n return message.message.content[0]?.type === 'text'\n}\n\nfunction splitTransientTextMessage(\n message: NormalizedMessage,\n chunkState: Map<string, ChunkState>,\n): { chunks: string[]; tail: string } | null {\n if (!isAssistantTextMessage(message)) return null\n\n const assistant = message as Extract<NormalizedMessage, { type: 'assistant' }>\n const text = (assistant.message.content[0] as TextBlock).text ?? ''\n const existing = chunkState.get(message.uuid)\n const prefixText = existing?.prefixText ?? ''\n\n if (prefixText && !text.startsWith(prefixText)) {\n chunkState.delete(message.uuid)\n }\n\n const state = chunkState.get(message.uuid) ?? { chunks: [], prefixText: '' }\n let tail = text.slice(state.prefixText.length)\n let didUpdate = false\n\n while (tail.length > MAX_TRANSIENT_TAIL_LENGTH + MIN_TRANSIENT_CHUNK_LENGTH) {\n const splitAt = findSafeSplitPoint(\n tail,\n tail.length - MAX_TRANSIENT_TAIL_LENGTH,\n )\n if (splitAt <= 0) break\n const chunk = tail.slice(0, splitAt)\n if (chunk.length < MIN_TRANSIENT_CHUNK_LENGTH) break\n state.chunks.push(chunk)\n state.prefixText += chunk\n tail = tail.slice(splitAt)\n didUpdate = true\n }\n\n if (state.chunks.length === 0) {\n chunkState.delete(message.uuid)\n return null\n }\n\n if (didUpdate || !existing) {\n chunkState.set(message.uuid, state)\n }\n\n return { chunks: state.chunks, tail }\n}\n\nexport type TranscriptItem = { jsx: ReactNode; key: string }\n\nexport function useTranscriptItems(args: {\n messages: MessageType[]\n tools: Tool[]\n verbose: boolean\n debug: boolean\n toolJSX: {\n jsx: ReactNode | null\n shouldHidePromptInput: boolean\n displayMode?: 'inline' | 'fullscreen'\n } | 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 chunkStateRef = useRef<Map<string, ChunkState>>(new Map())\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 chunked = useMemo(() => {\n const chunkState = chunkStateRef.current\n const activeIds = new Set<string>(\n orderedMessages.map(message => message.uuid),\n )\n for (const key of chunkState.keys()) {\n if (!activeIds.has(key)) {\n chunkState.delete(key)\n }\n }\n\n const renderMessages: RenderMessage[] = []\n let staticPrefixExtra = 0\n\n orderedMessages.forEach((message, index) => {\n if (index < replStaticPrefixLength) {\n chunkState.delete(message.uuid)\n renderMessages.push({\n message,\n key: message.uuid,\n isTransient: false,\n })\n return\n }\n\n if (index === replStaticPrefixLength) {\n const split = splitTransientTextMessage(message, chunkState)\n if (split) {\n const { chunks, tail } = split\n const tailHasContent = tail.length > 0\n\n chunks.forEach((chunk, chunkIndex) => {\n const isLastChunk = chunkIndex === chunks.length - 1\n const includeCost = !tailHasContent && isLastChunk\n const chunkMessage = cloneAssistantTextMessage(\n message,\n chunk,\n `${message.uuid}:chunk:${chunkIndex}`,\n includeCost,\n )\n renderMessages.push({\n message: chunkMessage,\n key: chunkMessage.uuid,\n isTransient: false,\n })\n })\n\n staticPrefixExtra += chunks.length\n\n if (tailHasContent) {\n const tailMessage = cloneAssistantTextMessage(\n message,\n tail,\n `${message.uuid}:tail`,\n true,\n )\n renderMessages.push({\n message: tailMessage,\n key: tailMessage.uuid,\n isTransient: true,\n })\n }\n return\n }\n }\n\n renderMessages.push({\n message,\n key: message.uuid,\n isTransient: true,\n })\n })\n\n return {\n renderMessages,\n replStaticPrefixLength: replStaticPrefixLength + staticPrefixExtra,\n }\n }, [orderedMessages, replStaticPrefixLength])\n\n const items = useMemo(() => {\n return chunked.renderMessages.map(\n ({ message, key, isTransient }, index) => {\n const toolUseID = getToolUseID(message)\n const isInStaticPrefix = index < chunked.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 isTransient={isTransient}\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 (\n message.content.message\n .content[0]! as ToolUseBlockParam\n ).id,\n ])\n }\n shouldAnimate={false}\n shouldShowDot={false}\n isTransient={isTransient}\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 isTransient={isTransient}\n />\n )\n\n if (args.debug) {\n return {\n key,\n jsx: (\n <Box\n borderStyle=\"single\"\n borderColor={isInStaticPrefix ? 'green' : 'red'}\n key={key}\n width=\"100%\"\n >\n {rendered}\n </Box>\n ),\n }\n }\n\n return {\n key,\n jsx: (\n <Box key={key} width=\"100%\">\n {rendered}\n </Box>\n ),\n }\n },\n )\n }, [\n args.debug,\n args.isMessageSelectorVisible,\n args.toolJSX,\n args.toolUseConfirm,\n args.tools,\n args.verbose,\n chunked.renderMessages,\n chunked.replStaticPrefixLength,\n erroredToolUseIDs,\n inProgressToolUseIDs,\n normalizedMessages,\n unresolvedToolUseIDs,\n ])\n\n return {\n normalizedMessages,\n orderedMessages,\n unresolvedToolUseIDs,\n inProgressToolUseIDs,\n erroredToolUseIDs,\n replStaticPrefixLength: chunked.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", "function isIndexInsideCodeBlock(content: string, indexToTest: number): boolean {\n let fenceCount = 0\n let searchPos = 0\n while (searchPos < content.length) {\n const nextFence = content.indexOf('```', searchPos)\n if (nextFence === -1 || nextFence >= indexToTest) {\n break\n }\n fenceCount += 1\n searchPos = nextFence + 3\n }\n return fenceCount % 2 === 1\n}\n\nfunction findEnclosingCodeBlockStart(content: string, index: number): number {\n if (!isIndexInsideCodeBlock(content, index)) {\n return -1\n }\n let searchPos = 0\n while (searchPos < index) {\n const blockStartIndex = content.indexOf('```', searchPos)\n if (blockStartIndex === -1 || blockStartIndex >= index) {\n break\n }\n const blockEndIndex = content.indexOf('```', blockStartIndex + 3)\n if (blockStartIndex < index) {\n if (blockEndIndex === -1 || index < blockEndIndex + 3) {\n return blockStartIndex\n }\n }\n if (blockEndIndex === -1) break\n searchPos = blockEndIndex + 3\n }\n return -1\n}\n\nexport function findSafeSplitPoint(content: string, maxLength: number): number {\n if (content.length <= maxLength) return content.length\n\n if (isIndexInsideCodeBlock(content, maxLength)) {\n const enclosingStart = findEnclosingCodeBlockStart(content, maxLength)\n if (enclosingStart > 0) {\n return enclosingStart\n }\n }\n\n let searchStart = Math.min(maxLength, content.length)\n while (searchStart >= 0) {\n const dnlIndex = content.lastIndexOf('\\n\\n', searchStart)\n if (dnlIndex === -1) break\n const splitPoint = dnlIndex + 2\n if (splitPoint > 0 && !isIndexInsideCodeBlock(content, splitPoint)) {\n return splitPoint\n }\n searchStart = dnlIndex - 1\n }\n\n searchStart = Math.min(maxLength, content.length)\n while (searchStart >= 0) {\n const nlIndex = content.lastIndexOf('\\n', searchStart)\n if (nlIndex === -1) break\n const splitPoint = nlIndex + 1\n if (splitPoint > 0 && !isIndexInsideCodeBlock(content, splitPoint)) {\n return splitPoint\n }\n searchStart = nlIndex - 1\n }\n\n return Math.min(maxLength, content.length)\n}\n\nexport function splitMarkdownIntoChunks(\n content: string,\n maxChunkLength: number,\n): string[] {\n if (!content) return ['']\n if (maxChunkLength <= 0 || content.length <= maxChunkLength) {\n return [content]\n }\n\n const chunks: string[] = []\n let remaining = content\n\n while (remaining.length > maxChunkLength) {\n const splitPoint = findSafeSplitPoint(remaining, maxChunkLength)\n if (splitPoint <= 0) {\n chunks.push(remaining.slice(0, maxChunkLength))\n remaining = remaining.slice(maxChunkLength)\n continue\n }\n chunks.push(remaining.slice(0, splitPoint))\n remaining = remaining.slice(splitPoint)\n }\n\n if (remaining.length > 0) {\n chunks.push(remaining)\n }\n\n return chunks\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 { getContext } from '#core/context'\nimport { getMaxThinkingTokens } from '#core/utils/thinking'\nimport { getLastAssistantMessageId } from '#core/utils/messages'\nimport { buildSystemPromptForSession, 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 systemPromptOverride?: string\n appendSystemPrompt?: string\n messages: MessageType[]\n setMessages: React.Dispatch<React.SetStateAction<MessageType[]>>\n commands: Command[]\n forkNumber: number\n messageLogName: string\n thinkingMode?: 'auto' | 'enabled' | 'disabled'\n tools: Tool[]\n mcpClients: WrappedClient[]\n verbose: boolean\n safeMode: boolean\n checkPendingForkAndSuppressAppend?: (newMessages: MessageType[]) => 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 try {\n const shouldSuppressAppend =\n args.checkPendingForkAndSuppressAppend?.(newMessages) ?? false\n if (shouldSuppressAppend) {\n args.setAbortController(null)\n args.setIsLoading(false)\n return\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 buildSystemPromptForSession({\n disableSlashCommands: args.disableSlashCommands,\n systemPromptOverride: args.systemPromptOverride,\n appendSystemPrompt: args.appendSystemPrompt,\n outputStyleActive: outputStyle !== null,\n keepCodingInstructions: outputStyle?.keepCodingInstructions,\n }),\n getContext(),\n getMaxThinkingTokens([...args.messages, lastMessage], {\n thinkingMode: args.thinkingMode,\n }),\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 agentId: 'main',\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 thinkingMode: args.thinkingMode,\n requestToolUsePermission: args.requestToolUsePermission,\n isKodingRequest: isKodingRequest || undefined,\n toolPermissionContext: getToolPermissionContextForConversationKey({\n conversationKey: `${args.messageLogName}:${args.forkNumber}`,\n isBypassPermissionsModeAvailable: !args.safeMode,\n }),\n getCustomSystemPromptAdditions:\n getOutputStyleSystemPromptAdditions,\n },\n messageId: getLastAssistantMessageId([\n ...args.messages,\n lastMessage,\n ]),\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 } catch (error) {\n logError(error)\n debugLogger.error('REPL_QUERY_ERROR', { error })\n } finally {\n // Ensure the UI never gets stuck in a \"loading\" state when a turn fails early.\n args.setIsLoading(false)\n }\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'\nimport type { SetForkConvoWithMessagesOnTheNextRender } from '#ui-ink/types/conversationReset'\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: SetForkConvoWithMessagesOnTheNextRender\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: SetForkConvoWithMessagesOnTheNextRender\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 initialPrompt?: PromptInputProps['initialPrompt']\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 onManageTasks?: PromptInputProps['onManageTasks']\n restorePastes?: PromptInputProps['restorePastes']\n onRestorePastesApplied?: PromptInputProps['onRestorePastesApplied']\n draftPastes?: PromptInputProps['draftPastes']\n onDraftPastesChange?: PromptInputProps['onDraftPastesChange']\n}): PromptInputProps {\n return {\n commands: args.commands,\n forkNumber: args.forkNumber,\n messageLogName: args.messageLogName,\n initialPrompt: args.initialPrompt,\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 onManageTasks: args.onManageTasks,\n restorePastes: args.restorePastes,\n onRestorePastesApplied: args.onRestorePastesApplied,\n draftPastes: args.draftPastes,\n onDraftPastesChange: args.onDraftPastesChange,\n }\n}\n", "import type React from 'react'\nimport { useCallback } from 'react'\nimport type { Message as MessageType } from '#core/query'\nimport type { SetForkConvoWithMessagesOnTheNextRender } from '#ui-ink/types/conversationReset'\n\nfunction getMessageUuid(message: MessageType): string | undefined {\n const record = message as unknown as { uuid?: unknown }\n return typeof record.uuid === 'string' ? record.uuid : undefined\n}\n\nfunction extractMessageText(content: unknown): string {\n if (typeof content === 'string') return content\n if (!Array.isArray(content)) return ''\n\n const parts: string[] = []\n for (const block of content) {\n if (!block || typeof block !== 'object') continue\n const record = block as Record<string, unknown>\n if (record.type !== 'text') continue\n parts.push(String(record.text ?? ''))\n }\n\n return parts.join('\\n')\n}\n\nexport function useMessageSelectorSelect(args: {\n messages: MessageType[]\n setIsMessageSelectorVisible: React.Dispatch<React.SetStateAction<boolean>>\n setForkConvoWithMessagesOnTheNextRender: SetForkConvoWithMessagesOnTheNextRender\n setInputValue: React.Dispatch<React.SetStateAction<string>>\n onCancel: () => void\n}) {\n return useCallback(\n (message: MessageType) => {\n args.setIsMessageSelectorVisible(false)\n\n const selectedUuid = getMessageUuid(message)\n const selectedIndex =\n selectedUuid === undefined\n ? args.messages.indexOf(message)\n : args.messages.findIndex(m => getMessageUuid(m) === selectedUuid)\n if (selectedIndex < 0) return\n\n args.onCancel()\n\n // Use setImmediate to ensure the \"Interrupted by user\" message renders\n // before we clear and reset the conversation\n setImmediate(() => {\n const forkMessages = args.messages\n .slice(0, selectedIndex)\n .filter(m => m.type !== 'progress')\n\n // Use clearViewport option - the fork effect will clear terminal and\n // atomically update forkNumber + messages in a single batched update.\n // This prevents intermediate renders that cause content duplication.\n args.setForkConvoWithMessagesOnTheNextRender(forkMessages, {\n clearViewport: true,\n })\n\n // Set input value to selected message content if it's a user message\n if (message.type === 'user') {\n args.setInputValue(extractMessageText(message.message.content))\n }\n })\n },\n [args],\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["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, Static, Text, type DOMElement, measureElement } from 'ink'\nimport * as React from 'react'\nimport {\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport type { ReactNode } from 'react'\n\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/contexts/PermissionContext'\nimport { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\nimport { useFlickerDetector } from '#ui-ink/hooks/useFlickerDetector'\nimport type { NormalizedMessage } 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'\nimport { TransientViewportProvider } from '#ui-ink/contexts/TransientViewportContext'\n\nconst VIEWPORT_SAFE_MARGIN_ROWS = 1\nconst MEASURE_DEBOUNCE_MS = 400\n\nexport function REPLView({\n conversationKey,\n safeMode,\n debug,\n forkNumber,\n staticItems,\n transientItems,\n toolJSX,\n toolUseConfirm,\n setToolUseConfirm,\n toast,\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: {\n jsx: ReactNode | null\n shouldHidePromptInput: boolean\n displayMode?: 'inline' | 'fullscreen'\n } | null\n toolUseConfirm: ToolUseConfirm | null\n setToolUseConfirm: (confirm: ToolUseConfirm | null) => void\n toast: string | null\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 const rootUiRef = useRef<DOMElement | null>(null)\n const mainControlsRef = useRef<DOMElement | null>(null)\n const messageSelectorRef = useRef<DOMElement | null>(null)\n const lastMeasureKeyRef = useRef('')\n const lastMeasureAtRef = useRef(0)\n const { rows, columns } = useTerminalSize()\n useFlickerDetector(\n rootUiRef,\n rows,\n debug || Boolean(process.env.KODE_DEBUG_FLICKER),\n )\n\n const isFullScreenToolView = toolJSX?.displayMode === 'fullscreen'\n const hasToolJSX = Boolean(toolJSX)\n const hasToolUseConfirm = Boolean(toolUseConfirm)\n const hasBinaryFeedback = Boolean(binaryFeedbackContext)\n const hasToast = Boolean(toast)\n\n const [mainControlsHeight, setMainControlsHeight] = useState(0)\n const [messageSelectorHeight, setMessageSelectorHeight] = useState(0)\n\n useLayoutEffect(() => {\n if (rows <= 0 || columns <= 0) return\n const measureKey = [\n rows,\n columns,\n isMessageSelectorVisible ? 1 : 0,\n isFullScreenToolView ? 1 : 0,\n hasToolJSX ? 1 : 0,\n hasToolUseConfirm ? 1 : 0,\n hasBinaryFeedback ? 1 : 0,\n showingCostDialog ? 1 : 0,\n shouldShowPromptInput ? 1 : 0,\n hasToast ? 1 : 0,\n isLoading ? 1 : 0,\n messageSelectorMessages.length,\n ].join(':')\n\n const now = Date.now()\n if (\n measureKey === lastMeasureKeyRef.current &&\n now - lastMeasureAtRef.current < 200\n ) {\n return\n }\n\n lastMeasureKeyRef.current = measureKey\n lastMeasureAtRef.current = now\n\n if (mainControlsRef.current) {\n const measured = measureElement(mainControlsRef.current).height\n setMainControlsHeight(prev => (prev === measured ? prev : measured))\n } else {\n setMainControlsHeight(prev => (prev === 0 ? prev : 0))\n }\n\n if (messageSelectorRef.current) {\n const measured = measureElement(messageSelectorRef.current).height\n setMessageSelectorHeight(prev => (prev === measured ? prev : measured))\n } else {\n setMessageSelectorHeight(prev => (prev === 0 ? prev : 0))\n }\n }, [\n rows,\n columns,\n isMessageSelectorVisible,\n isFullScreenToolView,\n hasToolJSX,\n hasToolUseConfirm,\n hasBinaryFeedback,\n showingCostDialog,\n shouldShowPromptInput,\n hasToast,\n isLoading,\n messageSelectorMessages.length,\n ])\n\n const transientMaxHeight = Math.max(\n 1,\n rows -\n mainControlsHeight -\n messageSelectorHeight -\n VIEWPORT_SAFE_MARGIN_ROWS,\n )\n const transientViewportValue = useMemo(\n () => ({ maxHeight: transientMaxHeight }),\n [transientMaxHeight],\n )\n\n return (\n <TransientViewportProvider value={transientViewportValue}>\n <PermissionProvider\n conversationKey={conversationKey}\n isBypassPermissionsModeAvailable={!safeMode}\n >\n {isFullScreenToolView && toolJSX ? (\n <Box ref={rootUiRef} flexDirection=\"column\" width=\"100%\">\n {toolJSX.jsx}\n </Box>\n ) : (\n <Box ref={rootUiRef} flexDirection=\"column\" width=\"100%\">\n <Static key={`static-${forkNumber}`} items={staticItems}>\n {(item: TranscriptItem) => item.jsx}\n </Static>\n\n <Box flexDirection=\"column\" width=\"100%\">\n {transientItems.map(item => item.jsx)}\n {/* Status indicator at bottom of messages, above controls */}\n {!toolJSX &&\n !toolUseConfirm &&\n !binaryFeedbackContext &&\n isLoading && <RequestStatusIndicator />}\n </Box>\n\n <Box\n ref={mainControlsRef}\n borderColor=\"red\"\n borderStyle={debug ? 'single' : undefined}\n flexDirection=\"column\"\n width=\"100%\"\n >\n {toast &&\n !toolUseConfirm &&\n !toolJSX &&\n !binaryFeedbackContext && (\n <Box paddingX={1} marginTop={1}>\n <Text color=\"yellow\" dimColor wrap=\"truncate-end\">\n {toast}\n </Text>\n </Box>\n )}\n\n {toolJSX ? toolJSX.jsx : null}\n\n {!toolJSX &&\n binaryFeedbackContext &&\n !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\n {!toolJSX &&\n toolUseConfirm &&\n !isMessageSelectorVisible &&\n !binaryFeedbackContext && (\n <PermissionRequest\n toolUseConfirm={toolUseConfirm}\n onDone={() => setToolUseConfirm(null)}\n verbose={verbose}\n />\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 && (\n <PromptInput\n key={`prompt-${conversationKey}`}\n {...promptInputProps}\n />\n )}\n </Box>\n\n {isMessageSelectorVisible && (\n <Box ref={messageSelectorRef} flexDirection=\"column\" width=\"100%\">\n <MessageSelector\n erroredToolUseIDs={erroredToolUseIDs}\n unresolvedToolUseIDs={unresolvedToolUseIDs}\n messages={messageSelectorMessages}\n onSelect={onMessageSelectorSelect}\n onEscape={onMessageSelectorEscape}\n tools={tools}\n />\n </Box>\n )}\n </Box>\n )}\n </PermissionProvider>\n </TransientViewportProvider>\n )\n}\n", "import * 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 { ExitPlanModeTool } from '#tools/tools/interaction/PlanModeTool/ExitPlanModeTool'\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'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\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 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 blockedPath?: string\n decisionReason?: string\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 and Esc (reject).\n useKeypress(\n (input, key) => {\n if (key.ctrl && input === 'c') {\n onDone()\n toolUseConfirm.onReject()\n return true\n }\n\n if (key.escape) {\n onDone()\n toolUseConfirm.onReject()\n return true\n }\n },\n // Let tool-specific permission UIs intercept Esc first (e.g. WebFetch logging).\n { priority: -10 },\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 } 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 { textColorForRiskScore } 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/contexts/PermissionContext'\nimport { isPathInWorkingDirectories } from '#core/utils/permissions/fileToolPermissionEngine'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\nimport { PermissionRequestDetails } from '#ui-ink/components/permissions/PermissionRequestDetails'\nimport { applyToolPermissionUpdatesToLiveToolUseContext } from '../liveToolPermissionContext'\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: 'Allow once',\n value: 'yes',\n },\n {\n label: `Deny 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 ? `Allow all edits during this session ${shortcutHint}`\n : `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 layout = useScreenLayout()\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 applyToolPermissionUpdatesToLiveToolUseContext({\n toolUseContext: toolUseConfirm.toolUseContext,\n updates: toolUseConfirm.suggestions ?? [],\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 useKeypress((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 marginTop={1} width=\"100%\">\n <ScreenFrame\n title=\"Edit file permission\"\n titleColor={textColorForRiskScore(toolUseConfirm.riskScore)}\n paddingX={layout.paddingX}\n paddingY={layout.tightLayout ? 0 : layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\" gap={layout.gap}>\n <PermissionRequestDetails toolUseConfirm={toolUseConfirm} />\n <FileEditToolDiff\n file_path={file_path}\n new_string={new_string}\n old_string={old_string}\n verbose={verbose}\n width={Math.max(10, columns - layout.paddingX * 2 - 2)}\n enableScrolling={true}\n />\n\n <Box flexDirection=\"column\">\n <Text>\n Allow this edit to <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\n <Text dimColor wrap=\"truncate-end\">\n Enter to confirm \u00B7 Esc to reject \u00B7 PgUp/PgDn scroll diff\n {hasSessionSuggestion\n ? ` \u00B7 ${modeCycleShortcut.displayText} allow session`\n : ''}\n </Text>\n </Box>\n </ScreenFrame>\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 { Box, Text } from 'ink'\nimport { getCwd } from '#core/utils/state'\nimport { relative } from 'path'\nimport { getPatch } from '#core/utils/diff'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\nimport { getWindowedList } from '#ui-ink/primitives/list/windowedList'\nimport { structuredDiffLines } from '#ui-ink/components/StructuredDiff'\nimport figures from 'figures'\n\ntype Props = {\n file_path: string\n new_string: string\n old_string: string\n verbose: boolean\n width: number\n enableScrolling?: boolean\n maxVisibleRows?: number\n}\n\nexport function FileEditToolDiff({\n file_path,\n new_string,\n old_string,\n verbose,\n width,\n enableScrolling = false,\n maxVisibleRows,\n}: Props): React.ReactNode {\n const { rows } = useTerminalSize()\n const safeWidth = Math.max(10, Math.floor(width))\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 const diffLines = useMemo(() => {\n const lines: React.ReactNode[] = []\n for (let i = 0; i < patch.length; i += 1) {\n const hunk = patch[i]\n if (!hunk) continue\n lines.push(\n ...structuredDiffLines({ patch: hunk, width: safeWidth, dim: false }),\n )\n if (i < patch.length - 1) {\n lines.push(\n <Text key={`ellipsis-${i}`} dimColor>\n ...\n </Text>,\n )\n }\n }\n return lines\n }, [patch, safeWidth])\n\n const totalRows =\n maxVisibleRows ?? Math.max(6, Math.min(14, Math.floor(rows * 0.35)))\n const [focusIndex, setFocusIndex] = React.useState(0)\n\n React.useEffect(() => {\n setFocusIndex(prev => {\n if (diffLines.length === 0) return 0\n return Math.max(0, Math.min(prev, diffLines.length - 1))\n })\n }, [diffLines.length])\n\n const window = useMemo(\n () =>\n getWindowedList({\n itemCount: diffLines.length,\n focusIndex,\n maxVisible: totalRows,\n indicatorRows: 2,\n }),\n [diffLines.length, focusIndex, totalRows],\n )\n\n useKeypress(\n (_input, key) => {\n if (!enableScrolling) return\n if (diffLines.length <= window.visibleCount) return\n\n if (key.pageUp) {\n setFocusIndex(prev => Math.max(0, prev - window.visibleCount))\n return true\n }\n if (key.pageDown) {\n setFocusIndex(prev =>\n Math.min(\n Math.max(0, diffLines.length - 1),\n prev + window.visibleCount,\n ),\n )\n return true\n }\n if (key.home) {\n setFocusIndex(0)\n return true\n }\n if (key.end) {\n setFocusIndex(Math.max(0, diffLines.length - 1))\n return true\n }\n },\n { isActive: enableScrolling },\n )\n\n const topIndicator = window.showUpIndicator ? `${figures.arrowUp} More` : ' '\n const bottomIndicator = window.showDownIndicator\n ? `${figures.arrowDown} More`\n : ' '\n\n return (\n <Box flexDirection=\"column\">\n <Text bold wrap=\"truncate-end\">\n {file_path}\n </Text>\n\n {enableScrolling ? (\n <Text dimColor wrap=\"truncate-end\">\n PgUp/PgDn scroll \u00B7 Home/End\n </Text>\n ) : null}\n\n <Box flexDirection=\"column\" width=\"100%\">\n <Text dimColor wrap=\"truncate-end\">\n {topIndicator}\n </Text>\n {diffLines.slice(window.start, window.end).map((line, idx) => (\n <Box key={`${window.start + idx}`}>{line}</Box>\n ))}\n <Text dimColor wrap=\"truncate-end\">\n {bottomIndicator}\n </Text>\n </Box>\n </Box>\n )\n}\n", "import semver from 'semver'\nimport type { Key } from '#ui-ink/hooks/useKeypress'\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 // Compatibility: on older Windows runtimes, Shift+Tab is unreliable in Ink.\n // In those cases, fall back to 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 useRef,\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 subscribeToolPermissionContextUpdates,\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 const permissionContextRef = useRef(permissionContext)\n useEffect(() => {\n permissionContextRef.current = permissionContext\n }, [permissionContext])\n\n const toolPermissionContextRef = useRef(toolPermissionContext)\n useEffect(() => {\n toolPermissionContextRef.current = toolPermissionContext\n }, [toolPermissionContext])\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 return subscribeToolPermissionContextUpdates(event => {\n if (event.conversationKey !== conversationKey) return\n\n setToolPermissionContext(event.context)\n\n const nextMode = event.context.mode\n setPermissionContext(prev => {\n if (prev.mode === nextMode) return prev\n const config = MODE_CONFIGS[nextMode]\n return {\n ...prev,\n mode: nextMode,\n allowedTools: config.allowedTools,\n restrictions: config.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 useEffect(() => {\n setActivePlanConversationKey(conversationKey)\n if (permissionContext.mode === 'plan') {\n enterPlanModeForConversationKey(conversationKey)\n }\n }, [conversationKey, permissionContext.mode])\n\n const cycleMode = useCallback(() => {\n const prev = permissionContextRef.current\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 toolPermissionContextRef.current = updatedToolPermissionContext\n setToolPermissionContext(updatedToolPermissionContext)\n\n const nextPermissionContext: IPermissionContext = {\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 permissionContextRef.current = nextPermissionContext\n setPermissionContext(nextPermissionContext)\n }, [conversationKey, isBypassPermissionsModeAvailable])\n\n const setMode = useCallback(\n (mode: PermissionMode) => {\n const prev = permissionContextRef.current\n if (prev.mode === mode) return\n\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 toolPermissionContextRef.current = updatedToolPermissionContext\n setToolPermissionContext(updatedToolPermissionContext)\n\n const nextPermissionContext: IPermissionContext = {\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 permissionContextRef.current = nextPermissionContext\n setPermissionContext(nextPermissionContext)\n },\n [conversationKey, isBypassPermissionsModeAvailable],\n )\n\n const applyToolPermissionUpdate = useCallback(\n (update: ToolPermissionContextUpdate) => {\n const previousToolCtx = toolPermissionContextRef.current\n const nextToolCtx = applyToolPermissionContextUpdate(\n previousToolCtx,\n update,\n )\n toolPermissionContextRef.current = nextToolCtx\n setToolPermissionContext(nextToolCtx)\n setToolPermissionContextForConversationKey({\n conversationKey,\n context: nextToolCtx,\n })\n\n if (update.type === 'setMode') {\n const prev = permissionContextRef.current\n if (prev.mode === update.mode) return\n\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 const nextPermissionContext: IPermissionContext = {\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 permissionContextRef.current = nextPermissionContext\n setPermissionContext(nextPermissionContext)\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", "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 React, { useMemo } from 'react'\nimport { Box, Text } from 'ink'\n\nimport type { ToolUseConfirm } from './PermissionRequest'\n\nfunction formatAgentLabel(agentId: string): string {\n if (agentId === 'main') return 'Agent: main'\n return `Agent: ${agentId}`\n}\n\nfunction formatModeLabel(mode: unknown): string | null {\n if (\n mode !== 'default' &&\n mode !== 'plan' &&\n mode !== 'acceptEdits' &&\n mode !== 'dontAsk' &&\n mode !== 'bypassPermissions'\n ) {\n return null\n }\n return `Mode: ${mode}`\n}\n\nexport function __buildPermissionRequestDetailsLinesForTests(\n toolUseConfirm: ToolUseConfirm,\n): string[] {\n const agentId =\n typeof toolUseConfirm.toolUseContext.agentId === 'string'\n ? toolUseConfirm.toolUseContext.agentId.trim()\n : ''\n\n const mode =\n toolUseConfirm.toolUseContext.options?.toolPermissionContext?.mode\n const modeLabel = formatModeLabel(mode)\n\n const headerParts: string[] = []\n if (agentId) headerParts.push(formatAgentLabel(agentId))\n if (modeLabel) headerParts.push(modeLabel)\n const header = headerParts.length > 0 ? headerParts.join(' \u00B7 ') : null\n\n const blockedPath =\n typeof toolUseConfirm.blockedPath === 'string'\n ? toolUseConfirm.blockedPath.trim()\n : ''\n const decisionReason =\n typeof toolUseConfirm.decisionReason === 'string'\n ? toolUseConfirm.decisionReason.trim()\n : ''\n\n const lines: string[] = []\n if (header) lines.push(header)\n if (decisionReason) lines.push(`Reason: ${decisionReason}`)\n if (blockedPath) lines.push(`Path: ${blockedPath}`)\n return lines\n}\n\nexport function PermissionRequestDetails({\n toolUseConfirm,\n}: {\n toolUseConfirm: ToolUseConfirm\n}): React.ReactNode {\n const lines = useMemo(\n () => __buildPermissionRequestDetailsLinesForTests(toolUseConfirm),\n [toolUseConfirm],\n )\n if (lines.length === 0) return null\n\n return (\n <Box flexDirection=\"column\">\n {lines.map((line, idx) => (\n <Text key={idx} dimColor wrap=\"truncate-end\">\n {line}\n </Text>\n ))}\n </Box>\n )\n}\n", "import type { ToolUseContext } from '#core/tooling/Tool'\nimport type { ToolPermissionContextUpdate } from '#core/types/toolPermissionContext'\nimport {\n applyToolPermissionContextUpdate,\n createDefaultToolPermissionContext,\n type ToolPermissionContext,\n} from '#core/types/toolPermissionContext'\n\nexport function applyToolPermissionUpdatesToLiveToolUseContext(args: {\n toolUseContext: ToolUseContext\n updates: ToolPermissionContextUpdate[]\n}): ToolPermissionContext | null {\n if (args.updates.length === 0) return null\n\n const toolUseContext = args.toolUseContext\n toolUseContext.options ??= {}\n\n const safeMode = toolUseContext.options.safeMode === true\n let next =\n toolUseContext.options.toolPermissionContext ??\n createDefaultToolPermissionContext({\n isBypassPermissionsModeAvailable: !safeMode,\n })\n\n for (const update of args.updates) {\n next = applyToolPermissionContextUpdate(next, update)\n }\n\n toolUseContext.options.toolPermissionContext = next\n return next\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 { textColorForRiskScore } 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'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\nimport { PermissionRequestDetails } from '#ui-ink/components/permissions/PermissionRequestDetails'\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 const layout = useScreenLayout()\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 marginTop={1} width=\"100%\">\n <ScreenFrame\n title=\"Bash command permission\"\n titleColor={textColorForRiskScore(toolUseConfirm.riskScore)}\n paddingX={layout.paddingX}\n paddingY={layout.tightLayout ? 0 : layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Box flexDirection=\"column\">\n <Text wrap=\"truncate-end\">\n {BashTool.renderToolUseMessage({\n command,\n run_in_background,\n description,\n })}\n </Text>\n <Text dimColor wrap=\"truncate-end\">\n {toolUseConfirm.description}\n </Text>\n <PermissionRequestDetails toolUseConfirm={toolUseConfirm} />\n </Box>\n\n <Box flexDirection=\"column\">\n <Text>Allow this command?</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\n <Text dimColor wrap=\"truncate-end\">\n Enter to confirm \u00B7 Esc to reject\n </Text>\n </Box>\n </ScreenFrame>\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: `Always allow 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: `Always allow this exact command in ${chalk.bold(getCwd())}`,\n value: 'yes-dont-ask-again-full',\n },\n ]\n }\n\n return [\n {\n label: 'Allow once',\n value: 'yes',\n },\n ...dontShowAgainOptions,\n {\n label: `Deny 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'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\nimport { PermissionRequestDetails } from './PermissionRequestDetails'\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 const layout = useScreenLayout()\n\n // NOTE: normalize \"(MCP)\" suffix for consistent display in the fallback UI.\n const originalUserFacingName =\n toolUseConfirm.tool.userFacingName?.() ||\n toolUseConfirm.tool.name ||\n 'Tool'\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 marginTop={1} width=\"100%\">\n <ScreenFrame\n title=\"Tool use permission\"\n titleColor={textColorForRiskScore(toolUseConfirm.riskScore)}\n paddingX={layout.paddingX}\n paddingY={layout.tightLayout ? 0 : layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Box flexDirection=\"column\">\n <Text wrap=\"truncate-end\">\n {userFacingName}(\n {toolUseConfirm.tool.renderToolUseMessage(\n toolUseConfirm.input as never,\n { verbose },\n )}\n )\n {originalUserFacingName.endsWith(' (MCP)') ? (\n <Text dimColor> (MCP)</Text>\n ) : (\n ''\n )}\n </Text>\n <Text dimColor wrap=\"truncate-end\">\n {toolUseConfirm.description}\n </Text>\n <PermissionRequestDetails toolUseConfirm={toolUseConfirm} />\n </Box>\n\n <Box flexDirection=\"column\">\n <Text>Allow this tool use?</Text>\n <Select\n options={[\n {\n label: 'Allow once',\n value: 'yes',\n },\n {\n label: `Always allow ${chalk.bold(userFacingName)} 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\n <Text dimColor wrap=\"truncate-end\">\n Enter to confirm \u00B7 Esc to reject\n </Text>\n </Box>\n </ScreenFrame>\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 () => clearInterval(timer)\n }, [message, timeout])\n}\n", "import { Box, Text } 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 { textColorForRiskScore } 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/contexts/PermissionContext'\nimport { isPathInWorkingDirectories } from '#core/utils/permissions/fileToolPermissionEngine'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\nimport { PermissionRequestDetails } from '#ui-ink/components/permissions/PermissionRequestDetails'\nimport { applyToolPermissionUpdatesToLiveToolUseContext } from '../liveToolPermissionContext'\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 layout = useScreenLayout()\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 ? `Allow all edits during this session ${shortcutHint}`\n : `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 applyToolPermissionUpdatesToLiveToolUseContext({\n toolUseContext: toolUseConfirm.toolUseContext,\n updates: toolUseConfirm.suggestions ?? [],\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 useKeypress((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 marginTop={1} width=\"100%\">\n <ScreenFrame\n title={`${fileExists ? 'Edit' : 'Create'} file permission`}\n titleColor={textColorForRiskScore(toolUseConfirm.riskScore)}\n paddingX={layout.paddingX}\n paddingY={layout.tightLayout ? 0 : layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\" gap={layout.gap}>\n <PermissionRequestDetails toolUseConfirm={toolUseConfirm} />\n <FileWriteToolDiff\n file_path={file_path}\n content={content}\n verbose={verbose}\n width={Math.max(10, columns - layout.paddingX * 2 - 2)}\n enableScrolling={true}\n />\n\n <Box flexDirection=\"column\">\n <Text>\n Allow {fileExists ? 'this edit to' : 'creating'}{' '}\n <Text bold>{basename(file_path)}</Text>?\n </Text>\n <Select\n options={[\n {\n label: 'Allow once',\n value: 'yes',\n },\n ...(hasSessionSuggestion\n ? [\n {\n label: sessionLabel,\n value: 'yes-session',\n },\n ]\n : []),\n {\n label: `Deny and provide instructions (${chalk.bold.hex(getTheme().warning)('esc')})`,\n value: 'no',\n },\n ]}\n onChange={handleChoice}\n />\n </Box>\n\n <Text dimColor wrap=\"truncate-end\">\n Enter to confirm \u00B7 Esc to reject \u00B7 PgUp/PgDn scroll preview\n {hasSessionSuggestion\n ? ` \u00B7 ${modeCycleShortcut.displayText} allow session`\n : ''}\n </Text>\n </Box>\n </ScreenFrame>\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 { Box, Text } from 'ink'\nimport { getCwd } from '#core/utils/state'\nimport { extname, relative } from 'path'\nimport { detectFileEncoding } from '#core/utils/file'\nimport { getPatch } from '#core/utils/diff'\nimport figures from 'figures'\nimport wrapAnsi from 'wrap-ansi'\nimport { highlight, supportsLanguage } from 'cli-highlight'\nimport { logError } from '#core/utils/log'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\nimport { getWindowedList } from '#ui-ink/primitives/list/windowedList'\nimport { structuredDiffLines } from '#ui-ink/components/StructuredDiff'\n\ntype Props = {\n file_path: string\n content: string\n verbose: boolean\n width: number\n enableScrolling?: boolean\n maxVisibleRows?: number\n}\n\nexport function FileWriteToolDiff({\n file_path,\n content,\n verbose,\n width,\n enableScrolling = false,\n maxVisibleRows,\n}: Props): React.ReactNode {\n const { rows } = useTerminalSize()\n const safeWidth = Math.max(10, Math.floor(width))\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 const language = extname(file_path).slice(1)\n const highlightedCode = useMemo(() => {\n try {\n if (supportsLanguage(language)) {\n return highlight(content || '(No content)', { language })\n }\n return highlight(content || '(No content)', { language: 'markdown' })\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(content || '(No content)', { language: 'markdown' })\n }\n return content || '(No content)'\n }\n }, [content, language])\n\n const previewLines = useMemo(() => {\n if (!hunks) {\n const wrapped = wrapAnsi(highlightedCode, safeWidth, {\n hard: true,\n trim: false,\n })\n return wrapped\n .split('\\n')\n .map((line, i) => <Text key={`code-${i}`}>{line}</Text>)\n }\n\n const lines: React.ReactNode[] = []\n for (let i = 0; i < hunks.length; i += 1) {\n const hunk = hunks[i]\n if (!hunk) continue\n lines.push(\n ...structuredDiffLines({ patch: hunk, width: safeWidth, dim: false }),\n )\n if (i < hunks.length - 1) {\n lines.push(\n <Text key={`ellipsis-${i}`} dimColor>\n ...\n </Text>,\n )\n }\n }\n return lines\n }, [highlightedCode, hunks, safeWidth])\n\n const totalRows =\n maxVisibleRows ?? Math.max(6, Math.min(14, Math.floor(rows * 0.35)))\n const [focusIndex, setFocusIndex] = React.useState(0)\n\n React.useEffect(() => {\n setFocusIndex(prev => {\n if (previewLines.length === 0) return 0\n return Math.max(0, Math.min(prev, previewLines.length - 1))\n })\n }, [previewLines.length])\n\n const window = useMemo(\n () =>\n getWindowedList({\n itemCount: previewLines.length,\n focusIndex,\n maxVisible: totalRows,\n indicatorRows: 2,\n }),\n [focusIndex, previewLines.length, totalRows],\n )\n\n useKeypress(\n (_input, key) => {\n if (!enableScrolling) return\n if (previewLines.length <= window.visibleCount) return\n\n if (key.pageUp) {\n setFocusIndex(prev => Math.max(0, prev - window.visibleCount))\n return true\n }\n if (key.pageDown) {\n setFocusIndex(prev =>\n Math.min(\n Math.max(0, previewLines.length - 1),\n prev + window.visibleCount,\n ),\n )\n return true\n }\n if (key.home) {\n setFocusIndex(0)\n return true\n }\n if (key.end) {\n setFocusIndex(Math.max(0, previewLines.length - 1))\n return true\n }\n },\n { isActive: enableScrolling },\n )\n\n const topIndicator = window.showUpIndicator ? `${figures.arrowUp} More` : ' '\n const bottomIndicator = window.showDownIndicator\n ? `${figures.arrowDown} More`\n : ' '\n\n return (\n <Box flexDirection=\"column\">\n <Text bold wrap=\"truncate-end\">\n {file_path}\n </Text>\n {enableScrolling ? (\n <Text dimColor wrap=\"truncate-end\">\n PgUp/PgDn scroll \u00B7 Home/End\n </Text>\n ) : null}\n <Box flexDirection=\"column\" width=\"100%\">\n <Text dimColor wrap=\"truncate-end\">\n {topIndicator}\n </Text>\n {previewLines.slice(window.start, window.end).map((line, idx) => (\n <Box key={`${window.start + idx}`}>{line}</Box>\n ))}\n <Text dimColor wrap=\"truncate-end\">\n {bottomIndicator}\n </Text>\n </Box>\n </Box>\n )\n}\n", "import { Box, Text } from 'ink'\nimport React, { useCallback, useMemo } from 'react'\nimport { Select } from '#ui-ink/components/CustomSelect/select'\nimport { getTheme } from '#core/utils/theme'\nimport { textColorForRiskScore } 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/contexts/PermissionContext'\nimport { isPathInWorkingDirectories } from '#core/utils/permissions/fileToolPermissionEngine'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\nimport { PermissionRequestDetails } from '#ui-ink/components/permissions/PermissionRequestDetails'\nimport { applyToolPermissionUpdatesToLiveToolUseContext } from '../liveToolPermissionContext'\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 ? 'Allow during this session'\n : `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 ? `Allow all edits during this session ${shortcutHint}`\n : `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 layout = useScreenLayout()\n const modeCycleShortcut = useMemo(() => getPermissionModeCycleShortcut(), [])\n const userFacingName =\n toolUseConfirm.tool.userFacingName?.() ||\n toolUseConfirm.tool.name ||\n 'Tool'\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 canQuickAllowSession =\n hasSessionSuggestion &&\n !toolUseConfirm.tool.isReadOnly(toolUseConfirm.input as never)\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 applyToolPermissionUpdatesToLiveToolUseContext({\n toolUseContext: toolUseConfirm.toolUseContext,\n updates: toolUseConfirm.suggestions ?? [],\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 useKeypress((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 marginTop={1} width=\"100%\">\n <ScreenFrame\n title={`${title} permission`}\n titleColor={textColorForRiskScore(toolUseConfirm.riskScore)}\n paddingX={layout.paddingX}\n paddingY={layout.tightLayout ? 0 : layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Box flexDirection=\"column\">\n <Text wrap=\"truncate-end\">\n {userFacingName}(\n {toolUseConfirm.tool.renderToolUseMessage(\n toolUseConfirm.input as never,\n { verbose },\n )}\n )\n </Text>\n <PermissionRequestDetails toolUseConfirm={toolUseConfirm} />\n </Box>\n\n <Box flexDirection=\"column\">\n <Text>Allow this action?</Text>\n <Select\n options={[\n {\n label: 'Allow once',\n value: 'yes',\n },\n ...getDontAskAgainOptions(\n toolUseConfirm,\n path,\n modeCycleShortcut.displayText,\n isInWorkingDir,\n hasSessionSuggestion,\n ),\n {\n label: `Deny and provide instructions (${chalk.bold.hex(getTheme().warning)('esc')})`,\n value: 'no',\n },\n ]}\n onChange={handleChoice}\n />\n </Box>\n\n <Text dimColor wrap=\"truncate-end\">\n Enter to confirm \u00B7 Esc to reject\n {canQuickAllowSession\n ? ` \u00B7 ${modeCycleShortcut.displayText} allow this session`\n : ''}\n </Text>\n </Box>\n </ScreenFrame>\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 { logUnaryEvent } from '#core/utils/unaryLogging'\nimport { env } from '#core/utils/env'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\nimport { PermissionRequestDetails } from '#ui-ink/components/permissions/PermissionRequestDetails'\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 layout = useScreenLayout()\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 marginTop={1} width=\"100%\">\n <ScreenFrame\n title=\"Slash command permission\"\n titleColor={theme.permission}\n paddingX={layout.paddingX}\n paddingY={layout.tightLayout ? 0 : layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Box flexDirection=\"column\">\n <Text wrap=\"truncate-end\">\n {toolUseConfirm.tool.userFacingName?.() || 'SlashCommand'}(\n {toolUseConfirm.tool.renderToolUseMessage(toolUseConfirm.input, {\n verbose,\n })}\n )\n </Text>\n <Text dimColor wrap=\"truncate-end\">\n {toolUseConfirm.description}\n </Text>\n <PermissionRequestDetails toolUseConfirm={toolUseConfirm} />\n </Box>\n\n <Box flexDirection=\"column\">\n <Text>Allow this command?</Text>\n <Select\n options={[\n { label: 'Allow once', value: 'yes' },\n {\n label: `Always allow ${chalk.bold(command)} in ${chalk.bold(getCwd())}`,\n value: 'yes-exact',\n },\n ...(showPrefixOption\n ? [\n {\n label: `Always allow ${chalk.bold(prefix + ':*')} in ${chalk.bold(getCwd())}`,\n value: 'yes-prefix',\n },\n ]\n : []),\n {\n label: `Deny 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\n <Text dimColor wrap=\"truncate-end\">\n Enter to confirm \u00B7 Esc to reject\n </Text>\n </Box>\n </ScreenFrame>\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 { logUnaryEvent } from '#core/utils/unaryLogging'\nimport { env } from '#core/utils/env'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\nimport { PermissionRequestDetails } from '#ui-ink/components/permissions/PermissionRequestDetails'\n\nexport function SkillPermissionRequest({\n toolUseConfirm,\n onDone,\n verbose,\n}: PermissionRequestProps): React.ReactNode {\n const theme = getTheme()\n const layout = useScreenLayout()\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 marginTop={1} width=\"100%\">\n <ScreenFrame\n title=\"Skill permission\"\n titleColor={theme.permission}\n paddingX={layout.paddingX}\n paddingY={layout.tightLayout ? 0 : layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Box flexDirection=\"column\">\n <Text wrap=\"truncate-end\">\n {toolUseConfirm.tool.userFacingName?.() || 'Skill'}(\n {toolUseConfirm.tool.renderToolUseMessage(toolUseConfirm.input, {\n verbose,\n })}\n )\n </Text>\n <Text dimColor wrap=\"truncate-end\">\n {toolUseConfirm.description}\n </Text>\n <PermissionRequestDetails toolUseConfirm={toolUseConfirm} />\n </Box>\n\n <Box flexDirection=\"column\">\n <Text>Allow this skill?</Text>\n <Select\n options={[\n { label: 'Allow once', value: 'yes' },\n {\n label: `Always allow ${chalk.bold(skill)} in ${chalk.bold(getCwd())}`,\n value: 'yes-exact',\n },\n {\n label: `Deny 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\n <Text dimColor wrap=\"truncate-end\">\n Enter to confirm \u00B7 Esc to reject\n </Text>\n </Box>\n </ScreenFrame>\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 { 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 { logUnaryEvent } from '#core/utils/unaryLogging'\nimport { env } from '#core/utils/env'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\nimport { PermissionRequestDetails } from '#ui-ink/components/permissions/PermissionRequestDetails'\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 layout = useScreenLayout()\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 useKeypress((_input, key) => {\n if (key.escape) {\n reject()\n return true\n }\n })\n\n return (\n <Box marginTop={1} width=\"100%\">\n <ScreenFrame\n title=\"Network permission\"\n titleColor={theme.permission}\n paddingX={layout.paddingX}\n paddingY={layout.tightLayout ? 0 : layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Box>\n <Text dimColor>Host:</Text>\n <Text wrap=\"truncate-end\"> {hostLabel}</Text>\n </Box>\n <PermissionRequestDetails toolUseConfirm={toolUseConfirm} />\n\n <Box flexDirection=\"column\">\n <Text>Do you want to allow this connection?</Text>\n <Select\n options={[\n { label: 'Allow once', value: 'yes' },\n ...(hostname\n ? [\n {\n label: `Always allow ${chalk.bold(hostname)}`,\n value: 'yes-dont-ask-again',\n },\n ]\n : []),\n {\n label: `Deny and provide instructions ${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\n <Text dimColor wrap=\"truncate-end\">\n Enter to confirm \u00B7 Esc to reject\n </Text>\n </Box>\n </ScreenFrame>\n </Box>\n )\n}\n", "import { Box, Text } from 'ink'\nimport React, { useEffect, useMemo, useState } from 'react'\nimport figures from 'figures'\nimport type { ToolUseConfirm } from '#ui-ink/components/permissions/PermissionRequest'\nimport { getTheme } from '#core/utils/theme'\nimport { usePermissionContext } from '#ui-ink/contexts/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'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\nimport { getWindowedList } from '#ui-ink/primitives/list/windowedList'\nimport { wrapLines } from '#ui-ink/primitives/text/wrapLines'\nimport { getPermissionModeCycleShortcut } from '#ui-ink/utils/permissionModeCycleShortcut'\nimport type { PermissionMode } from '#core/types/PermissionMode'\nimport { applyToolPermissionContextUpdateForConversationKey } from '#core/utils/toolPermissionContextState'\nimport { getMessagesSetter } from '#core/messages'\nimport { getContext } from '#core/context'\nimport { getCodeStyle } from '#core/utils/style'\nimport { resetReminderSession } from '#core/services/systemReminder'\nimport { resetFileFreshnessSession } from '#core/services/fileFreshness'\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\nfunction clearConversationContextForPlanExit(): void {\n getMessagesSetter()([])\n getContext.cache.clear?.()\n getCodeStyle.cache.clear?.()\n resetReminderSession()\n resetFileFreshnessSession()\n}\n\nexport function ExitPlanModePermissionRequest({\n toolUseConfirm,\n onDone,\n}: Props): React.ReactNode {\n const theme = getTheme()\n const layout = useScreenLayout()\n const { columns, rows } = useTerminalSize()\n const { setMode } = usePermissionContext()\n const modeCycleShortcut = useMemo(() => getPermissionModeCycleShortcut(), [])\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 [rejectDraft, setRejectDraft] = useState('')\n const [focusedOptionIndex, setFocusedOptionIndex] = useState(0)\n const [planFocusIndex, setPlanFocusIndex] = useState(0)\n\n useEffect(() => {\n if (!planSaved) return\n const timeout = setTimeout(() => setPlanSaved(false), 5000)\n return () => clearTimeout(timeout)\n }, [planSaved])\n\n const planViewportWidth = Math.max(20, columns - layout.paddingX * 2 - 2)\n const planLines = useMemo(\n () => wrapLines(planText.split('\\n'), planViewportWidth),\n [planText, planViewportWidth],\n )\n\n useEffect(() => {\n setPlanFocusIndex(prev => {\n if (planLines.length === 0) return 0\n return Math.max(0, Math.min(prev, planLines.length - 1))\n })\n }, [planLines.length])\n\n const planViewportRows = Math.max(6, Math.min(14, Math.floor(rows * 0.4)))\n const planWindow = useMemo(\n () =>\n getWindowedList({\n itemCount: planLines.length,\n focusIndex: planFocusIndex,\n maxVisible: planViewportRows,\n indicatorRows: 2,\n }),\n [planFocusIndex, planLines.length, planViewportRows],\n )\n\n const showExitWithoutPlan =\n planSource === 'file' && (!planExists || planText.trim().length === 0)\n\n const bypassAvailable =\n toolUseConfirm.toolUseContext.options?.safeMode !== true\n const options = useMemo(() => {\n return getExitPlanModeOptions({ bypassAvailable })\n }, [bypassAvailable])\n\n useEffect(() => {\n setFocusedOptionIndex(prev =>\n Math.max(0, Math.min(prev, options.length - 1)),\n )\n }, [options.length])\n\n useEffect(() => {\n if (!showExitWithoutPlan) return\n setFocusedOptionIndex(prev => Math.max(0, Math.min(prev, 1)))\n }, [showExitWithoutPlan])\n\n const applyPermissionMode = (nextMode: PermissionMode) => {\n const conversationKey = getPlanConversationKey(\n toolUseConfirm.toolUseContext,\n )\n const safeMode = toolUseConfirm.toolUseContext.options?.safeMode === true\n const updatedToolPermissionContext =\n applyToolPermissionContextUpdateForConversationKey({\n conversationKey,\n isBypassPermissionsModeAvailable: !safeMode,\n update: { type: 'setMode', mode: nextMode, destination: 'session' },\n })\n\n toolUseConfirm.toolUseContext.options ??= {}\n toolUseConfirm.toolUseContext.options.toolPermissionContext =\n updatedToolPermissionContext\n\n setMode(nextMode)\n }\n\n const handleApprove = (value: ExitPlanModeOptionValue) => {\n const clearContext =\n value !== 'yes-accept-edits-keep-context' &&\n value !== 'yes-default-keep-context'\n\n let nextMode: PermissionMode = 'default'\n switch (value) {\n case 'yes-bypass-permissions':\n nextMode = 'bypassPermissions'\n break\n case 'yes-accept-edits':\n nextMode = 'acceptEdits'\n break\n case 'yes-default':\n nextMode = 'default'\n break\n case 'yes-accept-edits-keep-context':\n nextMode = bypassAvailable ? 'bypassPermissions' : 'acceptEdits'\n break\n case 'yes-default-keep-context':\n nextMode = 'default'\n break\n case 'no':\n return\n default: {\n const neverValue: never = value\n throw new Error(`Unexpected ExitPlanMode option: ${String(neverValue)}`)\n }\n }\n\n applyPermissionMode(nextMode)\n\n if (clearContext) {\n clearConversationContextForPlanExit()\n }\n\n toolUseConfirm.onAllow('temporary')\n onDone()\n }\n\n useKeypress((input, key) => {\n if (key.escape) {\n toolUseConfirm.onReject()\n onDone()\n return true\n }\n\n if (showExitWithoutPlan) {\n if (key.upArrow) {\n setFocusedOptionIndex(0)\n return true\n }\n\n if (key.downArrow) {\n setFocusedOptionIndex(1)\n return true\n }\n\n if (key.return) {\n if (focusedOptionIndex === 0) {\n applyPermissionMode('default')\n toolUseConfirm.onAllow('temporary')\n onDone()\n return true\n }\n\n toolUseConfirm.onReject()\n onDone()\n return true\n }\n\n return\n }\n\n if (modeCycleShortcut.check(input, key)) {\n const quickValue: ExitPlanModeOptionValue = bypassAvailable\n ? 'yes-bypass-permissions'\n : 'yes-accept-edits'\n handleApprove(quickValue)\n return true\n }\n\n if (key.pageUp && !showExitWithoutPlan) {\n setPlanFocusIndex(prev => Math.max(0, prev - planWindow.visibleCount))\n return true\n }\n\n if (key.pageDown && !showExitWithoutPlan) {\n setPlanFocusIndex(prev =>\n Math.min(\n Math.max(0, planLines.length - 1),\n prev + planWindow.visibleCount,\n ),\n )\n return true\n }\n\n if (key.home && !showExitWithoutPlan) {\n setPlanFocusIndex(0)\n return true\n }\n\n if (key.end && !showExitWithoutPlan) {\n setPlanFocusIndex(Math.max(0, planLines.length - 1))\n return true\n }\n\n if (key.upArrow) {\n setFocusedOptionIndex(prev => Math.max(0, prev - 1))\n return true\n }\n\n if (key.downArrow) {\n setFocusedOptionIndex(prev => Math.min(options.length - 1, prev + 1))\n return true\n }\n\n const focusedOption = options[focusedOptionIndex]\n\n if (key.return) {\n if (focusedOption?.type === 'input') {\n const trimmed = rejectDraft.trim()\n if (!trimmed) return true\n toolUseConfirm.onReject(trimmed)\n onDone()\n return true\n }\n\n if (focusedOption && 'value' in focusedOption) {\n handleApprove(focusedOption.value)\n return true\n }\n }\n\n if (focusedOption?.type === 'input') {\n if (key.backspace || key.delete) {\n setRejectDraft(prev => prev.slice(0, -1))\n return true\n }\n\n if (key.paste || key.insertable) {\n if (input.length > 0) {\n setRejectDraft(prev => prev + input)\n }\n return true\n }\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 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 if (showExitWithoutPlan) {\n const yesIsFocused = focusedOptionIndex === 0\n const noIsFocused = focusedOptionIndex === 1\n\n return (\n <Box marginTop={1} width=\"100%\">\n <ScreenFrame\n title=\"Exit plan mode?\"\n titleColor={theme.planMode}\n paddingX={layout.paddingX}\n paddingY={layout.tightLayout ? 0 : layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Text>Agent wants to exit plan mode</Text>\n <Box flexDirection=\"column\">\n <Box paddingLeft={2} paddingRight={1}>\n {yesIsFocused ? (\n <Text color={theme.kode}>{figures.pointer}</Text>\n ) : null}\n <Text\n bold={yesIsFocused}\n color={yesIsFocused ? theme.kode : theme.text}\n >\n Yes\n </Text>\n </Box>\n <Box paddingLeft={2} paddingRight={1}>\n {noIsFocused ? (\n <Text color={theme.kode}>{figures.pointer}</Text>\n ) : null}\n <Text\n bold={noIsFocused}\n color={noIsFocused ? theme.kode : theme.text}\n >\n No\n </Text>\n </Box>\n </Box>\n <Text dimColor wrap=\"truncate-end\">\n Enter to confirm \u00B7 Esc to exit\n </Text>\n </Box>\n </ScreenFrame>\n </Box>\n )\n }\n\n const topIndicator = planWindow.showUpIndicator\n ? `${figures.arrowUp} More`\n : ' '\n const bottomIndicator = planWindow.showDownIndicator\n ? `${figures.arrowDown} More`\n : ' '\n\n return (\n <Box marginTop={1} width=\"100%\">\n <ScreenFrame\n title=\"Ready to code?\"\n titleColor={theme.planMode}\n paddingX={layout.paddingX}\n paddingY={layout.tightLayout ? 0 : layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Box flexDirection=\"column\">\n <Text dimColor wrap=\"truncate-end\">\n Plan preview \u00B7 PgUp/PgDn scroll\n </Text>\n <Box flexDirection=\"column\" width=\"100%\">\n <Text dimColor wrap=\"truncate-end\">\n {topIndicator}\n </Text>\n {planLines\n .slice(planWindow.start, planWindow.end)\n .map((line, idx) => (\n <Box key={`${planWindow.start + idx}`}>\n <Text wrap=\"truncate-end\">{line}</Text>\n </Box>\n ))}\n <Text dimColor wrap=\"truncate-end\">\n {bottomIndicator}\n </Text>\n </Box>\n </Box>\n\n <Text dimColor wrap=\"truncate-end\">\n Tip: Ctrl+G to edit{' '}\n {planSource === 'file' ? planFilePath : 'plan text'}\n {planSaved ? ' \u00B7 Plan saved!' : ''}\n </Text>\n\n <Box flexDirection=\"column\">\n <Text dimColor>Would you like to proceed?</Text>\n <Box flexDirection=\"column\">\n {options.map((option, idx) => {\n const isFocused = idx === focusedOptionIndex\n\n if (option.type === 'input') {\n const placeholder = option.placeholder\n const suffix =\n rejectDraft.length > 0 ? rejectDraft : placeholder\n const suffixColor =\n rejectDraft.length > 0 ? theme.text : theme.secondaryText\n\n return (\n <Box key={option.value} paddingLeft={2} paddingRight={1}>\n {isFocused ? (\n <Text color={theme.kode}>{figures.pointer}</Text>\n ) : null}\n <Text\n bold={isFocused}\n color={isFocused ? theme.kode : theme.text}\n wrap=\"truncate-end\"\n >\n {option.label}\n </Text>\n <Text dimColor> {figures.arrowRight} </Text>\n <Text color={suffixColor} wrap=\"truncate-end\">\n {suffix}\n </Text>\n </Box>\n )\n }\n\n return (\n <Box key={option.value} paddingLeft={2} paddingRight={1}>\n {isFocused ? (\n <Text color={theme.kode}>{figures.pointer}</Text>\n ) : null}\n <Text\n bold={isFocused}\n color={isFocused ? theme.kode : theme.text}\n wrap=\"truncate-end\"\n >\n {option.label}\n </Text>\n </Box>\n )\n })}\n </Box>\n </Box>\n\n <Text dimColor wrap=\"truncate-end\">\n Enter to confirm \u00B7 Esc to exit \u00B7 {modeCycleShortcut.displayText}{' '}\n quick select\n </Text>\n </Box>\n </ScreenFrame>\n </Box>\n )\n}\n", "export type ExitPlanModeOptionValue =\n | 'yes-bypass-permissions'\n | 'yes-accept-edits'\n | 'yes-default'\n | 'yes-accept-edits-keep-context'\n | 'yes-default-keep-context'\n | 'no'\n\nexport type ExitPlanModeOption =\n | {\n type?: 'option'\n label: string\n value: Exclude<ExitPlanModeOptionValue, 'no'>\n }\n | {\n type: 'input'\n label: string\n value: 'no'\n placeholder: string\n }\n\nexport function getExitPlanModeOptions(args: {\n bypassAvailable: boolean\n}): ExitPlanModeOption[] {\n const options: ExitPlanModeOption[] = []\n\n options.push(\n args.bypassAvailable\n ? {\n label: 'Yes, clear context and bypass permissions',\n value: 'yes-bypass-permissions',\n }\n : {\n label: 'Yes, clear context and auto-accept edits (shift+tab)',\n value: 'yes-accept-edits',\n },\n )\n options.push({\n label: 'Yes, and manually approve edits',\n value: 'yes-default',\n })\n\n options.push({\n label: args.bypassAvailable\n ? 'Yes, and bypass permissions'\n : 'Yes, auto-accept edits',\n value: 'yes-accept-edits-keep-context',\n })\n\n options.push({\n label: 'Yes, manually approve edits',\n value: 'yes-default-keep-context',\n })\n\n options.push({\n type: 'input',\n label: 'No, keep planning',\n value: 'no',\n placeholder: 'Type here to tell Kode Agent what to change',\n })\n\n return options\n}\n\nexport function __getExitPlanModeOptionsForTests(args: {\n bypassAvailable: boolean\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 }\n return {\n questions: (result.data.questions as Question[]) ?? [],\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 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 const toolUseId =\n toolUseConfirm.toolUseContext.toolUseId ??\n toolUseConfirm.toolUseContext.messageId\n const options = (toolUseConfirm.toolUseContext.options ??= {})\n if (toolUseId) {\n options.askUserQuestionAnswersByToolUseId ??= {}\n options.askUserQuestionAnswersByToolUseId[toolUseId] = nextAnswers\n } else {\n options.askUserQuestionAnswers = nextAnswers\n }\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>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 figures from 'figures'\nimport { getCachedStringWidth } from '#cli-utils/textWidth'\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 (getCachedStringWidth(label) <= maxWidth) return label\n\n let candidate = label\n while (\n candidate.length > 1 &&\n getCachedStringWidth(candidate + '\u2026') > maxWidth\n ) {\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 getCachedStringWidth('\u2190 ') +\n getCachedStringWidth(' \u2192') +\n getCachedStringWidth(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 + getCachedStringWidth(header),\n 0,\n )\n if (total <= available) return headers\n\n const currentHeader = headers[args.currentQuestionIndex] ?? ''\n const currentTabWidth = 4 + getCachedStringWidth(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 (getCachedStringWidth(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 type React from 'react'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\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 useKeypress((input, key) => {\n if (key.escape) {\n args.onCancel()\n return true\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 * as React from 'react'\nimport {\n memo,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} 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 { MACRO } from '#core/constants/macros'\nimport { getCwd, getOriginalCwd } from '#core/utils/state'\nimport { getMessagesPath } from '#core/utils/log'\nimport { getTotalAPIDuration, getTotalDuration } from '#core/cost-tracker'\nimport {\n getCurrentProjectConfig,\n getGlobalConfigCached,\n saveCurrentProjectConfig,\n} from '#core/utils/config'\nimport { usePermissionContext } from '#ui-ink/contexts/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 { useKeypress, type Key } from '#ui-ink/hooks/useKeypress'\nimport { useUndoBuffer } from '#ui-ink/hooks/useUndoBuffer'\nimport { KEYPRESS_PRIORITY } from '#ui-ink/constants/keypressPriority'\nimport { getPermissionModeCycleShortcut } from '#ui-ink/utils/permissionModeCycleShortcut'\nimport { getPromptInputSpecialKeyAction } from '#ui-ink/utils/promptInputSpecialKey'\nimport { setTerminalTitle } from '#cli-utils/terminal'\nimport { Cursor, countWrappedLines } from '#cli-utils/Cursor'\nimport { getCurrentOutputStyle } from '#cli-services/outputStyles'\nimport { BunShell } from '#runtime/shell'\nimport { listBackgroundAgentTaskSnapshots } from '#core/utils/backgroundTasks'\nimport { computeContextWindowPercentages } from '#core/utils/contextWindowPercentages'\nimport { submitPrompt } from './submit'\nimport {\n usePromptPastes,\n type PastedImageAttachment,\n type PastedTextSegment,\n} from './pastes'\nimport { toggleBashMode, type PromptInputProps, type PromptMode } from './types'\nimport { PromptInputView } from './PromptInputView'\nimport { useExternalEdit } from './useExternalEdit'\nimport { useQuickModelSwitch } from './useQuickModelSwitch'\nimport { getKodeAgentSessionId } from '#protocol/utils/kodeAgentSessionId'\n\nconst PROMPT_DRAFT_KEY = 'repl'\n\nfunction exit(): never {\n setTerminalTitle('')\n process.exit(0)\n}\n\nexport function PromptInput({\n commands,\n forkNumber,\n messageLogName,\n initialPrompt,\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 uiRefreshCounter,\n onShowMessageSelector,\n setForkConvoWithMessagesOnTheNextRender,\n readFileTimestamps,\n onModelChange,\n onManageTasks,\n restorePastes,\n onRestorePastesApplied,\n draftPastes,\n onDraftPastesChange,\n}: PromptInputProps): React.ReactNode {\n type QueuedPrompt = {\n seq: number\n input: string\n mode: PromptMode\n pastedTexts: PastedTextSegment[]\n pastedImages: PastedImageAttachment[]\n }\n\n type PromptStash = {\n input: string\n mode: PromptMode\n cursorOffset: number\n pastedTexts: PastedTextSegment[]\n pastedImages: PastedImageAttachment[]\n }\n\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 [clearInputPending, setClearInputPending] = useState(false)\n const [rewindPending, setRewindPending] = 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 const [queuedPrompts, setQueuedPrompts] = useState<QueuedPrompt[]>([])\n const [pendingPrompts, setPendingPrompts] = useState<QueuedPrompt[]>([])\n const nextQueuedPromptSeqRef = useRef(0)\n const [promptStash, setPromptStash] = useState<PromptStash | null>(null)\n const onHistoryUserInputRef = useRef<() => void>(() => {})\n const editorMode = getGlobalConfigCached().editorMode ?? 'normal'\n const [vimMode, setVimMode] = useState<'INSERT' | 'NORMAL'>('INSERT')\n\n useEffect(() => {\n if (editorMode !== 'vim') return\n setVimMode('INSERT')\n }, [editorMode])\n\n const { cycleMode, currentMode, toolPermissionContext } =\n usePermissionContext()\n const modeCycleShortcut = useMemo(() => getPermissionModeCycleShortcut(), [])\n const showQuickModelSwitchShortcut = modeCycleShortcut.displayText !== 'alt+m'\n\n const handleExitMessage = useCallback((show: boolean, key?: string) => {\n setExitMessage(prev =>\n prev.show === show && prev.key === key ? prev : { show, key },\n )\n }, [])\n\n const handleInlineMessage = useCallback((show: boolean, text?: string) => {\n setMessage(prev =>\n prev.show === show && prev.text === text ? prev : { show, text },\n )\n }, [])\n const handleClearInput = useDoublePress(setClearInputPending, () => {\n clearPastes()\n onInputChange('')\n setCursorOffset(0)\n })\n const handleRewind = useDoublePress(setRewindPending, () => {\n onShowMessageSelector()\n })\n\n const {\n pushToBuffer: pushUndoSnapshot,\n undo: undoOnce,\n canUndo,\n clearBuffer: clearUndoBuffer,\n } = useUndoBuffer<{\n mode: PromptMode\n pastedTexts: PastedTextSegment[]\n pastedImages: PastedImageAttachment[]\n }>({ maxBufferSize: 50, debounceMs: 200 })\n\n const cursorOffsetRef = useRef(cursorOffset)\n useEffect(() => {\n cursorOffsetRef.current = cursorOffset\n }, [cursorOffset])\n\n const { columns, rows } = useTerminalSize()\n const textInputColumns = Math.max(1, columns - 6)\n // Prevent the prompt input from growing unbounded and overflowing the viewport,\n // which can cause flicker/ghost lines on small terminals.\n const textInputMaxHeight = Math.max(1, Math.min(8, Math.floor(rows / 3)))\n const inputLineCount = useMemo(\n () => countWrappedLines(input, textInputColumns, textInputMaxHeight + 1),\n [input, textInputColumns, textInputMaxHeight],\n )\n const inputBoxHeight = Math.min(inputLineCount, textInputMaxHeight) + 2\n\n const onChange = useCallback(\n (value: string) => {\n onHistoryUserInputRef.current()\n\n // Only check for mode prefix when in 'prompt' mode\n // In other modes (bash/koding/background), just update the input directly\n if (mode === 'prompt') {\n if (value.startsWith('!') || value.startsWith('$')) {\n onModeChange('bash')\n return\n }\n if (value.startsWith('&')) {\n onModeChange('background')\n return\n }\n if (value.startsWith('#')) {\n onModeChange('koding')\n return\n }\n }\n\n onInputChange(value)\n },\n [mode, onInputChange, onModeChange],\n )\n\n const theme = getTheme()\n const tokenUsage = useMemo(() => countTokens(messages), [messages])\n const totalCostUSD = useMemo(() => {\n let total = 0\n for (const message of messages) {\n if (message.type === 'assistant') total += message.costUSD\n }\n return total\n }, [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 }, [submitCount, tokenUsage, uiRefreshCounter])\n\n const statusLineUsage = useMemo(() => {\n let totalInputTokens = 0\n let totalOutputTokens = 0\n\n let currentUsage: null | {\n input_tokens: number\n output_tokens: number\n cache_creation_input_tokens: number\n cache_read_input_tokens: number\n } = null\n\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i]\n if (!message || message.type !== 'assistant') continue\n const usage = (message.message as unknown as { usage?: unknown }).usage\n if (!usage || typeof usage !== 'object') continue\n\n const rec = usage as Record<string, unknown>\n const inputTokens = rec.input_tokens\n const outputTokens = rec.output_tokens\n if (typeof inputTokens !== 'number' || typeof outputTokens !== 'number') {\n continue\n }\n\n currentUsage = {\n input_tokens: inputTokens,\n output_tokens: outputTokens,\n cache_creation_input_tokens:\n typeof rec.cache_creation_input_tokens === 'number'\n ? rec.cache_creation_input_tokens\n : 0,\n cache_read_input_tokens:\n typeof rec.cache_read_input_tokens === 'number'\n ? rec.cache_read_input_tokens\n : 0,\n }\n break\n }\n\n for (const message of messages) {\n if (!message || message.type !== 'assistant') continue\n const usage = (message.message as unknown as { usage?: unknown }).usage\n if (!usage || typeof usage !== 'object') continue\n const rec = usage as Record<string, unknown>\n const inputTokens = rec.input_tokens\n const outputTokens = rec.output_tokens\n if (typeof inputTokens !== 'number' || typeof outputTokens !== 'number') {\n continue\n }\n totalInputTokens += inputTokens\n totalOutputTokens += outputTokens\n }\n\n return { totalInputTokens, totalOutputTokens, currentUsage }\n }, [messages])\n\n const statusLineInput = useMemo(() => {\n const profile = getModelManager().getModel('main')\n const outputStyleName = getCurrentOutputStyle()\n const transcriptPath = getMessagesPath(messageLogName, forkNumber, 0)\n\n const currentUsage = statusLineUsage.currentUsage\n const contextWindowSize =\n typeof profile?.contextLength === 'number' ? profile.contextLength : 0\n\n const { used_percentage, remaining_percentage } =\n computeContextWindowPercentages({\n currentUsage,\n contextWindowSize,\n })\n const exceeds200kTokens = currentUsage\n ? currentUsage.input_tokens +\n currentUsage.output_tokens +\n currentUsage.cache_creation_input_tokens +\n currentUsage.cache_read_input_tokens >\n 200000\n : false\n\n return {\n session_id: getKodeAgentSessionId(),\n transcript_path: transcriptPath,\n cwd: currentPwd,\n model: {\n id: profile?.modelName ?? '',\n display_name: profile?.name ?? profile?.modelName ?? '',\n },\n workspace: {\n current_dir: currentPwd,\n project_dir: getOriginalCwd(),\n },\n version: MACRO.VERSION,\n output_style: { name: outputStyleName },\n cost: {\n total_cost_usd: totalCostUSD,\n total_duration_ms: getTotalDuration(),\n total_api_duration_ms: getTotalAPIDuration(),\n },\n context_window: {\n total_input_tokens: statusLineUsage.totalInputTokens,\n total_output_tokens: statusLineUsage.totalOutputTokens,\n context_window_size: contextWindowSize,\n current_usage: currentUsage,\n used_percentage,\n remaining_percentage,\n },\n exceeds_200k_tokens: exceeds200kTokens,\n ...(editorMode === 'vim' ? { vim: { mode: vimMode } } : {}),\n kode: {\n conversation: { messageLogName, forkNumber },\n permission_mode: toolPermissionContext.mode,\n model: {\n provider: profile?.provider ?? null,\n },\n },\n }\n }, [\n currentPwd,\n editorMode,\n forkNumber,\n messageLogName,\n statusLineUsage,\n toolPermissionContext.mode,\n totalCostUSD,\n vimMode,\n ])\n\n const { text: statusLineText, padding: statusLinePadding } =\n useStatusLine(statusLineInput)\n\n const defaultStatusLine = useMemo(() => {\n const parts: string[] = []\n if (editorMode === 'vim' && vimMode === 'INSERT') {\n parts.push('-- INSERT --')\n } else if (mode === 'bash') {\n parts.push('$ bash')\n } else if (mode === 'background') {\n parts.push('& background')\n } else if (mode === 'koding') {\n parts.push('# koding')\n } else {\n parts.push('? shortcuts')\n }\n\n parts.push(isLoading ? 'Enter send \u00B7 Tab queue' : 'Enter send')\n\n if (pendingPrompts.length > 0) {\n parts.push(`pending ${pendingPrompts.length}`)\n }\n\n if (queuedPrompts.length > 0) {\n parts.push(`queued ${queuedPrompts.length}`)\n parts.push('Alt+\u2191 edit')\n }\n\n return parts.join(' \u00B7 ')\n }, [editorMode, isLoading, mode, pendingPrompts.length, queuedPrompts.length, vimMode])\n\n const effectiveStatusLine = statusLineText ?? defaultStatusLine\n\n const toastMessage = useMemo(() => ({ show: false as const }), [])\n\n const compact = rows < 16\n const modelInfoRows = !compact && modelInfo ? 1 : 0\n const pwdRows = compact ? 0 : 1\n const completionReservedRows = inputBoxHeight + modelInfoRows + pwdRows + 1\n const completionEnabled = rows >= 10 && rows - completionReservedRows >= 2\n\n const {\n suggestions,\n selectedIndex,\n isActive: completionActive,\n emptyDirMessage,\n resetCompletion,\n } = useUnifiedCompletion({\n input,\n cursorOffset,\n onInputChange,\n setCursorOffset,\n commands,\n disableSlashCommands,\n isEnabled: completionEnabled,\n })\n const completionVisible =\n completionEnabled && completionActive && suggestions.length > 0\n const visibleSuggestions = completionVisible ? suggestions : []\n\n const {\n pastedTexts,\n pastedImages,\n setPastedTexts,\n setPastedImages,\n onImagePaste,\n onTextPaste,\n clearPastes,\n } = usePromptPastes({\n input,\n cursorOffset,\n onInputChange,\n setCursorOffset,\n onModeChange,\n terminalRows: rows,\n })\n\n // Codex-style prompt queue shortcuts:\n // - Tab queues while a turn is running (and does not send immediately)\n // - Alt+Up pops the most recent queued/pending message for editing\n useKeypress(\n (_inputChar, key) => {\n if (isEditingExternally) return\n if (isDisabled) return\n\n if (\n key.meta &&\n key.upArrow &&\n !key.shift &&\n !key.ctrl\n ) {\n const draftForQueue: QueuedPrompt | null =\n input.trim().length > 0 || pastedTexts.length > 0 || pastedImages.length > 0\n ? {\n seq: nextQueuedPromptSeqRef.current++,\n input,\n mode,\n pastedTexts: [...pastedTexts],\n pastedImages: [...pastedImages],\n }\n : null\n\n const latest =\n queuedPrompts.length > 0\n ? queuedPrompts.reduce((best, item) =>\n item.seq > best.seq ? item : best,\n )\n : null\n if (!latest) return\n\n if (completionActive) resetCompletion()\n clearSavedPromptDraftBestEffort()\n if (draftForQueue) {\n setQueuedPrompts(prev => [...prev, draftForQueue])\n }\n setQueuedPrompts(prev => prev.filter(item => item !== latest))\n clearPastes()\n onModeChange(latest.mode)\n onInputChange(latest.input)\n setPastedTexts(latest.pastedTexts)\n setPastedImages(latest.pastedImages)\n setCursorOffset(latest.input.length)\n return true\n }\n\n if (\n isLoading &&\n key.tab &&\n !key.shift &&\n (input.trim().length > 0 ||\n pastedTexts.length > 0 ||\n pastedImages.length > 0)\n ) {\n if (completionActive) resetCompletion()\n clearSavedPromptDraftBestEffort()\n clearUndoBuffer()\n setQueuedPrompts(prev => [\n ...prev,\n {\n seq: nextQueuedPromptSeqRef.current++,\n input,\n mode,\n pastedTexts: [...pastedTexts],\n pastedImages: [...pastedImages],\n },\n ])\n clearPastes()\n onInputChange('')\n setCursorOffset(0)\n return true\n }\n },\n { priority: KEYPRESS_PRIORITY.REPL_CONTROLLER },\n )\n\n const lastRestorePastesIdRef = useRef<number | null>(null)\n useLayoutEffect(() => {\n if (!restorePastes) return\n if (lastRestorePastesIdRef.current === restorePastes.id) return\n lastRestorePastesIdRef.current = restorePastes.id\n\n setPastedTexts(restorePastes.pastedTexts)\n setPastedImages(restorePastes.pastedImages)\n onDraftPastesChange?.({\n pastedTexts: restorePastes.pastedTexts,\n pastedImages: restorePastes.pastedImages,\n })\n onRestorePastesApplied?.(restorePastes.id)\n }, [\n onDraftPastesChange,\n onRestorePastesApplied,\n restorePastes,\n setPastedImages,\n setPastedTexts,\n ])\n\n const didRestoreDraftPastesRef = useRef(false)\n useLayoutEffect(() => {\n if (didRestoreDraftPastesRef.current) return\n if (restorePastes) return\n if (!draftPastes) return\n if (pastedTexts.length > 0 || pastedImages.length > 0) {\n didRestoreDraftPastesRef.current = true\n return\n }\n if (\n draftPastes.pastedTexts.length === 0 &&\n draftPastes.pastedImages.length === 0\n ) {\n didRestoreDraftPastesRef.current = true\n return\n }\n\n setPastedTexts(draftPastes.pastedTexts)\n setPastedImages(draftPastes.pastedImages)\n didRestoreDraftPastesRef.current = true\n }, [\n draftPastes,\n pastedImages.length,\n pastedTexts.length,\n restorePastes,\n setPastedImages,\n setPastedTexts,\n ])\n\n const didSkipDraftPastesSyncRef = useRef(false)\n useLayoutEffect(() => {\n if (!onDraftPastesChange) return\n if (!didSkipDraftPastesSyncRef.current) {\n didSkipDraftPastesSyncRef.current = true\n return\n }\n onDraftPastesChange({ pastedTexts, pastedImages })\n }, [onDraftPastesChange, pastedImages, pastedTexts])\n\n const didRestoreDraftRef = useRef(false)\n useEffect(() => {\n if (didRestoreDraftRef.current) return\n // Only attempt to restore a saved draft once per PromptInput mount.\n // Otherwise, clearing the input (e.g. after submit) can cause the last saved\n // draft to \"pop back\" into the input.\n didRestoreDraftRef.current = true\n if (initialPrompt && initialPrompt.trim()) return\n\n const hasPendingInput =\n input.trim().length > 0 ||\n pastedTexts.length > 0 ||\n pastedImages.length > 0\n if (hasPendingInput) return\n\n try {\n const draft = getCurrentProjectConfig().promptDrafts?.[PROMPT_DRAFT_KEY]\n if (!draft || typeof draft.text !== 'string' || !draft.text.trim()) return\n\n const nextMode = draft.mode\n const rawOffset =\n typeof draft.cursorOffset === 'number'\n ? draft.cursorOffset\n : draft.text.length\n const clampedOffset = Math.min(Math.max(0, rawOffset), draft.text.length)\n\n didRestoreDraftRef.current = true\n onModeChange(nextMode)\n onInputChange(draft.text)\n setCursorOffset(clampedOffset)\n } catch {\n // best-effort\n }\n }, [\n initialPrompt,\n input,\n onInputChange,\n onModeChange,\n pastedImages.length,\n pastedTexts.length,\n ])\n\n const lastPersistedDraftRef = useRef<{\n text: string\n mode: PromptMode\n cursorOffset: number\n } | null>(null)\n const draftPersistTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(\n null,\n )\n useEffect(() => {\n if (initialPrompt && initialPrompt.trim()) return\n\n const normalizedCursor = Math.min(Math.max(0, cursorOffset), input.length)\n const shouldClearDraft = input.trim().length === 0 && mode === 'prompt'\n const nextSnapshot = {\n text: input,\n mode,\n cursorOffset: normalizedCursor,\n }\n\n const prev = lastPersistedDraftRef.current\n const unchanged =\n prev &&\n prev.text === nextSnapshot.text &&\n prev.mode === nextSnapshot.mode &&\n prev.cursorOffset === nextSnapshot.cursorOffset\n\n if (shouldClearDraft && !prev) return\n if (!shouldClearDraft && unchanged) return\n\n if (draftPersistTimeoutRef.current) {\n clearTimeout(draftPersistTimeoutRef.current)\n draftPersistTimeoutRef.current = null\n }\n\n draftPersistTimeoutRef.current = setTimeout(() => {\n try {\n const projectConfig = getCurrentProjectConfig()\n const promptDrafts = { ...(projectConfig.promptDrafts ?? {}) }\n\n if (shouldClearDraft) {\n delete promptDrafts[PROMPT_DRAFT_KEY]\n lastPersistedDraftRef.current = null\n } else {\n promptDrafts[PROMPT_DRAFT_KEY] = {\n text: nextSnapshot.text,\n mode: nextSnapshot.mode,\n cursorOffset: nextSnapshot.cursorOffset,\n updatedAt: Date.now(),\n }\n lastPersistedDraftRef.current = nextSnapshot\n }\n\n saveCurrentProjectConfig({ ...projectConfig, promptDrafts })\n } catch {\n // best-effort\n }\n draftPersistTimeoutRef.current = null\n }, 400)\n\n return () => {\n if (draftPersistTimeoutRef.current) {\n clearTimeout(draftPersistTimeoutRef.current)\n draftPersistTimeoutRef.current = null\n }\n }\n }, [cursorOffset, initialPrompt, input, mode])\n\n const { resetHistory, onHistoryUp, onHistoryDown, onUserInput, historyIndex, isInFastBrowseMode } =\n useArrowKeyHistory({\n current: {\n text: input,\n mode,\n cursorOffset,\n extra: { pastedTexts, pastedImages },\n },\n emptyExtra: { pastedTexts: [], pastedImages: [] },\n onRestore: snapshot => {\n setPastedTexts(snapshot.extra.pastedTexts)\n setPastedImages(snapshot.extra.pastedImages)\n onModeChange(snapshot.mode)\n onInputChange(snapshot.text)\n setCursorOffset(snapshot.cursorOffset)\n },\n buildExtraFromHistoryEntry: entry => ({\n pastedTexts: entry.pastedTexts,\n pastedImages: [],\n }),\n })\n onHistoryUserInputRef.current = onUserInput\n\n const historyHintTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const lastHistoryHintTimeRef = useRef<number>(0)\n useEffect(() => {\n if (historyIndex < 2) return\n\n const now = Date.now()\n // Don't show again within 10 seconds of last hint\n if (now - lastHistoryHintTimeRef.current < 10000) return\n // Clear existing timeout if any\n if (historyHintTimeoutRef.current) {\n clearTimeout(historyHintTimeoutRef.current)\n historyHintTimeoutRef.current = null\n }\n\n lastHistoryHintTimeRef.current = now\n handleInlineMessage(true, 'Tip: Ctrl+R to search history')\n\n historyHintTimeoutRef.current = setTimeout(() => {\n setMessage(prev => {\n if (!prev.show) return prev\n if (prev.text !== 'Tip: Ctrl+R to search history') return prev\n return { show: false }\n })\n historyHintTimeoutRef.current = null\n }, 5000)\n }, [handleInlineMessage, historyIndex])\n\n useEffect(() => {\n return () => {\n if (historyHintTimeoutRef.current) {\n clearTimeout(historyHintTimeoutRef.current)\n }\n }\n }, [])\n\n const handleHistoryUp = () => {\n if (completionActive) resetCompletion()\n onHistoryUp()\n }\n const handleHistoryDown = () => {\n if (completionActive) resetCompletion()\n\n if (\n typeof onManageTasks === 'function' &&\n historyIndex === 0 &&\n input.length === 0\n ) {\n const hasBackgroundTasks =\n BunShell.getInstance().listBackgroundShells().length > 0 ||\n listBackgroundAgentTaskSnapshots().length > 0\n if (hasBackgroundTasks) {\n onManageTasks()\n return\n }\n }\n\n 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 === 'bashModeToggle') {\n onModeChange(toggleBashMode(mode))\n return true\n }\n\n if (action === 'modelSwitch') {\n // Allow model switching while a turn is running. The change will apply to\n // subsequent model requests / the next turn, depending on the engine.\n handleQuickModelSwitch()\n return true\n }\n\n if (action === 'externalEditor') {\n void handleExternalEdit()\n return true\n }\n\n if (\n editorMode === 'vim' &&\n vimMode === 'NORMAL' &&\n key.insertable &&\n !key.ctrl &&\n !key.meta &&\n inputChar.length === 1\n ) {\n const cursor = Cursor.fromText(\n input,\n textInputColumns,\n cursorOffsetRef.current,\n )\n\n const applyCursor = (nextCursor: Cursor) => {\n if (nextCursor.text !== input) onInputChange(nextCursor.text)\n setCursorOffset(nextCursor.offset)\n }\n\n switch (inputChar) {\n case 'h':\n applyCursor(cursor.left())\n return true\n case 'j':\n applyCursor(cursor.down())\n return true\n case 'k':\n applyCursor(cursor.up())\n return true\n case 'l':\n applyCursor(cursor.right())\n return true\n case '0':\n applyCursor(cursor.startOfLine())\n return true\n case '$':\n applyCursor(cursor.endOfLine())\n return true\n case 'w':\n applyCursor(cursor.nextWord())\n return true\n case 'b':\n applyCursor(cursor.prevWord())\n return true\n case 'x':\n applyCursor(cursor.del())\n return true\n case 'i':\n setVimMode('INSERT')\n return true\n case 'I':\n applyCursor(cursor.startOfLine())\n setVimMode('INSERT')\n return true\n case 'a':\n applyCursor(cursor.right())\n setVimMode('INSERT')\n return true\n case 'A':\n applyCursor(cursor.endOfLine())\n setVimMode('INSERT')\n return true\n default:\n return true\n }\n }\n\n return false\n },\n [\n cycleMode,\n editorMode,\n handleExternalEdit,\n handleQuickModelSwitch,\n isEditingExternally,\n isLoading,\n mode,\n modeCycleShortcut,\n onInputChange,\n onModeChange,\n input,\n textInputColumns,\n vimMode,\n ],\n )\n\n useEffect(() => {\n const signature = [\n `mode:${mode}`,\n `input:${input}`,\n ...pastedTexts.map(p => `text:${p.placeholder}`),\n ...pastedImages.map(p => `image:${p.placeholder}`),\n ].join('\\n')\n\n pushUndoSnapshot({\n signature,\n text: input,\n cursorOffset: cursorOffsetRef.current,\n extra: {\n mode,\n pastedTexts: [...pastedTexts],\n pastedImages: [...pastedImages],\n },\n })\n }, [input, mode, pastedImages, pastedTexts, pushUndoSnapshot])\n\n const clearSavedPromptDraftBestEffort = useCallback(() => {\n try {\n if (draftPersistTimeoutRef.current) {\n clearTimeout(draftPersistTimeoutRef.current)\n draftPersistTimeoutRef.current = null\n }\n\n const projectConfig = getCurrentProjectConfig()\n const existing = projectConfig.promptDrafts?.[PROMPT_DRAFT_KEY]\n if (!existing) {\n lastPersistedDraftRef.current = null\n return\n }\n\n const promptDrafts = { ...(projectConfig.promptDrafts ?? {}) }\n delete promptDrafts[PROMPT_DRAFT_KEY]\n saveCurrentProjectConfig({ ...projectConfig, promptDrafts })\n lastPersistedDraftRef.current = null\n } catch {\n // best-effort\n }\n }, [])\n\n async function onSubmit(value: string, isSubmittingSlashCommand = false) {\n if (isEditingExternally) return\n\n if (\n !isSubmittingSlashCommand &&\n completionVisible &&\n suggestions.length > 0\n ) {\n return\n }\n\n if (!value) return\n if (isDisabled) return\n if (!value.trim()) return\n\n if (isLoading) {\n // Enter always \"sends\". While a turn is running, treat it as a pending submission\n // (distinct from Tab-queued tasks) and auto-run it when the current turn completes.\n if (completionActive) resetCompletion()\n clearSavedPromptDraftBestEffort()\n clearUndoBuffer()\n setPendingPrompts(prev => [\n ...prev,\n {\n seq: nextQueuedPromptSeqRef.current++,\n input: value,\n mode,\n pastedTexts: [...pastedTexts],\n pastedImages: [...pastedImages],\n },\n ])\n clearPastes()\n onInputChange('')\n setCursorOffset(0)\n return\n }\n\n clearSavedPromptDraftBestEffort()\n clearUndoBuffer()\n\n await submitPrompt({\n input: value,\n mode,\n completionActive: completionVisible,\n suggestionCount: completionVisible ? suggestions.length : 0,\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 onShowMessageSelector,\n readFileTimestamps,\n pastedTexts,\n pastedImages,\n clearPastes,\n resetHistory,\n setCurrentPwd,\n exit,\n })\n }\n\n const [isQueueDrainInFlight, setIsQueueDrainInFlight] = useState(false)\n useEffect(() => {\n if (isQueueDrainInFlight) return\n if (isLoading) return\n if (isDisabled) return\n if (isEditingExternally) return\n\n const next = pendingPrompts[0] ?? queuedPrompts[0]\n if (!next) return\n\n setIsQueueDrainInFlight(true)\n if (pendingPrompts.length > 0) {\n setPendingPrompts(prev => prev.slice(1))\n } else {\n setQueuedPrompts(prev => prev.slice(1))\n }\n\n void (async () => {\n try {\n await submitPrompt({\n input: next.input,\n mode: next.mode,\n completionActive: false,\n suggestionCount: 0,\n isSubmittingSlashCommand: false,\n isDisabled,\n isLoading: false,\n isEditingExternally,\n abortController,\n setIsLoading,\n setAbortController,\n // Do not clobber the user's current draft while draining the queue.\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 onShowMessageSelector,\n readFileTimestamps,\n pastedTexts: next.pastedTexts,\n pastedImages: next.pastedImages,\n clearPastes: () => {},\n resetHistory: () => {},\n setCurrentPwd,\n exit,\n })\n } finally {\n setIsQueueDrainInFlight(false)\n }\n })()\n }, [\n abortController,\n commands,\n currentMode,\n disableSlashCommands,\n forkNumber,\n input,\n isDisabled,\n isEditingExternally,\n isLoading,\n messageLogName,\n onQuery,\n onSubmitCountChange,\n pendingPrompts,\n queuedPrompts,\n readFileTimestamps,\n isQueueDrainInFlight,\n setAbortController,\n setCurrentPwd,\n setForkConvoWithMessagesOnTheNextRender,\n setIsLoading,\n setToolJSX,\n toolPermissionContext,\n tools,\n verbose,\n ])\n\n useKeypress(\n (inputChar, key) => {\n if (clearInputPending && !key.escape) {\n setClearInputPending(false)\n }\n if (rewindPending && !key.escape) {\n setRewindPending(false)\n }\n\n if (key.escape && editorMode === 'vim' && vimMode === 'INSERT') {\n setVimMode('NORMAL')\n return true\n }\n\n if (key.ctrl && inputChar === 's') {\n setClearInputPending(false)\n\n if (\n input.trim() === '' &&\n pastedTexts.length === 0 &&\n pastedImages.length === 0 &&\n promptStash\n ) {\n onModeChange(promptStash.mode)\n onInputChange(promptStash.input)\n setPastedTexts(promptStash.pastedTexts)\n setPastedImages(promptStash.pastedImages)\n setCursorOffset(promptStash.cursorOffset)\n setPromptStash(null)\n return true\n }\n\n if (\n input.trim() !== '' ||\n pastedTexts.length > 0 ||\n pastedImages.length > 0\n ) {\n setPromptStash({\n input,\n mode,\n cursorOffset,\n pastedTexts: [...pastedTexts],\n pastedImages: [...pastedImages],\n })\n clearPastes()\n onInputChange('')\n setCursorOffset(0)\n return true\n }\n\n return true\n }\n\n if (key.ctrl && inputChar === '_') {\n setClearInputPending(false)\n if (!canUndo) return true\n\n const snapshot = undoOnce()\n if (!snapshot) return true\n\n setPastedTexts(snapshot.extra.pastedTexts)\n setPastedImages(snapshot.extra.pastedImages)\n onModeChange(snapshot.extra.mode)\n onInputChange(snapshot.text)\n setCursorOffset(snapshot.cursorOffset)\n return true\n }\n\n // Handle mode exit when input is empty and user presses backspace/delete/escape\n if (\n (mode === 'bash' || mode === 'background' || mode === 'koding') &&\n input === '' &&\n (key.backspace || key.delete || key.escape)\n ) {\n onModeChange('prompt')\n return true\n }\n\n if (\n key.escape &&\n !isLoading &&\n mode === 'prompt' &&\n !completionVisible &&\n input.length === 0 &&\n pastedTexts.length === 0 &&\n pastedImages.length === 0\n ) {\n setClearInputPending(false)\n handleRewind()\n return true\n }\n\n if (\n key.escape &&\n !isLoading &&\n (input.length > 0 || pastedTexts.length > 0 || pastedImages.length > 0)\n ) {\n setRewindPending(false)\n handleClearInput()\n return true\n }\n },\n { priority: KEYPRESS_PRIORITY.INPUT },\n )\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 pendingPrompts={pendingPrompts.map(item => item.input)}\n queuedPrompts={queuedPrompts.map(item => item.input)}\n completionActive={completionVisible}\n historyIndex={historyIndex}\n suggestions={visibleSuggestions}\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={handleExitMessage}\n onMessage={handleInlineMessage}\n onImagePaste={onImagePaste}\n onTextPaste={onTextPaste}\n onSpecialKey={handleSpecialKey}\n exitMessage={exitMessage}\n message={message}\n clearInputPending={clearInputPending}\n rewindPending={rewindPending}\n modelSwitchMessage={modelSwitchMessage}\n toastMessage={toastMessage}\n statusLine={effectiveStatusLine}\n statusLinePadding={statusLinePadding}\n currentMode={currentMode}\n modeCycleShortcutText={modeCycleShortcut.displayText}\n showQuickModelSwitchShortcut={showQuickModelSwitchShortcut}\n tokenUsage={tokenUsage}\n textInputColumns={textInputColumns}\n textInputMaxHeight={textInputMaxHeight}\n completionReservedRows={completionReservedRows}\n isInFastBrowseMode={isInFastBrowseMode}\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 { useCallback, useEffect, useRef, useState } from 'react'\nimport { getHistoryWithPastes } from '#core/history'\nimport type { PromptMode } from '#ui-ink/components/PromptInput/types'\n\nconst FAST_BROWSE_WINDOW_MS = 1500\n\nexport type ArrowKeyHistorySnapshot<Extra> = {\n text: string\n mode: PromptMode\n cursorOffset: number\n extra: Extra\n}\n\nexport function useArrowKeyHistory<Extra>(args: {\n current: ArrowKeyHistorySnapshot<Extra>\n emptyExtra: Extra\n onRestore: (snapshot: ArrowKeyHistorySnapshot<Extra>) => void\n buildExtraFromHistoryEntry?: (entry: {\n display: string\n pastedTexts: Array<{ placeholder: string; text: string }>\n }) => Extra\n}) {\n const { current, emptyExtra, onRestore, buildExtraFromHistoryEntry } = args\n\n const [historyIndex, setHistoryIndex] = useState(0)\n const historyIndexRef = useRef(0)\n useEffect(() => {\n historyIndexRef.current = historyIndex\n }, [historyIndex])\n\n const draftSnapshotRef = useRef<ArrowKeyHistorySnapshot<Extra> | null>(null)\n const historySnapshotRef = useRef<\n | Array<{\n display: string\n pastedTexts: Array<{ placeholder: string; text: string }>\n }>\n | null\n >(null)\n const lastHistoryNavTimeRef = useRef(0)\n\n const currentRef = useRef(current)\n useEffect(() => {\n currentRef.current = current\n }, [current])\n\n const getHistorySnapshot = () => {\n if (!historySnapshotRef.current) {\n historySnapshotRef.current = getHistoryWithPastes()\n }\n return historySnapshotRef.current\n }\n\n const updateFromHistoryEntry = (\n entry:\n | {\n display: string\n pastedTexts: Array<{ placeholder: string; text: string }>\n }\n | undefined,\n cursor: 'start' | 'end',\n ) => {\n if (entry === undefined) return\n let mode: PromptMode = 'prompt'\n let text = entry.display\n if (entry.display.startsWith('!')) {\n mode = 'bash'\n text = entry.display.slice(1)\n } else if (entry.display.startsWith('&')) {\n mode = 'background'\n text = entry.display.slice(1)\n } else if (entry.display.startsWith('#')) {\n mode = 'koding'\n text = entry.display.slice(1)\n }\n onRestore({\n text,\n mode,\n cursorOffset: cursor === 'start' ? 0 : text.length,\n extra: buildExtraFromHistoryEntry\n ? buildExtraFromHistoryEntry(entry)\n : emptyExtra,\n })\n }\n\n function onHistoryUp() {\n const latestHistory = getHistorySnapshot()\n const prev = historyIndexRef.current\n if (prev >= latestHistory.length) return\n\n if (prev === 0) draftSnapshotRef.current = currentRef.current\n updateFromHistoryEntry(latestHistory[prev], 'start')\n\n const next = prev + 1\n historyIndexRef.current = next\n lastHistoryNavTimeRef.current = Date.now()\n setHistoryIndex(next)\n }\n\n function onHistoryDown() {\n const latestHistory = getHistorySnapshot()\n const prev = historyIndexRef.current\n if (prev > 1) {\n const next = prev - 1\n updateFromHistoryEntry(latestHistory[next - 1], 'end')\n historyIndexRef.current = next\n lastHistoryNavTimeRef.current = Date.now()\n setHistoryIndex(next)\n return\n }\n\n if (prev === 1) {\n onRestore(draftSnapshotRef.current ?? currentRef.current)\n draftSnapshotRef.current = null\n historyIndexRef.current = 0\n lastHistoryNavTimeRef.current = Date.now()\n setHistoryIndex(0)\n return\n }\n }\n\n const isInFastBrowseMode = useCallback(() => {\n return Date.now() - lastHistoryNavTimeRef.current < FAST_BROWSE_WINDOW_MS\n }, [])\n\n const onUserInput = useCallback(() => {\n if (historyIndexRef.current === 0) return\n historyIndexRef.current = 0\n draftSnapshotRef.current = null\n historySnapshotRef.current = null\n setHistoryIndex(0)\n }, [])\n\n function resetHistory() {\n historyIndexRef.current = 0\n setHistoryIndex(0)\n draftSnapshotRef.current = null\n historySnapshotRef.current = null\n }\n\n return {\n historyIndex,\n setHistoryIndex,\n onHistoryUp,\n onHistoryDown,\n onUserInput,\n resetHistory,\n isInFastBrowseMode,\n }\n}\n", "import { useEffect, useRef, useState } from 'react'\nimport { BunShell } from '#runtime/shell'\nimport { getStatusLineConfig } from '#core/services/statusline'\nimport { listBackgroundAgentTaskSnapshots } from '#core/utils/backgroundTasks'\n\nfunction serializeStatusLineInput(value: unknown): string {\n try {\n return JSON.stringify(value ?? {}, null, 0) + '\\n'\n } catch {\n return '{}\\n'\n }\n}\n\nfunction buildDynamicStatusLineInput(\n baseInput: unknown,\n shell: BunShell,\n): Record<string, unknown> {\n const base =\n baseInput && typeof baseInput === 'object' && !Array.isArray(baseInput)\n ? (baseInput as Record<string, unknown>)\n : {}\n\n const existingKode =\n base.kode && typeof base.kode === 'object' && !Array.isArray(base.kode)\n ? (base.kode as Record<string, unknown>)\n : {}\n\n const shells = shell.listBackgroundShells()\n const runningShells = shells.filter(\n proc => proc.code === null && !proc.interrupted && !proc.killed,\n ).length\n\n const agents = listBackgroundAgentTaskSnapshots()\n const runningAgents = agents.filter(task => task.status === 'running').length\n\n const tasks = {\n total: shells.length + agents.length,\n running: runningShells + runningAgents,\n bash: { total: shells.length, running: runningShells },\n agents: { total: agents.length, running: runningAgents },\n }\n\n return {\n ...base,\n kode: {\n ...existingKode,\n tasks,\n },\n }\n}\n\nexport function useStatusLine(input?: unknown): {\n text: string | null\n padding: number\n} {\n const [state, setState] = useState<{ text: string | null; padding: number }>({\n text: null,\n padding: 0,\n })\n const lastCommandRef = useRef<string | null>(null)\n const abortRef = useRef<AbortController | null>(null)\n const inputRef = useRef<unknown>(input)\n const tickRef = useRef<(() => void) | null>(null)\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n useEffect(() => {\n inputRef.current = input\n\n if (!tickRef.current) return\n if (debounceRef.current) clearTimeout(debounceRef.current)\n debounceRef.current = setTimeout(() => {\n tickRef.current?.()\n }, 300)\n\n return () => {\n if (debounceRef.current) clearTimeout(debounceRef.current)\n debounceRef.current = null\n }\n }, [input])\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 config = getStatusLineConfig()\n const command = config?.command ?? null\n const padding = config?.padding ?? 0\n\n if (!command) {\n lastCommandRef.current = null\n abortRef.current?.abort()\n abortRef.current = null\n if (alive) setState({ text: null, padding: 0 })\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, 5000, {\n stdin: serializeStatusLineInput(\n buildDynamicStatusLineInput(inputRef.current, shell),\n ),\n })\n if (!alive) return\n if (result.interrupted) return\n\n const raw = result.code === 0 ? result.stdout : ''\n const next = raw\n ? raw\n .trim()\n .split(/\\r?\\n/)\n .flatMap(line => {\n const trimmed = line.trim()\n return trimmed ? [trimmed] : []\n })\n .join('\\n')\n : ''\n if (alive) setState({ text: next || null, padding })\n }\n\n tickRef.current = () => {\n tick().catch(() => {})\n }\n\n tick().catch(() => {})\n\n const intervalId = setInterval(() => {\n tickRef.current?.()\n }, 1000)\n\n return () => {\n alive = false\n abortRef.current?.abort()\n tickRef.current = null\n clearInterval(intervalId)\n }\n }, [])\n\n return state\n}\n", "import {\n getSettingsFileCandidates,\n loadSettingsWithLegacyFallback,\n saveSettingsToPrimaryAndSyncLegacy,\n} from '#config'\nimport { getDisableAllHooksState } from '#core/hooks/disableAllHooks'\nimport { getCwd } from '#core/utils/state'\n\ntype UserSettings = {\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\nfunction normalizePadding(value: unknown): number | null {\n if (typeof value !== 'number') return null\n if (!Number.isFinite(value)) return null\n const rounded = Math.floor(value)\n return rounded >= 0 ? rounded : null\n}\n\nexport function getUserSettingsPath(): string {\n const candidates = getSettingsFileCandidates({ destination: 'userSettings' })\n return candidates?.primary ?? ''\n}\n\nexport type StatusLineConfig = {\n type: 'command'\n command: string\n padding?: number\n}\n\nexport function getStatusLineConfig(): StatusLineConfig | null {\n const hooksDisabled = getDisableAllHooksState({\n projectDir: getCwd(),\n }).disabled\n if (hooksDisabled) return null\n\n const loaded = loadSettingsWithLegacyFallback({\n destination: 'userSettings',\n migrateToPrimary: true,\n })\n const settings = (loaded.settings as UserSettings | null) ?? {}\n\n const raw = settings.statusLine\n if (typeof raw === 'string') {\n const command = normalizeString(raw)\n return command ? { type: 'command', command } : null\n }\n if (raw && typeof raw === 'object') {\n const record = raw as Record<string, unknown>\n const typeRaw = record.type\n if (typeRaw !== undefined && typeRaw !== 'command') return null\n\n const command = normalizeString(record.command)\n if (!command) return null\n\n const padding = normalizePadding(record.padding)\n return {\n type: 'command',\n command,\n ...(padding !== null ? { padding } : {}),\n }\n }\n return null\n}\n\nexport function getStatusLineCommand(): string | null {\n return getStatusLineConfig()?.command ?? null\n}\n\nexport function getStatusLinePadding(): number {\n return getStatusLineConfig()?.padding ?? 0\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 UserSettings | null) ?? {}\n const next: UserSettings = { ...existing }\n if (command === null) {\n delete next.statusLine\n } else {\n const normalized = normalizeString(command)\n if (!normalized) {\n delete next.statusLine\n } else {\n const existingPadding =\n existing.statusLine &&\n typeof existing.statusLine === 'object' &&\n !Array.isArray(existing.statusLine)\n ? normalizePadding(\n (existing.statusLine as Record<string, unknown>).padding,\n )\n : null\n\n next.statusLine = {\n type: 'command',\n command: normalized,\n ...(existingPadding !== null ? { padding: existingPadding } : {}),\n }\n }\n }\n saveSettingsToPrimaryAndSyncLegacy({\n destination: 'userSettings',\n settings: next,\n syncLegacyIfExists: true,\n })\n}\n", "import { useCallback, useEffect, 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 isEnabled = true,\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 useEffect(() => {\n if (!isEnabled && state.isActive) {\n resetCompletion()\n }\n }, [isEnabled, resetCompletion, state.isActive])\n\n useUnifiedCompletionTabKey({\n input,\n state,\n getWordAtCursor,\n generateSuggestions,\n completeWith,\n activateCompletion,\n updateState,\n onInputChange,\n setCursorOffset,\n isEnabled,\n })\n\n useUnifiedCompletionNavigationKeys({\n input,\n state,\n resetCompletion,\n updateState,\n generateSuggestions,\n completeWith,\n activateCompletion,\n onInputChange,\n setCursorOffset,\n isEnabled,\n })\n\n useUnifiedCompletionAutoTrigger({\n input,\n cursorOffset,\n state,\n getWordAtCursor,\n generateSuggestions,\n activateCompletion,\n resetCompletion,\n isEnabled,\n })\n\n return {\n suggestions: state.suggestions,\n selectedIndex: state.selectedIndex,\n isActive: state.isActive && isEnabled,\n emptyDirMessage: state.emptyDirMessage,\n resetCompletion,\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 isCommand = !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 trigger: '/',\n }\n }\n\n if (word.startsWith('@')) {\n const content = word.slice(1)\n if (word.includes('@', 1)) return null\n return {\n type: 'file',\n prefix: content,\n startPos: start,\n endPos: cursorOffset,\n trigger: '@',\n }\n }\n\n return {\n type: 'file',\n prefix: word,\n startPos: start,\n endPos: cursorOffset,\n trigger: null,\n }\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\nfunction buildCommandDescription(cmd: Command): string {\n const parts: string[] = []\n if (cmd.description) parts.push(cmd.description)\n if (cmd.argumentHint) parts.push(`Args: ${cmd.argumentHint}`)\n return parts.join('\\n')\n}\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 description: buildCommandDescription(cmd),\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 description: buildCommandDescription(cmd),\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'\nimport { existsSync } from 'fs'\nimport { homedir } from 'os'\nimport { join } from 'path'\nimport { LEGACY_CONFIG_DIRNAME } from '#core/compat/legacyPaths'\n\nfunction generateSpecialFileRootSuggestions(args: {\n prefix: string\n cwd: string\n}): UnifiedSuggestion[] {\n const prefix = args.prefix ?? ''\n const shouldSuggestRoots =\n prefix === '' || prefix.startsWith('.') || prefix.startsWith('~')\n if (!shouldSuggestRoots) return []\n\n const candidates: Array<{\n value: string\n displayValue: string\n existsAt: string\n }> = [\n {\n value: '.kode/',\n displayValue: '\uD83D\uDCC1 .kode/',\n existsAt: join(args.cwd, '.kode'),\n },\n {\n value: `${LEGACY_CONFIG_DIRNAME}/`,\n displayValue: `\uD83D\uDCC1 ${LEGACY_CONFIG_DIRNAME}/`,\n existsAt: join(args.cwd, LEGACY_CONFIG_DIRNAME),\n },\n {\n value: '~/.kode/',\n displayValue: '\uD83D\uDCC1 ~/.kode/',\n existsAt: join(homedir(), '.kode'),\n },\n {\n value: `~/${LEGACY_CONFIG_DIRNAME}/`,\n displayValue: `\uD83D\uDCC1 ~/${LEGACY_CONFIG_DIRNAME}/`,\n existsAt: join(homedir(), LEGACY_CONFIG_DIRNAME),\n },\n ]\n\n const out: UnifiedSuggestion[] = []\n for (const c of candidates) {\n if (!c.value.toLowerCase().startsWith(prefix.toLowerCase())) continue\n if (!existsSync(c.existsAt)) continue\n out.push({\n value: c.value,\n displayValue: c.displayValue,\n type: 'file',\n score: 120,\n metadata: c.value.includes(LEGACY_CONFIG_DIRNAME)\n ? { color: 'dim' }\n : undefined,\n })\n }\n\n return out\n}\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 isAtFilePath = context.trigger === '@'\n const specialRootSuggestions = isAtFilePath\n ? generateSpecialFileRootSuggestions({\n prefix: context.prefix,\n cwd,\n })\n : []\n const fileSuggestions = generateFileSuggestions({\n prefix: context.prefix,\n cwd,\n })\n const unixSuggestions = isAtFilePath\n ? []\n : 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: isAtFilePath ? 5 : 50,\n weightedScore: s.score + (isAtFilePath ? 5 : 50),\n })),\n ...fileSuggestions.map(s => ({\n ...s,\n sourceWeight: isAtFilePath ? 150 : 0,\n weightedScore: s.score + (isAtFilePath ? 150 : 0),\n })),\n ...specialRootSuggestions.map(s => ({\n ...s,\n sourceWeight: isAtFilePath ? 250 : 0,\n weightedScore: s.score + (isAtFilePath ? 250 : 0),\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 isEnabled?: 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 const atPrefix = context.trigger === '@'\n completion = `${atPrefix ? '@' : ''}${suggestion.value}${\n isDirectory ? '' : ' '\n }`\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 : context.trigger === '@'\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 const next = Array.from(commandSet).sort()\n setSystemCommands(next)\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 { 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 __computeAutoTriggerActionForTests(args: {\n input: string\n previousInput: string\n now: number\n lastInputTime: number\n isEnabled: boolean\n state: CompletionState\n context: CompletionContext | null\n generateSuggestions: (context: CompletionContext) => UnifiedSuggestion[]\n}): {\n nextLastInput: string\n nextLastInputTime: number\n action: 'none' | 'reset' | 'activate'\n suggestions?: UnifiedSuggestion[]\n context?: CompletionContext\n} {\n if (args.previousInput === args.input) {\n return {\n nextLastInput: args.previousInput,\n nextLastInputTime: args.lastInputTime,\n action: 'none',\n }\n }\n\n if (!args.isEnabled) {\n return {\n nextLastInput: args.input,\n nextLastInputTime: args.lastInputTime,\n action: args.state.isActive ? 'reset' : 'none',\n }\n }\n\n const timeSinceLastInput = args.now - args.lastInputTime\n const isPossiblyIMEInput = timeSinceLastInput > 0 && timeSinceLastInput < 150\n\n const inputLengthChange = Math.abs(\n args.input.length - args.previousInput.length,\n )\n const isHistoryNavigation =\n (inputLengthChange > 10 ||\n (inputLengthChange > 5 &&\n !args.input.includes(args.previousInput.slice(-5)))) &&\n args.input !== args.previousInput\n\n const shouldAutoHideSingleMatch = (\n suggestion: UnifiedSuggestion,\n context: CompletionContext,\n ): 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\n const nextLastInputTime = args.now\n const nextLastInput = args.input\n\n if (args.state.preview?.isActive || args.now < args.state.suppressUntil) {\n return { nextLastInput, nextLastInputTime, action: 'none' }\n }\n\n if (isHistoryNavigation && args.state.isActive) {\n return { nextLastInput, nextLastInputTime, action: 'reset' }\n }\n\n // \u7ACB\u5373\u5173\u95ED\u8865\u5168\u9762\u677F\u5982\u679C context \u4E0D\u5B58\u5728\u4F46\u9762\u677F\u4ECD\u7136\u6FC0\u6D3B\n // \u8FD9\u89E3\u51B3\u4E86\u5220\u9664 \"/\" \u6216 \"@\" \u540E\u8865\u5168\u9762\u677F\u4E0D\u5173\u95ED\u7684\u95EE\u9898\n if (!args.context && args.state.isActive) {\n return { nextLastInput, nextLastInputTime, action: 'reset' }\n }\n\n // \u5982\u679C\u53EF\u80FD\u662F IME \u8F93\u5165\u4E14\u9762\u677F\u672A\u6FC0\u6D3B\uFF0C\u6682\u65F6\u4E0D\u89E6\u53D1\u8865\u5168\n // \u8FD9\u53EF\u4EE5\u51CF\u5C11\u4E2D\u6587\u8F93\u5165\u65F6\u7684\u5E72\u6270\n if (isPossiblyIMEInput && !args.state.isActive) {\n return { nextLastInput, nextLastInputTime, action: 'none' }\n }\n\n if (args.context && shouldAutoTrigger(args.context)) {\n const newSuggestions = args.generateSuggestions(args.context)\n\n if (newSuggestions.length === 0) {\n return { nextLastInput, nextLastInputTime, action: 'reset' }\n }\n\n if (\n newSuggestions.length === 1 &&\n shouldAutoHideSingleMatch(newSuggestions[0], args.context)\n ) {\n return { nextLastInput, nextLastInputTime, action: 'reset' }\n }\n\n return {\n nextLastInput,\n nextLastInputTime,\n action: 'activate',\n suggestions: newSuggestions,\n context: args.context,\n }\n }\n\n if (args.state.context) {\n const current = args.context\n const previous = args.state.context\n const contextChanged =\n !current ||\n previous.type !== current.type ||\n previous.startPos !== current.startPos ||\n !current.prefix.startsWith(previous.prefix)\n\n if (contextChanged) {\n return { nextLastInput, nextLastInputTime, action: 'reset' }\n }\n }\n\n return { nextLastInput, nextLastInputTime, action: 'none' }\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 isEnabled: boolean\n}): void {\n const lastInputRef = useRef('')\n const lastInputTimeRef = useRef(0)\n\n useEffect(() => {\n const now = Date.now()\n const context = args.getWordAtCursor()\n const result = __computeAutoTriggerActionForTests({\n input: args.input,\n previousInput: lastInputRef.current,\n now,\n lastInputTime: lastInputTimeRef.current,\n isEnabled: args.isEnabled,\n state: args.state,\n context,\n generateSuggestions: args.generateSuggestions,\n })\n\n lastInputRef.current = result.nextLastInput\n lastInputTimeRef.current = result.nextLastInputTime\n\n if (result.action === 'reset') {\n args.resetCompletion()\n return\n }\n\n if (result.action === 'activate' && result.suggestions && result.context) {\n args.activateCompletion(result.suggestions, result.context)\n }\n }, [args.input, args.cursorOffset, args.isEnabled, args.state.isActive])\n}\n", "import { useKeypress, type Key } from '#ui-ink/hooks/useKeypress'\nimport { KEYPRESS_PRIORITY } from '#ui-ink/constants/keypressPriority'\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 isEnabled: boolean\n}): void {\n useKeypress(\n (_inputChar, key) => {\n if (!args.isEnabled) return false\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 (\n nextSuggestion.isSmartMatch ||\n args.state.context.trigger === '@'\n ) {\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 || context.trigger === '@') {\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 { priority: KEYPRESS_PRIORITY.COMPLETION },\n )\n}\n", "import { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { KEYPRESS_PRIORITY } from '#ui-ink/constants/keypressPriority'\n\nimport type {\n CompletionContext,\n UnifiedSuggestion,\n} from '#cli-utils/completion/types'\nimport type { CompletionState } from './types'\n\nfunction getPreviewText(\n suggestion: UnifiedSuggestion,\n context: CompletionContext,\n): string {\n if (context.type === 'command') return `/${suggestion.value}`\n if (context.type === 'agent') return `@${suggestion.value}`\n if (suggestion.isSmartMatch) return `@${suggestion.value}`\n if (context.type === 'file' && context.trigger === '@') {\n return `@${suggestion.value}`\n }\n return suggestion.value\n}\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 isEnabled: boolean\n}): void {\n useKeypress(\n (inputChar, key) => {\n if (!args.isEnabled) return false\n\n // When completion is active, don't let history navigation take over\n const preferHistoryNavigation =\n !args.state.isActive &&\n !args.input.includes('\\n') &&\n !key.ctrl &&\n !key.meta\n\n if (preferHistoryNavigation && (key.upArrow || key.downArrow)) {\n return false\n }\n\n // Enter key: close completion panel without filling, let normal submit handle it\n if (\n key.return &&\n !key.shift &&\n !key.meta &&\n args.state.isActive &&\n args.state.suggestions.length > 0\n ) {\n // Restore original input if preview was active\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 args.resetCompletion()\n // Return false to let normal Enter/submit behavior take over\n return false\n }\n\n if (!args.state.isActive || args.state.suggestions.length === 0)\n return false\n\n const handleNavigation = (newIndex: number) => {\n if (!args.state.context) {\n args.updateState({ selectedIndex: newIndex })\n return\n }\n\n const suggestion = args.state.suggestions[newIndex]\n const previewValue = getPreviewText(suggestion, args.state.context)\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(\n args.state.context.startPos + previewValue.length,\n )\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 const handleUp =\n key.upArrow || (key.ctrl && inputChar === 'p') ? true : false\n const handleDown =\n key.downArrow || (key.ctrl && inputChar === 'n') ? true : false\n\n if (handleDown) {\n const nextIndex =\n (args.state.selectedIndex + 1) % args.state.suggestions.length\n handleNavigation(nextIndex)\n return true\n }\n\n if (handleUp) {\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 args.completeWith(selectedSuggestion, args.state.context)\n\n args.resetCompletion()\n\n if (isDirectory) {\n setTimeout(() => {\n if (!args.state.context) return\n const inserted = getPreviewText(\n selectedSuggestion,\n args.state.context,\n )\n const nextEndPos = args.state.context.startPos + inserted.length\n const newContext: CompletionContext = {\n ...args.state.context,\n prefix: selectedSuggestion.value,\n endPos: nextEndPos,\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 { priority: KEYPRESS_PRIORITY.COMPLETION },\n )\n\n useKeypress(\n (_inputChar, key) => {\n if (!args.isEnabled) return false\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 // Don't consume: allow the input field to process the deletion.\n return false\n }\n }\n return false\n },\n { priority: KEYPRESS_PRIORITY.COMPLETION },\n )\n}\n", "import { useCallback, useEffect, useMemo, useRef, useState } from 'react'\n\ntype UndoEntry<TExtra> = {\n signature: string\n text: string\n cursorOffset: number\n extra: TExtra\n timestamp: number\n}\n\ntype UndoBufferState<TExtra> = {\n entries: UndoEntry<TExtra>[]\n cursor: number\n}\n\nexport function useUndoBuffer<TExtra>(args: {\n maxBufferSize: number\n debounceMs: number\n}) {\n const { maxBufferSize, debounceMs } = args\n\n const [state, setState] = useState<UndoBufferState<TExtra>>({\n entries: [],\n cursor: -1,\n })\n const stateRef = useRef(state)\n useEffect(() => {\n stateRef.current = state\n }, [state])\n\n const pendingRef = useRef<Omit<UndoEntry<TExtra>, 'timestamp'> | null>(null)\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const lastPushAtRef = useRef(0)\n\n const flushPending = useCallback(() => {\n const pending = pendingRef.current\n if (!pending) return\n\n const timestamp = Date.now()\n lastPushAtRef.current = timestamp\n pendingRef.current = null\n\n setState(prev => {\n const base =\n prev.cursor >= 0 ? prev.entries.slice(0, prev.cursor + 1) : prev.entries\n\n const last = base[base.length - 1]\n if (last && last.signature === pending.signature) {\n return { ...prev, cursor: base.length - 1, entries: base }\n }\n\n const next = [...base, { ...pending, timestamp }]\n const clipped =\n next.length > maxBufferSize ? next.slice(-maxBufferSize) : next\n return { entries: clipped, cursor: clipped.length - 1 }\n })\n }, [maxBufferSize])\n\n const pushToBuffer = useCallback(\n (entry: Omit<UndoEntry<TExtra>, 'timestamp'>) => {\n pendingRef.current = entry\n\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n timeoutRef.current = null\n }\n\n const now = Date.now()\n if (now - lastPushAtRef.current < debounceMs) {\n timeoutRef.current = setTimeout(() => {\n timeoutRef.current = null\n flushPending()\n }, debounceMs)\n return\n }\n\n flushPending()\n },\n [debounceMs, flushPending],\n )\n\n const undo = useCallback((): UndoEntry<TExtra> | null => {\n const current = stateRef.current\n if (current.cursor <= 0 || current.entries.length === 0) return null\n\n const nextCursor = current.cursor - 1\n const snapshot = current.entries[nextCursor] ?? null\n setState({ ...current, cursor: nextCursor })\n return snapshot\n }, [])\n\n const clearBuffer = useCallback(() => {\n pendingRef.current = null\n lastPushAtRef.current = 0\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n timeoutRef.current = null\n }\n setState({ entries: [], cursor: -1 })\n }, [])\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n timeoutRef.current = null\n }\n }\n }, [])\n\n const canUndo = useMemo(\n () => state.cursor > 0 && state.entries.length > 1,\n [state.cursor, state.entries.length],\n )\n\n return {\n pushToBuffer,\n undo,\n canUndo,\n clearBuffer,\n }\n}\n", "import type { Key } from '#ui-ink/hooks/useKeypress'\nimport type { InputShortcut } from './permissionModeCycleShortcut'\n\ntype KeyWithOption = Key & { option?: boolean }\n\nexport type PromptInputSpecialKeyAction =\n | 'modeCycle'\n | 'modelSwitch'\n | 'externalEditor'\n | 'bashModeToggle'\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 args.inputChar === '\u03BC' ||\n (optionOrMeta && (args.inputChar === 'm' || args.inputChar === 'M')) ||\n (args.key.ctrl && (args.inputChar === 'm' || args.inputChar === 'M'))\n ) {\n return 'modelSwitch'\n }\n\n if (\n args.inputChar === '\\x07' ||\n args.inputChar === '\u00A9' ||\n (args.key.ctrl && (args.inputChar === 'g' || args.inputChar === 'G')) ||\n (optionOrMeta && (args.inputChar === 'g' || args.inputChar === 'G'))\n ) {\n return 'externalEditor'\n }\n\n if (\n args.inputChar === '\\x02' ||\n args.inputChar === '\u222B' ||\n (args.key.ctrl && (args.inputChar === 'b' || args.inputChar === 'B')) ||\n (optionOrMeta && (args.inputChar === 'b' || args.inputChar === 'B'))\n ) {\n return 'bashModeToggle'\n }\n\n return null\n}\n\nexport function __getPromptInputSpecialKeyActionForTests(\n args: Parameters<typeof getPromptInputSpecialKeyAction>[0],\n): PromptInputSpecialKeyAction {\n return getPromptInputSpecialKeyAction(args)\n}\n", "export type ContextWindowUsage = {\n input_tokens: number\n output_tokens?: number\n cache_creation_input_tokens?: number\n cache_read_input_tokens?: number\n}\n\nexport function computeContextWindowPercentages(args: {\n currentUsage: ContextWindowUsage | null | undefined\n contextWindowSize: number | null | undefined\n}): {\n used_percentage: number | null\n remaining_percentage: number | null\n} {\n const currentUsage = args.currentUsage ?? null\n const contextWindowSize = args.contextWindowSize ?? null\n\n if (!currentUsage || !contextWindowSize || contextWindowSize <= 0) {\n return { used_percentage: null, remaining_percentage: null }\n }\n\n const usedTokens =\n currentUsage.input_tokens +\n (currentUsage.cache_creation_input_tokens ?? 0) +\n (currentUsage.cache_read_input_tokens ?? 0)\n\n const raw = Math.round((usedTokens / contextWindowSize) * 100)\n const used = Math.min(100, Math.max(0, raw))\n return { used_percentage: used, remaining_percentage: 100 - used }\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 { getCommand, 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 { getCwd } from '#core/utils/state'\nimport chalk from 'chalk'\nimport * as React from 'react'\nimport { UserBashInputMessage } from '#ui-ink/components/messages/UserBashInputMessage'\nimport { UserBackgroundTaskInputMessage } from '#ui-ink/components/messages/UserBackgroundTaskInputMessage'\nimport { BashSpinner } 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 { switchCwdForResume } from '#cli-utils/switchCwdForResume'\nimport { getMessagesForSlashCommand } from './slashCommands'\nimport {\n coerceImageMediaType,\n extractAssistantText,\n} from './processUserInputHelpers'\nimport type { SetForkConvoWithMessagesOnTheNextRender } from '#ui-ink/types/conversationReset'\n\nexport async function processUserInput(\n input: string,\n mode: 'bash' | 'background' | 'prompt' | 'koding',\n setToolJSX: SetToolJSXFn<React.ReactNode>,\n context: ToolUseContext & {\n setForkConvoWithMessagesOnTheNextRender: SetForkConvoWithMessagesOnTheNextRender\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 const inputTrimmedStart = input.trimStart()\n\n // Bash commands\n if (mode === 'bash' || mode === 'background') {\n const tagName =\n mode === 'background' ? 'background-task-input' : 'bash-input'\n const userMessage = createUserMessage(`<${tagName}>${input}</${tagName}>`)\n\n // Special case: cd\n if (mode === 'bash' && input.startsWith('cd ')) {\n const newCwd = resolve(getCwd(), input.slice(3).trim())\n try {\n await switchCwdForResume(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 {mode === 'background' ? (\n <UserBackgroundTaskInputMessage\n addMargin={false}\n param={{\n text: `<background-task-input>${input}</background-task-input>`,\n type: 'text',\n }}\n />\n ) : (\n <UserBashInputMessage\n addMargin={false}\n param={{\n text: `<bash-input>${input}</bash-input>`,\n type: 'text',\n }}\n />\n )}\n <BashSpinner />\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(\n mode === 'background'\n ? { command: input, run_in_background: true }\n : { command: input },\n bashContext,\n ),\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, resultForAssistant } = lastChunk\n\n if (mode === 'background') {\n const content = resultForAssistant || 'Background task started.'\n return [\n userMessage,\n createAssistantMessage(\n `<background-task-output>${content}</background-task-output>`,\n ),\n ]\n }\n\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 (\n context.options?.disableSlashCommands !== true &&\n inputTrimmedStart.startsWith('/')\n ) {\n const words = inputTrimmedStart.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 // Slash commands can carry per-command `allowedTools` constraints. These must be\n // merged into the same permission engine as persisted rules, and inherited by\n // any forked sub-agent context spawned by the command.\n try {\n const cmd = getCommand(commandName, context.options.commands)\n const allowedTools = Array.isArray(cmd.allowedTools)\n ? cmd.allowedTools\n : []\n if (allowedTools.length > 0) {\n const prev = Array.isArray(context.options?.commandAllowedTools)\n ? context.options.commandAllowedTools\n : []\n context.options = {\n ...(context.options ?? {}),\n commandAllowedTools: [...new Set([...prev, ...allowedTools])],\n }\n }\n } catch (error) {\n logError(error)\n }\n\n const args = inputTrimmedStart.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 } 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 const theme = getTheme()\n return (\n <Box flexDirection=\"column\" marginTop={addMargin ? 1 : 0} width=\"100%\">\n <Box>\n <Text color={theme.bashBorder} bold>$</Text>\n <Text bold> {input}</Text>\n </Box>\n </Box>\n )\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 UserBackgroundTaskInputMessage({\n param: { text },\n addMargin,\n}: Props): React.ReactNode {\n const input = extractTag(text, 'background-task-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}>&amp;</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'\nimport type { SetForkConvoWithMessagesOnTheNextRender } from '#ui-ink/types/conversationReset'\n\nexport async function getMessagesForSlashCommand(\n commandName: string,\n args: string,\n setToolJSX: SetToolJSXFn<React.ReactNode>,\n context: ToolUseContext & {\n setForkConvoWithMessagesOnTheNextRender: SetForkConvoWithMessagesOnTheNextRender\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 let didMountJsx = false\n command\n .call(\n r => {\n setToolJSX(null)\n\n // Interactive local JSX commands (fullscreen overlays, selectors, etc.)\n // should not pollute the transcript with command meta messages unless\n // they explicitly return output.\n if (didMountJsx) {\n if (!r || r === NO_RESPONSE_REQUESTED) {\n resolveMessages([])\n return\n }\n resolveMessages([createAssistantMessage(r)])\n return\n }\n\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 didMountJsx = true\n setToolJSX({\n jsx,\n shouldHidePromptInput: true,\n displayMode: command.ui?.displayMode ?? 'inline',\n })\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 const baseOptions = context.options ?? {}\n // Use the context's abortController for local commands\n const result = await command.call(args, {\n ...context,\n options: {\n ...baseOptions,\n commands: baseOptions.commands ?? [],\n tools: baseOptions.tools ?? [],\n slowAndCapableModel: baseOptions.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\nfunction extractPastedTextId(placeholder: string): number | null {\n const match = placeholder.match(/\\[Pasted text #(\\d+)(?: \\+\\d+ lines)?\\]/)\n if (!match?.[1]) return null\n const id = Number(match[1])\n if (!Number.isFinite(id) || id <= 0) return null\n return id\n}\n\nfunction extractImageId(placeholder: string): number | null {\n const match = placeholder.match(/\\[Image #(\\d+)\\]/)\n if (!match?.[1]) return null\n const id = Number(match[1])\n if (!Number.isFinite(id) || id <= 0) return null\n return id\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, setPastedTextsState] = useState<PastedTextSegment[]>([])\n const [pastedImages, setPastedImagesState] = useState<\n PastedImageAttachment[]\n >([])\n const pastedTextCounter = useRef(1)\n const pastedImageCounter = useRef(1)\n\n const setPastedTexts = useCallback(\n (\n next:\n | PastedTextSegment[]\n | ((prev: PastedTextSegment[]) => PastedTextSegment[]),\n ) => {\n setPastedTextsState(prev => {\n const resolved = typeof next === 'function' ? next(prev) : next\n\n let maxId = 0\n for (const segment of resolved) {\n const id = extractPastedTextId(segment.placeholder)\n if (id && id > maxId) maxId = id\n }\n if (maxId >= pastedTextCounter.current) {\n pastedTextCounter.current = maxId + 1\n }\n\n return resolved\n })\n },\n [],\n )\n\n const setPastedImages = useCallback(\n (\n next:\n | PastedImageAttachment[]\n | ((prev: PastedImageAttachment[]) => PastedImageAttachment[]),\n ) => {\n setPastedImagesState(prev => {\n const resolved = typeof next === 'function' ? next(prev) : next\n\n let maxId = 0\n for (const segment of resolved) {\n const id = extractImageId(segment.placeholder)\n if (id && id > maxId) maxId = id\n }\n if (maxId >= pastedImageCounter.current) {\n pastedImageCounter.current = maxId + 1\n }\n\n return resolved\n })\n },\n [],\n )\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'\nimport type { SetForkConvoWithMessagesOnTheNextRender } from '#ui-ink/types/conversationReset'\n\nconst EXIT_COMMANDS = new Set(['exit', 'quit', ':q', ':q!', ':wq', ':wq!'])\n\nfunction extractPasteId(placeholder: string): number | null {\n const match = placeholder.match(\n /\\[(Pasted text|Image|\\.\\.\\.Truncated text) #(\\d+)(?: \\+\\d+ lines)?(\\.)*\\]/,\n )\n if (!match?.[2]) return null\n if (match[1] !== 'Pasted text') return null\n const id = Number(match[2])\n if (!Number.isFinite(id) || id <= 0) return null\n return id\n}\n\nfunction buildHistoryPastedContents(\n pastedTexts: PastedTextSegment[],\n): Record<number, { id: number; type: 'text'; content: string }> {\n const out: Record<number, { id: number; type: 'text'; content: string }> = {}\n for (const pasted of pastedTexts) {\n const id = extractPasteId(pasted.placeholder)\n if (!id) continue\n out[id] = { id, type: 'text', content: pasted.text }\n }\n return out\n}\n\nfunction addPromptToHistory(args: {\n display: string\n pastedTexts: PastedTextSegment[]\n}): void {\n const pastedContents = buildHistoryPastedContents(args.pastedTexts)\n if (Object.keys(pastedContents).length > 0) {\n addToHistory({ display: args.display, pastedContents })\n return\n }\n addToHistory(args.display)\n}\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: SetForkConvoWithMessagesOnTheNextRender\n onShowMessageSelector?: () => 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 addPromptToHistory({\n display: args.mode === 'koding' ? `#${args.input}` : args.input,\n pastedTexts: args.pastedTexts,\n })\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' && effectiveMode !== 'background') {\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 openMessageSelector: args.onShowMessageSelector,\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 addPromptToHistory({ display: args.input, pastedTexts: args.pastedTexts })\n args.resetHistory()\n args.setIsLoading(false)\n return\n }\n\n const shouldUpdatePwdAfterBash =\n effectiveMode === 'bash' || effectiveMode === 'background'\n\n // Save prompt to history immediately after we successfully construct the user messages.\n // This ensures history is preserved even if the query is aborted (e.g. Escape) or errors mid-flight.\n const inputToAdd =\n effectiveMode === 'bash'\n ? `!${args.input}`\n : effectiveMode === 'background'\n ? `&${args.input}`\n : args.input\n\n if (newMessages.some(message => message.type === 'user')) {\n addPromptToHistory({ display: inputToAdd, pastedTexts: args.pastedTexts })\n args.resetHistory()\n }\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", "import type { ReactNode } from 'react'\nimport type { Command } from '#cli-commands'\nimport type { Message } from '#core/query'\nimport type { SetToolJSXFn } from '#core/tooling/Tool'\nimport type { Tool } from '#core/tooling/Tool'\nimport type { SetForkConvoWithMessagesOnTheNextRender } from '#ui-ink/types/conversationReset'\n\nexport type PromptMode = 'bash' | 'background' | 'prompt' | 'koding'\n\nexport function toggleBashMode(current: PromptMode): PromptMode {\n return current === 'bash' ? 'prompt' : 'bash'\n}\n\nexport type PromptInputProps = {\n commands: Command[]\n forkNumber: number\n messageLogName: string\n initialPrompt?: string\n disableSlashCommands?: boolean\n isDisabled: boolean\n isLoading: boolean\n onQuery: (\n newMessages: Message[],\n abortController?: AbortController,\n ) => Promise<void>\n debug: boolean\n verbose: boolean\n messages: Message[]\n setToolJSX: SetToolJSXFn<ReactNode>\n tools: Tool[]\n input: string\n onInputChange: (value: string) => void\n mode: PromptMode\n onModeChange: (mode: PromptMode) => void\n submitCount: number\n onSubmitCountChange: (updater: (prev: number) => number) => void\n setIsLoading: (isLoading: boolean) => void\n setAbortController: (abortController: AbortController | null) => void\n onShowMessageSelector: () => void\n setForkConvoWithMessagesOnTheNextRender: SetForkConvoWithMessagesOnTheNextRender\n readFileTimestamps: { [filename: string]: number }\n abortController: AbortController | null\n onModelChange?: () => void\n uiRefreshCounter?: number\n onManageTasks?: () => void\n shortcutsOpen?: boolean\n restorePastes?: {\n id: number\n pastedTexts: Array<{ placeholder: string; text: string }>\n pastedImages: Array<{\n placeholder: string\n data: string\n mediaType: string\n }>\n }\n onRestorePastesApplied?: (id: number) => void\n draftPastes?: {\n pastedTexts: Array<{ placeholder: string; text: string }>\n pastedImages: Array<{\n placeholder: string\n data: string\n mediaType: string\n }>\n }\n onDraftPastesChange?: (next: {\n pastedTexts: Array<{ placeholder: string; text: string }>\n pastedImages: Array<{\n placeholder: string\n data: string\n mediaType: string\n }>\n }) => void\n}\n", "import { Box, Text } 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 { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\nimport type { Key } from '#ui-ink/hooks/useKeypress'\nimport type { PermissionMode } from '#core/types/PermissionMode'\nimport type { Theme } from '#core/utils/theme'\nimport type { PromptMode } from './types'\nimport { PromptInputCompletionPanel } from './PromptInputCompletionPanel'\nimport { PendingPrompts } from './PendingPrompts'\nimport { QueuedPrompts } from './QueuedPrompts'\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 }\ntype ToastMessageState = {\n show: boolean\n text?: string\n kind?: 'info' | 'success' | 'warning' | 'error'\n}\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 pendingPrompts,\n queuedPrompts,\n completionActive,\n historyIndex,\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 clearInputPending,\n rewindPending,\n modelSwitchMessage,\n toastMessage,\n statusLine,\n statusLinePadding,\n currentMode,\n modeCycleShortcutText,\n showQuickModelSwitchShortcut,\n tokenUsage,\n textInputColumns,\n textInputMaxHeight,\n completionReservedRows,\n isInFastBrowseMode,\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 pendingPrompts: string[]\n queuedPrompts: string[]\n completionActive: boolean\n historyIndex: number\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 clearInputPending: boolean\n rewindPending: boolean\n modelSwitchMessage: InlineMessageState\n toastMessage: ToastMessageState\n statusLine: string | null\n statusLinePadding: number\n currentMode: PermissionMode\n modeCycleShortcutText: string\n showQuickModelSwitchShortcut: boolean\n tokenUsage: number\n textInputColumns: number\n textInputMaxHeight: number\n completionReservedRows: number\n isInFastBrowseMode: () => boolean\n}): React.ReactNode {\n const { rows, columns } = useTerminalSize()\n const compact = rows < 16\n const showStatusLine = rows > 8\n\n return (\n <Box flexDirection=\"column\">\n {/* Model info - top right of input */}\n {modelInfo && !compact && (\n <Box justifyContent=\"flex-end\" flexDirection=\"row\">\n <Text dimColor wrap=\"truncate-end\">\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 {pendingPrompts.length > 0 && (\n <PendingPrompts pendingPrompts={pendingPrompts} width={columns} />\n )}\n\n {queuedPrompts.length > 0 && (\n <QueuedPrompts queuedPrompts={queuedPrompts} width={columns} />\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' || mode === 'background'\n ? theme.bashBorder\n : mode === 'koding'\n ? theme.notingBorder\n : theme.inputBorder\n }\n borderDimColor={false}\n borderStyle=\"single\"\n width=\"100%\"\n >\n <Box\n alignItems=\"flex-start\"\n alignSelf=\"flex-start\"\n flexWrap=\"nowrap\"\n justifyContent=\"flex-start\"\n width={2}\n >\n {mode === 'bash' ? (\n <Text color={theme.bashBorder}>$&nbsp;</Text>\n ) : mode === 'background' ? (\n <Text color={theme.bashBorder}>&amp;&nbsp;</Text>\n ) : mode === 'koding' ? (\n <Text color={theme.noting}>#&nbsp;</Text>\n ) : (\n <Text color={isLoading ? theme.secondaryText : undefined}>\n {'\\u276F'}&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 maxHeight={textInputMaxHeight}\n isDimmed={isDisabled || isLoading || isEditingExternally}\n disableCursorMovementForUpDownKeys={() =>\n completionActive ||\n historyIndex > 0 ||\n !input.includes('\\n') ||\n isInFastBrowseMode()\n }\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 {!compact && (\n <Box flexDirection=\"row\" paddingX={1}>\n <Text dimColor wrap=\"truncate-end\">\n {currentPwd}\n </Text>\n </Box>\n )}\n\n {/* Status line - below PWD */}\n {!completionActive && suggestions.length === 0 && showStatusLine && (\n <Box flexDirection=\"column\">\n <Box\n flexDirection=\"row\"\n justifyContent=\"space-between\"\n paddingX={1 + Math.max(0, statusLinePadding)}\n >\n <Box justifyContent=\"flex-start\" gap={1}>\n {exitMessage.show ? (\n <Text dimColor wrap=\"truncate-end\">\n Press {exitMessage.key} again to exit\n </Text>\n ) : message.show ? (\n <Text dimColor wrap=\"truncate-end\">\n {message.text}\n </Text>\n ) : rewindPending ? (\n <Text dimColor wrap=\"truncate-end\">\n Press Escape again to rewind\n </Text>\n ) : clearInputPending ? (\n <Text dimColor wrap=\"truncate-end\">\n Press Escape again to clear input\n </Text>\n ) : modelSwitchMessage.show ? (\n <Text color={theme.success} wrap=\"truncate-end\">\n {modelSwitchMessage.text}\n </Text>\n ) : toastMessage.show ? (\n <Text\n color={\n toastMessage.kind === 'error'\n ? theme.error\n : toastMessage.kind === 'warning'\n ? theme.warning\n : toastMessage.kind === 'success'\n ? theme.success\n : theme.secondaryText\n }\n wrap=\"truncate-end\"\n >\n {toastMessage.text}\n </Text>\n ) : statusLine ? (\n <Text dimColor wrap=\"truncate-end\">\n {statusLine}\n </Text>\n ) : null}\n </Box>\n {!compact && (\n <SentryErrorBoundary\n children={\n <Box justifyContent=\"flex-end\" gap={1}>\n <TokenWarning tokenUsage={tokenUsage} />\n </Box>\n }\n />\n )}\n </Box>\n {!compact && mode === 'prompt' && currentMode !== 'default' && (\n <Box paddingX={1}>\n <CompactModeIndicator />\n </Box>\n )}\n </Box>\n )}\n\n {completionActive && suggestions.length > 0 && (\n <PromptInputCompletionPanel\n theme={theme}\n suggestions={suggestions}\n selectedIndex={selectedIndex}\n emptyDirMessage={emptyDirMessage}\n tokenUsage={tokenUsage}\n reservedRows={completionReservedRows}\n />\n )}\n </Box>\n )\n}\n", "import React from 'react'\nimport { Box, Text } from 'ink'\nimport { usePermissionContext } from '#ui-ink/contexts/PermissionContext'\nimport { getTheme, type Theme } from '#core/utils/theme'\nimport { getPermissionModeCycleShortcut } from '#ui-ink/utils/permissionModeCycleShortcut'\nimport type { PermissionMode } from '#core/types/PermissionMode'\nimport { normalizePermissionMode } 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 const normalized = normalizePermissionMode(currentMode)\n\n const indicator = __getModeIndicatorDisplayForTests({\n mode: normalized,\n shortcutDisplayText: shortcut.displayText,\n theme,\n })\n\n if (!indicator.shouldRender && !showTransitionCount) {\n return null\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 const normalized = normalizePermissionMode(args.mode)\n\n const icon = getModeIndicatorIcon(normalized)\n const label = getModeIndicatorLabel(normalized).toLowerCase()\n const color = getModeIndicatorColor(args.theme, normalized)\n\n return {\n shouldRender: true,\n color,\n mainText: icon ? `${icon} ${label} mode` : `${label} mode`,\n shortcutHintText: ` (${args.shortcutDisplayText} to cycle)`,\n }\n}\n\nfunction getModeIndicatorLabel(mode: PermissionMode): string {\n switch (normalizePermissionMode(mode)) {\n case 'yolo':\n return 'YOLO'\n case 'cautious':\n return 'Ask'\n case 'plan':\n return 'Plan'\n case 'acceptEdits':\n return 'Accept Edits'\n case 'bypassPermissions':\n return 'Bypass'\n case 'dontAsk':\n return \"Don't Ask\"\n default:\n return 'Unknown'\n }\n}\n\nfunction getModeIndicatorIcon(mode: PermissionMode): string {\n switch (normalizePermissionMode(mode)) {\n case 'yolo':\n return ''\n case 'cautious':\n return '??'\n case 'plan':\n return '||'\n case 'acceptEdits':\n return '>>'\n case 'bypassPermissions':\n return '\uD83D\uDE80'\n case 'dontAsk':\n return 'X'\n default:\n return ''\n }\n}\n\nfunction getModeIndicatorColor(theme: Theme, mode: PermissionMode): string {\n switch (normalizePermissionMode(mode)) {\n case 'yolo':\n return theme.secondaryText\n case 'cautious':\n return theme.warning\n case 'plan':\n return theme.success\n case 'acceptEdits':\n return theme.autoAccept\n case 'bypassPermissions':\n case 'dontAsk':\n return theme.error\n default:\n return theme.secondaryText\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 const normalized = normalizePermissionMode(currentMode)\n\n const indicator = __getModeIndicatorDisplayForTests({\n mode: normalized,\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} wrap=\"truncate-end\">\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'\nimport { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\nimport wrapAnsi from 'wrap-ansi'\n\ntype Suggestion = {\n type: string\n value: string\n displayValue: string\n description?: string\n metadata?: { color?: string }\n}\n\nconst MAX_COMPLETION_PANEL_ROWS = 10\n\n// \u4F7F\u7528 React.memo \u4F18\u5316\u5EFA\u8BAE\u5217\u8868\u6E32\u67D3\nconst SuggestionItem = React.memo(\n ({\n suggestion,\n isSelected,\n theme,\n }: {\n suggestion: Suggestion\n isSelected: boolean\n theme: Theme\n }) => {\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 flexDirection=\"row\">\n <Text\n bold\n color={displayColor}\n dimColor={!isSelected && !displayColor}\n wrap=\"truncate-end\"\n >\n {isSelected ? '> ' : ' '}\n {suggestion.displayValue}\n </Text>\n </Box>\n )\n },\n (prevProps, nextProps) => {\n // \u53EA\u5728\u9009\u4E2D\u72B6\u6001\u6216\u5EFA\u8BAE\u5185\u5BB9\u6539\u53D8\u65F6\u91CD\u65B0\u6E32\u67D3\n return (\n prevProps.isSelected === nextProps.isSelected &&\n prevProps.suggestion.value === nextProps.suggestion.value &&\n prevProps.suggestion.displayValue === nextProps.suggestion.displayValue\n )\n },\n)\n\nSuggestionItem.displayName = 'SuggestionItem'\n\n// \u4F7F\u7528 React.memo \u4F18\u5316\u5E2E\u52A9\u6587\u672C\u7EC4\u4EF6\nconst HelpText = React.memo(\n ({\n emptyDirMessage,\n selectedSuggestion,\n maxWidth,\n }: {\n emptyDirMessage: string\n selectedSuggestion?: Suggestion\n maxWidth: number\n }) => {\n const getHelpMessage = () => {\n if (emptyDirMessage) return emptyDirMessage\n if (!selectedSuggestion) {\n return '\u2191\u2193 navigate \u2022 \u2192 accept \u2022 Tab cycle \u2022 Esc close'\n }\n if (selectedSuggestion.value.endsWith('/')) {\n return '\u2192 enter directory \u2022 \u2191\u2193 navigate \u2022 Tab cycle \u2022 Esc close'\n }\n if (selectedSuggestion.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\n const commandDescription =\n !emptyDirMessage &&\n selectedSuggestion?.type === 'command' &&\n typeof selectedSuggestion.description === 'string'\n ? selectedSuggestion.description.trim()\n : ''\n\n if (commandDescription) {\n const wrapped = wrapAnsi(commandDescription, Math.max(1, maxWidth), {\n hard: true,\n trim: false,\n })\n const lines = wrapped.split('\\n')\n\n // Keep help text to a single terminal row to avoid layout jumps/flicker\n // when the completion panel is shown on small terminals.\n const firstLine = (lines[0] ?? '').replace(/\\s+$/g, '')\n const limited =\n lines.length > 1 && firstLine.length > 0 ? `${firstLine}\u2026` : firstLine\n return (\n <Text dimColor wrap=\"truncate-end\">\n {limited}\n </Text>\n )\n }\n\n return (\n <Text\n dimColor={!emptyDirMessage}\n color={emptyDirMessage ? 'yellow' : undefined}\n wrap=\"truncate-end\"\n >\n {getHelpMessage()}\n </Text>\n )\n },\n (prevProps, nextProps) => {\n return (\n prevProps.emptyDirMessage === nextProps.emptyDirMessage &&\n prevProps.selectedSuggestion?.value ===\n nextProps.selectedSuggestion?.value &&\n prevProps.selectedSuggestion?.description ===\n nextProps.selectedSuggestion?.description &&\n prevProps.maxWidth === nextProps.maxWidth\n )\n },\n)\n\nHelpText.displayName = 'HelpText'\n\nexport function __getSuggestionWindowForTests(args: {\n rows: number\n selectedIndex: number\n suggestionCount: number\n reservedRows?: number\n}) {\n const reservedRows = Math.max(1, args.reservedRows ?? 10)\n const panelRows = Math.min(\n MAX_COMPLETION_PANEL_ROWS,\n Math.max(1, args.rows - reservedRows),\n )\n const showHelp = panelRows >= 4\n const helpRows = showHelp ? 1 : 0\n const listRows = Math.max(1, panelRows - helpRows)\n\n const suggestionCount = Math.max(0, args.suggestionCount)\n const selectedIndex = Math.max(\n 0,\n Math.min(args.selectedIndex, Math.max(0, suggestionCount - 1)),\n )\n\n if (suggestionCount === 0) {\n return {\n startIndex: 0,\n endIndex: 0,\n hiddenAbove: 0,\n hiddenBelow: 0,\n showHelp,\n showTopEllipsis: false,\n showBottomEllipsis: false,\n }\n }\n\n const canShowEllipsis = listRows >= 3\n let showTopEllipsis = canShowEllipsis\n let showBottomEllipsis = canShowEllipsis\n\n let startIndex = 0\n let endIndex = 0\n let hiddenAbove = 0\n let hiddenBelow = 0\n\n for (let i = 0; i < 3; i += 1) {\n const ellipsisRows =\n (showTopEllipsis ? 1 : 0) + (showBottomEllipsis ? 1 : 0)\n const visibleCount = Math.max(\n 1,\n Math.min(suggestionCount, listRows - ellipsisRows),\n )\n\n startIndex = Math.max(\n 0,\n Math.min(\n selectedIndex - Math.floor(visibleCount / 2),\n suggestionCount - visibleCount,\n ),\n )\n endIndex = startIndex + visibleCount\n hiddenAbove = startIndex\n hiddenBelow = Math.max(0, suggestionCount - endIndex)\n\n const nextShowTop = canShowEllipsis && hiddenAbove > 0\n const nextShowBottom = canShowEllipsis && hiddenBelow > 0\n\n if (\n nextShowTop === showTopEllipsis &&\n nextShowBottom === showBottomEllipsis\n ) {\n break\n }\n showTopEllipsis = nextShowTop\n showBottomEllipsis = nextShowBottom\n }\n\n return {\n startIndex,\n endIndex,\n hiddenAbove,\n hiddenBelow,\n showHelp,\n showTopEllipsis,\n showBottomEllipsis,\n }\n}\n\nexport const PromptInputCompletionPanel = React.memo(\n function PromptInputCompletionPanel({\n theme,\n suggestions,\n selectedIndex,\n emptyDirMessage,\n tokenUsage,\n reservedRows = 10,\n }: {\n theme: Theme\n suggestions: Suggestion[]\n selectedIndex: number\n emptyDirMessage: string\n tokenUsage: number\n reservedRows?: number\n }): React.ReactNode {\n const { rows, columns } = useTerminalSize()\n const helpWidth = Math.max(1, columns - 6)\n const window = __getSuggestionWindowForTests({\n rows,\n selectedIndex,\n suggestionCount: suggestions.length,\n reservedRows,\n })\n const visibleSuggestions = suggestions.slice(\n window.startIndex,\n window.endIndex,\n )\n\n const selectedSuggestion = suggestions[selectedIndex]\n\n return (\n <Box flexDirection=\"row\" justifyContent=\"space-between\" paddingX={2}>\n <Box flexDirection=\"column\">\n {window.showTopEllipsis && window.hiddenAbove > 0 && (\n <Text\n dimColor\n wrap=\"truncate-end\"\n >{`... ${window.hiddenAbove} more above ...`}</Text>\n )}\n {visibleSuggestions.map((suggestion, index) => (\n <SuggestionItem\n key={`${suggestion.type}-${suggestion.value}-${window.startIndex + index}`}\n suggestion={suggestion}\n isSelected={window.startIndex + index === selectedIndex}\n theme={theme}\n />\n ))}\n {window.showBottomEllipsis && window.hiddenBelow > 0 && (\n <Text\n dimColor\n wrap=\"truncate-end\"\n >{`... ${window.hiddenBelow} more below ...`}</Text>\n )}\n {window.showHelp && (\n <HelpText\n emptyDirMessage={emptyDirMessage}\n selectedSuggestion={selectedSuggestion}\n maxWidth={helpWidth}\n />\n )}\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 (prevProps, nextProps) => {\n // \u53EA\u5728\u8FD9\u4E9B\u5173\u952E\u5C5E\u6027\u6539\u53D8\u65F6\u91CD\u65B0\u6E32\u67D3\u6574\u4E2A\u9762\u677F\uFF08\u4FDD\u8BC1\u6B63\u786E\u6027\uFF1A\u4E0D\u8981\u5BF9 suggestions \u505A\u4E0D\u5B89\u5168\u7684\u201C\u62BD\u6837\u6BD4\u8F83\u201D\uFF09\n return (\n prevProps.theme === nextProps.theme &&\n prevProps.selectedIndex === nextProps.selectedIndex &&\n prevProps.suggestions === nextProps.suggestions &&\n prevProps.emptyDirMessage === nextProps.emptyDirMessage &&\n prevProps.tokenUsage === nextProps.tokenUsage &&\n prevProps.reservedRows === nextProps.reservedRows\n )\n },\n)\n", "import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { useMemo } from 'react'\nimport { wrapLines } from '#ui-ink/primitives/text/wrapLines'\nimport { getCachedStringWidth } from '#cli-utils/textWidth'\n\nconst FIRST_LINE_PREFIX = ' \u203A '\nconst WRAPPED_LINE_PREFIX = ' '\nconst MORE_PENDING_PREFIX = ' \u2026 '\nconst ELLIPSIS_LINE = ' \u2026'\n\nexport function __getPendingPromptLinesForTests(args: {\n pendingPrompts: string[]\n width: number\n maxMessages?: number\n maxLinesPerMessage?: number\n}): string[] {\n const safeWidth = Math.max(1, args.width)\n const maxMessages = Math.max(1, args.maxMessages ?? 6)\n const maxLinesPerMessage = Math.max(1, args.maxLinesPerMessage ?? 3)\n if (safeWidth < 8) return []\n if (args.pendingPrompts.length === 0) return []\n\n const hiddenEarlierCount = Math.max(0, args.pendingPrompts.length - maxMessages)\n const visiblePrompts =\n hiddenEarlierCount > 0\n ? args.pendingPrompts.slice(-maxMessages)\n : args.pendingPrompts\n\n const prefixWidth = getCachedStringWidth(WRAPPED_LINE_PREFIX)\n const contentWidth = Math.max(1, safeWidth - prefixWidth)\n\n const lines: string[] = []\n\n if (hiddenEarlierCount > 0) {\n lines.push(`${MORE_PENDING_PREFIX}(+${hiddenEarlierCount} earlier)`)\n }\n\n for (const raw of visiblePrompts) {\n const message = raw.trim()\n if (!message) continue\n\n const wrapped = wrapLines(message.split('\\n'), contentWidth)\n const visible = wrapped.slice(0, maxLinesPerMessage)\n\n visible.forEach((line, index) => {\n lines.push(\n index === 0\n ? `${FIRST_LINE_PREFIX}${line}`\n : `${WRAPPED_LINE_PREFIX}${line}`,\n )\n })\n\n if (wrapped.length > maxLinesPerMessage) {\n lines.push(ELLIPSIS_LINE)\n }\n }\n\n return lines\n}\n\nexport function PendingPrompts({\n pendingPrompts,\n width,\n}: {\n pendingPrompts: string[]\n width: number\n}): React.ReactNode {\n const lines = useMemo(\n () => __getPendingPromptLinesForTests({ pendingPrompts, width }),\n [pendingPrompts, width],\n )\n\n if (lines.length === 0) return null\n\n return (\n <Box flexDirection=\"column\">\n {lines.map((line, index) => (\n <Text key={index} wrap=\"truncate-end\">\n {line}\n </Text>\n ))}\n </Box>\n )\n}\n\n", "import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { useMemo } from 'react'\nimport { wrapLines } from '#ui-ink/primitives/text/wrapLines'\nimport { getCachedStringWidth } from '#cli-utils/textWidth'\n\nconst FIRST_LINE_PREFIX = ' \u21B3 '\nconst WRAPPED_LINE_PREFIX = ' '\nconst MORE_QUEUED_PREFIX = ' \u2026 '\nconst ELLIPSIS_LINE = ' \u2026'\n\nexport function __getQueuedPromptLinesForTests(args: {\n queuedPrompts: string[]\n width: number\n maxMessages?: number\n maxLinesPerMessage?: number\n}): string[] {\n const safeWidth = Math.max(1, args.width)\n const maxMessages = Math.max(1, args.maxMessages ?? 8)\n const maxLinesPerMessage = Math.max(1, args.maxLinesPerMessage ?? 3)\n if (safeWidth < 8) return []\n if (args.queuedPrompts.length === 0) return []\n\n const hiddenEarlierCount = Math.max(0, args.queuedPrompts.length - maxMessages)\n const visiblePrompts =\n hiddenEarlierCount > 0\n ? args.queuedPrompts.slice(-maxMessages)\n : args.queuedPrompts\n\n const prefixWidth = getCachedStringWidth(WRAPPED_LINE_PREFIX)\n const contentWidth = Math.max(1, safeWidth - prefixWidth)\n\n const lines: string[] = []\n\n if (hiddenEarlierCount > 0) {\n lines.push(`${MORE_QUEUED_PREFIX}(+${hiddenEarlierCount} earlier)`)\n }\n\n for (const raw of visiblePrompts) {\n const message = raw.trim()\n if (!message) continue\n\n const wrapped = wrapLines(message.split('\\n'), contentWidth)\n const visible = wrapped.slice(0, maxLinesPerMessage)\n\n visible.forEach((line, index) => {\n lines.push(\n index === 0 ? `${FIRST_LINE_PREFIX}${line}` : `${WRAPPED_LINE_PREFIX}${line}`,\n )\n })\n\n if (wrapped.length > maxLinesPerMessage) {\n lines.push(ELLIPSIS_LINE)\n }\n }\n\n return lines\n}\n\nexport function QueuedPrompts({\n queuedPrompts,\n width,\n}: {\n queuedPrompts: string[]\n width: number\n}): React.ReactNode {\n const lines = useMemo(\n () => __getQueuedPromptLinesForTests({ queuedPrompts, width }),\n [queuedPrompts, width],\n )\n\n if (lines.length === 0) return null\n\n return (\n <Box flexDirection=\"column\">\n {lines.map((line, index) => (\n <Text key={index} dimColor italic wrap=\"truncate-end\">\n {line}\n </Text>\n ))}\n </Box>\n )\n}\n\n", "import { useCallback, useState } from 'react'\nimport { launchExternalEditor } from '#cli-utils/externalEditor'\nimport { terminalCapabilityManager } from '#ui-ink/utils/terminalCapabilityManager'\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 terminalCapabilityManager.enableSupportedModes()\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: switchResult.message || `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 = 'No models configured. Use /model to add models.'\n } else if (debugInfo.activeModels === 0) {\n errorMessage = `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 = `Only 1 active model out of ${debugInfo.totalModels} total models: ${allModelNames}. All configured models will be activated for switching.`\n } else {\n errorMessage = `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, 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 SPINNER_FRAMES = ['\u280B', '\u2819', '\u2839', '\u2838', '\u283C', '\u2834', '\u2826', '\u2827', '\u2807', '\u280F']\n\nfunction getLabel(status: RequestStatus): string {\n switch (status.kind) {\n case 'thinking':\n return 'Prefilling'\n case 'streaming':\n return 'Decoding'\n default:\n return ''\n }\n}\n\nfunction formatDuration(seconds: number): string {\n if (seconds < 60) {\n return `${seconds}s`\n }\n if (seconds < 3600) {\n const minutes = Math.floor(seconds / 60)\n const secs = seconds % 60\n return `${minutes}m ${secs}s`\n }\n const hours = Math.floor(seconds / 3600)\n const minutes = Math.floor((seconds % 3600) / 60)\n const secs = seconds % 60\n return `${hours}h ${minutes}m ${secs}s`\n}\n\nfunction formatTokens(tokens: number): string {\n if (tokens >= 1000) {\n return `${(tokens / 1000).toFixed(1)}k`\n }\n return tokens.toString()\n}\n\nfunction getTokenDisplay(status: RequestStatus): string {\n if (status.kind === 'thinking' && status.inputTokens) {\n return ` \u00B7 \u2191 ${formatTokens(status.inputTokens)}`\n }\n if (status.kind === 'streaming' && status.outputTokens !== undefined) {\n return ` \u00B7 \u2193 ${formatTokens(status.outputTokens)}`\n }\n return ''\n}\n\nexport function RequestStatusIndicator(): React.ReactNode {\n const frames = SPINNER_FRAMES\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>(Date.now())\n\n useEffect(() => {\n const initialStatus = getRequestStatus()\n if (initialStatus.kind !== 'idle') {\n requestStartTime.current = Date.now()\n }\n\n return subscribeRequestStatus(next => {\n setStatus(next)\n if (next.kind !== 'idle') {\n setElapsedTime(Math.floor((Date.now() - requestStartTime.current) / 1000))\n }\n if (next.kind === 'idle') {\n requestStartTime.current = Date.now()\n setElapsedTime(0)\n }\n })\n }, [])\n\n useEffect(() => {\n const timer = setInterval(() => {\n setFrame(f => (f + 1) % frames.length)\n }, 80)\n return () => clearInterval(timer)\n }, [frames.length])\n\n useEffect(() => {\n const timer = setInterval(() => {\n setElapsedTime(Math.floor((Date.now() - requestStartTime.current) / 1000))\n }, 1000)\n return () => clearInterval(timer)\n }, [])\n\n if (status.kind === 'tool' || status.kind === 'idle') {\n return null\n }\n\n return (\n <Box flexDirection=\"row\" marginTop={1}>\n <Text color={theme.kode} bold>\n {frames[frame]} {getLabel(status)}\n </Text>\n <Text color={theme.secondaryText}>\n {' '}:: {formatDuration(elapsedTime)} (Esc to interrupt)\n {getTokenDisplay(status)}\n </Text>\n </Box>\n )\n}\n", "import { Box, Text } from 'ink'\nimport React from 'react'\nimport { Select } from './CustomSelect/select'\nimport { getTheme } from '#core/utils/theme'\nimport Link from './Link'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\n\ninterface Props {\n onDone: () => void\n}\n\nexport function CostThresholdDialog({ onDone }: Props): React.ReactNode {\n const layout = useScreenLayout()\n\n // Handle Ctrl+C, Ctrl+D and Esc\n useKeypress((input, key) => {\n if ((key.ctrl && (input === 'c' || input === 'd')) || key.escape) {\n onDone()\n }\n })\n\n return (\n <Box marginTop={1} width=\"100%\">\n <ScreenFrame\n title=\"Usage cost notice\"\n paddingX={layout.paddingX}\n paddingY={layout.tightLayout ? 0 : layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Box flexDirection=\"column\">\n <Text bold>\n You&apos;ve spent $5 on AI model API calls this session.\n </Text>\n <Text dimColor>\n Learn more about monitoring your AI usage costs:\n </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 <Text dimColor wrap=\"truncate-end\">\n Esc to close\n </Text>\n </Box>\n </ScreenFrame>\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({\n url,\n children,\n fallback = true,\n}: 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 } 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'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\nimport { Divider } from '#ui-ink/primitives/components/Divider'\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 { rows, columns } = useTerminalSize()\n const [focused, setFocus] = useState('no-preference')\n const [focusValue, setFocusValue] = useState<string | undefined>(undefined)\n const exitState = useExitOnCtrlCD(() => process.exit(1))\n\n // Keep a bottom margin to avoid terminal scroll/flicker when Ink re-renders near the last row.\n // Reserve 1 row for the exit/hint line rendered outside the bordered panel.\n const panelHeight = Math.max(1, rows - 2)\n\n useKeypress((_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={panelHeight}\n width=\"100%\"\n paddingX={1}\n >\n <Box width=\"100%\" justifyContent=\"space-between\">\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 <Divider width={Math.max(1, columns - 2)} />\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}>\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 isTransient?: boolean\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 isTransient,\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 isTransient={isTransient}\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 isTransient,\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 isTransient?: boolean\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 isTransient={isTransient}\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/contexts/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 return `pattern: \"${pattern}\"${absolutePath ? `, path: \"${absolutePath}\"` : ''}`\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 // Compatibility: 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>{fullFilePath}</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\nconst MAX_HUNKS_TO_RENDER = 4\nconst MAX_DIFF_LINES_TO_RENDER = 200\n\nfunction truncateHunks(hunks: Hunk[]): {\n hunks: Hunk[]\n hiddenHunks: number\n hiddenLines: number\n} {\n if (hunks.length === 0) {\n return { hunks: [], hiddenHunks: 0, hiddenLines: 0 }\n }\n\n let remainingLines = MAX_DIFF_LINES_TO_RENDER\n const kept: Hunk[] = []\n let hiddenLines = 0\n\n for (const hunk of hunks) {\n if (kept.length >= MAX_HUNKS_TO_RENDER) {\n hiddenLines += hunk.lines.length\n continue\n }\n\n if (remainingLines <= 0) {\n hiddenLines += hunk.lines.length\n continue\n }\n\n if (hunk.lines.length <= remainingLines) {\n kept.push(hunk)\n remainingLines -= hunk.lines.length\n continue\n }\n\n const visible = hunk.lines.slice(0, remainingLines)\n hiddenLines += hunk.lines.length - visible.length\n kept.push({\n ...hunk,\n lines: [...visible, `... (+${hiddenLines} more diff lines)`],\n })\n remainingLines = 0\n }\n\n const hiddenHunks = Math.max(0, hunks.length - kept.length)\n return { hunks: kept, hiddenHunks, hiddenLines }\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 const diff = React.useMemo(() => truncateHunks(patches), [patches])\n\n return (\n <Box flexDirection=\"column\">\n <Text>\n {' '}\u23BF Updated <Text bold>{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 {verbose &&\n diff.hunks.length > 0 &&\n intersperse(\n diff.hunks.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 {verbose && diff.hiddenLines > 0 && (\n <Box paddingLeft={5} marginTop={1}>\n <Text color={getTheme().secondaryText}>\n ... (+{diff.hiddenLines} more diff lines hidden)\n </Text>\n </Box>\n )}\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 { 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 // Compatibility: 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>{output.filePath}</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 { 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 { ToolResultBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { Box, Text } 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 if (!message.toolUseResult) {\n const contentText = typeof param.content === 'string' ? param.content : null\n return (\n <Box flexDirection=\"column\" width={width}>\n <Text dimColor wrap=\"truncate-end\">\n Tool output unavailable (missing persisted tool result data).\n </Text>\n {contentText ? <Text>{contentText}</Text> : null}\n </Box>\n )\n }\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 { 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 theme = getTheme()\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 const isError = erroredToolUseIDs.has(param.id)\n const isInProgress = inProgressToolUseIDs.has(param.id)\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 // Compatibility: 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\n // Determine colors based on state\n const toolNameColor = isQueued\n ? theme.secondaryText\n : isError\n ? theme.error\n : theme.kode\n const paramColor = theme.secondaryText\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 flexWrap=\"nowrap\">\n {shouldShowDot && (\n <ToolUseLoader\n shouldAnimate={shouldAnimate}\n isUnresolved={unresolvedToolUseIDs.has(param.id)}\n isError={isError}\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={!isQueued}\n children={String(userFacingToolName || '')}\n />\n ) : (\n hasToolName && (\n <Text color={toolNameColor} bold={!isQueued} wrap=\"truncate-end\">\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={paramColor}>(</Text>\n {toolMessage}\n <Text color={paramColor}>)</Text>\n </Box>\n )\n }\n\n if (typeof toolMessage !== 'string') return null\n\n if (!hasToolName) {\n return (\n <Text color={paramColor} wrap=\"truncate-end\">\n {toolMessage}\n </Text>\n )\n }\n\n // If it's a string, wrap it in Text with dimmed parameters\n return (\n <Text color={paramColor} wrap=\"truncate-end\">\n ({toolMessage})\n </Text>\n )\n })()}\n {isInProgress && (\n <Text color={paramColor} wrap=\"truncate-end\">\n ...\n </Text>\n )}\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 {\n CHECKMARK,\n CROSS,\n DIAMOND_HOLLOW,\n DIAMOND_FILLED,\n} from '#core/constants/figures'\n\nconst SPINNER_FRAMES = ['\u280B', '\u2819', '\u2839', '\u2838', '\u283C', '\u2834', '\u2826', '\u2827', '\u2807', '\u280F']\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 [frameIndex, setFrameIndex] = React.useState(0)\n\n useInterval(() => {\n if (!shouldAnimate) {\n return\n }\n setFrameIndex(i => (i + 1) % SPINNER_FRAMES.length)\n }, 80)\n\n const theme = getTheme()\n\n if (shouldAnimate) {\n return (\n <Box minWidth={2}>\n <Text color={theme.kode}>{SPINNER_FRAMES[frameIndex]} </Text>\n </Box>\n )\n }\n\n if (isError) {\n return (\n <Box minWidth={2}>\n <Text color={theme.error}>{CROSS} </Text>\n </Box>\n )\n }\n\n if (isUnresolved) {\n return (\n <Box minWidth={2}>\n <Text color={theme.secondaryText}>{DIAMOND_HOLLOW} </Text>\n </Box>\n )\n }\n\n return (\n <Box minWidth={2}>\n <Text color=\"green\">{CHECKMARK} </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, { useState, useEffect } 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\nconst PROGRESS_FRAMES = ['/', '-', '\\\\', '|']\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 const [progressFrame, setProgressFrame] = useState(0)\n const theme = getTheme()\n\n useEffect(() => {\n const timer = setInterval(() => {\n setProgressFrame(f => (f + 1) % PROGRESS_FRAMES.length)\n }, 150)\n return () => clearInterval(timer)\n }, [])\n\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={theme.kode} bold>\n {'\u25C6'} [Thinking {PROGRESS_FRAMES[progressFrame]}]\n </Text>\n <Box paddingLeft={2}>\n <Text color={theme.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 { AssistantBackgroundTaskOutputMessage } from './AssistantBackgroundTaskOutputMessage'\nimport { AssistantLocalCommandOutputMessage } from './AssistantLocalCommandOutputMessage'\nimport { getTheme } from '#core/utils/theme'\nimport { Box, Text } from 'ink'\nimport { Cost } from '#ui-ink/components/Cost'\nimport { MaxSizedText } from '#ui-ink/components/MaxSizedText'\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 { RECORD_CIRCLE } from '#core/constants/figures'\nimport { applyMarkdown } from '#core/utils/markdown'\nimport { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\nimport { useTransientViewport } from '#ui-ink/contexts/TransientViewportContext'\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 isTransient?: boolean\n}\n\nexport function AssistantTextMessage({\n param: { text },\n costUSD,\n durationMs,\n debug,\n addMargin,\n shouldShowDot,\n verbose,\n isTransient,\n}: Props): React.ReactNode {\n const { columns, rows } = useTerminalSize()\n const transientViewport = useTransientViewport()\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 // Compatibility: background bash completion notification.\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 // Compatibility: 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 // Compatibility: 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 const contentWidth = Math.max(1, columns - 6)\n const defaultTransientMaxHeight = Math.max(1, rows - 10)\n const viewportMaxHeight = transientViewport.maxHeight\n const maxHeight = isTransient\n ? Math.max(\n 1,\n Math.min(defaultTransientMaxHeight, viewportMaxHeight ?? Infinity),\n )\n : undefined\n\n // Show bash output\n if (text.startsWith('<bash-stdout') || text.startsWith('<bash-stderr')) {\n return (\n <AssistantBashOutputMessage\n content={text}\n verbose={verbose}\n maxHeight={maxHeight}\n maxWidth={contentWidth}\n />\n )\n }\n\n // Show background task output\n if (text.startsWith('<background-task-output')) {\n return <AssistantBackgroundTaskOutputMessage 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 (\n <AssistantLocalCommandOutputMessage\n content={text}\n maxHeight={maxHeight}\n maxWidth={contentWidth}\n />\n )\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 const content = applyMarkdown(text)\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().kode}>{RECORD_CIRCLE}</Text>\n </Box>\n )}\n <Box flexDirection=\"column\" width={contentWidth}>\n {maxHeight ? (\n <MaxSizedText\n text={content}\n maxWidth={contentWidth}\n maxHeight={maxHeight}\n overflowDirection=\"bottom\"\n />\n ) : (\n <Text>{content}</Text>\n )}\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 maxHeight,\n maxWidth,\n}: {\n content: string\n verbose?: boolean\n maxHeight?: number\n maxWidth?: number\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 maxHeight={maxHeight}\n maxWidth={maxWidth}\n />\n )\n}\n", "import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { extractTag } from '#core/utils/messages'\nimport { getTheme } from '#core/utils/theme'\n\nconst MAX_RENDERED_LINES = 5\n\nfunction renderTruncatedContent(\n lines: string[],\n maxLines: number = MAX_RENDERED_LINES,\n): { lines: string[]; truncated: boolean; hiddenCount: number } {\n if (lines.length <= maxLines) {\n return { lines, truncated: false, hiddenCount: 0 }\n }\n return {\n lines: lines.slice(-maxLines),\n truncated: true,\n hiddenCount: lines.length - maxLines,\n }\n}\n\nexport function AssistantBackgroundTaskOutputMessage({\n content,\n verbose = false,\n}: {\n content: string\n verbose?: boolean\n}): React.ReactNode {\n const message = extractTag(content, 'background-task-output')\n if (!message) {\n return null\n }\n\n const theme = getTheme()\n const allLines = message.split(/\\r?\\n/).filter(l => l.trim().length > 0)\n\n if (allLines.length === 0) {\n return null\n }\n\n const { lines, truncated, hiddenCount } = verbose\n ? { lines: allLines, truncated: false, hiddenCount: 0 }\n : renderTruncatedContent(allLines)\n\n return (\n <Box flexDirection=\"column\">\n {truncated && (\n <Box flexDirection=\"row\">\n <Text color={theme.secondaryText}>\n &nbsp;&nbsp;\u23BF &nbsp;... {hiddenCount} lines hidden, showing last{' '}\n {MAX_RENDERED_LINES} lines\n </Text>\n </Box>\n )}\n {lines.map((line, index) => (\n <Box key={index} flexDirection=\"row\">\n <Text>\n &nbsp;&nbsp;\u23BF &nbsp;\n <Text color={theme.secondaryText}>{line}</Text>\n </Text>\n </Box>\n ))}\n </Box>\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'\nimport { MaxSizedText } from '#ui-ink/components/MaxSizedText'\n\nexport function AssistantLocalCommandOutputMessage({\n content,\n maxHeight,\n maxWidth,\n}: {\n content: string\n maxHeight?: number\n maxWidth?: number\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, maxHeight, maxWidth),\n format(stderr?.trim(), theme.error, maxHeight, maxWidth),\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(\n content: string | undefined,\n color: string,\n maxHeight?: number,\n maxWidth?: number,\n): React.ReactNode {\n if (!content) {\n return null\n }\n if (maxHeight && maxWidth) {\n return (\n <MaxSizedText\n text={content}\n maxHeight={maxHeight}\n maxWidth={maxWidth}\n overflowDirection=\"bottom\"\n />\n )\n }\n return <Text color={color}>{content}</Text>\n}\n", "import * as React from 'react'\nimport { useCallback, useMemo, useRef, useState } from 'react'\n\nexport type TransientViewportConstraints = {\n /**\n * Maximum number of rows transient (actively changing) transcript content\n * should occupy. When undefined, components should fall back to their own\n * defaults.\n */\n maxHeight?: number\n\n /**\n * When true, components should actively constrain their height to prevent\n * content overflow that causes flickering. When false, overflow is allowed\n * (e.g., during transitions or when intentionally exceeding bounds).\n */\n constrainHeight?: boolean\n\n /**\n * Report that content would overflow the viewport.\n * Used for telemetry and debugging flickering issues.\n */\n reportOverflow?: (actualHeight: number) => void\n}\n\nconst TransientViewportContext =\n React.createContext<TransientViewportConstraints>({})\n\nexport function TransientViewportProvider({\n value,\n children,\n}: {\n value: TransientViewportConstraints\n children: React.ReactNode\n}): React.ReactNode {\n return (\n <TransientViewportContext.Provider value={value}>\n {children}\n </TransientViewportContext.Provider>\n )\n}\n\nexport function useTransientViewport(): TransientViewportConstraints {\n return React.useContext(TransientViewportContext)\n}\n\n/**\n * Hook for components that need to track and report overflow.\n * Returns a ref callback and the effective max height to use.\n */\nexport function useConstrainedHeight(defaultMaxHeight?: number): {\n effectiveMaxHeight: number | undefined\n shouldConstrain: boolean\n} {\n const { maxHeight, constrainHeight } = useTransientViewport()\n\n return useMemo(\n () => ({\n effectiveMaxHeight: maxHeight ?? defaultMaxHeight,\n shouldConstrain: constrainHeight ?? true,\n }),\n [maxHeight, defaultMaxHeight, constrainHeight],\n )\n}\n\n/**\n * Enhanced provider that includes overflow tracking.\n */\nexport function TransientViewportProviderWithTracking({\n maxHeight,\n constrainHeight = true,\n onOverflow,\n children,\n}: {\n maxHeight: number\n constrainHeight?: boolean\n onOverflow?: (actualHeight: number) => void\n children: React.ReactNode\n}): React.ReactNode {\n const lastOverflowRef = useRef(0)\n const OVERFLOW_THROTTLE_MS = 200\n\n const reportOverflow = useCallback(\n (actualHeight: number) => {\n const now = Date.now()\n if (now - lastOverflowRef.current < OVERFLOW_THROTTLE_MS) return\n lastOverflowRef.current = now\n onOverflow?.(actualHeight)\n },\n [onOverflow],\n )\n\n const value = useMemo<TransientViewportConstraints>(\n () => ({\n maxHeight,\n constrainHeight,\n reportOverflow,\n }),\n [maxHeight, constrainHeight, reportOverflow],\n )\n\n return (\n <TransientViewportContext.Provider value={value}>\n {children}\n </TransientViewportContext.Provider>\n )\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} bold>\n {'\\u276F'}\n </Text>\n </Box>\n <Box flexDirection=\"column\" width={columns - 4}>\n <Text color={theme.kode} bold 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 { UserBackgroundTaskInputMessage } from './UserBackgroundTaskInputMessage'\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 // Background tasks!\n if (param.text.includes('<background-task-input>')) {\n return (\n <UserBackgroundTaskInputMessage addMargin={addMargin} param={param} />\n )\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 } from 'ink'\nimport * as React from 'react'\nimport { useEffect, useMemo, useState } from 'react'\nimport figures from 'figures'\nimport { getTheme } from '#core/utils/theme'\nimport { randomUUID } from 'crypto'\nimport type { Tool } from '#core/tooling/Tool'\nimport { createUserMessage, stripSystemMessages } from '#core/utils/messages'\nimport type { Message as MessageType, UserMessage } from '#core/query'\nimport { useExitOnCtrlCD } from '#ui-ink/hooks/useExitOnCtrlCD'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\n\ntype Props = {\n erroredToolUseIDs: Set<string>\n messages: MessageType[]\n onSelect: (message: MessageType) => void | Promise<void>\n onEscape: () => void\n tools: Tool[]\n unresolvedToolUseIDs: Set<string>\n}\n\nconst MAX_VISIBLE_MESSAGES = 7\nconst SELECTOR_OVERHEAD_ROWS = 7\nconst SELECTOR_RESERVED_ROWS = 4\nconst INDEX_WIDTH = 7\n\nfunction extractUserMessageText(content: unknown): string {\n if (typeof content === 'string') return content\n if (!Array.isArray(content)) return ''\n\n const parts: string[] = []\n for (const block of content) {\n if (!block || typeof block !== 'object') continue\n const record = block as { type?: unknown; text?: unknown }\n if (record.type !== 'text') continue\n parts.push(String(record.text ?? ''))\n }\n\n return parts.join('\\n')\n}\n\nfunction isToolResultOnlyMessage(message: UserMessage): boolean {\n if (!Array.isArray(message.message.content)) return false\n\n let hasToolResult = false\n let hasText = false\n for (const block of message.message.content) {\n if (!block || typeof block !== 'object') continue\n const record = block as { type?: unknown; text?: unknown }\n if (record.type === 'tool_result') {\n hasToolResult = true\n continue\n }\n if (record.type === 'text') {\n const text = String(record.text ?? '')\n if (text.trim()) hasText = true\n }\n }\n\n return hasToolResult && !hasText\n}\n\nexport function MessageSelector({\n messages,\n onSelect,\n onEscape,\n}: Props): React.ReactNode {\n const currentUUID = useMemo(() => randomUUID(), [])\n const { rows } = useTerminalSize()\n\n function handleSelect(message: MessageType) {\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 const filtered = messages.filter(\n (message): message is UserMessage =>\n message.type === 'user' && !isToolResultOnlyMessage(message),\n )\n return [\n ...filtered,\n { ...createUserMessage(''), uuid: currentUUID } as UserMessage,\n ]\n }, [messages, currentUUID])\n const [selectedIndex, setSelectedIndex] = useState(allItems.length - 1)\n\n useEffect(() => {\n setSelectedIndex(previous => {\n if (allItems.length === 0) return 0\n return Math.min(previous, allItems.length - 1)\n })\n }, [allItems.length])\n\n const exitState = useExitOnCtrlCD(() => process.exit(0))\n\n useKeypress((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 maxVisibleCount = Math.max(\n 1,\n rows - SELECTOR_OVERHEAD_ROWS - SELECTOR_RESERVED_ROWS,\n )\n const targetVisibleCount = Math.min(MAX_VISIBLE_MESSAGES, maxVisibleCount)\n const visibleCount = Math.min(allItems.length, targetVisibleCount)\n\n const firstVisibleIndex = Math.max(\n 0,\n Math.min(\n selectedIndex - Math.floor(visibleCount / 2),\n allItems.length - visibleCount,\n ),\n )\n const visibleItems = allItems.slice(\n firstVisibleIndex,\n firstVisibleIndex + visibleCount,\n )\n const missingRows = Math.max(0, targetVisibleCount - visibleItems.length)\n\n return (\n <>\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={getTheme().secondaryBorder}\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 {visibleItems.map((msg, index) => {\n const actualIndex = firstVisibleIndex + index\n const isSelected = actualIndex === selectedIndex\n const isCurrent = msg.uuid === currentUUID\n\n const cleanedText = stripSystemMessages(\n extractUserMessageText(msg.message.content),\n )\n const firstLine =\n cleanedText\n .split('\\n')\n .map(line => line.trim())\n .find(Boolean) ?? ''\n const isEmpty = !firstLine\n\n return (\n <Box key={msg.uuid} flexDirection=\"row\" height={1} minHeight={1}>\n <Box width={INDEX_WIDTH}>\n {isSelected ? (\n <Text color=\"blue\" bold>\n {figures.pointer} {actualIndex + 1}{' '}\n </Text>\n ) : (\n <Text>\n {' '}\n {actualIndex + 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 ) : (\n <Text dimColor={isEmpty} italic={isEmpty} wrap=\"truncate-end\">\n {isEmpty ? '(empty message)' : firstLine}\n </Text>\n )}\n </Box>\n </Box>\n )\n })}\n {missingRows > 0\n ? Array.from({ length: missingRows }).map((_, idx) => (\n <Box key={`empty-${idx}`} flexDirection=\"row\" height={1}>\n <Box width={INDEX_WIDTH}>\n <Text> </Text>\n </Box>\n <Text> </Text>\n </Box>\n ))\n : null}\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 { type DOMElement, measureElement } from 'ink'\nimport { useCallback, useEffect, useRef } from 'react'\nimport { debug as debugLogger } from '#core/utils/debugLogger'\n\nconst MIN_MEASURE_INTERVAL_MS = 100\n\n/**\n * Debug-only hook that detects when the UI renders taller than the terminal.\n * This is a strong signal of a viewport sizing bug that causes scroll/flicker.\n *\n * Enable with `KODE_DEBUG_FLICKER=1` or by passing `enabled=true`.\n */\nexport function useFlickerDetector(\n rootUiRef: React.RefObject<DOMElement | null>,\n terminalHeight: number,\n enabled: boolean,\n): void {\n const lastMeasureRef = useRef(0)\n\n useEffect(() => {\n if (!enabled) return\n if (!rootUiRef.current) return\n if (!Number.isFinite(terminalHeight) || terminalHeight <= 0) return\n\n const now = Date.now()\n if (now - lastMeasureRef.current < MIN_MEASURE_INTERVAL_MS) return\n lastMeasureRef.current = now\n\n const measurement = measureElement(rootUiRef.current)\n const isOverflowing = measurement.height > terminalHeight\n\n if (isOverflowing) {\n debugLogger.ui('FLICKER_DETECTED', {\n contentHeight: measurement.height,\n terminalHeight,\n timestamp: now,\n })\n }\n }, [enabled, rootUiRef, terminalHeight])\n}\n\n/**\n * Simpler version that just returns whether content is currently overflowing.\n * Use this for basic overflow prevention without history tracking.\n */\nexport function useIsOverflowing(\n rootUiRef: React.RefObject<DOMElement | null>,\n terminalHeight: number,\n): boolean {\n const isOverflowingRef = useRef(false)\n const lastMeasureRef = useRef(0)\n\n useEffect(() => {\n if (!rootUiRef.current) return\n if (!Number.isFinite(terminalHeight) || terminalHeight <= 0) return\n\n const now = Date.now()\n if (now - lastMeasureRef.current < MIN_MEASURE_INTERVAL_MS) return\n lastMeasureRef.current = now\n\n const measurement = measureElement(rootUiRef.current)\n isOverflowingRef.current = measurement.height > terminalHeight\n })\n\n return isOverflowingRef.current\n}\n\n/**\n * Hook that provides a callback to check overflow on demand.\n * Useful for components that need to verify height before rendering.\n */\nexport function useOverflowCheck(\n rootUiRef: React.RefObject<DOMElement | null>,\n terminalHeight: number,\n): () => boolean {\n return useCallback(() => {\n if (!rootUiRef.current) return false\n if (!Number.isFinite(terminalHeight) || terminalHeight <= 0) return false\n\n const measurement = measureElement(rootUiRef.current)\n return measurement.height > terminalHeight\n }, [rootUiRef, terminalHeight])\n}\n", "import { Box } from 'ink'\nimport * as React from 'react'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport ReactReconciler from 'react-reconciler'\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 {\n useApiKeyVerification,\n type VerificationStatus,\n} 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 { getGlobalConfigCached, saveGlobalConfig } from '#core/utils/config'\nimport { getNextAvailableLogForkNumber, logError } from '#core/utils/log'\nimport { getOriginalCwd } from '#core/utils/state'\nimport { MACRO } from '#core/constants/macros'\nimport { subscribeAgentReloads } from '#core/agent/events'\nimport { subscribeCustomCommandReloads } from '#cli-services/customCommands'\nimport { HelpScreen } from '#ui-ink/screens/overlays/HelpScreen'\nimport { ShortcutsScreen } from '#ui-ink/screens/overlays/ShortcutsScreen'\nimport { ConfigScreen } from '#ui-ink/screens/overlays/ConfigScreen'\nimport { OpenFileScreen } from '#ui-ink/screens/overlays/OpenFileScreen'\nimport { ConsoleScreen } from '#ui-ink/screens/overlays/ConsoleScreen'\nimport { NotificationsScreen } from '#ui-ink/screens/overlays/NotificationsScreen'\nimport { TranscriptScreen } from '#ui-ink/screens/overlays/TranscriptScreen'\nimport { CommandPaletteScreen } from '#ui-ink/screens/overlays/CommandPaletteScreen'\nimport { TasksScreen } from '#ui-ink/screens/overlays/TasksScreen'\nimport { TodosScreen } from '#ui-ink/screens/overlays/TodosScreen'\nimport { HistorySearchScreen } from '#ui-ink/screens/overlays/HistorySearchScreen'\nimport { ModelPickerScreen } from '#ui-ink/screens/overlays/ModelPickerScreen'\nimport { ThinkingToggleScreen } from '#ui-ink/screens/overlays/ThinkingToggleScreen'\nimport { ModelConfig } from '#ui-ink/components/ModelConfig'\nimport { Doctor } from '#ui-ink/screens/Doctor'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { submitPrompt } from '#ui-ink/components/PromptInput/submit'\nimport { useTranscriptItems, type TranscriptItem } 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'\nimport { ensureLspManagerInitialized } from '#tools/tools/system/LspTool/call'\nimport { describeToolPermissionRuleSource } from '#core/permissions/ruleString'\nimport { triggerModelConfigChange } from '#core/messages'\nimport {\n clearViewport,\n enterAlternateScreen,\n exitAlternateScreen,\n} from '#cli-utils/terminal'\nimport { getModelManager } from '#core/utils/model'\nimport { getToolPermissionContextForConversationKey } from '#core/utils/toolPermissionContextState'\nimport type { PromptMode } from '#ui-ink/components/PromptInput/types'\nimport { KEYPRESS_PRIORITY } from '#ui-ink/constants/keypressPriority'\nimport { terminalCapabilityManager } from '#ui-ink/utils/terminalCapabilityManager'\nimport type {\n ForkConvoWithMessagesOptions,\n SetForkConvoWithMessagesOnTheNextRender,\n} from '#ui-ink/types/conversationReset'\n\nconst batchedUpdates: ((fn: () => void) => void) | null =\n typeof (ReactReconciler as any)?.batchedUpdates === 'function'\n ? ((ReactReconciler as any).batchedUpdates as (fn: () => void) => void)\n : typeof (ReactReconciler as any)?.default?.batchedUpdates === 'function'\n ? ((ReactReconciler as any).default.batchedUpdates as (\n fn: () => void,\n ) => void)\n : null\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, setUpdateAvailableVersion] = useState<\n string | null\n >(() => props.initialUpdateVersion ?? null)\n const [updateCommands, setUpdateCommands] = useState<string[] | null>(() =>\n props.initialUpdateCommands ? [...props.initialUpdateCommands] : null,\n )\n\n const [verbose, setVerbose] = useState(() => {\n return props.verbose ?? getGlobalConfigCached().verbose\n })\n\n const [commands, setCommands] = useState(() => props.commands)\n\n useEffect(() => {\n if (process.env.NODE_ENV === 'test') return\n if (updateAvailableVersion || updateCommands) return\n\n let cancelled = false\n ;(async () => {\n try {\n const [{ getLatestVersion, getUpdateCommandSuggestions }, semverMod] =\n await Promise.all([\n import('#core/utils/autoUpdater'),\n import('semver'),\n ])\n\n const semverModule = semverMod as unknown as Record<string, unknown>\n const semver =\n typeof semverModule.gt === 'function'\n ? semverModule\n : typeof (semverModule.default as any)?.gt === 'function'\n ? (semverModule.default as any)\n : null\n if (!semver) return\n\n const latest = await getLatestVersion()\n if (!latest || typeof latest !== 'string') return\n\n if (!semver.gt(latest, MACRO.VERSION)) return\n const cmds = await getUpdateCommandSuggestions()\n\n if (cancelled) return\n setUpdateAvailableVersion(latest)\n setUpdateCommands(cmds)\n } catch {\n // best-effort only\n }\n })()\n\n return () => {\n cancelled = true\n }\n }, [updateAvailableVersion, updateCommands])\n\n const [forkNumber, setForkNumber] = useState(\n getNextAvailableLogForkNumber(\n props.messageLogName,\n props.initialForkNumber ?? 0,\n 0,\n ),\n )\n const initialForkNumberRef = useRef(forkNumber)\n const [uiRefreshCounter, setUiRefreshCounter] = useState(0)\n\n const [\n pendingForkConvoWithMessages,\n setPendingForkConvoWithMessages,\n ] = useState<{\n messages: MessageType[]\n options?: ForkConvoWithMessagesOptions\n } | null>(null)\n const pendingForkConvoWithMessagesRef = useRef<{\n messages: MessageType[]\n options?: ForkConvoWithMessagesOptions\n } | null>(null)\n\n const setForkConvoWithMessagesOnTheNextRender =\n useCallback<SetForkConvoWithMessagesOnTheNextRender>((messages, options) => {\n const request = { messages, options }\n pendingForkConvoWithMessagesRef.current = request\n setPendingForkConvoWithMessages(request)\n }, [])\n\n // Returns true if a pending fork/reset request should suppress appending new messages.\n // Side effect: clears pendingForkConvoWithMessagesRef when returning true.\n const checkPendingForkAndSuppressAppend = useCallback(\n (newMessages: MessageType[]): boolean => {\n const pending = pendingForkConvoWithMessagesRef.current\n if (!pending) return false\n if (newMessages.length === 0) return false\n const last = newMessages[newMessages.length - 1]\n if (!last || last.type !== 'assistant') return false\n // A fork/reset was requested during this command; don't append the\n // command metadata messages to the soon-to-be-replaced transcript.\n pendingForkConvoWithMessagesRef.current = null\n return true\n },\n [],\n )\n\n const [abortController, setAbortController] =\n useState<AbortController | null>(null)\n const [isLoading, setIsLoading] = useState(false)\n type ToolView = {\n jsx: React.ReactNode | null\n shouldHidePromptInput: boolean\n displayMode?: 'inline' | 'fullscreen'\n }\n\n const [toolViewStack, setToolViewStack] = useState<ToolView[]>([])\n const toolViewStackRef = useRef<ToolView[]>(toolViewStack)\n useEffect(() => {\n toolViewStackRef.current = toolViewStack\n }, [toolViewStack])\n\n const toolJSX: ToolView | null =\n toolViewStack.length > 0 ? toolViewStack[toolViewStack.length - 1] : null\n\n const toolJSXRef = useRef<typeof toolJSX>(toolJSX)\n useEffect(() => {\n toolJSXRef.current = toolJSX\n }, [toolJSX])\n\n const ephemeralFullscreenAltScreenRef = useRef(false)\n useEffect(() => {\n return () => {\n if (ephemeralFullscreenAltScreenRef.current) {\n ephemeralFullscreenAltScreenRef.current = false\n exitAlternateScreen()\n }\n }\n }, [])\n\n const setToolViewStackWithClear = useCallback(\n (nextStack: ToolView[]) => {\n const prevMode = toolJSXRef.current?.displayMode\n const nextTop = nextStack.length\n ? nextStack[nextStack.length - 1]\n : null\n const nextMode = nextTop?.displayMode\n\n const prevFull = prevMode === 'fullscreen'\n const nextFull = nextMode === 'fullscreen'\n\n const maybeApplyPendingForkConvoWithMessages = (): void => {\n const request = pendingForkConvoWithMessagesRef.current\n if (!request) return\n\n pendingForkConvoWithMessagesRef.current = null\n\n if (request.options?.clearViewport) {\n // Don't await; ordering of writes on stdout is preserved and this keeps\n // the transition to the restored main buffer from flashing.\n void clearViewport()\n }\n\n const applyStateUpdates = () => {\n setPendingForkConvoWithMessages(null)\n setForkNumber(prev => prev + 1)\n setMessages(request.messages)\n\n if (request.options?.resetInput) {\n setInputMode('prompt')\n setInputValue('')\n setRestorePastes(undefined)\n setDraftPastes({ pastedTexts: [], pastedImages: [] })\n }\n }\n\n if (batchedUpdates) {\n batchedUpdates(applyStateUpdates)\n return\n }\n applyStateUpdates()\n }\n\n const screenReaderEnv =\n process.env.KODE_SCREEN_READER ?? process.env.SCREENREADER\n const canUseAltScreen =\n process.stdin.isTTY && process.stdout.isTTY && !screenReaderEnv\n\n const useEphemeralAltScreen =\n canUseAltScreen && getGlobalConfigCached().useAlternateBuffer !== true\n\n const doSetState = () => {\n toolViewStackRef.current = nextStack\n toolJSXRef.current = nextTop\n setToolViewStack(nextStack)\n }\n\n // When running in the main buffer (scrollback enabled), opening a fullscreen\n // TUI view leaves the entire screen in scrollback. To preserve scrollback\n // while keeping fullscreen dialogs clean, temporarily switch to the\n // terminal alternate screen for fullscreen tool views.\n if (useEphemeralAltScreen) {\n if (!prevFull && nextFull) {\n enterAlternateScreen()\n // Switching buffers can reset terminal modes (kitty/modifyOtherKeys/bracketed paste)\n // in some terminals; re-assert what we detected at startup so keybindings keep working.\n terminalCapabilityManager.enableSupportedModes()\n void clearViewport()\n doSetState()\n ephemeralFullscreenAltScreenRef.current = true\n return\n } else if (prevFull && !nextFull) {\n if (ephemeralFullscreenAltScreenRef.current) {\n ephemeralFullscreenAltScreenRef.current = false\n exitAlternateScreen()\n terminalCapabilityManager.enableSupportedModes()\n }\n\n // Apply any pending transcript fork/reset immediately when leaving a\n // fullscreen tool view so the restored main buffer doesn't flash the\n // pre-overlay frame (e.g. `/resume`).\n maybeApplyPendingForkConvoWithMessages()\n } else if (\n prevFull &&\n nextFull &&\n ephemeralFullscreenAltScreenRef.current\n ) {\n // Ensure clean transitions between fullscreen tool screens.\n doSetState()\n return\n }\n } else {\n if (prevFull !== nextFull) {\n // Avoid explicit terminal clears here; the UI should remain within the viewport\n // and rely on Ink's reconciliation to keep transitions stable.\n if (prevFull && !nextFull) {\n maybeApplyPendingForkConvoWithMessages()\n }\n doSetState()\n return\n }\n }\n\n doSetState()\n },\n [setToolViewStack],\n )\n const setToolJSXWithClear = useCallback(\n (next: ToolView | null) => {\n setToolViewStackWithClear(next ? [next] : [])\n },\n [setToolViewStackWithClear],\n )\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<PromptMode>('prompt')\n const [restorePastes, setRestorePastes] = useState<\n | {\n id: number\n pastedTexts: Array<{ placeholder: string; text: string }>\n pastedImages: Array<{\n placeholder: string\n data: string\n mediaType: string\n }>\n }\n | undefined\n >(undefined)\n const [draftPastes, setDraftPastes] = useState<{\n pastedTexts: Array<{ placeholder: string; text: string }>\n pastedImages: Array<{\n placeholder: string\n data: string\n mediaType: string\n }>\n }>({ pastedTexts: [], pastedImages: [] })\n const [sessionThinkingMode, setSessionThinkingMode] = useState<\n 'enabled' | 'auto' | null\n >(null)\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 getGlobalConfigCached().hasAcknowledgedCostThreshold,\n )\n const [binaryFeedbackContext, setBinaryFeedbackContext] =\n useState<BinaryFeedbackContext | null>(null)\n const [toast, setToast] = useState<string | null>(null)\n const toastTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const dismissToolView = useCallback(() => {\n const current = toolViewStackRef.current\n if (current.length === 0) return\n setToolViewStackWithClear(current.slice(0, -1))\n }, [setToolViewStackWithClear])\n\n const openToolView = useCallback(\n (view: NonNullable<typeof toolJSX>) => {\n setToolViewStackWithClear([...toolViewStackRef.current, view])\n },\n [setToolViewStackWithClear],\n )\n\n const openTasksScreen = useCallback(() => {\n openToolView({\n jsx: <TasksScreen onDone={dismissToolView} />,\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n }, [dismissToolView, openToolView])\n\n const openTodosScreen = useCallback(() => {\n openToolView({\n jsx: <TodosScreen agentId=\"main\" onDone={dismissToolView} />,\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n }, [dismissToolView, openToolView])\n\n type ReplOnQueryFn = (\n newMessages: MessageType[],\n passedAbortController?: AbortController,\n ) => Promise<void>\n\n const apiKeyStatusRef = useRef<VerificationStatus>('loading')\n const onQueryRef = useRef<ReplOnQueryFn | null>(null)\n\n const openHistorySearchScreen = useCallback(() => {\n openToolView({\n jsx: (\n <HistorySearchScreen\n onDone={result => {\n dismissToolView()\n\n if (result.action === 'cancel') return\n\n const selected = result.value\n const pastedTexts = result.pastedTexts\n const mode: PromptMode = selected.startsWith('!')\n ? 'bash'\n : selected.startsWith('&')\n ? 'background'\n : selected.startsWith('#')\n ? 'koding'\n : 'prompt'\n const text =\n mode === 'bash' || mode === 'background' || mode === 'koding'\n ? selected.slice(1)\n : selected\n\n if (result.action === 'accept') {\n setInputMode(mode)\n setInputValue(text)\n setRestorePastes({\n id: Date.now(),\n pastedTexts,\n pastedImages: [],\n })\n return\n }\n\n if (isLoading || apiKeyStatusRef.current !== 'valid') {\n setInputMode(mode)\n setInputValue(text)\n setRestorePastes({\n id: Date.now(),\n pastedTexts,\n pastedImages: [],\n })\n return\n }\n\n void (async () => {\n const conversationKey = `${props.messageLogName}:${forkNumber}`\n const toolPermissionContext =\n getToolPermissionContextForConversationKey({\n conversationKey,\n isBypassPermissionsModeAvailable: !safeMode,\n })\n\n const exit = (): never => {\n process.exit(0)\n }\n\n await submitPrompt({\n input: text,\n mode,\n completionActive: false,\n suggestionCount: 0,\n isSubmittingSlashCommand: false,\n isDisabled: apiKeyStatusRef.current !== 'valid',\n isLoading: false,\n isEditingExternally: false,\n abortController,\n setIsLoading,\n setAbortController,\n onInputChange: setInputValue,\n onModeChange: setInputMode,\n setCursorOffset: () => {},\n onSubmitCountChange: setSubmitCount,\n onQuery: async (...args) => {\n await onQueryRef.current?.(...args)\n },\n setToolJSX: setToolJSXWithClear,\n commands,\n forkNumber,\n messageLogName: props.messageLogName,\n tools: props.tools,\n verbose,\n disableSlashCommands,\n permissionMode: toolPermissionContext.mode,\n toolPermissionContext,\n setForkConvoWithMessagesOnTheNextRender,\n readFileTimestamps: readFileTimestampsRef.current,\n pastedTexts,\n pastedImages: [],\n clearPastes: () => {},\n resetHistory: () => {},\n setCurrentPwd: () => {},\n exit,\n })\n })()\n }}\n />\n ),\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n }, [\n abortController,\n commands,\n disableSlashCommands,\n dismissToolView,\n forkNumber,\n isLoading,\n openToolView,\n props.messageLogName,\n props.tools,\n safeMode,\n setAbortController,\n setForkConvoWithMessagesOnTheNextRender,\n setIsLoading,\n setToolJSXWithClear,\n verbose,\n ])\n\n useKeypress(\n (inputChar, key) => {\n const hasModal =\n Boolean(toolJSX) ||\n Boolean(toolUseConfirm) ||\n Boolean(binaryFeedbackContext) ||\n showingCostDialog ||\n isMessageSelectorVisible\n\n if (key.ctrl && inputChar === 'c' && isLoading) {\n setToolJSXWithClear(null)\n setToolUseConfirm(null)\n setBinaryFeedbackContext(null)\n onCancel()\n return true\n }\n\n if (hasModal) return\n\n if (key.ctrl && inputChar === 't') {\n openTodosScreen()\n return true\n }\n\n if (key.ctrl && inputChar === 'o') {\n openToolView({\n jsx: (\n <TranscriptScreen\n onDone={dismissToolView}\n label={`${props.messageLogName}-${forkNumber}`}\n initialFollow={true}\n />\n ),\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return true\n }\n\n if (key.ctrl && inputChar === 'r') {\n openHistorySearchScreen()\n return true\n }\n\n if (key.meta && inputChar === 't') {\n const effectiveThinkingMode =\n sessionThinkingMode ?? getGlobalConfigCached().thinkingMode ?? 'auto'\n const currentValue = effectiveThinkingMode === 'enabled'\n const isMidConversation =\n messages.some(m => m.type === 'assistant') ||\n messages.some(m => m.type === 'user' && !(m as any)?.isMeta)\n\n openToolView({\n jsx: (\n <ThinkingToggleScreen\n currentValue={currentValue}\n isMidConversation={isMidConversation}\n onSelect={enabled => {\n setSessionThinkingMode(enabled ? 'enabled' : 'auto')\n showToast(`Thinking: ${enabled ? 'ON' : 'OFF'}`)\n }}\n onDone={dismissToolView}\n />\n ),\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return true\n }\n\n if (key.meta && inputChar === 'p') {\n openToolView({\n jsx: (\n <ModelPickerScreen\n onDone={dismissToolView}\n onSelectModel={modelName => {\n const modelManager = getModelManager()\n modelManager.setPointer('main', modelName)\n triggerModelConfigChange()\n }}\n />\n ),\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return true\n }\n\n if (inputChar === '?' && inputValue.trim().length === 0) {\n openToolView({\n jsx: <ShortcutsScreen onDone={dismissToolView} />,\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return true\n }\n\n if (key.name === 'f1') {\n openToolView({\n jsx: <HelpScreen commands={commands} onDone={dismissToolView} />,\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return true\n }\n\n if (key.name === 'f2') {\n openToolView({\n jsx: <ConfigScreen onClose={dismissToolView} />,\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return true\n }\n\n if (key.name === 'f3') {\n openToolView({\n jsx: <OpenFileScreen onDone={dismissToolView} />,\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return true\n }\n\n if (key.name === 'f4') {\n openToolView({\n jsx: <ConsoleScreen onDone={dismissToolView} />,\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return true\n }\n\n if (key.name === 'f5') {\n openToolView({\n jsx: <NotificationsScreen onDone={dismissToolView} />,\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return true\n }\n\n if (key.name === 'f6') {\n openToolView({\n jsx: (\n <TranscriptScreen\n onDone={dismissToolView}\n label={`${props.messageLogName}-${forkNumber}`}\n />\n ),\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return true\n }\n\n if (key.name === 'f8') {\n openTasksScreen()\n return true\n }\n\n if (key.name === 'f7') {\n openToolView({\n jsx: (\n <CommandPaletteScreen\n onDone={action => {\n if (!action) {\n dismissToolView()\n return\n }\n\n if (action === 'help') {\n openToolView({\n jsx: (\n <HelpScreen\n commands={commands}\n onDone={dismissToolView}\n />\n ),\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return\n }\n\n if (action === 'config') {\n openToolView({\n jsx: <ConfigScreen onClose={dismissToolView} />,\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return\n }\n\n if (action === 'open') {\n openToolView({\n jsx: <OpenFileScreen onDone={dismissToolView} />,\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return\n }\n\n if (action === 'console') {\n openToolView({\n jsx: <ConsoleScreen onDone={dismissToolView} />,\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return\n }\n\n if (action === 'notifications') {\n openToolView({\n jsx: <NotificationsScreen onDone={dismissToolView} />,\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return\n }\n\n if (action === 'transcript') {\n openToolView({\n jsx: (\n <TranscriptScreen\n onDone={dismissToolView}\n label={`${props.messageLogName}-${forkNumber}`}\n />\n ),\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return\n }\n\n if (action === 'doctor') {\n openToolView({\n jsx: <Doctor onDone={dismissToolView} doctorMode={true} />,\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return\n }\n\n if (action === 'model') {\n try {\n abortController?.abort?.()\n } catch {}\n setIsLoading(false)\n\n openToolView({\n jsx: (\n <ModelConfig\n onClose={() => {\n import('#core/utils/model').then(\n ({ reloadModelManager }) => {\n reloadModelManager()\n triggerModelConfigChange()\n dismissToolView()\n },\n )\n }}\n />\n ),\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return\n }\n\n dismissToolView()\n }}\n />\n ),\n shouldHidePromptInput: true,\n displayMode: 'fullscreen',\n })\n return true\n }\n },\n { priority: KEYPRESS_PRIORITY.REPL_CONTROLLER },\n )\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 useEffect(() => {\n apiKeyStatusRef.current = apiKeyStatus\n }, [apiKeyStatus])\n\n useEffect(() => {\n // Best-effort eager init so the first LSP tool call doesn't pay process startup latency.\n void ensureLspManagerInitialized().catch(() => {})\n }, [])\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 setToolJSXWithClear,\n setToolUseConfirm,\n setBinaryFeedbackContext,\n onCancel,\n isLoading,\n isMessageSelectorVisible,\n abortController?.signal,\n )\n\n useEffect(() => {\n if (!pendingForkConvoWithMessages) return\n\n // If a fullscreen tool view is still mounted, we may still be on the\n // alternate screen buffer (ephemeral fullscreen mode). Wait until the view\n // is dismissed so clears apply to the active REPL buffer.\n if (toolJSX?.displayMode === 'fullscreen') return\n\n const request = pendingForkConvoWithMessages\n setPendingForkConvoWithMessages(null)\n pendingForkConvoWithMessagesRef.current = null\n\n // For non-fullscreen forks, handle clearViewport synchronously then update state\n // This matches the old pattern where clearTerminal was called before state updates\n const applyStateUpdates = () => {\n setForkNumber(prev => prev + 1)\n setMessages(request.messages)\n\n if (request.options?.resetInput) {\n setInputMode('prompt')\n setInputValue('')\n setRestorePastes(undefined)\n setDraftPastes({ pastedTexts: [], pastedImages: [] })\n }\n }\n\n // clearViewport is async but we don't need to await it - the terminal\n // writes are ordered on stdout, so the clear happens before React renders\n if (request.options?.clearViewport) {\n void clearViewport()\n }\n\n if (batchedUpdates) {\n batchedUpdates(applyStateUpdates)\n } else {\n applyStateUpdates()\n }\n }, [pendingForkConvoWithMessages, toolJSX?.displayMode])\n\n useEffect(() => {\n const totalCost = getTotalCost()\n if (totalCost >= 5 && !showCostDialog && !haveShownCostDialog) {\n setShowCostDialog(true)\n }\n }, [messages, showCostDialog, haveShownCostDialog])\n\n const showToast = useCallback((text: string) => {\n setToast(text)\n if (toastTimeoutRef.current) {\n clearTimeout(toastTimeoutRef.current)\n }\n toastTimeoutRef.current = setTimeout(() => setToast(null), 6000)\n }, [])\n\n const ultrathinkToastActiveRef = useRef(false)\n useEffect(() => {\n if (inputMode === 'bash' || inputMode === 'background') {\n ultrathinkToastActiveRef.current = false\n return\n }\n\n const hasUltrathink = /\\bultrathink\\b/i.test(inputValue)\n const effectiveThinkingMode =\n sessionThinkingMode ?? getGlobalConfigCached().thinkingMode ?? 'auto'\n\n if (\n hasUltrathink &&\n !ultrathinkToastActiveRef.current &&\n effectiveThinkingMode === 'auto'\n ) {\n showToast('Thinking on')\n }\n\n ultrathinkToastActiveRef.current = hasUltrathink\n }, [inputMode, inputValue, sessionThinkingMode, showToast])\n\n useEffect(() => {\n return subscribeAgentReloads(event => {\n const count = event.changedPaths.length\n showToast(\n count > 0\n ? `Agents reloaded (${count} file${count === 1 ? '' : 's'})`\n : 'Agents reloaded',\n )\n })\n }, [showToast])\n\n useEffect(() => {\n let cancelled = false\n const unsubscribe = subscribeCustomCommandReloads(event => {\n const count = event.changedPaths.length\n showToast(\n count > 0\n ? `Commands reloaded (${count} change${count === 1 ? '' : 's'})`\n : 'Commands reloaded',\n )\n\n void (async () => {\n try {\n const { getCommands } = await import('#cli-commands')\n const next = await getCommands()\n if (cancelled) return\n setCommands(next)\n setUiRefreshCounter(prev => prev + 1)\n } catch (error) {\n logError(error)\n }\n })()\n })\n\n return () => {\n cancelled = true\n unsubscribe()\n }\n }, [showToast])\n\n useEffect(() => {\n return () => {\n if (toastTimeoutRef.current) {\n clearTimeout(toastTimeoutRef.current)\n toastTimeoutRef.current = null\n }\n }\n }, [])\n\n const canUseTool = useCanUseTool(setToolUseConfirm, {\n onPermissionRuleWarnings: warnings => {\n const first = warnings[0]\n const example = first\n ? `${first.rule} (${describeToolPermissionRuleSource(first.source)})`\n : ''\n const fix = first?.fix ? ` Fix: ${first.fix}` : ''\n showToast(\n `Permission rules: ${warnings.length} unreachable rule${\n warnings.length === 1 ? '' : 's'\n } detected${example ? ` (e.g. ${example})` : ''}.${fix}`,\n )\n },\n })\n const requestToolUsePermission = useRequestToolUsePermission({\n setToolUseConfirm,\n })\n\n const onQuery = useReplQuery({\n disableSlashCommands,\n systemPromptOverride: props.systemPromptOverride,\n appendSystemPrompt: props.appendSystemPrompt,\n messages,\n setMessages,\n commands,\n forkNumber,\n messageLogName: props.messageLogName,\n thinkingMode:\n sessionThinkingMode ?? getGlobalConfigCached().thinkingMode ?? 'auto',\n tools: props.tools,\n mcpClients,\n verbose,\n safeMode,\n checkPendingForkAndSuppressAppend,\n requestToolUsePermission,\n canUseTool,\n readFileTimestamps: readFileTimestampsRef.current,\n setToolJSX: setToolJSXWithClear,\n getBinaryFeedbackResponse,\n setAbortController,\n setIsLoading,\n })\n useEffect(() => {\n onQueryRef.current = onQuery\n }, [onQuery])\n\n const onInit = useReplInit({\n initialPrompt: props.initialPrompt,\n commands,\n forkNumber,\n messageLogName: props.messageLogName,\n tools: props.tools,\n mcpClients,\n verbose,\n safeMode,\n messages,\n setToolJSX: setToolJSXWithClear,\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 staticItemsRef = useRef<TranscriptItem[]>([])\n const printedKeysRef = useRef<Set<string>>(new Set())\n const lastForkNumberRef = useRef<number>(forkNumber)\n\n const staticItems = useMemo(() => {\n // Reset when forkNumber changes (conversation fork)\n if (lastForkNumberRef.current !== forkNumber) {\n lastForkNumberRef.current = forkNumber\n staticItemsRef.current = []\n printedKeysRef.current = new Set()\n }\n\n const items: TranscriptItem[] = []\n\n // Always include logo as first item\n const logoKey = `logo-${forkNumber}`\n items.push({\n key: logoKey,\n jsx: (\n <Box flexDirection=\"column\" key={logoKey}>\n <Logo\n mcpClients={mcpClients}\n isDefaultModel={isDefaultModel}\n updateBannerVersion={updateAvailableVersion}\n updateBannerCommands={updateCommands}\n />\n <ProjectOnboarding workspaceDir={getOriginalCwd()} />\n </Box>\n ),\n })\n\n items.push(...transcript.items.slice(0, transcript.replStaticPrefixLength))\n\n // Only add items that haven't been printed yet\n const newItems: TranscriptItem[] = []\n for (const item of items) {\n if (!printedKeysRef.current.has(item.key)) {\n printedKeysRef.current.add(item.key)\n newItems.push(item)\n }\n }\n\n // Append new items to the stable array\n if (newItems.length > 0) {\n staticItemsRef.current = [...staticItemsRef.current, ...newItems]\n }\n\n return staticItemsRef.current\n }, [\n forkNumber,\n isDefaultModel,\n mcpClients,\n transcript.items,\n transcript.replStaticPrefixLength,\n updateAvailableVersion,\n updateCommands,\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 = getGlobalConfigCached()\n saveGlobalConfig({ ...projectConfig, hasAcknowledgedCostThreshold: true })\n }, [])\n\n const promptInputProps = buildPromptInputProps({\n commands,\n forkNumber,\n messageLogName: props.messageLogName,\n initialPrompt: props.initialPrompt,\n tools: props.tools,\n disableSlashCommands,\n isDisabled: apiKeyStatus !== 'valid',\n isLoading,\n onQuery,\n debug,\n verbose,\n messages,\n setToolJSX: setToolJSXWithClear,\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 onManageTasks: openTasksScreen,\n restorePastes,\n onRestorePastesApplied: id => {\n setRestorePastes(prev => {\n if (!prev) return prev\n if (prev.id !== id) return prev\n return undefined\n })\n },\n draftPastes,\n onDraftPastesChange: setDraftPastes,\n })\n\n const handleMessageSelectorSelect = useMessageSelectorSelect({\n messages,\n setIsMessageSelectorVisible,\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 toast,\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 { 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'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { KEYPRESS_PRIORITY } from '#ui-ink/constants/keypressPriority'\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 useKeypress(\n (_, 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 return true\n },\n { priority: KEYPRESS_PRIORITY.REPL_CONTROLLER + 1 },\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 { 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'\nimport type { UnreachablePermissionRuleWarning } from '#core/permissions'\nimport { findUnreachablePermissionRules } from '#core/permissions'\nimport {\n resolveToolDescription,\n type Tool as ToolType,\n type ToolUseContext,\n} from '#core/tooling/Tool'\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 options?: {\n onPermissionRuleWarnings?: (\n warnings: UnreachablePermissionRuleWarning[],\n ) => void\n },\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 resolveToolDescription(tool, input as never),\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 blockedPath:\n typeof deniedResult.blockedPath === 'string'\n ? deniedResult.blockedPath\n : undefined,\n decisionReason:\n typeof deniedResult.decisionReason === 'string'\n ? deniedResult.decisionReason\n : undefined,\n riskScore:\n typeof deniedResult.riskScore === 'number'\n ? deniedResult.riskScore\n : null,\n onAbort() {\n logCancelledEvent()\n resolveWithCancelledAndAbortAllToolCalls()\n },\n onAllow(type) {\n if (type === 'permanent') {\n const ctx = toolUseContext.options?.toolPermissionContext\n if (ctx) {\n const warnings = findUnreachablePermissionRules(ctx)\n if (warnings.length > 0) {\n options?.onPermissionRuleWarnings?.(warnings)\n }\n }\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 React, { useCallback, useMemo, useRef } from 'react'\nimport { Box, Text } from 'ink'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\nimport { getTheme } from '#core/utils/theme'\nimport { getPermissionModeCycleShortcut } from '#ui-ink/utils/permissionModeCycleShortcut'\n\ntype Props = {\n onDone: () => void\n}\n\nexport function ShortcutsScreen({ onDone }: Props): React.ReactNode {\n const theme = getTheme()\n const layout = useScreenLayout()\n const exitState = { pending: false, keyName: null } as const\n const didDoneRef = useRef(false)\n\n const safeOnDone = useCallback(() => {\n if (didDoneRef.current) return\n didDoneRef.current = true\n onDone()\n }, [onDone])\n\n const modeCycleShortcut = useMemo(() => getPermissionModeCycleShortcut(), [])\n\n useKeypress((input, key) => {\n const inputChar = input.length === 1 ? input : ''\n if (key.escape || inputChar === '?' || (key.ctrl && inputChar === 'c')) {\n safeOnDone()\n return true\n }\n })\n\n const leftWidth = 22\n const middleWidth = 35\n\n return (\n <ScreenFrame\n title=\"Shortcuts\"\n exitState={exitState}\n paddingX={layout.paddingX}\n paddingY={layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"row\" gap={Math.max(2, layout.gap)} paddingX={1}>\n <Box flexDirection=\"column\" width={leftWidth}>\n <Text dimColor>! for bash mode</Text>\n <Text dimColor>/ for commands</Text>\n <Text dimColor>@ for file paths</Text>\n <Text dimColor>&amp; for background</Text>\n <Text dimColor>ctrl/opt + b bash mode</Text>\n </Box>\n\n <Box flexDirection=\"column\" width={middleWidth}>\n <Text dimColor>double tap esc to clear input</Text>\n <Text dimColor>\n {modeCycleShortcut.displayText.replace('+', ' + ')} to auto-accept\n edits\n </Text>\n <Text dimColor>ctrl + o for transcript output</Text>\n <Text dimColor>ctrl + t to show todos</Text>\n <Text dimColor>shift/ctrl + enter newline</Text>\n </Box>\n\n <Box flexDirection=\"column\">\n <Text dimColor>ctrl + _ to undo</Text>\n <Text dimColor>ctrl + v to paste images</Text>\n <Text dimColor>ctrl/opt + m switch model</Text>\n <Text dimColor>ctrl/opt + g ext editor</Text>\n <Text dimColor>\n <Text color={theme.secondaryText}>Esc</Text> to close\n </Text>\n </Box>\n </Box>\n </ScreenFrame>\n )\n}\n", "import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { Box, Text } from 'ink'\nimport figures from 'figures'\nimport { getTheme } from '#core/utils/theme'\nimport TextInput from '#ui-ink/components/TextInput'\nimport type { Key } from '#ui-ink/hooks/useKeypress'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\n\ntype PaletteAction = {\n id:\n | 'help'\n | 'config'\n | 'open'\n | 'console'\n | 'notifications'\n | 'transcript'\n | 'model'\n | 'doctor'\n label: string\n hint?: string\n shortcut?: string\n}\n\nconst VIEWPORT_SAFE_MARGIN_ROWS = 1\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n\nfunction getDefaultActions(): PaletteAction[] {\n return [\n {\n id: 'help',\n label: 'Help',\n shortcut: 'F1',\n hint: 'Keybindings and commands',\n },\n { id: 'config', label: 'Config', shortcut: 'F2', hint: 'Global settings' },\n {\n id: 'open',\n label: 'Open File',\n shortcut: 'F3',\n hint: 'Quick open + external editor',\n },\n {\n id: 'console',\n label: 'Console',\n shortcut: 'F4',\n hint: 'Captured stdout/stderr (TUI guard)',\n },\n {\n id: 'notifications',\n label: 'Notifications',\n shortcut: 'F5',\n hint: 'In-app inbox',\n },\n {\n id: 'transcript',\n label: 'Transcript',\n shortcut: 'F6',\n hint: 'Scroll + copy conversation',\n },\n { id: 'model', label: 'Models', hint: 'Provider + model settings' },\n { id: 'doctor', label: 'Doctor', hint: 'Terminal capability check' },\n ]\n}\n\nfunction normalizeQuery(value: string): string {\n return value.trim().toLowerCase()\n}\n\nfunction matchesQuery(action: PaletteAction, query: string): boolean {\n if (!query) return true\n const haystack = `${action.id} ${action.label} ${action.hint ?? ''} ${\n action.shortcut ?? ''\n }`.toLowerCase()\n return haystack.includes(query)\n}\n\nexport function CommandPaletteScreen({\n onDone,\n}: {\n onDone: (result?: PaletteAction['id']) => void\n}): React.ReactNode {\n const theme = getTheme()\n const layout = useScreenLayout()\n const { rows, columns } = layout\n const exitState = { pending: false, keyName: null } as const\n\n const paddingY = layout.paddingY\n const gap = layout.gap\n const paddingX = layout.paddingX\n\n const [query, setQuery] = useState('')\n const [cursorOffset, setCursorOffset] = useState(0)\n const [focusedIndex, setFocusedIndex] = useState(0)\n const [status, setStatus] = useState<string | null>(null)\n\n const actions = useMemo(() => getDefaultActions(), [])\n const normalizedQuery = useMemo(() => normalizeQuery(query), [query])\n const filtered = useMemo(\n () => actions.filter(action => matchesQuery(action, normalizedQuery)),\n [actions, normalizedQuery],\n )\n\n useEffect(() => {\n setFocusedIndex(prev => clamp(prev, 0, Math.max(0, filtered.length - 1)))\n }, [filtered.length])\n\n const headerRows = 4\n const footerRows = 1\n const reservedLines =\n (layout.tightLayout ? 8 : layout.compactLayout ? 10 : 12) +\n paddingY * 2 +\n gap * 4\n const availableForList = Math.max(\n 3,\n rows - reservedLines - headerRows - footerRows - VIEWPORT_SAFE_MARGIN_ROWS,\n )\n const visibleOptionCount = Math.max(\n 3,\n Math.min(10, filtered.length || 10, availableForList),\n )\n\n const clampedFocus =\n filtered.length === 0 ? 0 : clamp(focusedIndex, 0, filtered.length - 1)\n const half = Math.floor(visibleOptionCount / 2)\n const start = Math.max(\n 0,\n Math.min(\n clampedFocus - half,\n Math.max(0, filtered.length - visibleOptionCount),\n ),\n )\n const end = Math.min(filtered.length, start + visibleOptionCount)\n const showUp = start > 0\n const showDown = end < filtered.length\n\n const runSelection = useCallback(() => {\n const action = filtered[clampedFocus]\n if (!action) {\n setStatus(filtered.length === 0 ? 'No matches' : 'Nothing selected')\n return\n }\n onDone(action.id)\n }, [clampedFocus, filtered, onDone])\n\n const onSpecialKey = useCallback(\n (_input: string, key: Key): boolean => {\n if (key.escape) {\n onDone()\n return true\n }\n\n if (key.return) {\n runSelection()\n return true\n }\n\n const inputChar = _input.length === 1 ? _input : ''\n const isUp =\n key.upArrow || (key.ctrl && (inputChar === 'p' || inputChar === 'k'))\n const isDown =\n key.downArrow || (key.ctrl && (inputChar === 'n' || inputChar === 'j'))\n\n if (filtered.length === 0) {\n if (\n isUp ||\n isDown ||\n key.pageUp ||\n key.pageDown ||\n key.home ||\n key.end\n ) {\n return true\n }\n return false\n }\n\n if (isUp) {\n setFocusedIndex(prev => clamp(prev - 1, 0, filtered.length - 1))\n return true\n }\n if (isDown) {\n setFocusedIndex(prev => clamp(prev + 1, 0, filtered.length - 1))\n return true\n }\n if (key.pageUp) {\n setFocusedIndex(prev =>\n clamp(prev - visibleOptionCount, 0, filtered.length - 1),\n )\n return true\n }\n if (key.pageDown) {\n setFocusedIndex(prev =>\n clamp(prev + visibleOptionCount, 0, filtered.length - 1),\n )\n return true\n }\n if (key.home || (key.ctrl && inputChar === 'a')) {\n setFocusedIndex(0)\n return true\n }\n if (key.end || (key.ctrl && inputChar === 'e')) {\n setFocusedIndex(filtered.length - 1)\n return true\n }\n\n return false\n },\n [filtered.length, onDone, runSelection, visibleOptionCount],\n )\n\n const visible = useMemo(\n () => filtered.slice(start, end),\n [end, filtered, start],\n )\n const selected = filtered[clampedFocus]\n\n return (\n <ScreenFrame\n title=\"Command Palette\"\n exitState={exitState}\n paddingX={paddingX}\n paddingY={paddingY}\n gap={gap}\n >\n <Box flexDirection=\"column\" gap={gap}>\n <Box flexDirection=\"column\">\n <Text dimColor wrap=\"truncate-end\">\n Type to filter. Enter to run. Esc to close.\n </Text>\n <Box flexDirection=\"row\" gap={1}>\n <Text color={theme.secondaryText}>{figures.pointerSmall}</Text>\n <TextInput\n placeholder=\"Search\u2026\"\n value={query}\n onChange={value => {\n setQuery(value)\n setCursorOffset(value.length)\n setStatus(null)\n }}\n onSubmit={() => runSelection()}\n onExit={() => onDone()}\n columns={Math.max(10, columns - paddingX * 2 - 4)}\n cursorOffset={cursorOffset}\n onChangeCursorOffset={setCursorOffset}\n showCursor={true}\n focus={true}\n disableCursorMovementForUpDownKeys={true}\n onSpecialKey={onSpecialKey}\n />\n </Box>\n </Box>\n\n <Box flexDirection=\"column\" gap={0}>\n <Text dimColor wrap=\"truncate-end\">\n {status ??\n (filtered.length === 0\n ? 'No matches'\n : `Showing ${visible.length} of ${filtered.length}`)}\n </Text>\n <Box flexDirection=\"column\" width=\"100%\">\n <Text dimColor wrap=\"truncate-end\">\n {showUp ? `${figures.arrowUp} More` : ' '}\n </Text>\n {visible.map((action, idx) => {\n const absoluteIndex = start + idx\n const isFocused = absoluteIndex === clampedFocus\n const suffix = action.shortcut ? ` \u00B7 ${action.shortcut}` : ''\n return (\n <Box key={action.id} flexDirection=\"row\" gap={1}>\n <Text color={isFocused ? theme.kode : theme.secondaryText}>\n {isFocused ? figures.pointer : ' '}\n </Text>\n <Text\n color={isFocused ? theme.text : theme.secondaryText}\n bold={isFocused}\n wrap=\"truncate-end\"\n >\n {action.label}\n {suffix}\n </Text>\n </Box>\n )\n })}\n <Text dimColor wrap=\"truncate-end\">\n {showDown ? `${figures.arrowDown} More` : ' '}\n </Text>\n </Box>\n </Box>\n\n {selected ? (\n <Box flexDirection=\"column\">\n <Text color={theme.secondaryText} wrap=\"truncate-end\">\n {selected.hint ?? ''}\n </Text>\n </Box>\n ) : null}\n\n <Box marginTop={layout.tightLayout ? 0 : 1}>\n <Text dimColor wrap=\"truncate-end\">\n \u2191/\u2193 \u00B7 PgUp/PgDn \u00B7 Home/End \u00B7 Enter run \u00B7 Esc close\n </Text>\n </Box>\n </Box>\n </ScreenFrame>\n )\n}\n", "import React, { useCallback, useMemo, useState } from 'react'\nimport { Box, Text } from 'ink'\nimport figures from 'figures'\n\nimport { getGlobalHistoryWithPastes } from '#core/history'\nimport { getTheme } from '#core/utils/theme'\nimport TextInput from '#ui-ink/components/TextInput'\nimport type { Key } from '#ui-ink/hooks/useKeypress'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { KEYPRESS_PRIORITY } from '#ui-ink/constants/keypressPriority'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\n\nfunction normalizeQuery(value: string): string {\n return value.trim().toLowerCase()\n}\n\nfunction matchesQuery(haystack: string, query: string): boolean {\n if (!query) return true\n return haystack.toLowerCase().includes(query)\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n\nexport type HistorySearchDoneResult =\n | {\n action: 'accept'\n value: string\n pastedTexts: Array<{ placeholder: string; text: string }>\n }\n | {\n action: 'execute'\n value: string\n pastedTexts: Array<{ placeholder: string; text: string }>\n }\n | { action: 'cancel' }\n\nexport function HistorySearchScreen({\n onDone,\n}: {\n onDone: (result: HistorySearchDoneResult) => void\n}): React.ReactNode {\n const theme = getTheme()\n const layout = useScreenLayout()\n const exitState = { pending: false, keyName: null } as const\n\n const [query, setQuery] = useState('')\n const [cursorOffset, setCursorOffset] = useState(0)\n const [selectedIndex, setSelectedIndex] = useState(0)\n const [status, setStatus] = useState<string | null>(null)\n\n const normalizedQuery = useMemo(() => normalizeQuery(query), [query])\n const history = useMemo(() => getGlobalHistoryWithPastes(), [])\n const filtered = useMemo(\n () => history.filter(item => matchesQuery(item.display, normalizedQuery)),\n [history, normalizedQuery],\n )\n\n const clampedSelection = filtered.length\n ? clamp(selectedIndex, 0, filtered.length - 1)\n : 0\n\n const acceptSelection = useCallback(() => {\n const selected = filtered[clampedSelection]\n if (!selected) {\n setStatus(filtered.length === 0 ? 'No matches' : 'Nothing selected')\n return\n }\n onDone({\n action: 'accept',\n value: selected.display,\n pastedTexts: selected.pastedTexts,\n })\n }, [clampedSelection, filtered, onDone])\n\n const executeSelection = useCallback(() => {\n const selected = filtered[clampedSelection]\n if (!selected) {\n setStatus(filtered.length === 0 ? 'No matches' : 'Nothing selected')\n return\n }\n onDone({\n action: 'execute',\n value: selected.display,\n pastedTexts: selected.pastedTexts,\n })\n }, [clampedSelection, filtered, onDone])\n\n const cycleNext = useCallback(() => {\n if (filtered.length === 0) return\n setSelectedIndex(prev => (prev + 1) % filtered.length)\n }, [filtered.length])\n\n const onSpecialKey = useCallback(\n (input: string, key: Key): boolean => {\n const inputChar = input.length === 1 ? input : ''\n\n if (key.ctrl && inputChar === 'c') {\n onDone({ action: 'cancel' })\n return true\n }\n\n if (key.ctrl && key.return) {\n executeSelection()\n return true\n }\n\n if (key.tab) {\n acceptSelection()\n return true\n }\n\n if (key.return) {\n acceptSelection()\n return true\n }\n\n if (key.ctrl && inputChar === 'r') {\n cycleNext()\n return true\n }\n\n if (key.escape) {\n if (query.trim()) {\n setQuery('')\n setCursorOffset(0)\n setSelectedIndex(0)\n setStatus(null)\n return true\n }\n onDone({ action: 'cancel' })\n return true\n }\n\n if (key.upArrow) {\n if (filtered.length === 0) return true\n setSelectedIndex(prev => clamp(prev - 1, 0, filtered.length - 1))\n return true\n }\n if (key.downArrow) {\n if (filtered.length === 0) return true\n setSelectedIndex(prev => clamp(prev + 1, 0, filtered.length - 1))\n return true\n }\n\n return false\n },\n [\n acceptSelection,\n cycleNext,\n executeSelection,\n filtered.length,\n onDone,\n query,\n ],\n )\n\n useKeypress(\n (input, key) => {\n if (key.ctrl && input === 'c') {\n onDone({ action: 'cancel' })\n return true\n }\n },\n { priority: KEYPRESS_PRIORITY.FULLSCREEN_OVERLAY },\n )\n\n const shortcutLine =\n 'Type to filter \u00B7 \u2191/\u2193 select \u00B7 Enter accept \u00B7 Ctrl+Enter execute \u00B7 Esc clear/back \u00B7 Ctrl+R next \u00B7 Ctrl+C cancel'\n\n return (\n <ScreenFrame\n title=\"History Search\"\n exitState={exitState}\n paddingX={layout.paddingX}\n paddingY={layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Text dimColor wrap=\"truncate-end\">\n {shortcutLine}\n </Text>\n\n <Box flexDirection=\"row\" gap={1}>\n <Text color={theme.secondaryText}>{figures.pointerSmall}</Text>\n <TextInput\n placeholder=\"Search history\u2026\"\n value={query}\n onChange={value => {\n setQuery(value)\n setCursorOffset(value.length)\n setStatus(null)\n setSelectedIndex(0)\n }}\n onSubmit={() => acceptSelection()}\n onExit={() => onDone({ action: 'cancel' })}\n columns={Math.max(10, layout.columns - layout.paddingX * 2 - 4)}\n cursorOffset={cursorOffset}\n onChangeCursorOffset={setCursorOffset}\n showCursor={true}\n focus={true}\n disableCursorMovementForUpDownKeys={true}\n onSpecialKey={onSpecialKey}\n />\n </Box>\n\n <Box flexDirection=\"column\">\n <Text dimColor wrap=\"truncate-end\">\n {status ??\n (filtered.length === 0\n ? 'No matches'\n : `Showing ${filtered.length} matches`)}\n </Text>\n\n {filtered.length > 0 ? (\n filtered.slice(0, 12).map((item, idx) => {\n const isSelected = idx === clampedSelection\n return (\n <Text\n key={`${idx}:${item.display}`}\n color={isSelected ? theme.text : theme.secondaryText}\n wrap=\"truncate-end\"\n bold={isSelected}\n >\n {isSelected ? figures.pointer : ' '} {item.display}\n </Text>\n )\n })\n ) : (\n <Text dimColor>(empty)</Text>\n )}\n </Box>\n\n <Text dimColor wrap=\"truncate-end\">\n Tip: history includes bash commands with a leading `!`\n </Text>\n </Box>\n </ScreenFrame>\n )\n}\n", "import React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport { Box, Text } from 'ink'\nimport figures from 'figures'\n\nimport { getModelManager } from '#core/utils/model'\nimport { getTheme } from '#core/utils/theme'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { KEYPRESS_PRIORITY } from '#ui-ink/constants/keypressPriority'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n\nexport function ModelPickerScreen({\n onDone,\n onSelectModel,\n}: {\n onDone: () => void\n onSelectModel: (modelName: string) => void\n}): React.ReactNode {\n const theme = getTheme()\n const layout = useScreenLayout()\n const exitState = { pending: false, keyName: null } as const\n\n const modelManager = useMemo(() => getModelManager(), [])\n const currentMainModelName = modelManager.getModelName('main')\n const models = useMemo(\n () => modelManager.getAllConfiguredModels(),\n [modelManager],\n )\n\n const initialIndex = useMemo(() => {\n if (!currentMainModelName) return 0\n const idx = models.findIndex(m => m.modelName === currentMainModelName)\n return idx >= 0 ? idx : 0\n }, [currentMainModelName, models])\n\n const [selectedIndex, setSelectedIndex] = useState(initialIndex)\n const [status, setStatus] = useState<string | null>(null)\n\n useEffect(() => {\n setSelectedIndex(prev => clamp(prev, 0, Math.max(0, models.length - 1)))\n }, [models.length])\n\n const confirm = useCallback(() => {\n const selected = models[selectedIndex]\n if (!selected) {\n setStatus(\n models.length === 0 ? 'No models configured' : 'Nothing selected',\n )\n return\n }\n onSelectModel(selected.modelName)\n onDone()\n }, [models, onDone, onSelectModel, selectedIndex])\n\n useKeypress(\n (input, key) => {\n const inputChar = input.length === 1 ? input : ''\n\n if (\n key.escape ||\n (key.ctrl && inputChar === 'c') ||\n (key.meta && inputChar === 'p')\n ) {\n onDone()\n return true\n }\n\n if (key.return) {\n confirm()\n return true\n }\n\n if (key.upArrow || inputChar === 'k') {\n setSelectedIndex(prev =>\n clamp(prev - 1, 0, Math.max(0, models.length - 1)),\n )\n return true\n }\n\n if (key.downArrow || inputChar === 'j') {\n setSelectedIndex(prev =>\n clamp(prev + 1, 0, Math.max(0, models.length - 1)),\n )\n return true\n }\n\n return\n },\n { priority: KEYPRESS_PRIORITY.FULLSCREEN_OVERLAY },\n )\n\n const shortcutLine = '\u2191/\u2193 select \u00B7 Enter apply \u00B7 Esc/Ctrl+C close'\n\n return (\n <ScreenFrame\n title=\"Model Picker\"\n exitState={exitState}\n paddingX={layout.paddingX}\n paddingY={layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Text dimColor wrap=\"truncate-end\">\n {shortcutLine}\n </Text>\n\n <Text dimColor wrap=\"truncate-end\">\n {status ??\n (models.length > 0\n ? `Current: ${currentMainModelName ?? '(none)'}`\n : 'No models configured. Use /model to add models.')}\n </Text>\n\n <Box flexDirection=\"column\">\n {models.length > 0 ? (\n models.slice(0, 16).map((model, idx) => {\n const isSelected = idx === selectedIndex\n const label = `${model.name} (${model.provider}) \u00B7 ${model.modelName}${\n model.isActive ? '' : ' (inactive)'\n }`\n return (\n <Text\n key={model.modelName}\n color={isSelected ? theme.text : theme.secondaryText}\n bold={isSelected}\n wrap=\"truncate-end\"\n >\n {isSelected ? figures.pointer : ' '} {label}\n </Text>\n )\n })\n ) : (\n <Text dimColor>(empty)</Text>\n )}\n </Box>\n </Box>\n </ScreenFrame>\n )\n}\n", "import React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport { Box, Text } from 'ink'\nimport figures from 'figures'\n\nimport { getTheme } from '#core/utils/theme'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { KEYPRESS_PRIORITY } from '#ui-ink/constants/keypressPriority'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\n\ntype ThinkingToggleOption = {\n value: boolean\n label: string\n description: string\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n\nexport function ThinkingToggleScreen({\n currentValue,\n isMidConversation,\n onSelect,\n onDone,\n}: {\n currentValue: boolean\n isMidConversation: boolean\n onSelect: (value: boolean) => void\n onDone: () => void\n}): React.ReactNode {\n const theme = getTheme()\n const layout = useScreenLayout()\n const exitState = { pending: false, keyName: null } as const\n\n const options: ThinkingToggleOption[] = useMemo(\n () => [\n {\n value: true,\n label: 'Enabled',\n description: 'The model will think before responding',\n },\n {\n value: false,\n label: 'Disabled',\n description: 'The model will respond without extended thinking',\n },\n ],\n [],\n )\n\n const initialIndex = currentValue ? 0 : 1\n const [selectedIndex, setSelectedIndex] = useState(initialIndex)\n\n useEffect(() => {\n setSelectedIndex(prev => clamp(prev, 0, Math.max(0, options.length - 1)))\n }, [options.length])\n\n const confirm = useCallback(() => {\n const option = options[selectedIndex]\n if (!option) return\n onSelect(option.value)\n onDone()\n }, [onDone, onSelect, options, selectedIndex])\n\n useKeypress(\n (input, key) => {\n const inputChar = input.length === 1 ? input : ''\n\n if (\n key.escape ||\n (key.ctrl && inputChar === 'c') ||\n (key.meta && inputChar === 't')\n ) {\n onDone()\n return true\n }\n\n if (key.return) {\n confirm()\n return true\n }\n\n if (key.upArrow || inputChar === 'k') {\n setSelectedIndex(prev =>\n clamp(prev - 1, 0, Math.max(0, options.length - 1)),\n )\n return true\n }\n\n if (key.downArrow || inputChar === 'j') {\n setSelectedIndex(prev =>\n clamp(prev + 1, 0, Math.max(0, options.length - 1)),\n )\n return true\n }\n\n return\n },\n { priority: KEYPRESS_PRIORITY.FULLSCREEN_OVERLAY },\n )\n\n const shortcutLine = '\u2191/\u2193 select \u00B7 Enter confirm \u00B7 Esc/Ctrl+C close'\n\n return (\n <ScreenFrame\n title=\"Toggle thinking mode\"\n exitState={exitState}\n paddingX={layout.paddingX}\n paddingY={layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Text dimColor wrap=\"truncate-end\">\n {shortcutLine}\n </Text>\n\n <Box flexDirection=\"column\">\n <Text dimColor wrap=\"truncate-end\">\n Enable or disable thinking for this session.\n </Text>\n {isMidConversation && (\n <Text color={theme.warning}>\n Changing mid-conversation may reduce quality. For best results,\n set this at the start of a session.\n </Text>\n )}\n </Box>\n\n <Box flexDirection=\"column\">\n {options.map((option, idx) => {\n const isSelected = idx === selectedIndex\n return (\n <Text\n key={option.label}\n color={isSelected ? theme.text : theme.secondaryText}\n bold={isSelected}\n wrap=\"truncate-end\"\n >\n {isSelected ? figures.pointer : ' '} {option.label} \u2014{' '}\n {option.description}\n </Text>\n )\n })}\n </Box>\n </Box>\n </ScreenFrame>\n )\n}\n", "import { Box } from 'ink'\nimport type {\n TextBlock,\n ToolUseBlockParam,\n} from '@anthropic-ai/sdk/resources/index.mjs'\nimport * as React from 'react'\nimport { useMemo, useRef } 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 type { UUID } from '#core/types/common'\nimport { getReplStaticPrefixLength } from '#cli-utils/replStaticSplit'\nimport { findSafeSplitPoint } from '#cli-utils/markdownSplit'\n\nconst MAX_TRANSIENT_TAIL_LENGTH = 2000\nconst MIN_TRANSIENT_CHUNK_LENGTH = 400\n\ntype ChunkState = {\n chunks: string[]\n prefixText: string\n}\n\ntype RenderMessage = {\n message: NormalizedMessage\n key: string\n isTransient: boolean\n}\n\nfunction cloneAssistantTextMessage(\n message: NormalizedMessage,\n text: string,\n uuid: UUID,\n includeCost: boolean,\n): NormalizedMessage {\n const assistant = message as Extract<NormalizedMessage, { type: 'assistant' }>\n const baseContent = Array.isArray(assistant.message.content)\n ? assistant.message.content[0]\n : {\n type: 'text',\n text: String(assistant.message.content ?? ''),\n citations: [],\n }\n const textBlock: TextBlock = {\n ...(baseContent as TextBlock),\n citations: (baseContent as TextBlock).citations ?? [],\n text,\n }\n\n return {\n ...assistant,\n uuid,\n costUSD: includeCost ? assistant.costUSD : 0,\n durationMs: includeCost ? assistant.durationMs : 0,\n message: {\n ...assistant.message,\n content: [textBlock],\n },\n }\n}\n\nfunction isAssistantTextMessage(message: NormalizedMessage): boolean {\n if (message.type !== 'assistant') return false\n if (!Array.isArray(message.message.content)) return false\n return message.message.content[0]?.type === 'text'\n}\n\nfunction splitTransientTextMessage(\n message: NormalizedMessage,\n chunkState: Map<string, ChunkState>,\n): { chunks: string[]; tail: string } | null {\n if (!isAssistantTextMessage(message)) return null\n\n const assistant = message as Extract<NormalizedMessage, { type: 'assistant' }>\n const text = (assistant.message.content[0] as TextBlock).text ?? ''\n const existing = chunkState.get(message.uuid)\n const prefixText = existing?.prefixText ?? ''\n\n if (prefixText && !text.startsWith(prefixText)) {\n chunkState.delete(message.uuid)\n }\n\n const state = chunkState.get(message.uuid) ?? { chunks: [], prefixText: '' }\n let tail = text.slice(state.prefixText.length)\n let didUpdate = false\n\n while (tail.length > MAX_TRANSIENT_TAIL_LENGTH + MIN_TRANSIENT_CHUNK_LENGTH) {\n const splitAt = findSafeSplitPoint(\n tail,\n tail.length - MAX_TRANSIENT_TAIL_LENGTH,\n )\n if (splitAt <= 0) break\n const chunk = tail.slice(0, splitAt)\n if (chunk.length < MIN_TRANSIENT_CHUNK_LENGTH) break\n state.chunks.push(chunk)\n state.prefixText += chunk\n tail = tail.slice(splitAt)\n didUpdate = true\n }\n\n if (state.chunks.length === 0) {\n chunkState.delete(message.uuid)\n return null\n }\n\n if (didUpdate || !existing) {\n chunkState.set(message.uuid, state)\n }\n\n return { chunks: state.chunks, tail }\n}\n\nexport type TranscriptItem = { jsx: ReactNode; key: string }\n\nexport function useTranscriptItems(args: {\n messages: MessageType[]\n tools: Tool[]\n verbose: boolean\n debug: boolean\n toolJSX: {\n jsx: ReactNode | null\n shouldHidePromptInput: boolean\n displayMode?: 'inline' | 'fullscreen'\n } | 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 chunkStateRef = useRef<Map<string, ChunkState>>(new Map())\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 chunked = useMemo(() => {\n const chunkState = chunkStateRef.current\n const activeIds = new Set<string>(\n orderedMessages.map(message => message.uuid),\n )\n for (const key of chunkState.keys()) {\n if (!activeIds.has(key)) {\n chunkState.delete(key)\n }\n }\n\n const renderMessages: RenderMessage[] = []\n let staticPrefixExtra = 0\n\n orderedMessages.forEach((message, index) => {\n if (index < replStaticPrefixLength) {\n chunkState.delete(message.uuid)\n renderMessages.push({\n message,\n key: message.uuid,\n isTransient: false,\n })\n return\n }\n\n if (index === replStaticPrefixLength) {\n const split = splitTransientTextMessage(message, chunkState)\n if (split) {\n const { chunks, tail } = split\n const tailHasContent = tail.length > 0\n\n chunks.forEach((chunk, chunkIndex) => {\n const isLastChunk = chunkIndex === chunks.length - 1\n const includeCost = !tailHasContent && isLastChunk\n const chunkMessage = cloneAssistantTextMessage(\n message,\n chunk,\n `${message.uuid}:chunk:${chunkIndex}`,\n includeCost,\n )\n renderMessages.push({\n message: chunkMessage,\n key: chunkMessage.uuid,\n isTransient: false,\n })\n })\n\n staticPrefixExtra += chunks.length\n\n if (tailHasContent) {\n const tailMessage = cloneAssistantTextMessage(\n message,\n tail,\n `${message.uuid}:tail`,\n true,\n )\n renderMessages.push({\n message: tailMessage,\n key: tailMessage.uuid,\n isTransient: true,\n })\n }\n return\n }\n }\n\n renderMessages.push({\n message,\n key: message.uuid,\n isTransient: true,\n })\n })\n\n return {\n renderMessages,\n replStaticPrefixLength: replStaticPrefixLength + staticPrefixExtra,\n }\n }, [orderedMessages, replStaticPrefixLength])\n\n const items = useMemo(() => {\n return chunked.renderMessages.map(\n ({ message, key, isTransient }, index) => {\n const toolUseID = getToolUseID(message)\n const isInStaticPrefix = index < chunked.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 isTransient={isTransient}\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 (\n message.content.message\n .content[0]! as ToolUseBlockParam\n ).id,\n ])\n }\n shouldAnimate={false}\n shouldShowDot={false}\n isTransient={isTransient}\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 isTransient={isTransient}\n />\n )\n\n if (args.debug) {\n return {\n key,\n jsx: (\n <Box\n borderStyle=\"single\"\n borderColor={isInStaticPrefix ? 'green' : 'red'}\n key={key}\n width=\"100%\"\n >\n {rendered}\n </Box>\n ),\n }\n }\n\n return {\n key,\n jsx: (\n <Box key={key} width=\"100%\">\n {rendered}\n </Box>\n ),\n }\n },\n )\n }, [\n args.debug,\n args.isMessageSelectorVisible,\n args.toolJSX,\n args.toolUseConfirm,\n args.tools,\n args.verbose,\n chunked.renderMessages,\n chunked.replStaticPrefixLength,\n erroredToolUseIDs,\n inProgressToolUseIDs,\n normalizedMessages,\n unresolvedToolUseIDs,\n ])\n\n return {\n normalizedMessages,\n orderedMessages,\n unresolvedToolUseIDs,\n inProgressToolUseIDs,\n erroredToolUseIDs,\n replStaticPrefixLength: chunked.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", "function isIndexInsideCodeBlock(content: string, indexToTest: number): boolean {\n let fenceCount = 0\n let searchPos = 0\n while (searchPos < content.length) {\n const nextFence = content.indexOf('```', searchPos)\n if (nextFence === -1 || nextFence >= indexToTest) {\n break\n }\n fenceCount += 1\n searchPos = nextFence + 3\n }\n return fenceCount % 2 === 1\n}\n\nfunction findEnclosingCodeBlockStart(content: string, index: number): number {\n if (!isIndexInsideCodeBlock(content, index)) {\n return -1\n }\n let searchPos = 0\n while (searchPos < index) {\n const blockStartIndex = content.indexOf('```', searchPos)\n if (blockStartIndex === -1 || blockStartIndex >= index) {\n break\n }\n const blockEndIndex = content.indexOf('```', blockStartIndex + 3)\n if (blockStartIndex < index) {\n if (blockEndIndex === -1 || index < blockEndIndex + 3) {\n return blockStartIndex\n }\n }\n if (blockEndIndex === -1) break\n searchPos = blockEndIndex + 3\n }\n return -1\n}\n\nexport function findSafeSplitPoint(content: string, maxLength: number): number {\n if (content.length <= maxLength) return content.length\n\n if (isIndexInsideCodeBlock(content, maxLength)) {\n const enclosingStart = findEnclosingCodeBlockStart(content, maxLength)\n if (enclosingStart > 0) {\n return enclosingStart\n }\n }\n\n let searchStart = Math.min(maxLength, content.length)\n while (searchStart >= 0) {\n const dnlIndex = content.lastIndexOf('\\n\\n', searchStart)\n if (dnlIndex === -1) break\n const splitPoint = dnlIndex + 2\n if (splitPoint > 0 && !isIndexInsideCodeBlock(content, splitPoint)) {\n return splitPoint\n }\n searchStart = dnlIndex - 1\n }\n\n searchStart = Math.min(maxLength, content.length)\n while (searchStart >= 0) {\n const nlIndex = content.lastIndexOf('\\n', searchStart)\n if (nlIndex === -1) break\n const splitPoint = nlIndex + 1\n if (splitPoint > 0 && !isIndexInsideCodeBlock(content, splitPoint)) {\n return splitPoint\n }\n searchStart = nlIndex - 1\n }\n\n return Math.min(maxLength, content.length)\n}\n\nexport function splitMarkdownIntoChunks(\n content: string,\n maxChunkLength: number,\n): string[] {\n if (!content) return ['']\n if (maxChunkLength <= 0 || content.length <= maxChunkLength) {\n return [content]\n }\n\n const chunks: string[] = []\n let remaining = content\n\n while (remaining.length > maxChunkLength) {\n const splitPoint = findSafeSplitPoint(remaining, maxChunkLength)\n if (splitPoint <= 0) {\n chunks.push(remaining.slice(0, maxChunkLength))\n remaining = remaining.slice(maxChunkLength)\n continue\n }\n chunks.push(remaining.slice(0, splitPoint))\n remaining = remaining.slice(splitPoint)\n }\n\n if (remaining.length > 0) {\n chunks.push(remaining)\n }\n\n return chunks\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 { getContext } from '#core/context'\nimport { getMaxThinkingTokens } from '#core/utils/thinking'\nimport { getLastAssistantMessageId } from '#core/utils/messages'\nimport { buildSystemPromptForSession, 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 systemPromptOverride?: string\n appendSystemPrompt?: string\n messages: MessageType[]\n setMessages: React.Dispatch<React.SetStateAction<MessageType[]>>\n commands: Command[]\n forkNumber: number\n messageLogName: string\n thinkingMode?: 'auto' | 'enabled' | 'disabled'\n tools: Tool[]\n mcpClients: WrappedClient[]\n verbose: boolean\n safeMode: boolean\n checkPendingForkAndSuppressAppend?: (newMessages: MessageType[]) => 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 try {\n const shouldSuppressAppend =\n args.checkPendingForkAndSuppressAppend?.(newMessages) ?? false\n if (shouldSuppressAppend) {\n args.setAbortController(null)\n args.setIsLoading(false)\n return\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 buildSystemPromptForSession({\n disableSlashCommands: args.disableSlashCommands,\n systemPromptOverride: args.systemPromptOverride,\n appendSystemPrompt: args.appendSystemPrompt,\n outputStyleActive: outputStyle !== null,\n keepCodingInstructions: outputStyle?.keepCodingInstructions,\n }),\n getContext(),\n getMaxThinkingTokens([...args.messages, lastMessage], {\n thinkingMode: args.thinkingMode,\n }),\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 agentId: 'main',\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 thinkingMode: args.thinkingMode,\n requestToolUsePermission: args.requestToolUsePermission,\n isKodingRequest: isKodingRequest || undefined,\n toolPermissionContext: getToolPermissionContextForConversationKey({\n conversationKey: `${args.messageLogName}:${args.forkNumber}`,\n isBypassPermissionsModeAvailable: !args.safeMode,\n }),\n getCustomSystemPromptAdditions:\n getOutputStyleSystemPromptAdditions,\n },\n messageId: getLastAssistantMessageId([\n ...args.messages,\n lastMessage,\n ]),\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 } catch (error) {\n logError(error)\n debugLogger.error('REPL_QUERY_ERROR', { error })\n } finally {\n // Ensure the UI never gets stuck in a \"loading\" state when a turn fails early.\n args.setIsLoading(false)\n }\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'\nimport type { SetForkConvoWithMessagesOnTheNextRender } from '#ui-ink/types/conversationReset'\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: SetForkConvoWithMessagesOnTheNextRender\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: SetForkConvoWithMessagesOnTheNextRender\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 initialPrompt?: PromptInputProps['initialPrompt']\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 onManageTasks?: PromptInputProps['onManageTasks']\n restorePastes?: PromptInputProps['restorePastes']\n onRestorePastesApplied?: PromptInputProps['onRestorePastesApplied']\n draftPastes?: PromptInputProps['draftPastes']\n onDraftPastesChange?: PromptInputProps['onDraftPastesChange']\n}): PromptInputProps {\n return {\n commands: args.commands,\n forkNumber: args.forkNumber,\n messageLogName: args.messageLogName,\n initialPrompt: args.initialPrompt,\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 onManageTasks: args.onManageTasks,\n restorePastes: args.restorePastes,\n onRestorePastesApplied: args.onRestorePastesApplied,\n draftPastes: args.draftPastes,\n onDraftPastesChange: args.onDraftPastesChange,\n }\n}\n", "import type React from 'react'\nimport { useCallback } from 'react'\nimport type { Message as MessageType } from '#core/query'\nimport type { SetForkConvoWithMessagesOnTheNextRender } from '#ui-ink/types/conversationReset'\n\nfunction getMessageUuid(message: MessageType): string | undefined {\n const record = message as unknown as { uuid?: unknown }\n return typeof record.uuid === 'string' ? record.uuid : undefined\n}\n\nfunction extractMessageText(content: unknown): string {\n if (typeof content === 'string') return content\n if (!Array.isArray(content)) return ''\n\n const parts: string[] = []\n for (const block of content) {\n if (!block || typeof block !== 'object') continue\n const record = block as Record<string, unknown>\n if (record.type !== 'text') continue\n parts.push(String(record.text ?? ''))\n }\n\n return parts.join('\\n')\n}\n\nexport function useMessageSelectorSelect(args: {\n messages: MessageType[]\n setIsMessageSelectorVisible: React.Dispatch<React.SetStateAction<boolean>>\n setForkConvoWithMessagesOnTheNextRender: SetForkConvoWithMessagesOnTheNextRender\n setInputValue: React.Dispatch<React.SetStateAction<string>>\n onCancel: () => void\n}) {\n return useCallback(\n (message: MessageType) => {\n args.setIsMessageSelectorVisible(false)\n\n const selectedUuid = getMessageUuid(message)\n const selectedIndex =\n selectedUuid === undefined\n ? args.messages.indexOf(message)\n : args.messages.findIndex(m => getMessageUuid(m) === selectedUuid)\n if (selectedIndex < 0) return\n\n args.onCancel()\n\n // Use setImmediate to ensure the \"Interrupted by user\" message renders\n // before we clear and reset the conversation\n setImmediate(() => {\n const forkMessages = args.messages\n .slice(0, selectedIndex)\n .filter(m => m.type !== 'progress')\n\n // Use clearViewport option - the fork effect will clear terminal and\n // atomically update forkNumber + messages in a single batched update.\n // This prevents intermediate renders that cause content duplication.\n args.setForkConvoWithMessagesOnTheNextRender(forkMessages, {\n clearViewport: true,\n })\n\n // Set input value to selected message content if it's a user message\n if (message.type === 'user') {\n args.setInputValue(extractMessageText(message.message.content))\n }\n })\n },\n [args],\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["React", "Box", "Text", "measureElement", "React", "useLayoutEffect", "useMemo", "useRef", "useState", "React", "Box", "Text", "React", "useCallback", "useMemo", "React", "Box", "Text", "Text", "Box", "React", "useState", "useEffect", "useState", "useEffect", "React", "React", "useMemo", "Box", "Text", "useMemo", "useCallback", "React", "Box", "Text", "Box", "Text", "React", "useMemo", "useEffect", "usePermissionRequestLogging", "useEffect", "chalk", "chalk", "useMemo", "usePermissionRequestLogging", "React", "Box", "Text", "Box", "Text", "React", "useMemo", "chalk", "useMemo", "React", "Box", "Text", "chalk", "useEffect", "useEffect", "Box", "Text", "React", "useCallback", "useMemo", "basename", "dirname", "extname", "existsSync", "chalk", "React", "existsSync", "readFileSync", "useMemo", "Box", "Text", "extname", "figures", "useMemo", "existsSync", "readFileSync", "extname", "Text", "figures", "Box", "useMemo", "dirname", "basename", "chalk", "existsSync", "extractLanguageName", "useCallback", "React", "Box", "Text", "extname", "Box", "Text", "React", "useCallback", "useMemo", "chalk", "basename", "dirname", "dirname", "React", "basename", "label", "chalk", "useMemo", "useCallback", "Box", "Text", "Box", "Text", "React", "useMemo", "chalk", "useMemo", "React", "Box", "Text", "chalk", "Box", "Text", "React", "useMemo", "chalk", "useMemo", "React", "Box", "Text", "chalk", "Box", "Text", "React", "useMemo", "chalk", "useMemo", "React", "Box", "Text", "chalk", "Box", "Text", "React", "useEffect", "useMemo", "useState", "figures", "useMemo", "useState", "useEffect", "conversationKey", "React", "Box", "Text", "figures", "React", "useCallback", "useMemo", "useState", "Box", "Text", "React", "Box", "Text", "figures", "React", "Box", "Text", "figures", "React", "Box", "Text", "figures", "React", "Box", "Text", "figures", "figures", "figures", "selectedValue", "useMemo", "useState", "useCallback", "React", "Box", "Text", "React", "memo", "useCallback", "useEffect", "useMemo", "useRef", "useState", "useCallback", "useEffect", "useRef", "useState", "useState", "useRef", "useEffect", "useCallback", "useEffect", "useRef", "useState", "useState", "useRef", "useEffect", "useCallback", "useEffect", "useState", "existsSync", "statSync", "basename", "dirname", "existsSync", "join", "join", "existsSync", "seen", "useEffect", "useState", "useState", "useEffect", "useCallback", "useEffect", "useState", "useState", "useEffect", "useCallback", "useEffect", "useState", "useState", "useCallback", "readdirSync", "statSync", "useEffect", "useEffect", "useRef", "currentWord", "wordEnd", "actualEndPos", "preview", "newInput", "isEnabled", "useState", "useCallback", "useEffect", "useCallback", "useEffect", "useMemo", "useRef", "useState", "join", "readFileSync", "writeFileSync", "join", "readFileSync", "writeFileSync", "Box", "resolve", "chalk", "React", "Box", "Text", "React", "Box", "Text", "Box", "Text", "React", "Box", "Text", "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", "wrapAnsi", "Box", "Text", "PromptInputCompletionPanel", "Box", "Text", "React", "useMemo", "useMemo", "Box", "Text", "Box", "Text", "React", "useMemo", "FIRST_LINE_PREFIX", "WRAPPED_LINE_PREFIX", "ELLIPSIS_LINE", "useMemo", "Box", "Text", "Box", "Text", "useCallback", "useState", "useState", "useCallback", "useCallback", "useCallback", "useEffect", "useState", "useRef", "useMemo", "useCallback", "message", "memo", "Box", "Text", "React", "useEffect", "useRef", "useState", "minutes", "secs", "useState", "useRef", "useEffect", "React", "Box", "Text", "Box", "Text", "React", "Text", "React", "React", "Text", "React", "Box", "Text", "React", "useCallback", "chalk", "Box", "Text", "Link", "React", "useState", "Box", "React", "React", "Text", "React", "Text", "Box", "Text", "React", "Box", "Text", "React", "React", "Text", "Text", "useMemo", "asRecord", "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", "resolve", "Box", "Text", "React", "Box", "Text", "resolve", "readFileSync", "Box", "Text", "patch", "Box", "Text", "React", "readFileSync", "extname", "isAbsolute", "relative", "resolve", "highlight", "supportsLanguage", "Text", "React", "useMemo", "useMemo", "supportsLanguage", "highlight", "React", "Text", "Box", "Text", "extname", "isAbsolute", "resolve", "readFileSync", "relative", "Box", "Text", "React", "Box", "Text", "Box", "Text", "React", "Box", "Text", "React", "useEffect", "useRef", "SPINNER_FRAMES", "React", "Box", "Text", "React", "Text", "React", "Text", "React", "useState", "useEffect", "Box", "Text", "useState", "useEffect", "React", "Box", "Text", "React", "useEffect", "useState", "useMemo", "Text", "useState", "useEffect", "useMemo", "React", "Text", "asRecord", "debug", "React", "Box", "Text", "React", "React", "Box", "Text", "React", "MAX_RENDERED_LINES", "Box", "Text", "React", "Box", "Text", "Text", "Box", "Box", "Text", "React", "useCallback", "useMemo", "useRef", "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", "React", "Box", "debug", "getOptions", "chalk", "debug", "useState", "React", "Box", "Text", "Link", "resolve", "debug", "useCallback", "React", "Box", "Text", "React", "useEffect", "useMemo", "useState", "figures", "useMemo", "useState", "useEffect", "Box", "Text", "figures", "useCallback", "useEffect", "useRef", "useRef", "useEffect", "debug", "useRef", "useState", "useLayoutEffect", "measureElement", "useMemo", "Box", "Text", "Box", "React", "useCallback", "useEffect", "useMemo", "useRef", "useState", "useEffect", "useEffect", "useRef", "useRef", "useCallback", "useCallback", "resolve", "useEffect", "useEffect", "React", "useCallback", "useMemo", "useRef", "Box", "Text", "useRef", "useCallback", "useMemo", "React", "Box", "Text", "React", "useCallback", "useEffect", "useMemo", "useState", "Box", "Text", "figures", "VIEWPORT_SAFE_MARGIN_ROWS", "useState", "useMemo", "useEffect", "useCallback", "React", "Box", "Text", "figures", "React", "useCallback", "useMemo", "useState", "Box", "Text", "figures", "normalizeQuery", "matchesQuery", "clamp", "useState", "useMemo", "useCallback", "React", "Box", "Text", "figures", "React", "useCallback", "useEffect", "useMemo", "useState", "Box", "Text", "figures", "clamp", "useMemo", "useState", "useEffect", "useCallback", "React", "Box", "Text", "figures", "React", "useCallback", "useEffect", "useMemo", "useState", "Box", "Text", "figures", "clamp", "useMemo", "useState", "useEffect", "useCallback", "React", "Box", "Text", "figures", "Box", "React", "useMemo", "useRef", "Box", "Text", "React", "useRef", "useMemo", "Box", "useCallback", "useCallback", "resolve", "useCallback", "useCallback", "useCallback", "useCallback", "useCallback", "extractMessageText", "debug", "useState", "useEffect", "semver", "useRef", "useCallback", "messages", "conversationKey", "exit", "useMemo", "Box"]
7
7
  }