@within-7/minto 0.1.7 → 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 (481) 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 +7 -1
  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.map +2 -2
  283. package/dist/tools/BaseTool.js +72 -0
  284. package/dist/tools/BaseTool.js.map +7 -0
  285. package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js +3 -0
  286. package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js.map +2 -2
  287. package/dist/tools/BashTool/BashTool.js +60 -3
  288. package/dist/tools/BashTool/BashTool.js.map +2 -2
  289. package/dist/tools/BashTool/BashToolResultMessage.js +3 -0
  290. package/dist/tools/BashTool/BashToolResultMessage.js.map +2 -2
  291. package/dist/tools/BashTool/OutputLine.js +54 -0
  292. package/dist/tools/BashTool/OutputLine.js.map +2 -2
  293. package/dist/tools/BashTool/prompt.js +192 -3
  294. package/dist/tools/BashTool/prompt.js.map +2 -2
  295. package/dist/tools/FileEditTool/FileEditTool.js +29 -4
  296. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  297. package/dist/tools/FileWriteTool/FileWriteTool.js +5 -5
  298. package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
  299. package/dist/tools/GlobTool/GlobTool.js +4 -2
  300. package/dist/tools/GlobTool/GlobTool.js.map +2 -2
  301. package/dist/tools/GrepTool/GrepTool.js +36 -7
  302. package/dist/tools/GrepTool/GrepTool.js.map +2 -2
  303. package/dist/tools/KillShellTool/KillShellToolResultMessage.js +3 -0
  304. package/dist/tools/KillShellTool/KillShellToolResultMessage.js.map +2 -2
  305. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js +109 -0
  306. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +7 -0
  307. package/dist/tools/ListMcpResourcesTool/prompt.js +19 -0
  308. package/dist/tools/ListMcpResourcesTool/prompt.js.map +7 -0
  309. package/dist/tools/LspTool/LspTool.js +664 -0
  310. package/dist/tools/LspTool/LspTool.js.map +7 -0
  311. package/dist/tools/LspTool/prompt.js +27 -0
  312. package/dist/tools/LspTool/prompt.js.map +7 -0
  313. package/dist/tools/MCPTool/MCPTool.js +9 -1
  314. package/dist/tools/MCPTool/MCPTool.js.map +2 -2
  315. package/dist/tools/MemoryReadTool/MemoryReadTool.js +19 -6
  316. package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
  317. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +6 -6
  318. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
  319. package/dist/tools/MultiEditTool/MultiEditTool.js +19 -2
  320. package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
  321. package/dist/tools/NotebookEditTool/NotebookEditTool.js +5 -1
  322. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
  323. package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +2 -2
  324. package/dist/tools/PlanModeTool/EnterPlanModeTool.js +74 -0
  325. package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +7 -0
  326. package/dist/tools/PlanModeTool/ExitPlanModeTool.js +108 -0
  327. package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +7 -0
  328. package/dist/tools/PlanModeTool/prompt.js +94 -0
  329. package/dist/tools/PlanModeTool/prompt.js.map +7 -0
  330. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js +130 -0
  331. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +7 -0
  332. package/dist/tools/ReadMcpResourceTool/prompt.js +17 -0
  333. package/dist/tools/ReadMcpResourceTool/prompt.js.map +7 -0
  334. package/dist/tools/SkillTool/SkillTool.js +6 -1
  335. package/dist/tools/SkillTool/SkillTool.js.map +2 -2
  336. package/dist/tools/SlashCommandTool/SlashCommandTool.js +260 -0
  337. package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +7 -0
  338. package/dist/tools/SlashCommandTool/prompt.js +35 -0
  339. package/dist/tools/SlashCommandTool/prompt.js.map +7 -0
  340. package/dist/tools/TaskOutputTool/TaskOutputTool.js +189 -0
  341. package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +7 -0
  342. package/dist/tools/TaskOutputTool/prompt.js +15 -0
  343. package/dist/tools/TaskOutputTool/prompt.js.map +7 -0
  344. package/dist/tools/TaskTool/TaskTool.js +302 -104
  345. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  346. package/dist/tools/TaskTool/prompt.js.map +2 -2
  347. package/dist/tools/TodoWriteTool/TodoWriteTool.js +42 -77
  348. package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +2 -2
  349. package/dist/tools/URLFetcherTool/URLFetcherTool.js +4 -1
  350. package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
  351. package/dist/tools/URLFetcherTool/cache.js +55 -8
  352. package/dist/tools/URLFetcherTool/cache.js.map +2 -2
  353. package/dist/tools.js +31 -2
  354. package/dist/tools.js.map +2 -2
  355. package/dist/types/hooks.js +4 -0
  356. package/dist/types/hooks.js.map +2 -2
  357. package/dist/types/marketplace.js.map +2 -2
  358. package/dist/types/messageGroup.js +36 -0
  359. package/dist/types/messageGroup.js.map +7 -0
  360. package/dist/types/plugin.js.map +2 -2
  361. package/dist/types/thinking.js +1 -0
  362. package/dist/types/thinking.js.map +7 -0
  363. package/dist/utils/BackgroundShellManager.js +136 -39
  364. package/dist/utils/BackgroundShellManager.js.map +2 -2
  365. package/dist/utils/MessageBatchBuffer.js +102 -0
  366. package/dist/utils/MessageBatchBuffer.js.map +7 -0
  367. package/dist/utils/PersistentShell.js +151 -1
  368. package/dist/utils/PersistentShell.js.map +2 -2
  369. package/dist/utils/agentLoader.js +1 -23
  370. package/dist/utils/agentLoader.js.map +2 -2
  371. package/dist/utils/agentTranscripts.js +641 -0
  372. package/dist/utils/agentTranscripts.js.map +7 -0
  373. package/dist/utils/animationManager.js +213 -0
  374. package/dist/utils/animationManager.js.map +7 -0
  375. package/dist/utils/animationSync.js +110 -0
  376. package/dist/utils/animationSync.js.map +7 -0
  377. package/dist/utils/asyncFile.js +215 -0
  378. package/dist/utils/asyncFile.js.map +7 -0
  379. package/dist/utils/backgroundAgentManager.js +231 -0
  380. package/dist/utils/backgroundAgentManager.js.map +7 -0
  381. package/dist/utils/config.js +63 -7
  382. package/dist/utils/config.js.map +2 -2
  383. package/dist/utils/conversationRecovery.js +19 -0
  384. package/dist/utils/conversationRecovery.js.map +2 -2
  385. package/dist/utils/exit.js +73 -0
  386. package/dist/utils/exit.js.map +7 -0
  387. package/dist/utils/format.js +73 -5
  388. package/dist/utils/format.js.map +2 -2
  389. package/dist/utils/generators.js +76 -6
  390. package/dist/utils/generators.js.map +2 -2
  391. package/dist/utils/globalErrorHandler.js +149 -0
  392. package/dist/utils/globalErrorHandler.js.map +7 -0
  393. package/dist/utils/groupHandlers/index.js +8 -0
  394. package/dist/utils/groupHandlers/index.js.map +7 -0
  395. package/dist/utils/groupHandlers/parallelTasksHandler.js +140 -0
  396. package/dist/utils/groupHandlers/parallelTasksHandler.js.map +7 -0
  397. package/dist/utils/groupHandlers/taskHandler.js +104 -0
  398. package/dist/utils/groupHandlers/taskHandler.js.map +7 -0
  399. package/dist/utils/groupHandlers/types.js +1 -0
  400. package/dist/utils/groupHandlers/types.js.map +7 -0
  401. package/dist/utils/logRotation.js +224 -0
  402. package/dist/utils/logRotation.js.map +7 -0
  403. package/dist/utils/marketplaceManager.js +3 -5
  404. package/dist/utils/marketplaceManager.js.map +2 -2
  405. package/dist/utils/memSafety.js +264 -0
  406. package/dist/utils/memSafety.js.map +7 -0
  407. package/dist/utils/messageGroupManager.js +274 -0
  408. package/dist/utils/messageGroupManager.js.map +7 -0
  409. package/dist/utils/messages.js +13 -4
  410. package/dist/utils/messages.js.map +2 -2
  411. package/dist/utils/model.js +119 -15
  412. package/dist/utils/model.js.map +3 -3
  413. package/dist/utils/permissions/filesystem.js +157 -5
  414. package/dist/utils/permissions/filesystem.js.map +2 -2
  415. package/dist/utils/plan/planMode.js +143 -0
  416. package/dist/utils/plan/planMode.js.map +7 -0
  417. package/dist/utils/pluginLoader.js +17 -21
  418. package/dist/utils/pluginLoader.js.map +2 -2
  419. package/dist/utils/ripgrep.js +55 -2
  420. package/dist/utils/ripgrep.js.map +2 -2
  421. package/dist/utils/sanitizeInput.js +32 -0
  422. package/dist/utils/sanitizeInput.js.map +7 -0
  423. package/dist/utils/secureKeyStorage.js +312 -0
  424. package/dist/utils/secureKeyStorage.js.map +7 -0
  425. package/dist/utils/session/sessionPlugins.js +67 -0
  426. package/dist/utils/session/sessionPlugins.js.map +7 -0
  427. package/dist/utils/taskDisplayUtils.js +257 -0
  428. package/dist/utils/taskDisplayUtils.js.map +7 -0
  429. package/dist/utils/teamConfig.js +2 -1
  430. package/dist/utils/teamConfig.js.map +2 -2
  431. package/dist/utils/todoStorage.js +92 -2
  432. package/dist/utils/todoStorage.js.map +2 -2
  433. package/dist/utils/toolTimeout.js +136 -0
  434. package/dist/utils/toolTimeout.js.map +7 -0
  435. package/dist/utils/tooling/safeRender.js +115 -0
  436. package/dist/utils/tooling/safeRender.js.map +7 -0
  437. package/dist/utils/userFriendlyError.js +346 -0
  438. package/dist/utils/userFriendlyError.js.map +7 -0
  439. package/dist/utils/vendor/ripgrep/arm64-darwin/rg +0 -0
  440. package/dist/version.js +2 -2
  441. package/dist/version.js.map +1 -1
  442. package/package.json +14 -4
  443. package/scripts/postinstall.js +128 -38
  444. package/dist/commands/agents.js +0 -2086
  445. package/dist/commands/agents.js.map +0 -7
  446. package/dist/commands/build.js +0 -74
  447. package/dist/commands/build.js.map +0 -7
  448. package/dist/commands/compression.js +0 -57
  449. package/dist/commands/compression.js.map +0 -7
  450. package/dist/commands/listen.js +0 -37
  451. package/dist/commands/listen.js.map +0 -7
  452. package/dist/commands/login.js +0 -37
  453. package/dist/commands/login.js.map +0 -7
  454. package/dist/commands/logout.js +0 -33
  455. package/dist/commands/logout.js.map +0 -7
  456. package/dist/commands/mcp.js +0 -40
  457. package/dist/commands/mcp.js.map +0 -7
  458. package/dist/commands/mcp_refresh.js +0 -40
  459. package/dist/commands/mcp_refresh.js.map +0 -7
  460. package/dist/commands/modelstatus.js +0 -21
  461. package/dist/commands/modelstatus.js.map +0 -7
  462. package/dist/commands/onboarding.js +0 -36
  463. package/dist/commands/onboarding.js.map +0 -7
  464. package/dist/commands/plugin-interactive.js +0 -446
  465. package/dist/commands/plugin-interactive.js.map +0 -7
  466. package/dist/commands/pr_comments.js +0 -61
  467. package/dist/commands/pr_comments.js.map +0 -7
  468. package/dist/commands/release-notes.js +0 -30
  469. package/dist/commands/release-notes.js.map +0 -7
  470. package/dist/commands/review.js +0 -51
  471. package/dist/commands/review.js.map +0 -7
  472. package/dist/components/Bug.js +0 -147
  473. package/dist/components/Bug.js.map +0 -7
  474. package/dist/components/ModelSelector.js +0 -2062
  475. package/dist/components/ModelSelector.js.map +0 -7
  476. package/dist/components/ModelStatusDisplay.js +0 -87
  477. package/dist/components/ModelStatusDisplay.js.map +0 -7
  478. package/dist/entrypoints/cli-wrapper.js +0 -61
  479. package/dist/entrypoints/cli-wrapper.js.map +0 -7
  480. package/dist/screens/Doctor.js +0 -22
  481. package/dist/screens/Doctor.js.map +0 -7
