@within-7/minto 0.1.7 → 0.3.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 (601) 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 +73 -49
  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 +85 -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 +157 -0
  22. package/dist/commands/export.js.map +7 -0
  23. package/dist/commands/mcp-interactive.js +28 -18
  24. package/dist/commands/mcp-interactive.js.map +2 -2
  25. package/dist/commands/model.js +9 -7
  26. package/dist/commands/model.js.map +2 -2
  27. package/dist/commands/permissions.js +87 -0
  28. package/dist/commands/permissions.js.map +7 -0
  29. package/dist/commands/plugin/AddMarketplaceForm.js +3 -2
  30. package/dist/commands/plugin/AddMarketplaceForm.js.map +2 -2
  31. package/dist/commands/plugin/ConfirmDialog.js +2 -1
  32. package/dist/commands/plugin/ConfirmDialog.js.map +2 -2
  33. package/dist/commands/plugin/ErrorView.js +2 -1
  34. package/dist/commands/plugin/ErrorView.js.map +2 -2
  35. package/dist/commands/plugin/InstalledPluginsByMarketplace.js +5 -4
  36. package/dist/commands/plugin/InstalledPluginsByMarketplace.js.map +2 -2
  37. package/dist/commands/plugin/InstalledPluginsManager.js +5 -4
  38. package/dist/commands/plugin/InstalledPluginsManager.js.map +2 -2
  39. package/dist/commands/plugin/MainMenu.js +2 -1
  40. package/dist/commands/plugin/MainMenu.js.map +2 -2
  41. package/dist/commands/plugin/MarketplaceManager.js +5 -4
  42. package/dist/commands/plugin/MarketplaceManager.js.map +2 -2
  43. package/dist/commands/plugin/MarketplaceSelector.js +4 -3
  44. package/dist/commands/plugin/MarketplaceSelector.js.map +2 -2
  45. package/dist/commands/plugin/PlaceholderScreen.js +3 -2
  46. package/dist/commands/plugin/PlaceholderScreen.js.map +2 -2
  47. package/dist/commands/plugin/PluginBrowser.js +6 -5
  48. package/dist/commands/plugin/PluginBrowser.js.map +2 -2
  49. package/dist/commands/plugin/PluginDetailsInstall.js +5 -4
  50. package/dist/commands/plugin/PluginDetailsInstall.js.map +2 -2
  51. package/dist/commands/plugin/PluginDetailsManage.js +4 -3
  52. package/dist/commands/plugin/PluginDetailsManage.js.map +2 -2
  53. package/dist/commands/plugin.js +16 -15
  54. package/dist/commands/plugin.js.map +2 -2
  55. package/dist/commands/quit.js +3 -1
  56. package/dist/commands/quit.js.map +2 -2
  57. package/dist/commands/sandbox.js +105 -0
  58. package/dist/commands/sandbox.js.map +7 -0
  59. package/dist/commands/setup.js +2 -1
  60. package/dist/commands/setup.js.map +2 -2
  61. package/dist/commands/status.js +59 -0
  62. package/dist/commands/status.js.map +7 -0
  63. package/dist/commands/tasks.js +108 -0
  64. package/dist/commands/tasks.js.map +7 -0
  65. package/dist/commands/todos.js +123 -0
  66. package/dist/commands/todos.js.map +7 -0
  67. package/dist/commands/undo.js +245 -0
  68. package/dist/commands/undo.js.map +7 -0
  69. package/dist/commands.js +22 -2
  70. package/dist/commands.js.map +2 -2
  71. package/dist/components/AgentThinkingBlock.js +10 -18
  72. package/dist/components/AgentThinkingBlock.js.map +2 -2
  73. package/dist/components/AsciiLogo.js +7 -8
  74. package/dist/components/AsciiLogo.js.map +2 -2
  75. package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js +3 -2
  76. package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js.map +2 -2
  77. package/dist/components/AskUserQuestionDialog/QuestionView.js +2 -1
  78. package/dist/components/AskUserQuestionDialog/QuestionView.js.map +2 -2
  79. package/dist/components/BackgroundTasksPanel.js +78 -29
  80. package/dist/components/BackgroundTasksPanel.js.map +2 -2
  81. package/dist/components/BashStreamingProgress.js +24 -0
  82. package/dist/components/BashStreamingProgress.js.map +7 -0
  83. package/dist/components/CollapsibleHint.js +15 -0
  84. package/dist/components/CollapsibleHint.js.map +7 -0
  85. package/dist/components/Config.js +3 -2
  86. package/dist/components/Config.js.map +2 -2
  87. package/dist/components/ConsoleOAuthFlow.js +2 -1
  88. package/dist/components/ConsoleOAuthFlow.js.map +2 -2
  89. package/dist/components/Cost.js +2 -1
  90. package/dist/components/Cost.js.map +2 -2
  91. package/dist/components/FileEditToolUpdatedMessage.js +1 -1
  92. package/dist/components/FileEditToolUpdatedMessage.js.map +2 -2
  93. package/dist/components/HeaderBar.js +13 -8
  94. package/dist/components/HeaderBar.js.map +2 -2
  95. package/dist/components/HistorySearchOverlay.js +4 -3
  96. package/dist/components/HistorySearchOverlay.js.map +2 -2
  97. package/dist/components/HotkeyHelpPanel.js +134 -0
  98. package/dist/components/HotkeyHelpPanel.js.map +7 -0
  99. package/dist/components/InvalidConfigDialog.js +2 -1
  100. package/dist/components/InvalidConfigDialog.js.map +2 -2
  101. package/dist/components/Logo.js +24 -68
  102. package/dist/components/Logo.js.map +2 -2
  103. package/dist/components/MCPServerApprovalDialog.js +2 -1
  104. package/dist/components/MCPServerApprovalDialog.js.map +2 -2
  105. package/dist/components/MCPServerDialogCopy.js +2 -1
  106. package/dist/components/MCPServerDialogCopy.js.map +2 -2
  107. package/dist/components/MCPServerMultiselectDialog.js +2 -1
  108. package/dist/components/MCPServerMultiselectDialog.js.map +2 -2
  109. package/dist/components/Message.js +23 -7
  110. package/dist/components/Message.js.map +3 -3
  111. package/dist/components/MessageSelector.js +4 -3
  112. package/dist/components/MessageSelector.js.map +2 -2
  113. package/dist/components/ModeIndicator.js +2 -1
  114. package/dist/components/ModeIndicator.js.map +2 -2
  115. package/dist/components/ModelConfig.js +20 -6
  116. package/dist/components/ModelConfig.js.map +2 -2
  117. package/dist/components/ModelListManager.js +7 -6
  118. package/dist/components/ModelListManager.js.map +2 -2
  119. package/dist/components/ModelSelector/ModelSelector.js +27 -14
  120. package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
  121. package/dist/components/Onboarding.js +22 -16
  122. package/dist/components/Onboarding.js.map +2 -2
  123. package/dist/components/OperationSummary.js +130 -0
  124. package/dist/components/OperationSummary.js.map +7 -0
  125. package/dist/components/ProgressBar.js +74 -0
  126. package/dist/components/ProgressBar.js.map +7 -0
  127. package/dist/components/PromptInput.js +210 -87
  128. package/dist/components/PromptInput.js.map +2 -2
  129. package/dist/components/RequestStatusIndicator.js +194 -0
  130. package/dist/components/RequestStatusIndicator.js.map +7 -0
  131. package/dist/components/SensitiveFileWarning.js +31 -0
  132. package/dist/components/SensitiveFileWarning.js.map +7 -0
  133. package/dist/components/Spinner.js +141 -27
  134. package/dist/components/Spinner.js.map +2 -2
  135. package/dist/components/SpinnerSymbol.js +21 -27
  136. package/dist/components/SpinnerSymbol.js.map +2 -2
  137. package/dist/components/StreamingBashOutput.js +9 -8
  138. package/dist/components/StreamingBashOutput.js.map +2 -2
  139. package/dist/components/StructuredDiff.js +6 -8
  140. package/dist/components/StructuredDiff.js.map +2 -2
  141. package/dist/components/SubagentBlock.js +5 -3
  142. package/dist/components/SubagentBlock.js.map +2 -2
  143. package/dist/components/SubagentProgress.js +17 -15
  144. package/dist/components/SubagentProgress.js.map +2 -2
  145. package/dist/components/TaskCard.js +30 -24
  146. package/dist/components/TaskCard.js.map +2 -2
  147. package/dist/components/TextInput.js +9 -1
  148. package/dist/components/TextInput.js.map +2 -2
  149. package/dist/components/TodoChangeBlock.js +1 -1
  150. package/dist/components/TodoChangeBlock.js.map +2 -2
  151. package/dist/components/TodoPanel.js +140 -31
  152. package/dist/components/TodoPanel.js.map +3 -3
  153. package/dist/components/TokenCounter.js +74 -0
  154. package/dist/components/TokenCounter.js.map +7 -0
  155. package/dist/components/TokenWarning.js +2 -1
  156. package/dist/components/TokenWarning.js.map +2 -2
  157. package/dist/components/ToolUseLoader.js +2 -2
  158. package/dist/components/ToolUseLoader.js.map +2 -2
  159. package/dist/components/TreeConnector.js +26 -0
  160. package/dist/components/TreeConnector.js.map +7 -0
  161. package/dist/components/TrustDialog.js +2 -1
  162. package/dist/components/TrustDialog.js.map +2 -2
  163. package/dist/components/TurnCompletionIndicator.js +18 -0
  164. package/dist/components/TurnCompletionIndicator.js.map +7 -0
  165. package/dist/components/binary-feedback/BinaryFeedbackView.js +2 -1
  166. package/dist/components/binary-feedback/BinaryFeedbackView.js.map +2 -2
  167. package/dist/components/messages/AssistantTextMessage.js +20 -9
  168. package/dist/components/messages/AssistantTextMessage.js.map +2 -2
  169. package/dist/components/messages/AssistantThinkingMessage.js +18 -3
  170. package/dist/components/messages/AssistantThinkingMessage.js.map +2 -2
  171. package/dist/components/messages/AssistantToolUseMessage.js +17 -10
  172. package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
  173. package/dist/components/messages/GroupRenderer.js +54 -0
  174. package/dist/components/messages/GroupRenderer.js.map +7 -0
  175. package/dist/components/messages/NestedTasksPreview.js +24 -0
  176. package/dist/components/messages/NestedTasksPreview.js.map +7 -0
  177. package/dist/components/messages/ParallelTasksGroupView.js +93 -0
  178. package/dist/components/messages/ParallelTasksGroupView.js.map +7 -0
  179. package/dist/components/messages/TaskInModuleView.js +218 -0
  180. package/dist/components/messages/TaskInModuleView.js.map +7 -0
  181. package/dist/components/messages/TaskOutputContent.js +56 -0
  182. package/dist/components/messages/TaskOutputContent.js.map +7 -0
  183. package/dist/components/messages/UserPromptMessage.js +2 -2
  184. package/dist/components/messages/UserPromptMessage.js.map +2 -2
  185. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +2 -3
  186. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +2 -2
  187. package/dist/components/permissions/FallbackPermissionRequest.js +4 -4
  188. package/dist/components/permissions/FallbackPermissionRequest.js.map +2 -2
  189. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +4 -4
  190. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js.map +2 -2
  191. package/dist/constants/colors.js +120 -54
  192. package/dist/constants/colors.js.map +2 -2
  193. package/dist/constants/formatRules.js +102 -0
  194. package/dist/constants/formatRules.js.map +7 -0
  195. package/dist/constants/prompts.js +12 -34
  196. package/dist/constants/prompts.js.map +2 -2
  197. package/dist/constants/symbols.js +64 -6
  198. package/dist/constants/symbols.js.map +2 -2
  199. package/dist/constants/timing.js +5 -0
  200. package/dist/constants/timing.js.map +2 -2
  201. package/dist/constants/toolInputExamples.js +84 -0
  202. package/dist/constants/toolInputExamples.js.map +7 -0
  203. package/dist/core/backupManager.js +321 -0
  204. package/dist/core/backupManager.js.map +7 -0
  205. package/dist/core/config/defaults.js +84 -0
  206. package/dist/core/config/defaults.js.map +7 -0
  207. package/dist/core/config/index.js +111 -0
  208. package/dist/core/config/index.js.map +7 -0
  209. package/dist/core/config/loader.js +221 -0
  210. package/dist/core/config/loader.js.map +7 -0
  211. package/dist/core/config/migrations.js +128 -0
  212. package/dist/core/config/migrations.js.map +7 -0
  213. package/dist/core/config/schema.js +178 -0
  214. package/dist/core/config/schema.js.map +7 -0
  215. package/dist/core/costTracker.js +129 -0
  216. package/dist/core/costTracker.js.map +7 -0
  217. package/dist/core/gitAutoCommit.js +287 -0
  218. package/dist/core/gitAutoCommit.js.map +7 -0
  219. package/dist/core/index.js +8 -0
  220. package/dist/core/index.js.map +7 -0
  221. package/dist/core/operationTracker.js +212 -0
  222. package/dist/core/operationTracker.js.map +7 -0
  223. package/dist/core/permissions/auditLog.js +204 -0
  224. package/dist/core/permissions/auditLog.js.map +7 -0
  225. package/dist/core/permissions/engine/index.js +3 -0
  226. package/dist/core/permissions/engine/index.js.map +7 -0
  227. package/dist/core/permissions/engine/permissionEngine.js +106 -0
  228. package/dist/core/permissions/engine/permissionEngine.js.map +7 -0
  229. package/dist/core/permissions/engine/types.js +1 -0
  230. package/dist/core/permissions/engine/types.js.map +7 -0
  231. package/dist/core/permissions/index.js +84 -0
  232. package/dist/core/permissions/index.js.map +7 -0
  233. package/dist/core/permissions/ruleEngine.js +259 -0
  234. package/dist/core/permissions/ruleEngine.js.map +7 -0
  235. package/dist/core/permissions/rules/allowedToolsRule.js +62 -0
  236. package/dist/core/permissions/rules/allowedToolsRule.js.map +7 -0
  237. package/dist/core/permissions/rules/autoEscalationRule.js +296 -0
  238. package/dist/core/permissions/rules/autoEscalationRule.js.map +7 -0
  239. package/dist/core/permissions/rules/index.js +46 -0
  240. package/dist/core/permissions/rules/index.js.map +7 -0
  241. package/dist/core/permissions/rules/planModeRule.js +55 -0
  242. package/dist/core/permissions/rules/planModeRule.js.map +7 -0
  243. package/dist/core/permissions/rules/projectBoundaryRule.js +173 -0
  244. package/dist/core/permissions/rules/projectBoundaryRule.js.map +7 -0
  245. package/dist/core/permissions/rules/safeModeRule.js +65 -0
  246. package/dist/core/permissions/rules/safeModeRule.js.map +7 -0
  247. package/dist/core/permissions/rules/sensitivePathsRule.js +345 -0
  248. package/dist/core/permissions/rules/sensitivePathsRule.js.map +7 -0
  249. package/dist/core/permissions/types.js +127 -0
  250. package/dist/core/permissions/types.js.map +7 -0
  251. package/dist/core/tokenStats.js +9 -0
  252. package/dist/core/tokenStats.js.map +7 -0
  253. package/dist/core/tokenStatsManager.js +331 -0
  254. package/dist/core/tokenStatsManager.js.map +7 -0
  255. package/dist/core/tools/executor.js +143 -0
  256. package/dist/core/tools/executor.js.map +7 -0
  257. package/dist/core/tools/index.js +15 -0
  258. package/dist/core/tools/index.js.map +7 -0
  259. package/dist/core/tools/registry.js +183 -0
  260. package/dist/core/tools/registry.js.map +7 -0
  261. package/dist/core/tools/types.js +1 -0
  262. package/dist/core/tools/types.js.map +7 -0
  263. package/dist/cost-tracker.js +23 -15
  264. package/dist/cost-tracker.js.map +2 -2
  265. package/dist/entrypoints/cli.js +158 -130
  266. package/dist/entrypoints/cli.js.map +2 -2
  267. package/dist/entrypoints/mcp.js +12 -4
  268. package/dist/entrypoints/mcp.js.map +2 -2
  269. package/dist/history.js +14 -3
  270. package/dist/history.js.map +2 -2
  271. package/dist/hooks/useAgentTokenStats.js +72 -0
  272. package/dist/hooks/useAgentTokenStats.js.map +7 -0
  273. package/dist/hooks/useAgentTranscripts.js +140 -0
  274. package/dist/hooks/useAgentTranscripts.js.map +7 -0
  275. package/dist/hooks/useAnimationSync.js +53 -0
  276. package/dist/hooks/useAnimationSync.js.map +7 -0
  277. package/dist/hooks/useArrowKeyHistory.js +4 -2
  278. package/dist/hooks/useArrowKeyHistory.js.map +2 -2
  279. package/dist/hooks/useCanUseTool.js +3 -1
  280. package/dist/hooks/useCanUseTool.js.map +2 -2
  281. package/dist/hooks/useExitOnCtrlCD.js +9 -5
  282. package/dist/hooks/useExitOnCtrlCD.js.map +2 -2
  283. package/dist/hooks/useHookStatus.js +40 -0
  284. package/dist/hooks/useHookStatus.js.map +7 -0
  285. package/dist/hooks/useLogMessages.js +29 -2
  286. package/dist/hooks/useLogMessages.js.map +2 -2
  287. package/dist/hooks/useMessageGroups.js +43 -0
  288. package/dist/hooks/useMessageGroups.js.map +7 -0
  289. package/dist/hooks/useTerminalSize.js +62 -6
  290. package/dist/hooks/useTerminalSize.js.map +2 -2
  291. package/dist/hooks/useUnifiedCompletion.js +69 -0
  292. package/dist/hooks/useUnifiedCompletion.js.map +2 -2
  293. package/dist/i18n/index.js +109 -0
  294. package/dist/i18n/index.js.map +7 -0
  295. package/dist/i18n/locales/en.js +348 -0
  296. package/dist/i18n/locales/en.js.map +7 -0
  297. package/dist/i18n/locales/index.js +7 -0
  298. package/dist/i18n/locales/index.js.map +7 -0
  299. package/dist/i18n/locales/zh-CN.js +348 -0
  300. package/dist/i18n/locales/zh-CN.js.map +7 -0
  301. package/dist/i18n/types.js +8 -0
  302. package/dist/i18n/types.js.map +7 -0
  303. package/dist/permissions.js +28 -1
  304. package/dist/permissions.js.map +2 -2
  305. package/dist/query.js +253 -21
  306. package/dist/query.js.map +3 -3
  307. package/dist/screens/REPL.js +523 -194
  308. package/dist/screens/REPL.js.map +3 -3
  309. package/dist/services/adapters/chatCompletions.js +3 -1
  310. package/dist/services/adapters/chatCompletions.js.map +2 -2
  311. package/dist/services/adapters/messageNormalizer.js +354 -0
  312. package/dist/services/adapters/messageNormalizer.js.map +7 -0
  313. package/dist/services/adapters/responsesAPI.js +6 -3
  314. package/dist/services/adapters/responsesAPI.js.map +2 -2
  315. package/dist/services/checkpointManager.js +386 -0
  316. package/dist/services/checkpointManager.js.map +7 -0
  317. package/dist/services/claude.js +192 -14
  318. package/dist/services/claude.js.map +3 -3
  319. package/dist/services/compressionService.js +50 -1
  320. package/dist/services/compressionService.js.map +2 -2
  321. package/dist/services/contextMonitor.js +162 -0
  322. package/dist/services/contextMonitor.js.map +7 -0
  323. package/dist/services/customCommands.js +60 -41
  324. package/dist/services/customCommands.js.map +2 -2
  325. package/dist/services/hookExecutor.js +173 -1
  326. package/dist/services/hookExecutor.js.map +2 -2
  327. package/dist/services/intelligentCompactor.js +281 -0
  328. package/dist/services/intelligentCompactor.js.map +7 -0
  329. package/dist/services/lspConfig.js +109 -0
  330. package/dist/services/lspConfig.js.map +7 -0
  331. package/dist/services/mcpClient.js +338 -43
  332. package/dist/services/mcpClient.js.map +2 -2
  333. package/dist/services/modelOrchestrator.js +310 -0
  334. package/dist/services/modelOrchestrator.js.map +7 -0
  335. package/dist/services/openai.js +8 -1
  336. package/dist/services/openai.js.map +2 -2
  337. package/dist/services/outputStyles.js +138 -0
  338. package/dist/services/outputStyles.js.map +7 -0
  339. package/dist/services/plugins/index.js +5 -0
  340. package/dist/services/plugins/index.js.map +7 -0
  341. package/dist/services/plugins/lspServers.js +188 -0
  342. package/dist/services/plugins/lspServers.js.map +7 -0
  343. package/dist/services/plugins/pluginRuntime.js +229 -0
  344. package/dist/services/plugins/pluginRuntime.js.map +7 -0
  345. package/dist/services/plugins/pluginValidation.js +219 -0
  346. package/dist/services/plugins/pluginValidation.js.map +7 -0
  347. package/dist/services/plugins/skillMarketplace.js +556 -0
  348. package/dist/services/plugins/skillMarketplace.js.map +7 -0
  349. package/dist/services/responseStateManager.js +37 -3
  350. package/dist/services/responseStateManager.js.map +2 -2
  351. package/dist/services/sandbox/filesystemBoundary.js +341 -0
  352. package/dist/services/sandbox/filesystemBoundary.js.map +7 -0
  353. package/dist/services/sandbox/index.js +14 -0
  354. package/dist/services/sandbox/index.js.map +7 -0
  355. package/dist/services/sandbox/networkProxy.js +293 -0
  356. package/dist/services/sandbox/networkProxy.js.map +7 -0
  357. package/dist/services/sandbox/sandboxController.js +574 -0
  358. package/dist/services/sandbox/sandboxController.js.map +7 -0
  359. package/dist/services/sandbox/types.js +50 -0
  360. package/dist/services/sandbox/types.js.map +7 -0
  361. package/dist/services/sessionMemory.js +266 -0
  362. package/dist/services/sessionMemory.js.map +7 -0
  363. package/dist/services/taskRouter.js +324 -0
  364. package/dist/services/taskRouter.js.map +7 -0
  365. package/dist/tools/ArchitectTool/ArchitectTool.js +7 -1
  366. package/dist/tools/ArchitectTool/ArchitectTool.js.map +2 -2
  367. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +6 -2
  368. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
  369. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js +2 -1
  370. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +2 -2
  371. package/dist/tools/BaseTool.js +72 -0
  372. package/dist/tools/BaseTool.js.map +7 -0
  373. package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js +3 -0
  374. package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js.map +2 -2
  375. package/dist/tools/BashTool/BashTool.js +79 -3
  376. package/dist/tools/BashTool/BashTool.js.map +2 -2
  377. package/dist/tools/BashTool/BashToolResultMessage.js +3 -0
  378. package/dist/tools/BashTool/BashToolResultMessage.js.map +2 -2
  379. package/dist/tools/BashTool/OutputLine.js +54 -0
  380. package/dist/tools/BashTool/OutputLine.js.map +2 -2
  381. package/dist/tools/BashTool/prompt.js +336 -3
  382. package/dist/tools/BashTool/prompt.js.map +2 -2
  383. package/dist/tools/FileEditTool/FileEditTool.js +29 -4
  384. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  385. package/dist/tools/FileEditTool/prompt.js +6 -3
  386. package/dist/tools/FileEditTool/prompt.js.map +2 -2
  387. package/dist/tools/FileWriteTool/FileWriteTool.js +5 -5
  388. package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
  389. package/dist/tools/FileWriteTool/prompt.js +4 -2
  390. package/dist/tools/FileWriteTool/prompt.js.map +2 -2
  391. package/dist/tools/GlobTool/GlobTool.js +4 -2
  392. package/dist/tools/GlobTool/GlobTool.js.map +2 -2
  393. package/dist/tools/GrepTool/GrepTool.js +36 -7
  394. package/dist/tools/GrepTool/GrepTool.js.map +2 -2
  395. package/dist/tools/KillShellTool/KillShellToolResultMessage.js +3 -0
  396. package/dist/tools/KillShellTool/KillShellToolResultMessage.js.map +2 -2
  397. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js +109 -0
  398. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +7 -0
  399. package/dist/tools/ListMcpResourcesTool/prompt.js +19 -0
  400. package/dist/tools/ListMcpResourcesTool/prompt.js.map +7 -0
  401. package/dist/tools/LspTool/LspTool.js +664 -0
  402. package/dist/tools/LspTool/LspTool.js.map +7 -0
  403. package/dist/tools/LspTool/prompt.js +27 -0
  404. package/dist/tools/LspTool/prompt.js.map +7 -0
  405. package/dist/tools/MCPTool/MCPTool.js +9 -1
  406. package/dist/tools/MCPTool/MCPTool.js.map +2 -2
  407. package/dist/tools/MemoryReadTool/MemoryReadTool.js +19 -6
  408. package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
  409. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +6 -6
  410. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
  411. package/dist/tools/MultiEditTool/MultiEditTool.js +19 -2
  412. package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
  413. package/dist/tools/MultiEditTool/prompt.js +5 -3
  414. package/dist/tools/MultiEditTool/prompt.js.map +2 -2
  415. package/dist/tools/NotebookEditTool/NotebookEditTool.js +7 -2
  416. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
  417. package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +2 -2
  418. package/dist/tools/PlanModeTool/EnterPlanModeTool.js +75 -0
  419. package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +7 -0
  420. package/dist/tools/PlanModeTool/ExitPlanModeTool.js +109 -0
  421. package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +7 -0
  422. package/dist/tools/PlanModeTool/prompt.js +94 -0
  423. package/dist/tools/PlanModeTool/prompt.js.map +7 -0
  424. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js +130 -0
  425. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +7 -0
  426. package/dist/tools/ReadMcpResourceTool/prompt.js +17 -0
  427. package/dist/tools/ReadMcpResourceTool/prompt.js.map +7 -0
  428. package/dist/tools/SkillTool/SkillTool.js +10 -4
  429. package/dist/tools/SkillTool/SkillTool.js.map +2 -2
  430. package/dist/tools/SkillTool/prompt.js +1 -1
  431. package/dist/tools/SkillTool/prompt.js.map +1 -1
  432. package/dist/tools/SlashCommandTool/SlashCommandTool.js +260 -0
  433. package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +7 -0
  434. package/dist/tools/SlashCommandTool/prompt.js +35 -0
  435. package/dist/tools/SlashCommandTool/prompt.js.map +7 -0
  436. package/dist/tools/TaskOutputTool/TaskOutputTool.js +190 -0
  437. package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +7 -0
  438. package/dist/tools/TaskOutputTool/prompt.js +15 -0
  439. package/dist/tools/TaskOutputTool/prompt.js.map +7 -0
  440. package/dist/tools/TaskTool/TaskTool.js +310 -104
  441. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  442. package/dist/tools/TaskTool/prompt.js.map +2 -2
  443. package/dist/tools/TodoWriteTool/TodoWriteTool.js +42 -77
  444. package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +2 -2
  445. package/dist/tools/URLFetcherTool/URLFetcherTool.js +4 -1
  446. package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
  447. package/dist/tools/URLFetcherTool/cache.js +55 -8
  448. package/dist/tools/URLFetcherTool/cache.js.map +2 -2
  449. package/dist/tools.js +31 -2
  450. package/dist/tools.js.map +2 -2
  451. package/dist/types/hooks.js +4 -0
  452. package/dist/types/hooks.js.map +2 -2
  453. package/dist/types/marketplace.js.map +2 -2
  454. package/dist/types/messageGroup.js +36 -0
  455. package/dist/types/messageGroup.js.map +7 -0
  456. package/dist/types/plugin.js.map +2 -2
  457. package/dist/types/thinking.js +1 -0
  458. package/dist/types/thinking.js.map +7 -0
  459. package/dist/utils/BackgroundShellManager.js +136 -39
  460. package/dist/utils/BackgroundShellManager.js.map +2 -2
  461. package/dist/utils/CircuitBreaker.js +242 -0
  462. package/dist/utils/CircuitBreaker.js.map +7 -0
  463. package/dist/utils/MessageBatchBuffer.js +102 -0
  464. package/dist/utils/MessageBatchBuffer.js.map +7 -0
  465. package/dist/utils/PersistentShell.js +151 -1
  466. package/dist/utils/PersistentShell.js.map +2 -2
  467. package/dist/utils/agentLoader.js +1 -23
  468. package/dist/utils/agentLoader.js.map +2 -2
  469. package/dist/utils/agentTranscripts.js +641 -0
  470. package/dist/utils/agentTranscripts.js.map +7 -0
  471. package/dist/utils/animationManager.js +213 -0
  472. package/dist/utils/animationManager.js.map +7 -0
  473. package/dist/utils/animationSync.js +110 -0
  474. package/dist/utils/animationSync.js.map +7 -0
  475. package/dist/utils/ask.js +2 -0
  476. package/dist/utils/ask.js.map +2 -2
  477. package/dist/utils/asyncFile.js +215 -0
  478. package/dist/utils/asyncFile.js.map +7 -0
  479. package/dist/utils/backgroundAgentManager.js +231 -0
  480. package/dist/utils/backgroundAgentManager.js.map +7 -0
  481. package/dist/utils/config.js +108 -10
  482. package/dist/utils/config.js.map +2 -2
  483. package/dist/utils/conversationRecovery.js +19 -0
  484. package/dist/utils/conversationRecovery.js.map +2 -2
  485. package/dist/utils/credentials/CredentialStore.js +1 -0
  486. package/dist/utils/credentials/CredentialStore.js.map +7 -0
  487. package/dist/utils/credentials/EncryptedFileStore.js +157 -0
  488. package/dist/utils/credentials/EncryptedFileStore.js.map +7 -0
  489. package/dist/utils/credentials/index.js +37 -0
  490. package/dist/utils/credentials/index.js.map +7 -0
  491. package/dist/utils/credentials/migration.js +82 -0
  492. package/dist/utils/credentials/migration.js.map +7 -0
  493. package/dist/utils/exit.js +73 -0
  494. package/dist/utils/exit.js.map +7 -0
  495. package/dist/utils/format.js +73 -5
  496. package/dist/utils/format.js.map +2 -2
  497. package/dist/utils/generators.js +76 -6
  498. package/dist/utils/generators.js.map +2 -2
  499. package/dist/utils/globalErrorHandler.js +149 -0
  500. package/dist/utils/globalErrorHandler.js.map +7 -0
  501. package/dist/utils/groupHandlers/index.js +8 -0
  502. package/dist/utils/groupHandlers/index.js.map +7 -0
  503. package/dist/utils/groupHandlers/parallelTasksHandler.js +140 -0
  504. package/dist/utils/groupHandlers/parallelTasksHandler.js.map +7 -0
  505. package/dist/utils/groupHandlers/taskHandler.js +104 -0
  506. package/dist/utils/groupHandlers/taskHandler.js.map +7 -0
  507. package/dist/utils/groupHandlers/types.js +1 -0
  508. package/dist/utils/groupHandlers/types.js.map +7 -0
  509. package/dist/utils/logRotation.js +224 -0
  510. package/dist/utils/logRotation.js.map +7 -0
  511. package/dist/utils/markdown.js +13 -1
  512. package/dist/utils/markdown.js.map +2 -2
  513. package/dist/utils/marketplaceManager.js +3 -5
  514. package/dist/utils/marketplaceManager.js.map +2 -2
  515. package/dist/utils/memSafety.js +264 -0
  516. package/dist/utils/memSafety.js.map +7 -0
  517. package/dist/utils/messageGroupManager.js +274 -0
  518. package/dist/utils/messageGroupManager.js.map +7 -0
  519. package/dist/utils/messages.js +13 -4
  520. package/dist/utils/messages.js.map +2 -2
  521. package/dist/utils/model.js +119 -15
  522. package/dist/utils/model.js.map +3 -3
  523. package/dist/utils/permissions/filesystem.js +162 -6
  524. package/dist/utils/permissions/filesystem.js.map +2 -2
  525. package/dist/utils/plan/planMode.js +143 -0
  526. package/dist/utils/plan/planMode.js.map +7 -0
  527. package/dist/utils/pluginLoader.js +17 -21
  528. package/dist/utils/pluginLoader.js.map +2 -2
  529. package/dist/utils/ripgrep.js +55 -2
  530. package/dist/utils/ripgrep.js.map +2 -2
  531. package/dist/utils/safePath.js +132 -0
  532. package/dist/utils/safePath.js.map +7 -0
  533. package/dist/utils/sanitizeInput.js +32 -0
  534. package/dist/utils/sanitizeInput.js.map +7 -0
  535. package/dist/utils/secureKeyStorage.js +312 -0
  536. package/dist/utils/secureKeyStorage.js.map +7 -0
  537. package/dist/utils/sensitiveFiles.js +125 -0
  538. package/dist/utils/sensitiveFiles.js.map +7 -0
  539. package/dist/utils/session/sessionPlugins.js +67 -0
  540. package/dist/utils/session/sessionPlugins.js.map +7 -0
  541. package/dist/utils/taskDisplayUtils.js +257 -0
  542. package/dist/utils/taskDisplayUtils.js.map +7 -0
  543. package/dist/utils/teamConfig.js +2 -1
  544. package/dist/utils/teamConfig.js.map +2 -2
  545. package/dist/utils/theme.js +6 -6
  546. package/dist/utils/theme.js.map +1 -1
  547. package/dist/utils/todoStorage.js +92 -2
  548. package/dist/utils/todoStorage.js.map +2 -2
  549. package/dist/utils/toolRiskClassification.js +207 -0
  550. package/dist/utils/toolRiskClassification.js.map +7 -0
  551. package/dist/utils/toolTimeout.js +136 -0
  552. package/dist/utils/toolTimeout.js.map +7 -0
  553. package/dist/utils/tooling/safeRender.js +116 -0
  554. package/dist/utils/tooling/safeRender.js.map +7 -0
  555. package/dist/utils/userFriendlyError.js +346 -0
  556. package/dist/utils/userFriendlyError.js.map +7 -0
  557. package/dist/utils/vendor/ripgrep/arm64-darwin/rg +0 -0
  558. package/dist/version.js +2 -2
  559. package/dist/version.js.map +1 -1
  560. package/package.json +17 -5
  561. package/scripts/postinstall.js +128 -38
  562. package/dist/commands/agents.js +0 -2086
  563. package/dist/commands/agents.js.map +0 -7
  564. package/dist/commands/build.js +0 -74
  565. package/dist/commands/build.js.map +0 -7
  566. package/dist/commands/compression.js +0 -57
  567. package/dist/commands/compression.js.map +0 -7
  568. package/dist/commands/listen.js +0 -37
  569. package/dist/commands/listen.js.map +0 -7
  570. package/dist/commands/login.js +0 -37
  571. package/dist/commands/login.js.map +0 -7
  572. package/dist/commands/logout.js +0 -33
  573. package/dist/commands/logout.js.map +0 -7
  574. package/dist/commands/mcp.js +0 -40
  575. package/dist/commands/mcp.js.map +0 -7
  576. package/dist/commands/mcp_refresh.js +0 -40
  577. package/dist/commands/mcp_refresh.js.map +0 -7
  578. package/dist/commands/modelstatus.js +0 -21
  579. package/dist/commands/modelstatus.js.map +0 -7
  580. package/dist/commands/onboarding.js +0 -36
  581. package/dist/commands/onboarding.js.map +0 -7
  582. package/dist/commands/plugin-interactive.js +0 -446
  583. package/dist/commands/plugin-interactive.js.map +0 -7
  584. package/dist/commands/pr_comments.js +0 -61
  585. package/dist/commands/pr_comments.js.map +0 -7
  586. package/dist/commands/release-notes.js +0 -30
  587. package/dist/commands/release-notes.js.map +0 -7
  588. package/dist/commands/review.js +0 -51
  589. package/dist/commands/review.js.map +0 -7
  590. package/dist/components/Bug.js +0 -147
  591. package/dist/components/Bug.js.map +0 -7
  592. package/dist/components/ModelSelector.js +0 -2062
  593. package/dist/components/ModelSelector.js.map +0 -7
  594. package/dist/components/ModelStatusDisplay.js +0 -87
  595. package/dist/components/ModelStatusDisplay.js.map +0 -7
  596. package/dist/entrypoints/cli-wrapper.js +0 -61
  597. package/dist/entrypoints/cli-wrapper.js.map +0 -7
  598. package/dist/hooks/useCancelRequest.js +0 -28
  599. package/dist/hooks/useCancelRequest.js.map +0 -7
  600. package/dist/screens/Doctor.js +0 -22
  601. package/dist/screens/Doctor.js.map +0 -7
@@ -0,0 +1,188 @@
1
+ import { existsSync, readFileSync } from "fs";
2
+ import { join, resolve, isAbsolute } from "path";
3
+ import { z } from "zod";
4
+ import { getAllPluginLspConfigFiles } from "../../utils/session/sessionPlugins.js";
5
+ import { getCwd } from "../../utils/state.js";
6
+ const LspServerConfigSchema = z.object({
7
+ // Required
8
+ command: z.string().min(1),
9
+ // Optional command args
10
+ args: z.array(z.string()).optional().default([]),
11
+ // Transport configuration
12
+ transport: z.enum(["stdio", "socket", "pipe"]).optional().default("stdio"),
13
+ // Environment variables
14
+ env: z.record(z.string()).optional().default({}),
15
+ // File patterns this server handles
16
+ filePatterns: z.array(z.string()).optional().default([]),
17
+ // Language ID mapping (extension -> languageId)
18
+ extensionToLanguage: z.record(z.string()).optional().default({}),
19
+ // Server initialization options
20
+ initializationOptions: z.unknown().optional(),
21
+ // Server settings
22
+ settings: z.unknown().optional(),
23
+ // Workspace folder (defaults to cwd)
24
+ workspaceFolder: z.string().optional(),
25
+ // Root path for relative file resolution
26
+ rootPath: z.string().optional(),
27
+ // Timeouts
28
+ startupTimeout: z.number().optional().default(3e4),
29
+ // 30s default
30
+ shutdownTimeout: z.number().optional().default(5e3),
31
+ // 5s default
32
+ // Restart behavior
33
+ restartOnCrash: z.boolean().optional().default(true),
34
+ maxRestarts: z.number().optional().default(3),
35
+ // Logging
36
+ loggingConfig: z.object({
37
+ level: z.enum(["off", "error", "warn", "info", "debug", "trace"]).optional(),
38
+ logFile: z.string().optional()
39
+ }).optional()
40
+ });
41
+ const LspConfigSchema = z.record(z.string(), LspServerConfigSchema);
42
+ let lspServersCache = null;
43
+ function resolvePluginPath(value, pluginRoot) {
44
+ if (!value) return value;
45
+ let resolved = value.replace(/\$\{CLAUDE_PLUGIN_ROOT\}/g, pluginRoot);
46
+ resolved = resolved.replace(/\$CLAUDE_PLUGIN_ROOT/g, pluginRoot);
47
+ resolved = resolved.replace(/\$\{MINTO_PLUGIN_ROOT\}/g, pluginRoot);
48
+ resolved = resolved.replace(/\$MINTO_PLUGIN_ROOT/g, pluginRoot);
49
+ if (!isAbsolute(resolved) && !resolved.startsWith("$")) {
50
+ resolved = resolve(pluginRoot, resolved);
51
+ }
52
+ return resolved;
53
+ }
54
+ function resolvePluginPaths(values, pluginRoot) {
55
+ return values.map((v) => resolvePluginPath(v, pluginRoot));
56
+ }
57
+ function resolvePluginEnv(env, pluginRoot) {
58
+ const resolved = {};
59
+ for (const [key, value] of Object.entries(env)) {
60
+ resolved[key] = resolvePluginPath(value, pluginRoot);
61
+ }
62
+ return resolved;
63
+ }
64
+ function parseLspConfigFile(filePath, pluginRoot) {
65
+ const servers = /* @__PURE__ */ new Map();
66
+ if (!existsSync(filePath)) {
67
+ return servers;
68
+ }
69
+ try {
70
+ const content = readFileSync(filePath, "utf-8");
71
+ const data = JSON.parse(content);
72
+ const result = LspConfigSchema.safeParse(data);
73
+ if (!result.success) {
74
+ console.warn(`Invalid LSP config in ${filePath}: ${result.error.message}`);
75
+ return servers;
76
+ }
77
+ const root = pluginRoot || join(filePath, "..");
78
+ for (const [languageId, config] of Object.entries(result.data)) {
79
+ const loadedServer = {
80
+ languageId,
81
+ config,
82
+ resolvedCommand: resolvePluginPath(config.command, root),
83
+ resolvedArgs: resolvePluginPaths(config.args || [], root),
84
+ filePath,
85
+ pluginRoot: root
86
+ };
87
+ servers.set(languageId, loadedServer);
88
+ }
89
+ } catch (error) {
90
+ console.warn(
91
+ `Failed to parse LSP config ${filePath}:`,
92
+ error instanceof Error ? error.message : String(error)
93
+ );
94
+ }
95
+ return servers;
96
+ }
97
+ function loadAllLspServers() {
98
+ if (lspServersCache !== null) {
99
+ return Array.from(lspServersCache.values());
100
+ }
101
+ const servers = /* @__PURE__ */ new Map();
102
+ const configFiles = getAllPluginLspConfigFiles();
103
+ for (const filePath of configFiles) {
104
+ const pluginRoot = filePath.includes(".minto-plugin") ? join(filePath, "..", "..") : join(filePath, "..");
105
+ const fileServers = parseLspConfigFile(filePath, pluginRoot);
106
+ for (const [languageId, server] of fileServers) {
107
+ servers.set(languageId, server);
108
+ }
109
+ }
110
+ lspServersCache = servers;
111
+ return Array.from(servers.values());
112
+ }
113
+ function getLspServer(languageId) {
114
+ if (lspServersCache === null) {
115
+ loadAllLspServers();
116
+ }
117
+ return lspServersCache?.get(languageId);
118
+ }
119
+ function getLspServerForFile(filePath) {
120
+ const servers = loadAllLspServers();
121
+ const ext = filePath.includes(".") ? filePath.split(".").pop() : "";
122
+ if (!ext) return void 0;
123
+ for (const server of servers) {
124
+ if (server.config.extensionToLanguage?.[ext]) {
125
+ return server;
126
+ }
127
+ if (server.config.filePatterns?.some((pattern) => {
128
+ if (pattern.startsWith("*.")) {
129
+ return ext === pattern.slice(2);
130
+ }
131
+ if (pattern.includes("**")) {
132
+ const extPattern = pattern.split("**/*.").pop();
133
+ return ext === extPattern;
134
+ }
135
+ return false;
136
+ })) {
137
+ return server;
138
+ }
139
+ }
140
+ return void 0;
141
+ }
142
+ function getSupportedLanguages() {
143
+ const servers = loadAllLspServers();
144
+ return servers.map((s) => s.languageId);
145
+ }
146
+ function hasLspSupport(languageId) {
147
+ return getLspServer(languageId) !== void 0;
148
+ }
149
+ function clearLspServersCache() {
150
+ lspServersCache = null;
151
+ }
152
+ function getLspServerCount() {
153
+ return loadAllLspServers().length;
154
+ }
155
+ function validateLspConfig(config) {
156
+ const result = LspConfigSchema.safeParse(config);
157
+ if (result.success) {
158
+ return { success: true, data: result.data };
159
+ }
160
+ return { success: false, error: result.error.message };
161
+ }
162
+ function createLspInitOptions(server) {
163
+ const root = server.pluginRoot || getCwd();
164
+ return {
165
+ command: server.resolvedCommand,
166
+ args: server.resolvedArgs,
167
+ env: resolvePluginEnv(server.config.env || {}, root),
168
+ workspaceFolder: server.config.workspaceFolder ? resolvePluginPath(server.config.workspaceFolder, root) : getCwd(),
169
+ initializationOptions: server.config.initializationOptions
170
+ };
171
+ }
172
+ export {
173
+ LspConfigSchema,
174
+ LspServerConfigSchema,
175
+ clearLspServersCache,
176
+ createLspInitOptions,
177
+ getLspServer,
178
+ getLspServerCount,
179
+ getLspServerForFile,
180
+ getSupportedLanguages,
181
+ hasLspSupport,
182
+ loadAllLspServers,
183
+ resolvePluginEnv,
184
+ resolvePluginPath,
185
+ resolvePluginPaths,
186
+ validateLspConfig
187
+ };
188
+ //# sourceMappingURL=lspServers.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/services/plugins/lspServers.ts"],
4
+ "sourcesContent": ["/**\n * LSP Servers Service\n *\n * Handles loading and managing LSP (Language Server Protocol) server\n * configurations from plugins. This is a Claude Code CLI specific feature.\n *\n * LSP servers provide code intelligence features like:\n * - Go to definition\n * - Find references\n * - Hover information\n * - Code completion\n * - Diagnostics\n */\n\nimport { existsSync, readFileSync } from 'fs'\nimport { join, resolve, isAbsolute } from 'path'\nimport { z } from 'zod'\nimport { getAllPluginLspConfigFiles } from '@utils/session/sessionPlugins'\nimport { getCwd } from '@utils/state'\n\n/**\n * LSP server transport type\n */\nexport type LspTransport = 'stdio' | 'socket' | 'pipe'\n\n/**\n * LSP server configuration schema\n */\nexport const LspServerConfigSchema = z.object({\n // Required\n command: z.string().min(1),\n\n // Optional command args\n args: z.array(z.string()).optional().default([]),\n\n // Transport configuration\n transport: z.enum(['stdio', 'socket', 'pipe']).optional().default('stdio'),\n\n // Environment variables\n env: z.record(z.string()).optional().default({}),\n\n // File patterns this server handles\n filePatterns: z.array(z.string()).optional().default([]),\n\n // Language ID mapping (extension -> languageId)\n extensionToLanguage: z.record(z.string()).optional().default({}),\n\n // Server initialization options\n initializationOptions: z.unknown().optional(),\n\n // Server settings\n settings: z.unknown().optional(),\n\n // Workspace folder (defaults to cwd)\n workspaceFolder: z.string().optional(),\n\n // Root path for relative file resolution\n rootPath: z.string().optional(),\n\n // Timeouts\n startupTimeout: z.number().optional().default(30000), // 30s default\n shutdownTimeout: z.number().optional().default(5000), // 5s default\n\n // Restart behavior\n restartOnCrash: z.boolean().optional().default(true),\n maxRestarts: z.number().optional().default(3),\n\n // Logging\n loggingConfig: z\n .object({\n level: z\n .enum(['off', 'error', 'warn', 'info', 'debug', 'trace'])\n .optional(),\n logFile: z.string().optional(),\n })\n .optional(),\n})\n\nexport type LspServerConfig = z.infer<typeof LspServerConfigSchema>\n\n/**\n * LSP configuration file schema (.lsp.json)\n */\nexport const LspConfigSchema = z.record(z.string(), LspServerConfigSchema)\n\nexport type LspConfig = z.infer<typeof LspConfigSchema>\n\n/**\n * Loaded LSP server (runtime representation)\n */\nexport interface LoadedLspServer {\n /** Language ID this server handles */\n languageId: string\n\n /** Server configuration */\n config: LspServerConfig\n\n /** Resolved command (with plugin root expanded) */\n resolvedCommand: string\n\n /** Resolved args (with plugin root expanded) */\n resolvedArgs: string[]\n\n /** Source plugin name */\n pluginName?: string\n\n /** Source file path */\n filePath: string\n\n /** Plugin root directory */\n pluginRoot?: string\n}\n\n/**\n * LSP server state\n */\nexport interface LspServerState {\n /** Language ID */\n languageId: string\n\n /** Whether server is running */\n running: boolean\n\n /** Number of restarts */\n restartCount: number\n\n /** Last error message */\n lastError?: string\n\n /** Process ID if running */\n pid?: number\n}\n\n/**\n * Cache for loaded LSP servers\n */\nlet lspServersCache: Map<string, LoadedLspServer> | null = null\n\n/**\n * Resolve plugin path variables in a string\n */\nexport function resolvePluginPath(value: string, pluginRoot: string): string {\n if (!value) return value\n\n // Replace ${CLAUDE_PLUGIN_ROOT} variable\n let resolved = value.replace(/\\$\\{CLAUDE_PLUGIN_ROOT\\}/g, pluginRoot)\n\n // Also support $CLAUDE_PLUGIN_ROOT without braces\n resolved = resolved.replace(/\\$CLAUDE_PLUGIN_ROOT/g, pluginRoot)\n\n // Replace ${MINTO_PLUGIN_ROOT} for Minto-specific plugins\n resolved = resolved.replace(/\\$\\{MINTO_PLUGIN_ROOT\\}/g, pluginRoot)\n resolved = resolved.replace(/\\$MINTO_PLUGIN_ROOT/g, pluginRoot)\n\n // Resolve relative paths\n if (!isAbsolute(resolved) && !resolved.startsWith('$')) {\n resolved = resolve(pluginRoot, resolved)\n }\n\n return resolved\n}\n\n/**\n * Resolve plugin path variables in an array\n */\nexport function resolvePluginPaths(\n values: string[],\n pluginRoot: string,\n): string[] {\n return values.map(v => resolvePluginPath(v, pluginRoot))\n}\n\n/**\n * Resolve plugin path variables in environment object\n */\nexport function resolvePluginEnv(\n env: Record<string, string>,\n pluginRoot: string,\n): Record<string, string> {\n const resolved: Record<string, string> = {}\n\n for (const [key, value] of Object.entries(env)) {\n resolved[key] = resolvePluginPath(value, pluginRoot)\n }\n\n return resolved\n}\n\n/**\n * Parse and validate LSP config file\n */\nfunction parseLspConfigFile(\n filePath: string,\n pluginRoot?: string,\n): Map<string, LoadedLspServer> {\n const servers = new Map<string, LoadedLspServer>()\n\n if (!existsSync(filePath)) {\n return servers\n }\n\n try {\n const content = readFileSync(filePath, 'utf-8')\n const data = JSON.parse(content)\n\n const result = LspConfigSchema.safeParse(data)\n\n if (!result.success) {\n console.warn(`Invalid LSP config in ${filePath}: ${result.error.message}`)\n return servers\n }\n\n const root = pluginRoot || join(filePath, '..')\n\n for (const [languageId, config] of Object.entries(result.data)) {\n const loadedServer: LoadedLspServer = {\n languageId,\n config,\n resolvedCommand: resolvePluginPath(config.command, root),\n resolvedArgs: resolvePluginPaths(config.args || [], root),\n filePath,\n pluginRoot: root,\n }\n\n servers.set(languageId, loadedServer)\n }\n } catch (error) {\n console.warn(\n `Failed to parse LSP config ${filePath}:`,\n error instanceof Error ? error.message : String(error),\n )\n }\n\n return servers\n}\n\n/**\n * Load all LSP servers from plugins\n */\nexport function loadAllLspServers(): LoadedLspServer[] {\n // Return cached servers if available\n if (lspServersCache !== null) {\n return Array.from(lspServersCache.values())\n }\n\n const servers = new Map<string, LoadedLspServer>()\n const configFiles = getAllPluginLspConfigFiles()\n\n for (const filePath of configFiles) {\n // Extract plugin root from config file path\n // Assuming structure: pluginRoot/.minto-plugin/lsp.json or pluginRoot/lsp.json\n const pluginRoot = filePath.includes('.minto-plugin')\n ? join(filePath, '..', '..')\n : join(filePath, '..')\n\n const fileServers = parseLspConfigFile(filePath, pluginRoot)\n\n // Merge servers, later configs override earlier ones\n for (const [languageId, server] of fileServers) {\n servers.set(languageId, server)\n }\n }\n\n // Cache the results\n lspServersCache = servers\n\n return Array.from(servers.values())\n}\n\n/**\n * Get LSP server for a specific language\n */\nexport function getLspServer(languageId: string): LoadedLspServer | undefined {\n // Ensure cache is populated\n if (lspServersCache === null) {\n loadAllLspServers()\n }\n\n return lspServersCache?.get(languageId)\n}\n\n/**\n * Get LSP server for a file based on extension\n */\nexport function getLspServerForFile(\n filePath: string,\n): LoadedLspServer | undefined {\n const servers = loadAllLspServers()\n\n // Extract extension\n const ext = filePath.includes('.') ? filePath.split('.').pop() : ''\n if (!ext) return undefined\n\n // Find server that handles this extension\n for (const server of servers) {\n // Check extensionToLanguage mapping\n if (server.config.extensionToLanguage?.[ext]) {\n return server\n }\n\n // Check filePatterns\n if (\n server.config.filePatterns?.some(pattern => {\n if (pattern.startsWith('*.')) {\n return ext === pattern.slice(2)\n }\n // Simple glob matching for **/*.ext patterns\n if (pattern.includes('**')) {\n const extPattern = pattern.split('**/*.').pop()\n return ext === extPattern\n }\n return false\n })\n ) {\n return server\n }\n }\n\n return undefined\n}\n\n/**\n * Get all supported language IDs\n */\nexport function getSupportedLanguages(): string[] {\n const servers = loadAllLspServers()\n return servers.map(s => s.languageId)\n}\n\n/**\n * Check if LSP is available for a language\n */\nexport function hasLspSupport(languageId: string): boolean {\n return getLspServer(languageId) !== undefined\n}\n\n/**\n * Clear the LSP servers cache\n */\nexport function clearLspServersCache(): void {\n lspServersCache = null\n}\n\n/**\n * Get count of loaded LSP servers\n */\nexport function getLspServerCount(): number {\n return loadAllLspServers().length\n}\n\n/**\n * Validate LSP server configuration\n */\nexport function validateLspConfig(config: unknown): {\n success: boolean\n data?: LspConfig\n error?: string\n} {\n const result = LspConfigSchema.safeParse(config)\n\n if (result.success) {\n return { success: true, data: result.data }\n }\n\n return { success: false, error: result.error.message }\n}\n\n/**\n * Create LSP initialization options with resolved paths\n */\nexport function createLspInitOptions(server: LoadedLspServer): {\n command: string\n args: string[]\n env: Record<string, string>\n workspaceFolder: string\n initializationOptions: unknown\n} {\n const root = server.pluginRoot || getCwd()\n\n return {\n command: server.resolvedCommand,\n args: server.resolvedArgs,\n env: resolvePluginEnv(server.config.env || {}, root),\n workspaceFolder: server.config.workspaceFolder\n ? resolvePluginPath(server.config.workspaceFolder, root)\n : getCwd(),\n initializationOptions: server.config.initializationOptions,\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,229 @@
1
+ import { existsSync, readFileSync, statSync } from "fs";
2
+ import { homedir } from "os";
3
+ import { join, resolve } from "path";
4
+ import { glob as globLib } from "glob";
5
+ import { getCwd } from "../../utils/state.js";
6
+ import {
7
+ setSessionPlugins,
8
+ getSessionPlugins
9
+ } from "../../utils/session/sessionPlugins.js";
10
+ import { PluginManifestSchema } from "./pluginValidation.js";
11
+ function expandHome(input) {
12
+ const trimmed = input.trim();
13
+ if (trimmed === "~") return homedir();
14
+ if (trimmed.startsWith("~/") || trimmed.startsWith("~\\")) {
15
+ return join(homedir(), trimmed.slice(2));
16
+ }
17
+ return trimmed;
18
+ }
19
+ function isLikelyGlob(value) {
20
+ return /[*?[\]]/.test(value);
21
+ }
22
+ async function expandPluginDirInputs(pluginDirs, baseDir) {
23
+ const out = [];
24
+ for (const raw of pluginDirs) {
25
+ const trimmed = String(raw ?? "").trim();
26
+ if (!trimmed) continue;
27
+ const expanded = expandHome(trimmed);
28
+ const abs = resolve(baseDir, expanded);
29
+ if (isLikelyGlob(trimmed) || isLikelyGlob(expanded)) {
30
+ const patternsToTry = expanded !== trimmed ? [expanded, trimmed] : [trimmed];
31
+ let matched = false;
32
+ for (const pattern of patternsToTry) {
33
+ try {
34
+ const matches = await globLib(pattern, {
35
+ cwd: baseDir,
36
+ absolute: true,
37
+ nodir: false,
38
+ nocase: process.platform === "win32"
39
+ });
40
+ const dirs = matches.filter((match) => {
41
+ try {
42
+ return existsSync(match) && statSync(match).isDirectory();
43
+ } catch {
44
+ return false;
45
+ }
46
+ });
47
+ if (dirs.length > 0) {
48
+ out.push(...dirs);
49
+ matched = true;
50
+ break;
51
+ }
52
+ } catch {
53
+ }
54
+ }
55
+ if (matched) continue;
56
+ }
57
+ out.push(abs);
58
+ }
59
+ const seen = /* @__PURE__ */ new Set();
60
+ const unique = [];
61
+ for (const item of out) {
62
+ if (seen.has(item)) continue;
63
+ seen.add(item);
64
+ unique.push(item);
65
+ }
66
+ return unique;
67
+ }
68
+ function listIfDir(path) {
69
+ try {
70
+ if (!existsSync(path)) return [];
71
+ if (!statSync(path).isDirectory()) return [];
72
+ return [path];
73
+ } catch {
74
+ return [];
75
+ }
76
+ }
77
+ function fileIfExists(path) {
78
+ try {
79
+ if (!existsSync(path)) return [];
80
+ if (!statSync(path).isFile()) return [];
81
+ return [path];
82
+ } catch {
83
+ return [];
84
+ }
85
+ }
86
+ function resolveManifestPaths(rootDir, value) {
87
+ const dirs = [];
88
+ const files = [];
89
+ const list = Array.isArray(value) ? value : value ? [value] : [];
90
+ for (const item of list) {
91
+ if (typeof item !== "string") continue;
92
+ const abs = resolve(rootDir, item);
93
+ dirs.push(...listIfDir(abs));
94
+ files.push(...fileIfExists(abs));
95
+ }
96
+ return { dirs, files };
97
+ }
98
+ function loadPluginFromDir(rootDir) {
99
+ const mintoManifestPath = join(rootDir, ".minto-plugin", "plugin.json");
100
+ const rootManifestPath = join(rootDir, "plugin.json");
101
+ const manifestPath = existsSync(mintoManifestPath) ? mintoManifestPath : existsSync(rootManifestPath) ? rootManifestPath : null;
102
+ if (!manifestPath) {
103
+ throw new Error(
104
+ `Plugin manifest not found (expected .minto-plugin/plugin.json or plugin.json)`
105
+ );
106
+ }
107
+ let manifestRaw;
108
+ try {
109
+ manifestRaw = readFileSync(manifestPath, "utf8");
110
+ } catch (err) {
111
+ throw new Error(`Failed to read ${manifestPath}: ${String(err)}`);
112
+ }
113
+ let manifestJson;
114
+ try {
115
+ manifestJson = JSON.parse(manifestRaw);
116
+ } catch (err) {
117
+ throw new Error(`Invalid JSON in ${manifestPath}: ${String(err)}`);
118
+ }
119
+ const parsed = PluginManifestSchema.safeParse(manifestJson);
120
+ if (!parsed.success) {
121
+ throw new Error(
122
+ `Invalid plugin manifest schema in ${manifestPath}: ${parsed.error.message}`
123
+ );
124
+ }
125
+ const name = parsed.data.name;
126
+ const manifestData = parsed.data;
127
+ const manifestCommands = resolveManifestPaths(rootDir, manifestData.commands);
128
+ const commandsDirs = [
129
+ ...listIfDir(join(rootDir, "commands")),
130
+ ...manifestCommands.dirs,
131
+ ...manifestCommands.files
132
+ ];
133
+ const skillsDirs = [
134
+ ...listIfDir(join(rootDir, "skills")),
135
+ ...resolveManifestPaths(rootDir, manifestData.skills).dirs
136
+ ];
137
+ const manifestAgents = resolveManifestPaths(rootDir, manifestData.agents);
138
+ const agentsDirs = [
139
+ ...listIfDir(join(rootDir, "agents")),
140
+ ...manifestAgents.dirs,
141
+ ...manifestAgents.files
142
+ ];
143
+ const manifestOutputStyles = resolveManifestPaths(
144
+ rootDir,
145
+ manifestData.outputStyles
146
+ );
147
+ const outputStylesDirs = [
148
+ ...listIfDir(join(rootDir, "output-styles")),
149
+ ...manifestOutputStyles.dirs,
150
+ ...manifestOutputStyles.files
151
+ ];
152
+ const standardHook = fileIfExists(join(rootDir, "hooks", "hooks.json"));
153
+ const hookFromManifest = resolveManifestPaths(
154
+ rootDir,
155
+ manifestData.hooks
156
+ ).files;
157
+ const hooksFiles = [...standardHook, ...hookFromManifest];
158
+ const mcpConfigFiles = [
159
+ ...fileIfExists(join(rootDir, ".mcp.json")),
160
+ ...fileIfExists(join(rootDir, ".mcp.jsonc")),
161
+ ...resolveManifestPaths(rootDir, manifestData.mcpServers).files
162
+ ];
163
+ const lspConfigFiles = [
164
+ ...fileIfExists(join(rootDir, ".lsp.json")),
165
+ ...resolveManifestPaths(rootDir, manifestData.lspServers).files
166
+ ];
167
+ return {
168
+ name,
169
+ rootDir,
170
+ manifestPath,
171
+ manifest: parsed.data,
172
+ commandsDirs,
173
+ skillsDirs,
174
+ agentsDirs,
175
+ hooksFiles,
176
+ outputStylesDirs,
177
+ mcpConfigFiles,
178
+ lspConfigFiles
179
+ };
180
+ }
181
+ async function configureSessionPlugins(args) {
182
+ const baseDir = args.baseDir ?? getCwd();
183
+ const dirs = await expandPluginDirInputs(args.pluginDirs ?? [], baseDir);
184
+ const plugins = [];
185
+ const errors = [];
186
+ for (const dir of dirs) {
187
+ try {
188
+ plugins.push(loadPluginFromDir(dir));
189
+ } catch (err) {
190
+ errors.push(err instanceof Error ? err.message : String(err));
191
+ }
192
+ }
193
+ setSessionPlugins(plugins);
194
+ try {
195
+ const { reloadCustomCommands } = await import("../customCommands.js");
196
+ reloadCustomCommands();
197
+ const { getCommands } = await import("../../commands.js");
198
+ getCommands.cache?.clear?.();
199
+ const { getClients, getMCPTools } = await import("../mcpClient.js");
200
+ getClients.cache?.clear?.();
201
+ getMCPTools.cache?.clear?.();
202
+ } catch {
203
+ }
204
+ return { plugins, errors };
205
+ }
206
+ async function loadDefaultPlugins() {
207
+ const home = homedir();
208
+ const cwd = getCwd();
209
+ const pluginDirs = [
210
+ // User-level plugins
211
+ join(home, ".minto", "plugins"),
212
+ // Project-level plugins
213
+ join(cwd, ".minto", "plugins")
214
+ ].filter((dir) => existsSync(dir));
215
+ return configureSessionPlugins({ pluginDirs, baseDir: cwd });
216
+ }
217
+ function getLoadedPlugins() {
218
+ return getSessionPlugins();
219
+ }
220
+ function hasLoadedPlugins() {
221
+ return getSessionPlugins().length > 0;
222
+ }
223
+ export {
224
+ configureSessionPlugins,
225
+ getLoadedPlugins,
226
+ hasLoadedPlugins,
227
+ loadDefaultPlugins
228
+ };
229
+ //# sourceMappingURL=pluginRuntime.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/services/plugins/pluginRuntime.ts"],
4
+ "sourcesContent": ["/**\n * Plugin Runtime\n *\n * Handles loading and managing plugins at runtime.\n * Compatible with Claude Code CLI plugin specification.\n */\n\nimport { existsSync, readFileSync, statSync } from 'fs'\nimport { homedir } from 'os'\nimport { join, resolve } from 'path'\nimport { z } from 'zod'\nimport { glob as globLib } from 'glob'\nimport { getCwd } from '@utils/state'\nimport {\n setSessionPlugins,\n getSessionPlugins,\n} from '@utils/session/sessionPlugins'\nimport type { SessionPlugin } from '@minto-types/plugin'\nimport { PluginManifestSchema } from './pluginValidation'\n\n/**\n * Expand ~ to home directory\n */\nfunction expandHome(input: string): string {\n const trimmed = input.trim()\n if (trimmed === '~') return homedir()\n if (trimmed.startsWith('~/') || trimmed.startsWith('~\\\\')) {\n return join(homedir(), trimmed.slice(2))\n }\n return trimmed\n}\n\n/**\n * Check if a string looks like a glob pattern\n */\nfunction isLikelyGlob(value: string): boolean {\n return /[*?[\\]]/.test(value)\n}\n\n/**\n * Expand plugin directory inputs (handles globs and ~ expansion)\n */\nasync function expandPluginDirInputs(\n pluginDirs: string[],\n baseDir: string,\n): Promise<string[]> {\n const out: string[] = []\n\n for (const raw of pluginDirs) {\n const trimmed = String(raw ?? '').trim()\n if (!trimmed) continue\n\n const expanded = expandHome(trimmed)\n const abs = resolve(baseDir, expanded)\n\n if (isLikelyGlob(trimmed) || isLikelyGlob(expanded)) {\n const patternsToTry =\n expanded !== trimmed ? [expanded, trimmed] : [trimmed]\n let matched = false\n\n for (const pattern of patternsToTry) {\n try {\n const matches = await globLib(pattern, {\n cwd: baseDir,\n absolute: true,\n nodir: false,\n nocase: process.platform === 'win32',\n })\n\n const dirs = matches.filter(match => {\n try {\n return existsSync(match) && statSync(match).isDirectory()\n } catch {\n return false\n }\n })\n\n if (dirs.length > 0) {\n out.push(...dirs)\n matched = true\n break\n }\n } catch {\n // Ignore glob errors\n }\n }\n\n if (matched) continue\n }\n\n out.push(abs)\n }\n\n // Remove duplicates\n const seen = new Set<string>()\n const unique: string[] = []\n for (const item of out) {\n if (seen.has(item)) continue\n seen.add(item)\n unique.push(item)\n }\n\n return unique\n}\n\n/**\n * List directory if it exists and is a directory\n */\nfunction listIfDir(path: string): string[] {\n try {\n if (!existsSync(path)) return []\n if (!statSync(path).isDirectory()) return []\n return [path]\n } catch {\n return []\n }\n}\n\n/**\n * Return file path if it exists and is a file\n */\nfunction fileIfExists(path: string): string[] {\n try {\n if (!existsSync(path)) return []\n if (!statSync(path).isFile()) return []\n return [path]\n } catch {\n return []\n }\n}\n\n/**\n * Resolve manifest paths (handles string or array values)\n */\nfunction resolveManifestPaths(\n rootDir: string,\n value: unknown,\n): { dirs: string[]; files: string[] } {\n const dirs: string[] = []\n const files: string[] = []\n const list = Array.isArray(value) ? value : value ? [value] : []\n\n for (const item of list) {\n if (typeof item !== 'string') continue\n const abs = resolve(rootDir, item)\n dirs.push(...listIfDir(abs))\n files.push(...fileIfExists(abs))\n }\n\n return { dirs, files }\n}\n\n/**\n * Load a plugin from a directory\n *\n * Uses .minto-plugin directory structure or root plugin.json.\n */\nfunction loadPluginFromDir(rootDir: string): SessionPlugin {\n // Check for manifest in order of preference\n const mintoManifestPath = join(rootDir, '.minto-plugin', 'plugin.json')\n const rootManifestPath = join(rootDir, 'plugin.json')\n\n const manifestPath = existsSync(mintoManifestPath)\n ? mintoManifestPath\n : existsSync(rootManifestPath)\n ? rootManifestPath\n : null\n\n if (!manifestPath) {\n throw new Error(\n `Plugin manifest not found (expected .minto-plugin/plugin.json or plugin.json)`,\n )\n }\n\n // Read manifest\n let manifestRaw: string\n try {\n manifestRaw = readFileSync(manifestPath, 'utf8')\n } catch (err) {\n throw new Error(`Failed to read ${manifestPath}: ${String(err)}`)\n }\n\n // Parse JSON\n let manifestJson: unknown\n try {\n manifestJson = JSON.parse(manifestRaw)\n } catch (err) {\n throw new Error(`Invalid JSON in ${manifestPath}: ${String(err)}`)\n }\n\n // Validate manifest\n const parsed = PluginManifestSchema.safeParse(manifestJson)\n if (!parsed.success) {\n throw new Error(\n `Invalid plugin manifest schema in ${manifestPath}: ${parsed.error.message}`,\n )\n }\n\n const name = parsed.data.name\n const manifestData = parsed.data as Record<string, unknown>\n\n // Resolve commands\n const manifestCommands = resolveManifestPaths(rootDir, manifestData.commands)\n const commandsDirs = [\n ...listIfDir(join(rootDir, 'commands')),\n ...manifestCommands.dirs,\n ...manifestCommands.files,\n ]\n\n // Resolve skills\n const skillsDirs = [\n ...listIfDir(join(rootDir, 'skills')),\n ...resolveManifestPaths(rootDir, manifestData.skills).dirs,\n ]\n\n // Resolve agents\n const manifestAgents = resolveManifestPaths(rootDir, manifestData.agents)\n const agentsDirs = [\n ...listIfDir(join(rootDir, 'agents')),\n ...manifestAgents.dirs,\n ...manifestAgents.files,\n ]\n\n // Resolve output styles\n const manifestOutputStyles = resolveManifestPaths(\n rootDir,\n manifestData.outputStyles,\n )\n const outputStylesDirs = [\n ...listIfDir(join(rootDir, 'output-styles')),\n ...manifestOutputStyles.dirs,\n ...manifestOutputStyles.files,\n ]\n\n // Resolve hooks\n const standardHook = fileIfExists(join(rootDir, 'hooks', 'hooks.json'))\n const hookFromManifest = resolveManifestPaths(\n rootDir,\n manifestData.hooks,\n ).files\n const hooksFiles = [...standardHook, ...hookFromManifest]\n\n // Resolve MCP config files\n const mcpConfigFiles = [\n ...fileIfExists(join(rootDir, '.mcp.json')),\n ...fileIfExists(join(rootDir, '.mcp.jsonc')),\n ...resolveManifestPaths(rootDir, manifestData.mcpServers).files,\n ]\n\n // Resolve LSP config files\n const lspConfigFiles = [\n ...fileIfExists(join(rootDir, '.lsp.json')),\n ...resolveManifestPaths(rootDir, manifestData.lspServers).files,\n ]\n\n return {\n name,\n rootDir,\n manifestPath,\n manifest: parsed.data,\n commandsDirs,\n skillsDirs,\n agentsDirs,\n hooksFiles,\n outputStylesDirs,\n mcpConfigFiles,\n lspConfigFiles,\n }\n}\n\n/**\n * Configure session plugins\n *\n * Loads plugins from the specified directories and sets them\n * as the current session plugins.\n */\nexport async function configureSessionPlugins(args: {\n pluginDirs: string[]\n baseDir?: string\n}): Promise<{ plugins: SessionPlugin[]; errors: string[] }> {\n const baseDir = args.baseDir ?? getCwd()\n const dirs = await expandPluginDirInputs(args.pluginDirs ?? [], baseDir)\n\n const plugins: SessionPlugin[] = []\n const errors: string[] = []\n\n for (const dir of dirs) {\n try {\n plugins.push(loadPluginFromDir(dir))\n } catch (err) {\n errors.push(err instanceof Error ? err.message : String(err))\n }\n }\n\n // Set the plugins\n setSessionPlugins(plugins)\n\n // Reload dependent services\n try {\n // Reload custom commands\n const { reloadCustomCommands } = await import('@services/customCommands')\n reloadCustomCommands()\n\n // Clear command cache\n const { getCommands } = await import('@commands')\n ;(getCommands as any).cache?.clear?.()\n\n // Clear MCP tools cache\n const { getClients, getMCPTools } = await import('@services/mcpClient')\n ;(getClients as any).cache?.clear?.()\n ;(getMCPTools as any).cache?.clear?.()\n } catch {\n // Ignore errors during reload - services may not be available\n }\n\n return { plugins, errors }\n}\n\n/**\n * Load plugins from default locations\n *\n * Searches for plugins in:\n * 1. User plugins directory (~/.minto/plugins)\n * 2. Project plugins directory (.minto/plugins)\n */\nexport async function loadDefaultPlugins(): Promise<{\n plugins: SessionPlugin[]\n errors: string[]\n}> {\n const home = homedir()\n const cwd = getCwd()\n\n const pluginDirs = [\n // User-level plugins\n join(home, '.minto', 'plugins'),\n // Project-level plugins\n join(cwd, '.minto', 'plugins'),\n ].filter(dir => existsSync(dir))\n\n return configureSessionPlugins({ pluginDirs, baseDir: cwd })\n}\n\n/**\n * Get all currently loaded plugins\n */\nexport function getLoadedPlugins(): SessionPlugin[] {\n return getSessionPlugins()\n}\n\n/**\n * Check if any plugins are loaded\n */\nexport function hasLoadedPlugins(): boolean {\n return getSessionPlugins().length > 0\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }