@within-7/minto 0.1.6 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (487) hide show
  1. package/cli.js +155 -37
  2. package/dist/Tool.js +38 -0
  3. package/dist/Tool.js.map +3 -3
  4. package/dist/commands/agents/AgentsCommand.js +52 -26
  5. package/dist/commands/agents/AgentsCommand.js.map +2 -2
  6. package/dist/commands/agents/constants.js +1 -1
  7. package/dist/commands/agents/constants.js.map +1 -1
  8. package/dist/commands/agents/index.js +1 -1
  9. package/dist/commands/bug.js +74 -7
  10. package/dist/commands/bug.js.map +3 -3
  11. package/dist/commands/clear.js +3 -0
  12. package/dist/commands/clear.js.map +2 -2
  13. package/dist/commands/compact.js +37 -0
  14. package/dist/commands/compact.js.map +2 -2
  15. package/dist/commands/context.js +84 -0
  16. package/dist/commands/context.js.map +7 -0
  17. package/dist/commands/ctx_viz.js +18 -10
  18. package/dist/commands/ctx_viz.js.map +2 -2
  19. package/dist/commands/doctor.js +158 -12
  20. package/dist/commands/doctor.js.map +2 -2
  21. package/dist/commands/export.js +156 -0
  22. package/dist/commands/export.js.map +7 -0
  23. package/dist/commands/mcp-interactive.js +21 -12
  24. package/dist/commands/mcp-interactive.js.map +2 -2
  25. package/dist/commands/model.js +6 -5
  26. package/dist/commands/model.js.map +2 -2
  27. package/dist/commands/permissions.js +86 -0
  28. package/dist/commands/permissions.js.map +7 -0
  29. package/dist/commands/quit.js +3 -1
  30. package/dist/commands/quit.js.map +2 -2
  31. package/dist/commands/sandbox.js +104 -0
  32. package/dist/commands/sandbox.js.map +7 -0
  33. package/dist/commands/status.js +58 -0
  34. package/dist/commands/status.js.map +7 -0
  35. package/dist/commands/tasks.js +108 -0
  36. package/dist/commands/tasks.js.map +7 -0
  37. package/dist/commands/todos.js +123 -0
  38. package/dist/commands/todos.js.map +7 -0
  39. package/dist/commands.js +20 -2
  40. package/dist/commands.js.map +2 -2
  41. package/dist/components/AgentThinkingBlock.js +10 -18
  42. package/dist/components/AgentThinkingBlock.js.map +2 -2
  43. package/dist/components/BackgroundTasksPanel.js +78 -29
  44. package/dist/components/BackgroundTasksPanel.js.map +2 -2
  45. package/dist/components/BashStreamingProgress.js +24 -0
  46. package/dist/components/BashStreamingProgress.js.map +7 -0
  47. package/dist/components/CollapsibleHint.js +14 -0
  48. package/dist/components/CollapsibleHint.js.map +7 -0
  49. package/dist/components/FileEditToolUpdatedMessage.js +1 -1
  50. package/dist/components/FileEditToolUpdatedMessage.js.map +2 -2
  51. package/dist/components/HotkeyHelpPanel.js +137 -0
  52. package/dist/components/HotkeyHelpPanel.js.map +7 -0
  53. package/dist/components/Logo.js +5 -5
  54. package/dist/components/Logo.js.map +2 -2
  55. package/dist/components/Message.js +23 -7
  56. package/dist/components/Message.js.map +3 -3
  57. package/dist/components/ModelConfig.js +16 -3
  58. package/dist/components/ModelConfig.js.map +2 -2
  59. package/dist/components/ModelListManager.js +3 -3
  60. package/dist/components/ModelListManager.js.map +2 -2
  61. package/dist/components/ModelSelector/ModelSelector.js +1 -1
  62. package/dist/components/Onboarding.js +19 -14
  63. package/dist/components/Onboarding.js.map +2 -2
  64. package/dist/components/ProgressBar.js +74 -0
  65. package/dist/components/ProgressBar.js.map +7 -0
  66. package/dist/components/PromptInput.js +156 -46
  67. package/dist/components/PromptInput.js.map +2 -2
  68. package/dist/components/RequestStatusIndicator.js +194 -0
  69. package/dist/components/RequestStatusIndicator.js.map +7 -0
  70. package/dist/components/Spinner.js +92 -27
  71. package/dist/components/Spinner.js.map +2 -2
  72. package/dist/components/SpinnerSymbol.js +21 -27
  73. package/dist/components/SpinnerSymbol.js.map +2 -2
  74. package/dist/components/StreamingBashOutput.js +9 -8
  75. package/dist/components/StreamingBashOutput.js.map +2 -2
  76. package/dist/components/SubagentBlock.js +1 -1
  77. package/dist/components/SubagentBlock.js.map +1 -1
  78. package/dist/components/SubagentProgress.js +10 -11
  79. package/dist/components/SubagentProgress.js.map +2 -2
  80. package/dist/components/TaskCard.js +16 -13
  81. package/dist/components/TaskCard.js.map +2 -2
  82. package/dist/components/TodoChangeBlock.js +1 -1
  83. package/dist/components/TodoChangeBlock.js.map +2 -2
  84. package/dist/components/TodoPanel.js +120 -29
  85. package/dist/components/TodoPanel.js.map +3 -3
  86. package/dist/components/TokenCounter.js +74 -0
  87. package/dist/components/TokenCounter.js.map +7 -0
  88. package/dist/components/TokenWarning.js +2 -1
  89. package/dist/components/TokenWarning.js.map +2 -2
  90. package/dist/components/TreeConnector.js +25 -0
  91. package/dist/components/TreeConnector.js.map +7 -0
  92. package/dist/components/TurnCompletionIndicator.js +18 -0
  93. package/dist/components/TurnCompletionIndicator.js.map +7 -0
  94. package/dist/components/messages/AssistantTextMessage.js +5 -2
  95. package/dist/components/messages/AssistantTextMessage.js.map +2 -2
  96. package/dist/components/messages/AssistantThinkingMessage.js +18 -3
  97. package/dist/components/messages/AssistantThinkingMessage.js.map +2 -2
  98. package/dist/components/messages/AssistantToolUseMessage.js +11 -8
  99. package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
  100. package/dist/components/messages/GroupRenderer.js +53 -0
  101. package/dist/components/messages/GroupRenderer.js.map +7 -0
  102. package/dist/components/messages/NestedTasksPreview.js +12 -0
  103. package/dist/components/messages/NestedTasksPreview.js.map +7 -0
  104. package/dist/components/messages/ParallelTasksGroupView.js +92 -0
  105. package/dist/components/messages/ParallelTasksGroupView.js.map +7 -0
  106. package/dist/components/messages/TaskInModuleView.js +198 -0
  107. package/dist/components/messages/TaskInModuleView.js.map +7 -0
  108. package/dist/components/messages/TaskOutputContent.js +53 -0
  109. package/dist/components/messages/TaskOutputContent.js.map +7 -0
  110. package/dist/components/messages/UserPromptMessage.js +1 -1
  111. package/dist/components/messages/UserPromptMessage.js.map +2 -2
  112. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +2 -3
  113. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +2 -2
  114. package/dist/components/permissions/FallbackPermissionRequest.js +4 -4
  115. package/dist/components/permissions/FallbackPermissionRequest.js.map +2 -2
  116. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +4 -4
  117. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js.map +2 -2
  118. package/dist/constants/colors.js +48 -0
  119. package/dist/constants/colors.js.map +2 -2
  120. package/dist/constants/formatRules.js +102 -0
  121. package/dist/constants/formatRules.js.map +7 -0
  122. package/dist/constants/prompts.js +12 -34
  123. package/dist/constants/prompts.js.map +2 -2
  124. package/dist/constants/symbols.js +64 -6
  125. package/dist/constants/symbols.js.map +2 -2
  126. package/dist/constants/timing.js +5 -0
  127. package/dist/constants/timing.js.map +2 -2
  128. package/dist/core/config/defaults.js +84 -0
  129. package/dist/core/config/defaults.js.map +7 -0
  130. package/dist/core/config/index.js +111 -0
  131. package/dist/core/config/index.js.map +7 -0
  132. package/dist/core/config/loader.js +221 -0
  133. package/dist/core/config/loader.js.map +7 -0
  134. package/dist/core/config/migrations.js +128 -0
  135. package/dist/core/config/migrations.js.map +7 -0
  136. package/dist/core/config/schema.js +178 -0
  137. package/dist/core/config/schema.js.map +7 -0
  138. package/dist/core/costTracker.js +138 -0
  139. package/dist/core/costTracker.js.map +7 -0
  140. package/dist/core/index.js +5 -0
  141. package/dist/core/index.js.map +7 -0
  142. package/dist/core/permissions/auditLog.js +204 -0
  143. package/dist/core/permissions/auditLog.js.map +7 -0
  144. package/dist/core/permissions/engine/index.js +3 -0
  145. package/dist/core/permissions/engine/index.js.map +7 -0
  146. package/dist/core/permissions/engine/permissionEngine.js +106 -0
  147. package/dist/core/permissions/engine/permissionEngine.js.map +7 -0
  148. package/dist/core/permissions/engine/types.js +1 -0
  149. package/dist/core/permissions/engine/types.js.map +7 -0
  150. package/dist/core/permissions/index.js +84 -0
  151. package/dist/core/permissions/index.js.map +7 -0
  152. package/dist/core/permissions/ruleEngine.js +259 -0
  153. package/dist/core/permissions/ruleEngine.js.map +7 -0
  154. package/dist/core/permissions/rules/allowedToolsRule.js +62 -0
  155. package/dist/core/permissions/rules/allowedToolsRule.js.map +7 -0
  156. package/dist/core/permissions/rules/autoEscalationRule.js +291 -0
  157. package/dist/core/permissions/rules/autoEscalationRule.js.map +7 -0
  158. package/dist/core/permissions/rules/index.js +46 -0
  159. package/dist/core/permissions/rules/index.js.map +7 -0
  160. package/dist/core/permissions/rules/planModeRule.js +55 -0
  161. package/dist/core/permissions/rules/planModeRule.js.map +7 -0
  162. package/dist/core/permissions/rules/projectBoundaryRule.js +168 -0
  163. package/dist/core/permissions/rules/projectBoundaryRule.js.map +7 -0
  164. package/dist/core/permissions/rules/safeModeRule.js +65 -0
  165. package/dist/core/permissions/rules/safeModeRule.js.map +7 -0
  166. package/dist/core/permissions/rules/sensitivePathsRule.js +340 -0
  167. package/dist/core/permissions/rules/sensitivePathsRule.js.map +7 -0
  168. package/dist/core/permissions/types.js +127 -0
  169. package/dist/core/permissions/types.js.map +7 -0
  170. package/dist/core/tools/executor.js +143 -0
  171. package/dist/core/tools/executor.js.map +7 -0
  172. package/dist/core/tools/index.js +15 -0
  173. package/dist/core/tools/index.js.map +7 -0
  174. package/dist/core/tools/registry.js +183 -0
  175. package/dist/core/tools/registry.js.map +7 -0
  176. package/dist/core/tools/types.js +1 -0
  177. package/dist/core/tools/types.js.map +7 -0
  178. package/dist/cost-tracker.js +23 -15
  179. package/dist/cost-tracker.js.map +2 -2
  180. package/dist/entrypoints/cli.js +43 -43
  181. package/dist/entrypoints/cli.js.map +2 -2
  182. package/dist/entrypoints/mcp.js +12 -4
  183. package/dist/entrypoints/mcp.js.map +2 -2
  184. package/dist/history.js +14 -3
  185. package/dist/history.js.map +2 -2
  186. package/dist/hooks/useAgentTranscripts.js +116 -0
  187. package/dist/hooks/useAgentTranscripts.js.map +7 -0
  188. package/dist/hooks/useAnimationSync.js +53 -0
  189. package/dist/hooks/useAnimationSync.js.map +7 -0
  190. package/dist/hooks/useArrowKeyHistory.js +4 -2
  191. package/dist/hooks/useArrowKeyHistory.js.map +2 -2
  192. package/dist/hooks/useCanUseTool.js +3 -1
  193. package/dist/hooks/useCanUseTool.js.map +2 -2
  194. package/dist/hooks/useCancelRequest.js +4 -1
  195. package/dist/hooks/useCancelRequest.js.map +2 -2
  196. package/dist/hooks/useExitOnCtrlCD.js +9 -5
  197. package/dist/hooks/useExitOnCtrlCD.js.map +2 -2
  198. package/dist/hooks/useHookStatus.js +40 -0
  199. package/dist/hooks/useHookStatus.js.map +7 -0
  200. package/dist/hooks/useLogMessages.js +17 -1
  201. package/dist/hooks/useLogMessages.js.map +2 -2
  202. package/dist/hooks/useMessageGroups.js +43 -0
  203. package/dist/hooks/useMessageGroups.js.map +7 -0
  204. package/dist/hooks/useTerminalSize.js +62 -6
  205. package/dist/hooks/useTerminalSize.js.map +2 -2
  206. package/dist/hooks/useUnifiedCompletion.js +69 -0
  207. package/dist/hooks/useUnifiedCompletion.js.map +2 -2
  208. package/dist/i18n/index.js +109 -0
  209. package/dist/i18n/index.js.map +7 -0
  210. package/dist/i18n/locales/en.js +347 -0
  211. package/dist/i18n/locales/en.js.map +7 -0
  212. package/dist/i18n/locales/index.js +7 -0
  213. package/dist/i18n/locales/index.js.map +7 -0
  214. package/dist/i18n/locales/zh-CN.js +347 -0
  215. package/dist/i18n/locales/zh-CN.js.map +7 -0
  216. package/dist/i18n/types.js +8 -0
  217. package/dist/i18n/types.js.map +7 -0
  218. package/dist/query.js +175 -17
  219. package/dist/query.js.map +3 -3
  220. package/dist/screens/REPL.js +501 -192
  221. package/dist/screens/REPL.js.map +3 -3
  222. package/dist/services/adapters/chatCompletions.js +3 -1
  223. package/dist/services/adapters/chatCompletions.js.map +2 -2
  224. package/dist/services/adapters/messageNormalizer.js +354 -0
  225. package/dist/services/adapters/messageNormalizer.js.map +7 -0
  226. package/dist/services/adapters/responsesAPI.js +6 -3
  227. package/dist/services/adapters/responsesAPI.js.map +2 -2
  228. package/dist/services/checkpointManager.js +386 -0
  229. package/dist/services/checkpointManager.js.map +7 -0
  230. package/dist/services/claude.js +138 -11
  231. package/dist/services/claude.js.map +3 -3
  232. package/dist/services/compressionService.js +50 -1
  233. package/dist/services/compressionService.js.map +2 -2
  234. package/dist/services/contextMonitor.js +162 -0
  235. package/dist/services/contextMonitor.js.map +7 -0
  236. package/dist/services/customCommands.js +60 -41
  237. package/dist/services/customCommands.js.map +2 -2
  238. package/dist/services/hookExecutor.js +173 -1
  239. package/dist/services/hookExecutor.js.map +2 -2
  240. package/dist/services/intelligentCompactor.js +281 -0
  241. package/dist/services/intelligentCompactor.js.map +7 -0
  242. package/dist/services/lspConfig.js +109 -0
  243. package/dist/services/lspConfig.js.map +7 -0
  244. package/dist/services/mcpClient.js +273 -34
  245. package/dist/services/mcpClient.js.map +2 -2
  246. package/dist/services/modelOrchestrator.js +310 -0
  247. package/dist/services/modelOrchestrator.js.map +7 -0
  248. package/dist/services/openai.js +8 -1
  249. package/dist/services/openai.js.map +2 -2
  250. package/dist/services/outputStyles.js +138 -0
  251. package/dist/services/outputStyles.js.map +7 -0
  252. package/dist/services/plugins/index.js +5 -0
  253. package/dist/services/plugins/index.js.map +7 -0
  254. package/dist/services/plugins/lspServers.js +188 -0
  255. package/dist/services/plugins/lspServers.js.map +7 -0
  256. package/dist/services/plugins/pluginRuntime.js +229 -0
  257. package/dist/services/plugins/pluginRuntime.js.map +7 -0
  258. package/dist/services/plugins/pluginValidation.js +219 -0
  259. package/dist/services/plugins/pluginValidation.js.map +7 -0
  260. package/dist/services/plugins/skillMarketplace.js +556 -0
  261. package/dist/services/plugins/skillMarketplace.js.map +7 -0
  262. package/dist/services/responseStateManager.js +37 -3
  263. package/dist/services/responseStateManager.js.map +2 -2
  264. package/dist/services/sandbox/filesystemBoundary.js +300 -0
  265. package/dist/services/sandbox/filesystemBoundary.js.map +7 -0
  266. package/dist/services/sandbox/index.js +14 -0
  267. package/dist/services/sandbox/index.js.map +7 -0
  268. package/dist/services/sandbox/networkProxy.js +293 -0
  269. package/dist/services/sandbox/networkProxy.js.map +7 -0
  270. package/dist/services/sandbox/sandboxController.js +574 -0
  271. package/dist/services/sandbox/sandboxController.js.map +7 -0
  272. package/dist/services/sandbox/types.js +50 -0
  273. package/dist/services/sandbox/types.js.map +7 -0
  274. package/dist/services/sessionMemory.js +266 -0
  275. package/dist/services/sessionMemory.js.map +7 -0
  276. package/dist/services/taskRouter.js +324 -0
  277. package/dist/services/taskRouter.js.map +7 -0
  278. package/dist/tools/ArchitectTool/ArchitectTool.js +10 -3
  279. package/dist/tools/ArchitectTool/ArchitectTool.js.map +2 -2
  280. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +3 -0
  281. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
  282. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js +8 -1
  283. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +2 -2
  284. package/dist/tools/BaseTool.js +72 -0
  285. package/dist/tools/BaseTool.js.map +7 -0
  286. package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js +3 -0
  287. package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js.map +2 -2
  288. package/dist/tools/BashTool/BashTool.js +60 -3
  289. package/dist/tools/BashTool/BashTool.js.map +2 -2
  290. package/dist/tools/BashTool/BashToolResultMessage.js +3 -0
  291. package/dist/tools/BashTool/BashToolResultMessage.js.map +2 -2
  292. package/dist/tools/BashTool/OutputLine.js +54 -0
  293. package/dist/tools/BashTool/OutputLine.js.map +2 -2
  294. package/dist/tools/BashTool/prompt.js +192 -3
  295. package/dist/tools/BashTool/prompt.js.map +2 -2
  296. package/dist/tools/FileEditTool/FileEditTool.js +29 -4
  297. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  298. package/dist/tools/FileReadTool/FileReadTool.js +23 -4
  299. package/dist/tools/FileReadTool/FileReadTool.js.map +2 -2
  300. package/dist/tools/FileWriteTool/FileWriteTool.js +5 -5
  301. package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
  302. package/dist/tools/GlobTool/GlobTool.js +14 -3
  303. package/dist/tools/GlobTool/GlobTool.js.map +2 -2
  304. package/dist/tools/GrepTool/GrepTool.js +41 -7
  305. package/dist/tools/GrepTool/GrepTool.js.map +2 -2
  306. package/dist/tools/KillShellTool/KillShellToolResultMessage.js +3 -0
  307. package/dist/tools/KillShellTool/KillShellToolResultMessage.js.map +2 -2
  308. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js +109 -0
  309. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +7 -0
  310. package/dist/tools/ListMcpResourcesTool/prompt.js +19 -0
  311. package/dist/tools/ListMcpResourcesTool/prompt.js.map +7 -0
  312. package/dist/tools/LspTool/LspTool.js +664 -0
  313. package/dist/tools/LspTool/LspTool.js.map +7 -0
  314. package/dist/tools/LspTool/prompt.js +27 -0
  315. package/dist/tools/LspTool/prompt.js.map +7 -0
  316. package/dist/tools/MCPTool/MCPTool.js +11 -4
  317. package/dist/tools/MCPTool/MCPTool.js.map +2 -2
  318. package/dist/tools/MemoryReadTool/MemoryReadTool.js +19 -6
  319. package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
  320. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +6 -6
  321. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
  322. package/dist/tools/MultiEditTool/MultiEditTool.js +19 -2
  323. package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
  324. package/dist/tools/NotebookEditTool/NotebookEditTool.js +5 -1
  325. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
  326. package/dist/tools/NotebookReadTool/NotebookReadTool.js +8 -4
  327. package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +2 -2
  328. package/dist/tools/PlanModeTool/EnterPlanModeTool.js +74 -0
  329. package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +7 -0
  330. package/dist/tools/PlanModeTool/ExitPlanModeTool.js +108 -0
  331. package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +7 -0
  332. package/dist/tools/PlanModeTool/prompt.js +94 -0
  333. package/dist/tools/PlanModeTool/prompt.js.map +7 -0
  334. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js +130 -0
  335. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +7 -0
  336. package/dist/tools/ReadMcpResourceTool/prompt.js +17 -0
  337. package/dist/tools/ReadMcpResourceTool/prompt.js.map +7 -0
  338. package/dist/tools/SkillTool/SkillTool.js +14 -3
  339. package/dist/tools/SkillTool/SkillTool.js.map +2 -2
  340. package/dist/tools/SlashCommandTool/SlashCommandTool.js +260 -0
  341. package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +7 -0
  342. package/dist/tools/SlashCommandTool/prompt.js +35 -0
  343. package/dist/tools/SlashCommandTool/prompt.js.map +7 -0
  344. package/dist/tools/TaskOutputTool/TaskOutputTool.js +189 -0
  345. package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +7 -0
  346. package/dist/tools/TaskOutputTool/prompt.js +15 -0
  347. package/dist/tools/TaskOutputTool/prompt.js.map +7 -0
  348. package/dist/tools/TaskTool/TaskTool.js +321 -146
  349. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  350. package/dist/tools/TaskTool/prompt.js.map +2 -2
  351. package/dist/tools/TodoWriteTool/TodoWriteTool.js +42 -73
  352. package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +2 -2
  353. package/dist/tools/URLFetcherTool/URLFetcherTool.js +7 -1
  354. package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
  355. package/dist/tools/URLFetcherTool/cache.js +55 -8
  356. package/dist/tools/URLFetcherTool/cache.js.map +2 -2
  357. package/dist/tools/WebSearchTool/WebSearchTool.js +6 -1
  358. package/dist/tools/WebSearchTool/WebSearchTool.js.map +2 -2
  359. package/dist/tools.js +31 -2
  360. package/dist/tools.js.map +2 -2
  361. package/dist/types/hooks.js +4 -0
  362. package/dist/types/hooks.js.map +2 -2
  363. package/dist/types/marketplace.js.map +2 -2
  364. package/dist/types/messageGroup.js +36 -0
  365. package/dist/types/messageGroup.js.map +7 -0
  366. package/dist/types/plugin.js.map +2 -2
  367. package/dist/types/thinking.js +1 -0
  368. package/dist/types/thinking.js.map +7 -0
  369. package/dist/utils/BackgroundShellManager.js +136 -39
  370. package/dist/utils/BackgroundShellManager.js.map +2 -2
  371. package/dist/utils/MessageBatchBuffer.js +102 -0
  372. package/dist/utils/MessageBatchBuffer.js.map +7 -0
  373. package/dist/utils/PersistentShell.js +151 -1
  374. package/dist/utils/PersistentShell.js.map +2 -2
  375. package/dist/utils/agentLoader.js +1 -23
  376. package/dist/utils/agentLoader.js.map +2 -2
  377. package/dist/utils/agentTranscripts.js +641 -0
  378. package/dist/utils/agentTranscripts.js.map +7 -0
  379. package/dist/utils/animationManager.js +213 -0
  380. package/dist/utils/animationManager.js.map +7 -0
  381. package/dist/utils/animationSync.js +110 -0
  382. package/dist/utils/animationSync.js.map +7 -0
  383. package/dist/utils/asyncFile.js +215 -0
  384. package/dist/utils/asyncFile.js.map +7 -0
  385. package/dist/utils/backgroundAgentManager.js +231 -0
  386. package/dist/utils/backgroundAgentManager.js.map +7 -0
  387. package/dist/utils/config.js +63 -7
  388. package/dist/utils/config.js.map +2 -2
  389. package/dist/utils/conversationRecovery.js +19 -0
  390. package/dist/utils/conversationRecovery.js.map +2 -2
  391. package/dist/utils/exit.js +73 -0
  392. package/dist/utils/exit.js.map +7 -0
  393. package/dist/utils/format.js +73 -5
  394. package/dist/utils/format.js.map +2 -2
  395. package/dist/utils/generators.js +76 -6
  396. package/dist/utils/generators.js.map +2 -2
  397. package/dist/utils/globalErrorHandler.js +149 -0
  398. package/dist/utils/globalErrorHandler.js.map +7 -0
  399. package/dist/utils/groupHandlers/index.js +8 -0
  400. package/dist/utils/groupHandlers/index.js.map +7 -0
  401. package/dist/utils/groupHandlers/parallelTasksHandler.js +140 -0
  402. package/dist/utils/groupHandlers/parallelTasksHandler.js.map +7 -0
  403. package/dist/utils/groupHandlers/taskHandler.js +104 -0
  404. package/dist/utils/groupHandlers/taskHandler.js.map +7 -0
  405. package/dist/utils/groupHandlers/types.js +1 -0
  406. package/dist/utils/groupHandlers/types.js.map +7 -0
  407. package/dist/utils/logRotation.js +224 -0
  408. package/dist/utils/logRotation.js.map +7 -0
  409. package/dist/utils/marketplaceManager.js +3 -5
  410. package/dist/utils/marketplaceManager.js.map +2 -2
  411. package/dist/utils/memSafety.js +264 -0
  412. package/dist/utils/memSafety.js.map +7 -0
  413. package/dist/utils/messageGroupManager.js +274 -0
  414. package/dist/utils/messageGroupManager.js.map +7 -0
  415. package/dist/utils/messages.js +13 -4
  416. package/dist/utils/messages.js.map +2 -2
  417. package/dist/utils/model.js +119 -15
  418. package/dist/utils/model.js.map +3 -3
  419. package/dist/utils/permissions/filesystem.js +157 -5
  420. package/dist/utils/permissions/filesystem.js.map +2 -2
  421. package/dist/utils/plan/planMode.js +143 -0
  422. package/dist/utils/plan/planMode.js.map +7 -0
  423. package/dist/utils/pluginLoader.js +17 -21
  424. package/dist/utils/pluginLoader.js.map +2 -2
  425. package/dist/utils/ripgrep.js +55 -2
  426. package/dist/utils/ripgrep.js.map +2 -2
  427. package/dist/utils/sanitizeInput.js +32 -0
  428. package/dist/utils/sanitizeInput.js.map +7 -0
  429. package/dist/utils/secureKeyStorage.js +312 -0
  430. package/dist/utils/secureKeyStorage.js.map +7 -0
  431. package/dist/utils/session/sessionPlugins.js +67 -0
  432. package/dist/utils/session/sessionPlugins.js.map +7 -0
  433. package/dist/utils/taskDisplayUtils.js +257 -0
  434. package/dist/utils/taskDisplayUtils.js.map +7 -0
  435. package/dist/utils/teamConfig.js +2 -1
  436. package/dist/utils/teamConfig.js.map +2 -2
  437. package/dist/utils/todoStorage.js +92 -2
  438. package/dist/utils/todoStorage.js.map +2 -2
  439. package/dist/utils/toolTimeout.js +136 -0
  440. package/dist/utils/toolTimeout.js.map +7 -0
  441. package/dist/utils/tooling/safeRender.js +115 -0
  442. package/dist/utils/tooling/safeRender.js.map +7 -0
  443. package/dist/utils/userFriendlyError.js +346 -0
  444. package/dist/utils/userFriendlyError.js.map +7 -0
  445. package/dist/utils/vendor/ripgrep/arm64-darwin/rg +0 -0
  446. package/dist/version.js +2 -2
  447. package/dist/version.js.map +1 -1
  448. package/package.json +14 -4
  449. package/scripts/postinstall.js +128 -38
  450. package/dist/commands/agents.js +0 -2086
  451. package/dist/commands/agents.js.map +0 -7
  452. package/dist/commands/build.js +0 -74
  453. package/dist/commands/build.js.map +0 -7
  454. package/dist/commands/compression.js +0 -57
  455. package/dist/commands/compression.js.map +0 -7
  456. package/dist/commands/listen.js +0 -37
  457. package/dist/commands/listen.js.map +0 -7
  458. package/dist/commands/login.js +0 -37
  459. package/dist/commands/login.js.map +0 -7
  460. package/dist/commands/logout.js +0 -33
  461. package/dist/commands/logout.js.map +0 -7
  462. package/dist/commands/mcp.js +0 -40
  463. package/dist/commands/mcp.js.map +0 -7
  464. package/dist/commands/mcp_refresh.js +0 -40
  465. package/dist/commands/mcp_refresh.js.map +0 -7
  466. package/dist/commands/modelstatus.js +0 -21
  467. package/dist/commands/modelstatus.js.map +0 -7
  468. package/dist/commands/onboarding.js +0 -36
  469. package/dist/commands/onboarding.js.map +0 -7
  470. package/dist/commands/plugin-interactive.js +0 -446
  471. package/dist/commands/plugin-interactive.js.map +0 -7
  472. package/dist/commands/pr_comments.js +0 -61
  473. package/dist/commands/pr_comments.js.map +0 -7
  474. package/dist/commands/release-notes.js +0 -30
  475. package/dist/commands/release-notes.js.map +0 -7
  476. package/dist/commands/review.js +0 -51
  477. package/dist/commands/review.js.map +0 -7
  478. package/dist/components/Bug.js +0 -147
  479. package/dist/components/Bug.js.map +0 -7
  480. package/dist/components/ModelSelector.js +0 -2062
  481. package/dist/components/ModelSelector.js.map +0 -7
  482. package/dist/components/ModelStatusDisplay.js +0 -87
  483. package/dist/components/ModelStatusDisplay.js.map +0 -7
  484. package/dist/entrypoints/cli-wrapper.js +0 -61
  485. package/dist/entrypoints/cli-wrapper.js.map +0 -7
  486. package/dist/screens/Doctor.js +0 -22
  487. package/dist/screens/Doctor.js.map +0 -7
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/tools/ReadMcpResourceTool/ReadMcpResourceTool.tsx"],
4
+ "sourcesContent": ["import { Box, Text } from 'ink'\nimport React from 'react'\nimport { z } from 'zod'\nimport { Cost } from '@components/Cost'\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport { Tool } from '@tool'\nimport { readMCPResource, McpResourceContent } from '@services/mcpClient'\nimport { DESCRIPTION, TOOL_NAME_FOR_PROMPT } from './prompt'\nimport { getTheme } from '@utils/theme'\n\nconst inputSchema = z.strictObject({\n uri: z.string().describe('The URI of the resource to read'),\n server: z\n .string()\n .optional()\n .describe('Optional server name to target a specific MCP server'),\n})\n\ntype Output = {\n durationMs: number\n content: McpResourceContent | null\n error?: string\n}\n\nexport const ReadMcpResourceTool = {\n name: TOOL_NAME_FOR_PROMPT,\n async description() {\n return DESCRIPTION\n },\n userFacingName() {\n return 'Read MCP Resource'\n },\n inputSchema,\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return true\n },\n isConcurrencySafe() {\n return true // Read-only operation, safe for concurrent execution\n },\n needsPermissions() {\n return false // No file system access needed\n },\n async prompt() {\n return DESCRIPTION\n },\n renderToolUseMessage({ uri, server }, { verbose }) {\n let msg = `uri: \"${uri}\"`\n if (server) {\n msg += `, server: \"${server}\"`\n }\n return msg\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(output) {\n if (!output) {\n return (\n <Box justifyContent=\"space-between\" width=\"100%\">\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text color={getTheme().error}>Failed to read resource</Text>\n </Box>\n </Box>\n )\n }\n\n // Handle string content for backward compatibility\n if (typeof output === 'string') {\n try {\n output = JSON.parse(output) as Output\n } catch {\n return (\n <Box justifyContent=\"space-between\" width=\"100%\">\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;Read MCP resource</Text>\n </Box>\n </Box>\n )\n }\n }\n\n const durationMs = output?.durationMs ?? 0\n\n if (output?.error) {\n return (\n <Box justifyContent=\"space-between\" width=\"100%\">\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text color={getTheme().error}>{output.error}</Text>\n </Box>\n <Cost costUSD={0} durationMs={durationMs} debug={false} />\n </Box>\n )\n }\n\n if (!output?.content) {\n return (\n <Box justifyContent=\"space-between\" width=\"100%\">\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text color={getTheme().warning}>Resource not found</Text>\n </Box>\n <Cost costUSD={0} durationMs={durationMs} debug={false} />\n </Box>\n )\n }\n\n const contentType = output.content.mimeType || 'unknown'\n const hasText = !!output.content.text\n const hasBlob = !!output.content.blob\n\n return (\n <Box justifyContent=\"space-between\" width=\"100%\">\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;Read resource </Text>\n <Text color={getTheme().secondaryText}>\n ({contentType}, {hasText ? 'text' : hasBlob ? 'binary' : 'empty'})\n </Text>\n </Box>\n <Cost costUSD={0} durationMs={durationMs} debug={false} />\n </Box>\n )\n },\n async *call({ uri, server }) {\n const start = Date.now()\n\n try {\n const content = await readMCPResource(uri, server)\n const output: Output = {\n content,\n durationMs: Date.now() - start,\n }\n yield {\n type: 'result',\n resultForAssistant: this.renderResultForAssistant(output),\n data: output,\n }\n } catch (error) {\n const output: Output = {\n content: null,\n durationMs: Date.now() - start,\n error: error instanceof Error ? error.message : String(error),\n }\n yield {\n type: 'result',\n resultForAssistant: this.renderResultForAssistant(output),\n data: output,\n }\n }\n },\n renderResultForAssistant(output) {\n if (output.error) {\n return `Error reading resource: ${output.error}`\n }\n\n if (!output.content) {\n return 'Resource not found or not accessible'\n }\n\n const lines: string[] = []\n lines.push(`Resource: ${output.content.uri}`)\n\n if (output.content.mimeType) {\n lines.push(`MIME Type: ${output.content.mimeType}`)\n }\n\n lines.push('')\n\n if (output.content.text) {\n lines.push('Content:')\n lines.push(output.content.text)\n } else if (output.content.blob) {\n lines.push(\n `Binary content (base64, ${output.content.blob.length} characters)`,\n )\n // Only show first 200 chars of base64 for preview\n if (output.content.blob.length > 200) {\n lines.push(output.content.blob.substring(0, 200) + '...')\n } else {\n lines.push(output.content.blob)\n }\n } else {\n lines.push('(Empty content)')\n }\n\n return lines.join('\\n')\n },\n} satisfies Tool<typeof inputSchema, Output>\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,17 @@
1
+ const TOOL_NAME_FOR_PROMPT = "ReadMcpResource";
2
+ const DESCRIPTION = `Reads the content of a specific resource from an MCP (Model Context Protocol) server.
3
+
4
+ Use this tool to retrieve the content of a resource identified by its URI.
5
+ First use ListMcpResources to discover available resources and their URIs.
6
+
7
+ The resource content can be:
8
+ - Text content (for text files, JSON, etc.)
9
+ - Binary content encoded as base64 (for images, PDFs, etc.)
10
+
11
+ You can optionally specify a server name to target a specific MCP server,
12
+ which is useful when multiple servers might expose resources with similar URIs.`;
13
+ export {
14
+ DESCRIPTION,
15
+ TOOL_NAME_FOR_PROMPT
16
+ };
17
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/tools/ReadMcpResourceTool/prompt.ts"],
4
+ "sourcesContent": ["export const TOOL_NAME_FOR_PROMPT = 'ReadMcpResource'\n\nexport const DESCRIPTION = `Reads the content of a specific resource from an MCP (Model Context Protocol) server.\n\nUse this tool to retrieve the content of a resource identified by its URI.\nFirst use ListMcpResources to discover available resources and their URIs.\n\nThe resource content can be:\n- Text content (for text files, JSON, etc.)\n- Binary content encoded as base64 (for images, PDFs, etc.)\n\nYou can optionally specify a server name to target a specific MCP server,\nwhich is useful when multiple servers might expose resources with similar URIs.`\n"],
5
+ "mappings": "AAAO,MAAM,uBAAuB;AAE7B,MAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
6
+ "names": []
7
+ }
@@ -101,14 +101,25 @@ ${skill.content}
101
101
  return /* @__PURE__ */ React.createElement(FallbackToolUseRejectedMessage, null);
102
102
  },
103
103
  renderToolResultMessage(output) {
104
+ if (!output || !output.type) {
105
+ return /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2 }, /* @__PURE__ */ React.createElement(Text, null, "Skill operation completed"));
106
+ }
104
107
  if (output.type === "list") {
105
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: "green" }, "\u2713 Found ", output.skills.length, " skill", output.skills.length !== 1 ? "s" : ""), output.skills.slice(0, 10).map((skill, i) => /* @__PURE__ */ React.createElement(Box, { key: i, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { bold: true }, skill.name), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " (", skill.plugin, ")")), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " ", skill.description))), output.skills.length > 10 && /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " ... and ", output.skills.length - 10, " more"));
108
+ const skills = output.skills || [];
109
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: "green" }, "\u2713 Found ", skills.length, " skill", skills.length !== 1 ? "s" : ""), skills.slice(0, 10).map((skill, i) => /* @__PURE__ */ React.createElement(Box, { key: i, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { bold: true }, skill?.name || "Unknown"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " (", skill?.plugin || "Unknown", ")")), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " ", skill?.description || ""))), skills.length > 10 && /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " ... and ", skills.length - 10, " more"));
106
110
  }
107
111
  if (output.type === "search") {
108
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: "green" }, "\u2713 Found ", output.skills.length, " skill", output.skills.length !== 1 ? "s" : "", ' matching "', output.query, '"'), output.skills.slice(0, 10).map((skill, i) => /* @__PURE__ */ React.createElement(Box, { key: i, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { bold: true }, skill.name), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " (", skill.plugin, ")")), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " ", skill.description))), output.skills.length > 10 && /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " ... and ", output.skills.length - 10, " more"));
112
+ const skills = output.skills || [];
113
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: "green" }, "\u2713 Found ", skills.length, " skill", skills.length !== 1 ? "s" : "", ' matching "', output.query || "", '"'), skills.slice(0, 10).map((skill, i) => /* @__PURE__ */ React.createElement(Box, { key: i, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { bold: true }, skill?.name || "Unknown"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " (", skill?.plugin || "Unknown", ")")), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " ", skill?.description || ""))), skills.length > 10 && /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " ... and ", skills.length - 10, " more"));
109
114
  }