@@ -0,0 +1,281 @@
1
+ import { createUserMessage } from "../utils/messages.js";
2
+ import { countTokens } from "../utils/tokens.js";
3
+ import crypto from "crypto";
4
+ const DEFAULT_OPTIONS = {
5
+ preserveDecisions: true,
6
+ preserveCodeChanges: true,
7
+ summarizeTools: true,
8
+ maxDecisions: 10,
9
+ maxCodeChanges: 20
10
+ };
11
+ class IntelligentCompactor {
12
+ options;
13
+ constructor(options) {
14
+ this.options = { ...DEFAULT_OPTIONS, ...options };
15
+ }
16
+ updateOptions(options) {
17
+ this.options = { ...this.options, ...options };
18
+ }
19
+ async compact(messages, options) {
20
+ const opts = { ...this.options, ...options };
21
+ const originalTokens = countTokens(messages);
22
+ const decisions = opts.preserveDecisions ? this.extractDecisions(messages) : [];
23
+ const codeChanges = opts.preserveCodeChanges ? this.extractCodeChanges(messages) : [];
24
+ const toolSummaries = opts.summarizeTools ? this.summarizeToolOutputs(messages) : [];
25
+ const focusSummary = opts.focus ? this.generateFocusSummary(messages, opts.focus) : void 0;
26
+ const compressedMessages = this.buildCompressedMessages(
27
+ decisions,
28
+ codeChanges,
29
+ toolSummaries,
30
+ focusSummary,
31
+ opts
32
+ );
33
+ const compressedTokens = countTokens(compressedMessages);
34
+ return {
35
+ messages: compressedMessages,
36
+ decisions,
37
+ codeChanges,
38
+ toolSummaries,
39
+ focusSummary,
40
+ originalTokens,
41
+ compressedTokens,
42
+ compressionRatio: originalTokens > 0 ? compressedTokens / originalTokens : 1
43
+ };
44
+ }
45
+ extractDecisions(messages) {
46
+ const decisions = [];
47
+ const maxDecisions = this.options.maxDecisions ?? 10;
48
+ const decisionPatterns = [
49
+ /decided to\s+(.+?)(?:\.|$)/gi,
50
+ /we(?:'ll| will)\s+(.+?)(?:\.|$)/gi,
51
+ /(?:let's|i'll)\s+(.+?)(?:\.|$)/gi,
52
+ /(?:should|will)\s+use\s+(.+?)(?:\.|$)/gi,
53
+ /(?:going with|chose|selected)\s+(.+?)(?:\.|$)/gi,
54
+ /implemented\s+(.+?)(?:\.|$)/gi
55
+ ];
56
+ const rationalePatterns = [
57
+ /because\s+(.+?)(?:\.|$)/gi,
58
+ /since\s+(.+?)(?:\.|$)/gi,
59
+ /due to\s+(.+?)(?:\.|$)/gi
60
+ ];
61
+ messages.forEach((msg, index) => {
62
+ if (msg.type !== "assistant") return;
63
+ const content = this.getMessageText(msg);
64
+ if (!content) return;
65
+ for (const pattern of decisionPatterns) {
66
+ pattern.lastIndex = 0;
67
+ let match;
68
+ while ((match = pattern.exec(content)) !== null) {
69
+ if (decisions.length >= maxDecisions) break;
70
+ const description = match[1]?.trim();
71
+ if (!description || description.length < 10) continue;
72
+ let rationale = "";
73
+ for (const rPattern of rationalePatterns) {
74
+ rPattern.lastIndex = Math.max(0, match.index - 100);
75
+ const rMatch = rPattern.exec(content);
76
+ if (rMatch && rMatch[1]) {
77
+ rationale = rMatch[1].trim();
78
+ break;
79
+ }
80
+ }
81
+ const importance = this.calculateDecisionImportance(
82
+ description,
83
+ index,
84
+ messages.length
85
+ );
86
+ decisions.push({
87
+ description: description.slice(0, 200),
88
+ rationale: rationale.slice(0, 150),
89
+ messageIndex: index,
90
+ importance
91
+ });
92
+ }
93
+ }
94
+ });
95
+ return decisions.sort((a, b) => b.importance - a.importance).slice(0, maxDecisions);
96
+ }
97
+ extractCodeChanges(messages) {
98
+ const changes = [];
99
+ const maxChanges = this.options.maxCodeChanges ?? 20;
100
+ const seenFiles = /* @__PURE__ */ new Set();
101
+ messages.forEach((msg, index) => {
102
+ if (msg.type !== "assistant") return;
103
+ if (!Array.isArray(msg.message.content)) return;
104
+ for (const content of msg.message.content) {
105
+ if (content.type !== "tool_use") continue;
106
+ const toolName = content.name;
107
+ const input = content.input;
108
+ let filePath;
109
+ let changeType;
110
+ let description = "";
111
+ if (toolName === "Write" || toolName === "FileWrite") {
112
+ filePath = input.file_path || input.path;
113
+ changeType = "create";
114
+ description = "Created file";
115
+ } else if (toolName === "Edit" || toolName === "FileEdit" || toolName === "MultiEdit") {
116
+ filePath = input.file_path || input.path;
117
+ changeType = "modify";
118
+ const oldStr = (input.old_string || "").slice(0, 50);
119
+ const newStr = (input.new_string || "").slice(0, 50);
120
+ description = "Modified: " + oldStr + " -> " + newStr;
121
+ }
122
+ if (filePath && changeType && !seenFiles.has(filePath)) {
123
+ seenFiles.add(filePath);
124
+ changes.push({
125
+ filePath: filePath.slice(0, 200),
126
+ changeType,
127
+ description: description.slice(0, 100),
128
+ messageIndex: index
129
+ });
130
+ if (changes.length >= maxChanges) break;
131
+ }
132
+ }
133
+ });
134
+ return changes;
135
+ }
136
+ summarizeToolOutputs(messages) {
137
+ const toolStats = /* @__PURE__ */ new Map();
138
+ messages.forEach((msg) => {
139
+ if (msg.type !== "assistant") return;
140
+ if (!Array.isArray(msg.message.content)) return;
141
+ for (const content of msg.message.content) {
142
+ if (content.type === "tool_use") {
143
+ const toolName = content.name;
144
+ if (!toolStats.has(toolName)) {
145
+ toolStats.set(toolName, { invocations: 0 });
146
+ }
147
+ const stats = toolStats.get(toolName);
148
+ stats.invocations++;
149
+ }
150
+ }
151
+ });
152
+ const summaries = [];
153
+ for (const [toolName, stats] of toolStats) {
154
+ summaries.push({
155
+ toolName,
156
+ invocationCount: stats.invocations,
157
+ summary: "Used " + stats.invocations + " time" + (stats.invocations > 1 ? "s" : ""),
158
+ successRate: 1
159
+ });
160
+ }
161
+ return summaries.sort((a, b) => b.invocationCount - a.invocationCount);
162
+ }
163
+ generateFocusSummary(messages, focus) {
164
+ const focusLower = focus.toLowerCase();
165
+ const relevantContent = [];
166
+ messages.forEach((msg) => {
167
+ const text = this.getMessageText(msg);
168
+ if (!text) return;
169
+ const lines = text.split("\n");
170
+ for (const line of lines) {
171
+ if (line.toLowerCase().includes(focusLower)) {
172
+ relevantContent.push(line.trim());
173
+ }
174
+ }
175
+ });
176
+ if (relevantContent.length === 0) {
177
+ return 'No specific content found related to "' + focus + '".';
178
+ }
179
+ const uniqueContent = [...new Set(relevantContent)].slice(0, 10);
180
+ return 'Focus area: "' + focus + '"\n\nRelevant points:\n' + uniqueContent.map((c) => "- " + c).join("\n");
181
+ }
182
+ buildCompressedMessages(decisions, codeChanges, toolSummaries, focusSummary, options) {
183
+ const sections = [];
184
+ if (focusSummary) {
185
+ sections.push("## Focus Summary\n" + focusSummary);
186
+ }
187
+ if (decisions.length > 0 && options.preserveDecisions) {
188
+ const decisionList = decisions.map((d) => {
189
+ const rationale = d.rationale ? " (" + d.rationale + ")" : "";
190
+ return "- " + d.description + rationale;
191
+ }).join("\n");
192
+ sections.push("## Key Decisions\n" + decisionList);
193
+ }
194
+ if (codeChanges.length > 0 && options.preserveCodeChanges) {
195
+ const changeList = codeChanges.map(
196
+ (c) => "- [" + c.changeType.toUpperCase() + "] " + c.filePath + ": " + c.description
197
+ ).join("\n");
198
+ sections.push("## Code Changes\n" + changeList);
199
+ }
200
+ if (toolSummaries.length > 0 && options.summarizeTools) {
201
+ const toolList = toolSummaries.slice(0, 10).map((t) => "- " + t.toolName + ": " + t.summary).join("\n");
202
+ sections.push("## Tool Usage\n" + toolList);
203
+ }
204
+ const summaryText = sections.join("\n\n");
205
+ const summaryMessage = {
206
+ type: "assistant",
207
+ message: {
208
+ role: "assistant",
209
+ content: [
210
+ {
211
+ type: "text",
212
+ text: "[INTELLIGENT CONTEXT COMPRESSION]\n\n" + summaryText + "\n\n[END COMPRESSION]"
213
+ }
214
+ ]
215
+ },
216
+ costUSD: 0,
217
+ durationMs: 0,
218
+ uuid: crypto.randomUUID()
219
+ };
220
+ return [
221
+ createUserMessage(
222
+ options.focus ? 'Context compressed with focus on: "' + options.focus + '".' : "Context intelligently compressed. Key decisions and changes preserved."
223
+ ),
224
+ summaryMessage
225
+ ];
226
+ }
227
+ getMessageText(msg) {
228
+ if (msg.type === "user" || msg.type === "assistant") {
229
+ const content = msg.message.content;
230
+ if (typeof content === "string") return content;
231
+ if (Array.isArray(content)) {
232
+ return content.filter((c) => c.type === "text").map((c) => c.text).join("\n");
233
+ }
234
+ }
235
+ return null;
236
+ }
237
+ calculateDecisionImportance(description, messageIndex, totalMessages) {
238
+ let importance = 0.5;
239
+ const recencyFactor = messageIndex / totalMessages;
240
+ importance += recencyFactor * 0.2;
241
+ const highImportanceKeywords = [
242
+ "architecture",
243
+ "design",
244
+ "security",
245
+ "critical",
246
+ "important",
247
+ "must",
248
+ "required",
249
+ "essential",
250
+ "key",
251
+ "core"
252
+ ];
253
+ const descLower = description.toLowerCase();
254
+ for (const keyword of highImportanceKeywords) {
255
+ if (descLower.includes(keyword)) {
256
+ importance += 0.1;
257
+ break;
258
+ }
259
+ }
260
+ if (description.length > 50) {
261
+ importance += 0.1;
262
+ }
263
+ return Math.min(1, importance);
264
+ }
265
+ }
266
+ let globalCompactor = null;
267
+ function getIntelligentCompactor() {
268
+ if (!globalCompactor) {
269
+ globalCompactor = new IntelligentCompactor();
270
+ }
271
+ return globalCompactor;
272
+ }
273
+ function resetIntelligentCompactor() {
274
+ globalCompactor = null;
275
+ }
276
+ export {
277
+ IntelligentCompactor,
278
+ getIntelligentCompactor,
279
+ resetIntelligentCompactor
280
+ };
281
+ //# sourceMappingURL=intelligentCompactor.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/services/intelligentCompactor.ts"],
4
+ "sourcesContent": ["/**\n * Intelligent Compactor Service\n *\n * Enhanced compression service with focus-aware summarization and\n * intelligent decision/code change preservation.\n */\n\nimport { Message } from '@query'\nimport { createUserMessage } from '@utils/messages'\nimport { countTokens } from '@utils/tokens'\nimport crypto from 'crypto'\nimport type { UUID } from '@minto-types/common'\n\nexport interface IntelligentCompactOptions {\n focus?: string\n preserveDecisions: boolean\n preserveCodeChanges: boolean\n summarizeTools: boolean\n maxDecisions?: number\n maxCodeChanges?: number\n}\n\nexport interface ExtractedDecision {\n description: string\n rationale: string\n messageIndex: number\n importance: number\n}\n\nexport interface ExtractedCodeChange {\n filePath: string\n changeType: 'create' | 'modify' | 'delete' | 'rename'\n description: string\n messageIndex: number\n}\n\nexport interface ToolOutputSummary {\n toolName: string\n invocationCount: number\n summary: string\n successRate: number\n}\n\nexport interface CompactedContext {\n messages: Message[]\n decisions: ExtractedDecision[]\n codeChanges: ExtractedCodeChange[]\n toolSummaries: ToolOutputSummary[]\n focusSummary?: string\n originalTokens: number\n compressedTokens: number\n compressionRatio: number\n}\n\nconst DEFAULT_OPTIONS: IntelligentCompactOptions = {\n preserveDecisions: true,\n preserveCodeChanges: true,\n summarizeTools: true,\n maxDecisions: 10,\n maxCodeChanges: 20,\n}\n\nexport class IntelligentCompactor {\n private options: IntelligentCompactOptions\n\n constructor(options?: Partial<IntelligentCompactOptions>) {\n this.options = { ...DEFAULT_OPTIONS, ...options }\n }\n\n updateOptions(options: Partial<IntelligentCompactOptions>): void {\n this.options = { ...this.options, ...options }\n }\n\n async compact(\n messages: Message[],\n options?: Partial<IntelligentCompactOptions>,\n ): Promise<CompactedContext> {\n const opts = { ...this.options, ...options }\n const originalTokens = countTokens(messages)\n\n const decisions = opts.preserveDecisions\n ? this.extractDecisions(messages)\n : []\n const codeChanges = opts.preserveCodeChanges\n ? this.extractCodeChanges(messages)\n : []\n const toolSummaries = opts.summarizeTools\n ? this.summarizeToolOutputs(messages)\n : []\n\n const focusSummary = opts.focus\n ? this.generateFocusSummary(messages, opts.focus)\n : undefined\n\n const compressedMessages = this.buildCompressedMessages(\n decisions,\n codeChanges,\n toolSummaries,\n focusSummary,\n opts,\n )\n\n const compressedTokens = countTokens(compressedMessages)\n\n return {\n messages: compressedMessages,\n decisions,\n codeChanges,\n toolSummaries,\n focusSummary,\n originalTokens,\n compressedTokens,\n compressionRatio:\n originalTokens > 0 ? compressedTokens / originalTokens : 1,\n }\n }\n\n private extractDecisions(messages: Message[]): ExtractedDecision[] {\n const decisions: ExtractedDecision[] = []\n const maxDecisions = this.options.maxDecisions ?? 10\n\n const decisionPatterns = [\n /decided to\\s+(.+?)(?:\\.|$)/gi,\n /we(?:'ll| will)\\s+(.+?)(?:\\.|$)/gi,\n /(?:let's|i'll)\\s+(.+?)(?:\\.|$)/gi,\n /(?:should|will)\\s+use\\s+(.+?)(?:\\.|$)/gi,\n /(?:going with|chose|selected)\\s+(.+?)(?:\\.|$)/gi,\n /implemented\\s+(.+?)(?:\\.|$)/gi,\n ]\n\n const rationalePatterns = [\n /because\\s+(.+?)(?:\\.|$)/gi,\n /since\\s+(.+?)(?:\\.|$)/gi,\n /due to\\s+(.+?)(?:\\.|$)/gi,\n ]\n\n messages.forEach((msg, index) => {\n if (msg.type !== 'assistant') return\n\n const content = this.getMessageText(msg)\n if (!content) return\n\n for (const pattern of decisionPatterns) {\n pattern.lastIndex = 0\n let match\n while ((match = pattern.exec(content)) !== null) {\n if (decisions.length >= maxDecisions) break\n\n const description = match[1]?.trim()\n if (!description || description.length < 10) continue\n\n let rationale = ''\n for (const rPattern of rationalePatterns) {\n rPattern.lastIndex = Math.max(0, match.index - 100)\n const rMatch = rPattern.exec(content)\n if (rMatch && rMatch[1]) {\n rationale = rMatch[1].trim()\n break\n }\n }\n\n const importance = this.calculateDecisionImportance(\n description,\n index,\n messages.length,\n )\n\n decisions.push({\n description: description.slice(0, 200),\n rationale: rationale.slice(0, 150),\n messageIndex: index,\n importance,\n })\n }\n }\n })\n\n return decisions\n .sort((a, b) => b.importance - a.importance)\n .slice(0, maxDecisions)\n }\n\n private extractCodeChanges(messages: Message[]): ExtractedCodeChange[] {\n const changes: ExtractedCodeChange[] = []\n const maxChanges = this.options.maxCodeChanges ?? 20\n const seenFiles = new Set<string>()\n\n messages.forEach((msg, index) => {\n if (msg.type !== 'assistant') return\n if (!Array.isArray(msg.message.content)) return\n\n for (const content of msg.message.content) {\n if (content.type !== 'tool_use') continue\n\n const toolName = content.name\n const input = content.input as Record<string, unknown>\n\n let filePath: string | undefined\n let changeType: ExtractedCodeChange['changeType'] | undefined\n let description = ''\n\n if (toolName === 'Write' || toolName === 'FileWrite') {\n filePath = (input.file_path as string) || (input.path as string)\n changeType = 'create'\n description = 'Created file'\n } else if (\n toolName === 'Edit' ||\n toolName === 'FileEdit' ||\n toolName === 'MultiEdit'\n ) {\n filePath = (input.file_path as string) || (input.path as string)\n changeType = 'modify'\n const oldStr = ((input.old_string as string) || '').slice(0, 50)\n const newStr = ((input.new_string as string) || '').slice(0, 50)\n description = 'Modified: ' + oldStr + ' -> ' + newStr\n }\n\n if (filePath && changeType && !seenFiles.has(filePath)) {\n seenFiles.add(filePath)\n changes.push({\n filePath: filePath.slice(0, 200),\n changeType,\n description: description.slice(0, 100),\n messageIndex: index,\n })\n\n if (changes.length >= maxChanges) break\n }\n }\n })\n\n return changes\n }\n\n private summarizeToolOutputs(messages: Message[]): ToolOutputSummary[] {\n const toolStats = new Map<string, { invocations: number }>()\n\n messages.forEach(msg => {\n if (msg.type !== 'assistant') return\n if (!Array.isArray(msg.message.content)) return\n\n for (const content of msg.message.content) {\n if (content.type === 'tool_use') {\n const toolName = content.name\n if (!toolStats.has(toolName)) {\n toolStats.set(toolName, { invocations: 0 })\n }\n const stats = toolStats.get(toolName)!\n stats.invocations++\n }\n }\n })\n\n const summaries: ToolOutputSummary[] = []\n for (const [toolName, stats] of toolStats) {\n summaries.push({\n toolName,\n invocationCount: stats.invocations,\n summary:\n 'Used ' +\n stats.invocations +\n ' time' +\n (stats.invocations > 1 ? 's' : ''),\n successRate: 1,\n })\n }\n\n return summaries.sort((a, b) => b.invocationCount - a.invocationCount)\n }\n\n private generateFocusSummary(messages: Message[], focus: string): string {\n const focusLower = focus.toLowerCase()\n const relevantContent: string[] = []\n\n messages.forEach(msg => {\n const text = this.getMessageText(msg)\n if (!text) return\n\n const lines = text.split('\\n')\n for (const line of lines) {\n if (line.toLowerCase().includes(focusLower)) {\n relevantContent.push(line.trim())\n }\n }\n })\n\n if (relevantContent.length === 0) {\n return 'No specific content found related to \"' + focus + '\".'\n }\n\n const uniqueContent = [...new Set(relevantContent)].slice(0, 10)\n return (\n 'Focus area: \"' +\n focus +\n '\"\\n\\nRelevant points:\\n' +\n uniqueContent.map(c => '- ' + c).join('\\n')\n )\n }\n\n private buildCompressedMessages(\n decisions: ExtractedDecision[],\n codeChanges: ExtractedCodeChange[],\n toolSummaries: ToolOutputSummary[],\n focusSummary: string | undefined,\n options: IntelligentCompactOptions,\n ): Message[] {\n const sections: string[] = []\n\n if (focusSummary) {\n sections.push('## Focus Summary\\n' + focusSummary)\n }\n\n if (decisions.length > 0 && options.preserveDecisions) {\n const decisionList = decisions\n .map(d => {\n const rationale = d.rationale ? ' (' + d.rationale + ')' : ''\n return '- ' + d.description + rationale\n })\n .join('\\n')\n sections.push('## Key Decisions\\n' + decisionList)\n }\n\n if (codeChanges.length > 0 && options.preserveCodeChanges) {\n const changeList = codeChanges\n .map(\n c =>\n '- [' +\n c.changeType.toUpperCase() +\n '] ' +\n c.filePath +\n ': ' +\n c.description,\n )\n .join('\\n')\n sections.push('## Code Changes\\n' + changeList)\n }\n\n if (toolSummaries.length > 0 && options.summarizeTools) {\n const toolList = toolSummaries\n .slice(0, 10)\n .map(t => '- ' + t.toolName + ': ' + t.summary)\n .join('\\n')\n sections.push('## Tool Usage\\n' + toolList)\n }\n\n const summaryText = sections.join('\\n\\n')\n\n const summaryMessage: Message = {\n type: 'assistant',\n message: {\n role: 'assistant',\n content: [\n {\n type: 'text',\n text:\n '[INTELLIGENT CONTEXT COMPRESSION]\\n\\n' +\n summaryText +\n '\\n\\n[END COMPRESSION]',\n },\n ],\n },\n costUSD: 0,\n durationMs: 0,\n uuid: crypto.randomUUID() as UUID,\n }\n\n return [\n createUserMessage(\n options.focus\n ? 'Context compressed with focus on: \"' + options.focus + '\".'\n : 'Context intelligently compressed. Key decisions and changes preserved.',\n ),\n summaryMessage,\n ]\n }\n\n private getMessageText(msg: Message): string | null {\n if (msg.type === 'user' || msg.type === 'assistant') {\n const content = msg.message.content\n if (typeof content === 'string') return content\n if (Array.isArray(content)) {\n return content\n .filter(c => c.type === 'text')\n .map(c => (c as { type: 'text'; text: string }).text)\n .join('\\n')\n }\n }\n return null\n }\n\n private calculateDecisionImportance(\n description: string,\n messageIndex: number,\n totalMessages: number,\n ): number {\n let importance = 0.5\n const recencyFactor = messageIndex / totalMessages\n importance += recencyFactor * 0.2\n\n const highImportanceKeywords = [\n 'architecture',\n 'design',\n 'security',\n 'critical',\n 'important',\n 'must',\n 'required',\n 'essential',\n 'key',\n 'core',\n ]\n\n const descLower = description.toLowerCase()\n for (const keyword of highImportanceKeywords) {\n if (descLower.includes(keyword)) {\n importance += 0.1\n break\n }\n }\n\n if (description.length > 50) {\n importance += 0.1\n }\n\n return Math.min(1, importance)\n }\n}\n\nlet globalCompactor: IntelligentCompactor | null = null\n\nexport function getIntelligentCompactor(): IntelligentCompactor {\n if (!globalCompactor) {\n globalCompactor = new IntelligentCompactor()\n }\n return globalCompactor\n}\n\nexport function resetIntelligentCompactor(): void {\n globalCompactor = null\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,109 @@
1
+ import { existsSync, readFileSync } from "fs";
2
+ import { z } from "zod";
3
+ import { safeParseJSON } from "../utils/json.js";
4
+ import { getAllPluginLspConfigFiles } from "../utils/session/sessionPlugins.js";
5
+ const LspServerConfigSchema = z.object({
6
+ /** Command to start the LSP server */
7
+ command: z.string(),
8
+ /** Arguments to pass to the command */
9
+ args: z.array(z.string()).optional().default([]),
10
+ /** Transport type */
11
+ transport: z.enum(["stdio", "socket"]).optional().default("stdio"),
12
+ /** Environment variables */
13
+ env: z.record(z.string()).optional().default({}),
14
+ /** File extension to language ID mapping */
15
+ extensionToLanguage: z.record(z.string()).optional().default({}),
16
+ /** Initialization options for the LSP server */
17
+ initializationOptions: z.unknown().optional(),
18
+ /** Server settings */
19
+ settings: z.unknown().optional(),
20
+ /** Workspace folder path */
21
+ workspaceFolder: z.string().optional(),
22
+ /** Startup timeout in milliseconds */
23
+ startupTimeout: z.number().optional().default(3e4),
24
+ /** Shutdown timeout in milliseconds */
25
+ shutdownTimeout: z.number().optional().default(5e3),
26
+ /** Restart on crash */
27
+ restartOnCrash: z.boolean().optional().default(true),
28
+ /** Maximum restart attempts */
29
+ maxRestarts: z.number().optional().default(3),
30
+ /** Logging configuration */
31
+ loggingConfig: z.unknown().optional()
32
+ });
33
+ const LspConfigSchema = z.record(LspServerConfigSchema);
34
+ function loadLspConfigFile(filePath) {
35
+ if (!existsSync(filePath)) {
36
+ return null;
37
+ }
38
+ try {
39
+ const content = readFileSync(filePath, "utf-8");
40
+ const json = safeParseJSON(content);
41
+ if (!json) {
42
+ console.warn(`Invalid JSON in LSP config file: ${filePath}`);
43
+ return null;
44
+ }
45
+ const parsed = LspConfigSchema.safeParse(json);
46
+ if (!parsed.success) {
47
+ console.warn(
48
+ `Invalid LSP config schema in ${filePath}: ${parsed.error.message}`
49
+ );
50
+ return null;
51
+ }
52
+ return parsed.data;
53
+ } catch (error) {
54
+ console.warn(`Failed to load LSP config from ${filePath}:`, error);
55
+ return null;
56
+ }
57
+ }
58
+ function loadAllLspServers() {
59
+ const servers = [];
60
+ const configFiles = getAllPluginLspConfigFiles();
61
+ for (const configPath of configFiles) {
62
+ const config = loadLspConfigFile(configPath);
63
+ if (!config) continue;
64
+ for (const [languageId, serverConfig] of Object.entries(config)) {
65
+ servers.push({
66
+ languageId,
67
+ config: serverConfig,
68
+ configPath
69
+ });
70
+ }
71
+ }
72
+ return servers;
73
+ }
74
+ function getLspServerForLanguage(languageId) {
75
+ const servers = loadAllLspServers();
76
+ return servers.find((s) => s.languageId === languageId);
77
+ }
78
+ function getLspServerForExtension(extension) {
79
+ const servers = loadAllLspServers();
80
+ const ext = extension.startsWith(".") ? extension.slice(1) : extension;
81
+ for (const server of servers) {
82
+ if (server.config.extensionToLanguage?.[ext]) {
83
+ return server;
84
+ }
85
+ }
86
+ return void 0;
87
+ }
88
+ function getSupportedExtensions() {
89
+ const servers = loadAllLspServers();
90
+ const extensions = /* @__PURE__ */ new Set();
91
+ for (const server of servers) {
92
+ if (server.config.extensionToLanguage) {
93
+ for (const ext of Object.keys(server.config.extensionToLanguage)) {
94
+ extensions.add(ext);
95
+ }
96
+ }
97
+ }
98
+ return Array.from(extensions);
99
+ }
100
+ export {
101
+ LspConfigSchema,
102
+ LspServerConfigSchema,
103
+ getLspServerForExtension,
104
+ getLspServerForLanguage,
105
+ getSupportedExtensions,
106
+ loadAllLspServers,
107
+ loadLspConfigFile
108
+ };
109
+ //# sourceMappingURL=lspConfig.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/services/lspConfig.ts"],
4
+ "sourcesContent": ["/**\n * LSP Server Configuration\n *\n * Handles loading and managing LSP server configurations from plugins.\n * Compatible with Claude Code CLI .lsp.json format.\n */\n\nimport { existsSync, readFileSync } from 'fs'\nimport { z } from 'zod'\nimport { safeParseJSON } from '@utils/json'\nimport { getAllPluginLspConfigFiles } from '@utils/session/sessionPlugins'\n\n/**\n * LSP Server Configuration Schema\n */\nexport const LspServerConfigSchema = z.object({\n /** Command to start the LSP server */\n command: z.string(),\n\n /** Arguments to pass to the command */\n args: z.array(z.string()).optional().default([]),\n\n /** Transport type */\n transport: z.enum(['stdio', 'socket']).optional().default('stdio'),\n\n /** Environment variables */\n env: z.record(z.string()).optional().default({}),\n\n /** File extension to language ID mapping */\n extensionToLanguage: z.record(z.string()).optional().default({}),\n\n /** Initialization options for the LSP server */\n initializationOptions: z.unknown().optional(),\n\n /** Server settings */\n settings: z.unknown().optional(),\n\n /** Workspace folder path */\n workspaceFolder: z.string().optional(),\n\n /** Startup timeout in milliseconds */\n startupTimeout: z.number().optional().default(30000),\n\n /** Shutdown timeout in milliseconds */\n shutdownTimeout: z.number().optional().default(5000),\n\n /** Restart on crash */\n restartOnCrash: z.boolean().optional().default(true),\n\n /** Maximum restart attempts */\n maxRestarts: z.number().optional().default(3),\n\n /** Logging configuration */\n loggingConfig: z.unknown().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(LspServerConfigSchema)\n\nexport type LspConfig = z.infer<typeof LspConfigSchema>\n\n/**\n * Loaded LSP server with metadata\n */\nexport interface LoadedLspServer {\n /** Language ID (key from config) */\n languageId: string\n\n /** Server configuration */\n config: LspServerConfig\n\n /** Source file path */\n configPath: string\n\n /** Source plugin name (if from plugin) */\n pluginName?: string\n}\n\n/**\n * Load LSP configuration from a file\n */\nexport function loadLspConfigFile(filePath: string): LspConfig | null {\n if (!existsSync(filePath)) {\n return null\n }\n\n try {\n const content = readFileSync(filePath, 'utf-8')\n const json = safeParseJSON(content)\n\n if (!json) {\n console.warn(`Invalid JSON in LSP config file: ${filePath}`)\n return null\n }\n\n const parsed = LspConfigSchema.safeParse(json)\n if (!parsed.success) {\n console.warn(\n `Invalid LSP config schema in ${filePath}: ${parsed.error.message}`,\n )\n return null\n }\n\n return parsed.data\n } catch (error) {\n console.warn(`Failed to load LSP config from ${filePath}:`, error)\n return null\n }\n}\n\n/**\n * Load all LSP servers from plugins\n */\nexport function loadAllLspServers(): LoadedLspServer[] {\n const servers: LoadedLspServer[] = []\n const configFiles = getAllPluginLspConfigFiles()\n\n for (const configPath of configFiles) {\n const config = loadLspConfigFile(configPath)\n if (!config) continue\n\n for (const [languageId, serverConfig] of Object.entries(config)) {\n servers.push({\n languageId,\n config: serverConfig,\n configPath,\n })\n }\n }\n\n return servers\n}\n\n/**\n * Get LSP server for a specific language\n */\nexport function getLspServerForLanguage(\n languageId: string,\n): LoadedLspServer | undefined {\n const servers = loadAllLspServers()\n return servers.find(s => s.languageId === languageId)\n}\n\n/**\n * Get LSP server for a file extension\n */\nexport function getLspServerForExtension(\n extension: string,\n): LoadedLspServer | undefined {\n const servers = loadAllLspServers()\n\n // Normalize extension (remove leading dot)\n const ext = extension.startsWith('.') ? extension.slice(1) : extension\n\n for (const server of servers) {\n if (server.config.extensionToLanguage?.[ext]) {\n return server\n }\n }\n\n return undefined\n}\n\n/**\n * Get all supported file extensions\n */\nexport function getSupportedExtensions(): string[] {\n const servers = loadAllLspServers()\n const extensions = new Set<string>()\n\n for (const server of servers) {\n if (server.config.extensionToLanguage) {\n for (const ext of Object.keys(server.config.extensionToLanguage)) {\n extensions.add(ext)\n }\n }\n }\n\n return Array.from(extensions)\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }