@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 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../apps/cli/src/ui/components/Bug.tsx", "../../packages/core/src/utils/browser.ts", "../../apps/cli/src/commands/builtin/bug.tsx", "../../apps/cli/src/commands/builtin/clear.ts", "../../apps/cli/src/commands/builtin/compact.ts", "../../apps/cli/src/ui/screens/overlays/ConfigScreen.tsx", "../../apps/cli/src/commands/builtin/config.tsx", "../../apps/cli/src/commands/builtin/cost.ts", "../../apps/cli/src/commands/debug/ctx_viz.ts", "../../apps/cli/src/commands/builtin/add-dir.tsx", "../../apps/cli/src/ui/screens/overlays/PermissionsScreen.tsx", "../../apps/cli/src/ui/components/SearchBox.tsx", "../../apps/cli/src/commands/builtin/exit.tsx", "../../apps/cli/src/commands/builtin/doctor.ts", "../../apps/cli/src/commands/builtin/gate-dump.ts", "../../apps/cli/src/utils/externalEditor.ts", "../../apps/cli/src/ui/screens/overlays/HelpScreen.tsx", "../../apps/cli/src/utils/clipboard.ts", "../../apps/cli/src/commands/builtin/help.tsx", "../../apps/cli/src/commands/builtin/hooks.tsx", "../../apps/cli/src/ui/screens/overlays/HooksScreen.tsx", "../../apps/cli/src/commands/builtin/files.ts", "../../apps/cli/src/utils/transcriptText.ts", "../../apps/cli/src/commands/builtin/export.ts", "../../apps/cli/src/commands/builtin/skills.tsx", "../../apps/cli/src/ui/components/ProjectOnboarding.tsx", "../../packages/core/src/constants/releaseNotes.ts", "../../apps/cli/src/commands/builtin/init.ts", "../../apps/cli/src/commands/debug/listen.ts", "../../apps/cli/src/utils/replStaticSplit.ts", "../../apps/cli/src/commands/debug/messages_debug.ts", "../../apps/cli/src/commands/builtin/login.tsx", "../../apps/cli/src/ui/components/ConsoleOAuthFlow.tsx", "../../packages/core/src/services/oauth.ts", "../../packages/core/src/constants/oauth.ts", "../../apps/cli/src/ui/components/WelcomeBox.tsx", "../../apps/cli/src/ui/components/Logo.tsx", "../../packages/core/src/services/notifier.ts", "../../apps/cli/src/ui/components/ConsoleOAuthStatusMessage.tsx", "../../apps/cli/src/ui/components/Spinner.tsx", "../../apps/cli/src/ui/components/oauthTypes.ts", "../../packages/core/src/utils/auth.ts", "../../apps/cli/src/commands/builtin/logout.tsx", "../../apps/cli/src/commands/builtin/lsp.tsx", "../../apps/cli/src/ui/screens/LspStatus.tsx", "../../apps/cli/src/ui/components/PressEnterToContinue.tsx", "../../apps/cli/src/commands/mcp/mcp.ts", "../../apps/cli/src/commands/plugin/plugin.ts", "../../apps/cli/src/commands/builtin/output-style.tsx", "../../apps/cli/src/commands/builtin/permissions.tsx", "../../apps/cli/src/ui/screens/overlays/ThemePickerScreen.tsx", "../../apps/cli/src/commands/builtin/theme.tsx", "../../apps/cli/src/commands/builtin/vim.tsx", "../../apps/cli/src/commands/builtin/model.tsx", "../../apps/cli/src/ui/components/ModelConfig.tsx", "../../apps/cli/src/ui/components/ModelListManager.tsx", "../../apps/cli/src/commands/builtin/modelstatus.tsx", "../../apps/cli/src/ui/components/ModelStatusDisplay.tsx", "../../apps/cli/src/commands/builtin/onboarding.tsx", "../../apps/cli/src/commands/builtin/open.tsx", "../../apps/cli/src/ui/screens/overlays/OpenFileScreen.tsx", "../../apps/cli/src/commands/builtin/copy.ts", "../../apps/cli/src/commands/builtin/import.tsx", "../../apps/cli/src/ui/components/SessionSelector.tsx", "../../packages/protocol/src/utils/kodeAgentSessionImport.ts", "../../apps/cli/src/commands/builtin/plan.tsx", "../../apps/cli/src/commands/builtin/transcript.tsx", "../../apps/cli/src/ui/screens/overlays/TranscriptScreen.tsx", "../../apps/cli/src/commands/builtin/console.tsx", "../../apps/cli/src/ui/screens/overlays/ConsoleScreen.tsx", "../../apps/cli/src/commands/builtin/notifications.tsx", "../../apps/cli/src/ui/screens/overlays/NotificationsScreen.tsx", "../../apps/cli/src/commands/builtin/plugins.tsx", "../../apps/cli/src/ui/screens/overlays/PluginsScreen.tsx", "../../apps/cli/src/commands/builtin/pr_comments.ts", "../../apps/cli/src/commands/builtin/refreshCommands.ts", "../../apps/cli/src/commands/builtin/release-notes.ts", "../../apps/cli/src/commands/builtin/review.ts", "../../apps/cli/src/commands/builtin/rename.ts", "../../apps/cli/src/commands/builtin/resume.tsx", "../../apps/cli/src/ui/components/ResumeSessionSelector.tsx", "../../apps/cli/src/utils/switchCwdForResume.ts", "../../apps/cli/src/commands/builtin/rewind.ts", "../../apps/cli/src/commands/builtin/status.tsx", "../../apps/cli/src/ui/screens/overlays/StatusScreen.tsx", "../../apps/cli/src/commands/builtin/statusline.ts", "../../apps/cli/src/commands/builtin/capabilities.ts", "../../apps/cli/src/commands/builtin/tag.ts", "../../apps/cli/src/commands/builtin/todos.tsx", "../../apps/cli/src/ui/screens/overlays/TodosScreen.tsx", "../../apps/cli/src/commands/builtin/tasks.ts", "../../apps/cli/src/ui/screens/overlays/TasksScreen.tsx", "../../apps/cli/src/commands/builtin/terminal-setup.tsx", "../../apps/cli/src/ui/screens/overlays/TerminalSetupScreen.tsx", "../../apps/cli/src/commands/builtin/sandbox.tsx", "../../apps/cli/src/ui/screens/overlays/SandboxScreen.tsx", "../../apps/cli/src/commands/agent/agents.tsx", "../../apps/cli/src/commands/agent/agents/ui/AgentsUI.tsx", "../../apps/cli/src/commands/agent/agents/tooling.ts", "../../apps/cli/src/commands/agent/agents/storage.ts", "../../apps/cli/src/commands/agent/agents/generation.ts", "../../apps/cli/src/commands/agent/agents/ui/AgentMenu.tsx", "../../apps/cli/src/commands/agent/agents/ui/components.tsx", "../../apps/cli/src/commands/agent/agents/ui/AgentsListView.tsx", "../../apps/cli/src/commands/agent/agents/ui/utils.ts", "../../apps/cli/src/commands/agent/agents/ui/types.ts", "../../apps/cli/src/commands/agent/agents/ui/CreateAgentWizard.tsx", "../../apps/cli/src/commands/agent/agents/ui/wizard/Wizard.tsx", "../../apps/cli/src/commands/agent/agents/ui/wizard/types.ts", "../../apps/cli/src/commands/agent/agents/ui/wizard/steps/StepAgentType.tsx", "../../apps/cli/src/commands/agent/agents/ui/colors.ts", "../../apps/cli/src/commands/agent/agents/ui/wizard/steps/StepChooseColor.tsx", "../../apps/cli/src/commands/agent/agents/ui/ColorPicker.tsx", "../../apps/cli/src/commands/agent/agents/ui/wizard/steps/StepChooseLocation.tsx", "../../apps/cli/src/commands/agent/agents/ui/wizard/steps/StepChooseMethod.tsx", "../../apps/cli/src/commands/agent/agents/ui/wizard/steps/StepConfirm.tsx", "../../apps/cli/src/commands/agent/agents/ui/wizard/steps/StepDescription.tsx", "../../apps/cli/src/commands/agent/agents/ui/wizard/steps/StepGenerationPrompt.tsx", "../../apps/cli/src/commands/agent/agents/ui/wizard/steps/StepSelectModel.tsx", "../../apps/cli/src/commands/agent/agents/ui/wizard/steps/StepSelectTools.tsx", "../../apps/cli/src/commands/agent/agents/ui/wizard/ToolPicker.tsx", "../../apps/cli/src/commands/agent/agents/ui/wizard/steps/StepSystemPrompt.tsx", "../../apps/cli/src/commands/agent/agents/ui/DeleteConfirm.tsx", "../../apps/cli/src/commands/agent/agents/ui/EditAgent.tsx", "../../apps/cli/src/commands/agent/agents/ui/ViewAgent.tsx", "../../apps/cli/src/commands/builtin/parityStubs.ts", "../../apps/cli/src/commands/registry.ts"],
4
- "sourcesContent": ["import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { useState } from 'react'\n\nimport { GITHUB_ISSUES_REPO_URL } from '#core/constants/product'\nimport { MACRO } from '#core/constants/macros'\nimport { getGlobalConfig } from '#core/utils/config'\nimport { env } from '#core/utils/env'\nimport { openBrowser } from '#core/utils/browser'\nimport { getTheme } from '#core/utils/theme'\nimport { useExitOnCtrlCD } from '#ui-ink/hooks/useExitOnCtrlCD'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\n\nimport TextInput from './TextInput'\n\ntype Props = {\n onDone(result: string): void\n}\n\ntype Step = 'userInput' | 'consent'\n\nexport function Bug({ onDone }: Props): React.ReactNode {\n const theme = getTheme()\n const layout = useScreenLayout()\n const [step, setStep] = useState<Step>('userInput')\n const [cursorOffset, setCursorOffset] = useState(0)\n const [description, setDescription] = useState('')\n const textInputColumns = Math.max(\n 10,\n layout.columns - layout.paddingX * 2 - 10,\n )\n\n const exitState = useExitOnCtrlCD(() => process.exit(0))\n\n const canContinue = description.trim().length > 0\n\n useKeypress((input, key) => {\n if (key.escape) {\n onDone('<bash-stderr>Bug report cancelled</bash-stderr>')\n return\n }\n\n if (step === 'consent' && (key.return || input === ' ')) {\n const issueUrl = createGitHubIssueUrl({\n title: (description.trim() || 'Bug Report').slice(0, 80),\n description: description.trim(),\n })\n void openBrowser(issueUrl)\n onDone('<bash-stdout>Opened GitHub issue</bash-stdout>')\n }\n })\n\n return (\n <ScreenFrame\n title=\"Submit Bug Report\"\n exitState={exitState}\n paddingX={layout.paddingX}\n paddingY={layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\" gap={layout.gap}>\n {step === 'userInput' ? (\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Text wrap=\"truncate-end\">\n Describe the issue below and include any errors you see:\n </Text>\n <TextInput\n value={description}\n onChange={setDescription}\n columns={textInputColumns}\n onSubmit={() => {\n if (canContinue) setStep('consent')\n }}\n onExitMessage={() =>\n onDone('<bash-stderr>Bug report cancelled</bash-stderr>')\n }\n cursorOffset={cursorOffset}\n onChangeCursorOffset={setCursorOffset}\n />\n {!canContinue ? (\n <Text dimColor wrap=\"truncate-end\">\n Enter a description to continue\n </Text>\n ) : null}\n </Box>\n ) : (\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Text wrap=\"truncate-end\">This report will include:</Text>\n <Box paddingLeft={2} flexDirection=\"column\">\n <Text wrap=\"truncate-end\">\n - Your description: <Text dimColor>{description}</Text>\n </Text>\n <Text wrap=\"truncate-end\">\n - Environment: <Text dimColor>{env.platform}</Text>,{' '}\n <Text dimColor>{env.terminal}</Text>,{' '}\n <Text dimColor>v{MACRO.VERSION || 'unknown'}</Text>\n </Text>\n <Text wrap=\"truncate-end\">- Model settings (no API keys)</Text>\n </Box>\n <Text wrap=\"truncate-end\">\n Press <Text bold>Enter</Text> to open GitHub and create an issue.\n </Text>\n </Box>\n )}\n\n <Box marginTop={layout.tightLayout ? 0 : 1}>\n <Text dimColor wrap=\"truncate-end\">\n {exitState.pending\n ? `Press ${exitState.keyName} again to exit`\n : step === 'userInput'\n ? 'Enter to continue \u00B7 Esc to cancel'\n : 'Enter to open browser \u00B7 Esc to cancel'}\n </Text>\n </Box>\n </Box>\n </ScreenFrame>\n )\n}\n\nfunction createGitHubIssueUrl(args: {\n title: string\n description: string\n}): string {\n const globalConfig = getGlobalConfig()\n const modelProfiles = globalConfig.modelProfiles || []\n const activeProfiles = modelProfiles.filter(p => p.isActive)\n\n let modelInfo = '## Models\\\\n'\n if (activeProfiles.length === 0) {\n modelInfo += '- No model profiles configured\\\\n'\n } else {\n for (const profile of activeProfiles) {\n modelInfo += `- ${profile.name}\\\\n`\n modelInfo += ` - provider: ${profile.provider}\\\\n`\n modelInfo += ` - model: ${profile.modelName}\\\\n`\n modelInfo += ` - baseURL: ${profile.baseURL}\\\\n`\n modelInfo += ` - maxTokens: ${profile.maxTokens}\\\\n`\n modelInfo += ` - contextLength: ${profile.contextLength}\\\\n`\n if (profile.reasoningEffort) {\n modelInfo += ` - reasoning effort: ${profile.reasoningEffort}\\\\n`\n }\n }\n }\n\n const body = encodeURIComponent(`\n## Bug Description\n${args.description}\n\n## Environment Info\n- Platform: ${env.platform}\n- Terminal: ${env.terminal}\n- Version: ${MACRO.VERSION || 'unknown'}\n\n${modelInfo}`)\n\n return `${GITHUB_ISSUES_REPO_URL}/new?title=${encodeURIComponent(args.title)}&body=${body}&labels=user-reported,bug`\n}\n", "import { execFileNoThrow } from './execFileNoThrow'\n\nexport async function openBrowser(url: string): Promise<boolean> {\n const platform = process.platform\n const command =\n platform === 'win32' ? 'start' : platform === 'darwin' ? 'open' : 'xdg-open'\n\n try {\n const { code } = await execFileNoThrow(command, [url])\n return code === 0\n } catch (_) {\n return false\n }\n}\n", "import type { Command } from '../types'\nimport { Bug } from '#ui-ink/components/Bug'\nimport * as React from 'react'\nimport { PRODUCT_NAME } from '#core/constants/product'\n\nconst bug = {\n type: 'local-jsx',\n name: 'bug',\n description: `Submit feedback about ${PRODUCT_NAME}`,\n isEnabled: true,\n isHidden: false,\n aliases: ['feedback'],\n ui: { displayMode: 'fullscreen' },\n async call(onDone) {\n return <Bug onDone={onDone} />\n },\n userFacingName() {\n return 'bug'\n },\n} satisfies Command\n\nexport default bug\n", "import type { Command } from '../types'\nimport { getMessagesSetter } from '#core/messages'\nimport { getContext } from '#core/context'\nimport { getCodeStyle } from '#core/utils/style'\nimport { clearScrollback, clearTerminal } from '#cli-utils/terminal'\nimport { getGlobalConfig } from '#core/utils/config'\nimport { getOriginalCwd, setCwd } from '#core/utils/state'\nimport { resetReminderSession } from '#core/services/systemReminder'\nimport { resetFileFreshnessSession } from '#core/services/fileFreshness'\nimport type { SetForkConvoWithMessagesOnTheNextRender } from '#ui-ink/types/conversationReset'\n\nexport async function clearConversation(context: {\n setForkConvoWithMessagesOnTheNextRender: SetForkConvoWithMessagesOnTheNextRender\n}) {\n const config = getGlobalConfig()\n await (config.wipeScrollbackOnClear ? clearScrollback() : clearTerminal())\n getMessagesSetter()([])\n context.setForkConvoWithMessagesOnTheNextRender([], {\n clearViewport: false,\n resetInput: true,\n })\n getContext.cache.clear?.()\n getCodeStyle.cache.clear?.()\n await setCwd(getOriginalCwd())\n\n // Reset reminder and file freshness sessions to clean up state\n resetReminderSession()\n resetFileFreshnessSession()\n}\n\nconst clear = {\n type: 'local',\n name: 'clear',\n description: 'Clear conversation history and free up context',\n isEnabled: true,\n isHidden: false,\n async call(_, context) {\n clearConversation(context)\n return ''\n },\n userFacingName() {\n return 'clear'\n },\n} satisfies Command\n\nexport default clear\n", "import type { Command } from '../types'\nimport { getContext } from '#core/context'\nimport { getMessagesGetter, getMessagesSetter } from '#core/messages'\nimport { API_ERROR_MESSAGE_PREFIX } from '#core/ai/constants'\nimport { queryLLM } from '#core/ai/llmLazy'\nimport { getGlobalConfig } from '#core/utils/config'\nimport {\n createUserMessage,\n normalizeMessagesForAPI,\n} from '#core/utils/messages'\nimport { getCodeStyle } from '#core/utils/style'\nimport { clearTerminal } from '#cli-utils/terminal'\nimport { resetReminderSession } from '#core/services/systemReminder'\nimport { resetFileFreshnessSession } from '#core/services/fileFreshness'\nimport {\n appendSessionJsonlFromMessage,\n appendSessionSummaryRecord,\n} from '#protocol/utils/kodeAgentSessionLog'\nimport { getCwd } from '#core/utils/state'\n\nconst COMPRESSION_PROMPT = `Please provide a comprehensive summary of our conversation structured as follows:\n\n## Technical Context\nDevelopment environment, tools, frameworks, and configurations in use. Programming languages, libraries, and technical constraints. File structure, directory organization, and project architecture.\n\n## Project Overview \nMain project goals, features, and scope. Key components, modules, and their relationships. Data models, APIs, and integration patterns.\n\n## Code Changes\nFiles created, modified, or analyzed during our conversation. Specific code implementations, functions, and algorithms added. Configuration changes and structural modifications.\n\n## Debugging & Issues\nProblems encountered and their root causes. Solutions implemented and their effectiveness. Error messages, logs, and diagnostic information.\n\n## Current Status\nWhat we just completed successfully. Current state of the codebase and any ongoing work. Test results, validation steps, and verification performed.\n\n## Pending Tasks\nImmediate next steps and priorities. Planned features, improvements, and refactoring. Known issues, technical debt, and areas needing attention.\n\n## User Preferences\nCoding style, formatting, and organizational preferences. Communication patterns and feedback style. Tool choices and workflow preferences.\n\n## Key Decisions\nImportant technical decisions made and their rationale. Alternative approaches considered and why they were rejected. Trade-offs accepted and their implications.\n\nFocus on information essential for continuing the conversation effectively, including specific details about code, files, errors, and plans.`\n\nconst compact = {\n type: 'local',\n name: 'compact',\n description: 'Clear conversation history but keep a summary in context',\n isEnabled: true,\n isHidden: false,\n async call(\n _,\n {\n options: { tools },\n abortController,\n setForkConvoWithMessagesOnTheNextRender,\n },\n ) {\n const messages = getMessagesGetter()()\n\n const summaryRequest = createUserMessage(COMPRESSION_PROMPT)\n const compactPointer = getGlobalConfig().modelPointers?.compact\n\n const summaryResponse = await queryLLM(\n normalizeMessagesForAPI([...messages, summaryRequest]),\n [\n 'You are a helpful AI assistant tasked with creating comprehensive conversation summaries that preserve all essential context for continuing development work.',\n ],\n 0,\n tools,\n abortController.signal,\n {\n safeMode: false,\n model: compactPointer ? 'compact' : 'main', // \u4F7F\u7528\u6A21\u578B\u6307\u9488\uFF0C\u8BA9queryLLM\u7EDF\u4E00\u89E3\u6790\n prependCLISysprompt: true,\n },\n )\n\n const content = summaryResponse.message.content\n const summary =\n typeof content === 'string'\n ? content\n : content.length > 0 && content[0]?.type === 'text'\n ? content[0].text\n : null\n\n if (!summary) {\n throw new Error(\n `Failed to generate conversation summary - response did not contain valid text content - ${summaryResponse}`,\n )\n } else if (summary.startsWith(API_ERROR_MESSAGE_PREFIX)) {\n throw new Error(summary)\n }\n\n summaryResponse.message.usage = {\n input_tokens: 0,\n output_tokens: summaryResponse.message.usage.output_tokens,\n cache_creation_input_tokens: 0,\n cache_read_input_tokens: 0,\n }\n\n const compactedIntro = createUserMessage(\n `Context has been compressed using structured 8-section algorithm. All essential information has been preserved for seamless continuation.`,\n )\n\n if (process.env.NODE_ENV !== 'test') {\n try {\n const cwd = getCwd()\n appendSessionJsonlFromMessage({\n cwd,\n message: compactedIntro,\n toolUseContext: { agentId: 'main' },\n })\n appendSessionJsonlFromMessage({\n cwd,\n message: summaryResponse,\n toolUseContext: { agentId: 'main' },\n })\n appendSessionSummaryRecord({\n cwd,\n summary,\n leafUuid: summaryResponse.uuid,\n })\n } catch {\n // best-effort only\n }\n }\n\n await clearTerminal()\n getMessagesSetter()([])\n setForkConvoWithMessagesOnTheNextRender([compactedIntro, summaryResponse], {\n clearViewport: false,\n resetInput: true,\n })\n getContext.cache.clear?.()\n getCodeStyle.cache.clear?.()\n resetFileFreshnessSession()\n\n // Reset reminder and file freshness sessions to clean up state\n resetReminderSession()\n\n return '' // not used (typesafety only)\n },\n userFacingName() {\n return 'compact'\n },\n} satisfies Command\n\nexport default compact\n", "import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { useCallback, useRef, useState } from 'react'\nimport figures from 'figures'\nimport { getTheme } from '#core/utils/theme'\nimport {\n GlobalConfig,\n saveGlobalConfig,\n getGlobalConfig,\n} from '#core/utils/config'\nimport { getModelManager } from '#core/utils/model'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { KEYPRESS_PRIORITY } from '#ui-ink/constants/keypressPriority'\n\ntype Props = {\n onClose: () => void\n}\n\ntype Setting =\n | {\n id: string\n label: string\n value: boolean\n onChange(value: boolean): void\n type: 'boolean'\n disabled?: boolean\n }\n | {\n id: string\n label: string\n value: string\n options: string[]\n onChange(value: string): void\n type: 'enum'\n disabled?: boolean\n }\n | {\n id: string\n label: string\n value: string\n onChange(value: string): void\n type: 'string'\n disabled?: boolean\n }\n | {\n id: string\n label: string\n value: number\n onChange(value: number): void\n type: 'number'\n disabled?: boolean\n }\n\nexport function ConfigScreen({ onClose }: Props): React.ReactNode {\n const [globalConfig, setGlobalConfig] = useState(getGlobalConfig())\n const initialConfig = React.useRef(getGlobalConfig())\n const [selectedIndex, setSelectedIndex] = useState(0)\n const exitState = { pending: false, keyName: null } as const\n const [editingString, setEditingString] = useState(false)\n const [currentInput, setCurrentInput] = useState('')\n const [inputError, setInputError] = useState<string | null>(null)\n const didCloseRef = useRef(false)\n const { rows, columns } = useTerminalSize()\n const tightLayout = rows <= 18 || columns <= 72\n const compactLayout = tightLayout || rows <= 22\n const paddingY = tightLayout ? 0 : 1\n const gap = tightLayout ? 0 : 1\n const paddingX = tightLayout || compactLayout ? 1 : 2\n\n const modelManager = getModelManager()\n const activeProfiles = modelManager.getAvailableModels()\n\n const settings: Setting[] = [\n // Global settings\n {\n id: 'theme',\n label: 'Theme',\n value: globalConfig.theme ?? 'dark',\n options: ['dark', 'light', 'dark-daltonized', 'light-daltonized'],\n onChange(theme: string) {\n const themeName: GlobalConfig['theme'] =\n theme === 'dark' ||\n theme === 'light' ||\n theme === 'light-daltonized' ||\n theme === 'dark-daltonized'\n ? theme\n : 'dark'\n const config = { ...getGlobalConfig(), theme: themeName }\n saveGlobalConfig(config)\n setGlobalConfig(config)\n },\n type: 'enum',\n },\n {\n id: 'editorMode',\n label: 'Editor mode',\n value: globalConfig.editorMode ?? 'normal',\n options: ['normal', 'vim'],\n onChange(mode: string) {\n const editorMode: GlobalConfig['editorMode'] =\n mode === 'normal' || mode === 'vim' || mode === 'emacs'\n ? mode\n : 'normal'\n const config = { ...getGlobalConfig(), editorMode }\n saveGlobalConfig(config)\n setGlobalConfig(config)\n },\n type: 'enum',\n },\n {\n id: 'verbose',\n label: 'Verbose mode',\n value: globalConfig.verbose ?? false,\n onChange(verbose: boolean) {\n const config = { ...getGlobalConfig(), verbose }\n saveGlobalConfig(config)\n setGlobalConfig(config)\n },\n type: 'boolean',\n },\n {\n id: 'stream',\n label: 'Stream responses',\n value: globalConfig.stream ?? true,\n onChange(stream: boolean) {\n const config = { ...getGlobalConfig(), stream }\n saveGlobalConfig(config)\n setGlobalConfig(config)\n },\n type: 'boolean',\n },\n {\n id: 'thinkingMode',\n label: 'Thinking mode',\n value: globalConfig.thinkingMode ?? 'auto',\n options: ['auto', 'enabled', 'disabled'],\n onChange(mode: string) {\n const thinkingMode: GlobalConfig['thinkingMode'] =\n mode === 'auto' || mode === 'enabled' || mode === 'disabled'\n ? mode\n : 'auto'\n const config = { ...getGlobalConfig(), thinkingMode }\n saveGlobalConfig(config)\n setGlobalConfig(config)\n },\n type: 'enum',\n },\n {\n id: 'useAlternateBuffer',\n label: 'Use alternate buffer (restart required; disables scrollback)',\n value: globalConfig.useAlternateBuffer ?? false,\n onChange(useAlternateBuffer: boolean) {\n const config = { ...getGlobalConfig(), useAlternateBuffer }\n saveGlobalConfig(config)\n setGlobalConfig(config)\n },\n type: 'boolean',\n },\n {\n id: 'incrementalRendering',\n label: 'Incremental rendering (restart required; reduces flicker)',\n value: globalConfig.incrementalRendering ?? true,\n onChange(incrementalRendering: boolean) {\n const config = { ...getGlobalConfig(), incrementalRendering }\n saveGlobalConfig(config)\n setGlobalConfig(config)\n },\n type: 'boolean',\n },\n {\n id: 'wipeScrollbackOnClear',\n label: 'Wipe scrollback on /clear',\n value: globalConfig.wipeScrollbackOnClear ?? false,\n onChange(wipeScrollbackOnClear: boolean) {\n const config = { ...getGlobalConfig(), wipeScrollbackOnClear }\n saveGlobalConfig(config)\n setGlobalConfig(config)\n },\n type: 'boolean',\n },\n ]\n\n const theme = getTheme()\n\n const safeOnClose = useCallback(() => {\n if (didCloseRef.current) return\n didCloseRef.current = true\n onClose()\n }, [onClose])\n\n useKeypress(\n (input, key) => {\n if (didCloseRef.current) return true\n\n const inputChar = input.length === 1 ? input : ''\n\n if (editingString) {\n if (key.return) {\n const currentSetting = settings[selectedIndex]\n if (!currentSetting) return\n\n if (currentSetting.type === 'string') {\n try {\n currentSetting.onChange(currentInput)\n setEditingString(false)\n setCurrentInput('')\n setInputError(null)\n } catch (error) {\n setInputError(\n error instanceof Error ? error.message : 'Invalid input',\n )\n }\n } else if (currentSetting.type === 'number') {\n const numValue = parseFloat(currentInput)\n if (isNaN(numValue)) {\n setInputError('Please enter a valid number')\n } else {\n try {\n currentSetting.onChange(numValue)\n setEditingString(false)\n setCurrentInput('')\n setInputError(null)\n } catch (error) {\n setInputError(\n error instanceof Error ? error.message : 'Invalid input',\n )\n }\n }\n }\n } else if (key.escape || (key.ctrl && inputChar === 'c')) {\n setEditingString(false)\n setCurrentInput('')\n setInputError(null)\n } else if (key.delete || key.backspace) {\n setCurrentInput(prev => prev.slice(0, -1))\n } else if (input) {\n setCurrentInput(prev => prev + input)\n }\n return\n }\n\n if (key.upArrow) {\n setSelectedIndex(prev => Math.max(0, prev - 1))\n } else if (key.downArrow) {\n setSelectedIndex(prev => Math.min(settings.length - 1, prev + 1))\n } else if (inputChar === 'k' || inputChar === 'j') {\n const delta = inputChar === 'k' ? -1 : 1\n setSelectedIndex(prev =>\n Math.max(0, Math.min(settings.length - 1, prev + delta)),\n )\n } else if (key.home || inputChar === 'g') {\n setSelectedIndex(0)\n } else if (key.end || inputChar === 'G') {\n setSelectedIndex(Math.max(0, settings.length - 1))\n } else if (key.return) {\n const currentSetting = settings[selectedIndex]\n if (currentSetting?.disabled) return\n\n if (currentSetting?.type === 'boolean') {\n currentSetting.onChange(!currentSetting.value)\n } else if (currentSetting?.type === 'enum') {\n const currentIndex = currentSetting.options.indexOf(\n currentSetting.value,\n )\n const nextIndex = (currentIndex + 1) % currentSetting.options.length\n currentSetting.onChange(currentSetting.options[nextIndex])\n } else if (\n currentSetting?.type === 'string' ||\n currentSetting?.type === 'number'\n ) {\n setCurrentInput(String(currentSetting.value))\n setEditingString(true)\n setInputError(null)\n }\n } else if (key.escape || (key.ctrl && inputChar === 'c')) {\n // Check if config has changed\n const currentConfigString = JSON.stringify(getGlobalConfig())\n const initialConfigString = JSON.stringify(initialConfig.current)\n\n if (currentConfigString !== initialConfigString) {\n // Config has changed, save it\n saveGlobalConfig(getGlobalConfig())\n }\n\n safeOnClose()\n }\n },\n { priority: KEYPRESS_PRIORITY.FULLSCREEN_OVERLAY },\n )\n\n const modelSummary = (() => {\n if (activeProfiles.length === 0) {\n return (\n <Text color={theme.secondaryText} wrap=\"truncate-end\">\n No models configured. Use <Text color={theme.suggestion}>/model</Text>{' '}\n to add models.\n </Text>\n )\n }\n\n const reservedRows =\n (tightLayout ? 10 : compactLayout ? 12 : 14) + paddingY * 2 + gap * 4\n const maxVisible = Math.max(0, rows - reservedRows)\n const visible = activeProfiles.slice(\n 0,\n Math.max(1, Math.min(6, maxVisible)),\n )\n const hidden = Math.max(0, activeProfiles.length - visible.length)\n\n return (\n <Box flexDirection=\"column\" gap={0}>\n {visible.map(profile => (\n <Text\n key={profile.modelName}\n color={theme.secondaryText}\n wrap=\"truncate-end\"\n >\n \u2022 {profile.name} ({profile.provider})\n </Text>\n ))}\n {hidden > 0 ? (\n <Text color={theme.secondaryText} wrap=\"truncate-end\">\n \u2026 and {hidden} more\n </Text>\n ) : null}\n <Text color={theme.suggestion} wrap=\"truncate-end\">\n Use /model to manage model configurations\n </Text>\n </Box>\n )\n })()\n\n return (\n <ScreenFrame\n title=\"Configuration\"\n exitState={exitState}\n paddingX={paddingX}\n paddingY={paddingY}\n gap={gap}\n >\n <Box flexDirection=\"column\" gap={gap}>\n <Box flexDirection=\"column\" gap={gap}>\n <Text bold color={theme.success}>\n Models\n </Text>\n <Box paddingLeft={1}>{modelSummary}</Box>\n </Box>\n\n <Box flexDirection=\"column\" gap={0}>\n <Text bold>Settings</Text>\n {settings.map((setting, index) => {\n const isSelected = index === selectedIndex\n return (\n <Box key={setting.id} flexDirection=\"column\">\n <Box flexDirection=\"row\" gap={1}>\n <Text\n color={\n isSelected\n ? theme.kode\n : setting.disabled\n ? theme.secondaryText\n : theme.text\n }\n wrap=\"truncate-end\"\n >\n {isSelected ? figures.pointer : ' '} {setting.label}\n </Text>\n <Text\n color={\n setting.disabled ? theme.secondaryText : theme.suggestion\n }\n wrap=\"truncate-end\"\n >\n {setting.type === 'boolean'\n ? setting.value\n ? 'enabled'\n : 'disabled'\n : setting.type === 'enum'\n ? setting.value\n : String(setting.value)}\n </Text>\n </Box>\n\n {isSelected && editingString ? (\n <Box flexDirection=\"column\" paddingLeft={2}>\n <Text color={theme.suggestion} wrap=\"truncate-end\">\n Enter new value: {currentInput}\n </Text>\n {inputError ? (\n <Text color={theme.error} wrap=\"truncate-end\">\n {inputError}\n </Text>\n ) : null}\n </Box>\n ) : null}\n </Box>\n )\n })}\n </Box>\n\n <Box marginTop={tightLayout ? 0 : 1}>\n <Text dimColor wrap=\"truncate-end\">\n {editingString\n ? 'Enter to save \u00B7 Esc to cancel'\n : '\u2191/\u2193 or j/k \u00B7 Home/End \u00B7 Enter toggle \u00B7 Esc close \u00B7 /model'}\n </Text>\n </Box>\n </Box>\n </ScreenFrame>\n )\n}\n", "import type { Command } from '../types'\nimport { ConfigScreen } from '#ui-ink/screens/overlays/ConfigScreen'\nimport * as React from 'react'\n\nconst config = {\n type: 'local-jsx',\n name: 'config',\n description: 'Open config panel',\n isEnabled: true,\n isHidden: false,\n ui: { displayMode: 'fullscreen' },\n async call(onDone) {\n return <ConfigScreen onClose={onDone} />\n },\n userFacingName() {\n return 'config'\n },\n} satisfies Command\n\nexport default config\n", "import type { Command } from '../types'\nimport { formatTotalCost } from '#core/cost-tracker'\n\nconst cost = {\n type: 'local',\n name: 'cost',\n description: 'Show the total cost and duration of the current session',\n isEnabled: true,\n isHidden: false,\n async call() {\n return formatTotalCost()\n },\n userFacingName() {\n return 'cost'\n },\n} satisfies Command\n\nexport default cost\n", "import type { Command } from '../types'\nimport type { Tool } from '#core/tooling/Tool'\nimport Table from 'cli-table3'\nimport { getSystemPrompt } from '#core/constants/prompts'\nimport { getContext } from '#core/context'\nimport { zodToJsonSchema } from 'zod-to-json-schema'\nimport { getMessagesGetter } from '#core/messages'\nimport { PROJECT_FILE } from '#core/constants/product'\n// Quick and dirty estimate of bytes per token for rough token counts\nconst BYTES_PER_TOKEN = 4\n\ninterface Section {\n title: string\n content: string\n}\n\ninterface ToolSummary {\n name: string\n description: string\n}\n\nfunction getContextSections(text: string): Section[] {\n const sections: Section[] = []\n\n // Find first <context> tag\n const firstContextIndex = text.indexOf('<context')\n\n // Everything before first tag is Core Sysprompt\n if (firstContextIndex > 0) {\n const coreSysprompt = text.slice(0, firstContextIndex).trim()\n if (coreSysprompt) {\n sections.push({\n title: 'Core Sysprompt',\n content: coreSysprompt,\n })\n }\n }\n\n let currentPos = firstContextIndex\n let nonContextContent = ''\n\n const regex = /<context\\s+name=\"([^\"]*)\">([\\s\\S]*?)<\\/context>/g\n let match: RegExpExecArray | null\n\n while ((match = regex.exec(text)) !== null) {\n // Collect text between context tags\n if (match.index > currentPos) {\n nonContextContent += text.slice(currentPos, match.index)\n }\n\n const [, name = 'Unnamed Section', content = ''] = match\n sections.push({\n title: name === 'codeStyle' ? `CodeStyle + ${PROJECT_FILE}'s` : name,\n content: content.trim(),\n })\n\n currentPos = match.index + match[0].length\n }\n\n // Collect remaining text after last tag\n if (currentPos < text.length) {\n nonContextContent += text.slice(currentPos)\n }\n\n // Add non-contextualized content if present\n const trimmedNonContext = nonContextContent.trim()\n if (trimmedNonContext) {\n sections.push({\n title: 'Non-contextualized Content',\n content: trimmedNonContext,\n })\n }\n\n return sections\n}\n\nfunction formatTokenCount(bytes: number): string {\n const tokens = bytes / BYTES_PER_TOKEN\n const k = tokens / 1000\n return `${Math.round(k * 10) / 10}k`\n}\n\nfunction formatByteCount(bytes: number): string {\n const kb = bytes / 1024\n return `${Math.round(kb * 10) / 10}kb`\n}\n\nfunction createSummaryTable(\n systemText: string,\n systemSections: Section[],\n tools: ToolSummary[],\n messages: unknown,\n): string {\n const table = new Table({\n head: ['Component', 'Tokens', 'Size', '% Used'],\n style: { head: ['bold'] },\n chars: {\n mid: '\u2500',\n 'left-mid': '\u251C',\n 'mid-mid': '\u253C',\n 'right-mid': '\u2524',\n },\n })\n\n const messagesStr = JSON.stringify(messages)\n const toolsStr = JSON.stringify(tools)\n\n // Calculate total for percentages\n const total = systemText.length + toolsStr.length + messagesStr.length\n const getPercentage = (n: number) => `${Math.round((n / total) * 100)}%`\n\n // System prompt and its sections\n table.push([\n 'System prompt',\n formatTokenCount(systemText.length),\n formatByteCount(systemText.length),\n getPercentage(systemText.length),\n ])\n for (const section of systemSections) {\n table.push([\n ` ${section.title}`,\n formatTokenCount(section.content.length),\n formatByteCount(section.content.length),\n getPercentage(section.content.length),\n ])\n }\n\n // Tools\n table.push([\n 'Tool definitions',\n formatTokenCount(toolsStr.length),\n formatByteCount(toolsStr.length),\n getPercentage(toolsStr.length),\n ])\n for (const tool of tools) {\n table.push([\n ` ${tool.name}`,\n formatTokenCount(tool.description.length),\n formatByteCount(tool.description.length),\n getPercentage(tool.description.length),\n ])\n }\n\n // Messages and total\n table.push(\n [\n 'Messages',\n formatTokenCount(messagesStr.length),\n formatByteCount(messagesStr.length),\n getPercentage(messagesStr.length),\n ],\n ['Total', formatTokenCount(total), formatByteCount(total), '100%'],\n )\n\n return table.toString()\n}\n\nconst command: Command = {\n name: 'ctx-viz',\n description:\n 'Show token usage breakdown for the current conversation context',\n isEnabled: true,\n isHidden: false,\n aliases: ['context'],\n type: 'local',\n\n userFacingName() {\n return this.name\n },\n\n async call(_args: string, cmdContext: { options: { tools: Tool[] } }) {\n // Get tools and system prompt with injected context\n const [systemPromptRaw, sysContext] = await Promise.all([\n getSystemPrompt(),\n getContext(),\n ])\n\n const rawTools = cmdContext.options.tools\n\n // Full system prompt with context sections injected\n let systemPrompt = systemPromptRaw.join('\\n')\n for (const [name, content] of Object.entries(sysContext)) {\n systemPrompt += `\\n<context name=\"${name}\">${content}</context>`\n }\n\n // Get full tool definitions including prompts and schemas\n const tools = rawTools.map(t => {\n // Get full prompt and schema\n const fullPrompt = t.prompt({ safeMode: false })\n const schema = JSON.stringify(\n 'inputJSONSchema' in t && t.inputJSONSchema\n ? t.inputJSONSchema\n : zodToJsonSchema(t.inputSchema),\n )\n\n return {\n name: t.name,\n description: `${fullPrompt}\\n\\nSchema:\\n${schema}`,\n }\n })\n\n // Get current messages from REPL\n const messages = getMessagesGetter()()\n\n const sections = getContextSections(systemPrompt)\n return createSummaryTable(systemPrompt, sections, tools, messages)\n },\n}\n\nexport default command\n", "import type { Command } from '../types'\n\nimport React from 'react'\n\nimport { PermissionsScreen } from '#ui-ink/screens/overlays/PermissionsScreen'\n\nconst addDir = {\n type: 'local-jsx',\n name: 'add-dir',\n description: 'Add a new working directory',\n argumentHint: '<path>',\n isEnabled: true,\n isHidden: false,\n ui: { displayMode: 'fullscreen' },\n disableNonInteractive: true,\n async call(onDone, context, args = '') {\n const directoryPath = String(args ?? '').trim()\n return React.createElement(PermissionsScreen, {\n context,\n onDone,\n initialView: 'addDir',\n initialDraftInput: directoryPath || undefined,\n initialDestination: 'localSettings',\n })\n },\n userFacingName() {\n return 'add-dir'\n },\n} satisfies Command\n\nexport default addDir\n", "import React, { useMemo, useState } from 'react'\nimport { Box, Text } from 'ink'\nimport figures from 'figures'\n\nimport type { ToolUseContext } from '#core/tooling/Tool'\nimport type {\n ToolPermissionContext,\n ToolPermissionContextUpdate,\n ToolPermissionRuleBehavior,\n ToolPermissionUpdateDestination,\n} from '#core/types/toolPermissionContext'\nimport {\n applyToolPermissionContextUpdate,\n isPersistableToolPermissionDestination,\n} from '#core/types/toolPermissionContext'\nimport {\n loadToolPermissionContextFromDisk,\n persistToolPermissionUpdateToDisk,\n} from '#core/permissions/toolPermissionSettings'\nimport { getTheme } from '#core/utils/theme'\nimport { getCwd } from '#core/utils/state'\nimport { useExitOnCtrlCD } from '#ui-ink/hooks/useExitOnCtrlCD'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { KEYPRESS_PRIORITY } from '#ui-ink/constants/keypressPriority'\nimport { SearchBox } from '#ui-ink/components/SearchBox'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\nimport { getWindowedList } from '#ui-ink/primitives/list/windowedList'\n\ntype Props = {\n context: ToolUseContext\n onDone: (result?: string) => void\n initialView?: 'list' | 'addDir'\n initialDraftInput?: string\n initialDestination?: ToolPermissionUpdateDestination\n}\n\ntype PermissionItem =\n | {\n kind: 'action'\n id: 'add-rule' | 'add-dir'\n label: string\n }\n | {\n kind: 'rule'\n behavior: ToolPermissionRuleBehavior\n destination: ToolPermissionUpdateDestination\n rule: string\n }\n | {\n kind: 'dir'\n destination: ToolPermissionUpdateDestination\n path: string\n }\n\ntype ScreenMode =\n | { kind: 'list' }\n | { kind: 'addRule'; step: 'behavior' | 'destination' | 'input' }\n | { kind: 'addDir'; step: 'destination' | 'input' }\n | { kind: 'confirmRemove'; target: PermissionItem }\n\nconst BEHAVIORS: ToolPermissionRuleBehavior[] = ['allow', 'deny', 'ask']\nconst DESTINATIONS: ToolPermissionUpdateDestination[] = [\n 'localSettings',\n 'projectSettings',\n 'userSettings',\n 'session',\n]\n\nfunction normalizeString(value: string): string {\n return value.replace(/\\s+/g, ' ').trim()\n}\n\nfunction getContextOrDiskPermissionContext(args: {\n context: ToolUseContext\n}): ToolPermissionContext {\n const ctx = args.context.options?.toolPermissionContext\n if (ctx) return ctx\n return loadToolPermissionContextFromDisk({\n projectDir: getCwd(),\n includeKodeProjectConfig: true,\n isBypassPermissionsModeAvailable: args.context.safeMode !== true,\n })\n}\n\nfunction flattenPermissionItems(\n toolPermissionContext: ToolPermissionContext,\n): PermissionItem[] {\n const items: PermissionItem[] = [\n { kind: 'action', id: 'add-rule', label: 'Add rule\u2026' },\n { kind: 'action', id: 'add-dir', label: 'Add directory\u2026' },\n ]\n\n const pushRules = (behavior: ToolPermissionRuleBehavior) => {\n const map =\n behavior === 'allow'\n ? toolPermissionContext.alwaysAllowRules\n : behavior === 'deny'\n ? toolPermissionContext.alwaysDenyRules\n : toolPermissionContext.alwaysAskRules\n for (const [destination, rules] of Object.entries(map)) {\n if (!Array.isArray(rules)) continue\n for (const rule of rules) {\n if (typeof rule !== 'string' || !rule.trim()) continue\n items.push({\n kind: 'rule',\n behavior,\n destination: destination as ToolPermissionUpdateDestination,\n rule,\n })\n }\n }\n }\n\n pushRules('allow')\n pushRules('deny')\n pushRules('ask')\n\n for (const dir of toolPermissionContext.additionalWorkingDirectories.values()) {\n items.push({\n kind: 'dir',\n destination: dir.source,\n path: dir.path,\n })\n }\n\n return items\n}\n\nfunction matchesQuery(item: PermissionItem, query: string): boolean {\n const q = query.toLowerCase().trim()\n if (!q) return true\n if (item.kind === 'rule') return item.rule.toLowerCase().includes(q)\n if (item.kind === 'dir') return item.path.toLowerCase().includes(q)\n return item.label.toLowerCase().includes(q)\n}\n\nfunction labelForItem(item: PermissionItem): string {\n if (item.kind === 'action') return item.label\n if (item.kind === 'dir')\n return `dir: ${item.path} \u00B7 ${item.destination || 'unknown'}`\n return `${item.behavior}: ${item.rule} \u00B7 ${item.destination || 'unknown'}`\n}\n\nexport function PermissionsScreen({\n context,\n onDone,\n initialView = 'list',\n initialDraftInput,\n initialDestination,\n}: Props): React.ReactNode {\n const theme = getTheme()\n const layout = useScreenLayout()\n const exitState = useExitOnCtrlCD(() =>\n onDone('Permissions dialog dismissed'),\n )\n\n const [dirty, setDirty] = useState(false)\n const [mode, setMode] = useState<ScreenMode>(() => {\n if (initialView === 'addDir') {\n return {\n kind: 'addDir',\n step: initialDraftInput?.trim() ? 'input' : 'destination',\n }\n }\n return { kind: 'list' }\n })\n const [searchQuery, setSearchQuery] = useState('')\n const [isSearchMode, setIsSearchMode] = useState(false)\n const [selectedIndex, setSelectedIndex] = useState(0)\n const [draftBehaviorIndex, setDraftBehaviorIndex] = useState(0)\n const [draftDestinationIndex, setDraftDestinationIndex] = useState(() => {\n if (!initialDestination) return 0\n const idx = DESTINATIONS.indexOf(initialDestination)\n return idx >= 0 ? idx : 0\n })\n const [draftInput, setDraftInput] = useState(initialDraftInput ?? '')\n\n const [toolPermissionContext, setToolPermissionContext] = useState(() =>\n getContextOrDiskPermissionContext({ context }),\n )\n\n const allItems = useMemo(\n () => flattenPermissionItems(toolPermissionContext),\n [toolPermissionContext],\n )\n const visibleItems = useMemo(() => {\n if (!searchQuery.trim()) return allItems\n return allItems.filter(item => matchesQuery(item, searchQuery))\n }, [allItems, searchQuery])\n\n const reservedLines =\n (layout.tightLayout ? 7 : layout.compactLayout ? 9 : 11) +\n layout.paddingY * 2 +\n layout.gap * 3\n const maxVisible = Math.max(3, layout.rows - reservedLines - 1)\n const window = useMemo(\n () =>\n getWindowedList({\n itemCount: visibleItems.length,\n focusIndex: selectedIndex,\n maxVisible,\n indicatorRows: 2,\n }),\n [maxVisible, selectedIndex, visibleItems.length],\n )\n\n const clampedSelectedIndex = Math.max(\n 0,\n Math.min(selectedIndex, Math.max(0, visibleItems.length - 1)),\n )\n\n const selectedItem = visibleItems[clampedSelectedIndex] ?? null\n\n const applyUpdate = (update: ToolPermissionContextUpdate) => {\n const next = applyToolPermissionContextUpdate(toolPermissionContext, update)\n setToolPermissionContext(next)\n context.options ??= {}\n context.options.toolPermissionContext = next\n\n if (isPersistableToolPermissionDestination(update.destination)) {\n persistToolPermissionUpdateToDisk({ update, projectDir: getCwd() })\n }\n setDirty(true)\n }\n\n useKeypress(\n (input, key) => {\n const inputChar = input.length === 1 ? input : ''\n const isPlainChar = Boolean(inputChar) && !key.ctrl && !key.meta\n\n if (mode.kind === 'list' && isSearchMode) {\n if (key.escape) {\n if (searchQuery.length > 0) {\n setSearchQuery('')\n } else {\n setIsSearchMode(false)\n }\n setSelectedIndex(0)\n return true\n }\n\n if (key.return || key.downArrow) {\n setIsSearchMode(false)\n return true\n }\n\n if (key.backspace || key.delete) {\n if (searchQuery.length === 0) {\n setIsSearchMode(false)\n return true\n }\n setSearchQuery(prev => prev.slice(0, -1))\n setSelectedIndex(0)\n return true\n }\n\n if (isPlainChar) {\n setSearchQuery(prev => prev + inputChar)\n setSelectedIndex(0)\n return true\n }\n\n return true\n }\n\n if (mode.kind === 'confirmRemove') {\n if (inputChar === 'y' || key.return) {\n const target = mode.target\n if (target.kind === 'rule') {\n applyUpdate({\n type: 'removeRules',\n destination: target.destination,\n behavior: target.behavior,\n rules: [target.rule],\n })\n } else if (target.kind === 'dir') {\n applyUpdate({\n type: 'removeDirectories',\n destination: target.destination,\n directories: [target.path],\n })\n }\n setMode({ kind: 'list' })\n return true\n }\n if (inputChar === 'n' || key.escape) {\n setMode({ kind: 'list' })\n return true\n }\n return\n }\n\n if (mode.kind === 'addRule') {\n if (mode.step === 'behavior') {\n if (key.escape) {\n setMode({ kind: 'list' })\n return true\n }\n if (key.upArrow || inputChar === 'k') {\n setDraftBehaviorIndex(prev => Math.max(0, prev - 1))\n return true\n }\n if (key.downArrow || inputChar === 'j') {\n setDraftBehaviorIndex(prev =>\n Math.min(BEHAVIORS.length - 1, prev + 1),\n )\n return true\n }\n if (key.return) {\n setMode({ kind: 'addRule', step: 'destination' })\n return true\n }\n return\n }\n if (mode.step === 'destination') {\n if (key.escape) {\n setMode({ kind: 'list' })\n return true\n }\n if (key.upArrow || inputChar === 'k') {\n setDraftDestinationIndex(prev => Math.max(0, prev - 1))\n return true\n }\n if (key.downArrow || inputChar === 'j') {\n setDraftDestinationIndex(prev =>\n Math.min(DESTINATIONS.length - 1, prev + 1),\n )\n return true\n }\n if (key.return) {\n setDraftInput('')\n setMode({ kind: 'addRule', step: 'input' })\n return true\n }\n return\n }\n if (mode.step === 'input') {\n if (key.escape) {\n setMode({ kind: 'list' })\n return true\n }\n if (key.backspace || key.delete) {\n setDraftInput(prev => prev.slice(0, -1))\n return true\n }\n if (key.return) {\n const rule = normalizeString(draftInput)\n if (!rule) {\n setMode({ kind: 'list' })\n return true\n }\n const behavior = BEHAVIORS[draftBehaviorIndex] ?? 'allow'\n const destination = DESTINATIONS[draftDestinationIndex] ?? 'session'\n applyUpdate({\n type: 'addRules',\n destination,\n behavior,\n rules: [rule],\n })\n setMode({ kind: 'list' })\n return true\n }\n if (inputChar) {\n setDraftInput(prev => prev + inputChar)\n return true\n }\n return\n }\n }\n\n if (mode.kind === 'addDir') {\n if (mode.step === 'destination') {\n if (key.escape) {\n setMode({ kind: 'list' })\n return true\n }\n if (key.upArrow || inputChar === 'k') {\n setDraftDestinationIndex(prev => Math.max(0, prev - 1))\n return true\n }\n if (key.downArrow || inputChar === 'j') {\n setDraftDestinationIndex(prev =>\n Math.min(DESTINATIONS.length - 1, prev + 1),\n )\n return true\n }\n if (key.return) {\n setDraftInput('')\n setMode({ kind: 'addDir', step: 'input' })\n return true\n }\n return\n }\n if (mode.step === 'input') {\n if (key.escape) {\n setMode({ kind: 'list' })\n return true\n }\n if (key.backspace || key.delete) {\n setDraftInput(prev => prev.slice(0, -1))\n return true\n }\n if (key.return) {\n const path = normalizeString(draftInput)\n if (!path) {\n setMode({ kind: 'list' })\n return true\n }\n const destination = DESTINATIONS[draftDestinationIndex] ?? 'session'\n applyUpdate({\n type: 'addDirectories',\n destination,\n directories: [path],\n })\n setMode({ kind: 'list' })\n return true\n }\n if (inputChar) {\n setDraftInput(prev => prev + inputChar)\n return true\n }\n return\n }\n }\n\n if (mode.kind === 'list') {\n if (key.escape) {\n onDone(dirty ? 'Permissions updated' : 'Permissions dialog dismissed')\n return true\n }\n\n if (inputChar === '/' && isPlainChar) {\n setIsSearchMode(true)\n setSearchQuery('')\n setSelectedIndex(0)\n return true\n }\n\n if (\n isPlainChar &&\n inputChar.length > 0 &&\n !/^\\s+$/.test(inputChar) &&\n !['j', 'k', 'm', 'i', 'a', 'A', 'g', 'G', '/'].includes(inputChar)\n ) {\n setIsSearchMode(true)\n setSearchQuery(inputChar)\n setSelectedIndex(0)\n return true\n }\n\n if (inputChar === 'a') {\n setDraftBehaviorIndex(0)\n setDraftDestinationIndex(0)\n setDraftInput('')\n setMode({ kind: 'addRule', step: 'behavior' })\n setIsSearchMode(false)\n return true\n }\n if (inputChar === 'A') {\n setDraftDestinationIndex(0)\n setDraftInput('')\n setMode({ kind: 'addDir', step: 'destination' })\n setIsSearchMode(false)\n return true\n }\n\n if (key.upArrow || inputChar === 'k') {\n if (selectedIndex === 0 && key.upArrow) {\n setIsSearchMode(true)\n return true\n }\n setSelectedIndex(prev => Math.max(0, prev - 1))\n return true\n }\n if (key.downArrow || inputChar === 'j') {\n setSelectedIndex(prev =>\n Math.min(Math.max(0, visibleItems.length - 1), prev + 1),\n )\n return true\n }\n if (key.pageUp) {\n setSelectedIndex(prev => Math.max(0, prev - window.visibleCount))\n return true\n }\n if (key.pageDown) {\n setSelectedIndex(prev =>\n Math.min(\n Math.max(0, visibleItems.length - 1),\n prev + window.visibleCount,\n ),\n )\n return true\n }\n if (key.home || inputChar === 'g') {\n setSelectedIndex(0)\n return true\n }\n if (key.end || inputChar === 'G') {\n setSelectedIndex(Math.max(0, visibleItems.length - 1))\n return true\n }\n\n if (key.return) {\n const item = selectedItem\n if (!item) return true\n if (item.kind === 'action') {\n if (item.id === 'add-rule') {\n setDraftBehaviorIndex(0)\n setDraftDestinationIndex(0)\n setDraftInput('')\n setMode({ kind: 'addRule', step: 'behavior' })\n setIsSearchMode(false)\n return true\n }\n if (item.id === 'add-dir') {\n setDraftDestinationIndex(0)\n setDraftInput('')\n setMode({ kind: 'addDir', step: 'destination' })\n setIsSearchMode(false)\n return true\n }\n }\n\n if (item.kind === 'rule' || item.kind === 'dir') {\n setMode({ kind: 'confirmRemove', target: item })\n setIsSearchMode(false)\n return true\n }\n }\n }\n },\n { priority: KEYPRESS_PRIORITY.FULLSCREEN_OVERLAY },\n )\n\n const header =\n mode.kind === 'addRule' && mode.step === 'input'\n ? `Rule: ${draftInput}`\n : mode.kind === 'addDir' && mode.step === 'input'\n ? `Directory: ${draftInput}`\n : null\n\n const helpLine =\n mode.kind === 'list' && isSearchMode\n ? 'Type to search \u00B7 Enter/\u2193 done \u00B7 Esc clear/back'\n : mode.kind === 'confirmRemove'\n ? 'y/Enter confirm \u00B7 n cancel \u00B7 Esc close'\n : mode.kind === 'addRule' && mode.step === 'input'\n ? 'Enter save \u00B7 Esc close'\n : mode.kind === 'addDir' && mode.step === 'input'\n ? 'Enter save \u00B7 Esc close'\n : mode.kind === 'list'\n ? 'Press \u2191\u2193 to navigate \u00B7 Enter to select \u00B7 Type to search \u00B7 Esc to cancel'\n : 'Esc back'\n\n const title =\n mode.kind === 'confirmRemove'\n ? 'Remove permission?'\n : mode.kind === 'addRule'\n ? 'Add rule'\n : mode.kind === 'addDir'\n ? 'Add directory'\n : 'Permissions'\n\n const listToRender =\n mode.kind === 'addRule' && mode.step !== 'input'\n ? mode.step === 'behavior'\n ? BEHAVIORS.map((b, idx) => ({\n label: b,\n selected: idx === draftBehaviorIndex,\n }))\n : DESTINATIONS.map((d, idx) => ({\n label: d,\n selected: idx === draftDestinationIndex,\n }))\n : mode.kind === 'addDir' && mode.step === 'destination'\n ? DESTINATIONS.map((d, idx) => ({\n label: d,\n selected: idx === draftDestinationIndex,\n }))\n : visibleItems.slice(window.start, window.end).map((item, idx) => ({\n label: labelForItem(item),\n selected: window.start + idx === clampedSelectedIndex,\n item,\n }))\n\n return (\n <ScreenFrame\n title={title}\n exitState={exitState}\n paddingX={layout.paddingX}\n paddingY={layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\" gap={layout.gap}>\n {mode.kind === 'list' ? (\n <SearchBox\n query={searchQuery}\n isFocused={isSearchMode}\n isTerminalFocused={true}\n />\n ) : null}\n {header ? (\n <Text dimColor wrap=\"truncate-end\">\n {header}\n </Text>\n ) : null}\n <Box flexDirection=\"column\" width=\"100%\">\n <Text dimColor wrap=\"truncate-end\">\n {window.showUpIndicator ? `${figures.arrowUp} More` : ' '}\n </Text>\n\n {listToRender.map((row: any, idx: number) => {\n const isSelected = Boolean(row.selected)\n const label = String(row.label ?? '')\n return (\n <Box key={idx} flexDirection=\"row\" gap={1}>\n <Text color={isSelected ? theme.kode : theme.secondaryText}>\n {isSelected ? figures.pointer : ' '}\n </Text>\n <Text\n bold={isSelected}\n color={isSelected ? theme.text : undefined}\n wrap=\"truncate-end\"\n >\n {label}\n </Text>\n </Box>\n )\n })}\n\n <Text dimColor wrap=\"truncate-end\">\n {window.showDownIndicator ? `${figures.arrowDown} More` : ' '}\n </Text>\n </Box>\n\n {mode.kind === 'confirmRemove' ? (\n <Text color={theme.warning} wrap=\"truncate-end\">\n Remove: {labelForItem(mode.target)}\n </Text>\n ) : null}\n\n <Text dimColor wrap=\"truncate-end\">\n {helpLine}\n </Text>\n </Box>\n </ScreenFrame>\n )\n}\n", "import React from 'react'\nimport { Box, Text } from 'ink'\nimport { getTheme } from '#core/utils/theme'\n\nexport function SearchBox({\n query,\n placeholder = 'Search\u2026',\n isFocused,\n isTerminalFocused = true,\n prefix = '\u2315',\n width,\n}: {\n query: string\n placeholder?: string\n isFocused: boolean\n isTerminalFocused?: boolean\n prefix?: string\n width?: number\n}): React.ReactNode {\n const theme = getTheme()\n const safePlaceholder = placeholder.length > 0 ? placeholder : ' '\n\n return (\n <Box\n flexShrink={0}\n borderStyle=\"round\"\n borderColor={isFocused ? theme.suggestion : undefined}\n borderDimColor={!isFocused}\n paddingX={1}\n width={width ?? '100%'}\n >\n <Text dimColor={!isFocused} wrap=\"truncate-end\">\n {prefix}{' '}\n {isFocused ? (\n query ? (\n <>\n <Text>{query}</Text>\n {isTerminalFocused ? <Text>\u2588</Text> : null}\n </>\n ) : isTerminalFocused ? (\n <>\n <Text inverse>{safePlaceholder.charAt(0)}</Text>\n <Text dimColor>{safePlaceholder.slice(1)}</Text>\n </>\n ) : (\n <Text dimColor>{safePlaceholder}</Text>\n )\n ) : query ? (\n <Text>{query}</Text>\n ) : (\n <Text>{safePlaceholder}</Text>\n )}\n </Text>\n </Box>\n )\n}\n", "import type { Command } from '../types'\n\nimport { Text } from 'ink'\nimport React from 'react'\n\nconst exit = {\n type: 'local-jsx',\n name: 'exit',\n description: 'Exit the CLI',\n isEnabled: true,\n isHidden: false,\n async call() {\n setTimeout(() => {\n process.exit(0)\n }, 150)\n\n return <Text>Exiting\u2026</Text>\n },\n userFacingName() {\n return 'exit'\n },\n} satisfies Command\n\nexport default exit\n", "import React from 'react'\nimport type { Command } from '../types'\nimport { Doctor } from '#ui-ink/screens/Doctor'\nimport { PRODUCT_NAME } from '#core/constants/product'\n\nconst doctor: Command = {\n name: 'doctor',\n description: `Checks the health of your ${PRODUCT_NAME} installation`,\n isEnabled: true,\n isHidden: false,\n ui: { displayMode: 'fullscreen' },\n userFacingName() {\n return 'doctor'\n },\n type: 'local-jsx',\n call(onDone, context) {\n const element = React.createElement(Doctor, {\n onDone,\n doctorMode: true,\n toolPermissionContext: context.options?.toolPermissionContext,\n })\n return Promise.resolve(element)\n },\n}\n\nexport default doctor\n", "import type { Command } from '../types'\n\nimport { existsSync, readdirSync, statSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { CACHE_PATHS } from '#core/utils/log'\nimport { launchExternalEditorForFilePath } from '#cli-utils/externalEditor'\n\ntype DumpFile = {\n name: string\n path: string\n mtimeMs: number\n}\n\nfunction listDumpFiles(dir: string): DumpFile[] {\n if (!existsSync(dir)) return []\n\n let names: string[]\n try {\n names = readdirSync(dir)\n } catch {\n return []\n }\n\n const files: DumpFile[] = []\n for (const name of names) {\n if (!name.endsWith('.txt')) continue\n const path = join(dir, name)\n try {\n const st = statSync(path)\n if (!st.isFile()) continue\n files.push({ name, path, mtimeMs: st.mtimeMs })\n } catch {\n continue\n }\n }\n\n files.sort((a, b) => b.mtimeMs - a.mtimeMs)\n return files\n}\n\nfunction matchDumpFile(files: DumpFile[], query: string): DumpFile[] {\n const q = query.trim()\n if (!q || q === 'latest') return files.slice(0, 1)\n return files.filter(f => f.name.includes(q))\n}\n\nconst gateDump = {\n type: 'local',\n name: 'gate-dump',\n description: 'Open the latest Bash LLM gate failure dump',\n isEnabled: true,\n isHidden: false,\n argumentHint: '[latest|list|<substring>]',\n userFacingName() {\n return 'gate-dump'\n },\n aliases: ['gate-dumps', 'bash-gate-dump'],\n async call(args) {\n const dir = join(CACHE_PATHS.errors(), 'bash-llm-gate')\n const files = listDumpFiles(dir)\n if (files.length === 0) {\n return `No Bash LLM gate dumps found at: ${dir}`\n }\n\n const query = (args ?? '').trim()\n if (query === 'list') {\n return [\n `Bash LLM gate dumps (${files.length}):`,\n ...files.map(f => f.path),\n ].join('\\n')\n }\n\n const matches = matchDumpFile(files, query)\n if (matches.length === 0) {\n return `No dump matches \"${query}\". Directory: ${dir}`\n }\n if (matches.length > 1) {\n return [\n `Multiple dumps match \"${query}\" (${matches.length}):`,\n ...matches.slice(0, 20).map(f => f.path),\n ...(matches.length > 20 ? ['(truncated)'] : []),\n ].join('\\n')\n }\n\n const file = matches[0]!\n const opened = await launchExternalEditorForFilePath(file.path)\n if (!('error' in opened)) {\n return `Opened: ${file.path} (${opened.editorLabel})`\n }\n return `Could not open editor. File: ${file.path}. Error: ${opened.error.message}`\n },\n} satisfies Command\n\nexport default gateDump\n", "import { spawn, spawnSync } from 'child_process'\nimport { mkdtempSync, readFileSync, rmSync, writeFileSync } from 'fs'\nimport { tmpdir } from 'os'\nimport { join } from 'path'\nimport {\n disableLineWrapping,\n enableLineWrapping,\n withEphemeralAlternateScreen,\n} from '#cli-utils/terminal'\nimport { writeToStdout } from '#cli-utils/stdio'\nimport { getInkInstanceForStdout } from '#ui-ink/utils/inkInstanceStore'\nimport { terminalCapabilityManager } from '#ui-ink/utils/terminalCapabilityManager'\n\ntype EditorCommand = {\n command: string\n args: string[]\n displayName: string\n shell?: boolean\n}\n\nconst isWindows = process.platform === 'win32'\n\nfunction showTerminalCursor(): void {\n if (!process.stdout?.isTTY) return\n // Reset styles + show cursor for full-screen editors.\n writeToStdout('\\x1b[0m\\x1b[?25h')\n}\n\nfunction hideTerminalCursor(): void {\n if (!process.stdout?.isTTY) return\n writeToStdout('\\x1b[?25l')\n}\n\nasync function withSuspendedInk<T>(fn: () => Promise<T> | T): Promise<T> {\n const stdout = process.stdout as NodeJS.WriteStream\n const instance = getInkInstanceForStdout(stdout)\n const hasInk = Boolean(instance)\n const screenReaderEnv =\n process.env.KODE_SCREEN_READER ?? process.env.SCREENREADER\n\n try {\n instance?.pause?.()\n instance?.suspendStdin?.()\n terminalCapabilityManager.disableAllModes()\n enableLineWrapping()\n showTerminalCursor()\n return await withEphemeralAlternateScreen(fn)\n } finally {\n if (hasInk) {\n hideTerminalCursor()\n if (!screenReaderEnv) {\n disableLineWrapping()\n }\n }\n terminalCapabilityManager.enableSupportedModes()\n instance?.resumeStdin?.()\n instance?.resume?.()\n }\n}\n\nfunction isCommandAvailable(command: string): boolean {\n const checker = isWindows ? 'where' : 'which'\n const result = spawnSync(checker, [command], { stdio: 'ignore' })\n return result.status === 0\n}\n\nfunction resolveEditorCommand(): EditorCommand | null {\n const envEditor = process.env.VISUAL || process.env.EDITOR\n if (envEditor?.trim()) {\n return {\n command: envEditor.trim(),\n args: [],\n displayName: envEditor.trim(),\n shell: true, // Allow quoted paths or extra flags\n }\n }\n\n const candidates: EditorCommand[] = []\n\n if (isCommandAvailable('code')) {\n candidates.push({\n command: 'code',\n args: ['-w'],\n displayName: 'code -w',\n })\n }\n\n if (!isWindows) {\n if (isCommandAvailable('nano')) {\n candidates.push({\n command: 'nano',\n args: [],\n displayName: 'nano',\n })\n }\n if (isCommandAvailable('vim')) {\n candidates.push({\n command: 'vim',\n args: [],\n displayName: 'vim',\n })\n }\n if (isCommandAvailable('open')) {\n candidates.push({\n command: 'open',\n args: ['-W', '-t'],\n displayName: 'open -W -t',\n })\n }\n } else {\n // Windows: check for VS Code first, then fallback to notepad\n if (candidates.length > 0) {\n const found = candidates.find(c => isCommandAvailable(c.command))\n if (found) return found\n }\n // notepad is always available on Windows\n return {\n command: 'notepad.exe',\n args: [],\n displayName: 'notepad',\n shell: true,\n }\n }\n\n return (\n candidates.find(candidate => isCommandAvailable(candidate.command)) ?? null\n )\n}\n\nfunction restoreStdinState(previouslyRaw: boolean): void {\n if (!process.stdin.isTTY) return\n process.stdin.resume()\n if (previouslyRaw && process.stdin.setRawMode) {\n process.stdin.setRawMode(true)\n }\n}\n\nfunction normalizeNewlines(text: string): string {\n return text.replace(/\\r\\n/g, '\\n')\n}\n\nexport type ExternalEditorResult =\n | { text: string; editorLabel: string }\n | { text: null; editorLabel?: string; error: Error }\n\nexport async function launchExternalEditor(\n initialText: string,\n): Promise<ExternalEditorResult> {\n const editorCommand = resolveEditorCommand()\n if (!editorCommand) {\n return {\n text: null,\n error: new Error(\n 'No editor found. Set $VISUAL or $EDITOR, or install code, nano, vim, or notepad.',\n ),\n }\n }\n\n const dir = mkdtempSync(join(tmpdir(), 'kode-edit-'))\n const filePath = join(dir, 'message.txt')\n writeFileSync(filePath, initialText, 'utf-8')\n\n const wasRaw = Boolean(process.stdin.isTTY && process.stdin.isRaw)\n if (process.stdin.isTTY) {\n process.stdin.pause()\n if (process.stdin.setRawMode) {\n process.stdin.setRawMode(false)\n }\n }\n\n try {\n await withSuspendedInk(async () => {\n await new Promise<void>((resolve, reject) => {\n const child = spawn(\n editorCommand.command,\n [...editorCommand.args, filePath],\n {\n stdio: 'inherit',\n shell: editorCommand.shell ?? false,\n },\n )\n\n child.on('error', reject)\n child.on('exit', (code, signal) => {\n if (code === 0 || code === null) {\n resolve()\n } else {\n reject(\n new Error(\n `Editor exited with code ${code}${signal ? ` (signal ${signal})` : ''}`,\n ),\n )\n }\n })\n })\n })\n } catch (error) {\n restoreStdinState(wasRaw)\n rmSync(dir, { recursive: true, force: true })\n return {\n text: null,\n editorLabel: editorCommand.displayName,\n error: error as Error,\n }\n }\n\n restoreStdinState(wasRaw)\n\n try {\n const edited = normalizeNewlines(readFileSync(filePath, 'utf-8'))\n rmSync(dir, { recursive: true, force: true })\n return { text: edited, editorLabel: editorCommand.displayName }\n } catch (error) {\n rmSync(dir, { recursive: true, force: true })\n return {\n text: null,\n editorLabel: editorCommand.displayName,\n error: error as Error,\n }\n }\n}\n\nexport type ExternalEditorFileResult =\n | { ok: true; editorLabel: string }\n | { ok: false; editorLabel?: string; error: Error }\n\nexport async function launchExternalEditorForFilePath(\n filePath: string,\n): Promise<ExternalEditorFileResult> {\n const editorCommand = resolveEditorCommand()\n if (!editorCommand) {\n return {\n ok: false,\n error: new Error(\n 'No editor found. Set $VISUAL or $EDITOR, or install code, nano, vim, or notepad.',\n ),\n }\n }\n\n const wasRaw = Boolean(process.stdin.isTTY && process.stdin.isRaw)\n if (process.stdin.isTTY) {\n process.stdin.pause()\n if (process.stdin.setRawMode) {\n process.stdin.setRawMode(false)\n }\n }\n\n try {\n await withSuspendedInk(async () => {\n await new Promise<void>((resolve, reject) => {\n const child = spawn(\n editorCommand.command,\n [...editorCommand.args, filePath],\n {\n stdio: 'inherit',\n shell: editorCommand.shell ?? false,\n },\n )\n\n child.on('error', reject)\n child.on('exit', (code, signal) => {\n if (code === 0 || code === null) {\n resolve()\n } else {\n reject(\n new Error(\n `Editor exited with code ${code}${signal ? ` (signal ${signal})` : ''}`,\n ),\n )\n }\n })\n })\n })\n } catch (error) {\n restoreStdinState(wasRaw)\n return {\n ok: false,\n editorLabel: editorCommand.displayName,\n error: error as Error,\n }\n }\n\n restoreStdinState(wasRaw)\n return { ok: true, editorLabel: editorCommand.displayName }\n}\n", "import React, { useCallback, useMemo, useRef, useState } from 'react'\nimport { Box, Text } from 'ink'\nimport { mkdirSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport figures from 'figures'\nimport type { Command } from '#cli-commands'\nimport { PRODUCT_COMMAND, PRODUCT_NAME } from '#core/constants/product'\nimport { CACHE_PATHS, DATE } from '#core/logging/log/paths'\nimport { MACRO } from '#core/constants/macros'\nimport { getTheme } from '#core/utils/theme'\nimport {\n getCustomCommandDirectories,\n hasCustomCommands,\n type CustomCommandWithScope,\n} from '#cli-services/customCommands'\nimport { copyTextToClipboard } from '#cli-utils/clipboard'\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'\nimport { wrapLines } from '#ui-ink/primitives/text/wrapLines'\n\nconst VIEWPORT_SAFE_MARGIN_ROWS = 1\nconst INDICATOR_ROWS = 2\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n\nfunction isCustomCommandWithScope(cmd: Command): cmd is CustomCommandWithScope {\n if (cmd.type !== 'prompt') return false\n const scope = (cmd as unknown as Record<string, unknown>).scope\n return scope === 'project' || scope === 'user'\n}\n\nfunction getHelpPath(): string {\n return join(CACHE_PATHS.errors(), `help-${DATE}.txt`)\n}\n\nfunction buildHelpLines(commands: Command[]): string[] {\n const filteredCommands = commands.filter(cmd => !cmd.isHidden)\n const customCommands = filteredCommands.filter(isCustomCommandWithScope)\n const builtInCommands = filteredCommands.filter(\n cmd => !isCustomCommandWithScope(cmd),\n )\n\n const dirs = getCustomCommandDirectories()\n\n const lines: string[] = []\n\n lines.push(`${PRODUCT_NAME} v${MACRO.VERSION}`)\n lines.push('')\n lines.push(\n `${PRODUCT_NAME} is a beta research preview. Always review responses, especially when running code.`,\n )\n lines.push('')\n\n lines.push('Usage')\n lines.push(`- REPL: ${PRODUCT_COMMAND}`)\n lines.push(`- Non-interactive: ${PRODUCT_COMMAND} -p \"question\"`)\n lines.push(`- CLI options: ${PRODUCT_COMMAND} -h`)\n lines.push('')\n\n lines.push('Keyboard shortcuts (REPL)')\n lines.push('- ?: Shortcuts (when input is empty)')\n lines.push('- F1: Help')\n lines.push('- F2: Config')\n lines.push('- F3: Open file')\n lines.push('- F4: Console (captured stdout/stderr)')\n lines.push('- F5: Notifications')\n lines.push('- F6: Transcript (scroll/copy)')\n lines.push('- F7: Command palette')\n lines.push('- F8: Tasks (background tasks)')\n lines.push('- Ctrl+O: Toggle verbose transcript')\n lines.push('- Ctrl+T: Todos')\n lines.push('- Ctrl+R: History search')\n lines.push('- Alt+P: Model picker')\n lines.push('- Ctrl+G: External editor')\n lines.push('- Ctrl+S: Stash prompt')\n lines.push('- Ctrl+_: Undo')\n lines.push('- Double Esc: Clear input')\n lines.push('- Shift+Tab: Cycle permission mode')\n lines.push('- Down Arrow (empty input): Tasks (when available)')\n lines.push('')\n\n lines.push('Common tasks')\n lines.push('- Ask questions about your codebase')\n lines.push(' > How does foo.py work?')\n lines.push('- Edit files')\n lines.push(' > Update bar.ts to...')\n lines.push('- Run bash commands')\n lines.push(' > !ls')\n lines.push('')\n\n lines.push('Commands')\n for (const cmd of builtInCommands) {\n lines.push(`- /${cmd.name} \u2014 ${cmd.description}`)\n }\n\n if (customCommands.length > 0) {\n lines.push('')\n lines.push('Custom commands')\n for (const cmd of customCommands) {\n const scope = cmd.scope ? ` [${cmd.scope}]` : ''\n const aliases =\n cmd.aliases && cmd.aliases.length > 0\n ? ` (aliases: ${cmd.aliases.join(', ')})`\n : ''\n lines.push(`- /${cmd.name}${scope} \u2014 ${cmd.description}${aliases}`)\n }\n }\n\n lines.push('')\n lines.push(`Learn more: ${MACRO.README_URL}`)\n\n lines.push('')\n lines.push('Custom command directories')\n lines.push(`- ${dirs.userKodeCommands}`)\n lines.push(`- ${dirs.projectKodeCommands}`)\n lines.push(`- ${dirs.userKodeSkills}`)\n lines.push(`- ${dirs.projectKodeSkills}`)\n lines.push('')\n lines.push('Legacy directories (also loaded)')\n lines.push(`- ${dirs.userLegacyCommands}`)\n lines.push(`- ${dirs.projectLegacyCommands}`)\n lines.push(`- ${dirs.userLegacySkills}`)\n lines.push(`- ${dirs.projectLegacySkills}`)\n lines.push(`- Reload: /refresh-commands`)\n\n if (!hasCustomCommands()) {\n lines.push('')\n lines.push(\n 'Tip: create custom commands by adding `.md` files to the paths above.',\n )\n }\n\n return lines\n}\n\nexport function HelpScreen({\n commands,\n onDone,\n}: {\n commands: Command[]\n onDone: (result?: string) => void\n}): 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 (result?: string) => {\n if (didDoneRef.current) return\n didDoneRef.current = true\n onDone(result)\n },\n [onDone],\n )\n\n const [scrollTop, setScrollTop] = useState(0)\n const [status, setStatus] = useState<string | null>(null)\n const [savedPath, setSavedPath] = useState<string | null>(null)\n\n const rawLines = useMemo(() => buildHelpLines(commands), [commands])\n const wrapped = useMemo(() => {\n const width = Math.max(1, layout.columns - layout.paddingX * 2)\n return wrapLines(rawLines, width)\n }, [layout.columns, layout.paddingX, rawLines])\n\n const frameHeaderRows = 1\n const frameRows = frameHeaderRows + 1 + layout.gap * 2 + layout.paddingY * 2\n const innerReservedRows =\n 1 + // shortcut line\n 1 + // status line\n INDICATOR_ROWS +\n 1 // tip line\n\n const contentRows = Math.max(\n 1,\n layout.rows - frameRows - innerReservedRows - VIEWPORT_SAFE_MARGIN_ROWS,\n )\n\n const maxScrollTop = Math.max(0, wrapped.length - contentRows)\n\n const copyAll = useCallback(async () => {\n try {\n const result = await copyTextToClipboard(rawLines.join('\\n') + '\\n')\n if (result.method === 'osc52' && result.truncated) {\n setStatus('Copied (OSC 52, truncated).')\n } else {\n setStatus('Copied to clipboard.')\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n setStatus(`Copy failed: ${message}`)\n }\n }, [rawLines])\n\n const save = useCallback(() => {\n try {\n const path = getHelpPath()\n mkdirSync(CACHE_PATHS.errors(), { recursive: true })\n writeFileSync(path, rawLines.join('\\n') + '\\n', 'utf8')\n setSavedPath(path)\n setStatus(`Saved to ${path}`)\n return path\n } catch {\n setStatus('Failed to save help')\n return null\n }\n }, [rawLines])\n\n useKeypress(\n (input, key) => {\n const inputChar = input.length === 1 ? input : ''\n\n if (key.escape || (key.ctrl && inputChar === 'c')) {\n safeOnDone()\n return true\n }\n\n if (key.upArrow || inputChar === 'k') {\n setScrollTop(prev => clamp(prev - 1, 0, maxScrollTop))\n return true\n }\n\n if (key.downArrow || inputChar === 'j') {\n setScrollTop(prev => clamp(prev + 1, 0, maxScrollTop))\n return true\n }\n\n if (key.pageUp) {\n setScrollTop(prev => clamp(prev - contentRows, 0, maxScrollTop))\n return true\n }\n\n if (key.pageDown) {\n setScrollTop(prev => clamp(prev + contentRows, 0, maxScrollTop))\n return true\n }\n\n if (key.home || inputChar === 'g') {\n setScrollTop(0)\n return true\n }\n\n if (key.end || inputChar === 'G') {\n setScrollTop(maxScrollTop)\n return true\n }\n\n if (inputChar === 'y') {\n void copyAll()\n return true\n }\n\n if (inputChar === 's') {\n save()\n return true\n }\n },\n { priority: KEYPRESS_PRIORITY.FULLSCREEN_OVERLAY },\n )\n\n const clampedScrollTop = clamp(scrollTop, 0, maxScrollTop)\n const hiddenAbove = clampedScrollTop\n const hiddenBelow = Math.max(\n 0,\n wrapped.length - (clampedScrollTop + contentRows),\n )\n\n const visible = useMemo(() => {\n return wrapped.slice(clampedScrollTop, clampedScrollTop + contentRows)\n }, [clampedScrollTop, contentRows, wrapped])\n\n const topIndicator = hiddenAbove\n ? `${figures.arrowUp} ${hiddenAbove} more`\n : ' '\n const bottomIndicator = hiddenBelow\n ? `${figures.arrowDown} ${hiddenBelow} more`\n : ' '\n\n const statusLine =\n status ??\n (wrapped.length > 0\n ? `Showing ${Math.min(contentRows, wrapped.length)} of ${wrapped.length} lines`\n : 'Empty help')\n\n return (\n <ScreenFrame\n title=\"Help\"\n exitState={exitState}\n paddingX={layout.paddingX}\n paddingY={layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\">\n <Text dimColor wrap=\"truncate-end\">\n Scroll: \u2191\u2193 j/k PgUp/PgDn Home/End \u00B7 y copy \u00B7 s save \u00B7 Esc/Ctrl+C close\n </Text>\n <Text color={theme.secondaryText} wrap=\"truncate-end\">\n {statusLine}\n </Text>\n\n <Text dimColor wrap=\"truncate-end\">\n {topIndicator}\n </Text>\n {visible.length > 0 ? (\n visible.map((line, idx) => (\n <Text key={`${clampedScrollTop}:${idx}`} wrap=\"truncate-end\">\n {line}\n </Text>\n ))\n ) : (\n <Text dimColor>(empty)</Text>\n )}\n <Text dimColor wrap=\"truncate-end\">\n {bottomIndicator}\n </Text>\n\n <Text dimColor wrap=\"truncate-end\">\n {savedPath\n ? `Saved: ${savedPath}`\n : `Tip: press 's' to save to ${getHelpPath()}`}\n </Text>\n </Box>\n </ScreenFrame>\n )\n}\n", "import { spawn, spawnSync } from 'node:child_process'\nimport fs from 'node:fs'\nimport type { Writable } from 'node:stream'\n\nconst ESC = '\\u001b'\nconst BEL = '\\u0007'\nconst ST = '\\u001b\\\\'\n\nconst MAX_OSC52_SEQUENCE_BYTES = 100_000\nconst OSC52_HEADER = `${ESC}]52;c;`\nconst OSC52_FOOTER = BEL\nconst MAX_OSC52_BODY_B64_BYTES =\n MAX_OSC52_SEQUENCE_BYTES -\n Buffer.byteLength(OSC52_HEADER) -\n Buffer.byteLength(OSC52_FOOTER)\nconst MAX_OSC52_DATA_BYTES = Math.floor(MAX_OSC52_BODY_B64_BYTES / 4) * 3\n\nconst SCREEN_DCS_CHUNK_SIZE = 240\n\ntype TtyTarget = { stream: Writable; closeAfter: boolean } | null\n\nexport type CopyToClipboardMethod = 'osc52' | 'system'\n\nexport type CopyToClipboardResult = {\n method: CopyToClipboardMethod\n truncated: boolean\n}\n\nfunction inTmux(): boolean {\n return Boolean(\n process.env.TMUX || (process.env.TERM ?? '').startsWith('tmux'),\n )\n}\n\nfunction inScreen(): boolean {\n return Boolean(\n process.env.STY || (process.env.TERM ?? '').startsWith('screen'),\n )\n}\n\nfunction isSSH(): boolean {\n return Boolean(\n process.env.SSH_TTY || process.env.SSH_CONNECTION || process.env.SSH_CLIENT,\n )\n}\n\nfunction isWSL(): boolean {\n return Boolean(\n process.env.WSL_DISTRO_NAME ||\n process.env.WSLENV ||\n process.env.WSL_INTEROP,\n )\n}\n\nfunction isDumbTerm(): boolean {\n return (process.env.TERM ?? '') === 'dumb'\n}\n\nfunction shouldUseOsc52(tty: TtyTarget): boolean {\n return (\n Boolean(tty) &&\n !isDumbTerm() &&\n // Prefer OSC-52 when the process is running on a remote host (SSH),\n // where system clipboard tools would typically target the remote machine.\n isSSH()\n )\n}\n\nfunction safeUtf8Truncate(\n buf: Buffer,\n maxBytes: number,\n): {\n buf: Buffer\n truncated: boolean\n} {\n if (buf.length <= maxBytes) return { buf, truncated: false }\n let end = maxBytes\n while (end > 0 && (buf[end - 1] & 0b1100_0000) === 0b1000_0000) end -= 1\n return { buf: buf.subarray(0, end), truncated: true }\n}\n\nfunction buildOsc52(text: string): { seq: string; truncated: boolean } {\n const raw = Buffer.from(text, 'utf8')\n const { buf: safe, truncated } = safeUtf8Truncate(raw, MAX_OSC52_DATA_BYTES)\n const b64 = safe.toString('base64')\n return { seq: `${OSC52_HEADER}${b64}${OSC52_FOOTER}`, truncated }\n}\n\nfunction wrapForTmux(seq: string): string {\n const doubledEsc = seq.split(ESC).join(ESC + ESC)\n return `${ESC}Ptmux;${doubledEsc}${ST}`\n}\n\nfunction wrapForScreen(seq: string): string {\n let out = ''\n for (let i = 0; i < seq.length; i += SCREEN_DCS_CHUNK_SIZE) {\n out += `${ESC}P${seq.slice(i, i + SCREEN_DCS_CHUNK_SIZE)}${ST}`\n }\n return out\n}\n\nasync function writeAll(stream: Writable, data: string): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const onError = (err: unknown) => {\n cleanup()\n reject(err as Error)\n }\n const onDrain = () => {\n cleanup()\n resolve()\n }\n const cleanup = () => {\n stream.off('error', onError)\n stream.off('drain', onDrain)\n }\n\n stream.once('error', onError)\n if (stream.write(data)) {\n cleanup()\n resolve()\n } else {\n stream.once('drain', onDrain)\n }\n })\n}\n\nfunction pickTty(): TtyTarget {\n if (process.platform !== 'win32') {\n try {\n const devTty = fs.createWriteStream('/dev/tty')\n devTty.on('error', () => {})\n return { stream: devTty, closeAfter: true }\n } catch {\n // fall through\n }\n }\n\n return null\n}\n\nfunction isCommandAvailable(command: string): boolean {\n const checker = process.platform === 'win32' ? 'where' : 'which'\n const result = spawnSync(checker, [command], { stdio: 'ignore' })\n return result.status === 0\n}\n\nasync function runClipboardCommand(args: {\n command: string\n commandArgs: string[]\n text: string\n}): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const child = spawn(args.command, args.commandArgs, {\n stdio: ['pipe', 'ignore', 'pipe'],\n windowsHide: true,\n })\n\n let stderr = ''\n const onStderr = (chunk: Buffer | string) => {\n if (stderr.length > 8_000) return\n stderr += chunk.toString()\n }\n\n child.on('error', reject)\n child.stderr?.on('data', onStderr)\n child.on('exit', code => {\n if (code === 0) {\n resolve()\n return\n }\n const message = stderr.trim() || `${args.command} exited ${String(code)}`\n reject(new Error(message))\n })\n\n child.stdin?.end(args.text, 'utf8')\n })\n}\n\nasync function copyViaSystemClipboard(text: string): Promise<void> {\n if (process.platform === 'darwin') {\n await runClipboardCommand({ command: 'pbcopy', commandArgs: [], text })\n return\n }\n\n if (process.platform === 'win32') {\n await runClipboardCommand({ command: 'clip', commandArgs: [], text })\n return\n }\n\n if (isWSL() && isCommandAvailable('clip.exe')) {\n await runClipboardCommand({ command: 'clip.exe', commandArgs: [], text })\n return\n }\n\n if (isCommandAvailable('wl-copy')) {\n await runClipboardCommand({ command: 'wl-copy', commandArgs: [], text })\n return\n }\n\n if (isCommandAvailable('xclip')) {\n await runClipboardCommand({\n command: 'xclip',\n commandArgs: ['-selection', 'clipboard'],\n text,\n })\n return\n }\n\n if (isCommandAvailable('xsel')) {\n await runClipboardCommand({\n command: 'xsel',\n commandArgs: ['--clipboard', '--input'],\n text,\n })\n return\n }\n\n throw new Error(\n 'No clipboard backend found. Install wl-copy (Wayland) or xclip/xsel (X11), or use a terminal that supports OSC 52.',\n )\n}\n\nexport async function copyTextToClipboard(\n text: string,\n): Promise<CopyToClipboardResult> {\n if (!text.trim()) return { method: 'system', truncated: false }\n\n const tty = pickTty()\n const canUseOsc52 = Boolean(tty) && !isDumbTerm()\n\n if (shouldUseOsc52(tty)) {\n const { seq: osc, truncated } = buildOsc52(text)\n const payload = inTmux()\n ? wrapForTmux(osc)\n : inScreen()\n ? wrapForScreen(osc)\n : osc\n\n await writeAll(tty!.stream, payload)\n if (tty!.closeAfter) {\n ;(tty!.stream as fs.WriteStream).end()\n }\n return { method: 'osc52', truncated }\n }\n\n try {\n await copyViaSystemClipboard(text)\n return { method: 'system', truncated: false }\n } catch (error) {\n if (!canUseOsc52) throw error\n\n const { seq: osc, truncated } = buildOsc52(text)\n const payload = inTmux()\n ? wrapForTmux(osc)\n : inScreen()\n ? wrapForScreen(osc)\n : osc\n\n await writeAll(tty!.stream, payload)\n if (tty!.closeAfter) {\n ;(tty!.stream as fs.WriteStream).end()\n }\n return { method: 'osc52', truncated }\n }\n}\n", "import type { Command } from '../types'\nimport { HelpScreen } from '#ui-ink/screens/overlays/HelpScreen'\nimport * as React from 'react'\n\nconst help = {\n type: 'local-jsx',\n name: 'help',\n description: 'Show help and available commands',\n isEnabled: true,\n isHidden: false,\n ui: { displayMode: 'fullscreen' },\n async call(onDone, context) {\n return (\n <HelpScreen commands={context.options?.commands || []} onDone={onDone} />\n )\n },\n userFacingName() {\n return 'help'\n },\n} satisfies Command\n\nexport default help\n", "import type { Command } from '../types'\n\nimport React from 'react'\n\nimport { HooksScreen } from '#ui-ink/screens/overlays/HooksScreen'\n\nconst hooks = {\n type: 'local-jsx',\n name: 'hooks',\n description: 'Manage hook configurations for tool events',\n isEnabled: true,\n isHidden: false,\n ui: { displayMode: 'fullscreen' },\n disableNonInteractive: true,\n async call(onDone, context) {\n return React.createElement(HooksScreen, { context, onDone })\n },\n userFacingName() {\n return 'hooks'\n },\n} satisfies Command\n\nexport default hooks\n", "import React, { useMemo, useState } from 'react'\nimport { Box, Text } from 'ink'\nimport figures from 'figures'\n\nimport type { SettingsDestination, SettingsFile } from '#config'\nimport {\n loadSettingsWithLegacyFallback,\n saveSettingsToPrimaryAndSyncLegacy,\n} from '#config'\nimport {\n getDisableAllHooksState,\n listHookConfigurations,\n setDisableAllHooks,\n type HookConfigEntry,\n} from '#core/hooks'\nimport type { Hook, HookEventName } from '#core/hooks/types'\nimport type { ToolUseContext } from '#core/tooling/Tool'\nimport { getTheme } from '#core/utils/theme'\nimport { getCwd } from '#core/utils/state'\nimport { useExitOnCtrlCD } from '#ui-ink/hooks/useExitOnCtrlCD'\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'\nimport { getWindowedList } from '#ui-ink/primitives/list/windowedList'\n\ntype Props = {\n context: ToolUseContext\n onDone: (result?: string) => void\n}\n\ntype Mode =\n | { kind: 'events' }\n | { kind: 'hooks'; event: HookEventName }\n | {\n kind: 'addHook'\n step: 'event' | 'destination' | 'matcher' | 'type' | 'input' | 'timeout'\n }\n | { kind: 'confirmDelete'; entry: HookConfigEntry }\n\ntype Row =\n | { kind: 'action'; id: string; label: string }\n | { kind: 'event'; event: HookEventName; count: number }\n | { kind: 'hook'; entry: HookConfigEntry; label: string }\n\nconst HOOK_EVENTS: HookEventName[] = [\n 'PreToolUse',\n 'PostToolUse',\n 'Stop',\n 'SubagentStop',\n 'UserPromptSubmit',\n 'SessionStart',\n 'SessionEnd',\n]\n\nconst DESTINATIONS: SettingsDestination[] = [\n 'localSettings',\n 'projectSettings',\n 'userSettings',\n]\n\nconst HOOK_TYPES: Array<Hook['type']> = ['command', 'prompt']\n\nfunction normalizeString(value: string): string {\n return value.replace(/\\s+/g, ' ').trim()\n}\n\nfunction hookDisplay(hook: Hook): string {\n const body =\n hook.type === 'command'\n ? hook.command\n : hook.type === 'prompt'\n ? hook.prompt\n : ''\n return normalizeString(body || '')\n}\n\nfunction sourceLabel(entry: HookConfigEntry): string {\n if (entry.source.kind === 'plugin') return 'plugin'\n return entry.source.destination\n}\n\nfunction entryLabel(entry: HookConfigEntry): string {\n const matcher = normalizeString(entry.matcher || '*') || '*'\n const timeout =\n typeof entry.hook.timeout === 'number' ? ` \u00B7 ${entry.hook.timeout}s` : ''\n return `${matcher} \u00B7 ${entry.hook.type}: ${hookDisplay(entry.hook)}${timeout} \u00B7 ${sourceLabel(entry)}`\n}\n\nfunction hookEquals(a: Hook, b: Hook): boolean {\n if (a.type !== b.type) return false\n const aTimeout = typeof a.timeout === 'number' ? a.timeout : null\n const bTimeout = typeof b.timeout === 'number' ? b.timeout : null\n if (aTimeout !== bTimeout) return false\n\n if (a.type === 'command' && b.type === 'command')\n return a.command === b.command\n if (a.type === 'prompt' && b.type === 'prompt') return a.prompt === b.prompt\n return false\n}\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 readSettingsForDestination(args: {\n destination: SettingsDestination\n projectDir: string\n}): SettingsFile {\n const loaded = loadSettingsWithLegacyFallback({\n destination: args.destination,\n projectDir: args.projectDir,\n migrateToPrimary: true,\n })\n return (loaded.settings ?? {}) as SettingsFile\n}\n\nfunction saveSettingsForDestination(args: {\n destination: SettingsDestination\n projectDir: string\n settings: SettingsFile\n}): void {\n saveSettingsToPrimaryAndSyncLegacy({\n destination: args.destination,\n projectDir: args.projectDir,\n settings: args.settings,\n syncLegacyIfExists: true,\n })\n}\n\nfunction addHookToSettings(args: {\n destination: SettingsDestination\n projectDir: string\n event: HookEventName\n matcher: string\n hook: Hook\n}): void {\n const settings = { ...readSettingsForDestination(args) } as Record<\n string,\n unknown\n >\n const hooks = asRecord(settings.hooks) ?? {}\n const existing = Array.isArray(hooks[args.event])\n ? (hooks[args.event] as unknown[])\n : []\n\n const normalizedMatcher = normalizeString(args.matcher || '*') || '*'\n\n const nextEventMatchers: any[] = []\n let appended = false\n\n for (const item of existing) {\n const rec = asRecord(item)\n if (!rec) continue\n const matcher =\n normalizeString(typeof rec.matcher === 'string' ? rec.matcher : '') || '*'\n const hooksRaw = Array.isArray(rec.hooks) ? rec.hooks : []\n\n if (matcher === normalizedMatcher) {\n nextEventMatchers.push({\n matcher,\n hooks: [...hooksRaw, args.hook],\n })\n appended = true\n } else {\n nextEventMatchers.push({ matcher, hooks: hooksRaw })\n }\n }\n\n if (!appended) {\n nextEventMatchers.push({ matcher: normalizedMatcher, hooks: [args.hook] })\n }\n\n const nextSettings: SettingsFile = {\n ...settings,\n hooks: { ...hooks, [args.event]: nextEventMatchers },\n }\n\n saveSettingsForDestination({\n destination: args.destination,\n projectDir: args.projectDir,\n settings: nextSettings,\n })\n}\n\nfunction removeHookFromSettings(args: {\n destination: SettingsDestination\n projectDir: string\n event: HookEventName\n matcher: string\n hook: Hook\n}): void {\n const settings = { ...readSettingsForDestination(args) } as Record<\n string,\n unknown\n >\n const hooks = asRecord(settings.hooks)\n if (!hooks) return\n\n const existing = Array.isArray(hooks[args.event])\n ? (hooks[args.event] as unknown[])\n : []\n const normalizedMatcher = normalizeString(args.matcher || '*') || '*'\n\n const nextEventMatchers: any[] = []\n\n for (const item of existing) {\n const rec = asRecord(item)\n if (!rec) continue\n const matcher =\n normalizeString(typeof rec.matcher === 'string' ? rec.matcher : '') || '*'\n const hooksRaw = Array.isArray(rec.hooks) ? rec.hooks : []\n\n if (matcher !== normalizedMatcher) {\n nextEventMatchers.push({ matcher, hooks: hooksRaw })\n continue\n }\n\n const filtered = hooksRaw.filter(h => {\n const hook = asRecord(h)\n if (!hook) return true\n const type = hook.type\n if (type !== 'command' && type !== 'prompt') return true\n const candidate: Hook =\n type === 'command'\n ? {\n type,\n command: String(hook.command ?? ''),\n timeout: hook.timeout as any,\n }\n : {\n type,\n prompt: String(hook.prompt ?? ''),\n timeout: hook.timeout as any,\n }\n return !hookEquals(candidate, args.hook)\n })\n\n if (filtered.length > 0) {\n nextEventMatchers.push({ matcher, hooks: filtered })\n }\n }\n\n const nextHooks: Record<string, unknown> = { ...hooks }\n if (nextEventMatchers.length > 0) nextHooks[args.event] = nextEventMatchers\n else delete nextHooks[args.event]\n\n const nextSettings: SettingsFile = { ...settings }\n if (Object.keys(nextHooks).length > 0) nextSettings.hooks = nextHooks\n else delete (nextSettings as any).hooks\n\n saveSettingsForDestination({\n destination: args.destination,\n projectDir: args.projectDir,\n settings: nextSettings,\n })\n}\n\nexport function HooksScreen({ onDone }: Props): React.ReactNode {\n const theme = getTheme()\n const layout = useScreenLayout()\n const exitState = useExitOnCtrlCD(() => onDone('Hooks dialog dismissed'))\n\n const projectDir = getCwd()\n const [status, setStatus] = useState<string | null>(null)\n const [mode, setMode] = useState<Mode>({ kind: 'events' })\n const [selectedIndex, setSelectedIndex] = useState(0)\n\n const [draftEventIndex, setDraftEventIndex] = useState(0)\n const [draftDestinationIndex, setDraftDestinationIndex] = useState(0)\n const [draftTypeIndex, setDraftTypeIndex] = useState(0)\n const [draftMatcher, setDraftMatcher] = useState('*')\n const [draftInput, setDraftInput] = useState('')\n const [draftTimeout, setDraftTimeout] = useState('')\n\n const [disableState, setDisableState] = useState(() =>\n getDisableAllHooksState({ projectDir }),\n )\n const [entries, setEntries] = useState(() =>\n listHookConfigurations(projectDir),\n )\n\n const refresh = () => {\n setDisableState(getDisableAllHooksState({ projectDir }))\n setEntries(listHookConfigurations(projectDir))\n }\n\n const countsByEvent = useMemo(() => {\n const map = new Map<HookEventName, number>()\n for (const e of HOOK_EVENTS) map.set(e, 0)\n for (const entry of entries) {\n map.set(entry.event, (map.get(entry.event) ?? 0) + 1)\n }\n return map\n }, [entries])\n\n const rows: Row[] = useMemo(() => {\n if (mode.kind === 'confirmDelete') return []\n\n if (mode.kind === 'addHook') {\n if (mode.step === 'event') {\n return HOOK_EVENTS.map(event => ({\n kind: 'event',\n event,\n count: countsByEvent.get(event) ?? 0,\n }))\n }\n if (mode.step === 'destination') {\n return DESTINATIONS.map(d => ({\n kind: 'action',\n id: d,\n label: d,\n }))\n }\n if (mode.step === 'type') {\n return HOOK_TYPES.map(t => ({\n kind: 'action',\n id: t,\n label: t,\n }))\n }\n return []\n }\n\n if (mode.kind === 'hooks') {\n const hookRows = entries\n .filter(e => e.event === mode.event)\n .map(entry => ({\n kind: 'hook' as const,\n entry,\n label: entryLabel(entry),\n }))\n return [\n { kind: 'action', id: 'back', label: 'Back' },\n { kind: 'action', id: 'add-hook', label: 'Add hook\u2026' },\n ...hookRows,\n ]\n }\n\n const actions: Row[] = [\n {\n kind: 'action',\n id: disableState.disabled ? 'enable-hooks' : 'disable-hooks',\n label: disableState.disabled\n ? 'Re-enable all hooks'\n : 'Disable all hooks',\n },\n { kind: 'action', id: 'add-hook', label: 'Add hook\u2026' },\n ]\n\n const eventRows: Row[] = HOOK_EVENTS.map(event => ({\n kind: 'event',\n event,\n count: countsByEvent.get(event) ?? 0,\n }))\n return [...actions, ...eventRows]\n }, [\n countsByEvent,\n disableState.disabled,\n entries,\n mode.kind,\n mode,\n projectDir,\n ])\n\n const reservedLines =\n (layout.tightLayout ? 7 : layout.compactLayout ? 9 : 11) +\n layout.paddingY * 2 +\n layout.gap * 3\n const maxVisible = Math.max(3, layout.rows - reservedLines - 1)\n const window = useMemo(\n () =>\n getWindowedList({\n itemCount: rows.length,\n focusIndex: selectedIndex,\n maxVisible,\n indicatorRows: 2,\n }),\n [maxVisible, rows.length, selectedIndex],\n )\n\n const clampedSelectedIndex = Math.max(\n 0,\n Math.min(selectedIndex, Math.max(0, rows.length - 1)),\n )\n const selectedRow = rows[clampedSelectedIndex] ?? null\n\n useKeypress(\n (input, key) => {\n const inputChar = input.length === 1 ? input : ''\n if (key.escape) {\n onDone('Hooks dialog dismissed')\n return true\n }\n if (mode.kind === 'confirmDelete') {\n if (inputChar === 'y' || key.return) {\n const entry = mode.entry\n if (entry.source.kind !== 'settings') {\n setStatus('Cannot remove plugin hooks here')\n setMode({ kind: 'events' })\n refresh()\n return true\n }\n removeHookFromSettings({\n destination: entry.source.destination,\n projectDir,\n event: entry.event,\n matcher: entry.matcher,\n hook: entry.hook,\n })\n setStatus('Hook removed')\n setMode({ kind: 'hooks', event: entry.event })\n refresh()\n return true\n }\n if (inputChar === 'n' || key.escape) {\n setMode({ kind: 'hooks', event: mode.entry.event })\n return true\n }\n return\n }\n\n if (mode.kind === 'addHook') {\n if (mode.step === 'event') {\n if (key.upArrow || inputChar === 'k') {\n setDraftEventIndex(prev => Math.max(0, prev - 1))\n return true\n }\n if (key.downArrow || inputChar === 'j') {\n setDraftEventIndex(prev =>\n Math.min(HOOK_EVENTS.length - 1, prev + 1),\n )\n return true\n }\n if (key.return) {\n const event = HOOK_EVENTS[draftEventIndex] ?? 'PreToolUse'\n setDraftMatcher('*')\n setDraftDestinationIndex(0)\n setDraftTypeIndex(0)\n setDraftInput('')\n setDraftTimeout('')\n setMode({ kind: 'addHook', step: 'destination' })\n setStatus(`Event: ${event}`)\n setSelectedIndex(0)\n return true\n }\n return\n }\n if (mode.step === 'destination') {\n if (key.upArrow || inputChar === 'k') {\n setDraftDestinationIndex(prev => Math.max(0, prev - 1))\n return true\n }\n if (key.downArrow || inputChar === 'j') {\n setDraftDestinationIndex(prev =>\n Math.min(DESTINATIONS.length - 1, prev + 1),\n )\n return true\n }\n if (key.return) {\n setMode({ kind: 'addHook', step: 'matcher' })\n setDraftMatcher('*')\n return true\n }\n return\n }\n if (mode.step === 'matcher') {\n if (key.backspace || key.delete) {\n setDraftMatcher(prev => prev.slice(0, -1))\n return true\n }\n if (key.return) {\n setMode({ kind: 'addHook', step: 'type' })\n return true\n }\n if (inputChar) {\n setDraftMatcher(prev => prev + inputChar)\n return true\n }\n return\n }\n if (mode.step === 'type') {\n if (key.upArrow || inputChar === 'k') {\n setDraftTypeIndex(prev => Math.max(0, prev - 1))\n return true\n }\n if (key.downArrow || inputChar === 'j') {\n setDraftTypeIndex(prev => Math.min(HOOK_TYPES.length - 1, prev + 1))\n return true\n }\n if (key.return) {\n setDraftInput('')\n setMode({ kind: 'addHook', step: 'input' })\n return true\n }\n return\n }\n if (mode.step === 'input') {\n if (key.backspace || key.delete) {\n setDraftInput(prev => prev.slice(0, -1))\n return true\n }\n if (key.return) {\n setMode({ kind: 'addHook', step: 'timeout' })\n setDraftTimeout('')\n return true\n }\n if (inputChar) {\n setDraftInput(prev => prev + inputChar)\n return true\n }\n return\n }\n if (mode.step === 'timeout') {\n if (key.backspace || key.delete) {\n setDraftTimeout(prev => prev.slice(0, -1))\n return true\n }\n if (key.return) {\n const event = HOOK_EVENTS[draftEventIndex] ?? 'PreToolUse'\n const destination =\n DESTINATIONS[draftDestinationIndex] ?? 'localSettings'\n const matcher = normalizeString(draftMatcher || '*') || '*'\n const hookType = HOOK_TYPES[draftTypeIndex] ?? 'command'\n const value = normalizeString(draftInput)\n const timeout = normalizeString(draftTimeout)\n\n const timeoutNum =\n timeout && /^\\d+$/.test(timeout) ? parseInt(timeout, 10) : null\n\n const hook: Hook =\n hookType === 'command'\n ? {\n type: 'command',\n command: value,\n ...(timeoutNum !== null ? { timeout: timeoutNum } : {}),\n }\n : {\n type: 'prompt',\n prompt: value,\n ...(timeoutNum !== null ? { timeout: timeoutNum } : {}),\n }\n\n addHookToSettings({\n destination,\n projectDir,\n event,\n matcher,\n hook,\n })\n setStatus('Hook added')\n setMode({ kind: 'hooks', event })\n setSelectedIndex(0)\n refresh()\n return true\n }\n if (inputChar && (/^\\d$/.test(inputChar) || inputChar === ' ')) {\n if (inputChar !== ' ') setDraftTimeout(prev => prev + inputChar)\n return true\n }\n return\n }\n }\n\n if (key.upArrow || inputChar === 'k') {\n setSelectedIndex(prev => Math.max(0, prev - 1))\n return true\n }\n if (key.downArrow || inputChar === 'j') {\n setSelectedIndex(prev =>\n Math.min(Math.max(0, rows.length - 1), prev + 1),\n )\n return true\n }\n if (key.pageUp) {\n setSelectedIndex(prev => Math.max(0, prev - window.visibleCount))\n return true\n }\n if (key.pageDown) {\n setSelectedIndex(prev =>\n Math.min(Math.max(0, rows.length - 1), prev + window.visibleCount),\n )\n return true\n }\n if (key.home || inputChar === 'g') {\n setSelectedIndex(0)\n return true\n }\n if (key.end || inputChar === 'G') {\n setSelectedIndex(Math.max(0, rows.length - 1))\n return true\n }\n\n if (inputChar === 'r') {\n refresh()\n setStatus('Refreshed')\n return true\n }\n\n if (key.return) {\n const row = selectedRow\n if (!row) return true\n\n if (row.kind === 'action') {\n if (row.id === 'back' && mode.kind === 'hooks') {\n setMode({ kind: 'events' })\n setSelectedIndex(0)\n return true\n }\n if (row.id === 'add-hook') {\n setMode({ kind: 'addHook', step: 'event' })\n setDraftEventIndex(0)\n setSelectedIndex(0)\n setStatus(null)\n return true\n }\n if (row.id === 'disable-hooks') {\n setDisableAllHooks({ destination: 'localSettings', disabled: true })\n refresh()\n setStatus('Disabled all hooks')\n return true\n }\n if (row.id === 'enable-hooks') {\n setDisableAllHooks({\n destination: 'localSettings',\n disabled: false,\n })\n refresh()\n setStatus('Re-enabled hooks')\n return true\n }\n }\n\n if (row.kind === 'event') {\n setMode({ kind: 'hooks', event: row.event })\n setSelectedIndex(0)\n return true\n }\n\n if (row.kind === 'hook') {\n if (row.entry.source.kind !== 'settings') {\n setStatus('Plugin hooks are read-only here')\n return true\n }\n setMode({ kind: 'confirmDelete', entry: row.entry })\n return true\n }\n }\n },\n { priority: KEYPRESS_PRIORITY.FULLSCREEN_OVERLAY },\n )\n\n const title =\n mode.kind === 'hooks'\n ? `Hooks \u00B7 ${mode.event}`\n : mode.kind === 'addHook'\n ? mode.step === 'event'\n ? 'Add hook \u00B7 Event'\n : mode.step === 'destination'\n ? 'Add hook \u00B7 Destination'\n : mode.step === 'matcher'\n ? `Add hook \u00B7 Matcher: ${draftMatcher}`\n : mode.step === 'type'\n ? 'Add hook \u00B7 Type'\n : mode.step === 'input'\n ? `Add hook \u00B7 ${HOOK_TYPES[draftTypeIndex] ?? 'command'}: ${draftInput}`\n : `Add hook \u00B7 Timeout (sec): ${draftTimeout}`\n : mode.kind === 'confirmDelete'\n ? 'Remove hook?'\n : disableState.disabled\n ? 'Hooks (disabled)'\n : 'Hooks'\n\n const helpLine =\n mode.kind === 'confirmDelete'\n ? 'y/Enter confirm \u00B7 n cancel \u00B7 Esc close'\n : mode.kind === 'addHook' &&\n (mode.step === 'matcher' ||\n mode.step === 'input' ||\n mode.step === 'timeout')\n ? 'Type \u00B7 Backspace delete \u00B7 Enter continue \u00B7 Esc close'\n : mode.kind === 'addHook'\n ? '\u2191/\u2193 j/k \u00B7 Enter select \u00B7 Esc close'\n : mode.kind === 'hooks'\n ? '\u2191/\u2193 j/k \u00B7 Enter remove \u00B7 r refresh \u00B7 Esc close'\n : '\u2191/\u2193 j/k \u00B7 Enter select \u00B7 r refresh \u00B7 Esc close'\n\n const listToRender =\n mode.kind === 'confirmDelete'\n ? []\n : mode.kind === 'addHook' &&\n (mode.step === 'event' ||\n mode.step === 'destination' ||\n mode.step === 'type')\n ? mode.step === 'event'\n ? HOOK_EVENTS.map((event, idx) => ({\n label: `${event} (${countsByEvent.get(event) ?? 0})`,\n selected: idx === draftEventIndex,\n }))\n : mode.step === 'destination'\n ? DESTINATIONS.map((d, idx) => ({\n label: d,\n selected: idx === draftDestinationIndex,\n }))\n : HOOK_TYPES.map((t, idx) => ({\n label: t,\n selected: idx === draftTypeIndex,\n }))\n : rows.slice(window.start, window.end).map((row, idx) => ({\n label:\n row.kind === 'event'\n ? `${row.event} (${row.count})`\n : row.kind === 'hook'\n ? row.label\n : row.label,\n selected: window.start + idx === clampedSelectedIndex,\n row,\n }))\n\n return (\n <ScreenFrame\n title={title}\n exitState={exitState}\n paddingX={layout.paddingX}\n paddingY={layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\">\n {mode.kind !== 'confirmDelete' ? (\n <Box flexDirection=\"column\" width=\"100%\">\n <Text dimColor wrap=\"truncate-end\">\n {window.showUpIndicator ? `${figures.arrowUp} More` : ' '}\n </Text>\n\n {listToRender.map((row: any, idx: number) => {\n const isSelected = Boolean(row.selected)\n const label = String(row.label ?? '')\n return (\n <Box key={idx} flexDirection=\"row\" gap={1}>\n <Text color={isSelected ? theme.kode : theme.secondaryText}>\n {isSelected ? figures.pointer : ' '}\n </Text>\n <Text\n bold={isSelected}\n color={isSelected ? theme.text : undefined}\n wrap=\"truncate-end\"\n >\n {label}\n </Text>\n </Box>\n )\n })}\n\n <Text dimColor wrap=\"truncate-end\">\n {window.showDownIndicator ? `${figures.arrowDown} More` : ' '}\n </Text>\n </Box>\n ) : null}\n\n {mode.kind === 'confirmDelete' ? (\n <Text color={theme.warning} wrap=\"truncate-end\">\n Remove: {entryLabel(mode.entry)}\n </Text>\n ) : null}\n\n {disableState.disabled && mode.kind === 'events' ? (\n <Box flexDirection=\"column\">\n <Text dimColor wrap=\"truncate-end\">\n When hooks are disabled:\n </Text>\n <Text dimColor wrap=\"truncate-end\">\n \u00B7 Hook commands do not execute\n </Text>\n <Text dimColor wrap=\"truncate-end\">\n \u00B7 StatusLine is hidden\n </Text>\n <Text dimColor wrap=\"truncate-end\">\n \u00B7 Tools run without hook validation\n </Text>\n </Box>\n ) : null}\n\n {status ? (\n <Text dimColor wrap=\"truncate-end\">\n {status}\n </Text>\n ) : null}\n\n <Text dimColor wrap=\"truncate-end\">\n {helpLine}\n </Text>\n </Box>\n </ScreenFrame>\n )\n}\n", "import type { Command } from '../types'\nimport { relative } from 'path'\n\nconst files = {\n type: 'local',\n name: 'files',\n description: 'List all files currently in context',\n isEnabled: true,\n isHidden: false,\n async call(_args, context) {\n const timestamps = (context as any)?.readFileTimestamps as\n | Record<string, number>\n | undefined\n\n const paths = Object.keys(timestamps ?? {}).filter(Boolean)\n if (paths.length === 0) return 'No files in context'\n\n const cwd = process.cwd()\n const lines = paths\n .slice()\n .sort((a, b) => a.localeCompare(b))\n .map(p => {\n try {\n const rel = relative(cwd, p)\n return rel && !rel.startsWith('..') ? rel : p\n } catch {\n return p\n }\n })\n\n return `Files in context:\\n${lines.join('\\n')}`\n },\n userFacingName() {\n return 'files'\n },\n} satisfies Command\n\nexport default files\n", "type BlockRecord = Record<string, unknown>\n\nexport type TranscriptTextOptions = {\n includeTools: boolean\n collapseToolBlocks?: boolean\n maxCollapsedChars?: number\n}\n\nexport type TranscriptMessage = {\n type: string\n message?: { content?: unknown } | null\n}\n\nfunction coerceBlockText(block: unknown): string {\n if (!block || typeof block !== 'object') return ''\n const record = block as BlockRecord\n if (record.type !== 'text') return ''\n return String(record.text ?? '')\n}\n\nfunction coerceBlockType(block: unknown): string {\n if (!block || typeof block !== 'object') return ''\n const record = block as BlockRecord\n return typeof record.type === 'string' ? record.type : ''\n}\n\nfunction stringifyForTranscript(value: unknown): string {\n if (value == null) return ''\n if (typeof value === 'string') return value\n try {\n return JSON.stringify(value, null, 2)\n } catch {\n return String(value)\n }\n}\n\nfunction truncateMiddle(text: string, maxChars: number): string {\n if (text.length <= maxChars) return text\n if (maxChars <= 0) return ''\n\n const ellipsis = '...'\n if (maxChars <= ellipsis.length) {\n return ellipsis.slice(0, maxChars)\n }\n\n const available = maxChars - ellipsis.length\n const head = Math.ceil(available * 0.6)\n const tail = Math.max(0, available - head)\n return `${text.slice(0, head)}${ellipsis}${tail ? text.slice(text.length - tail) : ''}`\n}\n\nfunction formatToolResultContent(raw: unknown): string {\n if (typeof raw === 'string') return raw\n if (!Array.isArray(raw)) return stringifyForTranscript(raw)\n const text = raw.map(coerceBlockText).filter(Boolean).join('')\n return text || stringifyForTranscript(raw)\n}\n\nexport function extractTextFromMessageContent(content: unknown): string {\n if (typeof content === 'string') return content\n if (!Array.isArray(content)) return ''\n\n return content\n .filter(block => block && typeof block === 'object')\n .map(block => block as BlockRecord)\n .filter(block => block.type === 'text')\n .map(block => String(block.text ?? ''))\n .join('')\n}\n\nexport function formatMessageContentForTranscript(\n message: TranscriptMessage,\n options: TranscriptTextOptions,\n): string {\n const raw = (message as unknown as { message?: { content?: unknown } })\n .message?.content\n\n if (!options.includeTools) {\n return extractTextFromMessageContent(raw)\n }\n\n if (typeof raw === 'string') return raw\n if (!Array.isArray(raw)) return ''\n\n const collapse = Boolean(options.collapseToolBlocks)\n const maxCollapsedChars = Math.max(1, options.maxCollapsedChars ?? 4000)\n\n const parts: string[] = []\n for (const block of raw) {\n const type = coerceBlockType(block)\n const record = block as BlockRecord\n\n if (type === 'text') {\n const text = String(record.text ?? '')\n if (text) parts.push(text)\n continue\n }\n\n if (type === 'tool_result') {\n const id =\n typeof record.tool_use_id === 'string'\n ? record.tool_use_id\n : typeof record.id === 'string'\n ? record.id\n : ''\n const ok = record.is_error ? 'ERROR' : 'OK'\n const content = formatToolResultContent(record.content)\n const display = collapse\n ? truncateMiddle(content, maxCollapsedChars)\n : content\n parts.push(\n `[tool_result${id ? `:${id}` : ''} ${ok}] ${display}`.trimEnd(),\n )\n continue\n }\n\n if (\n type === 'tool_use' ||\n type === 'server_tool_use' ||\n type === 'mcp_tool_use'\n ) {\n const name = typeof record.name === 'string' ? record.name : ''\n const input = stringifyForTranscript(record.input)\n const display = collapse\n ? truncateMiddle(input, maxCollapsedChars)\n : input\n parts.push(`[${type}:${name}] ${display}`.trimEnd())\n continue\n }\n\n if (type) {\n parts.push(`[${type}]`)\n }\n }\n\n return parts.join('\\n')\n}\n\nfunction pushPrefixed(lines: string[], prefix: string, text: string): void {\n const contentLines = text.split('\\n')\n const pad = ' '.repeat(prefix.length)\n for (let i = 0; i < contentLines.length; i += 1) {\n const line = contentLines[i] ?? ''\n lines.push(`${i === 0 ? prefix : pad} ${line}`.trimEnd())\n }\n}\n\nexport function buildTranscriptLines(\n messages: TranscriptMessage[],\n options: TranscriptTextOptions,\n): string[] {\n const lines: string[] = []\n let count = 0\n\n for (const message of messages) {\n if (!message) continue\n if (message.type !== 'user' && message.type !== 'assistant') continue\n count += 1\n\n const prefix = message.type === 'user' ? 'user:' : 'assistant:'\n const content = formatMessageContentForTranscript(\n message,\n options,\n ).trimEnd()\n pushPrefixed(lines, prefix, content || '(empty)')\n lines.push('')\n }\n\n if (count === 0) return ['(empty)']\n if (lines.length > 0 && lines[lines.length - 1] === '') lines.pop()\n return lines\n}\n", "import type { Command } from '../types'\nimport { getMessagesGetter } from '#core/messages'\nimport { copyTextToClipboard } from '#cli-utils/clipboard'\nimport { buildTranscriptLines } from '#cli-utils/transcriptText'\nimport { writeFile } from 'fs/promises'\nimport { resolve } from 'path'\n\nfunction normalizeExportFilename(raw: string): string {\n const trimmed = raw.trim()\n if (!trimmed) return ''\n if (trimmed.endsWith('.txt')) return trimmed\n if (trimmed.includes('.')) return trimmed.replace(/\\.[^.]+$/, '.txt')\n return `${trimmed}.txt`\n}\n\nfunction defaultExportFilename(): string {\n const iso = new Date().toISOString().replace(/[:.]/g, '-')\n return `conversation-${iso}.txt`\n}\n\nfunction buildExportText(): string {\n const messages = getMessagesGetter()()\n return buildTranscriptLines(messages, {\n includeTools: true,\n collapseToolBlocks: true,\n maxCollapsedChars: 4000,\n }).join('\\n')\n}\n\nconst exportCommand = {\n type: 'local',\n name: 'export',\n description: 'Export the current conversation to a file or clipboard',\n argumentHint: '[filename]',\n isEnabled: true,\n isHidden: false,\n async call(args: string) {\n const content = buildExportText()\n const filename = normalizeExportFilename(args || '')\n\n if (filename) {\n const abs = resolve(process.cwd(), filename)\n await writeFile(abs, content, 'utf-8')\n return `Conversation exported to: ${filename}`\n }\n\n try {\n await copyTextToClipboard(content)\n return `Conversation exported to clipboard. Use /export ${defaultExportFilename()} to save to a file.`\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n return `Failed to export to clipboard: ${message}\\nTip: Use /export ${defaultExportFilename()} to save to a file.`\n }\n },\n userFacingName() {\n return 'export'\n },\n} satisfies Command\n\nexport default exportCommand\n", "import type { Command } from '../types'\nimport { loadCustomCommands } from '#cli-services/customCommands'\n\nfunction isSkill(cmd: Command): boolean {\n return (cmd as unknown as Record<string, unknown>).isSkill === true\n}\n\nfunction getCommandScope(cmd: Command): 'project' | 'user' | null {\n const scope = (cmd as unknown as Record<string, unknown>).scope\n if (scope === 'project' || scope === 'user') return scope\n return null\n}\n\nfunction getCommandFilePath(cmd: Command): string | null {\n const filePath = (cmd as unknown as Record<string, unknown>).filePath\n return typeof filePath === 'string' && filePath.trim() ? filePath : null\n}\n\nconst skills = {\n type: 'local',\n name: 'skills',\n description: 'List available skills',\n isEnabled: true,\n isHidden: false,\n async call() {\n const commands = await loadCustomCommands()\n const skillCommands = commands.filter(isSkill)\n\n if (skillCommands.length === 0) {\n return 'No skills found.'\n }\n\n const lines = skillCommands.map(cmd => {\n const scope = getCommandScope(cmd)\n const filePath = getCommandFilePath(cmd)\n const scopeLabel = scope ? ` (${scope})` : ''\n const pathLabel = filePath ? ` \u2014 ${filePath}` : ''\n return `- ${cmd.userFacingName()}${scopeLabel}: ${cmd.description}${pathLabel}`\n })\n\n return `Available skills (${skillCommands.length}):\\n${lines.join('\\n')}`\n },\n userFacingName() {\n return 'skills'\n },\n} satisfies Command\n\nexport default skills\n", "import * as React from 'react'\nimport { OrderedList } from '@inkjs/ui'\nimport { Box, Text } from 'ink'\nimport {\n getCurrentProjectConfig,\n getGlobalConfig,\n saveCurrentProjectConfig,\n saveGlobalConfig,\n} from '#core/utils/config'\nimport { existsSync } from 'fs'\nimport { join } from 'path'\nimport { homedir } from 'os'\nimport { getTheme } from '#core/utils/theme'\nimport { RELEASE_NOTES } from '#core/constants/releaseNotes'\nimport { gt } from 'semver'\nimport { isDirEmpty } from '#core/utils/file'\nimport { MACRO } from '#core/constants/macros'\nimport { PROJECT_FILE, PRODUCT_NAME } from '#core/constants/product'\n\n// Function to mark onboarding as complete\nexport function markProjectOnboardingComplete(): void {\n const projectConfig = getCurrentProjectConfig()\n if (!projectConfig.hasCompletedProjectOnboarding) {\n saveCurrentProjectConfig({\n ...projectConfig,\n hasCompletedProjectOnboarding: true,\n })\n }\n}\n\nfunction markReleaseNotesSeen(): void {\n const config = getGlobalConfig()\n saveGlobalConfig({\n ...config,\n lastReleaseNotesSeen: MACRO.VERSION,\n })\n}\n\ntype Props = {\n workspaceDir: string\n}\n\nexport default function ProjectOnboarding({\n workspaceDir,\n}: Props): React.ReactNode {\n // Check if project onboarding has already been completed\n const projectConfig = getCurrentProjectConfig()\n const showOnboarding = !projectConfig.hasCompletedProjectOnboarding\n\n // Get previous version from config\n const config = getGlobalConfig()\n const previousVersion = config.lastReleaseNotesSeen\n\n // Get release notes to show\n let releaseNotesToShow: string[] = []\n if (!previousVersion || gt(MACRO.VERSION, previousVersion)) {\n releaseNotesToShow = RELEASE_NOTES[MACRO.VERSION] || []\n }\n const hasReleaseNotes = releaseNotesToShow.length > 0\n\n // Mark release notes as seen when they're displayed without onboarding\n React.useEffect(() => {\n if (hasReleaseNotes && !showOnboarding) {\n markReleaseNotesSeen()\n }\n }, [hasReleaseNotes, showOnboarding])\n\n // We only want to show either onboarding OR release notes (with preference for onboarding)\n // If there's no onboarding to show and no release notes, return null\n if (!showOnboarding && !hasReleaseNotes) {\n return null\n }\n\n // Load what we need for onboarding\n // NOTE: This whole component is statically rendered Once\n const workspaceHasProjectGuide = existsSync(join(workspaceDir, PROJECT_FILE))\n const isWorkspaceDirEmpty = isDirEmpty(workspaceDir)\n const shouldRecommendProjectGuide =\n !workspaceHasProjectGuide && !isWorkspaceDirEmpty\n\n const theme = getTheme()\n\n return (\n <Box flexDirection=\"column\" gap={1} padding={1} paddingBottom={0}>\n {showOnboarding && (\n <>\n <Text color={theme.secondaryText}>Tips for getting started:</Text>\n <OrderedList>\n {/* Collect all the items that should be displayed */}\n {(() => {\n const items = []\n\n if (isWorkspaceDirEmpty) {\n items.push(\n <React.Fragment key=\"workspace\">\n <OrderedList.Item>\n <Text color={theme.secondaryText}>\n Ask {PRODUCT_NAME} to create a new app or clone a\n repository.\n </Text>\n </OrderedList.Item>\n </React.Fragment>,\n )\n }\n if (shouldRecommendProjectGuide) {\n items.push(\n <React.Fragment key=\"projectGuide\">\n <OrderedList.Item>\n <Text color={theme.secondaryText}>\n Run <Text color={theme.text}>/init</Text> to create\n a&nbsp;\n {PROJECT_FILE} file with instructions for {PRODUCT_NAME}\n .\n </Text>\n </OrderedList.Item>\n </React.Fragment>,\n )\n }\n\n items.push(\n <React.Fragment key=\"questions\">\n <OrderedList.Item>\n <Text color={theme.secondaryText}>\n Ask {PRODUCT_NAME} questions about your codebase.\n </Text>\n </OrderedList.Item>\n </React.Fragment>,\n )\n\n items.push(\n <React.Fragment key=\"changes\">\n <OrderedList.Item>\n <Text color={theme.secondaryText}>\n Ask {PRODUCT_NAME} to implement changes to your codebase.\n </Text>\n </OrderedList.Item>\n </React.Fragment>,\n )\n\n return items\n })()}\n </OrderedList>\n </>\n )}\n\n {!showOnboarding && hasReleaseNotes && (\n <Box\n borderColor={getTheme().secondaryBorder}\n flexDirection=\"column\"\n marginRight={1}\n >\n <Box flexDirection=\"column\" gap={0}>\n <Box marginBottom={1}>\n <Text>\uD83C\uDD95 What&apos;s new in v{MACRO.VERSION}:</Text>\n </Box>\n <Box flexDirection=\"column\" marginLeft={1}>\n {releaseNotesToShow.map((note, noteIndex) => (\n <React.Fragment key={noteIndex}>\n <Text color={getTheme().secondaryText}>\u2022 {note}</Text>\n </React.Fragment>\n ))}\n </Box>\n </Box>\n </Box>\n )}\n\n {workspaceDir === homedir() && (\n <Text color={getTheme().warning}>\n Note: You have launched <Text bold>Kode-cli</Text> in your home\n directory. For the best experience, launch it in a project directory\n instead.\n </Text>\n )}\n </Box>\n )\n}\n", "// Release notes for each version\n// Don't add more than 3 for any version, since these show up in the UI upon launch.\nexport const RELEASE_NOTES: Record<string, string[]> = {\n '0.1.178': [\n \"New release notes now show you what's changed since you last launched\",\n ],\n}\n", "import type { Command } from '../types'\nimport { markProjectOnboardingComplete } from '#ui-ink/components/ProjectOnboarding'\nimport { PROJECT_FILE } from '#core/constants/product'\nconst command = {\n type: 'prompt',\n name: 'init',\n description: `Initialize a new ${PROJECT_FILE} file with codebase documentation`,\n isEnabled: true,\n isHidden: false,\n progressMessage: 'analyzing your codebase',\n userFacingName() {\n return 'init'\n },\n async getPromptForCommand(_args: string) {\n // Mark onboarding as complete when init command is run\n markProjectOnboardingComplete()\n return [\n {\n role: 'user',\n content: [\n {\n type: 'text',\n text: `Please analyze this codebase and create a ${PROJECT_FILE} file containing:\n1. Build/lint/test commands - especially for running a single test\n2. Code style guidelines including imports, formatting, types, naming conventions, error handling, etc.\n\nThe file you create will be given to agentic coding agents (such as yourself) that operate in this repository. Make it about 20 lines long.\nIf there's already a ${PROJECT_FILE}, improve it.\nIf there are Cursor rules (in .cursor/rules/ or .cursorrules) or Copilot rules (in .github/copilot-instructions.md), make sure to include them.`,\n },\n ],\n },\n ]\n },\n} satisfies Command\n\nexport default command\n", "import type { Command } from '../types'\nimport { logError } from '#core/utils/log'\nimport { execFileNoThrow } from '#core/utils/execFileNoThrow'\n\nconst isEnabled =\n process.platform === 'darwin' &&\n ['iTerm.app', 'Apple_Terminal'].includes(process.env.TERM_PROGRAM || '')\n\nconst listen: Command = {\n type: 'local',\n name: 'listen',\n description: 'Activates speech recognition and transcribes speech to text',\n isEnabled: isEnabled,\n isHidden: isEnabled,\n userFacingName() {\n return 'listen'\n },\n async call(_, { abortController }) {\n // Start dictation using AppleScript\n const script = `tell application \"System Events\" to tell \u00AC\n(the first process whose frontmost is true) to tell \u00AC\nmenu bar 1 to tell \u00AC\nmenu bar item \"Edit\" to tell \u00AC\nmenu \"Edit\" to tell \u00AC\nmenu item \"Start Dictation\" to \u00AC\nif exists then click it`\n\n const { stderr, code } = await execFileNoThrow(\n 'osascript',\n ['-e', script],\n abortController.signal,\n )\n\n if (code !== 0) {\n logError(`Failed to start dictation: ${stderr}`)\n return 'Failed to start dictation'\n }\n return 'Dictation started. Press esc to stop.'\n },\n}\n\nexport default listen\n", "import type { NormalizedMessage } from '#core/utils/messages'\nimport { getToolUseID } from '#core/utils/messages'\nimport type { ProgressMessage } from '#core/query'\n\nfunction intersects<A>(a: Set<A>, b: Set<A>): boolean {\n if (a.size === 0 || b.size === 0) return false\n for (const item of a) {\n if (b.has(item)) return true\n }\n return false\n}\n\nexport function shouldRenderReplMessageStatically(\n message: NormalizedMessage,\n messages: NormalizedMessage[],\n unresolvedToolUseIDs: Set<string>,\n): boolean {\n switch (message.type) {\n case 'user':\n case 'assistant': {\n const toolUseID = getToolUseID(message)\n if (!toolUseID) {\n return true\n }\n if (unresolvedToolUseIDs.has(toolUseID)) {\n return false\n }\n\n const correspondingProgressMessage = messages.find(\n _ => _.type === 'progress' && _.toolUseID === toolUseID,\n ) as ProgressMessage | null\n if (!correspondingProgressMessage) {\n return true\n }\n\n return !intersects(\n unresolvedToolUseIDs,\n correspondingProgressMessage.siblingToolUseIDs,\n )\n }\n case 'progress':\n return !intersects(unresolvedToolUseIDs, message.siblingToolUseIDs)\n }\n}\n\n/**\n * Ink <Static> expects its `items` list to be append-only.\n *\n * If we include static-eligible messages that appear *after* a transient message,\n * later transitions (transient -> static) would insert into the middle of the list,\n * causing Ink to replay tail items into the scrollback (duplicates).\n *\n * To prevent this, the static portion must always be a prefix of the ordered\n * message list.\n */\nexport function getReplStaticPrefixLength(\n orderedMessages: NormalizedMessage[],\n allMessages: NormalizedMessage[],\n unresolvedToolUseIDs: Set<string>,\n): number {\n for (let i = 0; i < orderedMessages.length; i++) {\n const message = orderedMessages[i]!\n if (\n !shouldRenderReplMessageStatically(\n message,\n allMessages,\n unresolvedToolUseIDs,\n )\n ) {\n return i\n }\n }\n return orderedMessages.length\n}\n", "import type { Command } from '../types'\nimport { getMessagesGetter } from '#core/messages'\nimport type { ProgressMessage } from '#core/query'\nimport {\n extractTag,\n getInProgressToolUseIDs,\n getToolUseID,\n getUnresolvedToolUseIDs,\n isNotEmptyMessage,\n normalizeMessages,\n reorderMessages,\n type NormalizedMessage,\n} from '#core/utils/messages'\nimport { getReplStaticPrefixLength } from '#cli-utils/replStaticSplit'\nimport { CACHE_PATHS } from '#core/utils/log'\nimport { existsSync, readdirSync, readFileSync, statSync } from 'fs'\nimport { join } from 'path'\n\nfunction isDebugMode(): boolean {\n return (\n process.argv.includes('--debug') || process.argv.includes('--debug-verbose')\n )\n}\n\nfunction safeStringify(value: unknown): string {\n const seen = new WeakSet<object>()\n return JSON.stringify(\n value,\n (_key, val) => {\n if (typeof val === 'function') return '[Function]'\n if (typeof val === 'bigint') return val.toString()\n if (val && typeof val === 'object') {\n if (seen.has(val)) return '[Circular]'\n seen.add(val)\n }\n return val\n },\n 2,\n )\n}\n\nfunction getProgressText(message: ProgressMessage): string {\n const first = message.content.message.content[0]\n if (!first || first.type !== 'text') return ''\n const rawText = String(first.text ?? '')\n if (rawText.startsWith('<tool-progress>')) {\n return extractTag(rawText, 'tool-progress') ?? rawText\n }\n return rawText\n}\n\nfunction getLatestMessagesLogFile(): { path: string; mtimeMs: number } | null {\n const dir = CACHE_PATHS.messages()\n if (!existsSync(dir)) return null\n const files = readdirSync(dir).filter(f => f.endsWith('.json'))\n if (files.length === 0) return null\n\n let best: { path: string; mtimeMs: number } | null = null\n for (const file of files) {\n const fullPath = join(dir, file)\n let mtimeMs = 0\n try {\n mtimeMs = statSync(fullPath).mtimeMs\n } catch {\n continue\n }\n if (!best || mtimeMs > best.mtimeMs) {\n best = { path: fullPath, mtimeMs }\n }\n }\n return best\n}\n\ntype ToolUseSummary = {\n toolUseID: string\n toolName: string | null\n occurrencesInNormalized: number\n progressMessagesInNormalized: number\n progressReplacements: number\n sawQueuedWaiting: boolean\n}\n\nfunction summarizeToolUses(normalized: NormalizedMessage[]): {\n toolUseIDs: string[]\n duplicates: string[]\n byID: ToolUseSummary[]\n} {\n const toolUseNameById = new Map<string, string>()\n const toolUseCounts = new Map<string, number>()\n\n const progressCounts = new Map<string, number>()\n const sawQueuedWaiting = new Set<string>()\n\n for (const message of normalized) {\n const toolUseID = getToolUseID(message)\n if (toolUseID) {\n toolUseCounts.set(toolUseID, (toolUseCounts.get(toolUseID) ?? 0) + 1)\n if (message.type === 'assistant') {\n const first = message.message.content[0]\n if (first?.type === 'tool_use' && typeof first.name === 'string') {\n toolUseNameById.set(toolUseID, first.name)\n }\n }\n }\n\n if (message.type === 'progress') {\n progressCounts.set(\n message.toolUseID,\n (progressCounts.get(message.toolUseID) ?? 0) + 1,\n )\n if (getProgressText(message).trim() === 'Waiting\u2026') {\n sawQueuedWaiting.add(message.toolUseID)\n }\n }\n }\n\n const toolUseIDs = [...toolUseCounts.keys()]\n toolUseIDs.sort()\n\n const duplicates = toolUseIDs.filter(id => (toolUseCounts.get(id) ?? 0) > 1)\n\n const byID: ToolUseSummary[] = toolUseIDs.map(toolUseID => {\n const occurrencesInNormalized = toolUseCounts.get(toolUseID) ?? 0\n const progressMessagesInNormalized = progressCounts.get(toolUseID) ?? 0\n return {\n toolUseID,\n toolName: toolUseNameById.get(toolUseID) ?? null,\n occurrencesInNormalized,\n progressMessagesInNormalized,\n progressReplacements: Math.max(0, progressMessagesInNormalized - 1),\n sawQueuedWaiting: sawQueuedWaiting.has(toolUseID),\n }\n })\n\n return { toolUseIDs, duplicates, byID }\n}\n\nfunction summarizeOrderedMessages(ordered: NormalizedMessage[]): Array<{\n index: number\n uuid: string\n type: NormalizedMessage['type']\n toolUseID: string | null\n preview: string | null\n}> {\n return ordered.map((m, index) => {\n let preview: string | null = null\n if (m.type === 'progress') {\n preview = getProgressText(m).trim() || null\n } else if (m.type === 'assistant') {\n const first = m.message.content[0]\n if (first?.type === 'text') {\n preview = String(first.text ?? '').slice(0, 120)\n } else if (first?.type === 'tool_use') {\n const name = typeof first.name === 'string' ? first.name : 'UnknownTool'\n preview = `${name}(${safeStringify(first.input ?? {}).slice(0, 120)})`\n }\n } else if (m.type === 'user') {\n const content = m.message.content as unknown\n if (Array.isArray(content) && content.length > 0) {\n const first = content[0]\n if (first?.type === 'tool_result') {\n preview = `tool_result(${String(first.tool_use_id ?? '')})`\n } else if (first?.type === 'text') {\n preview = String(first.text ?? '').slice(0, 120)\n }\n } else if (typeof content === 'string') {\n preview = content.slice(0, 120)\n }\n }\n\n return {\n index,\n uuid: String(m.uuid),\n type: m.type,\n toolUseID: getToolUseID(m),\n preview,\n }\n })\n}\n\nconst command: Command = {\n name: 'messages-debug',\n description: 'Dump messages + derived UI state for debugging',\n isEnabled: isDebugMode(),\n isHidden: true,\n type: 'local',\n\n userFacingName() {\n return this.name\n },\n\n async call(args: string) {\n const wantFull = args.includes('--full') || args.includes('--json')\n\n const rawMessages = getMessagesGetter()()\n const normalized = normalizeMessages(rawMessages).filter(isNotEmptyMessage)\n const ordered = reorderMessages(normalized)\n const unresolvedToolUseIDs = getUnresolvedToolUseIDs(normalized)\n const inProgressToolUseIDs = getInProgressToolUseIDs(normalized)\n const replStaticPrefixLength = getReplStaticPrefixLength(\n ordered,\n normalized,\n unresolvedToolUseIDs,\n )\n\n const { toolUseIDs, duplicates, byID } = summarizeToolUses(normalized)\n\n const latestLog = getLatestMessagesLogFile()\n const latestLogContent =\n latestLog && existsSync(latestLog.path)\n ? (() => {\n try {\n return JSON.parse(readFileSync(latestLog.path, 'utf8'))\n } catch {\n return null\n }\n })()\n : null\n\n const payload = {\n projectMessagesDir: CACHE_PATHS.messages(),\n latestMessagesLog: latestLog\n ? { path: latestLog.path, mtimeMs: latestLog.mtimeMs }\n : null,\n latestMessagesLogJson: latestLogContent,\n summary: {\n rawMessageCount: rawMessages.length,\n normalizedMessageCount: normalized.length,\n orderedMessageCount: ordered.length,\n replStaticPrefixLength,\n unresolvedToolUseIDs: [...unresolvedToolUseIDs],\n inProgressToolUseIDs: [...inProgressToolUseIDs],\n toolUseIDs,\n duplicateToolUseIDs: duplicates,\n toolUseSummary: byID,\n },\n orderedMessages: summarizeOrderedMessages(ordered),\n ...(wantFull ? { rawMessages } : {}),\n }\n\n return safeStringify(payload)\n },\n}\n\nexport default command\n", "import * as React from 'react'\nimport type { Command } from '../types'\nimport { ConsoleOAuthFlow } from '#ui-ink/components/ConsoleOAuthFlow'\nimport { clearTerminal } from '#cli-utils/terminal'\nimport { isLoggedInToAnthropic } from '#core/utils/auth'\nimport { useExitOnCtrlCD } from '#ui-ink/hooks/useExitOnCtrlCD'\nimport { Box, Text } from 'ink'\nimport { clearConversation } from './clear'\n\nexport default () =>\n ({\n type: 'local-jsx',\n name: 'login',\n description: isLoggedInToAnthropic()\n ? 'Switch ShareAI Lab accounts'\n : 'Sign in with your ShareAI Lab account',\n isEnabled: true,\n isHidden: false,\n ui: { displayMode: 'fullscreen' },\n async call(onDone, context) {\n await clearTerminal()\n return (\n <Login\n onDone={async () => {\n clearConversation(context)\n onDone()\n }}\n />\n )\n },\n userFacingName() {\n return 'login'\n },\n }) satisfies Command\n\nfunction Login(props: { onDone: () => void }) {\n const exitState = useExitOnCtrlCD(props.onDone)\n return (\n <Box flexDirection=\"column\">\n <ConsoleOAuthFlow onDone={props.onDone} />\n <Box marginLeft={3}>\n <Text dimColor>\n {exitState.pending ? (\n <>Press {exitState.keyName} again to exit</>\n ) : (\n ''\n )}\n </Text>\n </Box>\n </Box>\n )\n}\n", "import React, { useEffect, useState, useCallback } from 'react'\nimport { Static, Box, Text } from 'ink'\nimport { OAuthService, createAndStoreApiKey } from '#core/services/oauth'\nimport { getTheme } from '#core/utils/theme'\nimport { ASCII_LOGO } from '#core/constants/product'\nimport { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\nimport { logError } from '#core/utils/log'\nimport { clearTerminal } from '#cli-utils/terminal'\nimport { WelcomeBox } from '#ui-ink/components/WelcomeBox'\nimport { sendNotification } from '#core/services/notifier'\nimport { ConsoleOAuthStatusMessage } from './ConsoleOAuthStatusMessage'\nimport { PASTE_HERE_MSG, type OAuthStatus } from './oauthTypes'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\n\ntype Props = {\n onDone(): void\n}\n\nexport function ConsoleOAuthFlow({ onDone }: Props): React.ReactNode {\n const [oauthStatus, setOAuthStatus] = useState<OAuthStatus>({\n state: 'idle',\n })\n const theme = getTheme()\n\n const [pastedCode, setPastedCode] = useState('')\n const [cursorOffset, setCursorOffset] = useState(0)\n const [oauthService] = useState(() => new OAuthService())\n // After a few seconds we suggest the user to copy/paste url if the\n // browser did not open automatically. In this flow we expect the user to\n // copy the code from the browser and paste it in the terminal\n const [showPastePrompt, setShowPastePrompt] = useState(false)\n // we need a special clearing state to correctly re-render Static elements\n const [isClearing, setIsClearing] = useState(false)\n\n const textInputColumns = useTerminalSize().columns - PASTE_HERE_MSG.length - 1\n\n useEffect(() => {\n if (isClearing) {\n clearTerminal()\n setIsClearing(false)\n }\n }, [isClearing])\n\n // Retry logic\n useEffect(() => {\n if (oauthStatus.state === 'about_to_retry') {\n setIsClearing(true)\n setTimeout(() => {\n setOAuthStatus(oauthStatus.nextState)\n }, 1000)\n }\n }, [oauthStatus])\n\n useKeypress(async (_, key) => {\n if (key.return) {\n if (oauthStatus.state === 'idle') {\n setOAuthStatus({ state: 'ready_to_start' })\n } else if (oauthStatus.state === 'success') {\n await clearTerminal() // needed to clear out Static components\n onDone()\n } else if (oauthStatus.state === 'error' && oauthStatus.toRetry) {\n setPastedCode('')\n setOAuthStatus({\n state: 'about_to_retry',\n nextState: oauthStatus.toRetry,\n })\n }\n }\n })\n\n async function handleSubmitCode(value: string, url: string) {\n try {\n // Expecting format \"authorizationCode#state\" from the authorization callback URL\n const [authorizationCode, state] = value.split('#')\n\n if (!authorizationCode || !state) {\n setOAuthStatus({\n state: 'error',\n message: 'Invalid code. Please make sure the full code was copied',\n toRetry: { state: 'waiting_for_login', url },\n })\n return\n }\n\n // Track which path the user is taking (manual code entry)\n\n oauthService.processCallback({\n authorizationCode,\n state,\n useManualRedirect: true,\n })\n } catch (err) {\n logError(err)\n setOAuthStatus({\n state: 'error',\n message: (err as Error).message,\n toRetry: { state: 'waiting_for_login', url },\n })\n }\n }\n\n const startOAuth = useCallback(async () => {\n try {\n const result = await oauthService\n .startOAuthFlow(async url => {\n setOAuthStatus({ state: 'waiting_for_login', url })\n setTimeout(() => setShowPastePrompt(true), 3000)\n })\n .catch(err => {\n // Handle token exchange errors specifically\n if (err.message.includes('Token exchange failed')) {\n setOAuthStatus({\n state: 'error',\n message:\n 'Failed to exchange authorization code for access token. Please try again.',\n toRetry: { state: 'ready_to_start' },\n })\n } else {\n // Handle other errors\n setOAuthStatus({\n state: 'error',\n message: err.message,\n toRetry: { state: 'ready_to_start' },\n })\n }\n throw err\n })\n\n setOAuthStatus({ state: 'creating_api_key' })\n\n const apiKey = await createAndStoreApiKey(result.accessToken).catch(\n err => {\n setOAuthStatus({\n state: 'error',\n message: 'Failed to create API key: ' + err.message,\n toRetry: { state: 'ready_to_start' },\n })\n\n throw err\n },\n )\n\n if (apiKey) {\n setOAuthStatus({ state: 'success', apiKey })\n sendNotification({ message: 'Kode login successful' })\n } else {\n setOAuthStatus({\n state: 'error',\n message:\n \"Unable to create API key. The server accepted the request but didn't return a key.\",\n toRetry: { state: 'ready_to_start' },\n })\n }\n } catch (err) {}\n }, [oauthService, setShowPastePrompt])\n\n useEffect(() => {\n if (oauthStatus.state === 'ready_to_start') {\n startOAuth()\n }\n }, [oauthStatus.state, startOAuth])\n\n // We need to render the copy-able URL statically to prevent Ink <Text> from inserting\n // newlines in the middle of the URL (this breaks Safari). Because <Static> components are\n // only rendered once top-to-bottom, we also need to make everything above the URL static.\n const staticItems: Record<string, React.JSX.Element> = {}\n if (!isClearing) {\n staticItems.header = (\n <Box key=\"header\" flexDirection=\"column\" gap={1}>\n <WelcomeBox />\n <Box paddingBottom={1} paddingLeft={1}>\n <Text color={theme.kode}>{ASCII_LOGO}</Text>\n </Box>\n </Box>\n )\n }\n if (oauthStatus.state === 'waiting_for_login' && showPastePrompt) {\n staticItems.urlToCopy = (\n <Box flexDirection=\"column\" key=\"urlToCopy\" gap={1} paddingBottom={1}>\n <Box paddingX={1}>\n <Text dimColor>\n Browser didn&apos;t open? Use the url below to sign in:\n </Text>\n </Box>\n <Box width={1000}>\n <Text dimColor>{oauthStatus.url}</Text>\n </Box>\n </Box>\n )\n }\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Static\n items={Object.keys(staticItems)}\n children={(item: string) => staticItems[item]}\n />\n <Box paddingLeft={1} flexDirection=\"column\" gap={1}>\n <ConsoleOAuthStatusMessage\n oauthStatus={oauthStatus}\n theme={theme}\n showPastePrompt={showPastePrompt}\n pastedCode={pastedCode}\n onPastedCodeChange={setPastedCode}\n cursorOffset={cursorOffset}\n onCursorOffsetChange={setCursorOffset}\n textInputColumns={textInputColumns}\n onSubmitCode={handleSubmitCode}\n />\n </Box>\n </Box>\n )\n}\n", "import * as crypto from 'crypto'\nimport * as http from 'http'\nimport { IncomingMessage, ServerResponse } from 'http'\nimport * as url from 'url'\n\nimport { OAUTH_CONFIG } from '#core/constants/oauth'\nimport { openBrowser } from '#core/utils/browser'\nimport { logError } from '#core/utils/log'\nimport {\n AccountInfo,\n getGlobalConfig,\n saveGlobalConfig,\n normalizeApiKeyForConfig,\n} from '#core/utils/config'\n\n// Base64URL encoding function (RFC 4648)\nfunction base64URLEncode(buffer: Buffer): string {\n return buffer\n .toString('base64')\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '')\n}\n\nfunction generateCodeVerifier(): string {\n return base64URLEncode(crypto.randomBytes(32))\n}\n\nasync function generateCodeChallenge(verifier: string): Promise<string> {\n const encoder = new TextEncoder()\n const data = encoder.encode(verifier)\n const digest = await crypto.subtle.digest('SHA-256', data)\n return base64URLEncode(Buffer.from(digest))\n}\n\ntype OAuthTokenExchangeResponse = {\n access_token: string\n account?: {\n uuid: string\n email_address: string\n }\n organization?: {\n uuid: string\n name: string\n }\n}\n\nexport type OAuthResult = {\n accessToken: string\n}\n\nexport class OAuthService {\n private server: http.Server | null = null\n private codeVerifier: string\n private expectedState: string | null = null\n private pendingCodePromise: {\n resolve: (result: {\n authorizationCode: string\n useManualRedirect: boolean\n }) => void\n reject: (err: Error) => void\n } | null = null\n\n constructor() {\n this.codeVerifier = generateCodeVerifier()\n }\n\n private generateAuthUrls(\n codeChallenge: string,\n state: string,\n ): { autoUrl: string; manualUrl: string } {\n function makeUrl(isManual: boolean): string {\n const authUrl = new URL(OAUTH_CONFIG.AUTHORIZE_URL)\n authUrl.searchParams.append('client_id', OAUTH_CONFIG.CLIENT_ID)\n authUrl.searchParams.append('response_type', 'code')\n authUrl.searchParams.append(\n 'redirect_uri',\n isManual\n ? OAUTH_CONFIG.MANUAL_REDIRECT_URL\n : `http://localhost:${OAUTH_CONFIG.REDIRECT_PORT}/callback`,\n )\n authUrl.searchParams.append('scope', OAUTH_CONFIG.SCOPES.join(' '))\n authUrl.searchParams.append('code_challenge', codeChallenge)\n authUrl.searchParams.append('code_challenge_method', 'S256')\n authUrl.searchParams.append('state', state)\n return authUrl.toString()\n }\n\n return {\n autoUrl: makeUrl(false),\n manualUrl: makeUrl(true),\n }\n }\n\n async startOAuthFlow(\n authURLHandler: (url: string) => Promise<void>,\n ): Promise<OAuthResult> {\n const codeChallenge = await generateCodeChallenge(this.codeVerifier)\n const state = base64URLEncode(crypto.randomBytes(32))\n this.expectedState = state\n const { autoUrl, manualUrl } = this.generateAuthUrls(codeChallenge, state)\n\n const onReady = async () => {\n await authURLHandler(manualUrl)\n await openBrowser(autoUrl)\n }\n\n const { authorizationCode, useManualRedirect } = await new Promise<{\n authorizationCode: string\n useManualRedirect: boolean\n }>((resolve, reject) => {\n this.pendingCodePromise = { resolve, reject }\n this.startLocalServer(state, onReady)\n })\n\n // Exchange code for tokens\n const {\n access_token: accessToken,\n account,\n organization,\n } = await this.exchangeCodeForTokens(\n authorizationCode,\n state,\n useManualRedirect,\n )\n\n // Store account info\n if (account) {\n const accountInfo: AccountInfo = {\n accountUuid: account.uuid,\n emailAddress: account.email_address,\n organizationUuid: organization?.uuid,\n }\n const config = getGlobalConfig()\n config.oauthAccount = accountInfo\n saveGlobalConfig(config)\n }\n\n return { accessToken }\n }\n\n private startLocalServer(state: string, onReady?: () => void): void {\n if (this.server) {\n this.closeServer()\n }\n this.server = http.createServer(\n (req: IncomingMessage, res: ServerResponse) => {\n const parsedUrl = url.parse(req.url || '', true)\n\n if (parsedUrl.pathname === '/callback') {\n const authorizationCode = parsedUrl.query.code as string\n const returnedState = parsedUrl.query.state as string\n\n if (!authorizationCode) {\n res.writeHead(400)\n res.end('Authorization code not found')\n if (this.pendingCodePromise) {\n this.pendingCodePromise.reject(\n new Error('No authorization code received'),\n )\n }\n return\n }\n\n if (returnedState !== state) {\n res.writeHead(400)\n res.end('Invalid state parameter')\n if (this.pendingCodePromise) {\n this.pendingCodePromise.reject(\n new Error('Invalid state parameter'), // Possible CSRF attack\n )\n }\n return\n }\n\n res.writeHead(302, {\n Location: OAUTH_CONFIG.SUCCESS_URL,\n })\n res.end()\n\n this.processCallback({\n authorizationCode,\n state,\n useManualRedirect: false,\n })\n } else {\n res.writeHead(404)\n res.end()\n }\n },\n )\n\n this.server.listen(OAUTH_CONFIG.REDIRECT_PORT, async () => {\n onReady?.()\n })\n\n this.server.on('error', (err: Error) => {\n const portError = err as NodeJS.ErrnoException\n if (portError.code === 'EADDRINUSE') {\n const error = new Error(\n `Port ${OAUTH_CONFIG.REDIRECT_PORT} is already in use. Please ensure no other applications are using this port.`,\n )\n logError(error)\n this.closeServer()\n if (this.pendingCodePromise) {\n this.pendingCodePromise.reject(error)\n }\n return\n } else {\n logError(err)\n this.closeServer()\n if (this.pendingCodePromise) {\n this.pendingCodePromise.reject(err)\n }\n return\n }\n })\n }\n\n private async exchangeCodeForTokens(\n authorizationCode: string,\n state: string,\n useManualRedirect: boolean = false,\n ): Promise<OAuthTokenExchangeResponse> {\n const requestBody = {\n grant_type: 'authorization_code',\n code: authorizationCode,\n redirect_uri: useManualRedirect\n ? OAUTH_CONFIG.MANUAL_REDIRECT_URL\n : `http://localhost:${OAUTH_CONFIG.REDIRECT_PORT}/callback`,\n client_id: OAUTH_CONFIG.CLIENT_ID,\n code_verifier: this.codeVerifier,\n state,\n }\n\n const response = await fetch(OAUTH_CONFIG.TOKEN_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestBody),\n })\n\n if (!response.ok) {\n throw new Error(`Token exchange failed: ${response.statusText}`)\n }\n\n const data = await response.json()\n return data\n }\n\n processCallback({\n authorizationCode,\n state,\n useManualRedirect,\n }: {\n authorizationCode: string\n state: string\n useManualRedirect: boolean\n }): void {\n this.closeServer()\n\n if (state !== this.expectedState) {\n if (this.pendingCodePromise) {\n this.pendingCodePromise.reject(\n new Error('Invalid state parameter'), // Possible CSRF attack\n )\n this.pendingCodePromise = null\n }\n return\n }\n\n if (this.pendingCodePromise) {\n this.pendingCodePromise.resolve({ authorizationCode, useManualRedirect })\n this.pendingCodePromise = null\n }\n }\n\n private closeServer(): void {\n if (this.server) {\n this.server.close()\n this.server = null\n }\n }\n}\n\nexport async function createAndStoreApiKey(\n accessToken: string,\n): Promise<string | null> {\n try {\n // Call create_api_key endpoint\n const createApiKeyResp = await fetch(OAUTH_CONFIG.API_KEY_URL, {\n method: 'POST',\n headers: { Authorization: `Bearer ${accessToken}` },\n })\n\n let apiKeyData\n let errorText = ''\n\n try {\n apiKeyData = await createApiKeyResp.json()\n } catch (_e) {\n // If response is not valid JSON, get as text for error logging\n errorText = await createApiKeyResp.text()\n }\n\n if (createApiKeyResp.ok && apiKeyData && apiKeyData.raw_key) {\n const apiKey = apiKeyData.raw_key\n\n // Store in global config\n const config = getGlobalConfig()\n\n // Note: API key is now managed per model profile\n\n // Add to approved list\n if (!config.customApiKeyResponses) {\n config.customApiKeyResponses = { approved: [], rejected: [] }\n }\n if (!config.customApiKeyResponses.approved) {\n config.customApiKeyResponses.approved = []\n }\n\n const normalizedKey = normalizeApiKeyForConfig(apiKey)\n if (!config.customApiKeyResponses.approved.includes(normalizedKey)) {\n config.customApiKeyResponses.approved.push(normalizedKey)\n }\n\n // Save config\n saveGlobalConfig(config)\n\n // Reset the Anthropic client to force creation with new API key\n try {\n const { resetAnthropicClient } = await import('#core/ai/llm')\n resetAnthropicClient()\n } catch {}\n\n return apiKey\n }\n\n return null\n } catch (error) {\n throw error\n }\n}\n", "const BASE_CONFIG = {\n REDIRECT_PORT: 54545,\n MANUAL_REDIRECT_URL: '/oauth/code/callback',\n SCOPES: ['org:create_api_key', 'user:profile'] as const,\n}\n\n// Production OAuth configuration - Used in normal operation\nconst PROD_OAUTH_CONFIG = {\n ...BASE_CONFIG,\n AUTHORIZE_URL: '',\n TOKEN_URL: '',\n API_KEY_URL: '',\n SUCCESS_URL: '',\n CLIENT_ID: '',\n} as const\n\n// Default to prod config, override with test/staging if enabled\nexport const OAUTH_CONFIG = PROD_OAUTH_CONFIG\n", "import React from 'react'\nimport { Box, Text } from 'ink'\nimport { PRODUCT_NAME } from '#core/constants/product'\nimport { getTheme } from '#core/utils/theme'\nimport { MIN_LOGO_WIDTH } from '#ui-ink/components/Logo'\n\nexport function WelcomeBox(): React.ReactNode {\n const theme = getTheme()\n return (\n <Box paddingX={1} width={MIN_LOGO_WIDTH}>\n <Text>\n <Text color={theme.kode}>\u273B</Text> Welcome to{' '}\n <Text bold>{PRODUCT_NAME}</Text> research preview!\n </Text>\n </Box>\n )\n}\n", "import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { getTheme } from '#core/utils/theme'\nimport { ASCII_LOGO } from '#core/constants/product'\n\nexport const MIN_LOGO_WIDTH = 70\n\nexport function Logo({\n mcpClients,\n updateBannerVersion,\n terminalColumns,\n}: {\n mcpClients: any[]\n isDefaultModel?: boolean\n updateBannerVersion?: string | null\n updateBannerCommands?: string[] | null\n terminalColumns?: number\n}): React.ReactNode {\n const theme = getTheme()\n\n const connected = mcpClients.filter(c => c.type === 'connected')\n const failed = mcpClients.filter(c => c.type !== 'connected')\n\n // Generate separator that fits terminal width\n const separatorWidth = Math.min(terminalColumns || 80, 80) - 16\n const separator = '\u2500'.repeat(Math.max(separatorWidth, 20))\n\n return (\n <Box flexDirection=\"column\">\n {/* Update notice at very top */}\n {updateBannerVersion && (\n <Box marginBottom={1}>\n <Text color=\"yellow\">\n Update {updateBannerVersion} available: npm i -g\n @shareai-lab/kode@latest\n </Text>\n </Box>\n )}\n\n {/* ASCII Logo */}\n <Box flexDirection=\"column\">\n <Text color={theme.kode}>{ASCII_LOGO}</Text>\n </Box>\n\n {/* Quick tips - single line */}\n <Box marginTop={1}>\n <Text dimColor>\n /init{' '}/help{' '}\n <Text color={theme.bashBorder}>!</Text>shell{' '}\n <Text color={theme.notingBorder}>#</Text>note{' '}\n @file{' '}opt+m{' '}opt+g\n </Text>\n </Box>\n\n {/* MCP Servers section */}\n <Box flexDirection=\"column\" marginTop={2}>\n <Text dimColor>\u2500\u2500 MCP Servers {separator}</Text>\n <Box marginTop={1} paddingLeft={3}>\n {mcpClients.length === 0 ? (\n <Text dimColor>\n No servers configured - run: kode mcp add {'<name>'}\n </Text>\n ) : (\n <>\n {connected.map(c => (\n <Text key={c.name}>\n <Text color={theme.success}>{c.name}</Text>\n <Text dimColor> </Text>\n </Text>\n ))}\n {failed.map(c => (\n <Text key={c.name}>\n <Text color={theme.error}>{c.name}</Text>\n <Text dimColor> </Text>\n </Text>\n ))}\n </>\n )}\n </Box>\n </Box>\n </Box>\n )\n}\n", "import { getGlobalConfig } from '#core/utils/config'\nimport { addNotification } from '#core/services/notificationCenter'\nimport { spawn } from 'node:child_process'\n\nexport type NotificationOptions = {\n message: string\n title?: string\n}\n\nfunction isWSL(): boolean {\n return Boolean(\n process.env.WSL_DISTRO_NAME ||\n process.env.WSLENV ||\n process.env.WSL_INTEROP,\n )\n}\n\nfunction inWindowsTerminalSession(): boolean {\n return Boolean(process.env.WT_SESSION)\n}\n\nfunction writeControlSequence(sequence: string): void {\n try {\n const originalWrite = (globalThis as any).__KODE_ORIGINAL_STDOUT_WRITE__ as\n | ((chunk: Uint8Array | string) => boolean)\n | undefined\n if (typeof originalWrite === 'function') {\n originalWrite(sequence)\n return\n }\n } catch {\n // ignore\n }\n\n try {\n process.stdout.write(sequence)\n } catch {\n // ignore\n }\n}\n\nfunction sendITerm2Notification({ message, title }: NotificationOptions): void {\n const displayString = title ? `${title}:\\n${message}` : message\n try {\n writeControlSequence(`\\x1b]9;\\n\\n${displayString}\\x07`)\n } catch {\n // Ignore errors\n }\n}\n\nfunction sendTerminalBell(): void {\n writeControlSequence('\\x07')\n}\n\nfunction escapeForXml(input: string): string {\n return input\n .replaceAll('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;')\n .replaceAll('\"', '&quot;')\n .replaceAll(\"'\", '&apos;')\n}\n\nfunction encodeArgument(value: string): string {\n return Buffer.from(escapeForXml(value), 'utf8').toString('base64')\n}\n\nfunction encodeScriptForPowershell(script: string): string {\n return Buffer.from(script, 'utf16le').toString('base64')\n}\n\nfunction buildWindowsToastScript(\n encodedTitle: string,\n encodedBody: string,\n): string {\n return `\n$encoding = [System.Text.Encoding]::UTF8\n$titleText = $encoding.GetString([System.Convert]::FromBase64String(\"${encodedTitle}\"))\n$bodyText = $encoding.GetString([System.Convert]::FromBase64String(\"${encodedBody}\"))\n[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] | Out-Null\n$doc = [Windows.UI.Notifications.ToastNotificationManager]::GetTemplateContent([Windows.UI.Notifications.ToastTemplateType]::ToastText02)\n$textNodes = $doc.GetElementsByTagName(\"text\")\n$textNodes.Item(0).AppendChild($doc.CreateTextNode($titleText)) | Out-Null\n$textNodes.Item(1).AppendChild($doc.CreateTextNode($bodyText)) | Out-Null\n$toast = [Windows.UI.Notifications.ToastNotification]::new($doc)\n[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier('Kode').Show($toast)\n`\n}\n\nasync function trySpawnPowershell(encodedCommand: string): Promise<boolean> {\n const candidates = ['powershell.exe', 'pwsh', 'powershell']\n\n for (const command of candidates) {\n const ok = await new Promise<boolean>(resolve => {\n const child = spawn(\n command,\n ['-NoProfile', '-NoLogo', '-EncodedCommand', encodedCommand],\n { stdio: 'ignore', windowsHide: true },\n )\n\n child.on('error', () => resolve(false))\n child.on('exit', code => resolve(code === 0))\n })\n\n if (ok) return true\n }\n\n return false\n}\n\nasync function sendWindowsToastNotification(\n notif: NotificationOptions,\n): Promise<boolean> {\n const title = notif.title?.trim() || 'Kode'\n const message = notif.message?.trim() || ''\n if (!message) return false\n\n const encodedTitle = encodeArgument(title)\n const encodedBody = encodeArgument(message)\n const script = buildWindowsToastScript(encodedTitle, encodedBody)\n const encodedCommand = encodeScriptForPowershell(script)\n\n return await trySpawnPowershell(encodedCommand)\n}\n\nexport async function sendNotification(\n notif: NotificationOptions,\n): Promise<void> {\n const channel = getGlobalConfig().preferredNotifChannel\n if (channel !== 'notifications_disabled') {\n addNotification({\n title: notif.title,\n message: notif.message,\n source: 'desktop',\n channel,\n })\n }\n switch (channel) {\n case 'iterm2':\n if (\n process.platform === 'win32' ||\n (isWSL() && inWindowsTerminalSession())\n ) {\n const ok = await sendWindowsToastNotification(notif)\n if (!ok) sendITerm2Notification(notif)\n break\n }\n\n sendITerm2Notification(notif)\n break\n case 'terminal_bell':\n sendTerminalBell()\n break\n case 'iterm2_with_bell':\n if (\n process.platform === 'win32' ||\n (isWSL() && inWindowsTerminalSession())\n ) {\n const ok = await sendWindowsToastNotification(notif)\n if (!ok) sendITerm2Notification(notif)\n sendTerminalBell()\n break\n }\n\n sendITerm2Notification(notif)\n sendTerminalBell()\n break\n case 'notifications_disabled':\n // Do nothing\n break\n }\n}\n", "import React from 'react'\nimport { Box, Text } from 'ink'\nimport { PRODUCT_NAME } from '#core/constants/product'\nimport type { Theme } from '#core/utils/theme'\nimport { SimpleSpinner } from './Spinner'\nimport TextInput from './TextInput'\nimport type { OAuthStatus } from './oauthTypes'\nimport { PASTE_HERE_MSG } from './oauthTypes'\n\ntype Props = {\n oauthStatus: OAuthStatus\n theme: Theme\n showPastePrompt: boolean\n pastedCode: string\n onPastedCodeChange: (value: string) => void\n cursorOffset: number\n onCursorOffsetChange: (value: number) => void\n textInputColumns: number\n onSubmitCode: (value: string, url: string) => void | Promise<void>\n}\n\nexport function ConsoleOAuthStatusMessage(props: Props): React.ReactNode {\n const {\n oauthStatus,\n theme,\n showPastePrompt,\n pastedCode,\n onPastedCodeChange,\n cursorOffset,\n onCursorOffsetChange,\n textInputColumns,\n onSubmitCode,\n } = props\n\n switch (oauthStatus.state) {\n case 'idle':\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Text bold>\n {PRODUCT_NAME} is billed based on API usage through your ShareAI Lab\n account.\n </Text>\n\n <Box>\n <Text>\n Pricing may evolve as we move towards general availability.\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text color={theme.permission}>\n Press <Text bold>Enter</Text> to login to your ShareAI Lab\n account\u2026\n </Text>\n </Box>\n </Box>\n )\n\n case 'waiting_for_login':\n return (\n <Box flexDirection=\"column\" gap={1}>\n {!showPastePrompt && (\n <Box>\n <SimpleSpinner />\n <Text>Opening browser to sign in\u2026</Text>\n </Box>\n )}\n\n {showPastePrompt && (\n <Box>\n <Text>{PASTE_HERE_MSG}</Text>\n <TextInput\n value={pastedCode}\n onChange={onPastedCodeChange}\n onSubmit={(value: string) =>\n onSubmitCode(value, oauthStatus.url)\n }\n cursorOffset={cursorOffset}\n onChangeCursorOffset={onCursorOffsetChange}\n columns={textInputColumns}\n />\n </Box>\n )}\n </Box>\n )\n\n case 'creating_api_key':\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Box>\n <SimpleSpinner />\n <Text>Creating API key for Kode\u2026</Text>\n </Box>\n </Box>\n )\n\n case 'about_to_retry':\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Text color={theme.permission}>Retrying\u2026</Text>\n </Box>\n )\n\n case 'success':\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Text color={theme.success}>\n Login successful. Press <Text bold>Enter</Text> to continue\u2026\n </Text>\n </Box>\n )\n\n case 'error':\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Text color={theme.error}>OAuth error: {oauthStatus.message}</Text>\n\n {oauthStatus.toRetry && (\n <Box marginTop={1}>\n <Text color={theme.permission}>\n Press <Text bold>Enter</Text> to retry.\n </Text>\n </Box>\n )}\n </Box>\n )\n\n default:\n return null\n }\n}\n", "import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { useEffect, useRef, useState } from 'react'\nimport { getTheme } from '#core/utils/theme'\nimport { sample } from 'lodash-es'\nimport { getSessionState } from '#core/utils/sessionState'\n\nconst PULSE_FRAMES = ['\u280B', '\u2819', '\u2839', '\u2838', '\u283C', '\u2834', '\u2826', '\u2827', '\u2807', '\u280F']\nconst SPINNER_FRAMES = ['\u280B', '\u2819', '\u2839', '\u2838', '\u283C', '\u2834', '\u2826', '\u2827', '\u2807', '\u280F']\n\nconst MESSAGES = [\n 'Accomplishing',\n 'Actioning',\n 'Actualizing',\n 'Baking',\n 'Brewing',\n 'Calculating',\n 'Cerebrating',\n 'Churning',\n 'Coding',\n 'Coalescing',\n 'Cogitating',\n 'Computing',\n 'Conjuring',\n 'Considering',\n 'Cooking',\n 'Crafting',\n 'Creating',\n 'Crunching',\n 'Deliberating',\n 'Determining',\n 'Doing',\n 'Effecting',\n 'Finagling',\n 'Forging',\n 'Forming',\n 'Generating',\n 'Hatching',\n 'Herding',\n 'Honking',\n 'Hustling',\n 'Ideating',\n 'Inferring',\n 'Manifesting',\n 'Marinating',\n 'Moseying',\n 'Mulling',\n 'Mustering',\n 'Musing',\n 'Noodling',\n 'Percolating',\n 'Pondering',\n 'Processing',\n 'Puttering',\n 'Reticulating',\n 'Ruminating',\n 'Schlepping',\n 'Shucking',\n 'Simmering',\n 'Smooshing',\n 'Spinning',\n 'Stewing',\n 'Synthesizing',\n 'Thinking',\n 'Transmuting',\n 'Vibing',\n 'Working',\n]\n\nexport function Spinner(): React.ReactNode {\n const frames = SPINNER_FRAMES\n const [frame, setFrame] = useState(0)\n const [elapsedTime, setElapsedTime] = useState(0)\n const message = useRef(sample(MESSAGES))\n const startTime = useRef(Date.now())\n\n useEffect(() => {\n const timer = setInterval(() => {\n setFrame(f => (f + 1) % frames.length)\n }, 80)\n\n return () => clearInterval(timer)\n }, [frames.length])\n\n useEffect(() => {\n const timer = setInterval(() => {\n setElapsedTime(Math.floor((Date.now() - startTime.current) / 1000))\n }, 1000)\n\n return () => clearInterval(timer)\n }, [])\n\n return (\n <Box flexDirection=\"row\" marginTop={1}>\n <Box flexWrap=\"nowrap\" height={1} width={2}>\n <Text color={getTheme().kode}>{frames[frame]}</Text>\n </Box>\n <Text color={getTheme().kode}>{message.current}\u2026 </Text>\n <Text color={getTheme().secondaryText}>\n ({elapsedTime}s \u00B7 <Text bold>esc</Text> to interrupt)\n </Text>\n <Text color={getTheme().secondaryText}>\n \u00B7 {getSessionState('currentError')}\n </Text>\n </Box>\n )\n}\n\nexport function SimpleSpinner(): React.ReactNode {\n const frames = SPINNER_FRAMES\n const [frame, setFrame] = useState(0)\n\n useEffect(() => {\n const timer = setInterval(() => {\n setFrame(f => (f + 1) % frames.length)\n }, 80)\n\n return () => clearInterval(timer)\n }, [frames.length])\n\n return (\n <Box flexWrap=\"nowrap\" height={1} width={2}>\n <Text color={getTheme().kode}>{frames[frame]}</Text>\n </Box>\n )\n}\n\nexport function BashSpinner(): React.ReactNode {\n const frames = SPINNER_FRAMES\n const theme = getTheme()\n const [frame, setFrame] = useState(0)\n const [elapsedTime, setElapsedTime] = useState(0)\n const startTime = useRef(Date.now())\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() - startTime.current) / 1000))\n }, 1000)\n return () => clearInterval(timer)\n }, [])\n\n return (\n <Box flexDirection=\"row\" marginTop={1}>\n <Text color={theme.kode} bold>\n {frames[frame]} Running\n </Text>\n <Text color={theme.secondaryText}>\n {' '}:: {elapsedTime}s (<Text bold>esc</Text>)\n </Text>\n </Box>\n )\n}\n", "export type OAuthStatus =\n | { state: 'idle' }\n | { state: 'ready_to_start' }\n | { state: 'waiting_for_login'; url: string }\n | { state: 'creating_api_key' }\n | { state: 'about_to_retry'; nextState: OAuthStatus }\n | { state: 'success'; apiKey: string }\n | {\n state: 'error'\n message: string\n toRetry?: OAuthStatus\n }\n\nexport const PASTE_HERE_MSG = 'Paste code here if prompted > '\n", "import { getGlobalConfig } from './config'\n\nexport function isAnthropicAuthEnabled(): boolean {\n // Kode supports interactive OAuth for managed accounts; expose login/logout commands\n // in the CLI command surface (they are still no-ops unless the user completes auth).\n return true\n}\n\nexport function isLoggedInToAnthropic(): boolean {\n const config = getGlobalConfig()\n return Boolean(config.oauthAccount)\n}\n", "import * as React from 'react'\nimport type { Command } from '../types'\nimport { getGlobalConfig, saveGlobalConfig } from '#core/utils/config'\nimport { clearTerminal } from '#cli-utils/terminal'\nimport { Text } from 'ink'\n\nexport default {\n type: 'local-jsx',\n name: 'logout',\n description: 'Sign out from your ShareAI Lab account',\n isEnabled: true,\n isHidden: false,\n async call() {\n await clearTerminal()\n\n const config = getGlobalConfig()\n\n config.oauthAccount = undefined\n config.hasCompletedOnboarding = false\n\n if (config.customApiKeyResponses?.approved) {\n config.customApiKeyResponses.approved = []\n }\n\n saveGlobalConfig(config)\n\n const message = (\n <Text>Successfully logged out from your ShareAI Lab account.</Text>\n )\n\n setTimeout(() => {\n process.exit(0)\n }, 200)\n\n return message\n },\n userFacingName() {\n return 'logout'\n },\n} satisfies Command\n", "import React from 'react'\nimport type { Command } from '../types'\nimport { LspStatus } from '#ui-ink/screens/LspStatus'\n\nconst lsp: Command = {\n name: 'lsp',\n description: 'Show Language Server Protocol (LSP) status and configuration',\n isEnabled: true,\n isHidden: false,\n ui: { displayMode: 'fullscreen' },\n userFacingName() {\n return 'lsp'\n },\n type: 'local-jsx',\n call(onDone) {\n return Promise.resolve(React.createElement(LspStatus, { onDone }))\n },\n}\n\nexport default lsp\n", "import React, { useEffect, useMemo, useState } from 'react'\nimport { Box, Text } from 'ink'\nimport { getTheme } from '#core/utils/theme'\nimport { PressEnterToContinue } from '#ui-ink/components/PressEnterToContinue'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { resolve } from 'node:path'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\nimport {\n buildLspServerProcessEnv,\n listResolvedLspServers,\n resolveExecutableFromEnv,\n} from '#tools/tools/system/LspTool/lspConfig'\nimport { getClients } from '#core/mcp/client/clients'\nimport {\n getCachedLspRuntimeStatus,\n type LspRuntimeServerStatus,\n} from '#tools/tools/system/LspTool/call'\n\ntype Props = {\n onDone: () => void\n}\n\ntype State =\n | { status: 'loading' }\n | {\n status: 'ready'\n servers: Awaited<ReturnType<typeof listResolvedLspServers>>\n runtime: {\n hasManager: boolean\n signature: string | null\n servers: LspRuntimeServerStatus[]\n }\n ideMcpConnected: boolean\n }\n | { status: 'error'; message: string }\n\nfunction summarizeSource(source: { kind: string } | undefined): string {\n if (!source) return 'unknown'\n if (source.kind === 'plugin') return 'plugin'\n return source.kind\n}\n\nfunction resolveCommandPath(server: {\n command?: string\n env?: Record<string, string>\n workspaceFolder?: string\n}): string | null {\n const command =\n typeof server.command === 'string' ? server.command.trim() : ''\n if (!command) return null\n\n const cwd =\n typeof server.workspaceFolder === 'string' && server.workspaceFolder.trim()\n ? resolve(server.workspaceFolder.trim())\n : process.cwd()\n\n const mergedEnv = buildLspServerProcessEnv({ cwd, env: server.env })\n return resolveExecutableFromEnv({\n command,\n cwd,\n env: mergedEnv,\n })\n}\n\nexport function LspStatus({ onDone }: Props): React.ReactNode {\n const [state, setState] = useState<State>({ status: 'loading' })\n const theme = getTheme()\n const layout = useScreenLayout()\n\n useKeypress((_input, key) => {\n if (key.return || key.escape) onDone()\n })\n\n useEffect(() => {\n let cancelled = false\n ;(async () => {\n try {\n const [servers, clients] = await Promise.all([\n listResolvedLspServers(),\n getClients(),\n ])\n const runtime = getCachedLspRuntimeStatus()\n const ideMcpConnected = clients.some(\n c => c.type === 'connected' && c.name === 'ide',\n )\n if (cancelled) return\n setState({\n status: 'ready',\n servers,\n runtime,\n ideMcpConnected,\n })\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n if (cancelled) return\n setState({ status: 'error', message })\n }\n })()\n return () => {\n cancelled = true\n }\n }, [])\n\n const summary = useMemo(() => {\n if (state.status !== 'ready') return null\n\n return {\n resolvedCount: state.servers.length,\n servers: state.servers,\n }\n }, [state])\n\n if (state.status === 'loading') {\n return (\n <ScreenFrame\n title=\"LSP Status\"\n paddingX={layout.paddingX}\n paddingY={layout.paddingY}\n gap={layout.gap}\n >\n <Text color={theme.secondaryText}>Checking LSP status\u2026</Text>\n </ScreenFrame>\n )\n }\n\n if (state.status === 'error') {\n return (\n <ScreenFrame\n title=\"LSP Status\"\n paddingX={layout.paddingX}\n paddingY={layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Text color={theme.error}>\u2718 LSP status check failed</Text>\n <Text dimColor>{state.message}</Text>\n <PressEnterToContinue />\n </Box>\n </ScreenFrame>\n )\n }\n\n const runnablePreview = summary?.servers.slice(0, 12) ?? []\n const activeServers = state.runtime.servers.filter(s => s.state !== 'stopped')\n const runningServers = activeServers.filter(s => s.state === 'running')\n\n return (\n <ScreenFrame\n title=\"LSP Status\"\n paddingX={layout.paddingX}\n paddingY={layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Box flexDirection=\"column\" gap={0}>\n <Text dimColor>\n IDE MCP connected: {state.ideMcpConnected ? 'yes' : 'no'}\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" gap={0}>\n <Text color={theme.success}>\n \u2713 Resolved servers: {summary?.resolvedCount ?? 0}\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" gap={0}>\n <Text color={theme.secondaryText}>Active servers (this session)</Text>\n {!state.runtime.hasManager ? (\n <Text dimColor>\n Not initialized yet. LSP servers start automatically once\n configured and initialized.\n </Text>\n ) : activeServers.length === 0 ? (\n <Text dimColor>No servers running yet.</Text>\n ) : (\n <>\n <Text dimColor>\n Running: {runningServers.length} \u2022 Active:{' '}\n {activeServers.length}\n </Text>\n {activeServers.slice(0, 8).map(s => (\n <Text key={s.name} dimColor>\n \u2022 {s.name} \u2014 {s.state}\n {s.pid ? ` (pid ${s.pid})` : ''}\n </Text>\n ))}\n {activeServers.length > 8 ? (\n <Text dimColor>\u2026and {activeServers.length - 8} more</Text>\n ) : null}\n </>\n )}\n </Box>\n\n {summary && summary.resolvedCount > 0 ? (\n <Box flexDirection=\"column\" gap={0}>\n <Text color={theme.secondaryText}>Configured servers</Text>\n {runnablePreview.map(server => {\n const extCount = Object.keys(\n server.extensionToLanguage ?? {},\n ).length\n const resolvedPath = resolveCommandPath(server)\n return (\n <Box key={server.name} flexDirection=\"column\">\n <Text dimColor>\n \u2022 {server.name} ({summarizeSource(server.source)}) \u2014{' '}\n {extCount} ext\n </Text>\n {resolvedPath ? (\n <Text dimColor> \u21B3 bin: {resolvedPath}</Text>\n ) : null}\n </Box>\n )\n })}\n {summary.servers.length > runnablePreview.length ? (\n <Text dimColor>\n \u2026and {summary.servers.length - runnablePreview.length} more\n </Text>\n ) : null}\n </Box>\n ) : (\n <Box flexDirection=\"column\" gap={0}>\n <Text color={theme.warning}>No LSP servers configured.</Text>\n <Text dimColor>Configure LSP servers via enabled plugins.</Text>\n </Box>\n )}\n\n <PressEnterToContinue />\n </Box>\n </ScreenFrame>\n )\n}\n", "import * as React from 'react'\nimport { getTheme } from '#core/utils/theme'\nimport { Text } from 'ink'\n\nexport function PressEnterToContinue(): React.ReactNode {\n return (\n <Text color={getTheme().permission}>\n Press <Text bold>Enter</Text> to continue\u2026\n </Text>\n )\n}\n", "import type { Command } from '../types'\nimport {\n getClients,\n getMcprcServerStatus,\n listMCPServers,\n} from '#core/mcp/client'\nimport { PRODUCT_COMMAND } from '#core/constants/product'\nimport chalk from 'chalk'\nimport { getTheme } from '#core/utils/theme'\nimport { getProjectMcpServerDefinitions } from '#core/utils/config'\n\nconst mcp = {\n type: 'local',\n name: 'mcp',\n description: 'Show MCP server connection status',\n isEnabled: true,\n isHidden: false,\n async call() {\n const servers = listMCPServers()\n const clients = await getClients()\n const theme = getTheme()\n const projectFileServers = getProjectMcpServerDefinitions()\n\n if (Object.keys(servers).length === 0) {\n return [\n '\u23BF No MCP servers configured.',\n `\u23BF - Create \\`.mcp.json\\` or \\`.mcprc\\` in this project, or run \\`${PRODUCT_COMMAND} mcp add\\`.`,\n `\u23BF - Run \\`${PRODUCT_COMMAND} mcp list\\` to view configured servers.`,\n ].join('\\n')\n }\n\n const clientByName = new Map<string, (typeof clients)[number]>()\n for (const client of clients) {\n clientByName.set(client.name, client)\n }\n\n const serverStatusLines = Object.keys(servers)\n .sort((a, b) => a.localeCompare(b))\n .map(name => {\n const client = clientByName.get(name)\n if (client?.type === 'connected') {\n return `\u23BF \u2022 ${name}: ${chalk.hex(theme.success)('connected')}`\n }\n if (client?.type === 'failed') {\n return `\u23BF \u2022 ${name}: ${chalk.hex(theme.error)('failed')}`\n }\n\n if (projectFileServers.servers[name]) {\n const approval = getMcprcServerStatus(name)\n if (approval === 'pending') {\n return `\u23BF \u2022 ${name}: ${chalk.hex(theme.warning)('pending approval')}`\n }\n if (approval === 'rejected') {\n return `\u23BF \u2022 ${name}: ${chalk.hex(theme.error)('rejected')}`\n }\n }\n\n return `\u23BF \u2022 ${name}: ${chalk.hex(theme.error)('disconnected')}`\n })\n\n return ['\u23BF MCP Server Status', ...serverStatusLines].join('\\n')\n },\n userFacingName() {\n return 'mcp'\n },\n} satisfies Command\n\nexport default mcp\n", "import type { Command } from '../types'\nimport { reloadCustomCommandsForSession } from '#cli-services/customCommands'\nimport {\n addMarketplace,\n disableSkillPlugin,\n enableSkillPlugin,\n installSkillPlugin,\n listEnabledInstalledPluginPackRoots,\n listInstalledSkillPlugins,\n listMarketplaces,\n refreshAllMarketplacesAsync,\n refreshMarketplaceAsync,\n removeMarketplace,\n uninstallSkillPlugin,\n} from '#cli-services/skillMarketplace'\nimport {\n formatValidationResult,\n validatePluginOrMarketplacePath,\n} from '#cli-services/pluginValidation'\nimport { getCwd } from '#core/utils/state'\nimport { parse } from 'shell-quote'\nimport { getSessionPlugins } from '#core/utils/sessionPlugins'\n\ntype PluginScope = 'user' | 'project' | 'local'\nconst PLUGIN_SCOPES: readonly PluginScope[] = ['user', 'project', 'local']\n\nfunction parseTokens(input: string): string[] {\n const parts = parse(input)\n const out: string[] = []\n for (const part of parts) {\n if (typeof part === 'string') out.push(part)\n }\n return out\n}\n\nfunction parseCommonFlags(tokens: string[]): {\n scope: PluginScope\n force: boolean\n json: boolean\n rest: string[]\n} {\n let scope: PluginScope = 'user'\n let force = false\n let json = false\n const rest: string[] = []\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i]!\n if ((token === '--scope' || token === '-s') && i + 1 < tokens.length) {\n const next = tokens[i + 1] as string\n if (PLUGIN_SCOPES.includes(next as PluginScope)) {\n scope = next as PluginScope\n i++\n continue\n }\n }\n if (token === '--force') {\n force = true\n continue\n }\n if (token === '--json') {\n json = true\n continue\n }\n rest.push(token)\n }\n\n return { scope, force, json, rest }\n}\n\nasync function refreshCommandsCache(): Promise<void> {\n await reloadCustomCommandsForSession()\n}\n\nasync function refreshPluginRuntimeFromInstalls(): Promise<string[]> {\n const installedRoots = listEnabledInstalledPluginPackRoots()\n const existingRoots = getSessionPlugins().map(p => p.rootDir)\n const dirs = Array.from(new Set([...existingRoots, ...installedRoots]))\n if (dirs.length === 0) return []\n\n const { configureSessionPlugins } =\n await import('#cli-services/pluginRuntime')\n const { errors } = await configureSessionPlugins({ pluginDirs: dirs })\n return errors\n}\n\nconst plugin = {\n type: 'local',\n name: 'plugin',\n description: 'Manage plugins and marketplaces',\n isEnabled: true,\n isHidden: false,\n async call(args: string, _context: any) {\n const tokens = parseTokens(args)\n if (tokens.length === 0) {\n return [\n 'Usage:',\n ' /plugin marketplace add <source>',\n ' /plugin marketplace list [--json]',\n ' /plugin marketplace remove <name>',\n ' /plugin marketplace update [name]',\n ' /plugin install <plugin> [--scope user|project|local] [--force]',\n ' /plugin uninstall <plugin> [--scope user|project|local]',\n ' /plugin enable <plugin> [--scope user|project|local]',\n ' /plugin disable <plugin> [--scope user|project|local]',\n ' /plugin list [--scope user|project|local] [--json]',\n ' /plugin validate <path>',\n ].join('\\n')\n }\n\n const [subcommand, ...restTokens] = tokens\n\n if (subcommand === 'marketplace') {\n const [action, ...actionArgs] = restTokens\n const { json } = parseCommonFlags(actionArgs)\n\n if (action === 'add') {\n const source = actionArgs.filter(t => !t.startsWith('--')).join(' ')\n if (!source) return 'Usage: /plugin marketplace add <source>'\n const { name } = await addMarketplace(source)\n await refreshCommandsCache()\n return `\u2713 Successfully added marketplace: ${name}`\n }\n\n if (action === 'list') {\n const marketplaces = listMarketplaces()\n if (json) return JSON.stringify(marketplaces, null, 2)\n const names = Object.keys(marketplaces).sort()\n if (names.length === 0) return 'No marketplaces configured'\n const lines: string[] = ['Configured marketplaces:']\n for (const name of names) {\n const entry: any = marketplaces[name]\n lines.push(` - ${name}`)\n const src = entry?.source\n if (src?.source === 'github')\n lines.push(` Source: GitHub (${src.repo})`)\n else if (src?.source === 'git')\n lines.push(` Source: Git (${src.url})`)\n else if (src?.source === 'url')\n lines.push(` Source: URL (${src.url})`)\n else if (src?.source === 'directory')\n lines.push(` Source: Directory (${src.path})`)\n else if (src?.source === 'file')\n lines.push(` Source: File (${src.path})`)\n else if (src?.source === 'npm')\n lines.push(` Source: NPM (${src.package})`)\n }\n return lines.join('\\n')\n }\n\n if (action === 'remove' || action === 'rm') {\n const name = actionArgs[0]?.trim()\n if (!name) return 'Usage: /plugin marketplace remove <name>'\n removeMarketplace(name)\n await refreshCommandsCache()\n return `\u2713 Successfully removed marketplace: ${name}`\n }\n\n if (action === 'update') {\n const name = actionArgs[0]?.trim()\n if (name) {\n await refreshMarketplaceAsync(name)\n await refreshCommandsCache()\n return `\u2713 Successfully updated marketplace: ${name}`\n }\n const marketplaces = listMarketplaces()\n const names = Object.keys(marketplaces)\n if (names.length === 0) return 'No marketplaces configured'\n await refreshAllMarketplacesAsync()\n await refreshCommandsCache()\n return `\u2713 Successfully updated ${names.length} marketplace(s)`\n }\n\n return `Unknown marketplace subcommand: ${String(action || '')}`\n }\n\n if (subcommand === 'install') {\n const { scope, force, rest } = parseCommonFlags(restTokens)\n const pluginArg = rest[0]\n if (!pluginArg)\n return 'Usage: /plugin install <plugin> [--scope user|project|local] [--force]'\n const result = installSkillPlugin(pluginArg, { scope, force })\n const record = listInstalledSkillPlugins()[result.pluginSpec]\n const isPack = record?.kind === 'plugin-pack'\n const loadErrors = await refreshPluginRuntimeFromInstalls()\n await refreshCommandsCache()\n const lines: string[] = []\n lines.push(\n `\u2713 Installed ${result.pluginSpec} (scope=${scope})${isPack ? ' [plugin pack]' : ''}`,\n )\n if (!isPack) {\n lines.push(`Skills: ${result.installedSkills.join(', ') || '(none)'}`)\n }\n if (loadErrors.length > 0) {\n lines.push('', 'Warnings:', ...loadErrors.map(e => `- ${e}`))\n }\n return lines.join('\\n')\n }\n\n if (\n subcommand === 'uninstall' ||\n subcommand === 'remove' ||\n subcommand === 'rm'\n ) {\n const { scope, rest } = parseCommonFlags(restTokens)\n const pluginArg = rest[0]\n if (!pluginArg)\n return 'Usage: /plugin uninstall <plugin> [--scope user|project|local]'\n const result = uninstallSkillPlugin(pluginArg, { scope })\n const loadErrors = await refreshPluginRuntimeFromInstalls()\n await refreshCommandsCache()\n const lines: string[] = []\n lines.push(`\u2713 Uninstalled ${result.pluginSpec} (scope=${scope})`)\n if (result.removedSkills.length > 0) {\n lines.push(`Skills: ${result.removedSkills.join(', ')}`)\n }\n if (loadErrors.length > 0) {\n lines.push('', 'Warnings:', ...loadErrors.map(e => `- ${e}`))\n }\n return lines.join('\\n')\n }\n\n if (subcommand === 'enable') {\n const { scope, rest } = parseCommonFlags(restTokens)\n const pluginArg = rest[0]\n if (!pluginArg)\n return 'Usage: /plugin enable <plugin> [--scope user|project|local]'\n const result = enableSkillPlugin(pluginArg, { scope })\n const loadErrors = await refreshPluginRuntimeFromInstalls()\n await refreshCommandsCache()\n const lines: string[] = []\n lines.push(`\u2713 Enabled ${result.pluginSpec} (scope=${scope})`)\n if (loadErrors.length > 0) {\n lines.push('', 'Warnings:', ...loadErrors.map(e => `- ${e}`))\n }\n return lines.join('\\n')\n }\n\n if (subcommand === 'disable') {\n const { scope, rest } = parseCommonFlags(restTokens)\n const pluginArg = rest[0]\n if (!pluginArg)\n return 'Usage: /plugin disable <plugin> [--scope user|project|local]'\n const result = disableSkillPlugin(pluginArg, { scope })\n const loadErrors = await refreshPluginRuntimeFromInstalls()\n await refreshCommandsCache()\n const lines: string[] = []\n lines.push(`\u2713 Disabled ${result.pluginSpec} (scope=${scope})`)\n if (loadErrors.length > 0) {\n lines.push('', 'Warnings:', ...loadErrors.map(e => `- ${e}`))\n }\n return lines.join('\\n')\n }\n\n if (subcommand === 'list') {\n const { scope, json } = parseCommonFlags(restTokens)\n const cwd = getCwd()\n const all = listInstalledSkillPlugins()\n const filtered = Object.fromEntries(\n Object.entries(all).filter(([, record]) => {\n const r: any = record\n if (!r || r.scope !== scope) return false\n if (scope === 'user') return true\n return r.projectPath === cwd\n }),\n )\n if (json) return JSON.stringify(filtered, null, 2)\n const specs = Object.keys(filtered).sort()\n if (specs.length === 0) return 'No plugins installed'\n const lines: string[] = [`Installed plugins (scope=${scope}):`]\n for (const spec of specs) {\n const r: any = filtered[spec]\n const enabled = r?.isEnabled === false ? 'disabled' : 'enabled'\n lines.push(` - ${spec} (${enabled})`)\n }\n return lines.join('\\n')\n }\n\n if (subcommand === 'validate') {\n const target = restTokens.join(' ').trim()\n if (!target) {\n return [\n 'Usage: /plugin validate <path>',\n ' kode plugin validate <path>',\n ].join('\\n')\n }\n const result = validatePluginOrMarketplacePath(target)\n return `Validating ${result.fileType} manifest: ${result.filePath}\\n${formatValidationResult(result)}`\n }\n\n return `Unknown /plugin subcommand: ${subcommand}`\n },\n userFacingName() {\n return 'plugin'\n },\n} satisfies Command\n\nexport default plugin\n", "import React, { useMemo, useRef } from 'react'\nimport { Box, Text } from 'ink'\nimport chalk from 'chalk'\nimport type { Command } from '../types'\nimport { Select } from '#ui-ink/components/CustomSelect/select'\nimport { getTheme } from '#core/utils/theme'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\nimport {\n DEFAULT_OUTPUT_STYLE,\n getAvailableOutputStyles,\n getCurrentOutputStyle,\n resolveOutputStyleName,\n setCurrentOutputStyle,\n} from '#cli-services/outputStyles'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\n\nconst HELP_ARGS = new Set(['help', '-h', '--help'])\nconst CURRENT_ARGS = new Set(['?', 'current'])\n\nfunction normalizeStyleName(value: string): string {\n return value.trim()\n}\n\nfunction OutputStyleMenu({\n onDone,\n}: {\n onDone: (result?: string) => void\n}): React.ReactNode {\n const theme = getTheme()\n const layout = useScreenLayout()\n const doneRef = useRef(false)\n\n const styles = useMemo(() => getAvailableOutputStyles(), [])\n const styleNames = useMemo(() => {\n const names = Object.keys(styles)\n return names.sort((a, b) => {\n if (a === DEFAULT_OUTPUT_STYLE && b !== DEFAULT_OUTPUT_STYLE) return -1\n if (b === DEFAULT_OUTPUT_STYLE && a !== DEFAULT_OUTPUT_STYLE) return 1\n return a.localeCompare(b)\n })\n }, [styles])\n\n const rawCurrentStyle = getCurrentOutputStyle()\n const resolvedCurrentStyle =\n resolveOutputStyleName(rawCurrentStyle) ?? DEFAULT_OUTPUT_STYLE\n\n const finish = (msg?: string) => {\n if (doneRef.current) return\n doneRef.current = true\n onDone(msg)\n }\n\n useKeypress((_input, key) => {\n if (key.escape) {\n finish(`Kept output style as ${chalk.bold(rawCurrentStyle)}`)\n return true\n }\n })\n\n return (\n <ScreenFrame\n title=\"Output Style\"\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 Current: {resolvedCurrentStyle}\n </Text>\n <Text dimColor wrap=\"truncate-end\">\n Choose how Kode formats assistant output (verbosity, structure, etc).\n </Text>\n\n <Select\n options={styleNames.map(name => ({ label: name, value: name }))}\n defaultValue={resolvedCurrentStyle}\n visibleOptionCount={Math.min(12, Math.max(5, styleNames.length))}\n onChange={value => {\n const next = normalizeStyleName(value)\n setCurrentOutputStyle(next)\n finish(`Set output style to ${chalk.bold(next)}`)\n }}\n />\n\n <Box marginTop={layout.tightLayout ? 0 : 1}>\n <Text dimColor wrap=\"truncate-end\">\n \u2191/\u2193 navigate \u00B7 Enter select \u00B7 Esc close\n </Text>\n </Box>\n </Box>\n </ScreenFrame>\n )\n}\n\nconst outputStyle = {\n type: 'local-jsx',\n name: 'output-style',\n description: 'Set the output style directly or from a selection menu',\n isEnabled: true,\n isHidden: false,\n ui: { displayMode: 'fullscreen' },\n argumentHint: '[style]',\n userFacingName() {\n return 'output-style'\n },\n async call(onDone, _context, args) {\n const raw = (args ?? '').trim()\n\n if (CURRENT_ARGS.has(raw)) {\n const current = getCurrentOutputStyle()\n onDone(`Current output style: ${current}`)\n return null\n }\n\n if (HELP_ARGS.has(raw)) {\n onDone(\n 'Run /output-style to open the output style selection menu, or /output-style [styleName] to set the output style.',\n )\n return null\n }\n\n if (raw) {\n const resolved = resolveOutputStyleName(raw)\n if (!resolved) {\n onDone(`Invalid output style: ${raw}`)\n return null\n }\n setCurrentOutputStyle(resolved)\n onDone(`Set output style to ${chalk.bold(resolved)}`)\n return null\n }\n\n return <OutputStyleMenu onDone={onDone} />\n },\n} satisfies Command\n\nexport default outputStyle\n", "import type { Command } from '../types'\n\nimport React from 'react'\n\nimport { PermissionsScreen } from '#ui-ink/screens/overlays/PermissionsScreen'\n\nconst permissions = {\n type: 'local-jsx',\n name: 'permissions',\n description: 'Manage allow & deny tool permission rules',\n isEnabled: true,\n isHidden: false,\n aliases: ['allowed-tools'],\n ui: { displayMode: 'fullscreen' },\n disableNonInteractive: true,\n async call(onDone, context) {\n return React.createElement(PermissionsScreen, {\n context,\n onDone,\n })\n },\n userFacingName() {\n return 'permissions'\n },\n} satisfies Command\n\nexport default permissions\n", "import React, { useCallback, useMemo, useRef, useState } from 'react'\nimport { Box, Text } from 'ink'\nimport figures from 'figures'\nimport type { ThemeNames } from '#core/utils/theme'\nimport { getTheme } from '#core/utils/theme'\nimport { getGlobalConfig, saveGlobalConfig } from '#core/utils/config'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\n\ntype Props = {\n onDone: (result?: string) => void\n}\n\nconst THEME_OPTIONS: ThemeNames[] = [\n 'dark',\n 'light',\n 'dark-daltonized',\n 'light-daltonized',\n]\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n\nexport function ThemePickerScreen({ 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 (result?: string) => {\n if (didDoneRef.current) return\n didDoneRef.current = true\n onDone(result)\n },\n [onDone],\n )\n\n const initialTheme = getGlobalConfig().theme ?? 'dark'\n const initialIndex = Math.max(0, THEME_OPTIONS.indexOf(initialTheme))\n const [selectedIndex, setSelectedIndex] = useState(initialIndex)\n\n const applySelectedTheme = useCallback(() => {\n const selected = THEME_OPTIONS[selectedIndex] ?? 'dark'\n saveGlobalConfig({ ...getGlobalConfig(), theme: selected })\n safeOnDone(`Theme set to ${selected}`)\n }, [safeOnDone, selectedIndex])\n\n useKeypress((input, key) => {\n const inputChar = input.length === 1 ? input : ''\n\n if (key.escape || (key.ctrl && inputChar === 'c')) {\n safeOnDone('Theme picker dismissed')\n return true\n }\n\n if (key.upArrow || inputChar === 'k') {\n setSelectedIndex(prev => clamp(prev - 1, 0, THEME_OPTIONS.length - 1))\n return true\n }\n if (key.downArrow || inputChar === 'j') {\n setSelectedIndex(prev => clamp(prev + 1, 0, THEME_OPTIONS.length - 1))\n return true\n }\n\n if (key.return) {\n applySelectedTheme()\n return true\n }\n })\n\n const shortcutLine = '\u2191/\u2193 select \u00B7 Enter set \u00B7 Esc cancel'\n\n const options = useMemo(() => THEME_OPTIONS, [])\n\n return (\n <ScreenFrame\n title=\"Theme\"\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 {options.map((name, idx) => {\n const isSelected = idx === selectedIndex\n return (\n <Text\n key={name}\n color={isSelected ? theme.text : theme.secondaryText}\n bold={isSelected}\n wrap=\"truncate-end\"\n >\n {isSelected ? figures.pointer : ' '} {name}\n </Text>\n )\n })}\n </Box>\n </Box>\n </ScreenFrame>\n )\n}\n", "import type { Command } from '../types'\nimport { ThemePickerScreen } from '#ui-ink/screens/overlays/ThemePickerScreen'\nimport * as React from 'react'\n\nconst theme = {\n type: 'local-jsx',\n name: 'theme',\n description: 'Change the theme',\n isEnabled: true,\n isHidden: false,\n ui: { displayMode: 'fullscreen' },\n async call(onDone) {\n return <ThemePickerScreen onDone={onDone} />\n },\n userFacingName() {\n return 'theme'\n },\n} satisfies Command\n\nexport default theme\n", "import type { Command } from '../types'\nimport { getGlobalConfig, saveGlobalConfig } from '#core/utils/config'\n\nconst vim = {\n type: 'local-jsx',\n name: 'vim',\n description: 'Toggle between Vim and Normal editing modes',\n isEnabled: true,\n isHidden: false,\n async call(onDone) {\n const current = getGlobalConfig().editorMode ?? 'normal'\n const normalized = current === 'emacs' ? 'normal' : current\n const next = normalized === 'normal' ? 'vim' : 'normal'\n\n saveGlobalConfig({ ...getGlobalConfig(), editorMode: next })\n\n onDone(\n `Editor mode set to ${next}. ${\n next === 'vim'\n ? 'Use Escape key to toggle between INSERT and NORMAL modes.'\n : 'Using standard (readline) keyboard bindings.'\n }`,\n )\n return null\n },\n userFacingName() {\n return 'vim'\n },\n} satisfies Command\n\nexport default vim\n", "import React from 'react'\nimport { ModelConfig } from '#ui-ink/components/ModelConfig'\nimport { enableConfigs } from '#core/utils/config'\nimport { triggerModelConfigChange } from '#core/messages'\n\nexport const help = 'Change your AI provider and model settings'\nexport const description = 'Change your AI provider and model settings'\nexport const isEnabled = true\nexport const isHidden = false\nexport const name = 'model'\nexport const type = 'local-jsx'\nexport const ui = { displayMode: 'fullscreen' as const }\n\nexport function userFacingName(): string {\n return name\n}\n\nexport async function call(\n onDone: (result?: string) => void,\n context: any,\n): Promise<React.ReactNode> {\n const { abortController } = context\n enableConfigs()\n abortController?.abort?.()\n return (\n <ModelConfig\n onClose={() => {\n // Force ModelManager reload to ensure UI sync - wait for completion before closing\n import('#core/utils/model').then(({ reloadModelManager }) => {\n reloadModelManager()\n // \uD83D\uDD27 Critical fix: Trigger global UI refresh after model config changes\n // This ensures PromptInput component detects ModelManager singleton state changes\n triggerModelConfigChange()\n // Only close after reload is complete to ensure UI synchronization\n onDone()\n })\n }}\n />\n )\n}\n", "import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { useCallback, useMemo, useRef, useState } from 'react'\nimport figures from 'figures'\nimport { getTheme } from '#core/utils/theme'\nimport {\n getGlobalConfigCached,\n type ModelPointerType,\n setModelPointer,\n} from '#core/utils/config'\nimport { getModelManager, reloadModelManager } from '#core/utils/model'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\nimport TextInput from '#ui-ink/components/TextInput'\nimport { Select } from '#ui-ink/components/CustomSelect/select'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { KEYPRESS_PRIORITY } from '#ui-ink/constants/keypressPriority'\nimport { ModelListManager } from './ModelListManager'\n\ntype Props = {\n onClose: () => void\n}\n\ntype MenuItem =\n | {\n type: 'pointer'\n pointer: ModelPointerType\n label: string\n description: string\n }\n | {\n type: 'action'\n id: 'manage-models'\n label: string\n description: string\n }\n\nconst POINTER_ITEMS: Array<MenuItem & { type: 'pointer' }> = [\n {\n type: 'pointer',\n pointer: 'main',\n label: 'Main',\n description: 'Primary model for general tasks and conversations',\n },\n {\n type: 'pointer',\n pointer: 'task',\n label: 'Task',\n description: 'Model for TaskTool sub-agents and automation',\n },\n {\n type: 'pointer',\n pointer: 'compact',\n label: 'Compact',\n description:\n 'Model used for context compression when nearing the context window',\n },\n {\n type: 'pointer',\n pointer: 'quick',\n label: 'Quick',\n description: 'Fast model for small operations and utilities',\n },\n]\n\nfunction clampIndex(value: number, length: number): number {\n if (length <= 0) return 0\n return Math.max(0, Math.min(value, length - 1))\n}\n\nfunction formatModelLabel(model: {\n name: string\n modelName: string\n provider: string\n}): string {\n const provider = model.provider ? ` \u00B7 ${model.provider}` : ''\n return `${model.name}${provider}`\n}\n\nexport function ModelConfig({ onClose }: Props): React.ReactNode {\n const theme = getTheme()\n const config = getGlobalConfigCached()\n const modelManager = getModelManager()\n const { rows, columns } = useTerminalSize()\n const tightLayout = rows <= 18 || columns <= 72\n const compactLayout = tightLayout || rows <= 22\n const paddingY = tightLayout ? 0 : 1\n const gap = tightLayout ? 0 : 1\n const paddingX = tightLayout || compactLayout ? 1 : 2\n\n const [refreshKey, setRefreshKey] = useState(0)\n const [selectedIndex, setSelectedIndex] = useState(0)\n const [showModelListManager, setShowModelListManager] = useState(false)\n const [activePointer, setActivePointer] = useState<ModelPointerType | null>(\n null,\n )\n const [searchQuery, setSearchQuery] = useState('')\n const [searchCursorOffset, setSearchCursorOffset] = useState(0)\n const didCloseRef = useRef(false)\n\n const safeOnClose = useCallback(() => {\n if (didCloseRef.current) return\n didCloseRef.current = true\n onClose()\n }, [onClose])\n\n const models = useMemo(() => {\n const all = modelManager.getAvailableModels()\n return [...all].sort((a, b) => (b.lastUsed ?? 0) - (a.lastUsed ?? 0))\n }, [modelManager, refreshKey])\n\n const menuItems: MenuItem[] = useMemo(\n () => [\n ...POINTER_ITEMS,\n {\n type: 'action',\n id: 'manage-models',\n label: 'Model Library',\n description: 'View, add, and delete model profiles',\n },\n ],\n [],\n )\n\n React.useEffect(() => {\n setSelectedIndex(prev => clampIndex(prev, menuItems.length))\n }, [menuItems.length])\n\n const closePointerPicker = useCallback(() => {\n setActivePointer(null)\n setSearchQuery('')\n setSearchCursorOffset(0)\n }, [])\n\n const setPointer = useCallback(\n (pointer: ModelPointerType, modelName: string) => {\n modelManager.setPointer(pointer, modelName)\n reloadModelManager()\n setRefreshKey(prev => prev + 1)\n },\n [modelManager],\n )\n\n const clearPointer = useCallback((pointer: ModelPointerType) => {\n setModelPointer(pointer, '')\n reloadModelManager()\n setRefreshKey(prev => prev + 1)\n }, [])\n\n useKeypress(\n (input, key) => {\n if (didCloseRef.current) return true\n\n if (showModelListManager) {\n if (key.escape) {\n setShowModelListManager(false)\n setRefreshKey(prev => prev + 1)\n return true\n }\n return\n }\n\n const inputChar = input.length === 1 ? input : ''\n const isUp = key.upArrow || inputChar === 'k'\n const isDown = key.downArrow || inputChar === 'j'\n const isHome = key.home\n const isEnd = key.end\n const isConfirm = key.return\n\n if (activePointer) {\n if (key.escape) {\n closePointerPicker()\n return true\n }\n if (inputChar === 'c') {\n clearPointer(activePointer)\n closePointerPicker()\n return true\n }\n return\n }\n\n if (key.escape) {\n safeOnClose()\n return true\n }\n\n if (isHome) {\n setSelectedIndex(0)\n return true\n }\n if (isEnd) {\n setSelectedIndex(menuItems.length - 1)\n return true\n }\n if (isUp) {\n setSelectedIndex(prev => clampIndex(prev - 1, menuItems.length))\n return true\n }\n if (isDown) {\n setSelectedIndex(prev => clampIndex(prev + 1, menuItems.length))\n return true\n }\n\n if (inputChar === 'c') {\n const item = menuItems[selectedIndex]\n if (item?.type === 'pointer') {\n clearPointer(item.pointer)\n return true\n }\n }\n\n if (isConfirm) {\n const item = menuItems[selectedIndex]\n if (!item) return true\n\n if (item.type === 'pointer') {\n if (models.length === 0) {\n setShowModelListManager(true)\n return true\n }\n setActivePointer(item.pointer)\n setSearchQuery('')\n setSearchCursorOffset(0)\n return true\n }\n\n if (item.type === 'action' && item.id === 'manage-models') {\n setShowModelListManager(true)\n return true\n }\n }\n },\n { isActive: true, priority: KEYPRESS_PRIORITY.FULLSCREEN_OVERLAY },\n )\n\n if (showModelListManager) {\n return (\n <ModelListManager\n onClose={() => {\n setShowModelListManager(false)\n setRefreshKey(prev => prev + 1)\n }}\n />\n )\n }\n\n if (activePointer) {\n const currentValue = config.modelPointers?.[activePointer] || ''\n const query = searchQuery.trim().toLowerCase()\n const filtered = query\n ? models.filter(m => {\n const haystack =\n `${m.name} ${m.modelName} ${m.provider}`.toLowerCase()\n return haystack.includes(query)\n })\n : models\n\n const options = filtered.map(m => ({\n label: formatModelLabel(m),\n value: m.modelName,\n }))\n\n const reservedLines =\n (tightLayout ? 10 : compactLayout ? 12 : 14) + paddingY * 2 + gap * 4\n const availableForList = Math.max(3, rows - reservedLines - 2)\n const visibleOptionCount = Math.max(\n 3,\n Math.min(12, options.length || 12, availableForList),\n )\n\n return (\n <ScreenFrame\n title={`Set ${activePointer} model`}\n paddingX={paddingX}\n paddingY={paddingY}\n gap={gap}\n >\n <Box flexDirection=\"column\" gap={gap}>\n {!tightLayout && (\n <Text dimColor>\n Search and select the model profile to assign to this pointer.\n </Text>\n )}\n\n <Box flexDirection=\"column\">\n <Text dimColor>Filter:</Text>\n <TextInput\n placeholder=\"Type to filter models\u2026\"\n value={searchQuery}\n onChange={value => {\n setSearchQuery(value)\n setSearchCursorOffset(value.length)\n }}\n columns={Math.max(1, Math.min(80, columns - 10))}\n cursorOffset={searchCursorOffset}\n onChangeCursorOffset={setSearchCursorOffset}\n showCursor={true}\n focus={true}\n disableCursorMovementForUpDownKeys={true}\n />\n </Box>\n\n {options.length > 0 ? (\n <Select\n options={options}\n defaultValue={currentValue || undefined}\n highlightText={query || undefined}\n visibleOptionCount={visibleOptionCount}\n onChange={value => {\n setPointer(activePointer, value)\n closePointerPicker()\n }}\n />\n ) : (\n <Text color={theme.warning}>\n No models match your filter. Try a different query.\n </Text>\n )}\n\n <Box marginTop={tightLayout ? 0 : 1}>\n <Text dimColor wrap=\"truncate-end\">\n \u2191/\u2193 navigate \u00B7 Enter select \u00B7 Esc back \u00B7 c clear pointer\n </Text>\n </Box>\n </Box>\n </ScreenFrame>\n )\n }\n\n const selectedItem = menuItems[selectedIndex]\n\n return (\n <ScreenFrame\n title=\"Models\"\n paddingX={paddingX}\n paddingY={paddingY}\n gap={gap}\n >\n <Box flexDirection=\"column\" gap={gap}>\n <Text dimColor>\n Configure model pointers (main/task/compact/quick) and manage\n profiles.\n </Text>\n\n <Box flexDirection=\"column\">\n {menuItems.map((item, index) => {\n const isSelected = index === selectedIndex\n const pointerValue =\n item.type === 'pointer'\n ? config.modelPointers?.[item.pointer]\n : ''\n const profile =\n item.type === 'pointer' && pointerValue\n ? models.find(m => m.modelName === pointerValue)\n : null\n const valueText =\n item.type === 'pointer'\n ? profile\n ? `${profile.name} (${profile.provider})`\n : pointerValue\n ? pointerValue\n : '(not set)'\n : ''\n\n return (\n <Box key={item.type === 'action' ? item.id : item.pointer}>\n <Text color={isSelected ? theme.kode : theme.secondaryText}>\n {isSelected ? figures.pointer : ' '}\n </Text>\n <Text\n color={isSelected ? theme.text : theme.secondaryText}\n bold={isSelected}\n wrap=\"truncate-end\"\n >\n {' '}\n {item.label}\n {item.type === 'pointer' ? `: ${valueText}` : ''}\n </Text>\n </Box>\n )\n })}\n </Box>\n\n {!tightLayout && selectedItem ? (\n <Box paddingLeft={2}>\n <Text dimColor wrap=\"truncate-end\">\n {selectedItem.description}\n </Text>\n </Box>\n ) : null}\n\n <Box marginTop={tightLayout ? 0 : 1}>\n <Text dimColor wrap=\"truncate-end\">\n \u2191/\u2193 or j/k \u00B7 Enter open \u00B7 c clear pointer \u00B7 Esc exit\n </Text>\n </Box>\n </Box>\n </ScreenFrame>\n )\n}\n", "import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport figures from 'figures'\nimport { getTheme } from '#core/utils/theme'\nimport { getGlobalConfigCached, ModelPointerType } from '#core/utils/config'\nimport { getModelManager } from '#core/utils/model'\nimport { useExitOnCtrlCD } from '#ui-ink/hooks/useExitOnCtrlCD'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\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 { KEYPRESS_PRIORITY } from '#ui-ink/constants/keypressPriority'\nimport { ModelSelector } from './ModelSelector'\n\ntype Props = {\n onClose: () => void\n}\n\nexport function ModelListManager({ onClose }: Props): React.ReactNode {\n const config = getGlobalConfigCached()\n const theme = getTheme()\n const layout = useScreenLayout()\n const [selectedIndex, setSelectedIndex] = useState(0)\n const [showModelSelector, setShowModelSelector] = useState(false)\n const [deleteConfirmId, setDeleteConfirmId] = useState<string | null>(null)\n const [refreshKey, setRefreshKey] = useState(0)\n const [status, setStatus] = useState<string | null>(null)\n const exitState = useExitOnCtrlCD(onClose)\n\n const modelManager = getModelManager()\n const availableModels = modelManager.getAvailableModels()\n\n // Create menu items: existing models + \"Add New Model\"\n const menuItems = useMemo(() => {\n const modelItems = availableModels.map(model => ({\n id: model.modelName,\n name: model.name,\n provider: model.provider,\n usedBy: getModelUsage(model.modelName),\n type: 'model' as const,\n }))\n\n return [\n {\n id: 'add-new',\n name: '+ Add New Model',\n provider: '',\n usedBy: [],\n type: 'action' as const,\n },\n ...modelItems,\n ]\n }, [availableModels, config.modelPointers, refreshKey])\n\n useEffect(() => {\n setSelectedIndex(prev => {\n if (menuItems.length === 0) return 0\n return Math.max(0, Math.min(prev, menuItems.length - 1))\n })\n }, [menuItems.length])\n\n // Check which pointers are using this model\n function getModelUsage(modelName: string): ModelPointerType[] {\n const usage: ModelPointerType[] = []\n const pointers: ModelPointerType[] = ['main', 'task', 'compact', 'quick']\n\n pointers.forEach(pointer => {\n if (config.modelPointers?.[pointer] === modelName) {\n usage.push(pointer)\n }\n })\n\n return usage\n }\n\n const handleDeleteModel = (modelName: string) => {\n // Remove the model\n modelManager.removeModel(modelName)\n\n // The removeModel function should already clear the pointers,\n // but let's ensure UI refreshes\n setRefreshKey(prev => prev + 1)\n setDeleteConfirmId(null)\n }\n\n const handleAddNewModel = () => {\n setShowModelSelector(true)\n }\n\n const handleModelConfigurationComplete = () => {\n setShowModelSelector(false)\n setRefreshKey(prev => prev + 1)\n }\n\n const reservedLines =\n (layout.tightLayout ? 9 : layout.compactLayout ? 11 : 13) +\n layout.paddingY * 2 +\n layout.gap * 4\n const maxVisible = Math.max(\n 3,\n layout.rows - reservedLines - 1, // keep a spare row\n )\n\n const window = useMemo(\n () =>\n getWindowedList({\n itemCount: menuItems.length,\n focusIndex: selectedIndex,\n maxVisible,\n indicatorRows: 2,\n }),\n [maxVisible, menuItems.length, selectedIndex],\n )\n\n const visibleItems = useMemo(\n () => menuItems.slice(window.start, window.end),\n [menuItems, window.end, window.start],\n )\n\n // Handle keyboard input\n const handleInput = useCallback(\n (input: string, key: any) => {\n const inputChar = input.length === 1 ? input : ''\n\n if (key.escape) {\n if (deleteConfirmId) {\n setDeleteConfirmId(null)\n setStatus('Cancelled delete')\n return true\n }\n onClose()\n return true\n }\n\n const isUp = key.upArrow || inputChar === 'k'\n const isDown = key.downArrow || inputChar === 'j'\n\n if (isUp) {\n setSelectedIndex(prev => Math.max(0, prev - 1))\n setDeleteConfirmId(null)\n return true\n }\n\n if (isDown) {\n setSelectedIndex(prev => Math.min(menuItems.length - 1, prev + 1))\n setDeleteConfirmId(null)\n return true\n }\n\n if (key.pageUp) {\n setSelectedIndex(prev => Math.max(0, prev - window.visibleCount))\n setDeleteConfirmId(null)\n return true\n }\n\n if (key.pageDown) {\n setSelectedIndex(prev =>\n Math.min(menuItems.length - 1, prev + window.visibleCount),\n )\n setDeleteConfirmId(null)\n return true\n }\n\n if (key.home || inputChar === 'g') {\n setSelectedIndex(0)\n setDeleteConfirmId(null)\n return true\n }\n\n if (key.end || inputChar === 'G') {\n setSelectedIndex(Math.max(0, menuItems.length - 1))\n setDeleteConfirmId(null)\n return true\n }\n\n if (inputChar === 'd') {\n const item = menuItems[selectedIndex]\n if (!item || item.type !== 'model') {\n setStatus('Select a model to delete')\n return true\n }\n\n if (availableModels.length <= 1) {\n setStatus('Cannot delete the last model')\n return true\n }\n\n if (config.modelPointers?.main === item.id) {\n setStatus('Cannot delete the active main model')\n return true\n }\n\n setDeleteConfirmId(item.id)\n setStatus(\n `Delete \"${item.name}\"? Press Enter to confirm, Esc to cancel`,\n )\n return true\n }\n\n if (key.return || inputChar === ' ') {\n const item = menuItems[selectedIndex]\n if (!item) return true\n\n if (\n deleteConfirmId &&\n item.type === 'model' &&\n item.id === deleteConfirmId\n ) {\n handleDeleteModel(item.id)\n setStatus('Deleted model')\n return true\n }\n\n if (item.type === 'action') {\n handleAddNewModel()\n return true\n }\n\n // No-op for model items (selection shows details below).\n return true\n }\n },\n [\n availableModels.length,\n config.modelPointers?.main,\n deleteConfirmId,\n handleDeleteModel,\n menuItems,\n onClose,\n selectedIndex,\n window.visibleCount,\n ],\n )\n\n useKeypress(handleInput, {\n isActive: !showModelSelector,\n priority: KEYPRESS_PRIORITY.FULLSCREEN_OVERLAY,\n })\n\n // If showing ModelSelector, render it directly\n if (showModelSelector) {\n return (\n <ModelSelector\n onDone={handleModelConfigurationComplete}\n onCancel={handleModelConfigurationComplete}\n skipModelType={true}\n isOnboarding={false}\n abortController={new AbortController()}\n />\n )\n }\n\n const selectedItem = menuItems[selectedIndex]\n const selectedModel =\n selectedItem?.type === 'model'\n ? (availableModels.find(m => m.modelName === selectedItem.id) ?? null)\n : null\n\n const details = (() => {\n if (!selectedItem) return null\n if (selectedItem.type === 'action') {\n return (\n <Text dimColor wrap=\"truncate-end\">\n Add a new model profile (provider + credentials + model name).\n </Text>\n )\n }\n\n const usedBy =\n selectedModel && selectedItem.usedBy.length > 0\n ? `Pointers: ${selectedItem.usedBy.join(', ')}`\n : 'Pointers: (not assigned)'\n\n return (\n <Box flexDirection=\"column\">\n <Text dimColor wrap=\"truncate-end\">\n Provider: {selectedItem.provider || '(unknown)'} \u00B7 {usedBy}\n </Text>\n <Text dimColor wrap=\"truncate-end\">\n Model ID: {selectedItem.id}\n </Text>\n </Box>\n )\n })()\n\n const topIndicator = window.showUpIndicator ? `${figures.arrowUp} More` : ' '\n const bottomIndicator = window.showDownIndicator\n ? `${figures.arrowDown} More`\n : ' '\n\n const statusLine =\n status ??\n (deleteConfirmId ? 'Delete pending\u2026' : `Models: ${availableModels.length}`)\n\n return (\n <ScreenFrame\n title=\"Model Library\"\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 Add, remove, and inspect model profiles. Use /model to set pointers\n (main/task/compact/quick).\n </Text>\n\n <Text\n color={deleteConfirmId ? theme.error : theme.secondaryText}\n wrap=\"truncate-end\"\n >\n {statusLine}\n </Text>\n\n <Box flexDirection=\"column\" width=\"100%\">\n <Text dimColor wrap=\"truncate-end\">\n {topIndicator}\n </Text>\n {visibleItems.map((item, idx) => {\n const absoluteIndex = window.start + idx\n const isSelected = absoluteIndex === selectedIndex\n const isDeleteConfirm =\n deleteConfirmId &&\n item.type === 'model' &&\n item.id === deleteConfirmId\n\n const pointerColor = isDeleteConfirm\n ? theme.error\n : isSelected\n ? theme.kode\n : theme.secondaryText\n\n const labelColor = isDeleteConfirm\n ? theme.error\n : isSelected\n ? theme.text\n : theme.secondaryText\n\n const availability =\n item.type === 'model'\n ? item.usedBy.length > 0\n ? `Active: ${item.usedBy.join(', ')}`\n : 'Available'\n : ''\n\n return (\n <Box key={item.id} flexDirection=\"row\" gap={1}>\n <Text color={pointerColor}>\n {isSelected ? figures.pointer : ' '}\n </Text>\n <Box flexGrow={1}>\n <Text\n color={labelColor}\n bold={isSelected}\n wrap=\"truncate-end\"\n >\n {item.name}\n </Text>\n </Box>\n {item.type === 'model' ? (\n <Box flexDirection=\"row\" gap={1} flexShrink={0}>\n {item.provider ? (\n <Text\n color={theme.secondaryText}\n wrap=\"truncate-end\"\n >{`(${item.provider})`}</Text>\n ) : null}\n <Text\n color={\n item.usedBy.length > 0\n ? theme.success\n : theme.secondaryText\n }\n wrap=\"truncate-end\"\n >\n {availability}\n </Text>\n </Box>\n ) : isSelected ? (\n <Text color={theme.suggestion} wrap=\"truncate-end\">\n Enter to add\n </Text>\n ) : null}\n </Box>\n )\n })}\n <Text dimColor wrap=\"truncate-end\">\n {bottomIndicator}\n </Text>\n </Box>\n\n {details ? <Box paddingLeft={2}>{details}</Box> : null}\n\n <Box marginTop={layout.tightLayout ? 0 : 1}>\n <Text dimColor wrap=\"truncate-end\">\n \u2191/\u2193 or j/k \u00B7 PgUp/PgDn \u00B7 Home/End \u00B7 Enter add \u00B7 d delete \u00B7 Esc close\n </Text>\n </Box>\n </Box>\n </ScreenFrame>\n )\n}\n", "import React from 'react'\nimport type { Command } from '../types'\nimport { ModelStatusDisplay } from '#ui-ink/components/ModelStatusDisplay'\n\nconst modelstatus: Command = {\n name: 'modelstatus',\n description: 'Display current model configuration and status',\n aliases: ['ms', 'model-status'],\n isEnabled: true,\n isHidden: false,\n ui: { displayMode: 'fullscreen' },\n userFacingName() {\n return 'modelstatus'\n },\n type: 'local-jsx',\n call(onDone) {\n return Promise.resolve(<ModelStatusDisplay onClose={onDone} />)\n },\n}\n\nexport default modelstatus\n", "import React, { useMemo, useState } from 'react'\nimport { Box, Text } from 'ink'\nimport figures from 'figures'\nimport { getModelManager } from '#core/utils/model'\nimport { getGlobalConfig } from '#core/utils/config'\nimport { getTheme } from '#core/utils/theme'\nimport { useExitOnCtrlCD } from '#ui-ink/hooks/useExitOnCtrlCD'\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'\nimport { wrapLines } from '#ui-ink/primitives/text/wrapLines'\n\nconst VIEWPORT_SAFE_MARGIN_ROWS = 1\nconst INDICATOR_ROWS = 2\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n\ntype Props = {\n onClose: () => void\n}\n\nfunction formatContextLength(contextLength: number | undefined): string {\n if (!contextLength || !Number.isFinite(contextLength)) return 'unknown'\n return `${Math.round(contextLength / 1000)}k`\n}\n\nfunction safeDateTime(value: number | undefined): string | null {\n if (!value || !Number.isFinite(value)) return null\n try {\n return new Date(value).toLocaleString()\n } catch {\n return null\n }\n}\n\nfunction buildModelStatusLines(): string[] {\n const modelManager = getModelManager()\n const config = getGlobalConfig()\n\n const pointers = ['main', 'task', 'compact', 'quick'] as const\n\n const lines: string[] = []\n\n lines.push('Pointers')\n for (const pointer of pointers) {\n let line = `- ${pointer}: `\n try {\n const model = modelManager.getModel(pointer)\n if (model) {\n const provider = model.provider ? ` (${model.provider})` : ''\n const ctx = formatContextLength(model.contextLength)\n const active = model.isActive ? 'active' : 'inactive'\n line += `${model.name}${provider} \u00B7 ${model.modelName} \u00B7 ctx ${ctx} \u00B7 ${active}`\n } else {\n line += '(not configured)'\n }\n } catch (error) {\n line += `error: ${String(error)}`\n }\n lines.push(line)\n }\n\n lines.push('')\n lines.push('Model library')\n\n const available = modelManager.getAvailableModels() ?? []\n const sorted = [...available].sort(\n (a, b) => (b.lastUsed ?? 0) - (a.lastUsed ?? 0),\n )\n\n if (sorted.length === 0) {\n lines.push('- (none)')\n } else {\n for (const m of sorted) {\n const provider = m.provider ? ` (${m.provider})` : ''\n const ctx = formatContextLength(m.contextLength)\n const lastUsed = safeDateTime(m.lastUsed)\n const lastUsedSuffix = lastUsed ? ` \u00B7 last used ${lastUsed}` : ''\n lines.push(\n `- ${m.name}${provider} \u00B7 ${m.modelName} \u00B7 ctx ${ctx}${lastUsedSuffix}`,\n )\n }\n }\n\n lines.push('')\n lines.push('Config')\n lines.push(`- modelProfiles: ${config.modelProfiles?.length ?? 0}`)\n\n const legacyDefaultModelId = (config as unknown as Record<string, unknown>)\n .defaultModelId\n const legacyValue =\n typeof legacyDefaultModelId === 'string' && legacyDefaultModelId.length > 0\n ? legacyDefaultModelId\n : null\n lines.push(`- defaultModelId (legacy): ${legacyValue ?? '(not set)'}`)\n\n const pointerEntries = Object.entries(config.modelPointers ?? {})\n if (pointerEntries.length === 0) {\n lines.push('- modelPointers: (none)')\n } else {\n lines.push('- modelPointers:')\n for (const [pointer, modelId] of pointerEntries) {\n lines.push(` - ${pointer}: ${modelId || '(not set)'}`)\n }\n }\n\n return lines\n}\n\nexport function ModelStatusDisplay({ onClose }: Props): React.ReactNode {\n const theme = getTheme()\n const layout = useScreenLayout()\n const exitState = useExitOnCtrlCD(onClose)\n\n const [scrollTop, setScrollTop] = useState(0)\n\n const rawLines = useMemo(() => buildModelStatusLines(), [])\n const wrapped = useMemo(() => {\n const width = Math.max(1, layout.columns - layout.paddingX * 2)\n return wrapLines(rawLines, width)\n }, [layout.columns, layout.paddingX, rawLines])\n\n const frameHeaderRows = 1 + (exitState.pending ? 1 : 0)\n const frameRows = frameHeaderRows + 1 + layout.gap * 2 + layout.paddingY * 2\n const innerReservedRows =\n 1 + // shortcut line\n INDICATOR_ROWS\n\n const contentRows = Math.max(\n 1,\n layout.rows - frameRows - innerReservedRows - VIEWPORT_SAFE_MARGIN_ROWS,\n )\n\n const maxScrollTop = Math.max(0, wrapped.length - contentRows)\n\n useKeypress(\n (input, key) => {\n const inputChar = input.length === 1 ? input : ''\n\n if (key.escape) {\n onClose()\n return true\n }\n\n if (key.upArrow || inputChar === 'k') {\n setScrollTop(prev => clamp(prev - 1, 0, maxScrollTop))\n return true\n }\n\n if (key.downArrow || inputChar === 'j') {\n setScrollTop(prev => clamp(prev + 1, 0, maxScrollTop))\n return true\n }\n\n if (key.pageUp) {\n setScrollTop(prev => clamp(prev - contentRows, 0, maxScrollTop))\n return true\n }\n\n if (key.pageDown) {\n setScrollTop(prev => clamp(prev + contentRows, 0, maxScrollTop))\n return true\n }\n\n if (key.home || inputChar === 'g') {\n setScrollTop(0)\n return true\n }\n\n if (key.end || inputChar === 'G') {\n setScrollTop(maxScrollTop)\n return true\n }\n },\n { priority: KEYPRESS_PRIORITY.FULLSCREEN_OVERLAY },\n )\n\n const clampedScrollTop = clamp(scrollTop, 0, maxScrollTop)\n const hiddenAbove = clampedScrollTop\n const hiddenBelow = Math.max(\n 0,\n wrapped.length - (clampedScrollTop + contentRows),\n )\n\n const visible = useMemo(() => {\n return wrapped.slice(clampedScrollTop, clampedScrollTop + contentRows)\n }, [clampedScrollTop, contentRows, wrapped])\n\n const topIndicator = hiddenAbove\n ? `${figures.arrowUp} ${hiddenAbove} more`\n : ' '\n const bottomIndicator = hiddenBelow\n ? `${figures.arrowDown} ${hiddenBelow} more`\n : ' '\n\n return (\n <ScreenFrame\n title=\"Model Status\"\n exitState={exitState}\n paddingX={layout.paddingX}\n paddingY={layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\">\n <Text dimColor wrap=\"truncate-end\">\n Scroll: \u2191\u2193 j/k PgUp/PgDn Home/End \u00B7 Esc close\n </Text>\n <Text dimColor wrap=\"truncate-end\">\n {topIndicator}\n </Text>\n {visible.length > 0 ? (\n visible.map((line, idx) => (\n <Text\n key={`${clampedScrollTop}:${idx}`}\n color={line.startsWith('- main:') ? theme.text : undefined}\n wrap=\"truncate-end\"\n >\n {line}\n </Text>\n ))\n ) : (\n <Text dimColor>(empty)</Text>\n )}\n <Text dimColor wrap=\"truncate-end\">\n {bottomIndicator}\n </Text>\n </Box>\n </ScreenFrame>\n )\n}\n", "import * as React from 'react'\nimport type { Command } from '../types'\nimport { OnboardingScreen } from '#ui-ink/screens/setup/OnboardingScreen'\nimport { clearTerminal } from '#cli-utils/terminal'\n\nexport default {\n type: 'local-jsx',\n name: 'onboarding',\n description: 'Run through the onboarding flow',\n isEnabled: true,\n isHidden: false,\n ui: { displayMode: 'fullscreen' },\n async call(onDone, context) {\n await clearTerminal()\n\n return (\n <OnboardingScreen\n onDone={result => {\n const status =\n result?.skipped === true\n ? 'Onboarding skipped.'\n : 'Onboarding complete.'\n onDone(\n `${status} Recommended next step: run /capabilities to audit and auto-fix optional features.`,\n )\n }}\n />\n )\n },\n userFacingName() {\n return 'onboarding'\n },\n} satisfies Command\n", "import type { Command } from '../types'\nimport * as React from 'react'\nimport { OpenFileScreen } from '#ui-ink/screens/overlays/OpenFileScreen'\n\nconst open = {\n type: 'local-jsx',\n name: 'open',\n description: 'Browse project files and open in $EDITOR',\n isEnabled: true,\n isHidden: false,\n ui: { displayMode: 'fullscreen' },\n async call(onDone) {\n return <OpenFileScreen onDone={onDone} />\n },\n userFacingName() {\n return 'open'\n },\n} satisfies Command\n\nexport default open\n", "import { spawn } from 'child_process'\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { Box, Text } from 'ink'\nimport { resolve as resolvePath } from 'path'\nimport { getTheme } from '#core/utils/theme'\nimport { ensureRipgrepReady } from '#core/utils/ripgrep'\nimport { getCwd } from '#core/utils/state'\nimport TextInput from '#ui-ink/components/TextInput'\nimport { Select } from '#ui-ink/components/CustomSelect/select'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { KEYPRESS_PRIORITY } from '#ui-ink/constants/keypressPriority'\nimport { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\nimport { launchExternalEditorForFilePath } from '#cli-utils/externalEditor'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\n\nconst VIEWPORT_SAFE_MARGIN_ROWS = 1\nconst MAX_INDEXED_FILES = 20_000\nconst MAX_MATCH_RESULTS = 2_000\nconst FILE_INDEX_CACHE_LIMIT = 5\n\ntype FileIndexSource = 'git' | 'rg'\n\ntype FileIndexResult = {\n files: string[]\n truncated: boolean\n source: FileIndexSource\n}\n\nasync function indexProjectFiles(args: {\n cwd: string\n limit: number\n signal: AbortSignal\n}): Promise<FileIndexResult> {\n const attempt = async (\n source: FileIndexSource,\n command: string,\n commandArgs: string[],\n ): Promise<FileIndexResult> => {\n return await new Promise<FileIndexResult>((resolve, reject) => {\n const files: string[] = []\n let buffer = ''\n let stderr = ''\n let settled = false\n let truncated = false\n\n const child = spawn(command, commandArgs, {\n cwd: args.cwd,\n stdio: ['ignore', 'pipe', 'pipe'],\n windowsHide: true,\n })\n\n const cleanup = () => {\n args.signal.removeEventListener('abort', onAbort)\n child.stdout?.removeListener('data', onStdout)\n child.stderr?.removeListener('data', onStderr)\n child.removeListener('error', onError)\n child.removeListener('exit', onExit)\n }\n\n const finish = (result: FileIndexResult) => {\n if (settled) return\n settled = true\n cleanup()\n resolve(result)\n }\n\n const fail = (error: Error) => {\n if (settled) return\n settled = true\n cleanup()\n reject(error)\n }\n\n const onAbort = () => {\n try {\n child.kill()\n } catch {\n // best-effort\n }\n finish({ files, truncated, source })\n }\n\n const onError = (error: Error) => {\n fail(error)\n }\n\n const onExit = (code: number | null) => {\n if (code && code !== 0) {\n const message =\n stderr.trim().split('\\n')[0] || `${command} exited ${code}`\n fail(new Error(message))\n return\n }\n finish({ files, truncated, source })\n }\n\n const onStderr = (chunk: Buffer | string) => {\n if (stderr.length > 8_000) return\n stderr += chunk.toString()\n }\n\n const onStdout = (chunk: Buffer | string) => {\n buffer += chunk.toString()\n\n while (true) {\n const newlineIndex = buffer.indexOf('\\n')\n if (newlineIndex === -1) break\n\n const rawLine = buffer.slice(0, newlineIndex)\n buffer = buffer.slice(newlineIndex + 1)\n\n const line = rawLine.replace(/\\r$/, '').trim()\n if (!line) continue\n\n files.push(line)\n if (files.length >= args.limit) {\n truncated = true\n try {\n child.kill()\n } catch {\n // best-effort\n }\n finish({ files, truncated, source })\n return\n }\n }\n }\n\n args.signal.addEventListener('abort', onAbort)\n child.on('error', onError)\n child.on('exit', onExit)\n child.stdout?.on('data', onStdout)\n child.stderr?.on('data', onStderr)\n })\n }\n\n try {\n return await attempt('git', 'git', [\n 'ls-files',\n '-co',\n '--exclude-standard',\n ])\n } catch {\n // Fallback below.\n }\n\n const rg = await ensureRipgrepReady()\n return await attempt('rg', rg, ['--files'])\n}\n\ntype CachedIndex = { result: FileIndexResult; cachedAt: number }\nconst fileIndexCache = new Map<string, CachedIndex>()\n\nfunction readCachedIndex(cwd: string): FileIndexResult | null {\n const entry = fileIndexCache.get(cwd)\n return entry ? entry.result : null\n}\n\nfunction writeCachedIndex(cwd: string, result: FileIndexResult): void {\n fileIndexCache.set(cwd, { result, cachedAt: Date.now() })\n if (fileIndexCache.size <= FILE_INDEX_CACHE_LIMIT) return\n\n let oldestKey: string | null = null\n let oldestAt = Infinity\n for (const [key, value] of fileIndexCache.entries()) {\n if (value.cachedAt < oldestAt) {\n oldestAt = value.cachedAt\n oldestKey = key\n }\n }\n if (oldestKey) fileIndexCache.delete(oldestKey)\n}\n\nfunction normalizeQuery(value: string): string {\n return value.trim()\n}\n\nexport function OpenFileScreen({\n onDone,\n}: {\n onDone: (result?: string) => void\n}): React.ReactNode {\n const theme = getTheme()\n const { columns } = useTerminalSize()\n const layout = useScreenLayout()\n const cwd = getCwd()\n\n const [query, setQuery] = useState('')\n const [queryCursorOffset, setQueryCursorOffset] = useState(0)\n\n const [indexResult, setIndexResult] = useState<FileIndexResult>({\n files: [],\n truncated: false,\n source: 'git',\n })\n const [indexStatus, setIndexStatus] = useState<\n | { state: 'idle' }\n | { state: 'loading' }\n | { state: 'error'; message: string }\n >({ state: 'loading' })\n\n const [isOpening, setIsOpening] = useState(false)\n const [statusMessage, setStatusMessage] = useState<string | null>(null)\n\n const abortRef = useRef<AbortController | null>(null)\n\n const startIndexing = useCallback(\n (force = false) => {\n if (!force) {\n const cached = readCachedIndex(cwd)\n if (cached) {\n setIndexResult(cached)\n setIndexStatus({ state: 'idle' })\n return\n }\n }\n\n abortRef.current?.abort()\n const controller = new AbortController()\n abortRef.current = controller\n\n setIndexStatus({ state: 'loading' })\n setStatusMessage(null)\n\n void (async () => {\n try {\n const res = await indexProjectFiles({\n cwd,\n limit: MAX_INDEXED_FILES,\n signal: controller.signal,\n })\n if (controller.signal.aborted) return\n writeCachedIndex(cwd, res)\n setIndexResult(res)\n setIndexStatus({ state: 'idle' })\n } catch (error) {\n if (controller.signal.aborted) return\n setIndexStatus({\n state: 'error',\n message: error instanceof Error ? error.message : String(error),\n })\n }\n })()\n },\n [cwd],\n )\n\n useEffect(() => {\n startIndexing(false)\n return () => abortRef.current?.abort()\n }, [startIndexing])\n\n const normalizedQuery = useMemo(() => normalizeQuery(query), [query])\n const indexedLower = useMemo(\n () => indexResult.files.map(file => file.toLowerCase()),\n [indexResult.files],\n )\n const matches = useMemo(() => {\n const files = indexResult.files\n if (!normalizedQuery) return files\n\n const q = normalizedQuery.toLowerCase()\n const out: string[] = []\n for (let i = 0; i < files.length; i++) {\n if (indexedLower[i]?.includes(q)) out.push(files[i]!)\n }\n return out\n }, [indexResult.files, indexedLower, normalizedQuery])\n\n const limitedMatches = useMemo(() => {\n return matches.slice(0, MAX_MATCH_RESULTS)\n }, [matches])\n const hiddenMatchCount = Math.max(0, matches.length - limitedMatches.length)\n\n const options = useMemo(\n () => limitedMatches.map(file => ({ label: file, value: file })),\n [limitedMatches],\n )\n\n const reservedLines =\n (layout.tightLayout ? 10 : layout.compactLayout ? 12 : 14) +\n layout.paddingY * 2 +\n layout.gap * 4\n const availableForList = Math.max(\n 3,\n layout.rows - reservedLines - VIEWPORT_SAFE_MARGIN_ROWS,\n )\n const visibleOptionCount = Math.max(\n 3,\n Math.min(12, options.length || 12, availableForList),\n )\n\n const exitState = { pending: false, keyName: null } as const\n\n useKeypress(\n (input, key) => {\n if (key.escape || (key.ctrl && input === 'c')) {\n onDone()\n return true\n }\n\n if (key.ctrl && input === 'r') {\n startIndexing(true)\n return true\n }\n },\n { priority: KEYPRESS_PRIORITY.FULLSCREEN_OVERLAY },\n )\n\n const textInputColumns = Math.max(10, Math.min(80, columns - 10))\n\n const handleOpenFile = useCallback(\n async (relativePath: string) => {\n if (isOpening) return\n\n setIsOpening(true)\n setStatusMessage(`Opening ${relativePath}\u2026`)\n\n const result = await launchExternalEditorForFilePath(\n resolvePath(cwd, relativePath),\n )\n\n if (result.ok === true) {\n onDone(`Opened ${relativePath} in ${result.editorLabel}`)\n return\n } else {\n if ('error' in result) {\n setStatusMessage(`Failed to open: ${result.error.message}`)\n } else {\n setStatusMessage('Failed to open file')\n }\n setIsOpening(false)\n }\n },\n [cwd, isOpening, onDone],\n )\n\n const indexLine = (() => {\n if (indexStatus.state === 'loading') return 'Indexing files\u2026'\n if (indexStatus.state === 'error')\n return `Indexing failed: ${indexStatus.message}`\n\n const indexed = indexResult.files.length\n const source =\n indexResult.source === 'git'\n ? 'git ls-files'\n : indexResult.source === 'rg'\n ? 'rg --files'\n : 'index'\n const indexedSuffix = indexResult.truncated\n ? ` (showing first ${indexed})`\n : ''\n if (!normalizedQuery) {\n return `Indexed ${indexed}${indexedSuffix} via ${source}. Type to filter (Ctrl+R refresh).`\n }\n\n const matchSuffix =\n hiddenMatchCount > 0 ? ` (+${hiddenMatchCount} more, refine query)` : ''\n return `Matches ${limitedMatches.length}${matchSuffix} / ${indexed}${indexedSuffix}`\n })()\n\n return (\n <ScreenFrame\n title=\"Open File\"\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 {cwd}\n </Text>\n\n <Box flexDirection=\"row\" gap={1}>\n <Text dimColor>Search:</Text>\n <TextInput\n value={query}\n onChange={value => {\n setQuery(value)\n }}\n placeholder=\"Type to filter files\u2026\"\n columns={textInputColumns}\n cursorOffset={queryCursorOffset}\n onChangeCursorOffset={setQueryCursorOffset}\n showCursor={!isOpening}\n focus={!isOpening}\n maxHeight={1}\n disableCursorMovementForUpDownKeys={true}\n />\n </Box>\n\n <Text\n color={\n indexStatus.state === 'error' ? theme.error : theme.secondaryText\n }\n wrap=\"truncate-end\"\n >\n {statusMessage ?? indexLine}\n </Text>\n\n {options.length > 0 && visibleOptionCount > 0 ? (\n <Select\n options={options}\n highlightText={normalizedQuery || undefined}\n visibleOptionCount={visibleOptionCount}\n isDisabled={isOpening || indexStatus.state !== 'idle'}\n onChange={value => void handleOpenFile(value)}\n />\n ) : (\n <Box>\n <Text dimColor>\n {indexStatus.state === 'loading'\n ? 'Loading\u2026'\n : normalizedQuery\n ? 'No matches.'\n : 'No files found.'}\n </Text>\n </Box>\n )}\n\n <Box marginTop={layout.tightLayout ? 0 : 1}>\n <Text dimColor wrap=\"truncate-end\">\n \u2191/\u2193 navigate \u00B7 Enter open \u00B7 Ctrl+R refresh \u00B7 Esc close\n </Text>\n </Box>\n </Box>\n </ScreenFrame>\n )\n}\n", "import type { Command } from '../types'\nimport { getMessagesGetter } from '#core/messages'\nimport type { Message } from '#core/query'\nimport { copyTextToClipboard } from '#cli-utils/clipboard'\nimport {\n buildTranscriptLines,\n extractTextFromMessageContent,\n} from '#cli-utils/transcriptText'\n\nfunction getLastMessageText(\n messages: Message[],\n role: 'assistant' | 'user',\n): string | null {\n for (let i = messages.length - 1; i >= 0; i -= 1) {\n const msg = messages[i]\n if (!msg || msg.type !== role) continue\n const text = extractTextFromMessageContent(msg.message?.content)\n if (text.trim()) return text\n }\n return null\n}\n\nfunction buildTranscriptText(messages: Message[]): string {\n return buildTranscriptLines(messages, { includeTools: false }).join('\\n')\n}\n\nfunction buildTranscriptTextVerbose(messages: Message[]): string {\n return buildTranscriptLines(messages, { includeTools: true }).join('\\n')\n}\n\nconst copy = {\n type: 'local',\n name: 'copy',\n description: 'Copy assistant/user/transcript text to your clipboard',\n argumentHint: '[assistant|user|transcript [verbose]]',\n isEnabled: true,\n isHidden: false,\n async call(args: string) {\n const messages = getMessagesGetter()()\n const tokens = (args ?? '')\n .trim()\n .split(/\\s+/)\n .map(t => t.trim())\n .filter(Boolean)\n const mode = (tokens[0] ?? '').toLowerCase()\n const flags = new Set(tokens.slice(1).map(t => t.toLowerCase()))\n const verbose = flags.has('verbose') || flags.has('--verbose') || false\n\n const text =\n mode === '' || mode === 'last' || mode === 'assistant'\n ? getLastMessageText(messages, 'assistant')\n : mode === 'user' || mode === 'last-user'\n ? getLastMessageText(messages, 'user')\n : mode === 'transcript' || mode === 'history' || mode === 'all'\n ? verbose\n ? buildTranscriptTextVerbose(messages)\n : buildTranscriptText(messages)\n : null\n\n if (!text) {\n if (\n mode === '' ||\n mode === 'last' ||\n mode === 'assistant' ||\n mode === 'user' ||\n mode === 'last-user'\n ) {\n return `No ${mode === 'user' || mode === 'last-user' ? 'user' : 'assistant'} output to copy yet.`\n }\n return 'Usage: /copy [assistant|user|transcript [verbose]]'\n }\n\n try {\n const result = await copyTextToClipboard(text)\n if (result.method === 'osc52' && result.truncated) {\n return 'Copied to clipboard (OSC 52, truncated).'\n }\n return 'Copied to clipboard.'\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n return `Failed to copy to clipboard: ${message}`\n }\n },\n userFacingName() {\n return 'copy'\n },\n} satisfies Command\n\nexport default copy\n", "import * as React from 'react'\nimport type { Command } from '../types'\n\nimport { SessionSelector } from '#ui-ink/components/SessionSelector'\nimport { getOriginalCwd } from '#core/utils/state'\nimport {\n importLegacySession,\n listImportableLegacySessions,\n} from '#protocol/utils/kodeAgentSessionImport'\nimport { resolveResumeSessionIdentifier } from '#protocol/utils/kodeAgentSessionResume'\n\nexport default {\n type: 'local-jsx',\n name: 'import',\n description: 'Import legacy sessions into Kode',\n isEnabled: true,\n isHidden: false,\n ui: { displayMode: 'fullscreen' },\n argumentHint: '[session-id|slug|title|all]',\n userFacingName() {\n return 'import'\n },\n async call(onDone, _context, args) {\n const cwd = getOriginalCwd()\n\n const importable = listImportableLegacySessions({ cwd })\n if (importable.length === 0) {\n onDone('No legacy sessions found to import for this directory.')\n return null\n }\n\n const rawArgs = (args ?? '').trim()\n if (rawArgs) {\n if (rawArgs === 'all' || rawArgs === '--all') {\n let imported = 0\n let failed = 0\n for (const s of importable) {\n const result = importLegacySession({ cwd, sessionId: s.sessionId })\n if (result.kind === 'imported') imported++\n else failed++\n }\n\n if (failed > 0) {\n onDone(\n `Imported ${imported} session(s). ${failed} session(s) failed to import.`,\n )\n } else {\n onDone(`Imported ${imported} session(s).`)\n }\n return null\n }\n\n const resolved = resolveResumeSessionIdentifier({\n cwd,\n identifier: rawArgs,\n })\n\n if (resolved.kind === 'ok') {\n const result = importLegacySession({\n cwd,\n sessionId: resolved.sessionId,\n })\n\n if (result.kind === 'imported') {\n onDone(`Imported session ${result.sessionId}.`)\n return null\n }\n if (result.kind === 'already_present') {\n onDone(`Session ${result.sessionId} is already present in Kode.`)\n return null\n }\n if (result.kind === 'not_found') {\n onDone(`Session ${resolved.sessionId} was not found in legacy roots.`)\n return null\n }\n\n onDone(`Import failed: ${result.message}`)\n return null\n }\n\n if (resolved.kind === 'different_directory') {\n onDone(\n resolved.otherCwd\n ? `That session belongs to a different directory: ${resolved.otherCwd}`\n : `That session belongs to a different directory.`,\n )\n return null\n }\n\n if (resolved.kind === 'ambiguous') {\n onDone(\n `Multiple sessions match \"${rawArgs}\": ${resolved.matchingSessionIds.join(\n ', ',\n )}`,\n )\n return null\n }\n\n onDone(`No session found with ID or name: ${rawArgs}`)\n return null\n }\n\n return (\n <SessionSelector\n sessions={importable}\n title=\"Import conversation\"\n introText=\"Select a session to import into Kode.\"\n enterLabel=\"import\"\n onClose={() => onDone()}\n escLabel=\"close\"\n onSelect={index => {\n const selected = importable[index]\n if (!selected) return\n\n const result = importLegacySession({\n cwd,\n sessionId: selected.sessionId,\n })\n\n if (result.kind === 'imported') {\n onDone(`Imported session ${result.sessionId}.`)\n return\n }\n if (result.kind === 'already_present') {\n onDone(`Session ${result.sessionId} is already present in Kode.`)\n return\n }\n if (result.kind === 'not_found') {\n onDone(\n `Session ${selected.sessionId} was not found in legacy roots.`,\n )\n return\n }\n onDone(`Import failed: ${result.message}`)\n }}\n />\n )\n },\n} satisfies Command\n", "import React from 'react'\nimport { Box, Text } from 'ink'\nimport { getTheme } from '#core/utils/theme'\nimport { useTerminalSize } from '#ui-ink/hooks/useTerminalSize'\nimport { formatDate, logError } from '#core/utils/log'\nimport type { KodeAgentSessionListItem } from '#protocol/utils/kodeAgentSessionResume'\nimport figures from 'figures'\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 { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { useExitOnCtrlCD } from '#ui-ink/hooks/useExitOnCtrlCD'\n\ntype SessionSelectorProps = {\n sessions: KodeAgentSessionListItem[]\n onSelect: (index: number) => void | Promise<void>\n onClose?: () => void\n escLabel?: string\n title?: string\n introText?: string\n enterLabel?: string\n}\n\nexport function SessionSelector({\n sessions,\n onSelect,\n onClose,\n escLabel = 'quit',\n title = 'Resume conversation',\n introText = 'Select a session to resume.',\n enterLabel = 'resume',\n}: SessionSelectorProps): React.ReactNode {\n const theme = getTheme()\n const layout = useScreenLayout()\n const { rows } = useTerminalSize()\n if (sessions.length === 0) return null\n\n const close = onClose ?? (() => process.exit(0))\n const exitState = useExitOnCtrlCD(() => process.exit(0))\n\n const [selectedIndex, setSelectedIndex] = React.useState(0)\n const didSubmitRef = React.useRef(false)\n const mountedRef = React.useRef(true)\n const [submitError, setSubmitError] = React.useState<string | null>(null)\n\n React.useEffect(() => {\n mountedRef.current = true\n return () => {\n mountedRef.current = false\n }\n }, [])\n\n React.useEffect(() => {\n setSelectedIndex(prev => {\n if (sessions.length <= 0) return 0\n return Math.max(0, Math.min(sessions.length - 1, prev))\n })\n }, [sessions.length])\n\n const reservedLines =\n (layout.tightLayout ? 7 : layout.compactLayout ? 9 : 11) +\n layout.paddingY * 2 +\n layout.gap * 3\n const maxVisible = Math.max(3, rows - reservedLines - 1)\n const window = React.useMemo(\n () =>\n getWindowedList({\n itemCount: sessions.length,\n focusIndex: selectedIndex,\n maxVisible,\n indicatorRows: 2,\n }),\n [maxVisible, selectedIndex, sessions.length],\n )\n\n const visibleSessions = React.useMemo(\n () => sessions.slice(window.start, window.end),\n [sessions, window.end, window.start],\n )\n\n useKeypress((input, key) => {\n if (didSubmitRef.current) return true\n\n const inputChar = input.length === 1 ? input : ''\n\n if (key.escape) {\n didSubmitRef.current = true\n close()\n return true\n }\n\n if (key.return) {\n didSubmitRef.current = true\n setSubmitError(null)\n void Promise.resolve(onSelect(selectedIndex)).catch(error => {\n logError(error)\n if (!mountedRef.current) return\n didSubmitRef.current = false\n setSubmitError(error instanceof Error ? error.message : String(error))\n })\n return true\n }\n\n if (exitState.pending) return true\n\n if (key.upArrow || inputChar === 'k') {\n setSelectedIndex(prev => Math.max(0, prev - 1))\n return true\n }\n\n if (key.downArrow || inputChar === 'j') {\n setSelectedIndex(prev => Math.min(sessions.length - 1, prev + 1))\n return true\n }\n\n if (key.pageUp) {\n setSelectedIndex(prev => Math.max(0, prev - window.visibleCount))\n return true\n }\n if (key.pageDown) {\n setSelectedIndex(prev =>\n Math.min(sessions.length - 1, prev + window.visibleCount),\n )\n return true\n }\n\n if (key.home || inputChar === 'g') {\n setSelectedIndex(0)\n return true\n }\n if (key.end || inputChar === 'G') {\n setSelectedIndex(Math.max(0, sessions.length - 1))\n return true\n }\n })\n\n const topIndicator = window.showUpIndicator ? `${figures.arrowUp} More` : ' '\n const bottomIndicator = window.showDownIndicator\n ? `${figures.arrowDown} More`\n : ' '\n\n const selectedSession = sessions[selectedIndex] ?? null\n const selectedTitle = selectedSession\n ? (selectedSession.customTitle ??\n selectedSession.slug ??\n selectedSession.sessionId)\n : null\n const selectedSummary = selectedSession?.summary\n ? selectedSession.summary.split('\\n')[0]\n : null\n\n return (\n <ScreenFrame\n title={title}\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 {introText}\n </Text>\n\n <Box flexDirection=\"column\" width=\"100%\">\n <Text dimColor wrap=\"truncate-end\">\n {topIndicator}\n </Text>\n {visibleSessions.map((session, idx) => {\n const absoluteIndex = window.start + idx\n const isSelected = absoluteIndex === selectedIndex\n\n const modifiedAt =\n session.modifiedAt ?? session.createdAt ?? new Date(0)\n const modifiedLabel = formatDate(modifiedAt)\n const tag = session.tag ? `#${session.tag}` : ''\n const name =\n session.customTitle ?? session.slug ?? session.sessionId\n\n return (\n <Box key={absoluteIndex} flexDirection=\"row\" gap={1}>\n <Text color={isSelected ? theme.kode : theme.secondaryText}>\n {isSelected ? figures.pointer : ' '}\n </Text>\n <Text dimColor wrap=\"truncate-end\">\n {modifiedLabel}\n </Text>\n {tag ? (\n <Text color={theme.secondaryText} wrap=\"truncate-end\">\n {tag}\n </Text>\n ) : null}\n <Text\n bold={isSelected}\n color={isSelected ? theme.text : theme.secondaryText}\n wrap=\"truncate-end\"\n >\n {name}\n </Text>\n </Box>\n )\n })}\n <Text dimColor wrap=\"truncate-end\">\n {bottomIndicator}\n </Text>\n </Box>\n\n {selectedTitle ? (\n <Box paddingLeft={2} flexDirection=\"column\">\n <Text dimColor wrap=\"truncate-end\">\n {selectedSummary ?? ''}\n </Text>\n </Box>\n ) : null}\n\n {submitError ? (\n <Text color={theme.error} wrap=\"truncate-end\">\n {submitError}\n </Text>\n ) : null}\n\n <Text dimColor wrap=\"truncate-end\">\n \u2191/\u2193 or j/k \u00B7 PgUp/PgDn \u00B7 Home/End \u00B7 Enter {enterLabel} \u00B7 Esc{' '}\n {escLabel}\n </Text>\n </Box>\n </ScreenFrame>\n )\n}\n", "import { copyFileSync, cpSync, existsSync, mkdirSync, statSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\n\nimport type { KodeAgentSessionListItem } from './kodeAgentSessionResume'\nimport { listKodeAgentSessions } from './kodeAgentSessionResume'\nimport {\n getSessionLogFilePath,\n getSessionStoreRoots,\n sanitizeProjectNameForSessionStore,\n} from './kodeAgentSessionLog'\n\nexport type ImportableSession = KodeAgentSessionListItem & {\n sourcePath: string\n destinationPath: string\n}\n\nexport type ImportLegacySessionResult =\n | {\n kind: 'imported'\n sessionId: string\n sourcePath: string\n destinationPath: string\n }\n | { kind: 'already_present'; sessionId: string; destinationPath: string }\n | { kind: 'not_found'; sessionId: string }\n | { kind: 'failed'; sessionId: string; message: string }\n\nfunction resolveLegacySessionLogPath(args: {\n cwd: string\n sessionId: string\n}): string | null {\n const projectName = sanitizeProjectNameForSessionStore(args.cwd)\n const roots = getSessionStoreRoots().slice(1)\n for (const root of roots) {\n const candidate = join(\n root,\n 'projects',\n projectName,\n `${args.sessionId}.jsonl`,\n )\n if (existsSync(candidate)) return candidate\n }\n return null\n}\n\nfunction copyDirIfMissing(sourceDir: string, destinationDir: string): void {\n if (existsSync(destinationDir)) return\n cpSync(sourceDir, destinationDir, { recursive: true })\n}\n\nexport function listImportableLegacySessions(args: {\n cwd: string\n}): ImportableSession[] {\n const sessions = listKodeAgentSessions({ cwd: args.cwd })\n\n const importable: ImportableSession[] = []\n for (const session of sessions) {\n const destinationPath = getSessionLogFilePath({\n cwd: args.cwd,\n sessionId: session.sessionId,\n })\n if (existsSync(destinationPath)) continue\n\n const sourcePath = resolveLegacySessionLogPath({\n cwd: args.cwd,\n sessionId: session.sessionId,\n })\n if (!sourcePath) continue\n\n importable.push({ ...session, sourcePath, destinationPath })\n }\n\n return importable\n}\n\nexport function importLegacySession(args: {\n cwd: string\n sessionId: string\n}): ImportLegacySessionResult {\n const destinationPath = getSessionLogFilePath({\n cwd: args.cwd,\n sessionId: args.sessionId,\n })\n\n if (existsSync(destinationPath)) {\n return {\n kind: 'already_present',\n sessionId: args.sessionId,\n destinationPath,\n }\n }\n\n const sourcePath = resolveLegacySessionLogPath({\n cwd: args.cwd,\n sessionId: args.sessionId,\n })\n if (!sourcePath) return { kind: 'not_found', sessionId: args.sessionId }\n\n try {\n mkdirSync(dirname(destinationPath), { recursive: true })\n copyFileSync(sourcePath, destinationPath)\n\n const sourceSessionDir = join(dirname(sourcePath), args.sessionId)\n if (\n existsSync(sourceSessionDir) &&\n statSync(sourceSessionDir).isDirectory()\n ) {\n const destinationSessionDir = join(\n dirname(destinationPath),\n args.sessionId,\n )\n copyDirIfMissing(sourceSessionDir, destinationSessionDir)\n }\n\n return {\n kind: 'imported',\n sessionId: args.sessionId,\n sourcePath,\n destinationPath,\n }\n } catch (error) {\n return {\n kind: 'failed',\n sessionId: args.sessionId,\n message: error instanceof Error ? error.message : String(error),\n }\n }\n}\n", "import type { Command } from '../types'\n\nimport { existsSync, writeFileSync } from 'node:fs'\nimport { Box, Text } from 'ink'\nimport React from 'react'\n\nimport { setPermissionMode } from '#core/utils/permissionModeState'\nimport { applyToolPermissionContextUpdateForConversationKey } from '#core/utils/toolPermissionContextState'\nimport { enterPlanMode, getPlanConversationKey } from '#core/utils/planMode'\nimport { launchExternalEditorForFilePath } from '#cli-utils/externalEditor'\n\nconst plan = {\n type: 'local-jsx',\n name: 'plan',\n description: 'Enable plan mode or view the current session plan',\n argumentHint: '[open]',\n isEnabled: true,\n isHidden: false,\n async call(onDone, context, args = '') {\n const safeMode = Boolean(context?.options?.safeMode ?? context?.safeMode)\n const conversationKey = getPlanConversationKey(context)\n\n const updatedToolPermissionContext =\n applyToolPermissionContextUpdateForConversationKey({\n conversationKey,\n isBypassPermissionsModeAvailable: !safeMode,\n update: { type: 'setMode', mode: 'plan', destination: 'session' },\n })\n\n context.options ??= {}\n context.options.toolPermissionContext = updatedToolPermissionContext\n setPermissionMode(context, 'plan')\n\n const { planFilePath } = enterPlanMode(context)\n\n const arg = String(args ?? '')\n .trim()\n .toLowerCase()\n if (arg === 'open') {\n if (!existsSync(planFilePath)) {\n writeFileSync(planFilePath, '# Plan\\n\\n', 'utf8')\n }\n\n const result = await launchExternalEditorForFilePath(planFilePath)\n if (result.ok === false) {\n onDone(\n `Plan mode enabled. Could not open plan file in editor: ${result.error.message}`,\n )\n return null\n }\n\n onDone(`Plan mode enabled. Opened plan file in ${result.editorLabel}.`)\n return null\n }\n\n return (\n <Box flexDirection=\"column\">\n <Text>Plan mode enabled.</Text>\n <Text dimColor>Plan file: {planFilePath}</Text>\n <Text dimColor>Tip: run /plan open to edit it in $EDITOR.</Text>\n </Box>\n )\n },\n userFacingName() {\n return 'plan'\n },\n} satisfies Command\n\nexport default plan\n", "import type { Command } from '../types'\nimport * as React from 'react'\nimport { TranscriptScreen } from '#ui-ink/screens/overlays/TranscriptScreen'\n\nconst transcript = {\n type: 'local-jsx',\n name: 'transcript',\n description: 'View and scroll the current conversation transcript',\n isEnabled: true,\n isHidden: false,\n ui: { displayMode: 'fullscreen' },\n async call(onDone, context) {\n const label = `${context.options?.messageLogName ?? 'conversation'}${\n typeof context.options?.forkNumber === 'number'\n ? `-${context.options.forkNumber}`\n : ''\n }`\n return <TranscriptScreen onDone={onDone} label={label} />\n },\n userFacingName() {\n return 'transcript'\n },\n aliases: ['history'],\n} satisfies Command\n\nexport default transcript\n", "import React, {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport { Box, Text } from 'ink'\nimport { mkdirSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { CACHE_PATHS, DATE } from '#core/logging/log/paths'\nimport { getTheme } from '#core/utils/theme'\nimport type { Message } from '#core/query'\nimport { getMessagesGetter } from '#core/messages'\nimport { launchExternalEditorForFilePath } from '#cli-utils/externalEditor'\nimport { copyTextToClipboard } from '#cli-utils/clipboard'\nimport { buildTranscriptLines } from '#cli-utils/transcriptText'\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'\nimport { wrapLines } from '#ui-ink/primitives/text/wrapLines'\n\nconst VIEWPORT_SAFE_MARGIN_ROWS = 1\nconst INDICATOR_ROWS = 2\nconst REFRESH_INTERVAL_MS = 250\nconst MAX_TOOL_BLOCK_CHARS_COLLAPSED = 4000\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n\nfunction getTranscriptPath(label?: string): string {\n const suffix = label ? `-${label.replace(/[^a-zA-Z0-9._-]+/g, '-')}` : ''\n return join(CACHE_PATHS.errors(), `transcript${suffix}-${DATE}.txt`)\n}\n\nexport function TranscriptScreen({\n onDone,\n label,\n initialFollow = false,\n}: {\n onDone: (result?: string) => void\n label?: string\n initialFollow?: boolean\n}): React.ReactNode {\n const theme = getTheme()\n const layout = useScreenLayout()\n const exitState = { pending: false, keyName: null } as const\n\n const [follow, setFollow] = useState(initialFollow)\n const [scrollTop, setScrollTop] = useState(0)\n const [status, setStatus] = useState<string | null>(null)\n const [savedPath, setSavedPath] = useState<string | null>(null)\n const [verbose, setVerbose] = useState(false)\n\n const lastMessagesRef = useRef<Message[] | null>(null)\n const [messagesSnapshot, setMessagesSnapshot] = useState<Message[]>(() =>\n getMessagesGetter()(),\n )\n\n const refreshSnapshot = useCallback(() => {\n const next = getMessagesGetter()()\n if (lastMessagesRef.current === next) return\n lastMessagesRef.current = next\n setMessagesSnapshot(next)\n }, [])\n\n useEffect(() => {\n if (!follow) return\n refreshSnapshot()\n const interval = setInterval(() => refreshSnapshot(), REFRESH_INTERVAL_MS)\n return () => clearInterval(interval)\n }, [follow, refreshSnapshot])\n\n const rawLines = useMemo(\n () =>\n buildTranscriptLines(messagesSnapshot, {\n includeTools: true,\n collapseToolBlocks: !verbose,\n maxCollapsedChars: MAX_TOOL_BLOCK_CHARS_COLLAPSED,\n }),\n [messagesSnapshot, verbose],\n )\n const wrappedLines = useMemo(() => {\n const width = Math.max(1, layout.columns - layout.paddingX * 2)\n return wrapLines(rawLines, width)\n }, [layout.columns, layout.paddingX, rawLines])\n\n const frameHeaderRows = 1\n const frameRows = frameHeaderRows + 1 + layout.gap * 2 + layout.paddingY * 2\n const innerReservedRows =\n 1 + // saved path\n 1 + // shortcut line\n 1 + // status line\n INDICATOR_ROWS +\n 1 // tip line\n\n const contentRows = Math.max(\n 1,\n layout.rows - frameRows - innerReservedRows - VIEWPORT_SAFE_MARGIN_ROWS,\n )\n const maxScrollTop = Math.max(0, wrappedLines.length - contentRows)\n\n const didInitScrollRef = useRef(false)\n useLayoutEffect(() => {\n if (didInitScrollRef.current) return\n didInitScrollRef.current = true\n setScrollTop(maxScrollTop)\n }, [maxScrollTop])\n\n useEffect(() => {\n setScrollTop(prev => {\n if (follow) return maxScrollTop\n return clamp(prev, 0, maxScrollTop)\n })\n }, [contentRows, follow, maxScrollTop])\n\n const save = useCallback(() => {\n try {\n const path = getTranscriptPath(label)\n mkdirSync(CACHE_PATHS.errors(), { recursive: true })\n writeFileSync(path, rawLines.join('\\n') + '\\n', 'utf8')\n setSavedPath(path)\n setStatus(`Saved to ${path}`)\n return path\n } catch {\n setStatus('Failed to save transcript')\n return null\n }\n }, [label, rawLines])\n\n const openSaved = useCallback(async () => {\n const path = savedPath ?? save()\n if (!path) return\n const result = await launchExternalEditorForFilePath(path)\n if (result.ok === true) {\n setStatus(`Opened in ${result.editorLabel}`)\n } else {\n setStatus(result.error.message || 'Failed to open file')\n }\n }, [save, savedPath])\n\n const copyTranscript = useCallback(async () => {\n try {\n const result = await copyTextToClipboard(rawLines.join('\\n') + '\\n')\n if (result.method === 'osc52' && result.truncated) {\n setStatus('Copied transcript (OSC 52, truncated)')\n } else {\n setStatus('Copied transcript to clipboard')\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n setStatus(`Copy failed: ${message}`)\n }\n }, [rawLines])\n\n useKeypress(\n (input, key) => {\n if (key.escape || (key.ctrl && input === 'c')) {\n onDone()\n return true\n }\n\n if (key.ctrl && input === 'o') {\n onDone()\n return true\n }\n\n if (key.ctrl && input === 'e') {\n setVerbose(prev => {\n const next = !prev\n setStatus(`Verbose: ${next ? 'ON' : 'OFF'}`)\n return next\n })\n return true\n }\n\n if (key.upArrow) {\n setFollow(false)\n setScrollTop(prev => clamp(prev - 1, 0, maxScrollTop))\n return true\n }\n\n if (key.downArrow) {\n setScrollTop(prev => {\n const next = clamp(prev + 1, 0, maxScrollTop)\n if (next >= maxScrollTop) setFollow(true)\n return next\n })\n return true\n }\n\n if (key.pageUp) {\n setFollow(false)\n setScrollTop(prev => clamp(prev - contentRows, 0, maxScrollTop))\n return true\n }\n\n if (key.pageDown) {\n setScrollTop(prev => {\n const next = clamp(prev + contentRows, 0, maxScrollTop)\n if (next >= maxScrollTop) setFollow(true)\n return next\n })\n return true\n }\n\n if (key.home || input === 'g') {\n setFollow(false)\n setScrollTop(0)\n return true\n }\n\n if (key.end || input === 'G') {\n setFollow(true)\n setScrollTop(maxScrollTop)\n return true\n }\n\n if (input === 'r') {\n refreshSnapshot()\n setStatus('Refreshed')\n return true\n }\n\n if (input === 'f') {\n setFollow(prev => {\n const next = !prev\n setStatus(`Follow: ${next ? 'ON' : 'OFF'}`)\n return next\n })\n return true\n }\n\n if (input === 's') {\n save()\n return true\n }\n\n if (input === 'o') {\n void openSaved()\n return true\n }\n\n if (input === 'y') {\n void copyTranscript()\n return true\n }\n },\n { priority: KEYPRESS_PRIORITY.FULLSCREEN_OVERLAY },\n )\n\n const hiddenAbove = scrollTop\n const hiddenBelow = Math.max(\n 0,\n wrappedLines.length - (scrollTop + contentRows),\n )\n const visibleLines = useMemo(() => {\n return wrappedLines.slice(scrollTop, scrollTop + contentRows)\n }, [contentRows, scrollTop, wrappedLines])\n\n const topIndicator = hiddenAbove ? `... ${hiddenAbove} lines hidden ...` : ''\n const bottomIndicator = hiddenBelow\n ? `... ${hiddenBelow} lines hidden ...`\n : ''\n\n const statusLine =\n status ??\n (wrappedLines.length > 0\n ? `Showing ${Math.min(contentRows, wrappedLines.length)} of ${wrappedLines.length} lines`\n : 'Empty transcript')\n\n const logPath = getTranscriptPath(label)\n\n return (\n <ScreenFrame\n title=\"Transcript\"\n exitState={exitState}\n paddingX={layout.paddingX}\n paddingY={layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\">\n <Text dimColor wrap=\"truncate-end\">\n Saved path: {logPath}\n </Text>\n\n <Text dimColor wrap=\"truncate-end\">\n {follow ? 'Follow: ON' : 'Follow: OFF'} \u00B7 Scroll: \u2191\u2193 j/k PgUp/PgDn\n Home/End \u00B7 f follow \u00B7 r refresh \u00B7 y copy \u00B7 s save \u00B7 o open \u00B7 ctrl+o\n close \u00B7 ctrl+e show all \u00B7 Esc close\n </Text>\n\n <Text color={theme.secondaryText} wrap=\"truncate-end\">\n {statusLine}\n </Text>\n\n <Text dimColor wrap=\"truncate-end\">\n {topIndicator}\n </Text>\n {visibleLines.length > 0 ? (\n visibleLines.map((line, idx) => (\n <Text\n key={`${scrollTop}:${idx}`}\n color={\n line.startsWith('user:')\n ? theme.secondaryText\n : line.startsWith('assistant:')\n ? theme.text\n : line.includes('[tool_result') ||\n line.includes('[tool_use')\n ? theme.warning\n : theme.text\n }\n wrap=\"truncate-end\"\n >\n {line}\n </Text>\n ))\n ) : (\n <Text dimColor>(empty)</Text>\n )}\n <Text dimColor wrap=\"truncate-end\">\n {bottomIndicator}\n </Text>\n\n <Text dimColor wrap=\"truncate-end\">\n {savedPath\n ? `Saved: ${savedPath}`\n : `Tip: use 's' to save and 'o' to open`}\n </Text>\n </Box>\n </ScreenFrame>\n )\n}\n", "import type { Command } from '../types'\nimport * as React from 'react'\nimport { ConsoleScreen } from '#ui-ink/screens/overlays/ConsoleScreen'\n\nconst consoleCommand = {\n type: 'local-jsx',\n name: 'console',\n description: 'View captured stdout/stderr writes during TUI rendering',\n isEnabled: true,\n isHidden: false,\n ui: { displayMode: 'fullscreen' },\n async call(onDone) {\n return <ConsoleScreen onDone={onDone} />\n },\n userFacingName() {\n return 'console'\n },\n} satisfies Command\n\nexport default consoleCommand\n", "import React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport { Box, Text } from 'ink'\nimport { getTheme } from '#core/utils/theme'\nimport {\n clearCapturedTuiStdio,\n flushCapturedTuiStdioToFile,\n getCapturedTuiStdioLogPath,\n getCapturedTuiStdioText,\n} from '#cli-utils/stdio'\nimport { launchExternalEditorForFilePath } from '#cli-utils/externalEditor'\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\nconst VIEWPORT_SAFE_MARGIN_ROWS = 1\nconst INDICATOR_ROWS = 2\n\nfunction escapeControlCharactersForDisplay(text: string): string {\n let out = ''\n for (const char of text) {\n const code = char.codePointAt(0)\n if (code === undefined) continue\n if (char === '\\n') {\n out += '\\n'\n continue\n }\n if (char === '\\t') {\n out += '\\t'\n continue\n }\n if (char === '\\r') {\n out += '\\\\r'\n continue\n }\n if (code === 0x1b) {\n out += '\\\\x1b'\n continue\n }\n if (code < 0x20 || code === 0x7f) {\n out += `\\\\x${code.toString(16).padStart(2, '0')}`\n continue\n }\n out += char\n }\n return out\n}\n\nfunction loadCapturedLines(): string[] {\n const captured = getCapturedTuiStdioText()\n if (!captured) return []\n const safe = escapeControlCharactersForDisplay(captured)\n return safe.split('\\n')\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n\nexport function ConsoleScreen({\n onDone,\n}: {\n onDone: (result?: 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 [lines, setLines] = useState<string[]>(() => loadCapturedLines())\n const [follow, setFollow] = useState(true)\n const [scrollTop, setScrollTop] = useState(0)\n const [status, setStatus] = useState<string | null>(null)\n const [savedPath, setSavedPath] = useState<string | null>(null)\n\n const frameHeaderRows = 1\n const frameRows = frameHeaderRows + 1 + layout.gap * 2 + layout.paddingY * 2\n const innerReservedRows =\n 1 + // description\n 1 + // shortcut line\n 1 + // status line\n INDICATOR_ROWS +\n 1 // tip line\n\n const contentRows = Math.max(\n 1,\n layout.rows - frameRows - innerReservedRows - VIEWPORT_SAFE_MARGIN_ROWS,\n )\n\n const maxScrollTop = Math.max(0, lines.length - contentRows)\n\n useEffect(() => {\n setScrollTop(prev => {\n if (follow) return maxScrollTop\n return clamp(prev, 0, maxScrollTop)\n })\n }, [contentRows, follow, maxScrollTop])\n\n const refresh = useCallback(() => {\n setLines(loadCapturedLines())\n setStatus('Refreshed')\n }, [])\n\n const clear = useCallback(() => {\n clearCapturedTuiStdio()\n setLines([])\n setSavedPath(null)\n setScrollTop(0)\n setFollow(true)\n setStatus('Cleared captured output')\n }, [])\n\n const save = useCallback(() => {\n const path = flushCapturedTuiStdioToFile()\n if (!path) {\n setStatus('No captured output to save')\n return null\n }\n setSavedPath(path)\n setStatus(`Saved to ${path}`)\n return path\n }, [])\n\n const openSaved = useCallback(async () => {\n const path = savedPath ?? save()\n if (!path) return\n const result = await launchExternalEditorForFilePath(path)\n if (result.ok === true) {\n setStatus(`Opened in ${result.editorLabel}`)\n } else {\n setStatus(result.error.message || 'Failed to open file')\n }\n }, [save, savedPath])\n\n useKeypress(\n (input, key) => {\n if (key.escape || (key.ctrl && input === 'c')) {\n onDone()\n return true\n }\n\n if (key.upArrow) {\n setFollow(false)\n setScrollTop(prev => clamp(prev - 1, 0, maxScrollTop))\n return true\n }\n\n if (key.downArrow) {\n setScrollTop(prev => {\n const next = clamp(prev + 1, 0, maxScrollTop)\n if (next >= maxScrollTop) setFollow(true)\n return next\n })\n return true\n }\n\n if (key.pageUp) {\n setFollow(false)\n setScrollTop(prev => clamp(prev - contentRows, 0, maxScrollTop))\n return true\n }\n\n if (key.pageDown) {\n setScrollTop(prev => {\n const next = clamp(prev + contentRows, 0, maxScrollTop)\n if (next >= maxScrollTop) setFollow(true)\n return next\n })\n return true\n }\n\n if (key.home) {\n setFollow(false)\n setScrollTop(0)\n return true\n }\n\n if (key.end) {\n setFollow(true)\n setScrollTop(maxScrollTop)\n return true\n }\n\n if (input === 'r') {\n refresh()\n return true\n }\n\n if (input === 'c') {\n clear()\n return true\n }\n\n if (input === 's') {\n save()\n return true\n }\n\n if (input === 'o') {\n void openSaved()\n return true\n }\n },\n { priority: KEYPRESS_PRIORITY.FULLSCREEN_OVERLAY },\n )\n\n const hiddenAbove = scrollTop\n const hiddenBelow = Math.max(0, lines.length - (scrollTop + contentRows))\n\n const visibleLines = useMemo(() => {\n return lines.slice(scrollTop, scrollTop + contentRows)\n }, [contentRows, lines, scrollTop])\n\n const topIndicator = hiddenAbove ? `... ${hiddenAbove} lines hidden ...` : ''\n const bottomIndicator = hiddenBelow\n ? `... ${hiddenBelow} lines hidden ...`\n : ''\n\n const statusLine =\n status ??\n (lines.length > 0\n ? `Showing ${Math.min(contentRows, lines.length)} of ${lines.length} lines`\n : 'No captured output')\n\n const logPath = getCapturedTuiStdioLogPath()\n\n return (\n <ScreenFrame\n title=\"Console\"\n exitState={exitState}\n paddingX={layout.paddingX}\n paddingY={layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\">\n <Text dimColor wrap=\"truncate-end\">\n Captured TUI stdout/stderr (auto-flush path: {logPath})\n </Text>\n\n <Text dimColor wrap=\"truncate-end\">\n {follow ? 'Follow: ON' : 'Follow: OFF'} \u00B7 Scroll: \u2191\u2193 j/k PgUp/PgDn\n Home/End \u00B7 r refresh \u00B7 s save \u00B7 o open \u00B7 c clear \u00B7 Esc close\n </Text>\n\n <Text color={theme.secondaryText} wrap=\"truncate-end\">\n {statusLine}\n </Text>\n\n <Text dimColor wrap=\"truncate-end\">\n {topIndicator}\n </Text>\n {visibleLines.length > 0 ? (\n visibleLines.map((line, idx) => (\n <Text\n key={`${scrollTop}:${idx}`}\n color={line.startsWith('[stderr]') ? theme.error : theme.text}\n wrap=\"truncate-end\"\n >\n {line}\n </Text>\n ))\n ) : (\n <Text dimColor>(empty)</Text>\n )}\n <Text dimColor wrap=\"truncate-end\">\n {bottomIndicator}\n </Text>\n\n <Text dimColor wrap=\"truncate-end\">\n {savedPath\n ? `Saved: ${savedPath}`\n : `Tip: use 's' to save and 'o' to open`}\n </Text>\n </Box>\n </ScreenFrame>\n )\n}\n", "import type { Command } from '../types'\nimport * as React from 'react'\nimport { NotificationsScreen } from '#ui-ink/screens/overlays/NotificationsScreen'\n\nconst notifications = {\n type: 'local-jsx',\n name: 'notifications',\n description: 'View in-app notification history',\n isEnabled: true,\n isHidden: false,\n ui: { displayMode: 'fullscreen' },\n async call(onDone) {\n return <NotificationsScreen onDone={onDone} />\n },\n userFacingName() {\n return 'notifications'\n },\n aliases: ['notifs'],\n} satisfies Command\n\nexport default notifications\n", "import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { Box, Text } from 'ink'\nimport { mkdirSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { CACHE_PATHS, DATE } from '#core/logging/log/paths'\nimport { getTheme } from '#core/utils/theme'\nimport {\n clearNotifications,\n getNotifications,\n subscribeNotifications,\n type InAppNotification,\n} from '#core/services/notificationCenter'\nimport { launchExternalEditorForFilePath } from '#cli-utils/externalEditor'\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\nconst VIEWPORT_SAFE_MARGIN_ROWS = 1\nconst INDICATOR_ROWS = 2\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n\nfunction getLogPath(): string {\n return join(CACHE_PATHS.errors(), `notifications-${DATE}.log`)\n}\n\nfunction sanitizeSingleLine(text: string): string {\n return text.replace(/\\r?\\n/g, ' ').replace(/\\s+/g, ' ').trim()\n}\n\nfunction formatNotificationLine(n: InAppNotification): string {\n const time = new Date(n.createdAt).toLocaleTimeString()\n const source = n.source ?? 'system'\n const channel = n.channel ? `/${n.channel}` : ''\n const titlePrefix = n.title ? `${sanitizeSingleLine(n.title)}: ` : ''\n const message = sanitizeSingleLine(n.message)\n const kind = n.kind ? ` ${n.kind.toUpperCase()}` : ''\n return `[${time}] [${source}${channel}${kind}] ${titlePrefix}${message}`\n}\n\nfunction flushNotificationsToFile(notifs: InAppNotification[]): string | null {\n if (notifs.length === 0) return null\n try {\n const dir = CACHE_PATHS.errors()\n mkdirSync(dir, { recursive: true })\n const path = getLogPath()\n const content = notifs.map(formatNotificationLine).join('\\n') + '\\n'\n writeFileSync(path, content, 'utf8')\n return path\n } catch {\n return null\n }\n}\n\nexport function NotificationsScreen({\n onDone,\n}: {\n onDone: (result?: string) => void\n}): 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 (result?: string) => {\n if (didDoneRef.current) return\n didDoneRef.current = true\n onDone(result)\n },\n [onDone],\n )\n\n const [notifs, setNotifs] = useState<InAppNotification[]>(() =>\n getNotifications(),\n )\n const [follow, setFollow] = useState(true)\n const [scrollTop, setScrollTop] = useState(0)\n const [status, setStatus] = useState<string | null>(null)\n const [savedPath, setSavedPath] = useState<string | null>(null)\n\n useEffect(() => {\n return subscribeNotifications(() => {\n setNotifs(getNotifications())\n })\n }, [])\n\n const lines = useMemo(() => notifs.map(formatNotificationLine), [notifs])\n\n const frameHeaderRows = 1\n const frameRows = frameHeaderRows + 1 + layout.gap * 2 + layout.paddingY * 2\n const innerReservedRows =\n 1 + // description\n 1 + // shortcut line\n 1 + // status line\n INDICATOR_ROWS +\n 1 // tip line\n\n const contentRows = Math.max(\n 1,\n layout.rows - frameRows - innerReservedRows - VIEWPORT_SAFE_MARGIN_ROWS,\n )\n const maxScrollTop = Math.max(0, lines.length - contentRows)\n\n useEffect(() => {\n setScrollTop(prev => {\n if (follow) return maxScrollTop\n return clamp(prev, 0, maxScrollTop)\n })\n }, [contentRows, follow, maxScrollTop])\n\n const refresh = useCallback(() => {\n setNotifs(getNotifications())\n setStatus('Refreshed')\n }, [])\n\n const clear = useCallback(() => {\n clearNotifications()\n setSavedPath(null)\n setScrollTop(0)\n setFollow(true)\n setStatus('Cleared notifications')\n }, [])\n\n const save = useCallback(() => {\n const path = flushNotificationsToFile(getNotifications())\n if (!path) {\n setStatus('No notifications to save')\n return null\n }\n setSavedPath(path)\n setStatus(`Saved to ${path}`)\n return path\n }, [])\n\n const openSaved = useCallback(async () => {\n const path = savedPath ?? save()\n if (!path) return\n const result = await launchExternalEditorForFilePath(path)\n if (result.ok === true) {\n setStatus(`Opened in ${result.editorLabel}`)\n } else {\n setStatus(result.error.message || 'Failed to open file')\n }\n }, [save, savedPath])\n\n useKeypress(\n (input, key) => {\n if (key.escape || (key.ctrl && input === 'c')) {\n safeOnDone()\n return true\n }\n\n if (key.upArrow) {\n setFollow(false)\n setScrollTop(prev => clamp(prev - 1, 0, maxScrollTop))\n return true\n }\n\n if (key.downArrow) {\n setScrollTop(prev => {\n const next = clamp(prev + 1, 0, maxScrollTop)\n if (next >= maxScrollTop) setFollow(true)\n return next\n })\n return true\n }\n\n if (key.pageUp) {\n setFollow(false)\n setScrollTop(prev => clamp(prev - contentRows, 0, maxScrollTop))\n return true\n }\n\n if (key.pageDown) {\n setScrollTop(prev => {\n const next = clamp(prev + contentRows, 0, maxScrollTop)\n if (next >= maxScrollTop) setFollow(true)\n return next\n })\n return true\n }\n\n if (key.home) {\n setFollow(false)\n setScrollTop(0)\n return true\n }\n\n if (key.end) {\n setFollow(true)\n setScrollTop(maxScrollTop)\n return true\n }\n\n if (input === 'r') {\n refresh()\n return true\n }\n\n if (input === 'c') {\n clear()\n return true\n }\n\n if (input === 's') {\n save()\n return true\n }\n\n if (input === 'o') {\n void openSaved()\n return true\n }\n },\n { priority: KEYPRESS_PRIORITY.FULLSCREEN_OVERLAY },\n )\n\n const hiddenAbove = scrollTop\n const hiddenBelow = Math.max(0, lines.length - (scrollTop + contentRows))\n\n const visibleLines = useMemo(() => {\n return lines.slice(scrollTop, scrollTop + contentRows)\n }, [contentRows, lines, scrollTop])\n\n const topIndicator = hiddenAbove ? `... ${hiddenAbove} hidden ...` : ''\n const bottomIndicator = hiddenBelow ? `... ${hiddenBelow} hidden ...` : ''\n\n const statusLine =\n status ??\n (lines.length > 0\n ? `Showing ${Math.min(contentRows, lines.length)} of ${lines.length}`\n : 'No notifications')\n\n const logPath = getLogPath()\n\n return (\n <ScreenFrame\n title=\"Notifications\"\n exitState={exitState}\n paddingX={layout.paddingX}\n paddingY={layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\">\n <Text dimColor wrap=\"truncate-end\">\n In-app notification history (auto-flush path: {logPath})\n </Text>\n\n <Text dimColor wrap=\"truncate-end\">\n {follow ? 'Follow: ON' : 'Follow: OFF'} \u00B7 Scroll: \u2191\u2193 j/k PgUp/PgDn\n Home/End \u00B7 r refresh \u00B7 s save \u00B7 o open \u00B7 c clear \u00B7 Esc close\n </Text>\n\n <Text color={theme.secondaryText} wrap=\"truncate-end\">\n {statusLine}\n </Text>\n\n <Text dimColor wrap=\"truncate-end\">\n {topIndicator}\n </Text>\n {visibleLines.length > 0 ? (\n visibleLines.map((line, idx) => (\n <Text\n key={`${scrollTop}:${idx}`}\n color={line.includes(' ERROR]') ? theme.error : theme.text}\n wrap=\"truncate-end\"\n >\n {line}\n </Text>\n ))\n ) : (\n <Text dimColor>(empty)</Text>\n )}\n <Text dimColor wrap=\"truncate-end\">\n {bottomIndicator}\n </Text>\n\n <Text dimColor wrap=\"truncate-end\">\n {savedPath\n ? `Saved: ${savedPath}`\n : `Tip: use 's' to save and 'o' to open`}\n </Text>\n </Box>\n </ScreenFrame>\n )\n}\n", "import type { Command } from '../types'\nimport * as React from 'react'\nimport { PluginsScreen } from '#ui-ink/screens/overlays/PluginsScreen'\n\nconst plugins = {\n type: 'local-jsx',\n name: 'plugins',\n description: 'Manage plugins',\n isEnabled: true,\n isHidden: false,\n ui: { displayMode: 'fullscreen' },\n async call(onDone) {\n return <PluginsScreen onDone={onDone} />\n },\n userFacingName() {\n return 'plugins'\n },\n} satisfies Command\n\nexport default plugins\n", "import React, { useCallback, useEffect, useMemo, useRef, 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 { useExitOnCtrlCD } from '#ui-ink/hooks/useExitOnCtrlCD'\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 { SearchBox } from '#ui-ink/components/SearchBox'\n\nimport {\n addMarketplace,\n getMarketplaceManifest,\n listInstalledSkillPlugins,\n listMarketplaces,\n refreshAllMarketplacesAsync,\n refreshMarketplaceAsync,\n removeMarketplace,\n installSkillPlugin,\n enableSkillPlugin,\n disableSkillPlugin,\n uninstallSkillPlugin,\n listEnabledInstalledPluginPackRoots,\n type MarketplaceManifest,\n} from '#cli-services/skillMarketplace'\nimport { reloadCustomCommandsForSession } from '#cli-services/customCommands'\nimport { getSessionPlugins } from '#core/utils/sessionPlugins'\n\ntype TabId = 'discover' | 'installed' | 'marketplaces' | 'errors'\n\nconst TAB_ORDER: readonly TabId[] = [\n 'discover',\n 'installed',\n 'marketplaces',\n 'errors',\n]\n\nconst TAB_LABELS: Record<TabId, string> = {\n discover: 'Discover',\n installed: 'Installed',\n marketplaces: 'Marketplaces',\n errors: 'Errors',\n}\n\ntype MarketplacePlugin = {\n pluginSpec: string\n marketplaceName: string\n entry: MarketplaceManifest['plugins'][number]\n}\n\ntype MarketplaceRow = {\n name: string\n sourceLabel: string\n lastUpdated?: string\n}\n\ntype ScreenError = {\n scope: 'marketplace' | 'install' | 'runtime'\n message: string\n detail?: string\n}\n\ntype View =\n | { type: 'tabs' }\n | { type: 'pluginDetails'; plugin: MarketplacePlugin }\n | { type: 'addMarketplace' }\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n\nfunction normalizeQuery(value: string): string {\n return value.trim().toLowerCase()\n}\n\nfunction stringifyError(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n\nfunction formatMarketplaceSource(source: unknown): string {\n if (!source || typeof source !== 'object') return 'unknown'\n const s = source as any\n if (s.source === 'github' && typeof s.repo === 'string')\n return `GitHub (${s.repo})`\n if (s.source === 'git' && typeof s.url === 'string') return `Git (${s.url})`\n if (s.source === 'url' && typeof s.url === 'string') return `URL (${s.url})`\n if (s.source === 'file' && typeof s.path === 'string')\n return `File (${s.path})`\n if (s.source === 'directory' && typeof s.path === 'string')\n return `Directory (${s.path})`\n if (s.source === 'npm' && typeof s.package === 'string')\n return `NPM (${s.package})`\n return typeof s.source === 'string' ? s.source : 'unknown'\n}\n\nfunction matchesPlugin(plugin: MarketplacePlugin, query: string): boolean {\n if (!query) return true\n const name = String(plugin.entry?.name ?? '').toLowerCase()\n const description = String(plugin.entry?.description ?? '').toLowerCase()\n const marketplace = plugin.marketplaceName.toLowerCase()\n return (\n name.includes(query) ||\n description.includes(query) ||\n marketplace.includes(query)\n )\n}\n\nasync function refreshPluginRuntimeFromInstalls(): Promise<string[]> {\n const installedRoots = listEnabledInstalledPluginPackRoots()\n const existingRoots = getSessionPlugins().map(p => p.rootDir)\n const dirs = Array.from(new Set([...existingRoots, ...installedRoots]))\n if (dirs.length === 0) return []\n\n const { configureSessionPlugins } =\n await import('#cli-services/pluginRuntime')\n const { errors } = await configureSessionPlugins({ pluginDirs: dirs })\n return errors\n}\n\nexport function PluginsScreen({\n onDone,\n}: {\n onDone: (message?: string) => void\n}): React.ReactNode {\n const theme = getTheme()\n const layout = useScreenLayout()\n const exitState = useExitOnCtrlCD(() => onDone())\n\n const [view, setView] = useState<View>({ type: 'tabs' })\n const [activeTab, setActiveTab] = useState<TabId>('discover')\n\n const [isLoading, setIsLoading] = useState(true)\n const [plugins, setPlugins] = useState<MarketplacePlugin[]>([])\n const [marketplaces, setMarketplaces] = useState<MarketplaceRow[]>([])\n const [errors, setErrors] = useState<ScreenError[]>([])\n const [installedPlugins, setInstalledPlugins] = useState(() =>\n listInstalledSkillPlugins(),\n )\n\n const [discoverQuery, setDiscoverQuery] = useState('')\n const [discoverSearchFocused, setDiscoverSearchFocused] = useState(true)\n const [discoverSelectedIndex, setDiscoverSelectedIndex] = useState(0)\n const [selectedPluginSpecs, setSelectedPluginSpecs] = useState<Set<string>>(\n () => new Set(),\n )\n const [installingSpecs, setInstallingSpecs] = useState<Set<string>>(\n () => new Set(),\n )\n const [status, setStatus] = useState<string | null>(null)\n\n const [installedSelectedIndex, setInstalledSelectedIndex] = useState(0)\n const [marketplaceSelectedIndex, setMarketplaceSelectedIndex] = useState(0)\n\n const [addMarketplaceInput, setAddMarketplaceInput] = useState('')\n\n const installedSpecs = useMemo(\n () => new Set(Object.keys(installedPlugins)),\n [installedPlugins],\n )\n\n const refreshInstalled = useCallback(() => {\n setInstalledPlugins(listInstalledSkillPlugins())\n }, [])\n\n const refreshData = useCallback(async () => {\n setIsLoading(true)\n setStatus(null)\n\n const nextErrors: ScreenError[] = []\n\n try {\n refreshInstalled()\n const configured = listMarketplaces()\n const marketplaceNames = Object.keys(configured).sort()\n\n const nextMarketplaces: MarketplaceRow[] = []\n const nextPlugins: MarketplacePlugin[] = []\n\n for (const name of marketplaceNames) {\n const entry = (configured as any)[name]\n nextMarketplaces.push({\n name,\n sourceLabel: formatMarketplaceSource(entry?.source),\n lastUpdated:\n typeof entry?.lastUpdated === 'string'\n ? entry.lastUpdated\n : undefined,\n })\n\n try {\n const { manifest } = getMarketplaceManifest(name)\n for (const pluginEntry of manifest.plugins ?? []) {\n const pluginName = String((pluginEntry as any)?.name ?? '').trim()\n if (!pluginName) continue\n nextPlugins.push({\n pluginSpec: `${pluginName}@${name}`,\n marketplaceName: name,\n entry: pluginEntry,\n })\n }\n } catch (error) {\n nextErrors.push({\n scope: 'marketplace',\n message: `Failed to load marketplace '${name}'`,\n detail: stringifyError(error),\n })\n }\n }\n\n setMarketplaces(nextMarketplaces)\n setPlugins(nextPlugins)\n setErrors(nextErrors)\n } catch (error) {\n nextErrors.push({\n scope: 'marketplace',\n message: 'Failed to load marketplaces',\n detail: stringifyError(error),\n })\n setErrors(nextErrors)\n } finally {\n setIsLoading(false)\n }\n }, [refreshInstalled])\n\n useEffect(() => {\n void refreshData()\n }, [refreshData])\n\n const discoverCandidates = useMemo(() => {\n // Match CC: Discover only shows not-yet-installed plugins.\n return plugins.filter(p => !installedSpecs.has(p.pluginSpec))\n }, [installedSpecs, plugins])\n\n const discoverFiltered = useMemo(() => {\n const q = normalizeQuery(discoverQuery)\n return discoverCandidates.filter(p => matchesPlugin(p, q))\n }, [discoverCandidates, discoverQuery])\n\n const discoverReason = useMemo(() => {\n const marketplaceCount = marketplaces.length\n const hadMarketplaceLoadErrors =\n errors.some(e => e.scope === 'marketplace') && marketplaceCount > 0\n\n if (marketplaceCount === 0) return 'no-marketplaces-configured'\n if (plugins.length === 0 && hadMarketplaceLoadErrors)\n return 'all-marketplaces-failed'\n if (discoverCandidates.length === 0 && plugins.length > 0)\n return 'all-plugins-installed'\n return null\n }, [discoverCandidates.length, errors, marketplaces.length, plugins.length])\n\n useEffect(() => {\n setDiscoverSelectedIndex(prev =>\n clamp(prev, 0, Math.max(0, discoverFiltered.length - 1)),\n )\n }, [discoverFiltered.length])\n\n const installedRows = useMemo(() => {\n const rows = Object.entries(installedPlugins).map(([spec, record]) => {\n return {\n pluginSpec: spec,\n plugin: record,\n }\n })\n rows.sort((a, b) => a.pluginSpec.localeCompare(b.pluginSpec))\n return rows\n }, [installedPlugins])\n\n useEffect(() => {\n setInstalledSelectedIndex(prev =>\n clamp(prev, 0, Math.max(0, installedRows.length - 1)),\n )\n }, [installedRows.length])\n\n useEffect(() => {\n setMarketplaceSelectedIndex(prev =>\n clamp(prev, 0, Math.max(0, marketplaces.length - 1)),\n )\n }, [marketplaces.length])\n\n const installSelected = useCallback(\n async (specsOverride?: string[]) => {\n const specs = specsOverride ?? Array.from(selectedPluginSpecs)\n if (specs.length === 0) return\n\n setStatus(`Installing ${specs.length} plugin(s)\u2026`)\n\n for (const spec of specs) {\n setInstallingSpecs(prev => new Set([...prev, spec]))\n try {\n installSkillPlugin(spec, { scope: 'user' })\n } catch (error) {\n setErrors(prev => [\n ...prev,\n {\n scope: 'install',\n message: `Failed to install ${spec}`,\n detail: stringifyError(error),\n },\n ])\n } finally {\n setInstallingSpecs(prev => {\n const next = new Set(prev)\n next.delete(spec)\n return next\n })\n }\n }\n\n try {\n const runtimeErrors = await refreshPluginRuntimeFromInstalls()\n if (runtimeErrors.length > 0) {\n setErrors(prev => [\n ...prev,\n ...runtimeErrors.map(message => ({\n scope: 'runtime' as const,\n message,\n })),\n ])\n }\n await reloadCustomCommandsForSession()\n } catch (error) {\n setErrors(prev => [\n ...prev,\n {\n scope: 'runtime',\n message: 'Failed to refresh plugin runtime',\n detail: stringifyError(error),\n },\n ])\n }\n\n setSelectedPluginSpecs(new Set())\n setStatus('Install complete')\n void refreshData()\n },\n [refreshData, selectedPluginSpecs],\n )\n\n const toggleSelected = useCallback((spec: string) => {\n setSelectedPluginSpecs(prev => {\n const next = new Set(prev)\n if (next.has(spec)) next.delete(spec)\n else next.add(spec)\n return next\n })\n }, [])\n\n const renderTabs = (): React.ReactNode => {\n const showTabHint = !layout.tightLayout\n return (\n <Box flexDirection=\"row\" gap={1} flexWrap=\"nowrap\">\n {TAB_ORDER.map(tab => {\n const isActive = tab === activeTab\n return (\n <Text\n key={tab}\n inverse={isActive}\n bold={isActive}\n color={isActive ? theme.text : theme.secondaryText}\n wrap=\"truncate-end\"\n >\n {' '}\n {TAB_LABELS[tab]}{' '}\n </Text>\n )\n })}\n {showTabHint ? (\n <Text dimColor wrap=\"truncate-end\">\n (tab to cycle)\n </Text>\n ) : null}\n </Box>\n )\n }\n\n const renderDiscover = (): React.ReactNode => {\n if (discoverReason) {\n return (\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Text bold>Discover plugins</Text>\n <Text dimColor>\n {discoverReason === 'all-plugins-installed'\n ? 'All available plugins are already installed.'\n : discoverReason === 'all-marketplaces-failed'\n ? 'Failed to load marketplace data.'\n : 'No plugins available.'}\n </Text>\n <Text dimColor>\n {discoverReason === 'all-plugins-installed'\n ? 'Check for new plugins later or add more marketplaces.'\n : discoverReason === 'all-marketplaces-failed'\n ? 'Check your network connection.'\n : 'Add a marketplace first using the Marketplaces tab.'}\n </Text>\n <Text dimColor italic>\n Esc to go back\n </Text>\n </Box>\n )\n }\n\n const reservedLines =\n (layout.tightLayout ? 10 : layout.compactLayout ? 12 : 14) +\n layout.paddingY * 2 +\n layout.gap * 3\n const maxVisible = Math.max(3, layout.rows - reservedLines - 1)\n\n const clampedSelection = clamp(\n discoverSelectedIndex,\n 0,\n Math.max(0, discoverFiltered.length - 1),\n )\n\n const window = getWindowedList({\n itemCount: discoverFiltered.length,\n focusIndex: clampedSelection,\n maxVisible,\n indicatorRows: 2,\n })\n const visible = discoverFiltered.slice(window.start, window.end)\n\n const topIndicator = window.showUpIndicator\n ? `${figures.arrowUp} more above`\n : ' '\n const bottomIndicator = window.showDownIndicator\n ? `${figures.arrowDown} more below`\n : ' '\n\n return (\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Box flexDirection=\"row\" justifyContent=\"space-between\">\n <Text bold wrap=\"truncate-end\">\n Discover plugins\n </Text>\n {discoverFiltered.length > 0 ? (\n <Text dimColor wrap=\"truncate-end\">\n {clampedSelection + 1}/{discoverFiltered.length}\n </Text>\n ) : null}\n </Box>\n\n <SearchBox\n query={discoverQuery}\n isFocused={discoverSearchFocused}\n isTerminalFocused={true}\n />\n\n {discoverFiltered.length === 0 && discoverQuery.trim() ? (\n <Text dimColor wrap=\"truncate-end\">\n No plugins match \"{discoverQuery.trim()}\"\n </Text>\n ) : null}\n\n <Box flexDirection=\"column\" width=\"100%\">\n <Text dimColor wrap=\"truncate-end\">\n {topIndicator}\n </Text>\n {visible.map((plugin, idx) => {\n const absoluteIndex = window.start + idx\n const isSelected = absoluteIndex === clampedSelection\n const isChecked = selectedPluginSpecs.has(plugin.pluginSpec)\n const isInstalling = installingSpecs.has(plugin.pluginSpec)\n\n const name = String(plugin.entry?.name ?? '')\n const marketplace = plugin.marketplaceName\n const description = String(plugin.entry?.description ?? '').trim()\n const communityManaged = Array.isArray((plugin.entry as any)?.tags)\n ? ((plugin.entry as any).tags as unknown[]).includes(\n 'community-managed',\n )\n : false\n\n const main = [\n name,\n `\u00B7 ${marketplace}`,\n communityManaged ? '[Community Managed]' : null,\n description ? `\u2014 ${description}` : null,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <Box key={plugin.pluginSpec} flexDirection=\"row\" gap={1}>\n <Text\n color={\n isSelected && !discoverSearchFocused\n ? theme.kode\n : theme.secondaryText\n }\n >\n {isSelected && !discoverSearchFocused ? figures.pointer : ' '}\n </Text>\n <Text dimColor>\n {isInstalling ? figures.ellipsis : isChecked ? '\u25CF' : '\u25CB'}\n </Text>\n <Text\n bold={isSelected && !discoverSearchFocused}\n color={\n isSelected && !discoverSearchFocused\n ? theme.text\n : theme.secondaryText\n }\n wrap=\"truncate-end\"\n >\n {main}\n </Text>\n </Box>\n )\n })}\n <Text dimColor wrap=\"truncate-end\">\n {bottomIndicator}\n </Text>\n </Box>\n\n {status ? (\n <Text dimColor wrap=\"truncate-end\">\n {status}\n </Text>\n ) : null}\n\n <Box marginTop={layout.tightLayout ? 0 : 1}>\n <Text dimColor italic wrap=\"truncate-end\">\n {selectedPluginSpecs.size > 0 ? (\n <>\n <Text bold color={theme.suggestion}>\n i to install\n </Text>{' '}\n </>\n ) : null}\n type to search \u00B7 Space toggle \u00B7 Enter details \u00B7 Esc back\n </Text>\n </Box>\n </Box>\n )\n }\n\n const renderInstalled = (): React.ReactNode => {\n if (installedRows.length === 0) {\n return (\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Text bold>Installed plugins</Text>\n <Text dimColor>(none)</Text>\n </Box>\n )\n }\n\n const reservedLines =\n (layout.tightLayout ? 8 : layout.compactLayout ? 10 : 12) +\n layout.paddingY * 2 +\n layout.gap * 3\n const maxVisible = Math.max(3, layout.rows - reservedLines - 1)\n const clampedSelection = clamp(\n installedSelectedIndex,\n 0,\n Math.max(0, installedRows.length - 1),\n )\n const window = getWindowedList({\n itemCount: installedRows.length,\n focusIndex: clampedSelection,\n maxVisible,\n indicatorRows: 2,\n })\n const visible = installedRows.slice(window.start, window.end)\n\n return (\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Text bold>Installed plugins</Text>\n <Box flexDirection=\"column\" width=\"100%\">\n <Text dimColor wrap=\"truncate-end\">\n {window.showUpIndicator ? `${figures.arrowUp} More` : ' '}\n </Text>\n {visible.map((row, idx) => {\n const absoluteIndex = window.start + idx\n const isSelected = absoluteIndex === clampedSelection\n const enabled = row.plugin.isEnabled !== false\n const badge = enabled ? 'enabled' : 'disabled'\n return (\n <Box key={row.pluginSpec} flexDirection=\"row\" gap={1}>\n <Text color={isSelected ? theme.kode : theme.secondaryText}>\n {isSelected ? figures.pointer : ' '}\n </Text>\n <Text dimColor>{enabled ? '\u25CF' : '\u25CB'}</Text>\n <Text\n bold={isSelected}\n color={isSelected ? theme.text : theme.secondaryText}\n wrap=\"truncate-end\"\n >\n {row.pluginSpec}{' '}\n <Text dimColor>\n \u00B7 {badge} \u00B7 scope={row.plugin.scope}\n {row.plugin.kind === 'plugin-pack' ? ' \u00B7 pack' : ''}\n </Text>\n </Text>\n </Box>\n )\n })}\n <Text dimColor wrap=\"truncate-end\">\n {window.showDownIndicator ? `${figures.arrowDown} More` : ' '}\n </Text>\n </Box>\n\n <Text dimColor italic wrap=\"truncate-end\">\n \u2191/\u2193 select \u00B7 Enter toggle enable \u00B7 Backspace uninstall \u00B7 Esc back\n </Text>\n </Box>\n )\n }\n\n const renderMarketplacesTab = (): React.ReactNode => {\n if (marketplaces.length === 0) {\n return (\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Text bold>Marketplaces</Text>\n <Text dimColor>No marketplaces configured</Text>\n <Text dimColor italic>\n Press a to add \u00B7 Esc back\n </Text>\n </Box>\n )\n }\n\n const reservedLines =\n (layout.tightLayout ? 8 : layout.compactLayout ? 10 : 12) +\n layout.paddingY * 2 +\n layout.gap * 3\n const maxVisible = Math.max(3, layout.rows - reservedLines - 1)\n const clampedSelection = clamp(\n marketplaceSelectedIndex,\n 0,\n Math.max(0, marketplaces.length - 1),\n )\n const window = getWindowedList({\n itemCount: marketplaces.length,\n focusIndex: clampedSelection,\n maxVisible,\n indicatorRows: 2,\n })\n const visible = marketplaces.slice(window.start, window.end)\n\n return (\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Text bold>Marketplaces</Text>\n\n <Box flexDirection=\"column\" width=\"100%\">\n <Text dimColor wrap=\"truncate-end\">\n {window.showUpIndicator ? `${figures.arrowUp} More` : ' '}\n </Text>\n {visible.map((row, idx) => {\n const absoluteIndex = window.start + idx\n const isSelected = absoluteIndex === clampedSelection\n return (\n <Box key={row.name} flexDirection=\"row\" gap={1}>\n <Text color={isSelected ? theme.kode : theme.secondaryText}>\n {isSelected ? figures.pointer : ' '}\n </Text>\n <Text\n bold={isSelected}\n color={isSelected ? theme.text : theme.secondaryText}\n wrap=\"truncate-end\"\n >\n {row.name}{' '}\n <Text dimColor>\n \u00B7 {row.sourceLabel}\n {row.lastUpdated ? ` \u00B7 ${row.lastUpdated}` : ''}\n </Text>\n </Text>\n </Box>\n )\n })}\n <Text dimColor wrap=\"truncate-end\">\n {window.showDownIndicator ? `${figures.arrowDown} More` : ' '}\n </Text>\n </Box>\n\n <Text dimColor italic wrap=\"truncate-end\">\n \u2191/\u2193 select \u00B7 a add \u00B7 u update \u00B7 U update all \u00B7 r remove \u00B7 Esc back\n </Text>\n </Box>\n )\n }\n\n const renderErrors = (): React.ReactNode => {\n if (errors.length === 0) {\n return (\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Text bold>Errors</Text>\n <Text dimColor>(none)</Text>\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Text bold>Errors</Text>\n <Box flexDirection=\"column\">\n {errors.slice(0, 20).map((err, idx) => {\n const prefix =\n err.scope === 'install'\n ? 'install'\n : err.scope === 'runtime'\n ? 'runtime'\n : 'marketplace'\n return (\n <Box key={`${idx}:${err.message}`} flexDirection=\"column\">\n <Text color={theme.error} wrap=\"truncate-end\">\n {figures.cross} {prefix}: {err.message}\n </Text>\n {err.detail ? (\n <Text dimColor wrap=\"truncate-end\">\n {err.detail}\n </Text>\n ) : null}\n </Box>\n )\n })}\n </Box>\n </Box>\n )\n }\n\n const cycleTab = useCallback(\n (delta: number) => {\n setActiveTab(prev => {\n const currentIndex = TAB_ORDER.indexOf(prev)\n const nextIndex =\n currentIndex === -1\n ? 0\n : (currentIndex + TAB_ORDER.length + delta) % TAB_ORDER.length\n return TAB_ORDER[nextIndex]!\n })\n },\n [setActiveTab],\n )\n\n const didCloseRef = useRef(false)\n const safeClose = useCallback(() => {\n if (didCloseRef.current) return\n didCloseRef.current = true\n onDone()\n }, [onDone])\n\n useKeypress((input, key) => {\n if (exitState.pending) return true\n\n const inputChar = input.length === 1 ? input : ''\n\n if (view.type === 'addMarketplace') {\n if (key.escape) {\n setView({ type: 'tabs' })\n setAddMarketplaceInput('')\n return true\n }\n if (key.return) {\n const src = addMarketplaceInput.trim()\n if (!src) {\n setStatus('Marketplace source is required')\n return true\n }\n setStatus('Adding marketplace\u2026')\n try {\n void Promise.resolve(addMarketplace(src))\n .then(() => {\n setStatus('Marketplace added')\n setView({ type: 'tabs' })\n setAddMarketplaceInput('')\n return refreshData()\n })\n .catch(error => {\n setErrors(prev => [\n ...prev,\n {\n scope: 'marketplace',\n message: `Failed to add marketplace`,\n detail: stringifyError(error),\n },\n ])\n setStatus('Failed to add marketplace')\n })\n } catch (error) {\n setErrors(prev => [\n ...prev,\n {\n scope: 'marketplace',\n message: `Failed to add marketplace`,\n detail: stringifyError(error),\n },\n ])\n setStatus('Failed to add marketplace')\n }\n return true\n }\n if (key.backspace || key.delete) {\n setAddMarketplaceInput(prev => prev.slice(0, -1))\n return true\n }\n if (input && !key.ctrl && !key.meta) {\n setAddMarketplaceInput(prev => prev + input)\n return true\n }\n return true\n }\n\n if (view.type === 'pluginDetails') {\n if (key.escape) {\n setView({ type: 'tabs' })\n return true\n }\n if (inputChar === 'i') {\n void installSelected([view.plugin.pluginSpec])\n setView({ type: 'tabs' })\n return true\n }\n return true\n }\n\n // Global tab cycling\n if (key.tab) {\n cycleTab(key.shift ? -1 : 1)\n return true\n }\n if (key.leftArrow) {\n cycleTab(-1)\n return true\n }\n if (key.rightArrow) {\n cycleTab(1)\n return true\n }\n\n if (activeTab === 'discover') {\n if (key.return && !discoverSearchFocused) {\n const plugin = discoverFiltered[discoverSelectedIndex]\n if (plugin) setView({ type: 'pluginDetails', plugin })\n return true\n }\n\n if (inputChar === 'i' && selectedPluginSpecs.size > 0) {\n void installSelected()\n return true\n }\n\n if (discoverSearchFocused) {\n if (key.downArrow || key.return) {\n setDiscoverSearchFocused(false)\n setDiscoverSelectedIndex(0)\n return true\n }\n if (key.backspace || key.delete) {\n if (discoverQuery.length === 0) {\n setDiscoverSearchFocused(false)\n } else {\n setDiscoverQuery(prev => prev.slice(0, -1))\n }\n return true\n }\n if (key.escape) {\n if (discoverQuery.length > 0) setDiscoverQuery('')\n else setDiscoverSearchFocused(false)\n return true\n }\n if (input && !key.ctrl && !key.meta) {\n setDiscoverQuery(prev => prev + input)\n return true\n }\n return true\n }\n\n if (key.upArrow || inputChar === 'k') {\n if (discoverSelectedIndex === 0) {\n setDiscoverSearchFocused(true)\n } else {\n setDiscoverSelectedIndex(prev => Math.max(0, prev - 1))\n }\n return true\n }\n if (key.downArrow || inputChar === 'j') {\n setDiscoverSelectedIndex(prev =>\n Math.min(Math.max(0, discoverFiltered.length - 1), prev + 1),\n )\n return true\n }\n if (key.pageUp) {\n setDiscoverSelectedIndex(prev =>\n Math.max(0, prev - Math.max(1, Math.floor(layout.rows / 3))),\n )\n return true\n }\n if (key.pageDown) {\n setDiscoverSelectedIndex(prev =>\n Math.min(\n Math.max(0, discoverFiltered.length - 1),\n prev + Math.max(1, Math.floor(layout.rows / 3)),\n ),\n )\n return true\n }\n if (inputChar === '/') {\n setDiscoverSearchFocused(true)\n setDiscoverQuery('')\n return true\n }\n if (input && !key.ctrl && !key.meta && !/^[\\\\s]+$/.test(input)) {\n setDiscoverSearchFocused(true)\n setDiscoverQuery(input)\n return true\n }\n if (inputChar === ' ') {\n const plugin = discoverFiltered[discoverSelectedIndex]\n if (plugin) toggleSelected(plugin.pluginSpec)\n return true\n }\n if (key.escape) {\n safeClose()\n return true\n }\n return false\n }\n\n if (activeTab === 'installed') {\n if (installedRows.length === 0) return false\n\n if (key.upArrow || inputChar === 'k') {\n setInstalledSelectedIndex(prev => Math.max(0, prev - 1))\n return true\n }\n if (key.downArrow || inputChar === 'j') {\n setInstalledSelectedIndex(prev =>\n Math.min(Math.max(0, installedRows.length - 1), prev + 1),\n )\n return true\n }\n\n if (key.return) {\n const row = installedRows[installedSelectedIndex]\n if (!row) return true\n const enabled = row.plugin.isEnabled !== false\n try {\n if (enabled)\n disableSkillPlugin(row.pluginSpec, { scope: row.plugin.scope })\n else enableSkillPlugin(row.pluginSpec, { scope: row.plugin.scope })\n void refreshPluginRuntimeFromInstalls().then(() =>\n reloadCustomCommandsForSession(),\n )\n refreshInstalled()\n setStatus(enabled ? 'Disabled plugin' : 'Enabled plugin')\n } catch (error) {\n setErrors(prev => [\n ...prev,\n {\n scope: 'runtime',\n message: `Failed to toggle ${row.pluginSpec}`,\n detail: stringifyError(error),\n },\n ])\n }\n return true\n }\n\n if (key.backspace || key.delete) {\n const row = installedRows[installedSelectedIndex]\n if (!row) return true\n try {\n uninstallSkillPlugin(row.pluginSpec, { scope: row.plugin.scope })\n void refreshPluginRuntimeFromInstalls().then(() =>\n reloadCustomCommandsForSession(),\n )\n setStatus('Uninstalled plugin')\n void refreshData()\n } catch (error) {\n setErrors(prev => [\n ...prev,\n {\n scope: 'runtime',\n message: `Failed to uninstall ${row.pluginSpec}`,\n detail: stringifyError(error),\n },\n ])\n }\n return true\n }\n\n return false\n }\n\n if (activeTab === 'marketplaces') {\n if (inputChar === 'U') {\n setStatus('Updating marketplaces\u2026')\n void refreshAllMarketplacesAsync(message => setStatus(message))\n .then(result => {\n if (result.failed.length > 0) {\n setErrors(prev => [\n ...prev,\n ...result.failed.map(f => ({\n scope: 'marketplace' as const,\n message: `Failed to update marketplace ${f.name}`,\n detail: f.error,\n })),\n ])\n }\n setStatus(`Updated ${result.refreshed.length} marketplace(s)`)\n return refreshData()\n })\n .catch(error => {\n setErrors(prev => [\n ...prev,\n {\n scope: 'marketplace',\n message: 'Failed to update marketplaces',\n detail: stringifyError(error),\n },\n ])\n setStatus('Failed to update marketplaces')\n })\n return true\n }\n\n const inputLower = inputChar.toLowerCase()\n\n if (inputLower === 'a') {\n setView({ type: 'addMarketplace' })\n setStatus(null)\n return true\n }\n\n if (marketplaces.length === 0) return false\n\n if (key.upArrow || inputChar === 'k') {\n setMarketplaceSelectedIndex(prev => Math.max(0, prev - 1))\n return true\n }\n if (key.downArrow || inputChar === 'j') {\n setMarketplaceSelectedIndex(prev =>\n Math.min(Math.max(0, marketplaces.length - 1), prev + 1),\n )\n return true\n }\n\n if (inputLower === 'u') {\n const selected = marketplaces[marketplaceSelectedIndex]\n if (!selected) return true\n setStatus(`Updating marketplace: ${selected.name}\u2026`)\n void refreshMarketplaceAsync(selected.name)\n .then(() => {\n setStatus(`Updated marketplace: ${selected.name}`)\n return refreshData()\n })\n .catch(error => {\n setErrors(prev => [\n ...prev,\n {\n scope: 'marketplace',\n message: `Failed to update marketplace ${selected.name}`,\n detail: stringifyError(error),\n },\n ])\n setStatus(`Failed to update marketplace: ${selected.name}`)\n })\n return true\n }\n\n if (inputLower === 'r') {\n const selected = marketplaces[marketplaceSelectedIndex]\n if (!selected) return true\n try {\n removeMarketplace(selected.name)\n setStatus(`Removed marketplace: ${selected.name}`)\n void refreshData()\n } catch (error) {\n setErrors(prev => [\n ...prev,\n {\n scope: 'marketplace',\n message: `Failed to remove marketplace ${selected.name}`,\n detail: stringifyError(error),\n },\n ])\n }\n return true\n }\n\n return false\n }\n\n if (key.escape) {\n safeClose()\n return true\n }\n\n return false\n })\n\n if (isLoading) {\n return (\n <ScreenFrame\n title=\"Plugins\"\n exitState={exitState}\n paddingX={layout.paddingX}\n paddingY={layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\" gap={layout.gap}>\n {renderTabs()}\n <Text dimColor>Loading\u2026</Text>\n </Box>\n </ScreenFrame>\n )\n }\n\n if (view.type === 'pluginDetails') {\n const plugin = view.plugin\n const name = String(plugin.entry?.name ?? '')\n const description = String(plugin.entry?.description ?? '').trim()\n const tags = Array.isArray((plugin.entry as any)?.tags)\n ? ((plugin.entry as any).tags as unknown[])\n .filter(t => typeof t === 'string')\n .join(', ')\n : ''\n const skills = Array.isArray((plugin.entry as any)?.skills)\n ? ((plugin.entry as any).skills as unknown[]).length\n : 0\n const commands = Array.isArray((plugin.entry as any)?.commands)\n ? ((plugin.entry as any).commands as unknown[]).length\n : 0\n\n return (\n <ScreenFrame\n title=\"Plugin Details\"\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 bold wrap=\"truncate-end\">\n {name} <Text dimColor>\u00B7 {plugin.marketplaceName}</Text>\n </Text>\n {description ? <Text dimColor>{description}</Text> : null}\n {tags ? <Text dimColor>Tags: {tags}</Text> : null}\n <Text dimColor>\n Includes: {skills} skills \u00B7 {commands} commands\n </Text>\n <Text dimColor italic>\n i install \u00B7 Esc back\n </Text>\n </Box>\n </ScreenFrame>\n )\n }\n\n if (view.type === 'addMarketplace') {\n return (\n <ScreenFrame\n title=\"Add Marketplace\"\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 Enter a marketplace source (GitHub repo, git URL, local path, or\n URL)\n </Text>\n <Box flexDirection=\"column\">\n <SearchBox\n query={addMarketplaceInput}\n isFocused={true}\n isTerminalFocused={true}\n prefix=\"+\"\n placeholder=\"owner/repo or ./path\"\n />\n </Box>\n {status ? (\n <Text dimColor wrap=\"truncate-end\">\n {status}\n </Text>\n ) : null}\n <Text dimColor italic wrap=\"truncate-end\">\n Enter add \u00B7 Esc cancel\n </Text>\n </Box>\n </ScreenFrame>\n )\n }\n\n return (\n <ScreenFrame\n title=\"Plugins\"\n exitState={exitState}\n paddingX={layout.paddingX}\n paddingY={layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\" gap={layout.gap}>\n {renderTabs()}\n {activeTab === 'discover'\n ? renderDiscover()\n : activeTab === 'installed'\n ? renderInstalled()\n : activeTab === 'marketplaces'\n ? renderMarketplacesTab()\n : renderErrors()}\n </Box>\n </ScreenFrame>\n )\n}\n", "import type { Command } from '../types'\n\nexport default {\n type: 'prompt',\n name: 'pr-comments',\n description: 'Get comments from a GitHub pull request',\n progressMessage: 'fetching PR comments',\n isEnabled: true,\n isHidden: false,\n userFacingName() {\n return 'pr-comments'\n },\n async getPromptForCommand(args: string) {\n return [\n {\n role: 'user',\n content: [\n {\n type: 'text',\n text: `You are an AI assistant integrated into a git-based version control system. Your task is to fetch and display comments from a GitHub pull request.\n\nFollow these steps:\n\n1. Use \\`gh pr view --json number,headRepository\\` to get the PR number and repository info\n2. Use \\`gh api /repos/{owner}/{repo}/issues/{number}/comments\\` to get PR-level comments\n3. Use \\`gh api /repos/{owner}/{repo}/pulls/{number}/comments\\` to get review comments. Pay particular attention to the following fields: \\`body\\`, \\`diff_hunk\\`, \\`path\\`, \\`line\\`, etc. If the comment references some code, consider fetching it using eg \\`gh api /repos/{owner}/{repo}/contents/{path}?ref={branch} | jq .content -r | base64 -d\\`\n4. Parse and format all comments in a readable way\n5. Return ONLY the formatted comments, with no additional text\n\nFormat the comments as:\n\n## Comments\n\n[For each comment thread:]\n- @author file.ts#line:\n \\`\\`\\`diff\n [diff_hunk from the API response]\n \\`\\`\\`\n > quoted comment text\n \n [any replies indented]\n\nIf there are no comments, return \"No comments found.\"\n\nRemember:\n1. Only show the actual comments, no explanatory text\n2. Include both PR-level and code review comments\n3. Preserve the threading/nesting of comment replies\n4. Show the file and line number context for code review comments\n5. Use jq to parse the JSON responses from the GitHub API\n\n${args ? 'Additional user input: ' + args : ''}\n`,\n },\n ],\n },\n ]\n },\n} satisfies Command\n", "import type { Command } from '../types'\nimport { reloadCustomCommandsForSession } from '#cli-services/customCommands'\nimport { debug as debugLogger } from '#core/utils/debugLogger'\nimport { logError } from '#core/utils/log'\n\n/**\n * Refresh Commands - Reload custom commands from filesystem\n *\n * This command provides a runtime mechanism to refresh the custom commands\n * cache without restarting the application. It's particularly useful during\n * development or when users are actively creating/modifying custom commands.\n *\n * The command follows the standard local command pattern used throughout\n * the project and provides detailed feedback about the refresh operation.\n */\nfunction getCommandScope(cmd: Command): 'project' | 'user' | null {\n const scope = (cmd as unknown as Record<string, unknown>).scope\n if (scope === 'project' || scope === 'user') return scope\n return null\n}\n\nconst refreshCommands = {\n type: 'local',\n name: 'refresh-commands',\n description: 'Reload custom commands from filesystem',\n isEnabled: true,\n isHidden: false,\n async call(_, context) {\n try {\n await reloadCustomCommandsForSession()\n\n const { getCommands } = await import('../registry')\n\n // Reload commands to get updated count and validate the refresh\n const commands = await getCommands()\n let projectCommands = 0\n let userCommands = 0\n for (const cmd of commands) {\n const scope = getCommandScope(cmd)\n if (scope === 'project') projectCommands++\n if (scope === 'user') userCommands++\n }\n const customCommandsCount = projectCommands + userCommands\n\n // Provide detailed feedback about the refresh operation\n return `Commands refreshed.\n\nCustom commands reloaded: ${customCommandsCount}\n- Project commands: ${projectCommands}\n- User commands: ${userCommands}\n\nUse /help to see updated command list.`\n } catch (error) {\n logError(error)\n debugLogger.warn('REFRESH_COMMANDS_FAILED', {\n error: error instanceof Error ? error.message : String(error),\n })\n return 'Failed to refresh commands. Check debug logs for details.'\n }\n },\n userFacingName() {\n return 'refresh-commands'\n },\n} satisfies Command\n\nexport default refreshCommands\n", "import { MACRO } from '#core/constants/macros'\nimport type { Command } from '../types'\nimport { RELEASE_NOTES } from '#core/constants/releaseNotes'\n\nconst releaseNotes: Command = {\n description: 'Show release notes for the current or specified version',\n isEnabled: false,\n isHidden: false,\n name: 'release-notes',\n userFacingName() {\n return 'release-notes'\n },\n type: 'local',\n async call(args) {\n const currentVersion = MACRO.VERSION\n\n // If a specific version is requested, show that version's notes\n const requestedVersion = args ? args.trim() : currentVersion\n\n // Get the requested version's notes\n const notes = RELEASE_NOTES[requestedVersion]\n\n if (!notes || notes.length === 0) {\n return `No release notes available for version ${requestedVersion}.`\n }\n\n const header = `Release notes for version ${requestedVersion}:`\n const formattedNotes = notes.map(note => `\u2022 ${note}`).join('\\n')\n\n return `${header}\\n\\n${formattedNotes}`\n },\n}\n\nexport default releaseNotes\n", "import type { Command } from '../types'\n\nexport default {\n type: 'prompt',\n name: 'review',\n description: 'Review a pull request',\n isEnabled: true,\n isHidden: false,\n progressMessage: 'reviewing pull request',\n userFacingName() {\n return 'review'\n },\n async getPromptForCommand(args) {\n return [\n {\n role: 'user',\n content: [\n {\n type: 'text',\n text: `\n You are an expert code reviewer. Follow these steps:\n\n 1. If no PR number is provided in the args, use Bash(\"gh pr list\") to show open PRs\n 2. If a PR number is provided, use Bash(\"gh pr view <number>\") to get PR details\n 3. Use Bash(\"gh pr diff <number>\") to get the diff\n 4. Analyze the changes and provide a thorough code review that includes:\n - Overview of what the PR does\n - Analysis of code quality and style\n - Specific suggestions for improvements\n - Any potential issues or risks\n \n Keep your review concise but thorough. Focus on:\n - Code correctness\n - Following project conventions\n - Performance implications\n - Test coverage\n - Security considerations\n\n Format your review with clear sections and bullet points.\n\n PR number: ${args}\n `,\n },\n ],\n },\n ]\n },\n} satisfies Command\n", "import type { Command } from '../types'\nimport { getCwd } from '#core/utils/state'\nimport { getKodeAgentSessionId } from '#protocol/utils/kodeAgentSessionId'\nimport { appendSessionCustomTitleRecord } from '#protocol/utils/kodeAgentSessionLog'\n\nconst rename = {\n type: 'local',\n name: 'rename',\n description: 'Set a custom title for the current session',\n isEnabled: true,\n isHidden: false,\n userFacingName() {\n return 'rename'\n },\n async call(args, _context) {\n const customTitle = args.trim()\n if (!customTitle) return 'Usage: /rename <title>'\n\n appendSessionCustomTitleRecord({\n cwd: getCwd(),\n sessionId: getKodeAgentSessionId(),\n customTitle,\n })\n\n return `Session renamed to: ${customTitle}`\n },\n} satisfies Command\n\nexport default rename\n", "import * as React from 'react'\nimport type { Command } from '../types'\n\nimport { execFileSync } from 'node:child_process'\nimport { resolve as resolvePath, sep } from 'node:path'\nimport { quote } from 'shell-quote'\n\nimport { PRODUCT_COMMAND } from '#core/constants/product'\nimport { getOriginalCwd } from '#core/utils/state'\nimport { ResumeSessionSelector } from '#ui-ink/components/ResumeSessionSelector'\nimport {\n listKodeAgentSessions,\n resolveResumeSessionIdentifier,\n} from '#protocol/utils/kodeAgentSessionResume'\nimport { loadKodeAgentSessionMessagesForResume } from '#protocol/utils/kodeAgentSessionLoad'\nimport { setSessionId } from '#core/utils/sessionId'\nimport { setKodeAgentSessionForkInfo } from '#protocol/utils/kodeAgentSessionForkInfo'\nimport { copyTextToClipboard } from '#cli-utils/clipboard'\nimport { switchCwdForResume } from '#cli-utils/switchCwdForResume'\n\nfunction getGitWorktreeRootsBestEffort(cwd: string): string[] {\n try {\n const stdout = execFileSync('git', ['worktree', 'list', '--porcelain'], {\n cwd,\n stdio: ['ignore', 'pipe', 'ignore'],\n timeout: 1000,\n })\n\n const roots: string[] = []\n for (const line of stdout.toString('utf8').split('\\n')) {\n if (!line.startsWith('worktree ')) continue\n const path = line.slice('worktree '.length).trim()\n if (path) roots.push(path)\n }\n\n return Array.from(new Set(roots.map(p => resolvePath(p))))\n } catch {\n return []\n }\n}\n\nfunction isPathWithinRoot(path: string, root: string): boolean {\n const resolvedPath = resolvePath(path)\n const resolvedRoot = resolvePath(root)\n return (\n resolvedPath === resolvedRoot || resolvedPath.startsWith(resolvedRoot + sep)\n )\n}\n\nexport default {\n type: 'local-jsx',\n name: 'resume',\n description: 'Resume a previous conversation',\n isEnabled: true,\n isHidden: false,\n ui: { displayMode: 'fullscreen' },\n argumentHint: '[session-id|slug|title|search]',\n userFacingName() {\n return 'resume'\n },\n async call(onDone, context, args) {\n const cwd = getOriginalCwd()\n const sessions = listKodeAgentSessions({ cwd })\n if (sessions.length === 0) {\n onDone('No conversation found to resume')\n return null\n }\n\n const rawArgs = (args ?? '').trim()\n if (rawArgs) {\n const resolved = resolveResumeSessionIdentifier({\n cwd,\n identifier: rawArgs,\n })\n\n if (resolved.kind === 'ok') {\n setKodeAgentSessionForkInfo(null)\n setSessionId(resolved.sessionId)\n const messages = loadKodeAgentSessionMessagesForResume({\n cwd,\n sessionId: resolved.sessionId,\n })\n context.setForkConvoWithMessagesOnTheNextRender(messages, {\n clearViewport: true,\n resetInput: true,\n })\n onDone()\n return null\n }\n\n if (resolved.kind === 'different_directory') {\n const otherCwd = resolved.otherCwd\n const command = otherCwd\n ? `cd ${quote([otherCwd])} && ${PRODUCT_COMMAND} --resume ${resolved.sessionId}`\n : `${PRODUCT_COMMAND} --resume ${resolved.sessionId}`\n\n if (otherCwd) {\n const worktreeRoots = getGitWorktreeRootsBestEffort(cwd)\n const isSameRepoWorktree = worktreeRoots.some(root =>\n isPathWithinRoot(otherCwd, root),\n )\n\n if (isSameRepoWorktree) {\n await switchCwdForResume(otherCwd)\n\n setKodeAgentSessionForkInfo(null)\n setSessionId(resolved.sessionId)\n const messages = loadKodeAgentSessionMessagesForResume({\n cwd: otherCwd,\n sessionId: resolved.sessionId,\n })\n context.setForkConvoWithMessagesOnTheNextRender(messages, {\n clearViewport: true,\n resetInput: true,\n })\n onDone()\n return null\n }\n }\n\n try {\n await copyTextToClipboard(command)\n } catch {\n // best-effort\n }\n onDone(\n otherCwd\n ? [\n 'This conversation is from a different directory.',\n '',\n 'To resume, run:',\n ` ${command}`,\n '',\n '(Command copied to clipboard)',\n ].join('\\n')\n : `That session belongs to a different directory.`,\n )\n return null\n }\n }\n\n return (\n <ResumeSessionSelector\n cwd={cwd}\n sessions={sessions}\n initialQuery={rawArgs || undefined}\n onCancel={() => onDone()}\n onSelect={async session => {\n const effectiveCwd = session.cwd ?? cwd\n if (session.cwd && resolvePath(session.cwd) !== resolvePath(cwd)) {\n await switchCwdForResume(effectiveCwd)\n }\n\n setKodeAgentSessionForkInfo(null)\n setSessionId(session.sessionId)\n const messages = loadKodeAgentSessionMessagesForResume({\n cwd: effectiveCwd,\n sessionId: session.sessionId,\n })\n context.setForkConvoWithMessagesOnTheNextRender(messages, {\n clearViewport: true,\n resetInput: true,\n })\n onDone()\n }}\n />\n )\n },\n} satisfies Command\n", "import React, {\n useCallback,\n useDeferredValue,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport { Box, Text } from 'ink'\nimport figures from 'figures'\nimport { execFileSync } from 'node:child_process'\nimport { basename, resolve as resolvePath, sep } from 'node:path'\nimport { quote } from 'shell-quote'\n\nimport { PRODUCT_COMMAND } from '#core/constants/product'\nimport { queryLLM } from '#core/ai/llmLazy'\nimport { createUserMessage } from '#core/engine/messages/create'\nimport { getTheme, type Theme } from '#core/utils/theme'\nimport { formatDate, logError } from '#core/utils/log'\nimport { getBranch } from '#core/utils/git'\nimport type { KodeAgentSessionListItem } from '#protocol/utils/kodeAgentSessionResume'\nimport {\n listAllKodeAgentSessions,\n listKodeAgentSessions,\n} from '#protocol/utils/kodeAgentSessionResume'\nimport { appendSessionCustomTitleRecord } from '#protocol/utils/kodeAgentSessionLog'\nimport { loadKodeAgentSessionMessages } from '#protocol/utils/kodeAgentSessionLoad'\nimport { buildTranscriptLines } from '#cli-utils/transcriptText'\nimport { copyTextToClipboard } from '#cli-utils/clipboard'\nimport { useExitOnCtrlCD } from '#ui-ink/hooks/useExitOnCtrlCD'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { KEYPRESS_PRIORITY } from '#ui-ink/constants/keypressPriority'\nimport { SearchBox } from '#ui-ink/components/SearchBox'\nimport TextInput from '#ui-ink/components/TextInput'\nimport { SimpleSpinner } from '#ui-ink/components/Spinner'\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 { z } from 'zod'\n\ntype ViewMode = 'list' | 'search' | 'rename' | 'preview' | 'crossProject'\n\ntype SessionRow = {\n session: KodeAgentSessionListItem\n groupKey: string\n groupSize: number\n indexInGroup: number\n isGroupHeader: boolean\n}\n\ntype ResumeSessionListProps = {\n visibleRowsList: SessionRow[]\n window: ReturnType<typeof getWindowedList>\n clampedSelection: number\n visibleRows: number\n theme: Theme\n expandedGroups: Set<string>\n showAllProjects: boolean\n showAllWorktrees: boolean\n}\n\nconst ResumeSessionList = React.memo(function ResumeSessionList({\n visibleRowsList,\n window,\n clampedSelection,\n visibleRows,\n theme,\n expandedGroups,\n showAllProjects,\n showAllWorktrees,\n}: ResumeSessionListProps) {\n const topIndicator = window.showUpIndicator ? `${figures.arrowUp} More` : ' '\n const bottomIndicator = window.showDownIndicator\n ? `${figures.arrowDown} More`\n : ' '\n const visibleListRowCount = Math.max(1, visibleRowsList.length)\n\n return (\n <Box flexDirection=\"column\" width=\"100%\" minHeight={visibleRows + 2}>\n <Text dimColor wrap=\"truncate-end\">\n {topIndicator}\n </Text>\n {visibleRowsList.length > 0 ? (\n visibleRowsList.map((row, idx) => {\n const absoluteIndex = window.start + idx\n const isSelected = absoluteIndex === clampedSelection\n\n const session = row.session\n const modifiedAt = session.modifiedAt ?? session.createdAt ?? new Date(0)\n const modifiedLabel = formatDate(modifiedAt)\n\n const tag = session.tag ? `#${session.tag}` : null\n const branch = session.gitBranch ? `@${session.gitBranch}` : null\n const name = getSessionDisplayName(session)\n const namePrefix =\n row.indexInGroup > 0 ? `${figures.lineUpRight} ` : ''\n const isGroupToggle = row.isGroupHeader && row.groupSize > 1\n const groupIndicator = isGroupToggle\n ? expandedGroups.has(row.groupKey)\n ? figures.triangleDownSmall\n : figures.triangleRightSmall\n : ' '\n const groupCountLabel =\n row.isGroupHeader && row.groupSize > 1\n ? `(+${row.groupSize - 1})`\n : null\n\n const projectLabel =\n (showAllProjects || showAllWorktrees) && session.cwd\n ? basename(session.cwd)\n : null\n\n return (\n <Box key={session.sessionId} flexDirection=\"row\" gap={1}>\n <Text color={isSelected ? theme.kode : theme.secondaryText}>\n {isSelected ? figures.pointer : ' '}\n </Text>\n <Text dimColor>{groupIndicator}</Text>\n <Text dimColor wrap=\"truncate-end\">\n {modifiedLabel}\n </Text>\n {projectLabel ? (\n <Text color={theme.secondaryText} wrap=\"truncate-end\">\n {projectLabel}\n </Text>\n ) : null}\n {branch ? (\n <Text color={theme.secondaryText} wrap=\"truncate-end\">\n {branch}\n </Text>\n ) : null}\n {tag ? (\n <Text color={theme.secondaryText} wrap=\"truncate-end\">\n {tag}\n </Text>\n ) : null}\n <Text\n bold={isSelected}\n color={isSelected ? theme.text : theme.secondaryText}\n dimColor={!isSelected && row.indexInGroup > 0}\n wrap=\"truncate-end\"\n >\n {namePrefix}\n {name}\n </Text>\n {groupCountLabel ? (\n <Text dimColor wrap=\"truncate-end\">\n {groupCountLabel}\n </Text>\n ) : null}\n </Box>\n )\n })\n ) : (\n <Text dimColor>(empty)</Text>\n )}\n {visibleListRowCount < visibleRows\n ? Array.from({\n length: Math.max(0, visibleRows - visibleListRowCount),\n }).map((_, idx) => <Text key={`empty-row-${idx}`}> </Text>)\n : null}\n <Text dimColor wrap=\"truncate-end\">\n {bottomIndicator}\n </Text>\n </Box>\n )\n})\n\ntype ResumeSearchInputProps = {\n query: string\n cursorOffset: number\n onCursorOffsetChange: (offset: number) => void\n onChange: (value: string) => void\n onSubmit: () => void\n onCancel: () => void\n onExitSearch: () => void\n onClear: () => void\n onExitToList: () => void\n isFocused: boolean\n isTerminalFocused?: boolean\n theme: Theme\n width: number\n}\n\nconst ResumeSearchInput = React.memo(function ResumeSearchInput({\n query,\n cursorOffset,\n onCursorOffsetChange,\n onChange,\n onSubmit,\n onCancel,\n onExitSearch,\n onClear,\n onExitToList,\n isFocused,\n isTerminalFocused = true,\n theme,\n width,\n}: ResumeSearchInputProps) {\n const prefix = '\u2315'\n const columns = Math.max(10, width - 6)\n return (\n <Box\n flexShrink={0}\n borderStyle=\"round\"\n borderColor={isFocused ? theme.suggestion : undefined}\n borderDimColor={!isFocused}\n paddingX={1}\n width=\"100%\"\n >\n <Box flexDirection=\"row\" gap={1}>\n <Text dimColor={!isFocused}>{prefix}</Text>\n <TextInput\n value={query}\n placeholder=\"Search\u2026\"\n onChange={onChange}\n onSubmit={onSubmit}\n onExit={onCancel}\n columns={columns}\n maxHeight={1}\n cursorOffset={cursorOffset}\n onChangeCursorOffset={onCursorOffsetChange}\n showCursor={isFocused && isTerminalFocused}\n focus={isFocused}\n onSpecialKey={(_inputChar, key) => {\n if (key.ctrl && key.name === 'c') {\n onCancel()\n return true\n }\n if (key.ctrl && key.name === 'n') {\n onExitToList()\n return true\n }\n if ((key.backspace || key.delete) && query.length === 0) {\n onExitSearch()\n return true\n }\n if (key.escape) {\n if (query.trim()) {\n onClear()\n } else {\n onExitSearch()\n }\n return true\n }\n if (key.downArrow) {\n onExitToList()\n return true\n }\n return false\n }}\n />\n </Box>\n </Box>\n )\n})\n\ntype AgenticSearchState =\n | { status: 'idle' }\n | { status: 'searching'; query: string }\n | { status: 'results'; query: string; results: KodeAgentSessionListItem[] }\n | { status: 'error'; query: string; message: string }\n\nfunction normalizeQuery(value: string): string {\n return value.trim().toLowerCase()\n}\n\nconst sessionSearchCache = new WeakMap<KodeAgentSessionListItem, string>()\n\nfunction getSessionSearchText(session: KodeAgentSessionListItem): string {\n const cached = sessionSearchCache.get(session)\n if (cached) return cached\n\n const fields = [\n session.sessionId,\n session.customTitle,\n session.slug,\n session.tag,\n session.summary,\n session.firstPrompt,\n session.messageExcerpt,\n session.gitBranch,\n session.cwd,\n ]\n .filter((v): v is string => typeof v === 'string')\n .join(' ')\n .toLowerCase()\n\n sessionSearchCache.set(session, fields)\n return fields\n}\n\nfunction getGitWorktreeRootsBestEffort(cwd: string): string[] {\n try {\n const stdout = execFileSync('git', ['worktree', 'list', '--porcelain'], {\n cwd,\n stdio: ['ignore', 'pipe', 'ignore'],\n timeout: 1000,\n })\n\n const roots: string[] = []\n for (const line of stdout.toString('utf8').split('\\n')) {\n if (!line.startsWith('worktree ')) continue\n const path = line.slice('worktree '.length).trim()\n if (path) roots.push(path)\n }\n\n return Array.from(new Set(roots.map(p => resolvePath(p))))\n } catch {\n return []\n }\n}\n\nfunction isPathWithinRoot(path: string, root: string): boolean {\n const resolvedPath = resolvePath(path)\n const resolvedRoot = resolvePath(root)\n return (\n resolvedPath === resolvedRoot || resolvedPath.startsWith(resolvedRoot + sep)\n )\n}\n\nfunction matchesSessionQuery(\n session: KodeAgentSessionListItem,\n normalizedQuery: string,\n) {\n if (!normalizedQuery) return true\n return getSessionSearchText(session).includes(normalizedQuery)\n}\n\nconst RESUME_AGENTIC_SEARCH_SYSTEM_PROMPT =\n `Your goal is to find relevant sessions based on a user's search query.\n\nYou will be given a list of sessions with their metadata and a search query. Identify which sessions are most relevant to the query.\n\nEach session may include:\n- Title (display name or custom title)\n- Tag (user-assigned category, shown as [tag: name] - users tag sessions with /tag command to categorize them)\n- Branch (git branch name, shown as [branch: name])\n- Summary (AI-generated summary)\n- First message (beginning of the conversation)\n- Transcript (excerpt of conversation content)\n\nIMPORTANT: Tags are user-assigned labels that indicate the session's topic or category. If the query matches a tag exactly or partially, those sessions should be highly prioritized.\n\nFor each session, consider (in order of priority):\n1. Exact tag matches (highest priority - user explicitly categorized this session)\n2. Partial tag matches or tag-related terms\n3. Title matches (custom titles or first message content)\n4. Branch name matches\n5. Summary and transcript content matches\n6. Semantic similarity and related concepts\n\nCRITICAL: Be VERY inclusive in your matching. Include sessions that:\n- Contain the query term anywhere in any field\n- Are semantically related to the query (e.g., \"testing\" matches sessions about \"tests\", \"unit tests\", \"QA\", etc.)\n- Discuss topics that could be related to the query\n- Have transcripts that mention the concept even in passing\n\nWhen in doubt, INCLUDE the session. It's better to return too many results than too few. The user can easily scan through results, but missing relevant sessions is frustrating.\n\nReturn sessions ordered by relevance (most relevant first). If truly no sessions have ANY connection to the query, return an empty array - but this should be rare.\n\nRespond with ONLY the JSON object, no markdown formatting:\n{\"relevant_indices\": [2, 5, 0]}`.trim()\n\nconst resumeAgenticSearchResponseSchema = z.object({\n relevant_indices: z.array(z.number().int()).default([]),\n})\n\nconst AGENTIC_SEARCH_MAX_SESSIONS = 100\nconst AGENTIC_SEARCH_MAX_FIRST_PROMPT_CHARS = 300\n\nfunction getSessionStableId(session: KodeAgentSessionListItem): string {\n return session.slug ?? session.sessionId\n}\n\nfunction buildAgenticSearchPrompt(args: {\n query: string\n sessions: KodeAgentSessionListItem[]\n}): string {\n const { query, sessions } = args\n const lines = sessions.map((session, index) => {\n const pieces: string[] = [`${index}:`, getSessionStableId(session)]\n\n if (\n session.customTitle &&\n session.customTitle !== getSessionStableId(session)\n )\n pieces.push(`[custom title: ${session.customTitle}]`)\n if (session.tag) pieces.push(`[tag: ${session.tag}]`)\n if (session.gitBranch) pieces.push(`[branch: ${session.gitBranch}]`)\n\n if (session.summary) pieces.push(`- Summary: ${session.summary}`)\n if (session.firstPrompt)\n pieces.push(\n `- First message: ${session.firstPrompt.slice(0, AGENTIC_SEARCH_MAX_FIRST_PROMPT_CHARS)}`,\n )\n if (session.messageExcerpt)\n pieces.push(`- Transcript: ${session.messageExcerpt}`)\n\n return pieces.join(' ')\n })\n\n return [\n 'Sessions:',\n ...lines,\n '',\n `Search query: \"${query}\"`,\n '',\n 'Find the sessions that are most relevant to this query.',\n ].join('\\n')\n}\n\nasync function agenticSearchSessions(args: {\n query: string\n sessions: KodeAgentSessionListItem[]\n signal: AbortSignal\n}): Promise<KodeAgentSessionListItem[]> {\n const { query, sessions, signal } = args\n const trimmedQuery = query.trim()\n const normalizedQuery = normalizeQuery(query)\n if (!normalizedQuery || sessions.length === 0) return []\n\n const matching = sessions.filter(session =>\n matchesSessionQuery(session, normalizedQuery),\n )\n const nonMatching = sessions.filter(\n session => !matchesSessionQuery(session, normalizedQuery),\n )\n const candidates =\n matching.length >= AGENTIC_SEARCH_MAX_SESSIONS\n ? matching.slice(0, AGENTIC_SEARCH_MAX_SESSIONS)\n : [\n ...matching,\n ...nonMatching.slice(\n 0,\n AGENTIC_SEARCH_MAX_SESSIONS - matching.length,\n ),\n ]\n\n const prompt = buildAgenticSearchPrompt({\n query: trimmedQuery,\n sessions: candidates,\n })\n\n const assistant = await queryLLM(\n [createUserMessage(prompt)],\n [RESUME_AGENTIC_SEARCH_SYSTEM_PROMPT],\n 0,\n [],\n signal,\n {\n safeMode: true,\n model: 'main',\n prependCLISysprompt: true,\n temperature: 0,\n },\n )\n\n const text =\n assistant.message.content\n .filter(block => block.type === 'text')\n .map(block => block.text)\n .join('\\n') ?? ''\n\n const jsonMatch = text.match(/\\{[\\s\\S]*\\}/)\n if (!jsonMatch) return []\n\n let parsed: unknown\n try {\n parsed = JSON.parse(jsonMatch[0])\n } catch {\n return []\n }\n\n const validated = resumeAgenticSearchResponseSchema.safeParse(parsed)\n if (!validated.success) return []\n\n const indices = validated.data.relevant_indices\n .filter(idx => Number.isInteger(idx))\n .filter(idx => idx >= 0 && idx < candidates.length)\n\n const seen = new Set<number>()\n const selected: KodeAgentSessionListItem[] = []\n for (const idx of indices) {\n if (seen.has(idx)) continue\n seen.add(idx)\n const session = candidates[idx]\n if (session) selected.push(session)\n }\n\n return selected\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n\nfunction getSessionDisplayName(session: KodeAgentSessionListItem): string {\n const customTitle = session.customTitle?.trim()\n if (customTitle) return customTitle\n\n const summary = session.summary?.trim()\n if (summary) return summary.split('\\n')[0] ?? summary\n\n const firstPrompt = session.firstPrompt?.trim()\n if (firstPrompt) {\n if (firstPrompt.startsWith('<tick>')) return 'Autonomous session'\n return firstPrompt\n }\n\n const slug = session.slug?.trim()\n if (slug) return slug\n\n return session.sessionId\n}\n\nfunction getSessionGroupKey(session: KodeAgentSessionListItem): string {\n return session.forkRootSessionId ?? session.sessionId\n}\n\nexport function ResumeSessionSelector(props: {\n cwd: string\n sessions: KodeAgentSessionListItem[]\n initialQuery?: string\n onCancel: () => void\n onSelect: (session: KodeAgentSessionListItem) => void | Promise<void>\n}): React.ReactNode {\n const { cwd, sessions, onCancel, onSelect } = props\n const theme = getTheme()\n const layout = useScreenLayout()\n const exitState = useExitOnCtrlCD(() => process.exit(0))\n const compactVertical = layout.rows <= 26\n const frameGap = compactVertical ? 0 : layout.gap\n const framePaddingY = compactVertical ? 0 : layout.paddingY\n const [sessionList, setSessionList] = useState(() => sessions)\n\n useEffect(() => {\n setSessionList(sessions)\n }, [sessions])\n\n const [view, setView] = useState<ViewMode>(() =>\n (props.initialQuery ?? '').trim() ? 'search' : 'list',\n )\n const [query, setQuery] = useState(props.initialQuery ?? '')\n const [searchCursorOffset, setSearchCursorOffset] = useState(\n (props.initialQuery ?? '').length,\n )\n const [agenticSearch, setAgenticSearch] = useState<AgenticSearchState>({\n status: 'idle',\n })\n const agenticAbortControllerRef = useRef<AbortController | null>(null)\n const [showAgenticSearchPrompt, setShowAgenticSearchPrompt] = useState(false)\n const [worktreeRoots, setWorktreeRoots] = useState<string[]>([])\n const canFilterWorktrees = worktreeRoots.length > 1\n const [showAllWorktrees, setShowAllWorktrees] = useState(false)\n const [allWorktreeSessions, setAllWorktreeSessions] = useState<\n KodeAgentSessionListItem[] | null\n >(null)\n const [showAllProjects, setShowAllProjects] = useState(false)\n const [allProjectsSessions, setAllProjectsSessions] = useState<\n KodeAgentSessionListItem[] | null\n >(null)\n const [branchFilterEnabled, setBranchFilterEnabled] = useState(false)\n const [currentBranch, setCurrentBranch] = useState<string | null>(null)\n const [selectedIndex, setSelectedIndex] = useState(0)\n const resetSelection = useCallback(() => {\n setSelectedIndex(prev => (prev === 0 ? prev : 0))\n }, [])\n const [submitError, setSubmitError] = useState<string | null>(null)\n const [expandedGroups, setExpandedGroups] = useState<Set<string>>(\n () => new Set(),\n )\n\n const [renameValue, setRenameValue] = useState('')\n const [renameCursorOffset, setRenameCursorOffset] = useState(0)\n\n const [crossProjectCommand, setCrossProjectCommand] = useState<string | null>(\n null,\n )\n const [crossProjectCwd, setCrossProjectCwd] = useState<string | null>(null)\n const [crossProjectTitle, setCrossProjectTitle] = useState<string | null>(\n null,\n )\n\n const didSubmitRef = useRef(false)\n const mountedRef = useRef(true)\n\n useEffect(() => {\n mountedRef.current = true\n return () => {\n mountedRef.current = false\n }\n }, [])\n\n useEffect(() => {\n return () => {\n agenticAbortControllerRef.current?.abort()\n agenticAbortControllerRef.current = null\n }\n }, [])\n\n useEffect(() => {\n void (async () => {\n try {\n const branch = await getBranch()\n setCurrentBranch(branch || null)\n } catch {\n setCurrentBranch(null)\n }\n })()\n }, [])\n\n useEffect(() => {\n setWorktreeRoots(getGitWorktreeRootsBestEffort(cwd))\n }, [cwd])\n\n useEffect(() => {\n if (!showAllProjects) return\n try {\n setAllProjectsSessions(listAllKodeAgentSessions())\n } catch (error) {\n logError(error)\n setAllProjectsSessions([])\n }\n }, [showAllProjects])\n\n const listWorktreeSessions = useCallback((): KodeAgentSessionListItem[] => {\n if (!canFilterWorktrees) return []\n\n const seen = new Set<string>()\n const items: KodeAgentSessionListItem[] = []\n\n for (const root of worktreeRoots) {\n const sessionsForWorktree = listKodeAgentSessions({ cwd: root }).filter(\n session => (session.cwd ? isPathWithinRoot(session.cwd, root) : false),\n )\n for (const s of sessionsForWorktree) {\n if (seen.has(s.sessionId)) continue\n seen.add(s.sessionId)\n items.push(s)\n }\n }\n\n items.sort((a, b) => {\n const am = a.modifiedAt?.getTime() ?? 0\n const bm = b.modifiedAt?.getTime() ?? 0\n return bm - am\n })\n\n return items\n }, [canFilterWorktrees, worktreeRoots])\n\n useEffect(() => {\n if (!showAllWorktrees) return\n try {\n setAllWorktreeSessions(listWorktreeSessions())\n } catch (error) {\n logError(error)\n setAllWorktreeSessions([])\n }\n }, [listWorktreeSessions, showAllWorktrees])\n\n useEffect(() => {\n if (canFilterWorktrees) return\n if (!showAllWorktrees) return\n setShowAllWorktrees(false)\n setAllWorktreeSessions(null)\n }, [canFilterWorktrees, showAllWorktrees])\n\n const localSessions = useMemo(() => {\n return sessionList.filter(session => {\n if (!session.cwd) return false\n if (worktreeRoots.length > 0) {\n return worktreeRoots.some(root => isPathWithinRoot(session.cwd!, root))\n }\n return isPathWithinRoot(session.cwd, cwd)\n })\n }, [cwd, sessionList, worktreeRoots])\n\n const availableTags = useMemo(() => {\n const source = showAllProjects\n ? (allProjectsSessions ?? [])\n : showAllWorktrees\n ? (allWorktreeSessions ?? [])\n : localSessions\n const tags = new Set<string>()\n for (const s of source) {\n if (s.tag) tags.add(s.tag)\n }\n return ['All', ...Array.from(tags).sort((a, b) => a.localeCompare(b))]\n }, [\n allProjectsSessions,\n allWorktreeSessions,\n localSessions,\n sessionList,\n showAllProjects,\n showAllWorktrees,\n ])\n\n const [tagFilterIndex, setTagFilterIndex] = useState(0)\n const activeTag = availableTags[tagFilterIndex] ?? 'All'\n\n useEffect(() => {\n setSearchCursorOffset(prev => clamp(prev, 0, query.length))\n }, [query])\n\n useEffect(() => {\n setTagFilterIndex(prev =>\n clamp(prev, 0, Math.max(0, availableTags.length - 1)),\n )\n }, [availableTags.length])\n\n const sourceSessions = showAllProjects\n ? (allProjectsSessions ?? [])\n : showAllWorktrees\n ? (allWorktreeSessions ?? [])\n : localSessions\n const normalizedQuery = useMemo(() => normalizeQuery(query), [query])\n const deferredQuery = useDeferredValue(normalizedQuery)\n\n const getImmediateMatchCount = useCallback(() => {\n let items = sourceSessions\n\n if (activeTag !== 'All') {\n items = items.filter(s => s.tag === activeTag)\n }\n\n if (branchFilterEnabled && currentBranch) {\n items = items.filter(s => s.gitBranch === currentBranch)\n }\n\n if (normalizedQuery) {\n items = items.filter(s => matchesSessionQuery(s, normalizedQuery))\n }\n\n return items.length\n }, [\n activeTag,\n branchFilterEnabled,\n currentBranch,\n normalizedQuery,\n sourceSessions,\n ])\n\n const filteredSessions = useMemo(() => {\n let items = sourceSessions\n\n if (activeTag !== 'All') {\n items = items.filter(s => s.tag === activeTag)\n }\n\n if (branchFilterEnabled && currentBranch) {\n items = items.filter(s => s.gitBranch === currentBranch)\n }\n\n if (deferredQuery) {\n items = items.filter(s => matchesSessionQuery(s, deferredQuery))\n }\n\n return items\n }, [\n activeTag,\n branchFilterEnabled,\n currentBranch,\n deferredQuery,\n sourceSessions,\n ])\n\n const effectiveSessions = useMemo(() => {\n const trimmedQuery = query.trim()\n if (!trimmedQuery) return filteredSessions\n\n if (\n agenticSearch.status === 'results' &&\n agenticSearch.query === trimmedQuery\n )\n return agenticSearch.results\n\n return filteredSessions\n }, [agenticSearch, filteredSessions, query])\n\n const agenticQuery =\n agenticSearch.status === 'idle' ? '' : agenticSearch.query\n\n useEffect(() => {\n setShowAgenticSearchPrompt(false)\n }, [query])\n\n useEffect(() => {\n const trimmedQuery = query.trim()\n\n if (agenticSearch.status === 'searching') {\n if (agenticQuery === trimmedQuery) return\n\n agenticAbortControllerRef.current?.abort()\n agenticAbortControllerRef.current = null\n setAgenticSearch({ status: 'idle' })\n return\n }\n\n if (\n (agenticSearch.status === 'results' ||\n agenticSearch.status === 'error') &&\n agenticQuery !== trimmedQuery\n ) {\n setAgenticSearch({ status: 'idle' })\n }\n }, [agenticQuery, agenticSearch.status, query])\n\n const agenticResults =\n agenticSearch.status === 'results' ? agenticSearch.results : null\n\n useEffect(() => {\n if (agenticSearch.status !== 'results') return\n if (!agenticResults || agenticResults.length === 0) return\n resetSelection()\n }, [agenticResults, agenticSearch.status, resetSelection])\n\n const rows: SessionRow[] = useMemo(() => {\n const groups = new Map<string, KodeAgentSessionListItem[]>()\n\n for (const session of effectiveSessions) {\n const key = getSessionGroupKey(session)\n const group = groups.get(key)\n if (group) {\n group.push(session)\n } else {\n groups.set(key, [session])\n }\n }\n\n const result: SessionRow[] = []\n for (const [groupKey, sessionsInGroup] of groups) {\n const groupSize = sessionsInGroup.length\n const isExpanded = expandedGroups.has(groupKey)\n\n for (\n let indexInGroup = 0;\n indexInGroup < sessionsInGroup.length;\n indexInGroup++\n ) {\n if (indexInGroup > 0 && !isExpanded) continue\n const session = sessionsInGroup[indexInGroup]!\n result.push({\n session,\n groupKey,\n groupSize,\n indexInGroup,\n isGroupHeader: indexInGroup === 0,\n })\n }\n }\n\n return result\n }, [effectiveSessions, expandedGroups])\n\n const clampedSelection = rows.length\n ? clamp(selectedIndex, 0, rows.length - 1)\n : 0\n\n useEffect(() => {\n setSelectedIndex(prev => clamp(prev, 0, Math.max(0, rows.length - 1)))\n }, [rows.length])\n\n const selectedRow = rows[clampedSelection] ?? null\n const selectedSession = selectedRow?.session ?? null\n\n const titleRows = exitState.pending ? 2 : 1\n const frameRows =\n titleRows +\n 1 + // divider\n frameGap * 2 +\n framePaddingY * 2\n const childCount = 8\n const childGapRows = frameGap * (childCount - 1)\n const reservedRows =\n frameRows +\n childGapRows +\n 1 + // tag tabs\n 1 + // shortcut line\n 3 + // search box (border + content)\n 1 + // filters/info line\n 1 + // status line\n 2 + // list indicators\n 1 + // summary line\n 1 // error line\n const visibleRows = Math.max(1, layout.rows - reservedRows)\n\n const window = useMemo(\n () =>\n getWindowedList({\n itemCount: rows.length,\n focusIndex: clampedSelection,\n maxVisible: visibleRows,\n indicatorRows: 2,\n }),\n [clampedSelection, rows.length, visibleRows],\n )\n\n const visibleRowsList = useMemo(\n () => rows.slice(window.start, window.end),\n [rows, window.end, window.start],\n )\n\n const close = useCallback(() => {\n didSubmitRef.current = true\n onCancel()\n }, [onCancel])\n\n const handleSearchChange = useCallback(\n (value: string) => {\n setQuery(value)\n resetSelection()\n setShowAgenticSearchPrompt(false)\n setSubmitError(null)\n },\n [resetSelection],\n )\n\n const handleSearchSubmit = useCallback(() => {\n setView('list')\n setSubmitError(null)\n if (query.trim() && getImmediateMatchCount() === 0) {\n setShowAgenticSearchPrompt(true)\n }\n }, [getImmediateMatchCount, query])\n\n const handleSearchExit = useCallback(() => {\n setView('list')\n setSubmitError(null)\n }, [])\n\n const handleSearchClear = useCallback(() => {\n setQuery('')\n setSearchCursorOffset(0)\n resetSelection()\n setShowAgenticSearchPrompt(false)\n setSubmitError(null)\n }, [resetSelection])\n\n const handleSearchExitToList = useCallback(() => {\n setView('list')\n setSubmitError(null)\n if (query.trim() && getImmediateMatchCount() === 0) {\n setShowAgenticSearchPrompt(true)\n }\n }, [getImmediateMatchCount, query])\n\n const canResumeSessionInCurrentRepo = useCallback(\n (session: KodeAgentSessionListItem): boolean => {\n if (!session.cwd) return false\n if (worktreeRoots.length > 0) {\n return worktreeRoots.some(root => isPathWithinRoot(session.cwd!, root))\n }\n return isPathWithinRoot(session.cwd, cwd)\n },\n [cwd, worktreeRoots],\n )\n\n const [crossProjectCopyStatus, setCrossProjectCopyStatus] = useState<\n string | null\n >(null)\n\n const openCrossProject = useCallback(\n async (session: KodeAgentSessionListItem) => {\n if (!session.cwd) {\n setSubmitError('That session is missing its directory metadata')\n return\n }\n\n const command = `cd ${quote([session.cwd])} && ${PRODUCT_COMMAND} --resume ${session.sessionId}`\n\n setCrossProjectTitle(getSessionDisplayName(session))\n setCrossProjectCwd(session.cwd)\n setCrossProjectCommand(command)\n setCrossProjectCopyStatus(null)\n setView('crossProject')\n setSubmitError(null)\n\n try {\n const result = await copyTextToClipboard(command)\n const suffix =\n result.method === 'osc52' && result.truncated ? ' (truncated)' : ''\n setCrossProjectCopyStatus(`Copied to clipboard${suffix}.`)\n } catch (error) {\n setCrossProjectCopyStatus(\n `Failed to copy to clipboard: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n },\n [],\n )\n\n const submitSelection = useCallback(async () => {\n if (didSubmitRef.current) return\n const session = selectedSession\n if (!session) {\n setSubmitError(rows.length === 0 ? 'No matches' : 'Nothing selected')\n return\n }\n\n if (!canResumeSessionInCurrentRepo(session)) {\n await openCrossProject(session)\n return\n }\n\n didSubmitRef.current = true\n setSubmitError(null)\n try {\n await onSelect(session)\n } catch (error) {\n logError(error)\n if (!mountedRef.current) return\n didSubmitRef.current = false\n setSubmitError(error instanceof Error ? error.message : String(error))\n }\n }, [\n canResumeSessionInCurrentRepo,\n rows.length,\n onSelect,\n openCrossProject,\n selectedSession,\n ])\n\n const cancelAgenticSearch = useCallback(() => {\n agenticAbortControllerRef.current?.abort()\n agenticAbortControllerRef.current = null\n setAgenticSearch({ status: 'idle' })\n setShowAgenticSearchPrompt(false)\n }, [])\n\n const startAgenticSearch = useCallback(async () => {\n const trimmedQuery = query.trim()\n if (!trimmedQuery) return\n\n const baseSessions = sourceSessions\n .filter(s => (activeTag === 'All' ? true : s.tag === activeTag))\n .filter(s =>\n branchFilterEnabled && currentBranch\n ? s.gitBranch === currentBranch\n : true,\n )\n\n agenticAbortControllerRef.current?.abort()\n const controller = new AbortController()\n agenticAbortControllerRef.current = controller\n setAgenticSearch({ status: 'searching', query: trimmedQuery })\n setSubmitError(null)\n\n try {\n const results = await agenticSearchSessions({\n query: trimmedQuery,\n sessions: baseSessions,\n signal: controller.signal,\n })\n if (!mountedRef.current) return\n if (controller.signal.aborted) {\n setAgenticSearch({ status: 'idle' })\n return\n }\n setAgenticSearch({ status: 'results', query: trimmedQuery, results })\n } catch (error) {\n if (!mountedRef.current) return\n if (controller.signal.aborted) {\n setAgenticSearch({ status: 'idle' })\n return\n }\n logError(error)\n setAgenticSearch({\n status: 'error',\n query: trimmedQuery,\n message: error instanceof Error ? error.message : String(error),\n })\n } finally {\n if (agenticAbortControllerRef.current === controller) {\n agenticAbortControllerRef.current = null\n }\n }\n }, [activeTag, branchFilterEnabled, currentBranch, query, sourceSessions])\n\n const startRename = useCallback(() => {\n if (!selectedSession) return\n setRenameValue(getSessionDisplayName(selectedSession))\n setRenameCursorOffset(getSessionDisplayName(selectedSession).length)\n setView('rename')\n setSubmitError(null)\n }, [selectedSession])\n\n const commitRename = useCallback(() => {\n const session = selectedSession\n const nextTitle = renameValue.trim()\n if (!session) return\n if (!nextTitle) {\n setSubmitError('Session name cannot be empty')\n return\n }\n\n const effectiveCwd = session.cwd ?? cwd\n appendSessionCustomTitleRecord({\n cwd: effectiveCwd,\n sessionId: session.sessionId,\n customTitle: nextTitle,\n })\n\n if (showAllProjects) {\n setAllProjectsSessions(listAllKodeAgentSessions())\n }\n if (showAllWorktrees) {\n setAllWorktreeSessions(listWorktreeSessions())\n }\n if (!showAllProjects && !showAllWorktrees) {\n setSessionList(listKodeAgentSessions({ cwd }))\n }\n\n setView('list')\n setSubmitError(null)\n }, [\n cwd,\n listWorktreeSessions,\n renameValue,\n selectedSession,\n showAllProjects,\n showAllWorktrees,\n ])\n\n const [previewLines, setPreviewLines] = useState<string[] | null>(null)\n const [previewScrollTop, setPreviewScrollTop] = useState(0)\n\n const previewWidth = Math.max(1, layout.columns - layout.paddingX * 2 - 2)\n const previewContentRows = Math.max(1, layout.rows - (framePaddingY * 2 + 6))\n const previewWrapped = useMemo(\n () => (previewLines ? wrapLines(previewLines, previewWidth) : null),\n [previewLines, previewWidth],\n )\n const previewMaxScrollTop = previewWrapped\n ? Math.max(0, previewWrapped.length - previewContentRows)\n : 0\n\n useEffect(() => {\n if (view !== 'search') return\n setSearchCursorOffset(query.length)\n }, [query.length, view])\n\n const openPreview = useCallback(() => {\n const session = selectedSession\n if (!session) return\n\n try {\n const effectiveCwd = session.cwd ?? cwd\n const messages = loadKodeAgentSessionMessages({\n cwd: effectiveCwd,\n sessionId: session.sessionId,\n })\n const rawLines = buildTranscriptLines(messages, {\n includeTools: true,\n collapseToolBlocks: true,\n maxCollapsedChars: 4000,\n })\n\n setPreviewLines(rawLines)\n setPreviewScrollTop(Math.max(0, rawLines.length - 1))\n setView('preview')\n setSubmitError(null)\n } catch (error) {\n logError(error)\n setSubmitError(error instanceof Error ? error.message : String(error))\n }\n }, [cwd, selectedSession])\n\n const closePreview = useCallback(() => {\n setView('list')\n setPreviewLines(null)\n setPreviewScrollTop(0)\n }, [])\n\n const cycleTag = useCallback(\n (direction: 1 | -1) => {\n setTagFilterIndex(prev => {\n if (availableTags.length === 0) return 0\n const next =\n (prev + availableTags.length + direction) % availableTags.length\n return next\n })\n },\n [availableTags.length],\n )\n\n useKeypress(\n (inputChar, key) => {\n if (didSubmitRef.current) return true\n\n if (agenticSearch.status === 'searching') {\n if (key.escape || (key.ctrl && inputChar.toLowerCase() === 'c')) {\n cancelAgenticSearch()\n return true\n }\n return true\n }\n\n const input = inputChar.length === 1 ? inputChar : ''\n const lower = input.toLowerCase()\n const inputText = !key.ctrl && !key.meta && key.insertable ? inputChar : ''\n const sanitizedInput = inputText.replace(/[\\r\\n]+/g, ' ')\n\n if (view === 'rename') {\n if (key.escape || (key.ctrl && lower === 'c')) {\n setView('list')\n setSubmitError(null)\n return true\n }\n return\n }\n\n if (view === 'crossProject') {\n if (key.escape || (key.ctrl && lower === 'c')) {\n setView('list')\n setCrossProjectCommand(null)\n setCrossProjectCwd(null)\n setCrossProjectTitle(null)\n setCrossProjectCopyStatus(null)\n setSubmitError(null)\n return true\n }\n return\n }\n\n if (view === 'preview') {\n if (key.escape || (key.ctrl && lower === 'c')) {\n closePreview()\n return true\n }\n\n if (!previewWrapped) return true\n\n if (key.upArrow) {\n setPreviewScrollTop(prev => clamp(prev - 1, 0, previewMaxScrollTop))\n return true\n }\n if (key.downArrow) {\n setPreviewScrollTop(prev => clamp(prev + 1, 0, previewMaxScrollTop))\n return true\n }\n if (key.pageUp) {\n setPreviewScrollTop(prev =>\n clamp(prev - previewContentRows, 0, previewMaxScrollTop),\n )\n return true\n }\n if (key.pageDown) {\n setPreviewScrollTop(prev =>\n clamp(prev + previewContentRows, 0, previewMaxScrollTop),\n )\n return true\n }\n if (key.home || inputChar === 'g') {\n setPreviewScrollTop(0)\n return true\n }\n if (key.end || inputChar === 'G') {\n setPreviewScrollTop(previewMaxScrollTop)\n return true\n }\n\n return true\n }\n\n if (view === 'search') return false\n\n if (view !== 'list') return\n\n if (key.ctrl && lower === 'c') {\n close()\n return true\n }\n\n if (showAgenticSearchPrompt) {\n if (key.return) {\n setShowAgenticSearchPrompt(false)\n void startAgenticSearch()\n return true\n }\n if (key.downArrow) {\n setShowAgenticSearchPrompt(false)\n return true\n }\n if (key.upArrow) {\n setShowAgenticSearchPrompt(false)\n setView('search')\n setSearchCursorOffset(query.length)\n return true\n }\n if (key.escape) {\n setQuery('')\n setSearchCursorOffset(0)\n resetSelection()\n setShowAgenticSearchPrompt(false)\n setSubmitError(null)\n close()\n return true\n }\n }\n\n if (key.escape) {\n if (query.trim()) {\n setQuery('')\n setSearchCursorOffset(0)\n resetSelection()\n setSubmitError(null)\n return true\n }\n close()\n return true\n }\n\n if (!key.ctrl && !key.meta && input === '/') {\n setView('search')\n setSearchCursorOffset(query.length)\n setSubmitError(null)\n return true\n }\n\n if (key.ctrl && lower === 'a') {\n setShowAllProjects(prev => !prev)\n setShowAllWorktrees(false)\n resetSelection()\n setSubmitError(null)\n return true\n }\n\n if (key.ctrl && lower === 'b') {\n setBranchFilterEnabled(prev => !prev)\n resetSelection()\n setSubmitError(null)\n return true\n }\n\n if (key.ctrl && lower === 'w') {\n if (!canFilterWorktrees) return true\n setShowAllWorktrees(prev => !prev)\n setShowAllProjects(false)\n resetSelection()\n setSubmitError(null)\n return true\n }\n\n if (key.tab) {\n cycleTag(key.shift ? -1 : 1)\n resetSelection()\n setSubmitError(null)\n return true\n }\n\n if (key.ctrl && lower === 'v') {\n openPreview()\n return true\n }\n\n if (key.ctrl && lower === 'r') {\n startRename()\n return true\n }\n\n if (key.leftArrow && selectedRow && selectedRow.groupSize > 1) {\n const isExpanded = expandedGroups.has(selectedRow.groupKey)\n if (!isExpanded) return true\n\n setExpandedGroups(prev => {\n const next = new Set(prev)\n next.delete(selectedRow.groupKey)\n return next\n })\n\n if (selectedRow.indexInGroup > 0) {\n const headerIndex = rows.findIndex(\n row =>\n row.groupKey === selectedRow.groupKey && row.indexInGroup === 0,\n )\n if (headerIndex >= 0) setSelectedIndex(headerIndex)\n }\n\n return true\n }\n\n if (\n key.rightArrow &&\n selectedRow &&\n selectedRow.groupSize > 1 &&\n selectedRow.isGroupHeader\n ) {\n const isExpanded = expandedGroups.has(selectedRow.groupKey)\n if (isExpanded) return true\n\n setExpandedGroups(prev => {\n const next = new Set(prev)\n next.add(selectedRow.groupKey)\n return next\n })\n return true\n }\n\n if (key.return) {\n void submitSelection()\n return true\n }\n\n if (rows.length === 0) return\n\n if (key.upArrow) {\n if (clampedSelection === 0) {\n setView('search')\n setSubmitError(null)\n return true\n }\n\n setSelectedIndex(prev => clamp(prev - 1, 0, rows.length - 1))\n return true\n }\n\n if (key.downArrow) {\n setSelectedIndex(prev => clamp(prev + 1, 0, rows.length - 1))\n return true\n }\n\n if (key.pageUp) {\n setSelectedIndex(prev => clamp(prev - visibleRows, 0, rows.length - 1))\n return true\n }\n\n if (key.pageDown) {\n setSelectedIndex(prev => clamp(prev + visibleRows, 0, rows.length - 1))\n return true\n }\n\n if (key.home) {\n resetSelection()\n return true\n }\n\n if (key.end) {\n setSelectedIndex(Math.max(0, rows.length - 1))\n return true\n }\n\n if (sanitizedInput.trim()) {\n const nextQuery = sanitizedInput.trim()\n setQuery(nextQuery)\n setSearchCursorOffset(nextQuery.length)\n resetSelection()\n setView('search')\n setSubmitError(null)\n return true\n }\n },\n { priority: KEYPRESS_PRIORITY.FULLSCREEN_OVERLAY },\n )\n\n if (sessionList.length === 0) {\n return (\n <ScreenFrame\n title=\"Resume Session\"\n exitState={exitState}\n paddingX={layout.paddingX}\n paddingY={framePaddingY}\n gap={frameGap}\n >\n <Box flexDirection=\"column\" gap={frameGap}>\n <Text bold>No sessions found</Text>\n <Text dimColor>Press Esc to close.</Text>\n </Box>\n </ScreenFrame>\n )\n }\n\n if (view === 'preview' && previewWrapped && selectedSession) {\n const clampedTop = clamp(previewScrollTop, 0, previewMaxScrollTop)\n const visible = previewWrapped.slice(\n clampedTop,\n clampedTop + previewContentRows,\n )\n\n return (\n <ScreenFrame\n title=\"Session Preview\"\n exitState={exitState}\n paddingX={layout.paddingX}\n paddingY={framePaddingY}\n gap={frameGap}\n >\n <Box flexDirection=\"column\" gap={frameGap}>\n <Text dimColor wrap=\"truncate-end\">\n {getSessionDisplayName(selectedSession)}\n </Text>\n <Box flexDirection=\"column\">\n {visible.map((line, idx) => (\n <Text key={`${clampedTop}:${idx}`} wrap=\"truncate-end\">\n {line}\n </Text>\n ))}\n </Box>\n <Text dimColor wrap=\"truncate-end\">\n \u2191/\u2193 scroll \u00B7 PgUp/PgDn \u00B7 Home/End \u00B7 Esc close\n </Text>\n </Box>\n </ScreenFrame>\n )\n }\n\n if (view === 'crossProject' && crossProjectCommand && crossProjectCwd) {\n return (\n <ScreenFrame\n title=\"Resume Session\"\n exitState={exitState}\n paddingX={layout.paddingX}\n paddingY={framePaddingY}\n gap={frameGap}\n >\n <Box flexDirection=\"column\" gap={frameGap}>\n <Text bold>This conversation is from a different directory.</Text>\n {crossProjectTitle ? (\n <Text dimColor wrap=\"truncate-end\">\n {crossProjectTitle}\n </Text>\n ) : null}\n <Text dimColor wrap=\"truncate-end\">\n {crossProjectCwd}\n </Text>\n <Text dimColor>To resume, run:</Text>\n <Text wrap=\"wrap\">{crossProjectCommand}</Text>\n {crossProjectCopyStatus ? (\n <Text dimColor wrap=\"truncate-end\">\n {crossProjectCopyStatus}\n </Text>\n ) : (\n <Text dimColor wrap=\"truncate-end\">\n (Command copied to clipboard.)\n </Text>\n )}\n <Text dimColor wrap=\"truncate-end\">\n Esc back\n </Text>\n </Box>\n </ScreenFrame>\n )\n }\n\n if (view === 'rename' && selectedSession) {\n return (\n <ScreenFrame\n title=\"Rename Session\"\n exitState={exitState}\n paddingX={layout.paddingX}\n paddingY={framePaddingY}\n gap={frameGap}\n >\n <Box flexDirection=\"column\" gap={frameGap}>\n <Text dimColor wrap=\"truncate-end\">\n {selectedSession.sessionId}\n </Text>\n <TextInput\n placeholder=\"Enter new session name\u2026\"\n value={renameValue}\n onChange={value => {\n setRenameValue(value)\n setRenameCursorOffset(value.length)\n }}\n onSubmit={() => commitRename()}\n onExit={() => {\n setView('list')\n setSubmitError(null)\n }}\n columns={Math.max(10, layout.columns - layout.paddingX * 2 - 4)}\n cursorOffset={renameCursorOffset}\n onChangeCursorOffset={setRenameCursorOffset}\n showCursor={true}\n focus={true}\n />\n {submitError ? <Text color={theme.error}>{submitError}</Text> : null}\n <Text dimColor wrap=\"truncate-end\">\n Enter save \u00B7 Esc cancel\n </Text>\n </Box>\n </ScreenFrame>\n )\n }\n\n const scopeLabel = showAllProjects\n ? 'all projects'\n : showAllWorktrees\n ? 'all worktrees'\n : canFilterWorktrees\n ? 'current worktree'\n : 'current dir'\n\n const infoBits = [\n scopeLabel,\n branchFilterEnabled && currentBranch ? `branch:${currentBranch}` : null,\n activeTag !== 'All' ? `tag:${activeTag}` : null,\n ].filter(Boolean)\n\n const groupHint =\n selectedRow && selectedRow.groupSize > 1\n ? selectedRow.indexInGroup > 0 || expandedGroups.has(selectedRow.groupKey)\n ? `${figures.arrowLeft} to collapse`\n : `${figures.arrowRight} to expand`\n : null\n\n const showTagTabs = availableTags.length > 1\n const maxTabs = showTagTabs ? Math.min(availableTags.length, 7) : 0\n const tabStart = showTagTabs\n ? Math.min(\n Math.max(0, tagFilterIndex - Math.floor(maxTabs / 2)),\n Math.max(0, availableTags.length - maxTabs),\n )\n : 0\n const tabSlice = showTagTabs\n ? availableTags.slice(tabStart, tabStart + maxTabs)\n : []\n const hasHiddenLeft = showTagTabs && tabStart > 0\n const hasHiddenRight =\n showTagTabs && tabStart + maxTabs < availableTags.length\n\n const shortcutLine =\n agenticSearch.status === 'searching'\n ? ['Searching\u2026', 'Esc cancel'].join(' \u00B7 ')\n : showAgenticSearchPrompt\n ? [\n 'No matches',\n 'Enter semantic search',\n '\u2193 skip',\n 'Esc cancel',\n '\u2191 edit query',\n ].join(' \u00B7 ')\n : view === 'search'\n ? [\n 'Type to search',\n 'Enter done',\n '\u2193 done',\n 'Esc clear/back',\n 'Ctrl+C cancel',\n ].join(' \u00B7 ')\n : [\n 'Type to search',\n '/ search',\n '\u2191/\u2193 select',\n 'Enter resume',\n 'Esc cancel',\n 'Ctrl+V preview',\n 'Ctrl+R rename',\n ...(canFilterWorktrees ? ['Ctrl+W worktree'] : []),\n 'Ctrl+B branch',\n 'Ctrl+A scope',\n 'Tab tag',\n ...(groupHint ? [groupHint] : []),\n ].join(' \u00B7 ')\n\n const statusLineNode =\n agenticSearch.status === 'searching' ? (\n <Box flexDirection=\"row\" gap={1} paddingLeft={2}>\n <SimpleSpinner />\n <Text dimColor wrap=\"truncate-end\">\n Searching\u2026\n </Text>\n </Box>\n ) : agenticSearch.status === 'results' ? (\n agenticSearch.results.length > 0 ? (\n <Text dimColor italic wrap=\"truncate-end\">\n Model found these results:\n </Text>\n ) : (\n <Text dimColor italic wrap=\"truncate-end\">\n No matching sessions found.\n </Text>\n )\n ) : agenticSearch.status === 'error' ? (\n <Text dimColor italic wrap=\"truncate-end\">\n Semantic search failed: {agenticSearch.message}\n </Text>\n ) : query.trim() && filteredSessions.length === 0 ? (\n <Text dimColor italic wrap=\"truncate-end\">\n No matching sessions found.\n </Text>\n ) : (\n <Text dimColor wrap=\"truncate-end\">\n &nbsp;\n </Text>\n )\n\n return (\n <ScreenFrame\n title=\"Resume Session\"\n exitState={exitState}\n paddingX={layout.paddingX}\n paddingY={framePaddingY}\n gap={frameGap}\n >\n <Box flexDirection=\"column\" gap={frameGap}>\n {showTagTabs ? (\n <Box flexDirection=\"row\" gap={1}>\n {hasHiddenLeft ? <Text dimColor>{figures.ellipsis}</Text> : null}\n {tabSlice.map((tag, idx) => {\n const absoluteIndex = tabStart + idx\n const isSelected = absoluteIndex === tagFilterIndex\n const label = tag === 'All' ? 'All' : `#${tag}`\n return (\n <Text\n key={`${absoluteIndex}:${tag}`}\n bold={isSelected}\n color={isSelected ? theme.text : theme.secondaryText}\n wrap=\"truncate-end\"\n >\n {label}\n </Text>\n )\n })}\n {hasHiddenRight ? <Text dimColor>{figures.ellipsis}</Text> : null}\n </Box>\n ) : (\n <Text dimColor wrap=\"truncate-end\">\n &nbsp;\n </Text>\n )}\n\n <Text dimColor wrap=\"truncate-end\">\n {shortcutLine}\n </Text>\n\n {view === 'search' ? (\n <ResumeSearchInput\n query={query}\n cursorOffset={searchCursorOffset}\n onCursorOffsetChange={setSearchCursorOffset}\n onChange={handleSearchChange}\n onSubmit={handleSearchSubmit}\n onCancel={close}\n onExitSearch={handleSearchExit}\n onClear={handleSearchClear}\n onExitToList={handleSearchExitToList}\n isFocused={true}\n isTerminalFocused={true}\n theme={theme}\n width={Math.max(10, layout.columns - layout.paddingX * 2)}\n />\n ) : (\n <SearchBox\n query={query}\n isFocused={false}\n isTerminalFocused={true}\n />\n )}\n\n {infoBits.length > 0 ? (\n <Text dimColor wrap=\"truncate-end\">\n {infoBits.join(' \u00B7 ')}\n </Text>\n ) : (\n <Text dimColor wrap=\"truncate-end\">\n &nbsp;\n </Text>\n )}\n\n {statusLineNode}\n\n <ResumeSessionList\n visibleRowsList={visibleRowsList}\n window={window}\n clampedSelection={clampedSelection}\n visibleRows={visibleRows}\n theme={theme}\n expandedGroups={expandedGroups}\n showAllProjects={showAllProjects}\n showAllWorktrees={showAllWorktrees}\n />\n\n <Box paddingLeft={2} flexDirection=\"column\">\n <Text dimColor wrap=\"truncate-end\">\n {selectedSession\n ? ((selectedSession.summary ?? '').split('\\n')[0] ?? '')\n : ' '}\n </Text>\n </Box>\n\n <Text\n color={submitError ? theme.error : theme.secondaryText}\n wrap=\"truncate-end\"\n >\n {submitError ?? ' '}\n </Text>\n </Box>\n </ScreenFrame>\n )\n}\n", "import { resolve as resolvePath } from 'node:path'\n\nimport { clearContextCache, getContext } from '#core/context'\nimport { logError } from '#core/utils/log'\nimport { getCwd, setCwd } from '#core/utils/state'\nimport {\n refreshCustomCommandWatcher,\n reloadCustomCommandsForSession,\n} from '#cli-services/customCommands'\n\nexport async function switchCwdForResume(nextCwd: string): Promise<void> {\n const trimmed = nextCwd.trim()\n if (!trimmed) return\n\n const current = getCwd()\n if (resolvePath(current) === resolvePath(trimmed)) return\n\n try {\n process.chdir(trimmed)\n } catch {\n // best-effort\n }\n\n await setCwd(trimmed)\n\n try {\n clearContextCache()\n void getContext()\n } catch (error) {\n logError(error)\n }\n\n try {\n await reloadCustomCommandsForSession()\n } catch (error) {\n logError(error)\n }\n\n try {\n await refreshCustomCommandWatcher()\n } catch (error) {\n logError(error)\n }\n}\n", "import type { Command } from '../types'\n\nconst rewind = {\n type: 'local',\n name: 'rewind',\n aliases: ['checkpoint'],\n description: 'Restore the conversation to a previous point',\n isEnabled: true,\n isHidden: false,\n disableNonInteractive: true,\n async call(_args, context) {\n const open = context.options?.openMessageSelector\n if (!open) return 'Rewind is only available in interactive mode.'\n open()\n return ''\n },\n userFacingName() {\n return 'rewind'\n },\n} satisfies Command\n\nexport default rewind\n", "import type { Command } from '../types'\n\nimport React from 'react'\n\nimport { StatusScreen } from '#ui-ink/screens/overlays/StatusScreen'\n\nconst status = {\n type: 'local-jsx',\n name: 'status',\n description:\n 'Show status including version, model, account, API connectivity, and tool statuses',\n isEnabled: true,\n isHidden: false,\n ui: { displayMode: 'fullscreen' },\n disableNonInteractive: true,\n async call(onDone, context) {\n return React.createElement(StatusScreen, { context, onDone })\n },\n userFacingName() {\n return 'status'\n },\n} satisfies Command\n\nexport default status\n", "import React, { useEffect, useMemo, useState } from 'react'\nimport { Box, Text } from 'ink'\nimport figures from 'figures'\n\nimport { MACRO } from '#core/constants/macros'\nimport type { ToolUseContext } from '#core/tooling/Tool'\nimport { getDisableAllHooksState } from '#core/hooks/disableAllHooks'\nimport { getModelManager } from '#core/utils/model'\nimport { getTheme } from '#core/utils/theme'\nimport { getCwd } from '#core/utils/state'\nimport { getKodeAgentSessionId } from '#protocol/utils/kodeAgentSessionId'\nimport { useExitOnCtrlCD } from '#ui-ink/hooks/useExitOnCtrlCD'\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'\nimport { wrapLines } from '#ui-ink/primitives/text/wrapLines'\nimport type { ConnectionTestResult } from '#ui-ink/components/ModelSelector/flow/actions/connectionTest'\nimport { performConnectionTest } from '#ui-ink/components/ModelSelector/flow/actions/connectionTest'\n\ntype Props = {\n context: ToolUseContext\n onDone: (result?: string) => void\n}\n\ntype TabId = 'Status' | 'Models' | 'Tools' | 'MCP'\n\nconst TAB_ORDER: readonly TabId[] = ['Status', 'Models', 'Tools', 'MCP']\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n\nfunction formatConnectivity(result: ConnectionTestResult | null): string {\n if (!result) return 'not tested'\n if (result.success) return `ok (${result.endpoint ?? 'unknown endpoint'})`\n const detail = result.errorCategory ? ` ${result.errorCategory}` : ''\n return `failed${detail}`\n}\n\nfunction buildStatusLines(args: {\n context: ToolUseContext\n connectivity: ConnectionTestResult | null\n}): string[] {\n const cwd = getCwd()\n const hooks = getDisableAllHooksState({ projectDir: cwd })\n\n const tools = args.context.options?.tools ?? []\n const commands = args.context.options?.commands ?? []\n const mcpClients = args.context.options?.mcpClients ?? []\n\n const connectedMcp = mcpClients.filter((c: any) => c?.type === 'connected')\n const failedMcp = mcpClients.filter((c: any) => c?.type !== 'connected')\n\n const permissionMode =\n (args.context.options?.permissionMode as string | undefined) ?? '(default)'\n\n const lines: string[] = []\n lines.push('Session')\n lines.push(`- version: ${MACRO.VERSION || '(unknown)'}`)\n lines.push(`- session_id: ${getKodeAgentSessionId()}`)\n lines.push(`- cwd: ${cwd}`)\n lines.push(`- safe_mode: ${args.context.safeMode ? 'on' : 'off'}`)\n lines.push(`- permission_mode: ${permissionMode}`)\n\n lines.push('')\n lines.push('Connectivity')\n lines.push(`- api: ${formatConnectivity(args.connectivity)}`)\n\n lines.push('')\n lines.push('Hooks')\n lines.push(\n `- disableAllHooks: ${hooks.disabled ? 'true' : 'false'}${\n hooks.source ? ` (${hooks.source})` : ''\n }`,\n )\n\n lines.push('')\n lines.push('Tools')\n lines.push(`- tools: ${tools.length}`)\n lines.push(`- commands: ${commands.length}`)\n\n lines.push('')\n lines.push('MCP')\n lines.push(`- servers: ${mcpClients.length}`)\n lines.push(`- connected: ${connectedMcp.length}`)\n lines.push(`- failed: ${failedMcp.length}`)\n\n return lines\n}\n\nfunction buildModelsLines(): string[] {\n const modelManager = getModelManager()\n const pointers = ['main', 'task', 'compact', 'quick'] as const\n\n const lines: string[] = []\n lines.push('Model pointers')\n for (const pointer of pointers) {\n const profile = modelManager.getModel(pointer)\n if (!profile) {\n lines.push(`- ${pointer}: (not configured)`)\n continue\n }\n const provider = profile.provider ? ` (${profile.provider})` : ''\n const ctx = profile.contextLength\n ? `${Math.round(profile.contextLength / 1000)}k`\n : 'unknown'\n const status = profile.isActive ? 'active' : 'inactive'\n lines.push(\n `- ${pointer}: ${profile.name}${provider} \u00B7 ${profile.modelName} \u00B7 ctx ${ctx} \u00B7 ${status}`,\n )\n }\n\n return lines\n}\n\nfunction buildToolsLines(args: {\n context: ToolUseContext\n toolStatuses: Record<string, string>\n isCheckingTools: boolean\n}): string[] {\n const tools = args.context.options?.tools ?? []\n const lines: string[] = []\n lines.push(`Tools (${tools.length})`)\n if (tools.length === 0) {\n lines.push('- (none)')\n return lines\n }\n if (args.isCheckingTools) {\n lines.push('- checking tool status\u2026')\n lines.push('')\n }\n for (const tool of tools) {\n const name = String((tool as any)?.name ?? '')\n const status = args.toolStatuses[name] ?? 'unknown'\n lines.push(`- ${name}: ${status}`)\n }\n return lines\n}\n\nfunction buildMcpLines(context: ToolUseContext): string[] {\n const clients = (context.options?.mcpClients ?? []) as any[]\n const lines: string[] = []\n lines.push(`MCP servers (${clients.length})`)\n if (clients.length === 0) {\n lines.push('- (none)')\n return lines\n }\n for (const c of clients) {\n const name = typeof c?.name === 'string' ? c.name : '(unnamed)'\n const type = typeof c?.type === 'string' ? c.type : 'unknown'\n const info =\n c?.type === 'connected' && c?.serverInfo\n ? ` \u00B7 ${String(c.serverInfo.name ?? '')} ${String(c.serverInfo.version ?? '')}`.trim()\n : c?.type === 'failed' && c?.error\n ? ` \u00B7 ${String(c.error?.message ?? c.error)}`\n : ''\n lines.push(`- ${name}: ${type}${info}`)\n }\n return lines\n}\n\nexport function StatusScreen({ context, onDone }: Props): React.ReactNode {\n const theme = getTheme()\n const layout = useScreenLayout()\n const exitState = useExitOnCtrlCD(() => onDone('Status dialog dismissed'))\n\n const [tabIndex, setTabIndex] = useState(0)\n const [scrollTop, setScrollTop] = useState(0)\n const [connectivity, setConnectivity] = useState<ConnectionTestResult | null>(\n null,\n )\n const [isCheckingConnectivity, setIsCheckingConnectivity] = useState(false)\n const [isCheckingTools, setIsCheckingTools] = useState(false)\n const [toolStatuses, setToolStatuses] = useState<Record<string, string>>({})\n\n const tab = TAB_ORDER[Math.min(Math.max(0, tabIndex), TAB_ORDER.length - 1)]\n\n useEffect(() => {\n if (tab !== 'Tools') return\n const tools = context.options?.tools ?? []\n if (tools.length === 0) return\n let cancelled = false\n setIsCheckingTools(true)\n Promise.all(\n tools.map(async tool => {\n const name = String((tool as any)?.name ?? '')\n try {\n const enabled = await (tool as any)?.isEnabled?.()\n return [name, enabled === true ? 'enabled' : 'disabled'] as const\n } catch (err) {\n return [\n name,\n `error: ${err instanceof Error ? err.message : String(err)}`,\n ] as const\n }\n }),\n )\n .then(results => {\n if (cancelled) return\n setToolStatuses(Object.fromEntries(results))\n })\n .finally(() => {\n if (cancelled) return\n setIsCheckingTools(false)\n })\n return () => {\n cancelled = true\n }\n }, [context.options?.tools, tab])\n\n const tabLines = useMemo(() => {\n if (tab === 'Status') return buildStatusLines({ context, connectivity })\n if (tab === 'Models') return buildModelsLines()\n if (tab === 'Tools')\n return buildToolsLines({ context, toolStatuses, isCheckingTools })\n return buildMcpLines(context)\n }, [connectivity, context, isCheckingTools, tab, toolStatuses])\n\n const wrapped = useMemo(() => {\n const width = Math.max(1, layout.columns - layout.paddingX * 2)\n return wrapLines(tabLines, width)\n }, [layout.columns, layout.paddingX, tabLines])\n\n const frameHeaderRows = 1 + (exitState.pending ? 1 : 0)\n const frameRows = frameHeaderRows + 1 + layout.gap * 2 + layout.paddingY * 2\n const contentRows = Math.max(1, layout.rows - frameRows - 6)\n const maxScrollTop = Math.max(0, wrapped.length - contentRows)\n\n useKeypress(\n (input, key) => {\n const inputChar = input.length === 1 ? input : ''\n if (key.escape) {\n onDone('Status dialog dismissed')\n return true\n }\n if (key.leftArrow || inputChar === 'h') {\n setTabIndex(prev => {\n const next = Math.max(0, prev - 1)\n if (next !== prev) setScrollTop(0)\n return next\n })\n return true\n }\n if (key.rightArrow || inputChar === 'l') {\n setTabIndex(prev => {\n const next = Math.min(TAB_ORDER.length - 1, prev + 1)\n if (next !== prev) setScrollTop(0)\n return next\n })\n return true\n }\n if ((inputChar === 'c' || inputChar === 'C') && tab === 'Status') {\n if (isCheckingConnectivity) return true\n const model = getModelManager().getModel('main')\n if (!model) {\n setConnectivity({\n success: false,\n message: 'No model configured',\n details: 'Configure a model profile first',\n } as ConnectionTestResult)\n return true\n }\n setIsCheckingConnectivity(true)\n const providerBaseUrl = model.baseURL ?? ''\n const customBaseUrl = model.baseURL ?? ''\n performConnectionTest(\n {\n selectedProvider: model.provider as any,\n selectedModel: model.modelName,\n apiKey: model.apiKey,\n maxTokens: String(model.maxTokens),\n providerBaseUrl,\n customBaseUrl,\n resourceName: '',\n requestStrategy: model.requestStrategy ?? 'auto',\n },\n {\n onProgress: result => setConnectivity(result),\n },\n )\n .then(result => setConnectivity(result))\n .finally(() => setIsCheckingConnectivity(false))\n return true\n }\n if (key.upArrow || inputChar === 'k') {\n setScrollTop(prev => clamp(prev - 1, 0, maxScrollTop))\n return true\n }\n if (key.downArrow || inputChar === 'j') {\n setScrollTop(prev => clamp(prev + 1, 0, maxScrollTop))\n return true\n }\n if (key.pageUp) {\n setScrollTop(prev => clamp(prev - contentRows, 0, maxScrollTop))\n return true\n }\n if (key.pageDown) {\n setScrollTop(prev => clamp(prev + contentRows, 0, maxScrollTop))\n return true\n }\n if (key.home || inputChar === 'g') {\n setScrollTop(0)\n return true\n }\n if (key.end || inputChar === 'G') {\n setScrollTop(maxScrollTop)\n return true\n }\n },\n { priority: KEYPRESS_PRIORITY.FULLSCREEN_OVERLAY },\n )\n\n const clampedScrollTop = clamp(scrollTop, 0, maxScrollTop)\n const hiddenAbove = clampedScrollTop\n const hiddenBelow = Math.max(\n 0,\n wrapped.length - (clampedScrollTop + contentRows),\n )\n\n const visible = useMemo(\n () => wrapped.slice(clampedScrollTop, clampedScrollTop + contentRows),\n [clampedScrollTop, contentRows, wrapped],\n )\n\n const topIndicator = hiddenAbove\n ? `${figures.arrowUp} ${hiddenAbove} more`\n : ' '\n const bottomIndicator = hiddenBelow\n ? `${figures.arrowDown} ${hiddenBelow} more`\n : ' '\n\n const tabBar = (\n <Text wrap=\"truncate-end\">\n {TAB_ORDER.map((id, idx) => {\n const active = idx === tabIndex\n return (\n <Text\n key={id}\n color={active ? theme.kode : theme.secondaryText}\n bold={active}\n >\n {active ? `[${id}]` : ` ${id} `}\n </Text>\n )\n })}\n </Text>\n )\n\n return (\n <ScreenFrame\n title=\"Status\"\n exitState={exitState}\n paddingX={layout.paddingX}\n paddingY={layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\">\n <Text dimColor wrap=\"truncate-end\">\n Tabs: \u2190/\u2192 h/l \u00B7 c connectivity test \u00B7 Scroll: \u2191\u2193 j/k PgUp/PgDn\n Home/End \u00B7 Esc close\n </Text>\n {tabBar}\n {tab === 'Status' && isCheckingConnectivity ? (\n <Text dimColor wrap=\"truncate-end\">\n Checking connectivity\u2026\n </Text>\n ) : null}\n <Text dimColor wrap=\"truncate-end\">\n {topIndicator}\n </Text>\n {visible.length > 0 ? (\n visible.map((line, idx) => (\n <Text\n key={`${clampedScrollTop}:${idx}`}\n color={line.startsWith('- version:') ? theme.text : undefined}\n wrap=\"truncate-end\"\n >\n {line}\n </Text>\n ))\n ) : (\n <Text dimColor>(empty)</Text>\n )}\n <Text dimColor wrap=\"truncate-end\">\n {bottomIndicator}\n </Text>\n </Box>\n </ScreenFrame>\n )\n}\n", "import type { Command } from '../types'\n\nexport default {\n type: 'prompt',\n name: 'statusline',\n description: \"Set up Kode's status line UI\",\n isEnabled: true,\n isHidden: false,\n progressMessage: 'setting up statusLine',\n disableNonInteractive: true,\n allowedTools: ['Task', 'Read(~/**)', 'Edit(~/.kode/settings.json)'],\n userFacingName() {\n return 'statusline'\n },\n async getPromptForCommand(args) {\n const prompt =\n args.trim() || 'Configure my statusLine from my shell PS1 configuration'\n return [\n {\n role: 'user',\n content: [\n {\n type: 'text',\n text: `Create a Task with subagent_type \"statusline-setup\" and the prompt ${JSON.stringify(prompt)}`,\n },\n ],\n },\n ]\n },\n} satisfies Command\n", "import type { Command } from '../types'\n\nexport default {\n type: 'prompt',\n name: 'capabilities',\n description: 'Check and manage Kode capabilities via agent',\n isEnabled: true,\n isHidden: false,\n progressMessage: 'managing capabilities',\n disableNonInteractive: true,\n allowedTools: [\n 'Task',\n 'SlashCommand',\n 'Skill',\n 'Read(~/**)',\n 'Edit(~/.kode/settings.json)',\n 'Read(.kode/**)',\n 'Edit(.kode/**)',\n ],\n userFacingName() {\n return 'capabilities'\n },\n async getPromptForCommand(args) {\n const prompt =\n args.trim() ||\n [\n 'Run a Kode capabilities audit and auto-fix the basics with minimal friction.',\n '',\n 'Checklist to assess (report each as OK / Needs attention):',\n '- statusline (configured + renders)',\n '- output style (configured)',\n '- plugins & LSP readiness (configured/available)',\n '- permission friction (unexpected denials / repeated prompts)',\n '',\n 'Rules:',\n '- No hard install menus or long command lists.',\n '- Prefer agent-driven actions (Task/Skill/SlashCommand, file edits) and verify each change.',\n '- Keep the default output short; put verbose evidence/logs under a \u201CDetails\u201D section.',\n '',\n 'Then apply the minimal safe fixes you can without asking me to memorize subcommands; only ask a question when a choice is required.',\n ].join('\\n')\n return [\n {\n role: 'user',\n content: [\n {\n type: 'text',\n text: `Create a Task with subagent_type \"capabilities-manager\" and the prompt ${JSON.stringify(prompt)}`,\n },\n ],\n },\n ]\n },\n} satisfies Command\n", "import type { Command } from '../types'\nimport { getCwd } from '#core/utils/state'\nimport { getKodeAgentSessionId } from '#protocol/utils/kodeAgentSessionId'\nimport { appendSessionTagRecord } from '#protocol/utils/kodeAgentSessionLog'\n\nconst tag = {\n type: 'local',\n name: 'tag',\n description: 'Set a tag for the current session',\n isEnabled: true,\n isHidden: false,\n userFacingName() {\n return 'tag'\n },\n async call(args, _context) {\n const value = args.trim()\n if (!value) return 'Usage: /tag <tag>'\n\n appendSessionTagRecord({\n cwd: getCwd(),\n sessionId: getKodeAgentSessionId(),\n tag: value,\n })\n\n return `Session tagged as: ${value}`\n },\n} satisfies Command\n\nexport default tag\n", "import type { Command } from '../types'\nimport * as React from 'react'\nimport { TodosScreen } from '#ui-ink/screens/overlays/TodosScreen'\n\nconst todos = {\n type: 'local-jsx',\n name: 'todos',\n description: 'List current todo items',\n isEnabled: true,\n isHidden: false,\n ui: { displayMode: 'fullscreen' },\n async call(onDone, context) {\n return <TodosScreen agentId={context.agentId} onDone={onDone} />\n },\n userFacingName() {\n return 'todos'\n },\n} satisfies Command\n\nexport default todos\nexport function TodosViewForTests({\n agentId,\n onClose,\n}: {\n agentId?: string\n onClose: () => void\n}) {\n return <TodosScreen agentId={agentId} onDone={onClose} />\n}\n", "import React, { useMemo, useState } from 'react'\nimport { Box, Text } from 'ink'\nimport figures from 'figures'\n\nimport { getTodoRenderModel } from '#core/utils/todoRenderModel'\nimport { getTodos } from '#core/utils/todoStorage'\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'\nimport { getWindowedList } from '#ui-ink/primitives/list/windowedList'\n\nfunction TodosEmptyView({\n message,\n onClose,\n exitState,\n layout,\n}: {\n message: string\n onClose: () => void\n exitState: React.ComponentProps<typeof ScreenFrame>['exitState']\n layout: ReturnType<typeof useScreenLayout>\n}): React.ReactNode {\n useKeypress(\n (input, key) => {\n if (\n key.escape ||\n (key.ctrl && input === 'c') ||\n (key.ctrl && input === 't')\n ) {\n onClose()\n return true\n }\n },\n { priority: KEYPRESS_PRIORITY.FULLSCREEN_OVERLAY },\n )\n\n return (\n <ScreenFrame\n title=\"Todos\"\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>{message}</Text>\n <Text dimColor wrap=\"truncate-end\">\n Esc or Ctrl+C to close\n </Text>\n </Box>\n </ScreenFrame>\n )\n}\n\nfunction TodosListView({\n items,\n count,\n label,\n exitState,\n onClose,\n}: {\n items: Array<{\n checkbox: '\u2610' | '\u2612'\n checkboxDim: boolean\n content: string\n contentBold: boolean\n contentDim: boolean\n contentStrikethrough: boolean\n }>\n count: number\n label: string\n exitState: React.ComponentProps<typeof ScreenFrame>['exitState']\n onClose: () => void\n}): React.ReactNode {\n const theme = getTheme()\n const layout = useScreenLayout()\n const [selectedIndex, setSelectedIndex] = useState(0)\n\n const reservedLines =\n (layout.tightLayout ? 7 : layout.compactLayout ? 9 : 11) +\n layout.paddingY * 2 +\n layout.gap * 3\n const maxVisible = Math.max(3, layout.rows - reservedLines - 1)\n const window = useMemo(\n () =>\n getWindowedList({\n itemCount: items.length,\n focusIndex: selectedIndex,\n maxVisible,\n indicatorRows: 2,\n }),\n [items.length, maxVisible, selectedIndex],\n )\n\n const visibleItems = useMemo(\n () => items.slice(window.start, window.end),\n [items, window.end, window.start],\n )\n\n useKeypress(\n (input, key) => {\n const inputChar = input.length === 1 ? input : ''\n\n if (\n key.escape ||\n (key.ctrl && input === 'c') ||\n (key.ctrl && input === 't')\n ) {\n onClose()\n return true\n }\n\n if (key.upArrow || inputChar === 'k') {\n setSelectedIndex(prev => Math.max(0, prev - 1))\n return true\n }\n if (key.downArrow || inputChar === 'j') {\n setSelectedIndex(prev => Math.min(items.length - 1, prev + 1))\n return true\n }\n\n if (key.pageUp) {\n setSelectedIndex(prev => Math.max(0, prev - window.visibleCount))\n return true\n }\n if (key.pageDown) {\n setSelectedIndex(prev =>\n Math.min(items.length - 1, prev + window.visibleCount),\n )\n return true\n }\n\n if (key.home || inputChar === 'g') {\n setSelectedIndex(0)\n return true\n }\n if (key.end || inputChar === 'G') {\n setSelectedIndex(Math.max(0, items.length - 1))\n return true\n }\n },\n { priority: KEYPRESS_PRIORITY.FULLSCREEN_OVERLAY },\n )\n\n return (\n <ScreenFrame\n title=\"Todos\"\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 {count} {label}:\n </Text>\n\n <Box flexDirection=\"column\" width=\"100%\">\n <Text dimColor wrap=\"truncate-end\">\n {window.showUpIndicator ? `${figures.arrowUp} More` : ' '}\n </Text>\n {visibleItems.map((item, idx) => {\n const absoluteIndex = window.start + idx\n const isSelected = absoluteIndex === selectedIndex\n return (\n <Box key={absoluteIndex} flexDirection=\"row\" gap={1}>\n <Text color={isSelected ? theme.kode : theme.secondaryText}>\n {isSelected ? figures.pointer : ' '}\n </Text>\n <Text dimColor={item.checkboxDim}>{item.checkbox}</Text>\n <Text\n bold={item.contentBold || isSelected}\n dimColor={item.contentDim && !isSelected}\n strikethrough={item.contentStrikethrough}\n color={isSelected ? theme.text : undefined}\n wrap=\"truncate-end\"\n >\n {item.content.replace(/\\s+/g, ' ')}\n </Text>\n </Box>\n )\n })}\n <Text dimColor wrap=\"truncate-end\">\n {window.showDownIndicator ? `${figures.arrowDown} More` : ' '}\n </Text>\n </Box>\n\n <Text dimColor wrap=\"truncate-end\">\n \u2191/\u2193 or j/k \u00B7 PgUp/PgDn \u00B7 Home/End \u00B7 Esc/Ctrl+C close\n </Text>\n </Box>\n </ScreenFrame>\n )\n}\n\nexport function TodosScreen({\n agentId,\n onDone,\n}: {\n agentId?: string\n onDone: () => void\n}): React.ReactNode {\n const layout = useScreenLayout()\n const exitState = { pending: false, keyName: null } as const\n\n const todos = getTodos(agentId)\n const model = getTodoRenderModel(todos)\n\n if (model.kind === 'empty') {\n return (\n <TodosEmptyView\n message={model.message}\n onClose={onDone}\n exitState={exitState}\n layout={layout}\n />\n )\n }\n\n const count = model.items.length\n const label = count === 1 ? 'todo' : 'todos'\n\n return (\n <TodosListView\n items={model.items}\n count={count}\n label={label}\n exitState={exitState}\n onClose={onDone}\n />\n )\n}\n", "import type { Command } from '../types'\n\nimport React from 'react'\n\nimport { TasksScreen } from '#ui-ink/screens/overlays/TasksScreen'\n\nconst tasks = {\n type: 'local-jsx',\n name: 'tasks',\n description: 'Manage background tasks',\n isEnabled: true,\n isHidden: false,\n ui: { displayMode: 'fullscreen' },\n disableNonInteractive: true,\n aliases: ['task'],\n async call(onDone) {\n return React.createElement(TasksScreen, { onDone })\n },\n userFacingName() {\n return 'tasks'\n },\n} satisfies Command\n\nexport default tasks\n", "import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { Box, Text } from 'ink'\n\nimport { BunShell } from '#runtime/shell'\nimport { getTaskOutputFilePath } from '#runtime/taskOutputStore'\nimport {\n killBackgroundAgentTask,\n listBackgroundAgentTaskSnapshots,\n type BackgroundAgentStatus,\n type BackgroundAgentTask,\n} from '#core/utils/backgroundTasks'\nimport { getCwd } from '#core/utils/state'\nimport { getTheme } from '#core/utils/theme'\nimport { getKodeAgentSessionId } from '#protocol/utils/kodeAgentSessionId'\nimport { getAgentLogFilePath } from '#protocol/utils/kodeAgentSessionLog'\nimport { launchExternalEditorForFilePath } from '#cli-utils/externalEditor'\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\nconst VIEWPORT_SAFE_MARGIN_ROWS = 1\nconst INDICATOR_ROWS = 2\nconst REFRESH_INTERVAL_MS = 250\n\ntype ShellTaskStatus = 'running' | 'completed' | 'failed' | 'killed'\n\ntype ShellTaskSummary = {\n id: string\n command: string\n status: ShellTaskStatus\n exitCode: number | null\n}\n\ntype TreeNode =\n | {\n kind: 'group'\n id: string\n label: string\n status: BackgroundAgentStatus | ShellTaskStatus | null\n children: TreeNode[]\n }\n | {\n kind: 'agent'\n task: BackgroundAgentTask\n children: TreeNode[]\n }\n | {\n kind: 'shell'\n task: ShellTaskSummary\n }\n\ntype FlatItem =\n | {\n kind: 'group'\n id: string\n depth: number\n label: string\n status: BackgroundAgentStatus | ShellTaskStatus | null\n hasChildren: boolean\n }\n | {\n kind: 'agent'\n id: string\n depth: number\n task: BackgroundAgentTask\n hasChildren: boolean\n }\n | {\n kind: 'shell'\n id: string\n depth: number\n task: ShellTaskSummary\n }\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n\nfunction firstLine(text: string, maxLen: number): string {\n const line = text.split(/\\r?\\n/)[0] ?? ''\n const trimmed = line.trim()\n if (trimmed.length <= maxLen) return trimmed\n return trimmed.slice(0, maxLen - 1) + '\u2026'\n}\n\nfunction rankStatus(status: BackgroundAgentStatus | ShellTaskStatus): number {\n switch (status) {\n case 'running':\n return 0\n case 'failed':\n return 1\n case 'killed':\n return 2\n case 'completed':\n return 3\n }\n}\n\nfunction aggregateStatus(\n statuses: Array<BackgroundAgentStatus | ShellTaskStatus>,\n): BackgroundAgentStatus | ShellTaskStatus | null {\n if (statuses.length === 0) return null\n return (\n statuses.slice().sort((a, b) => rankStatus(a) - rankStatus(b))[0] ?? null\n )\n}\n\nfunction statusLabel(\n status: BackgroundAgentStatus | ShellTaskStatus | null,\n): string {\n return status ?? 'idle'\n}\n\nfunction statusIcon(\n status: BackgroundAgentStatus | ShellTaskStatus | null,\n): string {\n switch (status) {\n case 'running':\n return '\u25CF'\n case 'completed':\n return '\u2713'\n case 'failed':\n return '\u2717'\n case 'killed':\n return '\u2A2F'\n default:\n return '\u00B7'\n }\n}\n\nfunction shellStatusFromRuntime(task: {\n code: number | null\n killed: boolean\n interrupted: boolean\n}): ShellTaskStatus {\n if (task.killed) return 'killed'\n if (task.code === null && !task.interrupted) return 'running'\n return task.code === 0 ? 'completed' : 'failed'\n}\n\nfunction buildShellSummaries(): ShellTaskSummary[] {\n const shell = BunShell.getInstance()\n const tasks = shell.listBackgroundShells()\n return tasks.map(t => ({\n id: t.id,\n command: t.command,\n status: shellStatusFromRuntime(t),\n exitCode: t.code,\n }))\n}\n\nfunction buildAgentTree(tasks: BackgroundAgentTask[]): TreeNode | null {\n if (tasks.length === 0) return null\n\n const byId = new Map<string, BackgroundAgentTask>()\n for (const task of tasks) byId.set(task.agentId, task)\n\n const childrenByParent = new Map<string, BackgroundAgentTask[]>()\n for (const task of tasks) {\n const rawParent = task.parentAgentId\n const effectiveParent =\n !rawParent || rawParent === 'main' || !byId.has(rawParent)\n ? 'main'\n : rawParent\n const list = childrenByParent.get(effectiveParent) ?? []\n list.push(task)\n childrenByParent.set(effectiveParent, list)\n }\n\n for (const list of childrenByParent.values()) {\n list.sort((a, b) => a.startedAt - b.startedAt)\n }\n\n const visited = new Set<string>()\n const buildChildren = (parentId: string): TreeNode[] => {\n const children = childrenByParent.get(parentId) ?? []\n const out: TreeNode[] = []\n for (const child of children) {\n if (visited.has(child.agentId)) continue\n visited.add(child.agentId)\n const grand = buildChildren(child.agentId)\n out.push({ kind: 'agent', task: child, children: grand })\n }\n return out\n }\n\n const mainChildren = buildChildren('main')\n const mainStatus = aggregateStatus(\n mainChildren.flatMap(node =>\n node.kind === 'agent' ? [node.task.status] : [],\n ),\n )\n\n return {\n kind: 'group',\n id: 'main',\n label: 'main',\n status: mainStatus,\n children: mainChildren,\n }\n}\n\nfunction buildTasksTree(args: {\n agentTasks: BackgroundAgentTask[]\n shellTasks: ShellTaskSummary[]\n}): TreeNode[] {\n const out: TreeNode[] = []\n\n const agentRoot = buildAgentTree(args.agentTasks)\n if (agentRoot) out.push(agentRoot)\n\n if (args.shellTasks.length > 0) {\n const status = aggregateStatus(args.shellTasks.map(t => t.status))\n out.push({\n kind: 'group',\n id: '__shell__',\n label: 'shell',\n status,\n children: args.shellTasks\n .slice()\n .sort((a, b) => rankStatus(a.status) - rankStatus(b.status))\n .map(t => ({ kind: 'shell', task: t })),\n })\n }\n\n return out\n}\n\nexport function __flattenTasksTreeForTests(args: {\n nodes: TreeNode[]\n collapsedIds: Set<string>\n}): FlatItem[] {\n const out: FlatItem[] = []\n\n const walk = (node: TreeNode, depth: number) => {\n if (node.kind === 'group') {\n const hasChildren = node.children.length > 0\n out.push({\n kind: 'group',\n id: node.id,\n depth,\n label: node.label,\n status: node.status,\n hasChildren,\n })\n if (hasChildren && !args.collapsedIds.has(node.id)) {\n for (const child of node.children) walk(child, depth + 1)\n }\n return\n }\n\n if (node.kind === 'agent') {\n const hasChildren = node.children.length > 0\n out.push({\n kind: 'agent',\n id: node.task.agentId,\n depth,\n task: node.task,\n hasChildren,\n })\n if (hasChildren && !args.collapsedIds.has(node.task.agentId)) {\n for (const child of node.children) walk(child, depth + 1)\n }\n return\n }\n\n out.push({ kind: 'shell', id: node.task.id, depth, task: node.task })\n }\n\n for (const node of args.nodes) walk(node, 0)\n return out\n}\n\nexport function __buildFlatLinesForTests(args: {\n items: FlatItem[]\n selectedIndex: number\n collapsedIds: Set<string>\n maxWidth: number\n}): Array<{\n key: string\n isSelected: boolean\n status: BackgroundAgentStatus | ShellTaskStatus | null\n text: string\n}> {\n const out: Array<{\n key: string\n isSelected: boolean\n status: BackgroundAgentStatus | ShellTaskStatus | null\n text: string\n }> = []\n\n const indentFor = (depth: number) => ' '.repeat(Math.max(0, depth))\n\n for (let i = 0; i < args.items.length; i++) {\n const item = args.items[i]!\n const isSelected = i === args.selectedIndex\n\n if (item.kind === 'group') {\n const caret = item.hasChildren\n ? args.collapsedIds.has(item.id)\n ? '\u25B8'\n : '\u25BE'\n : ' '\n const label = `${caret} ${statusIcon(item.status)} ${item.label} (${statusLabel(item.status)})`\n out.push({\n key: `group:${item.id}`,\n isSelected,\n status: item.status,\n text: `${indentFor(item.depth)}${label}`,\n })\n continue\n }\n\n if (item.kind === 'shell') {\n const label = `${statusIcon(item.task.status)} ${firstLine(item.task.command, 90)}`\n out.push({\n key: `shell:${item.task.id}`,\n isSelected,\n status: item.task.status,\n text: `${indentFor(item.depth)}${label}`,\n })\n continue\n }\n\n const caret = item.hasChildren\n ? args.collapsedIds.has(item.task.agentId)\n ? '\u25B8'\n : '\u25BE'\n : ' '\n\n const status = item.task.status\n const errorHint =\n status === 'failed' && item.task.error\n ? ` \u2014 ${firstLine(item.task.error, 80)}`\n : ''\n const label = `${caret} ${statusIcon(status)} ${firstLine(item.task.description, 90)}${errorHint}`\n\n out.push({\n key: `agent:${item.task.agentId}`,\n isSelected,\n status,\n text: `${indentFor(item.depth)}${label}`,\n })\n }\n\n // truncate for safety\n return out.map(row => ({\n ...row,\n text:\n row.text.length > args.maxWidth\n ? row.text.slice(0, args.maxWidth - 1) + '\u2026'\n : row.text,\n }))\n}\n\nfunction isRunningLeaf(item: FlatItem): boolean {\n if (item.kind === 'agent') return item.task.status === 'running'\n if (item.kind === 'shell') return item.task.status === 'running'\n return false\n}\n\nexport function __getPreferredSelectedIndexForTests(args: {\n items: FlatItem[]\n currentIndex: number\n}): number {\n const leafIndices: number[] = []\n const runningLeafIndices: number[] = []\n\n for (let i = 0; i < args.items.length; i++) {\n const item = args.items[i]!\n if (item.kind === 'group') continue\n leafIndices.push(i)\n if (isRunningLeaf(item)) runningLeafIndices.push(i)\n }\n\n if (leafIndices.length === 0) return 0\n if (leafIndices.length === 1) return leafIndices[0]!\n if (runningLeafIndices.length === 1) return runningLeafIndices[0]!\n if (args.currentIndex === 0 && runningLeafIndices.length > 0) {\n return runningLeafIndices[0]!\n }\n\n return args.currentIndex\n}\n\nexport function TasksScreen({\n onDone,\n}: {\n onDone: (result?: string) => void\n}): 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 (result?: string) => {\n if (didDoneRef.current) return\n didDoneRef.current = true\n onDone(result)\n },\n [onDone],\n )\n\n const [collapsedIds, setCollapsedIds] = useState<Set<string>>(() => new Set())\n const [status, setStatus] = useState<string | null>(null)\n const [selectedIndex, setSelectedIndex] = useState(0)\n const [scrollTop, setScrollTop] = useState(0)\n const userMovedSelectionRef = useRef(false)\n\n const [tick, setTick] = useState(0)\n useEffect(() => {\n const interval = setInterval(() => setTick(t => t + 1), REFRESH_INTERVAL_MS)\n return () => clearInterval(interval)\n }, [])\n\n const refresh = useCallback(() => {\n setTick(t => t + 1)\n setStatus('Refreshed')\n }, [])\n\n const { agentTasks, shellTasks } = useMemo(() => {\n return {\n agentTasks: listBackgroundAgentTaskSnapshots(),\n shellTasks: buildShellSummaries(),\n }\n }, [tick])\n\n const nodes = useMemo(\n () =>\n buildTasksTree({\n agentTasks,\n shellTasks,\n }),\n [agentTasks, shellTasks],\n )\n\n const flatItems = useMemo(\n () =>\n __flattenTasksTreeForTests({\n nodes,\n collapsedIds,\n }),\n [collapsedIds, nodes],\n )\n\n const frameHeaderRows = 1\n const frameRows = frameHeaderRows + 1 + layout.gap * 2 + layout.paddingY * 2\n const detailRows = layout.tightLayout ? 2 : 3\n const innerReservedRows =\n 1 + // description\n 1 + // shortcut line\n detailRows +\n 1 + // status line\n 1 + // tip line\n INDICATOR_ROWS\n\n const contentRows = Math.max(\n 1,\n layout.rows - frameRows - innerReservedRows - VIEWPORT_SAFE_MARGIN_ROWS,\n )\n\n useEffect(() => {\n setSelectedIndex(prev => clamp(prev, 0, Math.max(0, flatItems.length - 1)))\n }, [flatItems.length])\n\n useEffect(() => {\n setSelectedIndex(prev => {\n if (userMovedSelectionRef.current) return prev\n const preferred = __getPreferredSelectedIndexForTests({\n items: flatItems,\n currentIndex: prev,\n })\n return clamp(preferred, 0, Math.max(0, flatItems.length - 1))\n })\n }, [flatItems])\n\n useEffect(() => {\n setScrollTop(prev => {\n const maxScrollTop = Math.max(0, flatItems.length - contentRows)\n const target = clamp(prev, 0, maxScrollTop)\n if (selectedIndex < target) return selectedIndex\n if (selectedIndex >= target + contentRows) {\n return clamp(selectedIndex - contentRows + 1, 0, maxScrollTop)\n }\n return target\n })\n }, [contentRows, flatItems.length, selectedIndex])\n\n const toggleCollapse = useCallback((id: string) => {\n setCollapsedIds(prev => {\n const next = new Set(prev)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n return next\n })\n }, [])\n\n const selected = flatItems[selectedIndex] ?? null\n\n const openOutput = useCallback(async () => {\n if (!selected || selected.kind === 'group') return\n\n const outputPath = getTaskOutputFilePath(selected.id)\n const result = await launchExternalEditorForFilePath(outputPath)\n if (result.ok === true) {\n setStatus(`Opened output in ${result.editorLabel}`)\n } else {\n setStatus(result.error.message || 'Failed to open output file')\n }\n }, [selected])\n\n const openLog = useCallback(async () => {\n if (!selected || selected.kind !== 'agent') return\n\n const logPath = getAgentLogFilePath({\n cwd: getCwd(),\n sessionId: getKodeAgentSessionId(),\n agentId: selected.id,\n })\n const result = await launchExternalEditorForFilePath(logPath)\n if (result.ok === true) {\n setStatus(`Opened log in ${result.editorLabel}`)\n } else {\n setStatus(result.error.message || 'Failed to open log file')\n }\n }, [selected])\n\n const killSelected = useCallback(() => {\n if (!selected || selected.kind === 'group') return\n\n if (selected.kind === 'shell') {\n const killed = BunShell.getInstance().killBackgroundShell(selected.id)\n setStatus(\n killed ? `Killed shell task: ${selected.id}` : 'Task not running',\n )\n return\n }\n\n const killed = killBackgroundAgentTask(selected.id)\n setStatus(killed ? `Killed agent task: ${selected.id}` : 'Task not running')\n }, [selected])\n\n useKeypress(\n (input, key) => {\n if (key.escape || (key.ctrl && input === 'c')) {\n safeOnDone()\n return true\n }\n\n if (key.upArrow) {\n userMovedSelectionRef.current = true\n setSelectedIndex(prev =>\n clamp(prev - 1, 0, Math.max(0, flatItems.length - 1)),\n )\n return true\n }\n\n if (key.downArrow) {\n userMovedSelectionRef.current = true\n setSelectedIndex(prev =>\n clamp(prev + 1, 0, Math.max(0, flatItems.length - 1)),\n )\n return true\n }\n\n if (key.leftArrow) {\n if (!selected) return true\n const id =\n selected.kind === 'agent'\n ? selected.id\n : selected.kind === 'group'\n ? selected.id\n : null\n if (id && !collapsedIds.has(id)) toggleCollapse(id)\n return true\n }\n\n if (key.rightArrow) {\n if (!selected) return true\n const id =\n selected.kind === 'agent'\n ? selected.id\n : selected.kind === 'group'\n ? selected.id\n : null\n if (id && collapsedIds.has(id)) toggleCollapse(id)\n return true\n }\n\n if (key.return || input === ' ') {\n if (!selected) return true\n const id =\n selected.kind === 'agent'\n ? selected.id\n : selected.kind === 'group'\n ? selected.id\n : null\n if (id) toggleCollapse(id)\n return true\n }\n\n if (input === 'r') {\n refresh()\n return true\n }\n\n if (input === 'k') {\n killSelected()\n return true\n }\n\n if (input === 'o') {\n void openOutput()\n return true\n }\n\n if (input === 'l') {\n void openLog()\n return true\n }\n },\n { priority: KEYPRESS_PRIORITY.FULLSCREEN_OVERLAY },\n )\n\n const hiddenAbove = scrollTop\n const hiddenBelow = Math.max(0, flatItems.length - (scrollTop + contentRows))\n const topIndicator = hiddenAbove ? `... ${hiddenAbove} hidden ...` : ''\n const bottomIndicator = hiddenBelow ? `... ${hiddenBelow} hidden ...` : ''\n\n const width = Math.max(1, layout.columns - layout.paddingX * 2)\n const visible = useMemo(\n () =>\n __buildFlatLinesForTests({\n items: flatItems.slice(scrollTop, scrollTop + contentRows),\n selectedIndex: selectedIndex - scrollTop,\n collapsedIds,\n maxWidth: width,\n }),\n [collapsedIds, contentRows, flatItems, scrollTop, selectedIndex, width],\n )\n\n const shortcutLine =\n '\u2191/\u2193 select \u00B7 \u2190/\u2192 collapse \u00B7 enter toggle \u00B7 k kill \u00B7 o open output \u00B7 l open log \u00B7 esc close'\n\n const detailLines: string[] = []\n if (!selected) {\n detailLines.push('No background tasks')\n } else if (selected.kind === 'group') {\n detailLines.push(`${selected.label} (${statusLabel(selected.status)})`)\n } else if (selected.kind === 'shell') {\n detailLines.push(`Shell: ${selected.id} (${selected.task.status})`)\n detailLines.push(`output: ${getTaskOutputFilePath(selected.id)}`)\n } else {\n detailLines.push(`Agent: ${selected.id} (${selected.task.status})`)\n detailLines.push(`output: ${getTaskOutputFilePath(selected.id)}`)\n if (!layout.tightLayout) {\n detailLines.push(\n `log: ${getAgentLogFilePath({\n cwd: getCwd(),\n sessionId: getKodeAgentSessionId(),\n agentId: selected.id,\n })}`,\n )\n }\n }\n\n const totalTasks = agentTasks.length + shellTasks.length\n const runningTasks =\n agentTasks.filter(t => t.status === 'running').length +\n shellTasks.filter(t => t.status === 'running').length\n\n const statusLine =\n status ??\n (totalTasks > 0\n ? `Tasks: ${runningTasks} running \u00B7 ${totalTasks} total`\n : 'No background tasks')\n\n const tipLine =\n 'Tip: background task output is saved per task ID (no overwrites)'\n\n return (\n <ScreenFrame\n title=\"Tasks\"\n exitState={exitState}\n paddingX={layout.paddingX}\n paddingY={layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\">\n <Text dimColor wrap=\"truncate-end\">\n Manage background tasks (agents + shells) and jump to their artifacts\n </Text>\n <Text dimColor wrap=\"truncate-end\">\n {shortcutLine}\n </Text>\n\n <Box flexDirection=\"column\" marginTop={layout.gap}>\n <Text dimColor wrap=\"truncate-end\">\n {topIndicator}\n </Text>\n {visible.length > 0 ? (\n visible.map(row => (\n <Text\n key={row.key}\n color={\n row.isSelected\n ? theme.text\n : row.status === 'failed'\n ? theme.error\n : row.status === 'running'\n ? theme.warning\n : theme.secondaryText\n }\n wrap=\"truncate-end\"\n >\n {row.isSelected ? `> ${row.text}` : ` ${row.text}`}\n </Text>\n ))\n ) : (\n <Text color={theme.secondaryText} wrap=\"truncate-end\">\n (No background tasks)\n </Text>\n )}\n <Text dimColor wrap=\"truncate-end\">\n {bottomIndicator}\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" marginTop={layout.gap}>\n {detailLines.slice(0, detailRows).map((line, idx) => (\n <Text key={idx} dimColor wrap=\"truncate-end\">\n {line}\n </Text>\n ))}\n </Box>\n\n <Box flexDirection=\"column\" marginTop={layout.gap}>\n <Text dimColor wrap=\"truncate-end\">\n {statusLine}\n </Text>\n <Text dimColor wrap=\"truncate-end\">\n {tipLine}\n </Text>\n </Box>\n </Box>\n </ScreenFrame>\n )\n}\n", "import type { Command } from '../types'\n\nimport React from 'react'\n\nimport { TerminalSetupScreen } from '#ui-ink/screens/overlays/TerminalSetupScreen'\n\nconst terminalSetup = {\n type: 'local-jsx',\n name: 'terminal-setup',\n description: 'Set up Shift+Enter / Option+Enter for multi-line input',\n isEnabled: true,\n isHidden: false,\n ui: { displayMode: 'fullscreen' },\n disableNonInteractive: true,\n async call(onDone) {\n return React.createElement(TerminalSetupScreen, { onDone })\n },\n userFacingName() {\n return 'terminal-setup'\n },\n} satisfies Command\n\nexport default terminalSetup\n", "import React, { useEffect, useMemo, useState } from 'react'\nimport { Box, Text } from 'ink'\n\nimport { getTheme } from '#core/utils/theme'\nimport { useExitOnCtrlCD } from '#ui-ink/hooks/useExitOnCtrlCD'\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'\nimport { wrapLines } from '#ui-ink/primitives/text/wrapLines'\nimport { terminalCapabilityManager } from '#ui-ink/utils/terminalCapabilityManager'\n\ntype Props = {\n onDone: (result?: string) => void\n}\n\nfunction detectTerminalName(): string | null {\n const termProgram = process.env.TERM_PROGRAM\n if (termProgram && termProgram.trim()) return termProgram.trim()\n const term = process.env.TERM\n if (term && term.trim()) return term.trim()\n return null\n}\n\ntype TerminalCapabilities = {\n terminalName?: string\n tty: boolean\n kittySupported: boolean\n kittyEnabled: boolean\n modifyOtherKeysSupported: boolean\n modifyOtherKeysEnabled: boolean\n bracketedPasteSupported: boolean\n bracketedPasteEnabled: boolean\n}\n\nfunction snapshotCapabilities(): TerminalCapabilities {\n return {\n terminalName:\n terminalCapabilityManager.getTerminalName() ??\n detectTerminalName() ??\n undefined,\n tty: Boolean(process.stdin.isTTY && process.stdout.isTTY),\n kittySupported: terminalCapabilityManager.isKittyProtocolSupported(),\n kittyEnabled: terminalCapabilityManager.isKittyProtocolEnabled(),\n modifyOtherKeysSupported:\n terminalCapabilityManager.isModifyOtherKeysSupported(),\n modifyOtherKeysEnabled:\n terminalCapabilityManager.isModifyOtherKeysEnabled(),\n bracketedPasteSupported:\n terminalCapabilityManager.isBracketedPasteSupported(),\n bracketedPasteEnabled: terminalCapabilityManager.isBracketedPasteEnabled(),\n }\n}\n\nfunction buildTerminalSetupLines(capabilities: TerminalCapabilities): string[] {\n const lines: string[] = []\n lines.push('Terminal setup')\n lines.push(`- terminal: ${capabilities.terminalName ?? '(unknown)'}`)\n lines.push(`- tty: ${capabilities.tty ? 'yes' : 'no'}`)\n lines.push('')\n lines.push('Capabilities')\n lines.push(\n `- kitty keyboard protocol: ${capabilities.kittySupported ? 'supported' : 'no'} (${capabilities.kittyEnabled ? 'enabled' : 'disabled'})`,\n )\n lines.push(\n `- modifyOtherKeys: ${capabilities.modifyOtherKeysSupported ? 'supported' : 'no'} (${capabilities.modifyOtherKeysEnabled ? 'enabled' : 'disabled'})`,\n )\n lines.push(\n `- bracketed paste: ${capabilities.bracketedPasteSupported ? 'supported' : 'no'} (${capabilities.bracketedPasteEnabled ? 'enabled' : 'disabled'})`,\n )\n\n lines.push('')\n lines.push('Multi-line input')\n lines.push(\n '- Shift+Enter inserts a newline (when your terminal sends modified Enter)',\n )\n lines.push(\n '- If Shift+Enter does not work, use an external editor or enable a terminal keyboard protocol that supports modified keys',\n )\n lines.push('')\n lines.push('Notes')\n lines.push(\n '- iTerm2, WezTerm, Ghostty, and Kitty typically support Shift+Enter',\n )\n lines.push('- In Apple Terminal, Option+Enter is commonly used for newlines')\n lines.push('')\n lines.push('Keys')\n lines.push('- r: refresh')\n lines.push('- Esc: close')\n return lines\n}\n\nexport function TerminalSetupScreen({ onDone }: Props): React.ReactNode {\n const theme = getTheme()\n const layout = useScreenLayout()\n const exitState = useExitOnCtrlCD(() => onDone('Terminal setup dismissed'))\n\n const [capabilities, setCapabilities] = useState<TerminalCapabilities>(() =>\n snapshotCapabilities(),\n )\n\n useEffect(() => {\n terminalCapabilityManager\n .detectCapabilities()\n .then(() => terminalCapabilityManager.enableSupportedModes())\n .finally(() => setCapabilities(snapshotCapabilities()))\n }, [])\n\n const rawLines = useMemo(\n () => buildTerminalSetupLines(capabilities),\n [capabilities],\n )\n const wrapped = useMemo(() => {\n const width = Math.max(1, layout.columns - layout.paddingX * 2)\n return wrapLines(rawLines, width)\n }, [layout.columns, layout.paddingX, rawLines])\n\n useKeypress(\n (input, key) => {\n const inputChar = input.length === 1 ? input : ''\n if (key.escape) {\n onDone('Terminal setup dismissed')\n return true\n }\n if (inputChar === 'r') {\n setCapabilities(snapshotCapabilities())\n return true\n }\n },\n { priority: KEYPRESS_PRIORITY.FULLSCREEN_OVERLAY },\n )\n\n return (\n <ScreenFrame\n title=\"Terminal Setup\"\n exitState={exitState}\n paddingX={layout.paddingX}\n paddingY={layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\">\n {wrapped.map((line, idx) => (\n <Text\n key={idx}\n color={idx === 0 ? theme.text : undefined}\n wrap=\"truncate-end\"\n >\n {line}\n </Text>\n ))}\n </Box>\n </ScreenFrame>\n )\n}\n", "import React from 'react'\nimport type { Command } from '../types'\n\nimport { relative } from 'node:path'\nimport { getBunShellSandboxPlan } from '#core/sandbox/bunShellSandboxPlan'\nimport { PRODUCT_NAME } from '#core/constants/product'\nimport {\n getSettingsFileCandidates,\n loadSettingsWithLegacyFallback,\n saveSettingsToPrimaryAndSyncLegacy,\n} from '#config'\nimport { getCwd } from '#core/utils/state'\nimport { SandboxScreen } from '#ui-ink/screens/overlays/SandboxScreen'\n\nfunction isSupportedPlatform(platform: NodeJS.Platform): boolean {\n return platform === 'darwin' || platform === 'linux'\n}\n\nfunction getSandboxStatusDescription(): string {\n if (!isSupportedPlatform(process.platform)) {\n return `sandbox unavailable on ${process.platform}`\n }\n\n const plan = getBunShellSandboxPlan({ command: 'echo sandbox status' })\n const enabled = plan.settings.enabled\n const autoAllow = plan.settings.autoAllowBashIfSandboxed\n const fallbackAllowed = plan.settings.allowUnsandboxedCommands\n const managed = false\n\n const icon = enabled ? '\u2713' : '\u25CB'\n let summary = enabled ? 'sandbox enabled' : 'sandbox disabled'\n if (enabled && autoAllow) summary += ' (auto-allow)'\n if (enabled && fallbackAllowed) summary += ', fallback allowed'\n if (enabled && !plan.sandboxAvailable) summary += ' (unavailable)'\n if (managed) summary += ' (managed)'\n\n return `${icon} ${summary} (\u23CE to configure)`\n}\n\nfunction stripOuterQuotes(value: string): string {\n return value.replace(/^[\"']|[\"']$/g, '')\n}\n\nfunction parseSandboxExcludeArg(args: string): string | null {\n const trimmed = args.trim()\n if (!trimmed.toLowerCase().startsWith('exclude')) return null\n const rest = trimmed.slice('exclude'.length).trim()\n if (!rest) return ''\n return stripOuterQuotes(rest)\n}\n\nfunction normalizeStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) return []\n return value\n .filter((v): v is string => typeof v === 'string')\n .map(v => v.trim())\n .filter(Boolean)\n}\n\nfunction persistExcludedCommandPattern(pattern: string): string {\n const projectDir = getCwd()\n const loaded = loadSettingsWithLegacyFallback({\n destination: 'localSettings',\n projectDir,\n migrateToPrimary: true,\n })\n const current = (loaded.settings ?? {}) as Record<string, unknown>\n const sandbox =\n typeof current.sandbox === 'object' && current.sandbox !== null\n ? (current.sandbox as Record<string, unknown>)\n : {}\n const existing = normalizeStringArray(sandbox.excludedCommands)\n const nextExcluded = existing.includes(pattern)\n ? existing\n : [...existing, pattern]\n\n const next: Record<string, unknown> = {\n ...current,\n sandbox: {\n ...sandbox,\n excludedCommands: nextExcluded,\n },\n }\n\n saveSettingsToPrimaryAndSyncLegacy({\n destination: 'localSettings',\n projectDir,\n settings: next,\n })\n\n const candidates = getSettingsFileCandidates({\n destination: 'localSettings',\n projectDir,\n })\n const relativePath = candidates?.primary\n ? `./${relative(projectDir, candidates.primary)}`\n : './.kode/settings.local.json'\n\n return `Added \"${pattern}\" to excluded commands in ${relativePath}`\n}\n\nconst sandbox = {\n type: 'local-jsx',\n name: 'sandbox',\n argumentHint: 'exclude \"command pattern\"',\n get description() {\n return getSandboxStatusDescription()\n },\n isEnabled: true,\n isHidden: !isSupportedPlatform(process.platform),\n ui: { displayMode: 'fullscreen' },\n disableNonInteractive: true,\n async call(onDone, context, args) {\n if (!isSupportedPlatform(process.platform)) {\n onDone(\n `Error: Sandboxing is currently only supported on macOS and Linux`,\n )\n return null\n }\n\n const plan = getBunShellSandboxPlan({\n command: 'echo sandbox dependency probe',\n toolUseContext: context,\n })\n if (!plan.sandboxAvailable) {\n const msg =\n process.platform === 'linux'\n ? `Error: Sandbox requires socat and bubblewrap. Please install these packages.`\n : `Error: Sandbox dependencies are not available on this system.`\n onDone(msg)\n return null\n }\n\n const trimmed = (args ?? '').trim()\n if (trimmed) {\n const excludePattern = parseSandboxExcludeArg(trimmed)\n if (excludePattern !== null) {\n if (!excludePattern) {\n onDone(\n `Error: Please provide a command pattern to exclude (e.g., /sandbox exclude \"npm run test:*\")`,\n )\n return null\n }\n onDone(persistExcludedCommandPattern(excludePattern))\n return null\n }\n\n const unknownSubcommand = trimmed.split(/\\s+/)[0] ?? trimmed\n onDone(\n `Error: Unknown subcommand \"${unknownSubcommand}\". Available subcommand: exclude`,\n )\n return null\n }\n\n return React.createElement(SandboxScreen, {\n context,\n onDone: result =>\n onDone(result ?? `${PRODUCT_NAME} sandbox dialog dismissed`),\n })\n },\n userFacingName() {\n return 'sandbox'\n },\n} satisfies Command\n\nexport default sandbox\n", "import React, { useMemo, useState } from 'react'\nimport { Box, Text } from 'ink'\nimport figures from 'figures'\n\nimport type { ToolUseContext } from '#core/tooling/Tool'\nimport { getBunShellSandboxPlan } from '#core/sandbox/bunShellSandboxPlan'\nimport { getTheme } from '#core/utils/theme'\nimport { getCwd } from '#core/utils/state'\nimport {\n getSettingsFileCandidates,\n loadSettingsWithLegacyFallback,\n saveSettingsToPrimaryAndSyncLegacy,\n type SettingsDestination,\n type SettingsFile,\n} from '#config'\nimport { useExitOnCtrlCD } from '#ui-ink/hooks/useExitOnCtrlCD'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { SearchBox } from '#ui-ink/components/SearchBox'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\nimport { getWindowedList } from '#ui-ink/primitives/list/windowedList'\n\ntype Props = {\n context: ToolUseContext\n onDone: (result?: string) => void\n}\n\ntype Item =\n | { kind: 'toggle'; id: 'enabled' | 'autoAllow' | 'fallback' }\n | { kind: 'nav'; id: 'excluded' }\n | { kind: 'nav'; id: 'destination' }\n\ntype Mode =\n | { kind: 'main' }\n | { kind: 'excluded' }\n | { kind: 'excludedAdd' }\n\nconst DESTINATIONS: SettingsDestination[] = [\n 'localSettings',\n 'projectSettings',\n 'userSettings',\n]\n\nfunction destinationLabel(dest: SettingsDestination): string {\n switch (dest) {\n case 'localSettings':\n return 'local (.kode/settings.local.json)'\n case 'projectSettings':\n return 'project (.kode/settings.json)'\n case 'userSettings':\n return 'user (~/.kode/settings.json)'\n }\n}\n\nfunction normalizeStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) return []\n return value\n .filter((v): v is string => typeof v === 'string')\n .map(v => v.trim())\n .filter(Boolean)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n\nfunction getSandboxSettingsFromFile(settings: SettingsFile | null): {\n enabled: boolean\n autoAllowBashIfSandboxed: boolean\n allowUnsandboxedCommands: boolean\n excludedCommands: string[]\n} {\n const sandbox = isRecord(settings?.sandbox) ? settings!.sandbox : {}\n const enabled = sandbox.enabled === true\n const autoAllowBashIfSandboxed =\n typeof sandbox.autoAllowBashIfSandboxed === 'boolean'\n ? sandbox.autoAllowBashIfSandboxed\n : true\n const allowUnsandboxedCommands =\n typeof sandbox.allowUnsandboxedCommands === 'boolean'\n ? sandbox.allowUnsandboxedCommands\n : true\n const excludedCommands = normalizeStringArray(sandbox.excludedCommands)\n return { enabled, autoAllowBashIfSandboxed, allowUnsandboxedCommands, excludedCommands }\n}\n\nfunction persistSandboxSettings(args: {\n destination: SettingsDestination\n projectDir: string\n settings: SettingsFile\n}): void {\n saveSettingsToPrimaryAndSyncLegacy({\n destination: args.destination,\n projectDir: args.projectDir,\n settings: args.settings,\n })\n}\n\nfunction buildNextSettings(args: {\n base: SettingsFile | null\n patch: (sandbox: Record<string, unknown>) => Record<string, unknown>\n}): SettingsFile {\n const base = (args.base ?? {}) as Record<string, unknown>\n const currentSandbox = isRecord(base.sandbox) ? (base.sandbox as Record<string, unknown>) : {}\n return {\n ...base,\n sandbox: args.patch(currentSandbox),\n }\n}\n\nexport function SandboxScreen({ context, onDone }: Props): React.ReactNode {\n const theme = getTheme()\n const layout = useScreenLayout()\n const exitState = useExitOnCtrlCD(() => onDone('Sandbox dialog dismissed'))\n const projectDir = getCwd()\n\n const [destinationIndex, setDestinationIndex] = useState(0)\n const destination = DESTINATIONS[destinationIndex] ?? 'localSettings'\n\n const [mode, setMode] = useState<Mode>({ kind: 'main' })\n const [selectedIndex, setSelectedIndex] = useState(0)\n const [excludedSelectedIndex, setExcludedSelectedIndex] = useState(0)\n const [draftExcluded, setDraftExcluded] = useState('')\n\n const loaded = useMemo(\n () =>\n loadSettingsWithLegacyFallback({\n destination,\n projectDir,\n migrateToPrimary: true,\n }),\n [destination, projectDir],\n )\n const settingsFile = loaded.settings\n const sandboxSettings = getSandboxSettingsFromFile(settingsFile)\n\n const effectivePlan = useMemo(\n () =>\n getBunShellSandboxPlan({\n command: 'echo sandbox screen',\n toolUseContext: context,\n }),\n [context],\n )\n\n const candidates = useMemo(\n () => getSettingsFileCandidates({ destination, projectDir }),\n [destination, projectDir],\n )\n const editingPath = candidates?.primary ?? '(unknown settings path)'\n\n const items: Item[] = useMemo(\n () => [\n { kind: 'toggle', id: 'enabled' },\n { kind: 'toggle', id: 'autoAllow' },\n { kind: 'toggle', id: 'fallback' },\n { kind: 'nav', id: 'excluded' },\n { kind: 'nav', id: 'destination' },\n ],\n [],\n )\n\n const reservedLines = (layout.tightLayout ? 9 : layout.compactLayout ? 11 : 13) + layout.paddingY * 2\n const maxVisible = Math.max(3, layout.rows - reservedLines)\n\n const visibleItems = items\n const window = useMemo(\n () =>\n getWindowedList({\n itemCount: visibleItems.length,\n focusIndex: selectedIndex,\n maxVisible,\n indicatorRows: 2,\n }),\n [maxVisible, selectedIndex, visibleItems.length],\n )\n\n const clampedSelectedIndex = Math.max(\n 0,\n Math.min(selectedIndex, Math.max(0, visibleItems.length - 1)),\n )\n const selectedItem = visibleItems[clampedSelectedIndex] ?? null\n\n const persistToggle = (toggle: 'enabled' | 'autoAllowBashIfSandboxed' | 'allowUnsandboxedCommands') => {\n const next = buildNextSettings({\n base: settingsFile,\n patch: sandbox => ({\n ...sandbox,\n [toggle]:\n toggle === 'enabled'\n ? !sandboxSettings.enabled\n : toggle === 'autoAllowBashIfSandboxed'\n ? !sandboxSettings.autoAllowBashIfSandboxed\n : !sandboxSettings.allowUnsandboxedCommands,\n }),\n })\n\n persistSandboxSettings({ destination, projectDir, settings: next })\n }\n\n const persistExcludedList = (nextExcluded: string[]) => {\n const next = buildNextSettings({\n base: settingsFile,\n patch: sandbox => ({ ...sandbox, excludedCommands: nextExcluded }),\n })\n persistSandboxSettings({ destination, projectDir, settings: next })\n }\n\n const renderRow = (item: Item): { label: string; value?: string } => {\n switch (item.kind) {\n case 'toggle': {\n if (item.id === 'enabled') {\n return {\n label: 'Enable sandbox',\n value: sandboxSettings.enabled ? 'on' : 'off',\n }\n }\n if (item.id === 'autoAllow') {\n return {\n label: 'Auto-allow sandboxed Bash',\n value: sandboxSettings.autoAllowBashIfSandboxed ? 'on' : 'off',\n }\n }\n return {\n label: 'Allow fallback when sandbox unavailable',\n value: sandboxSettings.allowUnsandboxedCommands ? 'on' : 'off',\n }\n }\n case 'nav': {\n if (item.id === 'excluded') {\n return {\n label: `Excluded commands (${sandboxSettings.excludedCommands.length})`,\n value: 'edit\u2026',\n }\n }\n return {\n label: 'Edit destination',\n value: destinationLabel(destination),\n }\n }\n }\n }\n\n const cycleDestination = () => {\n setDestinationIndex(idx => (idx + 1) % DESTINATIONS.length)\n setSelectedIndex(0)\n setMode({ kind: 'main' })\n }\n\n useKeypress(async (input, key) => {\n if (key.ctrl && key.name === 'c') return\n\n if (mode.kind === 'excludedAdd') {\n if (key.escape) {\n setMode({ kind: 'excluded' })\n setDraftExcluded('')\n return\n }\n if (key.return) {\n const pattern = draftExcluded.trim()\n if (pattern) {\n if (!sandboxSettings.excludedCommands.includes(pattern)) {\n persistExcludedList([...sandboxSettings.excludedCommands, pattern])\n }\n }\n setDraftExcluded('')\n setMode({ kind: 'excluded' })\n return\n }\n if (key.backspace || key.delete) {\n setDraftExcluded(value => value.slice(0, -1))\n return\n }\n if (key.insertable && input) {\n setDraftExcluded(value => value + input)\n return\n }\n return\n }\n\n if (mode.kind === 'excluded') {\n const entries = sandboxSettings.excludedCommands\n const total = entries.length + 2 // Add + Back\n if (key.upArrow) {\n setExcludedSelectedIndex(i => Math.max(0, i - 1))\n return\n }\n if (key.downArrow) {\n setExcludedSelectedIndex(i => Math.min(total - 1, i + 1))\n return\n }\n if (key.escape) {\n setMode({ kind: 'main' })\n setExcludedSelectedIndex(0)\n return\n }\n if (key.return) {\n if (excludedSelectedIndex === 0) {\n setMode({ kind: 'excludedAdd' })\n setDraftExcluded('')\n return\n }\n if (excludedSelectedIndex === total - 1) {\n setMode({ kind: 'main' })\n setExcludedSelectedIndex(0)\n return\n }\n const idx = excludedSelectedIndex - 1\n const target = entries[idx]\n if (!target) return\n persistExcludedList(entries.filter((_, i) => i !== idx))\n setExcludedSelectedIndex(i => Math.max(0, Math.min(i, total - 2)))\n }\n return\n }\n\n if (mode.kind === 'main') {\n if (key.escape) {\n onDone('Sandbox dialog dismissed')\n return\n }\n\n if (key.tab) {\n cycleDestination()\n return\n }\n\n if (key.upArrow) {\n setSelectedIndex(i => Math.max(0, i - 1))\n return\n }\n if (key.downArrow) {\n setSelectedIndex(i => Math.min(visibleItems.length - 1, i + 1))\n return\n }\n\n if (key.return && selectedItem) {\n if (selectedItem.kind === 'toggle') {\n if (selectedItem.id === 'enabled') persistToggle('enabled')\n else if (selectedItem.id === 'autoAllow') persistToggle('autoAllowBashIfSandboxed')\n else persistToggle('allowUnsandboxedCommands')\n return\n }\n\n if (selectedItem.kind === 'nav') {\n if (selectedItem.id === 'excluded') {\n setMode({ kind: 'excluded' })\n setExcludedSelectedIndex(0)\n return\n }\n if (selectedItem.id === 'destination') {\n cycleDestination()\n return\n }\n }\n }\n }\n })\n\n const titleSuffix = effectivePlan.settings.enabled\n ? effectivePlan.sandboxAvailable\n ? 'enabled'\n : 'enabled (unavailable)'\n : 'disabled'\n\n return (\n <ScreenFrame\n title={`Sandbox \u00B7 ${titleSuffix}`}\n exitState={exitState}\n paddingX={layout.paddingX}\n paddingY={layout.paddingY}\n gap={layout.gap}\n >\n <Box flexDirection=\"column\" gap={1}>\n <Text dimColor wrap=\"truncate-end\">\n {`Editing: ${destinationLabel(destination)} \u00B7 ${editingPath}`}\n </Text>\n <Text dimColor wrap=\"truncate-end\">\n {`Platform: ${process.platform} \u00B7 Runtime: ${\n effectivePlan.sandboxAvailable ? 'available' : 'missing dependencies'\n } \u00B7 Tab: cycle destination`}\n </Text>\n </Box>\n\n {mode.kind === 'excludedAdd' ? (\n <Box flexDirection=\"column\" gap={1}>\n <Text bold>Add excluded command pattern</Text>\n <SearchBox\n query={draftExcluded}\n placeholder='e.g. npm run test:*'\n isFocused\n />\n <Text dimColor>\n {`Enter to add \u00B7 Esc to cancel`}\n </Text>\n </Box>\n ) : mode.kind === 'excluded' ? (\n <Box flexDirection=\"column\" gap={1}>\n <Text bold>Excluded commands</Text>\n <Text dimColor>\n {`Enter: remove \u00B7 Esc: back \u00B7 Tab: cycle destination`}\n </Text>\n <Box flexDirection=\"column\">\n {[\n { kind: 'action', label: 'Add pattern\u2026' },\n ...sandboxSettings.excludedCommands.map(v => ({\n kind: 'pattern' as const,\n label: v,\n })),\n { kind: 'action', label: 'Back' },\n ].map((row, idx) => {\n const selected = idx === excludedSelectedIndex\n const indicator = selected ? figures.pointer : ' '\n return (\n <Text key={`${row.kind}-${idx}`} color={selected ? theme.suggestion : undefined}>\n {indicator} {row.label}\n </Text>\n )\n })}\n </Box>\n </Box>\n ) : (\n <Box flexDirection=\"column\" gap={1}>\n <Text dimColor>\n {`\u2191\u2193 navigate \u00B7 Enter toggle/open \u00B7 Esc close \u00B7 Tab cycle destination`}\n </Text>\n <Box flexDirection=\"column\">\n {visibleItems.slice(window.start, window.end).map((item, idx) => {\n const absoluteIndex = window.start + idx\n const selected = absoluteIndex === clampedSelectedIndex\n const { label, value } = renderRow(item)\n const indicator = selected ? figures.pointer : ' '\n const valueText = value ? ` \u00B7 ${value}` : ''\n return (\n <Text\n key={`${item.kind}-${item.id}`}\n color={selected ? theme.suggestion : undefined}\n wrap=\"truncate-end\"\n >\n {indicator} {label}\n <Text dimColor={!selected}>{valueText}</Text>\n </Text>\n )\n })}\n {window.showUpIndicator ? <Text dimColor>\u2191 more</Text> : null}\n {window.showDownIndicator ? <Text dimColor>\u2193 more</Text> : null}\n </Box>\n </Box>\n )}\n </ScreenFrame>\n )\n}\n", "import React from 'react'\nimport type { Command } from '../types'\nimport { AgentsUI } from './agents/ui'\n\nexport default {\n name: 'agents',\n description: 'Manage agent configurations',\n type: 'local-jsx' as const,\n isEnabled: true,\n isHidden: false,\n ui: { displayMode: 'fullscreen' as const },\n\n async call(onExit: (message?: string) => void) {\n return <AgentsUI onExit={onExit} />\n },\n\n userFacingName() {\n return 'agents'\n },\n} satisfies Command\n", "import React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport { Text } from 'ink'\nimport chalk from 'chalk'\nimport {\n clearAgentCache,\n getActiveAgents,\n getAllAgents,\n type AgentConfig,\n} from '#core/utils/agentLoader'\nimport { getAvailableTools, type Tool } from '../tooling'\nimport { deleteAgent } from '../storage'\nimport { AgentMenu } from './AgentMenu'\nimport { AgentsListView } from './AgentsListView'\nimport { CreateAgentWizard } from './CreateAgentWizard'\nimport { DeleteConfirm } from './DeleteConfirm'\nimport { EditAgent } from './EditAgent'\nimport { Instructions, Panel } from './components'\nimport type { AgentWithOverride, ModeState } from './types'\nimport { ViewAgent } from './ViewAgent'\n\nfunction computeOverrides(args: {\n allAgents: AgentConfig[]\n activeAgents: AgentConfig[]\n}): AgentWithOverride[] {\n const activeByType = new Map<string, AgentConfig>()\n for (const agent of args.activeAgents)\n activeByType.set(agent.agentType, agent)\n return args.allAgents.map(agent => {\n const active = activeByType.get(agent.agentType)\n const overriddenBy =\n active && active.source !== agent.source ? active.source : undefined\n return { ...agent, ...(overriddenBy ? { overriddenBy } : {}) }\n })\n}\n\nexport function AgentsUI({ onExit }: { onExit: (message?: string) => void }) {\n const [mode, setMode] = useState<ModeState>({\n mode: 'list-agents',\n source: 'all',\n })\n const [loading, setLoading] = useState(true)\n const [allAgents, setAllAgents] = useState<AgentConfig[]>([])\n const [activeAgents, setActiveAgents] = useState<AgentConfig[]>([])\n const [tools, setTools] = useState<Tool[]>([])\n const [changes, setChanges] = useState<string[]>([])\n\n const refresh = useCallback(async () => {\n clearAgentCache()\n const [all, active] = await Promise.all([getAllAgents(), getActiveAgents()])\n setAllAgents(all)\n setActiveAgents(active)\n }, [])\n\n useEffect(() => {\n let mounted = true\n ;(async () => {\n try {\n const [toolList] = await Promise.all([getAvailableTools(), refresh()])\n if (!mounted) return\n setTools(toolList)\n } finally {\n if (mounted) setLoading(false)\n }\n })()\n return () => {\n mounted = false\n }\n }, [refresh])\n\n const agentsWithOverride = useMemo(\n () => computeOverrides({ allAgents, activeAgents }),\n [allAgents, activeAgents],\n )\n\n const listAgentsForSource = useMemo(() => {\n const bySource = {\n 'built-in': agentsWithOverride.filter(a => a.source === 'built-in'),\n userSettings: agentsWithOverride.filter(a => a.source === 'userSettings'),\n projectSettings: agentsWithOverride.filter(\n a => a.source === 'projectSettings',\n ),\n policySettings: agentsWithOverride.filter(\n a => a.source === 'policySettings',\n ),\n flagSettings: agentsWithOverride.filter(a => a.source === 'flagSettings'),\n plugin: agentsWithOverride.filter(a => a.source === 'plugin'),\n }\n\n if (mode.mode !== 'list-agents') return []\n\n if (mode.source === 'all') {\n return [\n ...bySource['built-in'],\n ...bySource.userSettings,\n ...bySource.projectSettings,\n ...bySource.policySettings,\n ...bySource.flagSettings,\n ...bySource.plugin,\n ]\n }\n if (mode.source === 'built-in') return bySource['built-in']\n if (mode.source === 'userSettings') return bySource.userSettings\n if (mode.source === 'projectSettings') return bySource.projectSettings\n if (mode.source === 'policySettings') return bySource.policySettings\n if (mode.source === 'flagSettings') return bySource.flagSettings\n if (mode.source === 'plugin') return bySource.plugin\n return []\n }, [agentsWithOverride, mode])\n\n const dismiss = useCallback(() => {\n if (changes.length > 0) {\n onExit(`Agent changes:\\\\n${changes.join('\\\\n')}`)\n return\n }\n onExit('Agents dialog dismissed')\n }, [changes, onExit])\n\n if (loading) {\n return (\n <>\n <Panel title=\"Agents\" subtitle=\"Loading\u2026\">\n <Text dimColor>Loading agents\u2026</Text>\n </Panel>\n <Instructions />\n </>\n )\n }\n\n if (mode.mode === 'list-agents') {\n return (\n <AgentsListView\n source={mode.source}\n agents={listAgentsForSource}\n changes={changes}\n onCreateNew={() =>\n setMode({ mode: 'create-agent', previousMode: mode })\n }\n onSelect={agent =>\n setMode({ mode: 'agent-menu', agent, previousMode: mode })\n }\n onBack={dismiss}\n />\n )\n }\n\n if (mode.mode === 'create-agent') {\n return (\n <CreateAgentWizard\n tools={tools}\n existingAgents={allAgents}\n onCancel={() => setMode(mode.previousMode)}\n onComplete={async message => {\n setChanges(prev => [...prev, message])\n await refresh()\n setMode({ mode: 'list-agents', source: 'all' })\n }}\n />\n )\n }\n\n if (mode.mode === 'agent-menu') {\n return (\n <AgentMenu\n agent={mode.agent}\n onCancel={() => setMode(mode.previousMode)}\n onChoose={value => {\n if (value === 'back') setMode(mode.previousMode)\n else if (value === 'view')\n setMode({\n mode: 'view-agent',\n agent: mode.agent,\n previousMode: mode,\n })\n else if (value === 'edit')\n setMode({\n mode: 'edit-agent',\n agent: mode.agent,\n previousMode: mode,\n })\n else if (value === 'delete')\n setMode({\n mode: 'delete-confirm',\n agent: mode.agent,\n previousMode: mode,\n })\n }}\n />\n )\n }\n\n if (mode.mode === 'view-agent') {\n return (\n <ViewAgent\n agent={mode.agent}\n tools={tools}\n onBack={() => setMode(mode.previousMode)}\n />\n )\n }\n\n if (mode.mode === 'edit-agent') {\n return (\n <EditAgent\n agent={mode.agent}\n tools={tools}\n onBack={() => setMode(mode.previousMode)}\n onSaved={async message => {\n setChanges(prev => [...prev, message])\n await refresh()\n setMode(mode.previousMode)\n }}\n />\n )\n }\n\n if (mode.mode === 'delete-confirm') {\n return (\n <DeleteConfirm\n agent={mode.agent}\n onCancel={() => setMode(mode.previousMode)}\n onConfirm={async () => {\n await deleteAgent(mode.agent)\n setChanges(prev => [\n ...prev,\n `Deleted agent: ${chalk.bold(mode.agent.agentType)}`,\n ])\n await refresh()\n setMode({ mode: 'list-agents', source: 'all' })\n }}\n />\n )\n }\n\n return null\n}\n", "import { getMCPTools } from '#core/mcp/client'\nimport { debug as debugLogger } from '#core/utils/debugLogger'\nimport { logError } from '#core/utils/log'\n\nexport type Tool = {\n name: string\n description?: string | (() => Promise<string>)\n}\n\n// Tool categories for sophisticated selection\nexport const TOOL_CATEGORIES = {\n read: ['Read', 'LS', 'Glob', 'Grep'],\n edit: ['Edit', 'Write', 'NotebookEdit'],\n execution: ['Bash', 'TaskOutput', 'KillShell'],\n web: ['WebFetch', 'WebSearch'],\n other: ['TodoWrite', 'AskUserQuestion'],\n} as const\n\nfunction getCoreTools(): Tool[] {\n const tools: Tool[] = [\n { name: 'Read', description: 'Read files from filesystem' },\n { name: 'Write', description: 'Write files to filesystem' },\n { name: 'Edit', description: 'Edit existing files' },\n { name: 'NotebookEdit', description: 'Edit Jupyter notebooks' },\n { name: 'Bash', description: 'Execute bash commands' },\n { name: 'TaskOutput', description: 'Read background task output' },\n { name: 'KillShell', description: 'Stop a running background task' },\n { name: 'Glob', description: 'Find files matching patterns' },\n { name: 'Grep', description: 'Search file contents' },\n { name: 'LS', description: 'List directory contents' },\n { name: 'WebFetch', description: 'Fetch web content' },\n { name: 'WebSearch', description: 'Search the web' },\n { name: 'TodoWrite', description: 'Manage task lists' },\n { name: 'AskUserQuestion', description: 'Ask the user a question' },\n ]\n\n // Hide agent orchestration/self-control tools for subagent configs\n return tools.filter(t => t.name !== 'Task' && t.name !== 'ExitPlanMode')\n}\n\nexport async function getAvailableTools(): Promise<Tool[]> {\n const availableTools: Tool[] = []\n availableTools.push(...getCoreTools())\n\n try {\n const mcpTools = await getMCPTools()\n if (Array.isArray(mcpTools) && mcpTools.length > 0) {\n availableTools.push(...mcpTools)\n }\n } catch (error) {\n logError(error)\n debugLogger.warn('AGENT_TOOLING_MCP_LOAD_FAILED', {\n error: error instanceof Error ? error.message : String(error),\n })\n }\n\n return availableTools\n}\n", "import {\n existsSync,\n mkdirSync,\n renameSync,\n unlinkSync,\n writeFileSync,\n} from 'fs'\nimport { join } from 'path'\nimport { homedir } from 'os'\n\nimport { getCwd } from '#core/utils/state'\nimport type { AgentConfig } from '#core/utils/agentLoader'\nimport { debug as debugLogger } from '#core/utils/debugLogger'\nimport { logError } from '#core/utils/log'\nimport { LEGACY_CONFIG_DIRNAME } from '#core/compat/legacyPaths'\n\nimport { generateAgentFileContent } from './generation'\n\nexport type AgentLocation = 'user' | 'project'\n\nconst PRIMARY_FOLDER = '.kode'\nconst LEGACY_FOLDER = LEGACY_CONFIG_DIRNAME\nconst AGENTS_DIR = 'agents'\n\nexport function getAgentDirectory(location: AgentLocation): string {\n if (location === 'user') {\n return join(homedir(), PRIMARY_FOLDER, AGENTS_DIR)\n }\n return join(getCwd(), PRIMARY_FOLDER, AGENTS_DIR)\n}\n\nfunction getLegacyAgentDirectory(location: AgentLocation): string {\n if (location === 'user') {\n return join(homedir(), LEGACY_FOLDER, AGENTS_DIR)\n }\n return join(getCwd(), LEGACY_FOLDER, AGENTS_DIR)\n}\n\nexport function getPrimaryAgentFilePath(\n location: AgentLocation,\n agentType: string,\n): string {\n return join(getAgentDirectory(location), `${agentType}.md`)\n}\n\nfunction getLegacyAgentFilePath(\n location: AgentLocation,\n agentType: string,\n): string {\n return join(getLegacyAgentDirectory(location), `${agentType}.md`)\n}\n\nexport function getAgentFilePath(agent: AgentConfig): string {\n if (agent.location === 'built-in' || agent.location === 'plugin') {\n throw new Error(`Cannot get file path for ${agent.location} agents`)\n }\n\n const location = agent.location as AgentLocation\n const primary = getPrimaryAgentFilePath(location, agent.agentType)\n if (existsSync(primary)) return primary\n\n const legacy = getLegacyAgentFilePath(location, agent.agentType)\n if (existsSync(legacy)) return legacy\n\n return primary\n}\n\nexport function ensureDirectoryExists(location: AgentLocation): string {\n const dir = getAgentDirectory(location)\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true })\n }\n return dir\n}\n\nexport async function saveAgent(\n location: AgentLocation,\n agentType: string,\n description: string,\n tools: string[],\n systemPrompt: string,\n model?: string,\n color?: string,\n throwIfExists: boolean = true,\n): Promise<void> {\n ensureDirectoryExists(location)\n\n const filePath = getPrimaryAgentFilePath(location, agentType)\n const legacyPath = getLegacyAgentFilePath(location, agentType)\n\n if (throwIfExists && (existsSync(filePath) || existsSync(legacyPath))) {\n throw new Error(`Agent file already exists: ${filePath}`)\n }\n\n const tempFile = `${filePath}.tmp.${Date.now()}.${Math.random()\n .toString(36)\n .substr(2, 9)}`\n\n const toolsForFile: string[] | '*' =\n Array.isArray(tools) && tools.length === 1 && tools[0] === '*' ? '*' : tools\n const content = generateAgentFileContent(\n agentType,\n description,\n toolsForFile,\n systemPrompt,\n model,\n color,\n )\n\n try {\n writeFileSync(tempFile, content, { encoding: 'utf-8', flag: 'wx' })\n\n if (throwIfExists && (existsSync(filePath) || existsSync(legacyPath))) {\n try {\n unlinkSync(tempFile)\n } catch {}\n throw new Error(`Agent file already exists: ${filePath}`)\n }\n\n renameSync(tempFile, filePath)\n } catch (error) {\n try {\n if (existsSync(tempFile)) {\n unlinkSync(tempFile)\n }\n } catch (cleanupError) {\n logError(cleanupError)\n debugLogger.warn('AGENT_STORAGE_TEMP_CLEANUP_FAILED', {\n error:\n cleanupError instanceof Error\n ? cleanupError.message\n : String(cleanupError),\n })\n }\n throw error\n }\n}\n\nexport async function updateAgent(\n agent: AgentConfig,\n description: string,\n tools: string[] | '*',\n systemPrompt: string,\n color?: string,\n model?: string,\n): Promise<void> {\n if (agent.location === 'built-in' || agent.location === 'plugin') {\n throw new Error(`Cannot update ${agent.location} agents`)\n }\n\n const toolsForFile = tools.length === 1 && tools[0] === '*' ? '*' : tools\n const content = generateAgentFileContent(\n agent.agentType,\n description,\n toolsForFile,\n systemPrompt,\n model,\n color,\n )\n\n const location = agent.location as AgentLocation\n const primaryPath = getPrimaryAgentFilePath(location, agent.agentType)\n const legacyPath = getLegacyAgentFilePath(location, agent.agentType)\n const filePath = existsSync(primaryPath)\n ? primaryPath\n : existsSync(legacyPath)\n ? legacyPath\n : primaryPath\n\n ensureDirectoryExists(location)\n writeFileSync(filePath, content, { encoding: 'utf-8', flag: 'w' })\n}\n\nexport async function deleteAgent(agent: AgentConfig): Promise<void> {\n if (agent.location === 'built-in' || agent.location === 'plugin') {\n throw new Error(`Cannot delete ${agent.location} agents`)\n }\n\n const location = agent.location as AgentLocation\n const primaryPath = getPrimaryAgentFilePath(location, agent.agentType)\n const legacyPath = getLegacyAgentFilePath(location, agent.agentType)\n\n if (existsSync(primaryPath)) {\n unlinkSync(primaryPath)\n }\n if (existsSync(legacyPath)) {\n unlinkSync(legacyPath)\n }\n}\n", "import { debug as debugLogger } from '#core/utils/debugLogger'\nimport { logError } from '#core/utils/log'\nimport { createUserMessage } from '#core/utils/messages'\n\nexport type GeneratedAgent = {\n identifier: string\n whenToUse: string\n systemPrompt: string\n}\n\nconst DEFAULT_AGENT_GENERATION_SYSTEM_PROMPT = `You are an elite AI agent architect specializing in crafting high-performance agent configurations. Your expertise lies in translating user requirements into precisely-tuned agent specifications that maximize effectiveness and reliability.\n\n**Important Context**: You may have access to project-specific instructions (AGENTS.md stack; legacy CLAUDE.md when present) and other context that may include coding standards, project structure, and custom requirements. Consider this context when creating agents to ensure they align with the project's established patterns and practices.\n\nWhen a user describes what they want an agent to do, you will:\n\n1. **Extract Core Intent**: Identify the fundamental purpose, key responsibilities, and success criteria for the agent. Look for both explicit requirements and implicit needs. Consider any project-specific context from AGENTS.md (and legacy CLAUDE.md when present). For agents that are meant to review code, you should assume that the user is asking to review recently written code and not the whole codebase, unless the user has explicitly instructed you otherwise.\n\n2. **Design Expert Persona**: Create a compelling expert identity that embodies deep domain knowledge relevant to the task. The persona should inspire confidence and guide the agent's decision-making approach.\n\n3. **Architect Comprehensive Instructions**: Develop a system prompt that:\n - Establishes clear behavioral boundaries and operational parameters\n - Provides specific methodologies and best practices for task execution\n - Anticipates edge cases and provides guidance for handling them\n - Incorporates any specific requirements or preferences mentioned by the user\n - Defines output format expectations when relevant\n - Aligns with project-specific coding standards and patterns from AGENTS.md (and legacy CLAUDE.md when present)\n\n4. **Optimize for Performance**: Include:\n - Decision-making frameworks appropriate to the domain\n - Quality control mechanisms and self-verification steps\n - Efficient workflow patterns\n - Clear escalation or fallback strategies\n\n5. **Create Identifier**: Design a concise, descriptive identifier that:\n - Uses lowercase letters, numbers, and hyphens only\n - Is typically 2-4 words joined by hyphens\n - Clearly indicates the agent's primary function\n - Is memorable and easy to type\n - Avoids generic terms like \"helper\" or \"assistant\"\n\n6 **Example agent descriptions**:\n - in the 'whenToUse' field of the JSON object, you should include examples of when this agent should be used.\n - examples should be of the form:\n - <example>\n Context: The user is creating a test-runner agent that should be called after a logical chunk of code is written.\n user: \"Please write a function that checks if a number is prime\"\n assistant: \"Here is the relevant function: \"\n <function call omitted for brevity only for this example>\n <commentary>\n Since a significant piece of code was written, use the Task tool to launch the test-runner agent to run the tests.\n </commentary>\n assistant: \"Now let me use the test-runner agent to run the tests\"\n </example>\n - <example>\n Context: User is creating an agent to respond to the word \"hello\" with a friendly jok.\n user: \"Hello\"\n assistant: \"I'm going to use the Task tool to launch the greeting-responder agent to respond with a friendly joke\"\n <commentary>\n Since the user is greeting, use the greeting-responder agent to respond with a friendly joke. \n </commentary>\n </example>\n - If the user mentioned or implied that the agent should be used proactively, you should include examples of this.\n- NOTE: Ensure that in the examples, you are making the assistant use the Task tool and not simply respond directly to the task.\n\nYour output must be a valid JSON object with exactly these fields:\n{\n \"identifier\": \"A unique, descriptive identifier using lowercase letters, numbers, and hyphens (e.g., 'test-runner', 'api-docs-writer', 'code-formatter')\",\n \"whenToUse\": \"A precise, actionable description starting with 'Use this agent when...' that clearly defines the triggering conditions and use cases. Ensure you include examples as described above.\",\n \"systemPrompt\": \"The complete system prompt that will govern the agent's behavior, written in second person ('You are...', 'You will...') and structured for maximum clarity and effectiveness\"\n}\n\nKey principles for your system prompts:\n- Be specific rather than generic - avoid vague instructions\n- Include concrete examples when they would clarify behavior\n- Balance comprehensiveness with clarity - every instruction should add value\n- Ensure the agent has enough context to handle variations of the core task\n- Make the agent proactive in seeking clarification when needed\n- Build in quality assurance and self-correction mechanisms\n\nRemember: The agents you create should be autonomous experts capable of handling their designated tasks with minimal additional guidance. Your system prompts are their complete operational manual.\n`\n\nexport async function generateAgentWithModel(\n prompt: string,\n options?: { existingIdentifiers?: string[]; signal?: AbortSignal },\n): Promise<GeneratedAgent> {\n const { queryModel } = await import('#core/ai/llm')\n\n const existing = (options?.existingIdentifiers ?? []).filter(Boolean)\n const existingClause =\n existing.length > 0\n ? `\\n\\nIMPORTANT: The following identifiers already exist and must NOT be used: ${existing.join(', ')}`\n : ''\n\n const userPrompt = `Create an agent configuration based on this request: \"${prompt}\".${existingClause}\\n Return ONLY the JSON object, no other text.`\n\n try {\n const messages = [createUserMessage(userPrompt)]\n const response = await queryModel(\n 'main',\n messages,\n [DEFAULT_AGENT_GENERATION_SYSTEM_PROMPT],\n options?.signal,\n )\n\n let responseText = ''\n const content = response.message?.content as unknown\n if (typeof content === 'string') {\n responseText = content\n } else if (Array.isArray(content)) {\n const asRecord = (value: unknown): Record<string, unknown> | null => {\n if (!value || typeof value !== 'object') return null\n return value as Record<string, unknown>\n }\n const textBlock = content.find(block => {\n const record = asRecord(block)\n return record?.type === 'text' && typeof record.text === 'string'\n })\n const record = asRecord(textBlock)\n responseText =\n record && typeof record.text === 'string' ? record.text : ''\n }\n\n if (!responseText) {\n throw new Error('No text content in model response')\n }\n\n const MAX_JSON_SIZE = 100_000 // 100KB\n const MAX_FIELD_LENGTH = 10_000\n\n if (responseText.length > MAX_JSON_SIZE) {\n throw new Error('Response too large')\n }\n\n let parsed: any\n try {\n parsed = JSON.parse(responseText.trim())\n } catch {\n const startIdx = responseText.indexOf('{')\n const endIdx = responseText.lastIndexOf('}')\n\n if (startIdx === -1 || endIdx === -1 || startIdx >= endIdx) {\n throw new Error('No valid JSON found in model response')\n }\n\n const jsonStr = responseText.substring(startIdx, endIdx + 1)\n if (jsonStr.length > MAX_JSON_SIZE) {\n throw new Error('JSON content too large')\n }\n\n try {\n parsed = JSON.parse(jsonStr)\n } catch (parseError) {\n throw new Error(\n `Invalid JSON format: ${parseError instanceof Error ? parseError.message : 'Unknown error'}`,\n )\n }\n }\n\n const identifier = String(parsed.identifier || '')\n .slice(0, 100)\n .trim()\n const whenToUse = String(parsed.whenToUse || '')\n .slice(0, MAX_FIELD_LENGTH)\n .trim()\n const agentSystemPrompt = String(parsed.systemPrompt || '')\n .slice(0, MAX_FIELD_LENGTH)\n .trim()\n\n if (!identifier || !whenToUse || !agentSystemPrompt) {\n throw new Error(\n 'Invalid response structure: missing required fields (identifier, whenToUse, systemPrompt)',\n )\n }\n\n const sanitize = (str: string) => str.replace(/[\\x00-\\x1F\\x7F-\\x9F]/g, '')\n\n const cleanIdentifier = sanitize(identifier)\n if (!/^[a-z0-9-]+$/.test(cleanIdentifier)) {\n throw new Error(\n 'Invalid identifier format: only lowercase letters, numbers, and hyphens allowed',\n )\n }\n\n return {\n identifier: cleanIdentifier,\n whenToUse: sanitize(whenToUse),\n systemPrompt: sanitize(agentSystemPrompt),\n }\n } catch (error) {\n logError(error)\n debugLogger.warn('AGENT_GENERATION_FAILED', {\n error: error instanceof Error ? error.message : String(error),\n })\n throw error\n }\n}\n\nexport async function generateAgentDraft(\n prompt: string,\n options?: { existingIdentifiers?: string[]; signal?: AbortSignal },\n): Promise<GeneratedAgent> {\n return generateAgentWithModel(prompt, options)\n}\n\nexport function validateAgentType(agentType: string): {\n isValid: boolean\n errors: string[]\n warnings: string[]\n} {\n const errors: string[] = []\n const warnings: string[] = []\n\n if (!agentType) {\n errors.push('Agent type is required')\n return { isValid: false, errors, warnings }\n }\n\n if (!/^[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]$/.test(agentType)) {\n errors.push(\n 'Agent type must start and end with alphanumeric characters and contain only letters, numbers, and hyphens',\n )\n }\n\n if (agentType.length < 3) {\n errors.push('Agent type must be at least 3 characters long')\n }\n\n if (agentType.length > 50) {\n errors.push('Agent type must be less than 50 characters')\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n warnings,\n }\n}\n\nexport type AgentDraftForValidation = {\n agentType?: string\n whenToUse?: string\n systemPrompt?: string\n selectedTools?: string[]\n}\n\nexport function validateAgentConfig(config: AgentDraftForValidation): {\n isValid: boolean\n errors: string[]\n warnings: string[]\n} {\n const errors: string[] = []\n const warnings: string[] = []\n\n if (config.agentType) {\n const typeValidation = validateAgentType(config.agentType)\n errors.push(...typeValidation.errors)\n warnings.push(...typeValidation.warnings)\n }\n\n if (!config.whenToUse) {\n errors.push('Description (description) is required')\n } else if (config.whenToUse.length < 10) {\n warnings.push(\n 'Description should be more descriptive (at least 10 characters)',\n )\n } else if (config.whenToUse.length > 5000) {\n warnings.push('Description is very long (over 5000 characters)')\n }\n\n if (!config.systemPrompt) {\n errors.push('System prompt is required')\n } else if (config.systemPrompt.length < 20) {\n errors.push('System prompt is too short (minimum 20 characters)')\n } else if (config.systemPrompt.length > 10_000) {\n warnings.push('System prompt is very long (over 10,000 characters)')\n }\n\n if (config.selectedTools === undefined) {\n warnings.push('Agent has access to all tools')\n } else if (config.selectedTools.length === 0) {\n warnings.push(\n 'No tools selected - agent will have very limited capabilities',\n )\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n warnings,\n }\n}\n\nexport function generateAgentFileContent(\n agentType: string,\n description: string,\n tools: string[] | '*',\n systemPrompt: string,\n model?: string,\n color?: string,\n): string {\n // Quote + escape description and use literal \"\\n\" sequences so the YAML frontmatter\n // stays one-line and parseable even when the description contains colons, quotes, or\n // backslashes.\n const escapedDescription = description\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, '\\\\\\\\n')\n\n const toolsList =\n tools === '*'\n ? undefined\n : Array.isArray(tools) && tools.length === 1 && tools[0] === '*'\n ? undefined\n : Array.isArray(tools)\n ? tools\n : undefined\n\n const toolsLine =\n toolsList === undefined ? '' : `\\ntools: ${toolsList.join(', ')}`\n const modelLine = model ? `\\nmodel: ${model}` : ''\n const colorLine = color ? `\\ncolor: ${color}` : ''\n\n return `---\\nname: ${agentType}\\ndescription: \"${escapedDescription}\"${toolsLine}${modelLine}${colorLine}\\n---\\n\\n${systemPrompt}\\n`\n}\n", "import React from 'react'\nimport { Box } from 'ink'\nimport { Select } from '#ui-ink/components/CustomSelect/select'\nimport { Instructions, Panel } from './components'\nimport type { AgentWithOverride } from './types'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\n\nfunction isAgentMenuChoice(\n value: string,\n): value is 'view' | 'edit' | 'delete' | 'back' {\n return (\n value === 'view' ||\n value === 'edit' ||\n value === 'delete' ||\n value === 'back'\n )\n}\n\nexport function AgentMenu(props: {\n agent: AgentWithOverride\n onChoose: (value: 'view' | 'edit' | 'delete' | 'back') => void\n onCancel: () => void\n}) {\n useKeypress((_input, key) => {\n if (key.escape) {\n props.onCancel()\n return true\n }\n })\n\n const isBuiltIn = props.agent.source === 'built-in'\n const options = [\n { label: 'View agent', value: 'view' },\n ...(isBuiltIn\n ? []\n : [\n { label: 'Edit agent', value: 'edit' },\n { label: 'Delete agent', value: 'delete' },\n ]),\n { label: 'Back', value: 'back' },\n ]\n\n return (\n <>\n <Panel title={props.agent.agentType}>\n <Box flexDirection=\"column\" marginTop={1}>\n <Select\n options={options}\n onChange={value => {\n if (isAgentMenuChoice(value)) props.onChoose(value)\n }}\n />\n </Box>\n </Panel>\n <Instructions />\n </>\n )\n}\n", "import React from 'react'\nimport { Box, Text } from 'ink'\nimport { getTheme } from '#core/utils/theme'\nimport { Divider } from '#ui-ink/primitives/components/Divider'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\n\nexport function Panel(props: {\n title: string\n subtitle?: string\n titleColor?: string\n children?: React.ReactNode\n}) {\n const theme = getTheme()\n const layout = useScreenLayout()\n const dividerWidth = Math.max(1, layout.columns - layout.paddingX * 2)\n return (\n <Box flexDirection=\"column\" width=\"100%\">\n <Box\n flexDirection=\"column\"\n paddingX={layout.paddingX}\n paddingTop={layout.paddingY}\n >\n <Text bold color={props.titleColor ?? theme.text}>\n {props.title}\n </Text>\n {props.subtitle ? (\n <Text dimColor wrap=\"truncate-end\">\n {props.subtitle}\n </Text>\n ) : null}\n </Box>\n <Box paddingX={layout.paddingX}>\n <Divider width={dividerWidth} />\n </Box>\n <Box\n paddingX={layout.paddingX}\n paddingBottom={layout.paddingY}\n flexDirection=\"column\"\n >\n {props.children}\n </Box>\n </Box>\n )\n}\n\nexport function Instructions({\n instructions = 'Press \u2191\u2193 to navigate \u00B7 Enter to select \u00B7 Esc to go back',\n}: {\n instructions?: string\n}) {\n return (\n <Box marginLeft={3}>\n <Text dimColor>{instructions}</Text>\n </Box>\n )\n}\n", "import React, { useEffect, useMemo, useState } from 'react'\nimport { Box, Text } from 'ink'\nimport figures from 'figures'\nimport { getTheme } from '#core/utils/theme'\nimport { Instructions, Panel } from './components'\nimport type { AgentSourceFilter, AgentWithOverride } from './types'\nimport { formatModelShort, titleForSource } from './utils'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\n\nfunction agentRowKey(agent: AgentWithOverride): string {\n const baseDir = agent.baseDir ?? ''\n const filename = agent.filename ?? ''\n const location = agent.location ?? ''\n return `${agent.agentType}-${agent.source}-${location}-${baseDir}-${filename}`\n}\n\nexport function AgentsListView(props: {\n source: AgentSourceFilter\n agents: AgentWithOverride[]\n changes: string[]\n onCreateNew?: () => void\n onSelect: (agent: AgentWithOverride) => void\n onBack: () => void\n}) {\n const theme = getTheme()\n\n const selectableAgents = useMemo(() => {\n const nonBuiltIn = props.agents.filter(a => a.source !== 'built-in')\n if (props.source === 'all') {\n return [\n ...nonBuiltIn.filter(a => a.source === 'userSettings'),\n ...nonBuiltIn.filter(a => a.source === 'projectSettings'),\n ...nonBuiltIn.filter(a => a.source === 'policySettings'),\n ]\n }\n return nonBuiltIn\n }, [props.agents, props.source])\n\n const [selectedAgent, setSelectedAgent] = useState<AgentWithOverride | null>(\n null,\n )\n const [onCreateOption, setOnCreateOption] = useState(true)\n\n useEffect(() => {\n if (props.onCreateNew) {\n setOnCreateOption(true)\n setSelectedAgent(null)\n return\n }\n if (!selectedAgent && selectableAgents.length > 0) {\n setSelectedAgent(selectableAgents[0] ?? null)\n }\n }, [props.onCreateNew, selectableAgents, selectedAgent])\n\n useKeypress((_input, key) => {\n if (key.escape) {\n props.onBack()\n return true\n }\n\n if (key.return) {\n if (onCreateOption && props.onCreateNew) {\n props.onCreateNew()\n return true\n }\n if (selectedAgent) props.onSelect(selectedAgent)\n return true\n }\n\n if (!key.upArrow && !key.downArrow) return\n\n const hasCreate = Boolean(props.onCreateNew)\n const navigableCount = selectableAgents.length + (hasCreate ? 1 : 0)\n if (navigableCount === 0) return\n\n const currentIndex = (() => {\n if (hasCreate && onCreateOption) return 0\n if (!selectedAgent) return hasCreate ? 0 : 0\n const selectedKey = agentRowKey(selectedAgent)\n const idx = selectableAgents.findIndex(\n a => agentRowKey(a) === selectedKey,\n )\n if (idx < 0) return hasCreate ? 0 : 0\n return hasCreate ? idx + 1 : idx\n })()\n\n const nextIndex = key.upArrow\n ? currentIndex === 0\n ? navigableCount - 1\n : currentIndex - 1\n : currentIndex === navigableCount - 1\n ? 0\n : currentIndex + 1\n\n if (hasCreate && nextIndex === 0) {\n setOnCreateOption(true)\n setSelectedAgent(null)\n return true\n }\n\n const agentIndex = hasCreate ? nextIndex - 1 : nextIndex\n const nextAgent = selectableAgents[agentIndex]\n if (nextAgent) {\n setOnCreateOption(false)\n setSelectedAgent(nextAgent)\n return true\n }\n })\n\n const renderCreateNew = () => (\n <Box>\n <Text color={onCreateOption ? theme.suggestion : undefined}>\n {onCreateOption ? `${figures.pointer} ` : ' '}\n </Text>\n <Text color={onCreateOption ? theme.suggestion : undefined}>\n Create new agent\n </Text>\n </Box>\n )\n\n const renderAgentRow = (agent: AgentWithOverride) => {\n const isBuiltIn = agent.source === 'built-in'\n const isSelected =\n !isBuiltIn &&\n !onCreateOption &&\n selectedAgent &&\n agentRowKey(selectedAgent) === agentRowKey(agent)\n\n const dimmed = Boolean(isBuiltIn || agent.overriddenBy)\n const rowColor = isSelected ? theme.suggestion : undefined\n const pointer = isBuiltIn ? '' : isSelected ? `${figures.pointer} ` : ' '\n\n return (\n <Box key={agentRowKey(agent)} flexDirection=\"row\">\n <Text dimColor={dimmed && !isSelected} color={rowColor}>\n {pointer}\n </Text>\n <Text dimColor={dimmed && !isSelected} color={rowColor}>\n {agent.agentType}\n </Text>\n <Text dimColor color={rowColor}>\n {' \u00B7 '}\n {formatModelShort(agent.model)}\n </Text>\n {agent.overriddenBy ? (\n <Text\n dimColor={!isSelected}\n color={isSelected ? theme.warning : undefined}\n >\n {' '}\n {figures.warning} overridden by {agent.overriddenBy}\n </Text>\n ) : null}\n </Box>\n )\n }\n\n const group = (label: string, agents: AgentWithOverride[]) => {\n if (agents.length === 0) return null\n const baseDir = agents[0]?.baseDir\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Box paddingLeft={2}>\n <Text bold dimColor>\n {label}\n </Text>\n {baseDir ? <Text dimColor> ({baseDir})</Text> : null}\n </Box>\n {agents.map(renderAgentRow)}\n </Box>\n )\n }\n\n const builtInSection = (label = 'Built-in (always available):') => {\n const builtIn = props.agents.filter(a => a.source === 'built-in')\n if (builtIn.length === 0) return null\n return (\n <Box flexDirection=\"column\" marginBottom={1} paddingLeft={2}>\n <Text bold dimColor>\n {label}\n </Text>\n {builtIn.map(renderAgentRow)}\n </Box>\n )\n }\n\n const notOverriddenCount = props.agents.filter(a => !a.overriddenBy).length\n const title = titleForSource(props.source)\n\n if (\n props.agents.length === 0 ||\n (props.source !== 'built-in' &&\n !props.agents.some(a => a.source !== 'built-in'))\n ) {\n return (\n <>\n <Panel title={title} subtitle=\"No agents found\">\n {props.onCreateNew ? (\n <Box marginY={1}>{renderCreateNew()}</Box>\n ) : null}\n <Text dimColor>\n No agents found. Create specialized subagents that the CLI can\n delegate to.\n </Text>\n <Text dimColor>\n Each subagent has its own context window, custom system prompt, and\n specific tools.\n </Text>\n <Text dimColor>\n Try creating: Code Reviewer, Code Simplifier, Security Reviewer,\n Tech Lead, or UX Reviewer.\n </Text>\n {props.source !== 'built-in' &&\n props.agents.some(a => a.source === 'built-in') ? (\n <>\n <Box marginTop={1}>\n <Text dimColor>{'\u2500'.repeat(40)}</Text>\n </Box>\n {builtInSection()}\n </>\n ) : null}\n </Panel>\n <Instructions />\n </>\n )\n }\n\n return (\n <>\n <Panel title={title} subtitle={`${notOverriddenCount} agents`}>\n {props.changes.length > 0 ? (\n <Box marginTop={1}>\n <Text dimColor>{props.changes[props.changes.length - 1]}</Text>\n </Box>\n ) : null}\n\n <Box flexDirection=\"column\" marginTop={1}>\n {props.onCreateNew ? (\n <Box marginBottom={1}>{renderCreateNew()}</Box>\n ) : null}\n\n {props.source === 'all' ? (\n <>\n {group(\n 'User agents',\n props.agents.filter(a => a.source === 'userSettings'),\n )}\n {group(\n 'Project agents',\n props.agents.filter(a => a.source === 'projectSettings'),\n )}\n {group(\n 'Managed agents',\n props.agents.filter(a => a.source === 'policySettings'),\n )}\n {group(\n 'Plugin agents',\n props.agents.filter(a => a.source === 'plugin'),\n )}\n {group(\n 'CLI arg agents',\n props.agents.filter(a => a.source === 'flagSettings'),\n )}\n {builtInSection('Built-in agents (always available)')}\n </>\n ) : props.source === 'built-in' ? (\n <>\n <Text dimColor italic>\n Built-in agents are provided by default and cannot be modified.\n </Text>\n <Box marginTop={1} flexDirection=\"column\">\n {props.agents.map(renderAgentRow)}\n </Box>\n </>\n ) : (\n <Box flexDirection=\"column\">\n {props.agents\n .filter(a => a.source !== 'built-in')\n .map(renderAgentRow)}\n </Box>\n )}\n </Box>\n </Panel>\n <Instructions />\n </>\n )\n}\n", "import { spawn } from 'child_process'\nimport type { OptionSubtree } from '#ui-ink/components/CustomSelect/select'\nimport { getModelManager } from '#core/utils/model'\nimport type { AgentSourceFilter } from './types'\nimport { DEFAULT_AGENT_MODEL } from './types'\n\nexport function openInEditor(filePath: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const platform = process.platform\n let command: string\n let args: string[]\n\n switch (platform) {\n case 'darwin':\n command = 'open'\n args = [filePath]\n break\n case 'win32':\n command = 'cmd'\n args = ['/c', 'start', '', filePath]\n break\n default:\n command = 'xdg-open'\n args = [filePath]\n break\n }\n\n const child = spawn(command, args, { detached: true, stdio: 'ignore' })\n child.unref()\n child.on('error', err => reject(err))\n child.on('exit', code =>\n code === 0 ? resolve() : reject(new Error(`Editor exited with ${code}`)),\n )\n })\n}\n\nexport function titleForSource(source: AgentSourceFilter): string {\n switch (source) {\n case 'all':\n return 'Agents'\n case 'built-in':\n return 'Built-in agents'\n case 'plugin':\n return 'Plugin agents'\n case 'userSettings':\n return 'User agents'\n case 'projectSettings':\n return 'Project agents'\n case 'policySettings':\n return 'Managed agents'\n case 'flagSettings':\n return 'CLI arg agents'\n default:\n return 'Agents'\n }\n}\n\nexport function formatModelShort(model: string | undefined): string {\n const value = model || DEFAULT_AGENT_MODEL\n return value === 'inherit' ? 'inherit' : value\n}\n\nexport function formatModelLong(model: string | undefined): string {\n if (!model) return 'Sonnet (default)'\n if (model === 'inherit') return 'Inherit from parent'\n if (model === 'sonnet' || model === 'opus' || model === 'haiku') {\n return model.charAt(0).toUpperCase() + model.slice(1)\n }\n return model\n}\n\nexport function getToolNameFromSpec(spec: string): string {\n const trimmed = spec.trim()\n if (!trimmed) return trimmed\n const match = trimmed.match(/^([^(]+)\\\\(([^)]+)\\\\)$/)\n if (!match) return trimmed\n const toolName = match[1]?.trim()\n return toolName || trimmed\n}\n\nexport function parseMcpToolName(\n name: string,\n): { serverName: string; toolName: string } | null {\n if (!name.startsWith('mcp__')) return null\n const parts = name.split('__')\n if (parts.length < 3) return null\n return {\n serverName: parts[1] || 'unknown',\n toolName: parts.slice(2).join('__'),\n }\n}\n\nexport function toSelectableToolNames(\n toolSpecs: string[] | '*',\n): string[] | undefined {\n if (toolSpecs === '*') return undefined\n const names = toolSpecs.map(getToolNameFromSpec).filter(Boolean)\n if (names.includes('*')) return undefined\n return names\n}\n\nexport function modelOptions(): (\n | OptionSubtree\n | { label: string; value: string }\n)[] {\n const profiles = (() => {\n try {\n return getModelManager().getActiveModelProfiles() as Array<{\n name: string\n modelName: string\n provider?: string\n }>\n } catch {\n return []\n }\n })()\n\n const base: Array<{ label: string; value: string }> = [\n { value: 'sonnet', label: 'Task (alias: sonnet)' },\n { value: 'opus', label: 'Main (alias: opus)' },\n { value: 'haiku', label: 'Quick (alias: haiku)' },\n { value: 'inherit', label: 'Inherit from parent' },\n ]\n\n const extras: Array<{ label: string; value: string }> = []\n for (const profile of profiles) {\n if (!profile?.name) continue\n const value = profile.name\n if (base.some(o => o.value === value)) continue\n extras.push({\n value,\n label:\n profile.provider && profile.modelName\n ? `${profile.name} (${profile.provider}:${profile.modelName})`\n : profile.name,\n })\n }\n\n if (extras.length === 0) return base\n\n return [\n { header: 'Compatibility aliases', options: base },\n {\n header: 'Model profiles',\n options: extras.sort((a, b) => a.label.localeCompare(b.label)),\n },\n ]\n}\n", "import type { AgentConfig, AgentSource } from '#core/utils/agentLoader'\n\nexport type AgentSourceFilter =\n | 'all'\n | 'built-in'\n | 'userSettings'\n | 'projectSettings'\n | 'policySettings'\n | 'flagSettings'\n | 'plugin'\n\nexport type AgentWithOverride = AgentConfig & { overriddenBy?: AgentSource }\n\nexport const DEFAULT_AGENT_MODEL = 'sonnet'\n\nexport const COLOR_OPTIONS = [\n 'automatic',\n 'red',\n 'blue',\n 'green',\n 'yellow',\n 'purple',\n 'orange',\n 'pink',\n 'cyan',\n] as const\n\nexport type AgentColor = (typeof COLOR_OPTIONS)[number]\n\nexport type ModeState =\n | { mode: 'list-agents'; source: AgentSourceFilter }\n | {\n mode: 'create-agent'\n previousMode: { mode: 'list-agents'; source: AgentSourceFilter }\n }\n | {\n mode: 'agent-menu'\n agent: AgentWithOverride\n previousMode: { mode: 'list-agents'; source: AgentSourceFilter }\n }\n | {\n mode: 'view-agent'\n agent: AgentWithOverride\n previousMode: {\n mode: 'agent-menu'\n agent: AgentWithOverride\n previousMode: { mode: 'list-agents'; source: AgentSourceFilter }\n }\n }\n | {\n mode: 'edit-agent'\n agent: AgentWithOverride\n previousMode: {\n mode: 'agent-menu'\n agent: AgentWithOverride\n previousMode: { mode: 'list-agents'; source: AgentSourceFilter }\n }\n }\n | {\n mode: 'delete-confirm'\n agent: AgentWithOverride\n previousMode: {\n mode: 'agent-menu'\n agent: AgentWithOverride\n previousMode: { mode: 'list-agents'; source: AgentSourceFilter }\n }\n }\n", "import React, { useMemo } from 'react'\nimport chalk from 'chalk'\nimport type { AgentConfig } from '#core/utils/agentLoader'\nimport type { Tool } from '../tooling'\nimport { getPrimaryAgentFilePath, saveAgent } from '../storage'\nimport { openInEditor } from './utils'\nimport { Wizard, type WizardContextValue } from './wizard/Wizard'\nimport { wizardLocationToStorageLocation } from './wizard/types'\nimport { StepAgentType } from './wizard/steps/StepAgentType'\nimport { StepChooseColor } from './wizard/steps/StepChooseColor'\nimport { StepChooseLocation } from './wizard/steps/StepChooseLocation'\nimport { StepChooseMethod } from './wizard/steps/StepChooseMethod'\nimport { StepConfirm } from './wizard/steps/StepConfirm'\nimport { StepDescription } from './wizard/steps/StepDescription'\nimport { StepGenerationPrompt } from './wizard/steps/StepGenerationPrompt'\nimport { StepSelectModel } from './wizard/steps/StepSelectModel'\nimport { StepSelectTools } from './wizard/steps/StepSelectTools'\nimport { StepSystemPrompt } from './wizard/steps/StepSystemPrompt'\n\nexport function CreateAgentWizard(props: {\n tools: Tool[]\n existingAgents: AgentConfig[]\n onComplete: (message: string) => void\n onCancel: () => void\n}) {\n const steps = useMemo(() => {\n return [\n (ctx: WizardContextValue) => <StepChooseLocation ctx={ctx} />,\n (ctx: WizardContextValue) => <StepChooseMethod ctx={ctx} />,\n (ctx: WizardContextValue) => (\n <StepGenerationPrompt ctx={ctx} existingAgents={props.existingAgents} />\n ),\n (ctx: WizardContextValue) => <StepAgentType ctx={ctx} />,\n (ctx: WizardContextValue) => <StepSystemPrompt ctx={ctx} />,\n (ctx: WizardContextValue) => <StepDescription ctx={ctx} />,\n (ctx: WizardContextValue) => (\n <StepSelectTools ctx={ctx} tools={props.tools} />\n ),\n (ctx: WizardContextValue) => <StepSelectModel ctx={ctx} />,\n (ctx: WizardContextValue) => <StepChooseColor ctx={ctx} />,\n (ctx: WizardContextValue) => (\n <StepConfirm\n ctx={ctx}\n tools={props.tools}\n existingAgents={props.existingAgents}\n onSave={async (finalAgent, openEditor) => {\n const location = wizardLocationToStorageLocation(finalAgent.source)\n const tools = finalAgent.tools ?? ['*']\n await saveAgent(\n location,\n finalAgent.agentType,\n finalAgent.whenToUse,\n tools,\n finalAgent.systemPrompt,\n finalAgent.model,\n finalAgent.color,\n true,\n )\n\n if (openEditor) {\n const path = getPrimaryAgentFilePath(\n location,\n finalAgent.agentType,\n )\n await openInEditor(path)\n props.onComplete(\n `Created agent: ${chalk.bold(finalAgent.agentType)} and opened in editor. If you made edits, restart to load the latest version.`,\n )\n return\n }\n\n props.onComplete(\n `Created agent: ${chalk.bold(finalAgent.agentType)}`,\n )\n }}\n />\n ),\n ]\n }, [props])\n\n return <Wizard steps={steps} onCancel={props.onCancel} onDone={() => {}} />\n}\n", "import React, { useCallback, useMemo, useState } from 'react'\nimport { Instructions, Panel } from '../components'\nimport type { WizardData } from './types'\n\nexport type WizardContextValue = {\n stepIndex: number\n totalSteps: number\n wizardData: WizardData\n updateWizardData: (patch: Partial<WizardData>) => void\n goNext: () => void\n goBack: () => void\n goToStep: (index: number) => void\n cancel: () => void\n done: () => void\n}\n\nexport function Wizard(props: {\n steps: Array<(ctx: WizardContextValue) => React.ReactNode>\n initialData?: WizardData\n onCancel: () => void\n onDone: (data: WizardData) => void\n}) {\n const [stepIndex, setStepIndex] = useState(0)\n const [data, setData] = useState<WizardData>(props.initialData ?? {})\n const [history, setHistory] = useState<number[]>([])\n\n const goNext = useCallback(() => {\n setHistory(prev => [...prev, stepIndex])\n setStepIndex(prev => Math.min(prev + 1, props.steps.length - 1))\n }, [props.steps.length, stepIndex])\n\n const goBack = useCallback(() => {\n setHistory(prev => {\n if (prev.length === 0) {\n props.onCancel()\n return prev\n }\n const next = [...prev]\n const last = next.pop()\n if (typeof last === 'number') setStepIndex(last)\n return next\n })\n }, [props.onCancel])\n\n const goToStep = useCallback(\n (index: number) => {\n setHistory(prev => [...prev, stepIndex])\n setStepIndex(() => Math.max(0, Math.min(index, props.steps.length - 1)))\n },\n [props.steps.length, stepIndex],\n )\n\n const updateWizardData = useCallback((patch: Partial<WizardData>) => {\n setData(prev => ({ ...prev, ...patch }))\n }, [])\n\n const cancel = useCallback(() => props.onCancel(), [props.onCancel])\n const done = useCallback(() => props.onDone(data), [props, data])\n\n const ctx: WizardContextValue = useMemo(\n () => ({\n stepIndex,\n totalSteps: props.steps.length,\n wizardData: data,\n updateWizardData,\n goNext,\n goBack,\n goToStep,\n cancel,\n done,\n }),\n [\n data,\n done,\n goBack,\n goNext,\n goToStep,\n props.steps.length,\n stepIndex,\n updateWizardData,\n cancel,\n ],\n )\n\n return <>{props.steps[stepIndex]?.(ctx) ?? null}</>\n}\n\nexport function WizardPanel(props: {\n subtitle: string\n footerText?: string\n children?: React.ReactNode\n}) {\n return (\n <>\n <Panel title=\"Create new agent\" subtitle={props.subtitle}>\n {props.children}\n </Panel>\n <Instructions instructions={props.footerText} />\n </>\n )\n}\n", "export type WizardLocation = 'projectSettings' | 'userSettings'\nexport type WizardMethod = 'generate' | 'manual'\n\nexport type WizardFinalAgent = {\n agentType: string\n whenToUse: string\n systemPrompt: string\n tools: string[] | undefined\n model: string\n color?: string\n source: WizardLocation\n}\n\nexport type WizardData = {\n location?: WizardLocation\n method?: WizardMethod\n generationPrompt?: string\n agentType?: string\n whenToUse?: string\n systemPrompt?: string\n selectedTools?: string[] | undefined\n selectedModel?: string\n selectedColor?: string\n wasGenerated?: boolean\n isGenerating?: boolean\n finalAgent?: WizardFinalAgent\n}\n\nexport function wizardLocationToStorageLocation(\n location: WizardLocation,\n): 'project' | 'user' {\n return location === 'projectSettings' ? 'project' : 'user'\n}\n", "import React, { useState } from 'react'\nimport { Box, Text } from 'ink'\nimport TextInput from '#ui-ink/components/TextInput'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { validateAgentType } from '../../../generation'\nimport { themeColor } from '../../colors'\nimport { WizardPanel, type WizardContextValue } from '../Wizard'\n\nexport function StepAgentType({ ctx }: { ctx: WizardContextValue }) {\n const [value, setValue] = useState(ctx.wizardData.agentType ?? '')\n const [cursorOffset, setCursorOffset] = useState(value.length)\n const [error, setError] = useState<string | null>(null)\n const columns = 60\n\n useKeypress((_input, key) => {\n if (key.escape) {\n ctx.goBack()\n return true\n }\n })\n\n const onSubmit = (next: string) => {\n const trimmed = next.trim()\n const validation = validateAgentType(trimmed)\n if (!validation.isValid) {\n setError(validation.errors[0] ?? 'Invalid agent type')\n return\n }\n setError(null)\n ctx.updateWizardData({ agentType: trimmed })\n ctx.goNext()\n }\n\n return (\n <WizardPanel\n subtitle=\"Agent type (identifier)\"\n footerText=\"Press Enter to continue \u00B7 Esc to go back\"\n >\n <Box flexDirection=\"column\" marginTop={1} gap={1}>\n <Text>Enter a unique identifier for your agent:</Text>\n <TextInput\n value={value}\n onChange={setValue}\n columns={columns}\n onSubmit={onSubmit}\n cursorOffset={cursorOffset}\n onChangeCursorOffset={setCursorOffset}\n />\n <Text dimColor>e.g., code-reviewer, tech-lead, etc</Text>\n {error ? <Text color={themeColor('error')}>{error}</Text> : null}\n </Box>\n </WizardPanel>\n )\n}\n", "import { getTheme } from '#core/utils/theme'\n\nexport function panelBorderColor(kind: 'suggestion' | 'error'): string {\n const theme = getTheme()\n return kind === 'error' ? theme.error : theme.suggestion\n}\n\nexport function themeColor(\n kind: 'error' | 'warning' | 'success' | 'suggestion',\n): string {\n const theme = getTheme()\n switch (kind) {\n case 'error':\n return theme.error\n case 'warning':\n return theme.warning\n case 'success':\n return theme.success\n case 'suggestion':\n default:\n return theme.suggestion\n }\n}\n", "import React from 'react'\nimport { Box } from 'ink'\nimport { ColorPicker } from '../../ColorPicker'\nimport type { AgentColor } from '../../types'\nimport { DEFAULT_AGENT_MODEL } from '../../types'\nimport type { WizardFinalAgent } from '../types'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { WizardPanel, type WizardContextValue } from '../Wizard'\n\nexport function StepChooseColor({ ctx }: { ctx: WizardContextValue }) {\n useKeypress((_input, key) => {\n if (key.escape) {\n ctx.goBack()\n return true\n }\n })\n\n const agentType = ctx.wizardData.agentType ?? 'agent'\n const onConfirm = (color: AgentColor) => {\n const selectedColor = color === 'automatic' ? undefined : color\n const finalAgent: WizardFinalAgent = {\n agentType: ctx.wizardData.agentType ?? agentType,\n whenToUse: ctx.wizardData.whenToUse ?? '',\n systemPrompt: ctx.wizardData.systemPrompt ?? '',\n tools: ctx.wizardData.selectedTools,\n model: ctx.wizardData.selectedModel ?? DEFAULT_AGENT_MODEL,\n ...(selectedColor ? { color: selectedColor } : {}),\n source: ctx.wizardData.location ?? 'projectSettings',\n }\n\n ctx.updateWizardData({\n selectedColor: selectedColor,\n finalAgent,\n })\n ctx.goNext()\n }\n\n return (\n <WizardPanel\n subtitle=\"Choose background color\"\n footerText=\"Press \u2191\u2193 to navigate \u00B7 Enter to select \u00B7 Esc to go back\"\n >\n <Box marginTop={1}>\n <ColorPicker\n agentName={agentType}\n currentColor=\"automatic\"\n onConfirm={onConfirm}\n />\n </Box>\n </WizardPanel>\n )\n}\n", "import React, { useState } from 'react'\nimport { Box, Text } from 'ink'\nimport figures from 'figures'\nimport { themeColor } from './colors'\nimport { COLOR_OPTIONS, type AgentColor } from './types'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\n\nexport function ColorPicker(props: {\n agentName: string\n currentColor: AgentColor\n onConfirm: (color: AgentColor) => void\n}) {\n const [index, setIndex] = useState(\n Math.max(\n 0,\n COLOR_OPTIONS.findIndex(c => c === props.currentColor),\n ),\n )\n\n useKeypress((_input, key) => {\n if (key.upArrow) {\n setIndex(i => (i > 0 ? i - 1 : COLOR_OPTIONS.length - 1))\n return true\n }\n if (key.downArrow) {\n setIndex(i => (i < COLOR_OPTIONS.length - 1 ? i + 1 : 0))\n return true\n }\n if (key.return) {\n props.onConfirm(COLOR_OPTIONS[index] ?? 'automatic')\n return true\n }\n })\n\n return (\n <Box flexDirection=\"column\" gap={1}>\n {COLOR_OPTIONS.map((color, i) => {\n const focused = i === index\n const prefix = focused ? figures.pointer : ' '\n const label =\n color === 'automatic'\n ? 'Automatic color'\n : color.charAt(0).toUpperCase() + color.slice(1)\n return (\n <React.Fragment key={color}>\n <Text\n color={focused ? themeColor('suggestion') : undefined}\n bold={focused}\n >\n {prefix} {label}\n </Text>\n </React.Fragment>\n )\n })}\n </Box>\n )\n}\n", "import React from 'react'\nimport { Box } from 'ink'\nimport { Select } from '#ui-ink/components/CustomSelect/select'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { WizardPanel, type WizardContextValue } from '../Wizard'\n\nexport function StepChooseLocation({ ctx }: { ctx: WizardContextValue }) {\n useKeypress((_input, key) => {\n if (key.escape) {\n ctx.cancel()\n return true\n }\n })\n\n return (\n <WizardPanel\n subtitle=\"Choose location\"\n footerText=\"Press \u2191\u2193 to navigate \u00B7 Enter to select \u00B7 Esc to cancel\"\n >\n <Box marginTop={1}>\n <Select\n key=\"location-select\"\n options={[\n { label: 'Project (.kode/agents/)', value: 'projectSettings' },\n { label: 'Personal (~/.kode/agents/)', value: 'userSettings' },\n ]}\n onChange={value => {\n const location =\n value === 'projectSettings' ? 'projectSettings' : 'userSettings'\n ctx.updateWizardData({ location })\n ctx.goNext()\n }}\n />\n </Box>\n </WizardPanel>\n )\n}\n", "import React from 'react'\nimport { Box } from 'ink'\nimport { Select } from '#ui-ink/components/CustomSelect/select'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { WizardPanel, type WizardContextValue } from '../Wizard'\nimport type { WizardMethod } from '../types'\n\nexport function StepChooseMethod({ ctx }: { ctx: WizardContextValue }) {\n useKeypress((_input, key) => {\n if (key.escape) {\n ctx.goBack()\n return true\n }\n })\n\n return (\n <WizardPanel\n subtitle=\"Creation method\"\n footerText=\"Press \u2191\u2193 to navigate \u00B7 Enter to select \u00B7 Esc to go back\"\n >\n <Box marginTop={1}>\n <Select\n key=\"method-select\"\n options={[\n {\n label: 'Generate with the current model (recommended)',\n value: 'generate',\n },\n { label: 'Manual configuration', value: 'manual' },\n ]}\n onChange={value => {\n const method: WizardMethod =\n value === 'manual' ? 'manual' : 'generate'\n ctx.updateWizardData({\n method,\n wasGenerated: method === 'generate',\n })\n if (method === 'generate') ctx.goNext()\n else ctx.goToStep(3)\n }}\n />\n </Box>\n </WizardPanel>\n )\n}\n", "import React, { useState } from 'react'\nimport { Box, Text } from 'ink'\nimport type { AgentConfig } from '#core/utils/agentLoader'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport type { Tool } from '../../../tooling'\nimport { validateAgentConfig, validateAgentType } from '../../../generation'\nimport { getPrimaryAgentFilePath } from '../../../storage'\nimport { themeColor } from '../../colors'\nimport { formatModelLong, titleForSource } from '../../utils'\nimport { WizardPanel, type WizardContextValue } from '../Wizard'\nimport type { WizardFinalAgent } from '../types'\n\nfunction validateFinalAgent(args: {\n finalAgent: WizardFinalAgent\n tools: Tool[]\n existingAgents: AgentConfig[]\n}): { errors: string[]; warnings: string[] } {\n const errors: string[] = []\n const warnings: string[] = []\n\n const typeValidation = validateAgentType(args.finalAgent.agentType)\n errors.push(...typeValidation.errors)\n warnings.push(...typeValidation.warnings)\n\n const duplicate = args.existingAgents.find(\n agent =>\n agent.agentType === args.finalAgent.agentType &&\n agent.source !== 'built-in' &&\n agent.source !== args.finalAgent.source,\n )\n if (duplicate) {\n errors.push(\n `Agent type \"${args.finalAgent.agentType}\" already exists in ${titleForSource(duplicate.source as any)}`,\n )\n }\n\n const configValidation = validateAgentConfig({\n agentType: args.finalAgent.agentType,\n whenToUse: args.finalAgent.whenToUse,\n systemPrompt: args.finalAgent.systemPrompt,\n selectedTools: args.finalAgent.tools,\n })\n errors.push(...configValidation.errors)\n warnings.push(...configValidation.warnings)\n\n const availableToolNames = new Set(args.tools.map(t => t.name))\n const selectedTools = args.finalAgent.tools ?? undefined\n if (selectedTools && selectedTools.length > 0) {\n const unknown = selectedTools.filter(t => !availableToolNames.has(t))\n if (unknown.length > 0)\n warnings.push(`Unrecognized tools: ${unknown.join(', ')}`)\n }\n\n return { errors, warnings }\n}\n\nexport function StepConfirm(props: {\n ctx: WizardContextValue\n tools: Tool[]\n existingAgents: AgentConfig[]\n onSave: (finalAgent: WizardFinalAgent, openEditor: boolean) => Promise<void>\n}) {\n const { ctx } = props\n const finalAgent = ctx.wizardData.finalAgent\n const [error, setError] = useState<string | null>(null)\n\n useKeypress((input, key) => {\n if (key.escape) {\n ctx.goBack()\n return true\n }\n if (input === 'e') {\n void doSave(true)\n return true\n }\n if (input === 's' || key.return) {\n void doSave(false)\n return true\n }\n })\n\n const toolSummary = (tools: string[] | undefined): string => {\n if (tools === undefined) return 'All tools'\n if (tools.length === 0) return 'None'\n if (tools.length === 1) return tools[0] || 'None'\n if (tools.length === 2) return tools.join(' and ')\n return `${tools.slice(0, -1).join(', ')}, and ${tools[tools.length - 1]}`\n }\n\n const doSave = async (openEditor: boolean) => {\n if (!finalAgent) return\n const { errors } = validateFinalAgent({\n finalAgent,\n tools: props.tools,\n existingAgents: props.existingAgents,\n })\n if (errors.length > 0) {\n setError(errors[0] ?? 'Invalid agent configuration')\n return\n }\n try {\n await props.onSave(finalAgent, openEditor)\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n }\n }\n\n if (!finalAgent) return null\n\n const validation = validateFinalAgent({\n finalAgent,\n tools: props.tools,\n existingAgents: props.existingAgents,\n })\n\n const locationPath =\n finalAgent.source === 'projectSettings'\n ? getPrimaryAgentFilePath('project', finalAgent.agentType)\n : getPrimaryAgentFilePath('user', finalAgent.agentType)\n\n const truncate = (text: string) =>\n text.length > 240 ? `${text.slice(0, 240)}\u2026` : text\n\n return (\n <WizardPanel\n subtitle=\"Confirm and save\"\n footerText=\"Press s/Enter to save \u00B7 e to edit in your editor \u00B7 Esc to cancel\"\n >\n <Box flexDirection=\"column\" marginTop={1} gap={1}>\n <Text>\n <Text bold>Name</Text>: {finalAgent.agentType}\n </Text>\n <Text>\n <Text bold>Location</Text>: {locationPath}\n </Text>\n <Text>\n <Text bold>Tools</Text>: {toolSummary(finalAgent.tools)}\n </Text>\n <Text>\n <Text bold>Model</Text>: {formatModelLong(finalAgent.model)}\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\">\n <Text>\n <Text bold>Description</Text> (tells the agent when to use this\n agent):\n </Text>\n <Box marginLeft={2} marginTop={1}>\n <Text>{truncate(finalAgent.whenToUse)}</Text>\n </Box>\n </Box>\n\n <Box marginTop={1} flexDirection=\"column\">\n <Text>\n <Text bold>System prompt</Text>:\n </Text>\n <Box marginLeft={2} marginTop={1}>\n <Text>{truncate(finalAgent.systemPrompt)}</Text>\n </Box>\n </Box>\n\n {validation.warnings.length > 0 ? (\n <Box marginTop={1} flexDirection=\"column\">\n <Text color={themeColor('warning')}>Warnings:</Text>\n {validation.warnings.map((w, i) => (\n <React.Fragment key={i}>\n <Text dimColor> \u2022 {w}</Text>\n </React.Fragment>\n ))}\n </Box>\n ) : null}\n\n {validation.errors.length > 0 ? (\n <Box marginTop={1} flexDirection=\"column\">\n <Text color={themeColor('error')}>Errors:</Text>\n {validation.errors.map((e, i) => (\n <React.Fragment key={i}>\n <Text color={themeColor('error')}> \u2022 {e}</Text>\n </React.Fragment>\n ))}\n </Box>\n ) : null}\n\n {error ? (\n <Box marginTop={1}>\n <Text color={themeColor('error')}>{error}</Text>\n </Box>\n ) : null}\n </Box>\n </WizardPanel>\n )\n}\n", "import React, { useState } from 'react'\nimport { Box, Text } from 'ink'\nimport TextInput from '#ui-ink/components/TextInput'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { themeColor } from '../../colors'\nimport { WizardPanel, type WizardContextValue } from '../Wizard'\n\nexport function StepDescription({ ctx }: { ctx: WizardContextValue }) {\n const [value, setValue] = useState(ctx.wizardData.whenToUse ?? '')\n const [cursorOffset, setCursorOffset] = useState(value.length)\n const [error, setError] = useState<string | null>(null)\n const columns = Math.min(80, process.stdout.columns ?? 80)\n\n useKeypress((_input, key) => {\n if (key.escape) {\n ctx.goBack()\n return true\n }\n })\n\n const onSubmit = (next: string) => {\n const trimmed = next.trim()\n if (!trimmed) {\n setError('Description is required')\n return\n }\n setError(null)\n ctx.updateWizardData({ whenToUse: trimmed })\n ctx.goNext()\n }\n\n return (\n <WizardPanel\n subtitle=\"Description (tell the agent when to use this agent)\"\n footerText=\"Press Enter to continue \u00B7 Esc to go back\"\n >\n <Box flexDirection=\"column\" marginTop={1} gap={1}>\n <Text>When should this agent be used?</Text>\n <TextInput\n value={value}\n onChange={setValue}\n columns={columns}\n multiline\n onSubmit={onSubmit}\n cursorOffset={cursorOffset}\n onChangeCursorOffset={setCursorOffset}\n />\n {error ? <Text color={themeColor('error')}>{error}</Text> : null}\n </Box>\n </WizardPanel>\n )\n}\n", "import React, { useRef, useState } from 'react'\nimport { Box, Text } from 'ink'\nimport TextInput from '#ui-ink/components/TextInput'\nimport type { AgentConfig } from '#core/utils/agentLoader'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { generateAgentDraft } from '../../../generation'\nimport { themeColor } from '../../colors'\nimport { WizardPanel, type WizardContextValue } from '../Wizard'\n\nexport function StepGenerationPrompt(props: {\n ctx: WizardContextValue\n existingAgents: AgentConfig[]\n}) {\n const { ctx } = props\n const [value, setValue] = useState(ctx.wizardData.generationPrompt ?? '')\n const [cursorOffset, setCursorOffset] = useState(value.length)\n const [isGenerating, setIsGenerating] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const abortRef = useRef<AbortController | null>(null)\n const columns = Math.min(80, process.stdout.columns ?? 80)\n\n useKeypress((_input, key) => {\n if (!key.escape) return\n if (isGenerating && abortRef.current) {\n abortRef.current.abort()\n abortRef.current = null\n setIsGenerating(false)\n setError('Generation cancelled')\n return true\n }\n if (!isGenerating) {\n ctx.updateWizardData({\n generationPrompt: '',\n agentType: '',\n systemPrompt: '',\n whenToUse: '',\n wasGenerated: false,\n })\n setValue('')\n setCursorOffset(0)\n setError(null)\n ctx.goBack()\n return true\n }\n })\n\n const onSubmit = async () => {\n const trimmed = value.trim()\n if (!trimmed) {\n setError('Please describe what the agent should do')\n return\n }\n\n setError(null)\n setIsGenerating(true)\n ctx.updateWizardData({ generationPrompt: trimmed, isGenerating: true })\n\n const abort = new AbortController()\n abortRef.current = abort\n\n try {\n const existing = props.existingAgents\n .filter(a => a.source !== 'built-in')\n .map(a => a.agentType)\n\n const generated = await generateAgentDraft(trimmed, {\n existingIdentifiers: existing,\n signal: abort.signal,\n })\n if (existing.includes(generated.identifier)) {\n throw new Error(\n `Agent identifier already exists: ${generated.identifier}. Please try again.`,\n )\n }\n\n ctx.updateWizardData({\n agentType: generated.identifier,\n whenToUse: generated.whenToUse,\n systemPrompt: generated.systemPrompt,\n wasGenerated: true,\n isGenerating: false,\n })\n setIsGenerating(false)\n abortRef.current = null\n ctx.goToStep(6)\n } catch (err) {\n if (abort.signal.aborted) return\n const message = err instanceof Error ? err.message : String(err)\n setError(message || 'Failed to generate agent')\n setIsGenerating(false)\n ctx.updateWizardData({ isGenerating: false })\n abortRef.current = null\n }\n }\n\n return (\n <WizardPanel subtitle=\"Describe the agent you want\">\n <Box flexDirection=\"column\" marginTop={1} gap={1}>\n <Text>What should this agent do?</Text>\n <Text dimColor>\n Describe a role like \u201Ccode reviewer\u201D, \u201Csecurity auditor\u201D, or \u201Ctech\n lead\u201D.\n </Text>\n <TextInput\n value={value}\n onChange={setValue}\n columns={columns}\n multiline\n onSubmit={onSubmit}\n cursorOffset={cursorOffset}\n onChangeCursorOffset={setCursorOffset}\n />\n {error ? <Text color={themeColor('error')}>{error}</Text> : null}\n {isGenerating ? <Text dimColor>Generating\u2026</Text> : null}\n </Box>\n </WizardPanel>\n )\n}\n", "import React from 'react'\nimport { Box, Text } from 'ink'\nimport { Select } from '#ui-ink/components/CustomSelect/select'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { modelOptions } from '../../utils'\nimport { DEFAULT_AGENT_MODEL } from '../../types'\nimport { WizardPanel, type WizardContextValue } from '../Wizard'\n\nexport function StepSelectModel({ ctx }: { ctx: WizardContextValue }) {\n useKeypress((_input, key) => {\n if (key.escape) {\n ctx.goBack()\n return true\n }\n })\n\n const options = modelOptions()\n const defaultValue = ctx.wizardData.selectedModel ?? DEFAULT_AGENT_MODEL\n\n return (\n <WizardPanel\n subtitle=\"Select model\"\n footerText=\"Press \u2191\u2193 to navigate \u00B7 Enter to select \u00B7 Esc to go back\"\n >\n <Box flexDirection=\"column\" marginTop={1} gap={1}>\n <Text dimColor>\n Model determines the agent&apos;s reasoning capabilities and speed.\n </Text>\n <Select\n options={options}\n defaultValue={defaultValue}\n onChange={value => {\n ctx.updateWizardData({ selectedModel: value })\n ctx.goNext()\n }}\n />\n </Box>\n </WizardPanel>\n )\n}\n", "import React from 'react'\nimport type { Tool } from '../../../tooling'\nimport { Instructions, Panel } from '../../components'\nimport { ToolPicker } from '../ToolPicker'\nimport type { WizardContextValue } from '../Wizard'\n\nexport function StepSelectTools(props: {\n ctx: WizardContextValue\n tools: Tool[]\n}) {\n const { ctx } = props\n const initialTools = ctx.wizardData.selectedTools\n return (\n <>\n <Panel title=\"Create new agent\" subtitle=\"Select tools\">\n <ToolPicker\n tools={props.tools}\n initialTools={initialTools}\n onComplete={selected => {\n ctx.updateWizardData({ selectedTools: selected })\n ctx.goNext()\n }}\n onCancel={ctx.goBack}\n />\n </Panel>\n <Instructions instructions=\"Press Enter to toggle selection \u00B7 \u2191\u2193 Navigate \u00B7 Esc to go back\" />\n </>\n )\n}\n", "import React, { useMemo, useState } from 'react'\nimport { Box, Text } from 'ink'\nimport figures from 'figures'\nimport type { Tool } from '../../tooling'\nimport { themeColor } from '../colors'\nimport { parseMcpToolName } from '../utils'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\n\nexport function ToolPicker(props: {\n tools: Tool[]\n initialTools: string[] | undefined\n onComplete: (tools: string[] | undefined) => void\n onCancel: () => void\n}) {\n const normalizedTools = useMemo(() => {\n const unique = new Map<string, Tool>()\n for (const tool of props.tools) {\n if (!tool?.name) continue\n unique.set(tool.name, tool)\n }\n return Array.from(unique.values()).sort((a, b) =>\n a.name.localeCompare(b.name),\n )\n }, [props.tools])\n\n const allToolNames = useMemo(\n () => normalizedTools.map(t => t.name),\n [normalizedTools],\n )\n\n const initialSelectedNames = useMemo(() => {\n if (!props.initialTools) return allToolNames\n if (props.initialTools.includes('*')) return allToolNames\n const available = new Set(allToolNames)\n return props.initialTools.filter(t => available.has(t))\n }, [props.initialTools, allToolNames])\n\n const [selected, setSelected] = useState<string[]>(initialSelectedNames)\n const [cursorIndex, setCursorIndex] = useState(0)\n const [showAdvanced, setShowAdvanced] = useState(false)\n\n const selectedSet = useMemo(() => new Set(selected), [selected])\n const isAllSelected =\n selected.length === allToolNames.length && allToolNames.length > 0\n\n const toggleOne = (name: string) => {\n setSelected(prev =>\n prev.includes(name) ? prev.filter(x => x !== name) : [...prev, name],\n )\n }\n\n const toggleMany = (names: string[], enable: boolean) => {\n setSelected(prev => {\n if (enable) {\n const missing = names.filter(n => !prev.includes(n))\n return [...prev, ...missing]\n }\n return prev.filter(n => !names.includes(n))\n })\n }\n\n const complete = () => {\n const next =\n selected.length === allToolNames.length &&\n allToolNames.every(n => selected.includes(n))\n ? undefined\n : selected\n props.onComplete(next)\n }\n\n const categorized = useMemo(() => {\n const readOnly = new Set(['Read', 'LS', 'Glob', 'Grep'])\n const edit = new Set(['Edit', 'Write', 'NotebookEdit'])\n const execution = new Set(['Bash', 'TaskOutput', 'KillShell'])\n\n const buckets: Record<\n 'readOnly' | 'edit' | 'execution' | 'mcp' | 'other',\n string[]\n > = { readOnly: [], edit: [], execution: [], mcp: [], other: [] }\n\n for (const tool of normalizedTools) {\n const name = tool.name\n if (name.startsWith('mcp__')) buckets.mcp.push(name)\n else if (readOnly.has(name)) buckets.readOnly.push(name)\n else if (edit.has(name)) buckets.edit.push(name)\n else if (execution.has(name)) buckets.execution.push(name)\n else buckets.other.push(name)\n }\n\n return buckets\n }, [normalizedTools])\n\n const mcpServers = useMemo(() => {\n const byServer = new Map<string, string[]>()\n for (const name of categorized.mcp) {\n const parsed = parseMcpToolName(name)\n if (!parsed) continue\n const list = byServer.get(parsed.serverName) ?? []\n list.push(name)\n byServer.set(parsed.serverName, list)\n }\n return Array.from(byServer.entries())\n .map(([serverName, toolNames]) => ({ serverName, toolNames }))\n .sort((a, b) => a.serverName.localeCompare(b.serverName))\n }, [categorized.mcp])\n\n type Item = {\n id: string\n label: string\n isHeader?: boolean\n isToggle?: boolean\n action: () => void\n }\n\n const items: Item[] = useMemo(() => {\n const out: Item[] = []\n\n out.push({ id: 'continue', label: '[ Continue ]', action: complete })\n out.push({\n id: 'bucket-all',\n label: `${isAllSelected ? figures.checkboxOn : figures.checkboxOff} All tools`,\n action: () => toggleMany(allToolNames, !isAllSelected),\n })\n\n const bucketDefs: Array<{\n id: string\n label: string\n names: string[]\n }> = [\n {\n id: 'bucket-readonly',\n label: 'Read-only tools',\n names: categorized.readOnly,\n },\n { id: 'bucket-edit', label: 'Edit tools', names: categorized.edit },\n {\n id: 'bucket-execution',\n label: 'Execution tools',\n names: categorized.execution,\n },\n { id: 'bucket-mcp', label: 'MCP tools', names: categorized.mcp },\n { id: 'bucket-other', label: 'Other tools', names: categorized.other },\n ]\n\n for (const bucket of bucketDefs) {\n if (bucket.names.length === 0) continue\n const allInBucket = bucket.names.every(n => selectedSet.has(n))\n out.push({\n id: bucket.id,\n label: `${allInBucket ? figures.checkboxOn : figures.checkboxOff} ${bucket.label}`,\n action: () => toggleMany(bucket.names, !allInBucket),\n })\n }\n\n out.push({\n id: 'toggle-advanced',\n label: showAdvanced ? 'Hide advanced options' : 'Show advanced options',\n isToggle: true,\n action: () => setShowAdvanced(prev => !prev),\n })\n\n if (!showAdvanced) return out\n\n if (mcpServers.length > 0) {\n out.push({\n id: 'mcp-servers-header',\n label: 'MCP Servers:',\n isHeader: true,\n action: () => {},\n })\n for (const server of mcpServers) {\n const allServer = server.toolNames.every(n => selectedSet.has(n))\n out.push({\n id: `mcp-server-${server.serverName}`,\n label: `${allServer ? figures.checkboxOn : figures.checkboxOff} ${server.serverName} (${server.toolNames.length} tool${server.toolNames.length === 1 ? '' : 's'})`,\n action: () => toggleMany(server.toolNames, !allServer),\n })\n }\n }\n\n out.push({\n id: 'tools-header',\n label: 'Individual Tools:',\n isHeader: true,\n action: () => {},\n })\n for (const name of allToolNames) {\n let labelName = name\n const parsed = parseMcpToolName(name)\n if (parsed) labelName = `${parsed.toolName} (${parsed.serverName})`\n out.push({\n id: `tool-${name}`,\n label: `${selectedSet.has(name) ? figures.checkboxOn : figures.checkboxOff} ${labelName}`,\n action: () => toggleOne(name),\n })\n }\n\n return out\n }, [\n allToolNames,\n categorized,\n complete,\n isAllSelected,\n mcpServers,\n selectedSet,\n showAdvanced,\n ])\n\n useKeypress((_input, key) => {\n if (key.escape) {\n props.onCancel()\n return true\n }\n\n if (key.return) {\n const item = items[cursorIndex]\n if (item && !item.isHeader) item.action()\n return true\n }\n\n if (key.upArrow) {\n let next = cursorIndex - 1\n while (next > 0 && items[next]?.isHeader) next--\n setCursorIndex(Math.max(0, next))\n return true\n }\n\n if (key.downArrow) {\n let next = cursorIndex + 1\n while (next < items.length - 1 && items[next]?.isHeader) next++\n setCursorIndex(Math.min(items.length - 1, next))\n return true\n }\n })\n\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text\n color={cursorIndex === 0 ? themeColor('suggestion') : undefined}\n bold={cursorIndex === 0}\n >\n {cursorIndex === 0 ? `${figures.pointer} ` : ' '}[ Continue ]\n </Text>\n <Text dimColor>{'\u2500'.repeat(40)}</Text>\n {items.slice(1).map((item, idx) => {\n const index = idx + 1\n const focused = index === cursorIndex\n const prefix = item.isHeader\n ? ''\n : focused\n ? `${figures.pointer} `\n : ' '\n return (\n <React.Fragment key={item.id}>\n {item.isToggle ? <Text dimColor>{'\u2500'.repeat(40)}</Text> : null}\n <Text\n dimColor={item.isHeader}\n color={\n !item.isHeader && focused ? themeColor('suggestion') : undefined\n }\n bold={item.isToggle && focused}\n >\n {item.isToggle\n ? `${prefix}[ ${item.label} ]`\n : `${prefix}${item.label}`}\n </Text>\n </React.Fragment>\n )\n })}\n <Box marginTop={1} flexDirection=\"column\">\n <Text dimColor>\n {isAllSelected\n ? 'All tools selected'\n : `${selectedSet.size} of ${allToolNames.length} tools selected`}\n </Text>\n </Box>\n </Box>\n )\n}\n", "import React, { useState } from 'react'\nimport { Box, Text } from 'ink'\nimport TextInput from '#ui-ink/components/TextInput'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { themeColor } from '../../colors'\nimport { WizardPanel, type WizardContextValue } from '../Wizard'\n\nexport function StepSystemPrompt({ ctx }: { ctx: WizardContextValue }) {\n const [value, setValue] = useState(ctx.wizardData.systemPrompt ?? '')\n const [cursorOffset, setCursorOffset] = useState(value.length)\n const [error, setError] = useState<string | null>(null)\n const columns = Math.min(80, process.stdout.columns ?? 80)\n\n useKeypress((_input, key) => {\n if (key.escape) {\n ctx.goBack()\n return true\n }\n })\n\n const onSubmit = (next: string) => {\n const trimmed = next.trim()\n if (!trimmed) {\n setError('System prompt is required')\n return\n }\n setError(null)\n ctx.updateWizardData({ systemPrompt: trimmed })\n ctx.goNext()\n }\n\n return (\n <WizardPanel\n subtitle=\"System prompt\"\n footerText=\"Press Enter to continue \u00B7 Esc to go back\"\n >\n <Box flexDirection=\"column\" marginTop={1} gap={1}>\n <Text>Enter the system prompt for your agent:</Text>\n <Text dimColor>Be comprehensive for best results</Text>\n <TextInput\n value={value}\n onChange={setValue}\n columns={columns}\n multiline\n onSubmit={onSubmit}\n cursorOffset={cursorOffset}\n onChangeCursorOffset={setCursorOffset}\n />\n {error ? <Text color={themeColor('error')}>{error}</Text> : null}\n </Box>\n </WizardPanel>\n )\n}\n", "import React from 'react'\nimport { Box, Text } from 'ink'\nimport { Select } from '#ui-ink/components/CustomSelect/select'\nimport { themeColor } from './colors'\nimport { Instructions, Panel } from './components'\nimport type { AgentWithOverride } from './types'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\n\nexport function DeleteConfirm(props: {\n agent: AgentWithOverride\n onConfirm: () => void\n onCancel: () => void\n}) {\n useKeypress((_input, key) => {\n if (key.escape) {\n props.onCancel()\n return true\n }\n })\n\n return (\n <>\n <Panel title=\"Delete agent\" titleColor={themeColor('error')}>\n <Box flexDirection=\"column\" gap={1}>\n <Text>\n Are you sure you want to delete the agent{' '}\n <Text bold>{props.agent.agentType}</Text>?\n </Text>\n <Box marginTop={1}>\n <Text dimColor>Source: {props.agent.source}</Text>\n </Box>\n <Box marginTop={1}>\n <Select\n options={[\n { label: 'Yes, delete', value: 'yes' },\n { label: 'No, cancel', value: 'no' },\n ]}\n onChange={value => {\n if (value === 'yes') props.onConfirm()\n else props.onCancel()\n }}\n />\n </Box>\n </Box>\n </Panel>\n <Instructions instructions=\"Press \u2191\u2193 to navigate, Enter to select, Esc to cancel\" />\n </>\n )\n}\n", "import React, { useMemo, useState } from 'react'\nimport { Box, Text } from 'ink'\nimport figures from 'figures'\nimport chalk from 'chalk'\nimport { Select } from '#ui-ink/components/CustomSelect/select'\nimport type { Tool } from '../tooling'\nimport { getPrimaryAgentFilePath, updateAgent } from '../storage'\nimport { themeColor } from './colors'\nimport { Instructions, Panel } from './components'\nimport { ColorPicker } from './ColorPicker'\nimport type { AgentWithOverride, AgentColor } from './types'\nimport { DEFAULT_AGENT_MODEL } from './types'\nimport {\n modelOptions,\n openInEditor,\n titleForSource,\n toSelectableToolNames,\n} from './utils'\nimport { ToolPicker } from './wizard/ToolPicker'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\n\nexport function EditAgent(props: {\n agent: AgentWithOverride\n tools: Tool[]\n onSaved: (message: string) => void\n onBack: () => void\n}) {\n const [mode, setMode] = useState<\n 'menu' | 'edit-tools' | 'edit-model' | 'edit-color'\n >('menu')\n const [selectedIndex, setSelectedIndex] = useState(0)\n const [error, setError] = useState<string | null>(null)\n\n const menuItems = useMemo(\n () => [\n { label: 'Open in editor', action: 'open' as const },\n { label: 'Edit tools', action: 'edit-tools' as const },\n { label: 'Edit model', action: 'edit-model' as const },\n { label: 'Edit color', action: 'edit-color' as const },\n ],\n [],\n )\n\n const doOpen = async () => {\n try {\n const location =\n props.agent.source === 'projectSettings'\n ? 'project'\n : props.agent.source === 'userSettings'\n ? 'user'\n : null\n if (!location)\n throw new Error(`Cannot open ${props.agent.source} agent in editor`)\n const filePath = getPrimaryAgentFilePath(location, props.agent.agentType)\n await openInEditor(filePath)\n props.onSaved(\n `Opened ${props.agent.agentType} in editor. If you made edits, restart to load the latest version.`,\n )\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n }\n }\n\n const doUpdate = async (patch: {\n tools?: string[] | '*'\n model?: string\n color?: string\n }) => {\n try {\n await updateAgent(\n props.agent,\n props.agent.whenToUse,\n patch.tools ?? props.agent.tools,\n props.agent.systemPrompt,\n patch.color ?? props.agent.color,\n patch.model ?? props.agent.model,\n )\n props.onSaved(`Updated agent: ${chalk.bold(props.agent.agentType)}`)\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n }\n }\n\n useKeypress((_input, key) => {\n if (key.escape) {\n setError(null)\n if (mode === 'menu') props.onBack()\n else setMode('menu')\n return true\n }\n\n if (mode !== 'menu') return\n\n if (key.upArrow) {\n setSelectedIndex(i => Math.max(0, i - 1))\n return true\n }\n if (key.downArrow) {\n setSelectedIndex(i => Math.min(menuItems.length - 1, i + 1))\n return true\n }\n if (key.return) {\n const item = menuItems[selectedIndex]\n if (!item) return\n if (item.action === 'open') void doOpen()\n else setMode(item.action)\n return true\n }\n })\n\n if (mode === 'edit-tools') {\n return (\n <>\n <Panel title={`Edit agent: ${props.agent.agentType}`}>\n <ToolPicker\n tools={props.tools}\n initialTools={toSelectableToolNames(props.agent.tools)}\n onComplete={selected => {\n const tools = selected === undefined ? '*' : selected\n void doUpdate({ tools })\n setMode('menu')\n }}\n onCancel={() => setMode('menu')}\n />\n {error ? (\n <Box marginTop={1}>\n <Text color={themeColor('error')}>{error}</Text>\n </Box>\n ) : null}\n </Panel>\n <Instructions instructions=\"Press Enter to toggle selection \u00B7 \u2191\u2193 Navigate \u00B7 Esc to go back\" />\n </>\n )\n }\n\n if (mode === 'edit-model') {\n useKeypress((_input, key) => {\n if (key.escape) {\n setMode('menu')\n return true\n }\n })\n\n return (\n <>\n <Panel title={`Edit agent: ${props.agent.agentType}`}>\n <Box flexDirection=\"column\" gap={1} marginTop={1}>\n <Text dimColor>\n Model determines the agent&apos;s reasoning capabilities and\n speed.\n </Text>\n <Select\n options={modelOptions()}\n defaultValue={props.agent.model ?? DEFAULT_AGENT_MODEL}\n onChange={value => {\n void doUpdate({ model: value })\n setMode('menu')\n }}\n />\n </Box>\n {error ? (\n <Box marginTop={1}>\n <Text color={themeColor('error')}>{error}</Text>\n </Box>\n ) : null}\n </Panel>\n <Instructions />\n </>\n )\n }\n\n if (mode === 'edit-color') {\n return (\n <>\n <Panel title={`Edit agent: ${props.agent.agentType}`}>\n <Box marginTop={1}>\n <ColorPicker\n agentName={props.agent.agentType}\n currentColor={(props.agent.color as AgentColor) ?? 'automatic'}\n onConfirm={color => {\n void doUpdate({\n color: color === 'automatic' ? undefined : color,\n })\n setMode('menu')\n }}\n />\n </Box>\n {error ? (\n <Box marginTop={1}>\n <Text color={themeColor('error')}>{error}</Text>\n </Box>\n ) : null}\n </Panel>\n <Instructions />\n </>\n )\n }\n\n return (\n <>\n <Panel title={`Edit agent: ${props.agent.agentType}`}>\n <Box flexDirection=\"column\">\n <Text dimColor>Source: {titleForSource(props.agent.source)}</Text>\n <Box marginTop={1} flexDirection=\"column\">\n {menuItems.map((item, idx) => (\n <React.Fragment key={item.label}>\n <Text\n color={\n idx === selectedIndex ? themeColor('suggestion') : undefined\n }\n >\n {idx === selectedIndex ? `${figures.pointer} ` : ' '}\n {item.label}\n </Text>\n </React.Fragment>\n ))}\n </Box>\n {error ? (\n <Box marginTop={1}>\n <Text color={themeColor('error')}>{error}</Text>\n </Box>\n ) : null}\n </Box>\n </Panel>\n <Instructions />\n </>\n )\n}\n", "import React from 'react'\nimport { join } from 'path'\nimport { Box, Text } from 'ink'\nimport figures from 'figures'\nimport type { Tool } from '../tooling'\nimport { themeColor } from './colors'\nimport { Instructions, Panel } from './components'\nimport type { AgentWithOverride } from './types'\nimport { formatModelLong, getToolNameFromSpec } from './utils'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\n\nexport function ViewAgent(props: {\n agent: AgentWithOverride\n tools: Tool[]\n onBack: () => void\n}) {\n useKeypress((_input, key) => {\n if (key.escape || key.return) {\n props.onBack()\n return true\n }\n })\n\n const toolNames = new Set(props.tools.map(t => t.name))\n const parsedTools = (() => {\n const toolSpec = props.agent.tools\n if (toolSpec === '*')\n return { hasWildcard: true, valid: [], invalid: [] as string[] }\n if (!toolSpec || toolSpec.length === 0)\n return { hasWildcard: false, valid: [], invalid: [] as string[] }\n const names = toolSpec.map(getToolNameFromSpec).filter(Boolean)\n const valid: string[] = []\n const invalid: string[] = []\n for (const name of names) {\n if (\n name.includes('*') &&\n Array.from(toolNames).some(t => t.startsWith(name.replace(/\\*+$/, '')))\n ) {\n valid.push(name)\n continue\n }\n if (toolNames.has(name)) valid.push(name)\n else invalid.push(name)\n }\n return { hasWildcard: false, valid, invalid }\n })()\n\n const sourceLine = (() => {\n if (props.agent.source === 'built-in') return 'Built-in'\n if (props.agent.source === 'plugin')\n return `Plugin: ${props.agent.baseDir ?? 'Unknown'}`\n const baseDir = props.agent.baseDir\n const file = `${props.agent.filename ?? props.agent.agentType}.md`\n if (props.agent.source === 'projectSettings')\n return join('.kode', 'agents', file)\n if (baseDir) return join(baseDir, file)\n return props.agent.source\n })()\n\n const toolsSummary = () => {\n if (parsedTools.hasWildcard) return 'All tools'\n if (\n !props.agent.tools ||\n props.agent.tools === '*' ||\n props.agent.tools.length === 0\n )\n return 'None'\n return (\n <>\n {parsedTools.valid.length > 0 ? parsedTools.valid.join(', ') : null}\n {parsedTools.invalid.length > 0 ? (\n <>\n <Text color={themeColor('warning')}>\n {' '}\n {figures.warning} Unrecognized: {parsedTools.invalid.join(', ')}\n </Text>\n </>\n ) : null}\n </>\n )\n }\n\n return (\n <>\n <Panel title={props.agent.agentType}>\n <Box flexDirection=\"column\" gap={1}>\n <Text dimColor>{sourceLine}</Text>\n <Box flexDirection=\"column\">\n <Text>\n <Text bold>Description</Text> (tells the agent when to use this\n agent):\n </Text>\n <Box marginLeft={2}>\n <Text>{props.agent.whenToUse}</Text>\n </Box>\n </Box>\n <Text>\n <Text bold>Tools</Text>: {toolsSummary()}\n </Text>\n <Text>\n <Text bold>Model</Text>: {formatModelLong(props.agent.model)}\n </Text>\n {props.agent.color ? (\n <Text>\n <Text bold>Color</Text>: {props.agent.color}\n </Text>\n ) : null}\n {props.agent.systemPrompt ? (\n <>\n <Text>\n <Text bold>System prompt</Text>:\n </Text>\n <Box marginLeft={2} marginRight={2}>\n <Text>{props.agent.systemPrompt}</Text>\n </Box>\n </>\n ) : null}\n </Box>\n </Panel>\n <Instructions instructions=\"Press Enter or Esc to go back\" />\n </>\n )\n}\n", "import type { Command } from '../types'\nimport { PRODUCT_NAME } from '#core/constants/product'\n\nfunction makeStubCommand(args: {\n name: string\n description: string\n aliases?: string[]\n isHidden?: boolean\n message?: string\n}): Command {\n const message =\n args.message ??\n `/${args.name} is not supported in ${PRODUCT_NAME} yet.\\n` +\n `This command exists for compatibility.\\n` +\n `Try /help for supported commands.`\n\n return {\n type: 'local',\n name: args.name,\n description: args.description,\n aliases: args.aliases,\n isEnabled: true,\n isHidden: args.isHidden ?? false,\n disableNonInteractive: true,\n async call() {\n return message\n },\n userFacingName() {\n return args.name\n },\n }\n}\n\nexport const PARITY_STUB_COMMANDS: Command[] = [\n makeStubCommand({\n name: 'btw',\n description:\n 'Ask a quick side question without interrupting the main conversation',\n isHidden: true,\n }),\n makeStubCommand({\n name: 'chrome',\n description: 'Browser integration settings',\n isHidden: true,\n }),\n makeStubCommand({\n name: 'color',\n description: 'Change the color theme',\n message: `Use /theme to change the color theme.`,\n }),\n makeStubCommand({\n name: 'discover',\n description: 'Explore features and track your progress',\n isHidden: true,\n }),\n makeStubCommand({\n name: 'extra-usage',\n description: 'Configure extra usage when limits are hit',\n isHidden: true,\n }),\n makeStubCommand({\n name: 'fork',\n description: 'Fork the current conversation',\n isHidden: true,\n }),\n makeStubCommand({\n name: 'ide',\n description: 'Connect to an IDE for integrated development features',\n message: `Use /lsp for editor integration in ${PRODUCT_NAME}.`,\n }),\n makeStubCommand({\n name: 'install',\n description: 'Install the CLI runtime',\n isHidden: true,\n }),\n makeStubCommand({\n name: 'install-github-app',\n description: 'Install GitHub App integration',\n isHidden: true,\n }),\n makeStubCommand({\n name: 'install-slack-app',\n description: 'Install Slack App integration',\n isHidden: true,\n }),\n makeStubCommand({\n name: 'keybindings',\n description: 'Open or create your keybindings configuration file',\n isHidden: true,\n }),\n makeStubCommand({\n name: 'memory',\n description: 'Manage memory files',\n isHidden: true,\n }),\n makeStubCommand({\n name: 'mobile',\n description: 'Show mobile app download instructions',\n isHidden: true,\n }),\n makeStubCommand({\n name: 'passes',\n description: 'Manage authentication / passes',\n isHidden: true,\n }),\n makeStubCommand({\n name: 'privacy-settings',\n description: 'Privacy settings',\n isHidden: true,\n }),\n makeStubCommand({\n name: 'rate-limit-options',\n description: 'Rate limit options',\n isHidden: true,\n }),\n makeStubCommand({\n name: 'remote-env',\n description: 'Configure the default remote environment',\n isHidden: true,\n }),\n makeStubCommand({\n name: 'stats',\n description: 'Usage statistics and activity',\n isHidden: true,\n }),\n makeStubCommand({\n name: 'stickers',\n description: 'Order stickers',\n isHidden: true,\n }),\n makeStubCommand({\n name: 'think-back',\n description: 'Year in review',\n isHidden: true,\n }),\n makeStubCommand({\n name: 'thinkback-play',\n description: 'Play the thinkback animation',\n isHidden: true,\n }),\n makeStubCommand({\n name: 'upgrade',\n description: 'Upgrade plan / subscription',\n isHidden: true,\n }),\n makeStubCommand({\n name: 'usage',\n description: 'Show plan usage limits',\n isHidden: true,\n }),\n]\n", "import bug from './builtin/bug'\nimport clear from './builtin/clear'\nimport compact from './builtin/compact'\nimport config from './builtin/config'\nimport cost from './builtin/cost'\nimport ctx_viz from './debug/ctx_viz'\nimport addDir from './builtin/add-dir'\nimport exit from './builtin/exit'\nimport doctor from './builtin/doctor'\nimport gateDump from './builtin/gate-dump'\nimport help from './builtin/help'\nimport hooks from './builtin/hooks'\nimport files from './builtin/files'\nimport exportCommand from './builtin/export'\nimport skills from './builtin/skills'\nimport init from './builtin/init'\nimport listen from './debug/listen'\nimport messages_debug from './debug/messages_debug'\nimport login from './builtin/login'\nimport logout from './builtin/logout'\nimport lsp from './builtin/lsp'\nimport mcp from './mcp/mcp'\nimport plugin from './plugin/plugin'\nimport outputStyle from './builtin/output-style'\nimport permissions from './builtin/permissions'\nimport theme from './builtin/theme'\nimport vim from './builtin/vim'\nimport * as model from './builtin/model'\nimport modelstatus from './builtin/modelstatus'\nimport onboarding from './builtin/onboarding'\nimport open from './builtin/open'\nimport copy from './builtin/copy'\nimport importCommand from './builtin/import'\nimport plan from './builtin/plan'\nimport transcript from './builtin/transcript'\nimport consoleCommand from './builtin/console'\nimport notifications from './builtin/notifications'\nimport plugins from './builtin/plugins'\nimport pr_comments from './builtin/pr_comments'\nimport refreshCommands from './builtin/refreshCommands'\nimport releaseNotes from './builtin/release-notes'\nimport review from './builtin/review'\nimport rename from './builtin/rename'\nimport resume from './builtin/resume'\nimport rewind from './builtin/rewind'\nimport status from './builtin/status'\nimport statusline from './builtin/statusline'\nimport capabilities from './builtin/capabilities'\nimport tag from './builtin/tag'\nimport todos from './builtin/todos'\nimport tasks from './builtin/tasks'\nimport terminalSetup from './builtin/terminal-setup'\nimport sandbox from './builtin/sandbox'\nimport agents from './agent/agents'\nimport { PARITY_STUB_COMMANDS } from './builtin/parityStubs'\nimport { getMCPCommands, getMcpListChangedVersion } from '#core/mcp/client'\nimport { loadCustomCommands } from '#cli-services/customCommands'\nimport { memoize } from 'lodash-es'\nimport { isAnthropicAuthEnabled } from '#core/utils/auth'\nimport type { Command } from './types'\n\nexport type { Command } from './types'\n\nconst INTERNAL_ONLY_COMMANDS = [ctx_viz, listen, messages_debug]\n\n// Declared as a function so that we don't run this until getCommands is called,\n// since underlying functions read from config, which can't be read at module initialization time\nconst COMMANDS = memoize((): Command[] => [\n agents,\n addDir,\n clear,\n compact,\n config,\n cost,\n doctor,\n exit,\n exportCommand,\n gateDump,\n help,\n hooks,\n files,\n skills,\n init,\n lsp,\n outputStyle,\n permissions,\n theme,\n vim,\n statusline,\n capabilities,\n mcp,\n plugin,\n model,\n modelstatus,\n onboarding,\n open,\n copy,\n importCommand,\n plan,\n transcript,\n consoleCommand,\n notifications,\n plugins,\n pr_comments,\n rename,\n resume,\n rewind,\n status,\n tag,\n refreshCommands,\n releaseNotes,\n bug,\n review,\n todos,\n tasks,\n terminalSetup,\n sandbox,\n ...PARITY_STUB_COMMANDS,\n ...(isAnthropicAuthEnabled() ? [logout, login()] : []),\n ...INTERNAL_ONLY_COMMANDS,\n])\n\nexport const getCommands = memoize(\n async (): Promise<Command[]> => {\n const [mcpCommands, customCommands] = await Promise.all([\n getMCPCommands(),\n loadCustomCommands(),\n ])\n\n return [...mcpCommands, ...customCommands, ...COMMANDS()].filter(\n _ => _.isEnabled,\n )\n },\n () => `mcp-prompts@${getMcpListChangedVersion('prompts')}`,\n)\n\nexport function hasCommand(commandName: string, commands: Command[]): boolean {\n return commands.some(\n _ => _.userFacingName() === commandName || _.aliases?.includes(commandName),\n )\n}\n\nexport function getCommand(commandName: string, commands: Command[]): Command {\n const command = commands.find(\n _ => _.userFacingName() === commandName || _.aliases?.includes(commandName),\n ) as Command | undefined\n if (!command) {\n throw ReferenceError(\n `Command ${commandName} not found. Available commands: ${commands\n .map(_ => {\n const name = _.userFacingName()\n return _.aliases ? `${name} (aliases: ${_.aliases.join(', ')})` : name\n })\n .join(', ')}`,\n )\n }\n\n return command\n}\n"],
5
- "mappings": "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",
6
- "names": ["url", "command", "theme", "description", "React", "config", "Box", "Text", "React", "useRef", "useState", "useState", "useRef", "theme", "config", "Text", "Box", "React", "name", "React", "React", "useState", "Box", "Text", "figures", "React", "Box", "Text", "theme", "React", "Box", "Text", "theme", "useState", "React", "Box", "Text", "figures", "React", "Text", "React", "React", "React", "join", "command", "resolve", "files", "name", "join", "React", "useCallback", "useMemo", "useRef", "useState", "Box", "Text", "writeFileSync", "join", "figures", "spawn", "spawnSync", "resolve", "isCommandAvailable", "command", "join", "theme", "useRef", "useCallback", "useState", "status", "useMemo", "writeFileSync", "figures", "React", "Box", "Text", "React", "React", "React", "useMemo", "useState", "Box", "Text", "figures", "DESTINATIONS", "normalizeString", "hooks", "type", "theme", "status", "useState", "useMemo", "React", "Box", "Text", "figures", "React", "type", "name", "React", "Box", "Text", "existsSync", "join", "config", "existsSync", "join", "theme", "Box", "Text", "command", "existsSync", "readdirSync", "readFileSync", "statSync", "join", "files", "name", "command", "React", "React", "useEffect", "useState", "useCallback", "Box", "Text", "resolve", "config", "React", "Box", "Text", "Box", "Text", "React", "theme", "Box", "Text", "theme", "React", "Box", "Text", "spawn", "isWSL", "command", "resolve", "React", "Box", "Text", "Box", "Text", "React", "useEffect", "useRef", "useState", "useState", "useEffect", "Box", "Text", "theme", "useRef", "theme", "React", "Box", "Text", "useState", "theme", "useEffect", "url", "useCallback", "React", "Box", "Text", "config", "Box", "Text", "Box", "Text", "React", "Text", "config", "React", "React", "useEffect", "useMemo", "useState", "Box", "Text", "React", "Text", "resolve", "command", "resolve", "useState", "theme", "useEffect", "useMemo", "React", "Text", "Box", "React", "theme", "name", "parse", "parse", "name", "React", "useMemo", "useRef", "Box", "Text", "chalk", "theme", "useRef", "useMemo", "chalk", "React", "Box", "Text", "name", "React", "React", "React", "useCallback", "useMemo", "useRef", "useState", "Box", "Text", "figures", "clamp", "theme", "useRef", "useCallback", "useState", "useMemo", "React", "Box", "Text", "name", "figures", "React", "help", "isEnabled", "React", "Box", "Text", "React", "useCallback", "useMemo", "useRef", "useState", "figures", "Box", "Text", "React", "useCallback", "useEffect", "useMemo", "useState", "figures", "config", "theme", "useState", "status", "useMemo", "useEffect", "useCallback", "Text", "Box", "figures", "theme", "config", "useState", "useRef", "useCallback", "useMemo", "Box", "Text", "figures", "help", "isEnabled", "React", "reloadModelManager", "React", "React", "useMemo", "useState", "Box", "Text", "figures", "VIEWPORT_SAFE_MARGIN_ROWS", "INDICATOR_ROWS", "clamp", "config", "theme", "useState", "useMemo", "figures", "React", "Box", "Text", "React", "React", "status", "React", "spawn", "React", "useCallback", "useEffect", "useMemo", "useRef", "useState", "Box", "Text", "VIEWPORT_SAFE_MARGIN_ROWS", "command", "resolve", "files", "spawn", "theme", "useState", "useRef", "useCallback", "useEffect", "useMemo", "React", "Box", "Text", "React", "React", "Box", "Text", "figures", "theme", "React", "figures", "Box", "Text", "tag", "name", "existsSync", "mkdirSync", "statSync", "join", "join", "existsSync", "mkdirSync", "statSync", "existsSync", "writeFileSync", "Box", "Text", "React", "existsSync", "writeFileSync", "React", "Box", "Text", "React", "React", "useCallback", "useEffect", "useMemo", "useRef", "useState", "Box", "Text", "mkdirSync", "writeFileSync", "join", "VIEWPORT_SAFE_MARGIN_ROWS", "INDICATOR_ROWS", "clamp", "join", "theme", "useState", "status", "useRef", "useCallback", "useEffect", "useMemo", "mkdirSync", "writeFileSync", "React", "Box", "Text", "React", "React", "useCallback", "useEffect", "useMemo", "useState", "Box", "Text", "VIEWPORT_SAFE_MARGIN_ROWS", "INDICATOR_ROWS", "clamp", "theme", "useState", "status", "useEffect", "useCallback", "clear", "useMemo", "React", "Box", "Text", "React", "React", "useCallback", "useEffect", "useMemo", "useRef", "useState", "Box", "Text", "mkdirSync", "writeFileSync", "join", "VIEWPORT_SAFE_MARGIN_ROWS", "INDICATOR_ROWS", "clamp", "join", "mkdirSync", "writeFileSync", "theme", "useRef", "useCallback", "useState", "status", "useEffect", "useMemo", "clear", "React", "Box", "Text", "React", "React", "useCallback", "useEffect", "useMemo", "useRef", "useState", "Box", "Text", "figures", "clamp", "normalizeQuery", "plugin", "name", "description", "refreshPluginRuntimeFromInstalls", "theme", "useState", "plugins", "status", "useMemo", "useCallback", "useEffect", "React", "Box", "Text", "figures", "useRef", "skills", "getCommandScope", "getCommands", "React", "execFileSync", "resolvePath", "sep", "quote", "React", "useCallback", "useEffect", "useMemo", "useRef", "useState", "Box", "Text", "figures", "resolvePath", "React", "ResumeSessionList", "theme", "figures", "Box", "Text", "tag", "name", "ResumeSearchInput", "normalizeQuery", "resolvePath", "clamp", "useState", "useEffect", "useRef", "useCallback", "useMemo", "command", "resolvePath", "resolvePath", "getGitWorktreeRootsBestEffort", "execFileSync", "resolvePath", "isPathWithinRoot", "sep", "command", "quote", "open", "React", "React", "useEffect", "useMemo", "useState", "Box", "Text", "figures", "TAB_ORDER", "clamp", "hooks", "status", "name", "type", "theme", "useState", "useEffect", "useMemo", "figures", "React", "Text", "Box", "React", "React", "React", "useMemo", "useState", "Box", "Text", "figures", "React", "Box", "Text", "theme", "useState", "useMemo", "figures", "todos", "React", "React", "useCallback", "useEffect", "useMemo", "useRef", "useState", "Box", "Text", "VIEWPORT_SAFE_MARGIN_ROWS", "INDICATOR_ROWS", "REFRESH_INTERVAL_MS", "clamp", "status", "tasks", "caret", "label", "theme", "useRef", "useCallback", "useState", "useEffect", "useMemo", "killed", "React", "Box", "Text", "React", "React", "React", "useEffect", "useMemo", "useState", "Box", "Text", "theme", "useState", "useEffect", "useMemo", "React", "Box", "Text", "React", "React", "relative", "React", "useMemo", "useState", "Box", "Text", "figures", "DESTINATIONS", "sandbox", "theme", "useState", "useMemo", "React", "Box", "Text", "figures", "plan", "normalizeStringArray", "sandbox", "relative", "React", "React", "React", "useCallback", "useEffect", "useMemo", "useState", "Text", "chalk", "existsSync", "mkdirSync", "writeFileSync", "join", "homedir", "asRecord", "record", "config", "description", "join", "homedir", "existsSync", "mkdirSync", "description", "writeFileSync", "React", "Box", "React", "Box", "Text", "theme", "React", "Box", "Text", "React", "Box", "React", "useEffect", "useMemo", "useState", "Box", "Text", "figures", "spawn", "resolve", "command", "spawn", "name", "theme", "useMemo", "useState", "useEffect", "React", "Box", "Text", "figures", "React", "useMemo", "chalk", "React", "useCallback", "useMemo", "useState", "useState", "useCallback", "useMemo", "React", "React", "useState", "Box", "Text", "theme", "useState", "React", "Box", "Text", "React", "Box", "React", "useState", "Box", "Text", "figures", "useState", "React", "Box", "figures", "Text", "React", "Box", "React", "Box", "React", "Box", "React", "Box", "React", "Box", "React", "useState", "Box", "Text", "useState", "React", "Box", "Text", "React", "useState", "Box", "Text", "useState", "React", "Box", "Text", "React", "useRef", "useState", "Box", "Text", "useState", "useRef", "React", "Box", "Text", "React", "Box", "Text", "React", "Box", "Text", "React", "React", "useMemo", "useState", "Box", "Text", "figures", "useMemo", "useState", "name", "figures", "React", "Box", "Text", "React", "React", "useState", "Box", "Text", "useState", "React", "Box", "Text", "useMemo", "React", "chalk", "React", "Box", "Text", "React", "Box", "Text", "React", "useMemo", "useState", "Box", "Text", "figures", "chalk", "useState", "useMemo", "chalk", "React", "Box", "Text", "figures", "React", "join", "Box", "Text", "figures", "name", "join", "React", "Text", "figures", "Box", "useState", "useCallback", "useEffect", "useMemo", "React", "Text", "chalk", "React", "command", "name"]
7
- }