110
115
  if (output.type === "load") {
111
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: "green" }, "\u2713 Loaded skill: ", output.skill.name), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " Plugin: ", output.skill.plugin), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " ", "Content: ", output.skill.content.length, " characters"));
116
+ const skill = output.skill || {
117
+ name: "",
118
+ description: "",
119
+ plugin: "",
120
+ content: ""
121
+ };
122
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: "green" }, "\u2713 Loaded skill: ", skill.name || "Unknown"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " Plugin: ", skill.plugin || "Unknown"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " ", "Content: ", (skill.content || "").length, " characters"));
112
123
  }
113
124
  return /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2 }, /* @__PURE__ */ React.createElement(Text, null, "Skill operation completed"));
114
125
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/tools/SkillTool/SkillTool.tsx"],
4
- "sourcesContent": ["import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { z } from 'zod'\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport { Tool } from '@tool'\nimport {\n loadAllSkills,\n getSkill,\n loadSkillContent,\n searchSkills,\n getSkillCount,\n} from '@utils/skillLoader'\nimport { DESCRIPTION, PROMPT } from './prompt'\n\nconst inputSchema = z.strictObject({\n action: z\n .enum(['list', 'load', 'search'])\n .describe(\n 'Action to perform: list all skills, load a specific skill, or search skills',\n ),\n name: z\n .string()\n .optional()\n .describe('Name of skill to load (required for \"load\" action)'),\n query: z\n .string()\n .optional()\n .describe('Search query (required for \"search\" action)'),\n})\n\ntype SkillToolOutput =\n | {\n type: 'list'\n skills: Array<{ name: string; description: string; plugin: string }>\n }\n | {\n type: 'load'\n skill: {\n name: string\n description: string\n plugin: string\n content: string\n }\n }\n | {\n type: 'search'\n skills: Array<{ name: string; description: string; plugin: string }>\n query: string\n }\n\nexport const SkillTool = {\n name: 'Skill',\n async description() {\n return DESCRIPTION\n },\n async prompt() {\n return PROMPT\n },\n inputSchema,\n userFacingName() {\n return 'Skill'\n },\n async isEnabled() {\n // Enable if there are any skills available\n return getSkillCount() > 0\n },\n isReadOnly() {\n return true // Skills are read-only resources\n },\n isConcurrencySafe() {\n return true // Reading skills is safe for concurrent execution\n },\n needsPermissions() {\n return false // No permissions needed for reading skills\n },\n renderResultForAssistant(output: SkillToolOutput) {\n if (output.type === 'list') {\n if (output.skills.length === 0) {\n return 'No skills available. Install plugins with skills to use this feature.'\n }\n\n const skillsList = output.skills\n .map(\n skill =>\n `- **${skill.name}** (${skill.plugin}): ${skill.description}`,\n )\n .join('\\n')\n\n return `Available skills (${output.skills.length}):\\n\\n${skillsList}\\n\\nUse the \"load\" action to get full skill content.`\n }\n\n if (output.type === 'search') {\n if (output.skills.length === 0) {\n return `No skills found matching \"${output.query}\".`\n }\n\n const skillsList = output.skills\n .map(\n skill =>\n `- **${skill.name}** (${skill.plugin}): ${skill.description}`,\n )\n .join('\\n')\n\n return `Skills matching \"${output.query}\" (${output.skills.length}):\\n\\n${skillsList}\\n\\nUse the \"load\" action to get full skill content.`\n }\n\n if (output.type === 'load') {\n const { skill } = output\n return `# Skill: ${skill.name}\n\n**Plugin**: ${skill.plugin}\n**Description**: ${skill.description}\n\n---\n\n${skill.content}\n\n---\n\n*End of skill content. Apply these instructions to complete your task.*`\n }\n\n return 'Unknown skill operation'\n },\n renderToolUseMessage(input, { verbose }) {\n if (input.action === 'list') {\n return 'Listing all available skills'\n }\n if (input.action === 'load' && input.name) {\n return `Loading skill: ${input.name}`\n }\n if (input.action === 'search' && input.query) {\n return `Searching skills for: ${input.query}`\n }\n return Object.entries(input)\n .map(([key, value]) => `${key}: ${JSON.stringify(value)}`)\n .join(', ')\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(output: SkillToolOutput) {\n if (output.type === 'list') {\n return (\n <Box flexDirection=\"column\" paddingLeft={2}>\n <Text color=\"green\">\n \u2713 Found {output.skills.length} skill\n {output.skills.length !== 1 ? 's' : ''}\n </Text>\n {output.skills.slice(0, 10).map((skill, i) => (\n <Box key={i} flexDirection=\"column\">\n <Text>\n <Text bold>{skill.name}</Text>\n <Text dimColor> ({skill.plugin})</Text>\n </Text>\n <Text dimColor> {skill.description}</Text>\n </Box>\n ))}\n {output.skills.length > 10 && (\n <Text dimColor> ... and {output.skills.length - 10} more</Text>\n )}\n </Box>\n )\n }\n\n if (output.type === 'search') {\n return (\n <Box flexDirection=\"column\" paddingLeft={2}>\n <Text color=\"green\">\n \u2713 Found {output.skills.length} skill\n {output.skills.length !== 1 ? 's' : ''} matching &quot;\n {output.query}&quot;\n </Text>\n {output.skills.slice(0, 10).map((skill, i) => (\n <Box key={i} flexDirection=\"column\">\n <Text>\n <Text bold>{skill.name}</Text>\n <Text dimColor> ({skill.plugin})</Text>\n </Text>\n <Text dimColor> {skill.description}</Text>\n </Box>\n ))}\n {output.skills.length > 10 && (\n <Text dimColor> ... and {output.skills.length - 10} more</Text>\n )}\n </Box>\n )\n }\n\n if (output.type === 'load') {\n return (\n <Box flexDirection=\"column\" paddingLeft={2}>\n <Text color=\"green\">\u2713 Loaded skill: {output.skill.name}</Text>\n <Text dimColor> Plugin: {output.skill.plugin}</Text>\n <Text dimColor>\n {' '}\n Content: {output.skill.content.length} characters\n </Text>\n </Box>\n )\n }\n\n return (\n <Box paddingLeft={2}>\n <Text>Skill operation completed</Text>\n </Box>\n )\n },\n async validateInput(input) {\n if (input.action === 'load') {\n if (!input.name) {\n return {\n result: false,\n message: 'Skill name is required for \"load\" action',\n }\n }\n\n const skill = getSkill(input.name)\n if (!skill) {\n const allSkills = loadAllSkills()\n const availableNames = allSkills.map(s => s.name).join(', ')\n return {\n result: false,\n message: `Skill \"${input.name}\" not found. Available skills: ${availableNames}`,\n }\n }\n }\n\n if (input.action === 'search') {\n if (!input.query) {\n return {\n result: false,\n message: 'Query is required for \"search\" action',\n }\n }\n }\n\n return { result: true }\n },\n async *call(input) {\n try {\n // List all skills\n if (input.action === 'list') {\n const skills = loadAllSkills()\n const skillsList = skills.map(skill => ({\n name: skill.name,\n description: skill.config.description,\n plugin: skill.pluginName,\n }))\n\n const output: SkillToolOutput = {\n type: 'list',\n skills: skillsList,\n }\n\n yield {\n type: 'result',\n data: output,\n resultForAssistant: this.renderResultForAssistant(output),\n }\n return\n }\n\n // Load specific skill\n if (input.action === 'load' && input.name) {\n const skill = getSkill(input.name)\n if (!skill) {\n throw new Error(`Skill \"${input.name}\" not found`)\n }\n\n // Load full content\n const content = await loadSkillContent(skill)\n\n const output: SkillToolOutput = {\n type: 'load',\n skill: {\n name: skill.name,\n description: skill.config.description,\n plugin: skill.pluginName,\n content,\n },\n }\n\n yield {\n type: 'result',\n data: output,\n resultForAssistant: this.renderResultForAssistant(output),\n }\n return\n }\n\n // Search skills\n if (input.action === 'search' && input.query) {\n const skills = searchSkills(input.query)\n const skillsList = skills.map(skill => ({\n name: skill.name,\n description: skill.config.description,\n plugin: skill.pluginName,\n }))\n\n const output: SkillToolOutput = {\n type: 'search',\n skills: skillsList,\n query: input.query,\n }\n\n yield {\n type: 'result',\n data: output,\n resultForAssistant: this.renderResultForAssistant(output),\n }\n return\n }\n\n throw new Error('Invalid skill action or missing required parameters')\n } catch (error) {\n throw new Error(\n `Skill operation failed: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n },\n} satisfies Tool<typeof inputSchema, SkillToolOutput>\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { z } from 'zod'\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport { Tool } from '@tool'\nimport {\n loadAllSkills,\n getSkill,\n loadSkillContent,\n searchSkills,\n getSkillCount,\n} from '@utils/skillLoader'\nimport { DESCRIPTION, PROMPT } from './prompt'\n\nconst inputSchema = z.strictObject({\n action: z\n .enum(['list', 'load', 'search'])\n .describe(\n 'Action to perform: list all skills, load a specific skill, or search skills',\n ),\n name: z\n .string()\n .optional()\n .describe('Name of skill to load (required for \"load\" action)'),\n query: z\n .string()\n .optional()\n .describe('Search query (required for \"search\" action)'),\n})\n\ntype SkillToolOutput =\n | {\n type: 'list'\n skills: Array<{ name: string; description: string; plugin: string }>\n }\n | {\n type: 'load'\n skill: {\n name: string\n description: string\n plugin: string\n content: string\n }\n }\n | {\n type: 'search'\n skills: Array<{ name: string; description: string; plugin: string }>\n query: string\n }\n\nexport const SkillTool = {\n name: 'Skill',\n async description() {\n return DESCRIPTION\n },\n async prompt() {\n return PROMPT\n },\n inputSchema,\n userFacingName() {\n return 'Skill'\n },\n async isEnabled() {\n // Enable if there are any skills available\n return getSkillCount() > 0\n },\n isReadOnly() {\n return true // Skills are read-only resources\n },\n isConcurrencySafe() {\n return true // Reading skills is safe for concurrent execution\n },\n needsPermissions() {\n return false // No permissions needed for reading skills\n },\n renderResultForAssistant(output: SkillToolOutput) {\n if (output.type === 'list') {\n if (output.skills.length === 0) {\n return 'No skills available. Install plugins with skills to use this feature.'\n }\n\n const skillsList = output.skills\n .map(\n skill =>\n `- **${skill.name}** (${skill.plugin}): ${skill.description}`,\n )\n .join('\\n')\n\n return `Available skills (${output.skills.length}):\\n\\n${skillsList}\\n\\nUse the \"load\" action to get full skill content.`\n }\n\n if (output.type === 'search') {\n if (output.skills.length === 0) {\n return `No skills found matching \"${output.query}\".`\n }\n\n const skillsList = output.skills\n .map(\n skill =>\n `- **${skill.name}** (${skill.plugin}): ${skill.description}`,\n )\n .join('\\n')\n\n return `Skills matching \"${output.query}\" (${output.skills.length}):\\n\\n${skillsList}\\n\\nUse the \"load\" action to get full skill content.`\n }\n\n if (output.type === 'load') {\n const { skill } = output\n return `# Skill: ${skill.name}\n\n**Plugin**: ${skill.plugin}\n**Description**: ${skill.description}\n\n---\n\n${skill.content}\n\n---\n\n*End of skill content. Apply these instructions to complete your task.*`\n }\n\n return 'Unknown skill operation'\n },\n renderToolUseMessage(input, { verbose }) {\n if (input.action === 'list') {\n return 'Listing all available skills'\n }\n if (input.action === 'load' && input.name) {\n return `Loading skill: ${input.name}`\n }\n if (input.action === 'search' && input.query) {\n return `Searching skills for: ${input.query}`\n }\n return Object.entries(input)\n .map(([key, value]) => `${key}: ${JSON.stringify(value)}`)\n .join(', ')\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(output: SkillToolOutput) {\n // Guard against undefined or null output\n if (!output || !output.type) {\n return (\n <Box paddingLeft={2}>\n <Text>Skill operation completed</Text>\n </Box>\n )\n }\n\n if (output.type === 'list') {\n const skills = output.skills || []\n return (\n <Box flexDirection=\"column\" paddingLeft={2}>\n <Text color=\"green\">\n \u2713 Found {skills.length} skill\n {skills.length !== 1 ? 's' : ''}\n </Text>\n {skills.slice(0, 10).map((skill, i) => (\n <Box key={i} flexDirection=\"column\">\n <Text>\n <Text bold>{skill?.name || 'Unknown'}</Text>\n <Text dimColor> ({skill?.plugin || 'Unknown'})</Text>\n </Text>\n <Text dimColor> {skill?.description || ''}</Text>\n </Box>\n ))}\n {skills.length > 10 && (\n <Text dimColor> ... and {skills.length - 10} more</Text>\n )}\n </Box>\n )\n }\n\n if (output.type === 'search') {\n const skills = output.skills || []\n return (\n <Box flexDirection=\"column\" paddingLeft={2}>\n <Text color=\"green\">\n \u2713 Found {skills.length} skill\n {skills.length !== 1 ? 's' : ''} matching &quot;\n {output.query || ''}&quot;\n </Text>\n {skills.slice(0, 10).map((skill, i) => (\n <Box key={i} flexDirection=\"column\">\n <Text>\n <Text bold>{skill?.name || 'Unknown'}</Text>\n <Text dimColor> ({skill?.plugin || 'Unknown'})</Text>\n </Text>\n <Text dimColor> {skill?.description || ''}</Text>\n </Box>\n ))}\n {skills.length > 10 && (\n <Text dimColor> ... and {skills.length - 10} more</Text>\n )}\n </Box>\n )\n }\n\n if (output.type === 'load') {\n const skill = output.skill || {\n name: '',\n description: '',\n plugin: '',\n content: '',\n }\n return (\n <Box flexDirection=\"column\" paddingLeft={2}>\n <Text color=\"green\">\u2713 Loaded skill: {skill.name || 'Unknown'}</Text>\n <Text dimColor> Plugin: {skill.plugin || 'Unknown'}</Text>\n <Text dimColor>\n {' '}\n Content: {(skill.content || '').length} characters\n </Text>\n </Box>\n )\n }\n\n return (\n <Box paddingLeft={2}>\n <Text>Skill operation completed</Text>\n </Box>\n )\n },\n async validateInput(input) {\n if (input.action === 'load') {\n if (!input.name) {\n return {\n result: false,\n message: 'Skill name is required for \"load\" action',\n }\n }\n\n const skill = getSkill(input.name)\n if (!skill) {\n const allSkills = loadAllSkills()\n const availableNames = allSkills.map(s => s.name).join(', ')\n return {\n result: false,\n message: `Skill \"${input.name}\" not found. Available skills: ${availableNames}`,\n }\n }\n }\n\n if (input.action === 'search') {\n if (!input.query) {\n return {\n result: false,\n message: 'Query is required for \"search\" action',\n }\n }\n }\n\n return { result: true }\n },\n async *call(input) {\n try {\n // List all skills\n if (input.action === 'list') {\n const skills = loadAllSkills()\n const skillsList = skills.map(skill => ({\n name: skill.name,\n description: skill.config.description,\n plugin: skill.pluginName,\n }))\n\n const output: SkillToolOutput = {\n type: 'list',\n skills: skillsList,\n }\n\n yield {\n type: 'result',\n data: output,\n resultForAssistant: this.renderResultForAssistant(output),\n }\n return\n }\n\n // Load specific skill\n if (input.action === 'load' && input.name) {\n const skill = getSkill(input.name)\n if (!skill) {\n throw new Error(`Skill \"${input.name}\" not found`)\n }\n\n // Load full content\n const content = await loadSkillContent(skill)\n\n const output: SkillToolOutput = {\n type: 'load',\n skill: {\n name: skill.name,\n description: skill.config.description,\n plugin: skill.pluginName,\n content,\n },\n }\n\n yield {\n type: 'result',\n data: output,\n resultForAssistant: this.renderResultForAssistant(output),\n }\n return\n }\n\n // Search skills\n if (input.action === 'search' && input.query) {\n const skills = searchSkills(input.query)\n const skillsList = skills.map(skill => ({\n name: skill.name,\n description: skill.config.description,\n plugin: skill.pluginName,\n }))\n\n const output: SkillToolOutput = {\n type: 'search',\n skills: skillsList,\n query: input.query,\n }\n\n yield {\n type: 'result',\n data: output,\n resultForAssistant: this.renderResultForAssistant(output),\n }\n return\n }\n\n throw new Error('Invalid skill action or missing required parameters')\n } catch (error) {\n throw new Error(\n `Skill operation failed: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n },\n} satisfies Tool<typeof inputSchema, SkillToolOutput>\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,260 @@
1
+ import { z } from "zod";
2
+ import { FallbackToolUseRejectedMessage } from "../../components/FallbackToolUseRejectedMessage.js";
3
+ import * as React from "react";
4
+ import { createUserMessage } from "../../utils/messages.js";
5
+ import { getCommands } from "../../commands.js";
6
+ import {
7
+ loadCustomCommands
8
+ } from "../../services/customCommands.js";
9
+ import { TOOL_NAME_FOR_PROMPT } from "./prompt.js";
10
+ import { Box, Text } from "ink";
11
+ const inputSchema = z.strictObject({
12
+ skill: z.string().describe('The skill name. E.g., "commit", "review-pr", or "pdf"'),
13
+ args: z.string().optional().describe("Optional arguments for the skill")
14
+ });
15
+ function normalizeCommandModelName(model) {
16
+ if (typeof model !== "string") return void 0;
17
+ const trimmed = model.trim();
18
+ if (!trimmed || trimmed === "inherit") return void 0;
19
+ if (trimmed === "haiku") return "quick";
20
+ if (trimmed === "sonnet") return "task";
21
+ if (trimmed === "opus") return "main";
22
+ return trimmed;
23
+ }
24
+ function getCharBudget() {
25
+ const raw = Number(process.env.SLASH_COMMAND_TOOL_CHAR_BUDGET);
26
+ return Number.isFinite(raw) && raw > 0 ? raw : 15e3;
27
+ }
28
+ const SlashCommandTool = {
29
+ name: TOOL_NAME_FOR_PROMPT,
30
+ async description(input) {
31
+ const skill = input?.skill;
32
+ return skill ? `Execute skill: ${skill}` : "Execute a skill within the main conversation";
33
+ },
34
+ userFacingName() {
35
+ return "Skill";
36
+ },
37
+ inputSchema,
38
+ isReadOnly() {
39
+ return false;
40
+ },
41
+ isConcurrencySafe() {
42
+ return false;
43
+ },
44
+ async isEnabled() {
45
+ return true;
46
+ },
47
+ needsPermissions() {
48
+ return true;
49
+ },
50
+ async prompt() {
51
+ const all = await loadCustomCommands();
52
+ const commands = all.filter(
53
+ (cmd) => cmd.type === "prompt" && cmd.isSkill !== true && cmd.disableModelInvocation !== true
54
+ );
55
+ const limited = [];
56
+ let used = 0;
57
+ for (const cmd of commands) {
58
+ const name = `/${cmd.name}`;
59
+ const args = cmd.argumentHint ? ` ${cmd.argumentHint}` : "";
60
+ const whenToUse = cmd.whenToUse ? `- ${cmd.whenToUse}` : "";
61
+ const line = `- ${name}${args}: ${cmd.description} ${whenToUse}`.trim();
62
+ used += line.length + 1;
63
+ if (used > getCharBudget()) break;
64
+ limited.push(cmd);
65
+ }
66
+ const availableLines = limited.length > 0 ? limited.map((cmd) => {
67
+ const name = `/${cmd.name}`;
68
+ const args = cmd.argumentHint ? ` ${cmd.argumentHint}` : "";
69
+ const whenToUse = cmd.whenToUse ? `- ${cmd.whenToUse}` : "";
70
+ return `- ${name}${args}: ${cmd.description} ${whenToUse}`.trim();
71
+ }).join("\n") : "";
72
+ const truncatedNotice = commands.length > limited.length ? `
73
+ (Showing ${limited.length} of ${commands.length} commands due to token limits)` : "";
74
+ return `Execute a skill within the main conversation
75
+
76
+ <skills_instructions>
77
+ When users ask you to perform tasks, check if any of the available skills below can help complete the task more effectively. Skills provide specialized capabilities and domain knowledge.
78
+
79
+ When users ask you to run a "slash command" or reference "/<something>" (e.g., "/commit", "/review-pr"), they are referring to a skill. Use this tool to invoke the corresponding skill.
80
+
81
+ <example>
82
+ User: "run /commit"
83
+ Assistant: [Calls Skill tool with skill: "commit"]
84
+ </example>
85
+
86
+ How to invoke:
87
+ - Use this tool with the skill name and optional arguments
88
+ - Examples:
89
+ - \`skill: "pdf"\` - invoke the pdf skill
90
+ - \`skill: "commit", args: "-m 'Fix bug'"\` - invoke with arguments
91
+ - \`skill: "review-pr", args: "123"\` - invoke with arguments
92
+ - \`skill: "ms-office-suite:pdf"\` - invoke using fully qualified name
93
+
94
+ Important:
95
+ - When a skill is relevant, you must invoke this tool IMMEDIATELY as your first action
96
+ - NEVER just announce or mention a skill in your text response without actually calling this tool
97
+ - This is a BLOCKING REQUIREMENT: invoke the relevant Skill tool BEFORE generating any other response about the task
98
+ - Only use skills listed in <available_skills> below
99
+ - Do not invoke a skill that is already running
100
+ - Do not use this tool for built-in CLI commands (like /help, /clear, etc.)
101
+ </skills_instructions>
102
+
103
+ ${availableLines ? `<available_skills>
104
+ ${availableLines}${truncatedNotice}
105
+ </available_skills>
106
+ ` : ""}`;
107
+ },
108
+ renderToolUseMessage({ skill, args }, _options) {
109
+ return args ? `${skill} ${args}` : skill;
110
+ },
111
+ renderToolUseRejectedMessage() {
112
+ return /* @__PURE__ */ React.createElement(FallbackToolUseRejectedMessage, null);
113
+ },
114
+ renderToolResultMessage(output) {
115
+ if (!output) {
116
+ return /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2 }, /* @__PURE__ */ React.createElement(Text, null, "Skill executed"));
117
+ }
118
+ return /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: "green" }, "\u2713 Launching skill: /", output.skillName));
119
+ },
120
+ renderResultForAssistant(output) {
121
+ return `Launching skill: /${output.skillName}`;
122
+ },
123
+ async validateInput({ skill }, context) {
124
+ const parsed = parseSkillName(skill);
125
+ if (!parsed) {
126
+ return {
127
+ result: false,
128
+ message: `Invalid skill name: ${skill}`,
129
+ errorCode: 1
130
+ };
131
+ }
132
+ const commands = context?.options?.commands ?? await getCommands();
133
+ const cmd = findCommand(parsed.skillName, commands);
134
+ if (!cmd) {
135
+ return {
136
+ result: false,
137
+ message: `Unknown skill: ${parsed.skillName}`,
138
+ errorCode: 2
139
+ };
140
+ }
141
+ if (cmd.disableModelInvocation) {
142
+ return {
143
+ result: false,
144
+ message: `Skill ${parsed.skillName} cannot be used with ${TOOL_NAME_FOR_PROMPT} tool due to disable-model-invocation`,
145
+ errorCode: 4
146
+ };
147
+ }
148
+ if (cmd.disableNonInteractive) {
149
+ return {
150
+ result: false,
151
+ message: `Skill ${parsed.skillName} cannot be used with ${TOOL_NAME_FOR_PROMPT} tool because it is non-interactive`,
152
+ errorCode: 6
153
+ };
154
+ }
155
+ if (cmd.type !== "prompt") {
156
+ return {
157
+ result: false,
158
+ message: `Skill ${parsed.skillName} is not a prompt-based command`,
159
+ errorCode: 5
160
+ };
161
+ }
162
+ return { result: true };
163
+ },
164
+ async *call({ skill, args }, context) {
165
+ const parsed = parseSkillName(skill);
166
+ if (!parsed) {
167
+ throw new Error(`Invalid skill name: ${skill}`);
168
+ }
169
+ const commands = context.options?.commands ?? await getCommands();
170
+ const cmd = findCommand(parsed.skillName, commands);
171
+ if (!cmd) {
172
+ throw new Error(`Unknown skill: ${parsed.skillName}`);
173
+ }
174
+ if (cmd.disableModelInvocation) {
175
+ throw new Error(
176
+ `Skill ${parsed.skillName} cannot be used with ${TOOL_NAME_FOR_PROMPT} tool due to disable-model-invocation`
177
+ );
178
+ }
179
+ if (cmd.disableNonInteractive) {
180
+ throw new Error(
181
+ `Skill ${parsed.skillName} cannot be used with ${TOOL_NAME_FOR_PROMPT} tool because it is non-interactive`
182
+ );
183
+ }
184
+ if (cmd.type !== "prompt") {
185
+ throw new Error(
186
+ `Unexpected ${cmd.type} command. Expected 'prompt' command. Use /${parsed.skillName} directly in the main conversation.`
187
+ );
188
+ }
189
+ const combinedArgs = args || "";
190
+ const prompt = await cmd.getPromptForCommand(combinedArgs);
191
+ const expandedMessages = prompt.map((msg) => {
192
+ const userMessage = createUserMessage(
193
+ typeof msg.content === "string" ? msg.content : msg.content.map((block) => block.type === "text" ? block.text : "").join("\n")
194
+ );
195
+ userMessage.options = {
196
+ ...userMessage.options,
197
+ isCustomCommand: true,
198
+ commandName: cmd.userFacingName(),
199
+ commandArgs: combinedArgs
200
+ };
201
+ return userMessage;
202
+ });
203
+ const commandNameForMeta = cmd.userFacingName();
204
+ const progressMessage = cmd.progressMessage || "running";
205
+ const metaMessage = createUserMessage(`<command-name>${commandNameForMeta}</command-name>
206
+ <command-message>${commandNameForMeta} is ${progressMessage}\u2026</command-message>
207
+ <command-args>${combinedArgs}</command-args>`);
208
+ const allowedTools = Array.isArray(cmd.allowedTools) ? cmd.allowedTools : [];
209
+ const model = normalizeCommandModelName(cmd.model);
210
+ const maxThinkingTokens = typeof cmd.maxThinkingTokens === "number" ? cmd.maxThinkingTokens : void 0;
211
+ const output = { success: true, skillName: parsed.skillName };
212
+ yield {
213
+ type: "result",
214
+ data: output,
215
+ resultForAssistant: this.renderResultForAssistant(output),
216
+ newMessages: [metaMessage, ...expandedMessages],
217
+ contextModifier: allowedTools.length > 0 || model || maxThinkingTokens !== void 0 ? {
218
+ modifyContext(ctx) {
219
+ const next = { ...ctx };
220
+ if (allowedTools.length > 0) {
221
+ const prev = Array.isArray(
222
+ next.options?.commandAllowedTools
223
+ ) ? next.options.commandAllowedTools : [];
224
+ next.options = {
225
+ ...next.options || {},
226
+ commandAllowedTools: [
227
+ .../* @__PURE__ */ new Set([...prev, ...allowedTools])
228
+ ]
229
+ };
230
+ }
231
+ if (model) {
232
+ next.options = { ...next.options || {}, model };
233
+ }
234
+ if (maxThinkingTokens !== void 0) {
235
+ next.options = {
236
+ ...next.options || {},
237
+ maxThinkingTokens
238
+ };
239
+ }
240
+ return next;
241
+ }
242
+ } : void 0
243
+ };
244
+ }
245
+ };
246
+ function parseSkillName(skill) {
247
+ const trimmed = skill.trim();
248
+ const withoutSlash = trimmed.startsWith("/") ? trimmed.slice(1) : trimmed;
249
+ if (!withoutSlash) return null;
250
+ return { skillName: withoutSlash };
251
+ }
252
+ function findCommand(skillName, commands) {
253
+ return commands.find(
254
+ (c) => c?.name === skillName || c?.userFacingName?.() === skillName || Array.isArray(c?.aliases) && c.aliases.includes(skillName)
255
+ ) ?? null;
256
+ }
257
+ export {
258
+ SlashCommandTool
259
+ };
260
+ //# sourceMappingURL=SlashCommandTool.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/tools/SlashCommandTool/SlashCommandTool.tsx"],
4
+ "sourcesContent": ["/**\n * Slash Command Tool\n *\n * Executes custom slash commands (skills) within the main conversation.\n * Compatible with Claude Code CLI Skill tool specification.\n */\n\nimport { z } from 'zod'\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport { Tool } from '@tool'\nimport * as React from 'react'\nimport type { Message } from '@query'\nimport { createUserMessage } from '@utils/messages'\nimport { getCommands } from '@commands'\nimport {\n loadCustomCommands,\n type CustomCommandWithScope,\n} from '@services/customCommands'\nimport { TOOL_NAME_FOR_PROMPT } from './prompt'\nimport { Box, Text } from 'ink'\n\nconst inputSchema = z.strictObject({\n skill: z\n .string()\n .describe('The skill name. E.g., \"commit\", \"review-pr\", or \"pdf\"'),\n args: z.string().optional().describe('Optional arguments for the skill'),\n})\n\ntype Input = z.infer<typeof inputSchema>\ntype Output = {\n success: boolean\n skillName: string\n}\n\nfunction normalizeCommandModelName(model: unknown): string | undefined {\n if (typeof model !== 'string') return undefined\n const trimmed = model.trim()\n if (!trimmed || trimmed === 'inherit') return undefined\n if (trimmed === 'haiku') return 'quick'\n if (trimmed === 'sonnet') return 'task'\n if (trimmed === 'opus') return 'main'\n return trimmed\n}\n\nfunction getCharBudget(): number {\n const raw = Number(process.env.SLASH_COMMAND_TOOL_CHAR_BUDGET)\n return Number.isFinite(raw) && raw > 0 ? raw : 15000\n}\n\nexport const SlashCommandTool = {\n name: TOOL_NAME_FOR_PROMPT,\n async description(input?: Input) {\n const skill = input?.skill\n return skill\n ? `Execute skill: ${skill}`\n : 'Execute a skill within the main conversation'\n },\n userFacingName() {\n return 'Skill'\n },\n inputSchema,\n isReadOnly() {\n return false\n },\n isConcurrencySafe() {\n return false\n },\n async isEnabled() {\n return true\n },\n needsPermissions() {\n return true\n },\n async prompt() {\n const all = await loadCustomCommands()\n const commands = all.filter(\n cmd =>\n cmd.type === 'prompt' &&\n (cmd as any).isSkill !== true &&\n (cmd as any).disableModelInvocation !== true,\n )\n\n const limited: CustomCommandWithScope[] = []\n let used = 0\n for (const cmd of commands) {\n const name = `/${cmd.name}`\n const args = (cmd as any).argumentHint\n ? ` ${(cmd as any).argumentHint}`\n : ''\n const whenToUse = (cmd as any).whenToUse\n ? `- ${(cmd as any).whenToUse}`\n : ''\n const line = `- ${name}${args}: ${cmd.description} ${whenToUse}`.trim()\n used += line.length + 1\n if (used > getCharBudget()) break\n limited.push(cmd)\n }\n\n const availableLines =\n limited.length > 0\n ? limited\n .map(cmd => {\n const name = `/${cmd.name}`\n const args = (cmd as any).argumentHint\n ? ` ${(cmd as any).argumentHint}`\n : ''\n const whenToUse = (cmd as any).whenToUse\n ? `- ${(cmd as any).whenToUse}`\n : ''\n return `- ${name}${args}: ${cmd.description} ${whenToUse}`.trim()\n })\n .join('\\n')\n : ''\n\n const truncatedNotice =\n commands.length > limited.length\n ? `\\n(Showing ${limited.length} of ${commands.length} commands due to token limits)`\n : ''\n\n return `Execute a skill within the main conversation\n\n<skills_instructions>\nWhen users ask you to perform tasks, check if any of the available skills below can help complete the task more effectively. Skills provide specialized capabilities and domain knowledge.\n\nWhen users ask you to run a \"slash command\" or reference \"/<something>\" (e.g., \"/commit\", \"/review-pr\"), they are referring to a skill. Use this tool to invoke the corresponding skill.\n\n<example>\nUser: \"run /commit\"\nAssistant: [Calls Skill tool with skill: \"commit\"]\n</example>\n\nHow to invoke:\n- Use this tool with the skill name and optional arguments\n- Examples:\n - \\`skill: \"pdf\"\\` - invoke the pdf skill\n - \\`skill: \"commit\", args: \"-m 'Fix bug'\"\\` - invoke with arguments\n - \\`skill: \"review-pr\", args: \"123\"\\` - invoke with arguments\n - \\`skill: \"ms-office-suite:pdf\"\\` - invoke using fully qualified name\n\nImportant:\n- When a skill is relevant, you must invoke this tool IMMEDIATELY as your first action\n- NEVER just announce or mention a skill in your text response without actually calling this tool\n- This is a BLOCKING REQUIREMENT: invoke the relevant Skill tool BEFORE generating any other response about the task\n- Only use skills listed in <available_skills> below\n- Do not invoke a skill that is already running\n- Do not use this tool for built-in CLI commands (like /help, /clear, etc.)\n</skills_instructions>\n\n${\n availableLines\n ? `<available_skills>\n${availableLines}${truncatedNotice}\n</available_skills>\n`\n : ''\n}`\n },\n renderToolUseMessage({ skill, args }: Input, _options: { verbose: boolean }) {\n return args ? `${skill} ${args}` : skill\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(output: Output) {\n if (!output) {\n return (\n <Box paddingLeft={2}>\n <Text>Skill executed</Text>\n </Box>\n )\n }\n\n return (\n <Box paddingLeft={2}>\n <Text color=\"green\">\u2713 Launching skill: /{output.skillName}</Text>\n </Box>\n )\n },\n renderResultForAssistant(output: Output) {\n return `Launching skill: /${output.skillName}`\n },\n async validateInput({ skill }: Input, context) {\n const parsed = parseSkillName(skill)\n if (!parsed) {\n return {\n result: false,\n message: `Invalid skill name: ${skill}`,\n errorCode: 1,\n }\n }\n\n const commands = context?.options?.commands ?? (await getCommands())\n const cmd = findCommand(parsed.skillName, commands)\n\n if (!cmd) {\n return {\n result: false,\n message: `Unknown skill: ${parsed.skillName}`,\n errorCode: 2,\n }\n }\n\n if ((cmd as any).disableModelInvocation) {\n return {\n result: false,\n message: `Skill ${parsed.skillName} cannot be used with ${TOOL_NAME_FOR_PROMPT} tool due to disable-model-invocation`,\n errorCode: 4,\n }\n }\n\n if ((cmd as any).disableNonInteractive) {\n return {\n result: false,\n message: `Skill ${parsed.skillName} cannot be used with ${TOOL_NAME_FOR_PROMPT} tool because it is non-interactive`,\n errorCode: 6,\n }\n }\n\n if (cmd.type !== 'prompt') {\n return {\n result: false,\n message: `Skill ${parsed.skillName} is not a prompt-based command`,\n errorCode: 5,\n }\n }\n\n return { result: true }\n },\n async *call({ skill, args }: Input, context) {\n const parsed = parseSkillName(skill)\n if (!parsed) {\n throw new Error(`Invalid skill name: ${skill}`)\n }\n\n const commands = context.options?.commands ?? (await getCommands())\n const cmd = findCommand(parsed.skillName, commands)\n\n if (!cmd) {\n throw new Error(`Unknown skill: ${parsed.skillName}`)\n }\n\n if ((cmd as any).disableModelInvocation) {\n throw new Error(\n `Skill ${parsed.skillName} cannot be used with ${TOOL_NAME_FOR_PROMPT} tool due to disable-model-invocation`,\n )\n }\n\n if ((cmd as any).disableNonInteractive) {\n throw new Error(\n `Skill ${parsed.skillName} cannot be used with ${TOOL_NAME_FOR_PROMPT} tool because it is non-interactive`,\n )\n }\n\n if (cmd.type !== 'prompt') {\n throw new Error(\n `Unexpected ${cmd.type} command. Expected 'prompt' command. Use /${parsed.skillName} directly in the main conversation.`,\n )\n }\n\n const combinedArgs = args || ''\n const prompt = await cmd.getPromptForCommand(combinedArgs)\n const expandedMessages: Message[] = prompt.map(msg => {\n const userMessage = createUserMessage(\n typeof msg.content === 'string'\n ? msg.content\n : (msg.content as any[])\n .map(block => (block.type === 'text' ? block.text : ''))\n .join('\\n'),\n )\n userMessage.options = {\n ...userMessage.options,\n isCustomCommand: true,\n commandName: cmd.userFacingName(),\n commandArgs: combinedArgs,\n }\n return userMessage\n })\n\n const commandNameForMeta = cmd.userFacingName()\n const progressMessage = (cmd as any).progressMessage || 'running'\n const metaMessage =\n createUserMessage(`<command-name>${commandNameForMeta}</command-name>\n<command-message>${commandNameForMeta} is ${progressMessage}\u2026</command-message>\n<command-args>${combinedArgs}</command-args>`)\n\n const allowedTools: string[] = Array.isArray((cmd as any).allowedTools)\n ? (cmd as any).allowedTools\n : []\n const model = normalizeCommandModelName((cmd as any).model)\n const maxThinkingTokens: number | undefined =\n typeof (cmd as any).maxThinkingTokens === 'number'\n ? (cmd as any).maxThinkingTokens\n : undefined\n\n const output: Output = { success: true, skillName: parsed.skillName }\n\n yield {\n type: 'result' as const,\n data: output,\n resultForAssistant: this.renderResultForAssistant(output),\n newMessages: [metaMessage, ...expandedMessages],\n contextModifier:\n allowedTools.length > 0 || model || maxThinkingTokens !== undefined\n ? {\n modifyContext(ctx: any) {\n const next = { ...ctx }\n\n if (allowedTools.length > 0) {\n const prev = Array.isArray(\n (next.options as any)?.commandAllowedTools,\n )\n ? ((next.options as any).commandAllowedTools as string[])\n : []\n next.options = {\n ...(next.options || {}),\n commandAllowedTools: [\n ...new Set([...prev, ...allowedTools]),\n ],\n }\n }\n\n if (model) {\n next.options = { ...(next.options || {}), model }\n }\n\n if (maxThinkingTokens !== undefined) {\n next.options = {\n ...(next.options || {}),\n maxThinkingTokens,\n }\n }\n\n return next\n },\n }\n : undefined,\n }\n },\n} satisfies Tool<typeof inputSchema, Output>\n\nfunction parseSkillName(skill: string): { skillName: string } | null {\n const trimmed = skill.trim()\n // Remove leading slash if present\n const withoutSlash = trimmed.startsWith('/') ? trimmed.slice(1) : trimmed\n if (!withoutSlash) return null\n return { skillName: withoutSlash }\n}\n\nfunction findCommand(skillName: string, commands: any[]): any | null {\n return (\n commands.find(\n (c: any) =>\n c?.name === skillName ||\n c?.userFacingName?.() === skillName ||\n (Array.isArray(c?.aliases) && c.aliases.includes(skillName)),\n ) ?? null\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,35 @@
1
+ const TOOL_NAME_FOR_PROMPT = "Skill";
2
+ const DESCRIPTION = `Execute a skill within the main conversation
3
+
4
+ <skills_instructions>
5
+ When users ask you to perform tasks, check if any of the available skills below can help complete the task more effectively. Skills provide specialized capabilities and domain knowledge.
6
+
7
+ When users ask you to run a "slash command" or reference "/<something>" (e.g., "/commit", "/review-pr"), they are referring to a skill. Use this tool to invoke the corresponding skill.
8
+
9
+ <example>
10
+ User: "run /commit"
11
+ Assistant: [Calls Skill tool with skill: "commit"]
12
+ </example>
13
+
14
+ How to invoke:
15
+ - Use this tool with the skill name and optional arguments
16
+ - Examples:
17
+ - \`skill: "pdf"\` - invoke the pdf skill
18
+ - \`skill: "commit", args: "-m 'Fix bug'"\` - invoke with arguments
19
+ - \`skill: "review-pr", args: "123"\` - invoke with arguments
20
+ - \`skill: "ms-office-suite:pdf"\` - invoke using fully qualified name
21
+
22
+ Important:
23
+ - When a skill is relevant, you must invoke this tool IMMEDIATELY as your first action
24
+ - NEVER just announce or mention a skill in your text response without actually calling this tool
25
+ - This is a BLOCKING REQUIREMENT: invoke the relevant Skill tool BEFORE generating any other response about the task
26
+ - Only use skills listed in <available_skills> below
27
+ - Do not invoke a skill that is already running
28
+ - Do not use this tool for built-in CLI commands (like /help, /clear, etc.)
29
+ </skills_instructions>
30
+ `;
31
+ export {
32
+ DESCRIPTION,
33
+ TOOL_NAME_FOR_PROMPT
34
+ };
35
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/tools/SlashCommandTool/prompt.ts"],
4
+ "sourcesContent": ["export const TOOL_NAME_FOR_PROMPT = 'Skill'\nexport const DESCRIPTION = `Execute a skill within the main conversation\n\n<skills_instructions>\nWhen users ask you to perform tasks, check if any of the available skills below can help complete the task more effectively. Skills provide specialized capabilities and domain knowledge.\n\nWhen users ask you to run a \"slash command\" or reference \"/<something>\" (e.g., \"/commit\", \"/review-pr\"), they are referring to a skill. Use this tool to invoke the corresponding skill.\n\n<example>\nUser: \"run /commit\"\nAssistant: [Calls Skill tool with skill: \"commit\"]\n</example>\n\nHow to invoke:\n- Use this tool with the skill name and optional arguments\n- Examples:\n - \\`skill: \"pdf\"\\` - invoke the pdf skill\n - \\`skill: \"commit\", args: \"-m 'Fix bug'\"\\` - invoke with arguments\n - \\`skill: \"review-pr\", args: \"123\"\\` - invoke with arguments\n - \\`skill: \"ms-office-suite:pdf\"\\` - invoke using fully qualified name\n\nImportant:\n- When a skill is relevant, you must invoke this tool IMMEDIATELY as your first action\n- NEVER just announce or mention a skill in your text response without actually calling this tool\n- This is a BLOCKING REQUIREMENT: invoke the relevant Skill tool BEFORE generating any other response about the task\n- Only use skills listed in <available_skills> below\n- Do not invoke a skill that is already running\n- Do not use this tool for built-in CLI commands (like /help, /clear, etc.)\n</skills_instructions>\n`\n"],
5
+ "mappings": "AAAO,MAAM,uBAAuB;AAC7B,MAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
6
+ "names": []
7
+ }