@within-7/minto 0.1.6 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (487) hide show
  1. package/cli.js +155 -37
  2. package/dist/Tool.js +38 -0
  3. package/dist/Tool.js.map +3 -3
  4. package/dist/commands/agents/AgentsCommand.js +52 -26
  5. package/dist/commands/agents/AgentsCommand.js.map +2 -2
  6. package/dist/commands/agents/constants.js +1 -1
  7. package/dist/commands/agents/constants.js.map +1 -1
  8. package/dist/commands/agents/index.js +1 -1
  9. package/dist/commands/bug.js +74 -7
  10. package/dist/commands/bug.js.map +3 -3
  11. package/dist/commands/clear.js +3 -0
  12. package/dist/commands/clear.js.map +2 -2
  13. package/dist/commands/compact.js +37 -0
  14. package/dist/commands/compact.js.map +2 -2
  15. package/dist/commands/context.js +84 -0
  16. package/dist/commands/context.js.map +7 -0
  17. package/dist/commands/ctx_viz.js +18 -10
  18. package/dist/commands/ctx_viz.js.map +2 -2
  19. package/dist/commands/doctor.js +158 -12
  20. package/dist/commands/doctor.js.map +2 -2
  21. package/dist/commands/export.js +156 -0
  22. package/dist/commands/export.js.map +7 -0
  23. package/dist/commands/mcp-interactive.js +21 -12
  24. package/dist/commands/mcp-interactive.js.map +2 -2
  25. package/dist/commands/model.js +6 -5
  26. package/dist/commands/model.js.map +2 -2
  27. package/dist/commands/permissions.js +86 -0
  28. package/dist/commands/permissions.js.map +7 -0
  29. package/dist/commands/quit.js +3 -1
  30. package/dist/commands/quit.js.map +2 -2
  31. package/dist/commands/sandbox.js +104 -0
  32. package/dist/commands/sandbox.js.map +7 -0
  33. package/dist/commands/status.js +58 -0
  34. package/dist/commands/status.js.map +7 -0
  35. package/dist/commands/tasks.js +108 -0
  36. package/dist/commands/tasks.js.map +7 -0
  37. package/dist/commands/todos.js +123 -0
  38. package/dist/commands/todos.js.map +7 -0
  39. package/dist/commands.js +20 -2
  40. package/dist/commands.js.map +2 -2
  41. package/dist/components/AgentThinkingBlock.js +10 -18
  42. package/dist/components/AgentThinkingBlock.js.map +2 -2
  43. package/dist/components/BackgroundTasksPanel.js +78 -29
  44. package/dist/components/BackgroundTasksPanel.js.map +2 -2
  45. package/dist/components/BashStreamingProgress.js +24 -0
  46. package/dist/components/BashStreamingProgress.js.map +7 -0
  47. package/dist/components/CollapsibleHint.js +14 -0
  48. package/dist/components/CollapsibleHint.js.map +7 -0
  49. package/dist/components/FileEditToolUpdatedMessage.js +1 -1
  50. package/dist/components/FileEditToolUpdatedMessage.js.map +2 -2
  51. package/dist/components/HotkeyHelpPanel.js +137 -0
  52. package/dist/components/HotkeyHelpPanel.js.map +7 -0
  53. package/dist/components/Logo.js +5 -5
  54. package/dist/components/Logo.js.map +2 -2
  55. package/dist/components/Message.js +23 -7
  56. package/dist/components/Message.js.map +3 -3
  57. package/dist/components/ModelConfig.js +16 -3
  58. package/dist/components/ModelConfig.js.map +2 -2
  59. package/dist/components/ModelListManager.js +3 -3
  60. package/dist/components/ModelListManager.js.map +2 -2
  61. package/dist/components/ModelSelector/ModelSelector.js +1 -1
  62. package/dist/components/Onboarding.js +19 -14
  63. package/dist/components/Onboarding.js.map +2 -2
  64. package/dist/components/ProgressBar.js +74 -0
  65. package/dist/components/ProgressBar.js.map +7 -0
  66. package/dist/components/PromptInput.js +156 -46
  67. package/dist/components/PromptInput.js.map +2 -2
  68. package/dist/components/RequestStatusIndicator.js +194 -0
  69. package/dist/components/RequestStatusIndicator.js.map +7 -0
  70. package/dist/components/Spinner.js +92 -27
  71. package/dist/components/Spinner.js.map +2 -2
  72. package/dist/components/SpinnerSymbol.js +21 -27
  73. package/dist/components/SpinnerSymbol.js.map +2 -2
  74. package/dist/components/StreamingBashOutput.js +9 -8
  75. package/dist/components/StreamingBashOutput.js.map +2 -2
  76. package/dist/components/SubagentBlock.js +1 -1
  77. package/dist/components/SubagentBlock.js.map +1 -1
  78. package/dist/components/SubagentProgress.js +10 -11
  79. package/dist/components/SubagentProgress.js.map +2 -2
  80. package/dist/components/TaskCard.js +16 -13
  81. package/dist/components/TaskCard.js.map +2 -2
  82. package/dist/components/TodoChangeBlock.js +1 -1
  83. package/dist/components/TodoChangeBlock.js.map +2 -2
  84. package/dist/components/TodoPanel.js +120 -29
  85. package/dist/components/TodoPanel.js.map +3 -3
  86. package/dist/components/TokenCounter.js +74 -0
  87. package/dist/components/TokenCounter.js.map +7 -0
  88. package/dist/components/TokenWarning.js +2 -1
  89. package/dist/components/TokenWarning.js.map +2 -2
  90. package/dist/components/TreeConnector.js +25 -0
  91. package/dist/components/TreeConnector.js.map +7 -0
  92. package/dist/components/TurnCompletionIndicator.js +18 -0
  93. package/dist/components/TurnCompletionIndicator.js.map +7 -0
  94. package/dist/components/messages/AssistantTextMessage.js +5 -2
  95. package/dist/components/messages/AssistantTextMessage.js.map +2 -2
  96. package/dist/components/messages/AssistantThinkingMessage.js +18 -3
  97. package/dist/components/messages/AssistantThinkingMessage.js.map +2 -2
  98. package/dist/components/messages/AssistantToolUseMessage.js +11 -8
  99. package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
  100. package/dist/components/messages/GroupRenderer.js +53 -0
  101. package/dist/components/messages/GroupRenderer.js.map +7 -0
  102. package/dist/components/messages/NestedTasksPreview.js +12 -0
  103. package/dist/components/messages/NestedTasksPreview.js.map +7 -0
  104. package/dist/components/messages/ParallelTasksGroupView.js +92 -0
  105. package/dist/components/messages/ParallelTasksGroupView.js.map +7 -0
  106. package/dist/components/messages/TaskInModuleView.js +198 -0
  107. package/dist/components/messages/TaskInModuleView.js.map +7 -0
  108. package/dist/components/messages/TaskOutputContent.js +53 -0
  109. package/dist/components/messages/TaskOutputContent.js.map +7 -0
  110. package/dist/components/messages/UserPromptMessage.js +1 -1
  111. package/dist/components/messages/UserPromptMessage.js.map +2 -2
  112. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +2 -3
  113. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +2 -2
  114. package/dist/components/permissions/FallbackPermissionRequest.js +4 -4
  115. package/dist/components/permissions/FallbackPermissionRequest.js.map +2 -2
  116. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +4 -4
  117. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js.map +2 -2
  118. package/dist/constants/colors.js +48 -0
  119. package/dist/constants/colors.js.map +2 -2
  120. package/dist/constants/formatRules.js +102 -0
  121. package/dist/constants/formatRules.js.map +7 -0
  122. package/dist/constants/prompts.js +12 -34
  123. package/dist/constants/prompts.js.map +2 -2
  124. package/dist/constants/symbols.js +64 -6
  125. package/dist/constants/symbols.js.map +2 -2
  126. package/dist/constants/timing.js +5 -0
  127. package/dist/constants/timing.js.map +2 -2
  128. package/dist/core/config/defaults.js +84 -0
  129. package/dist/core/config/defaults.js.map +7 -0
  130. package/dist/core/config/index.js +111 -0
  131. package/dist/core/config/index.js.map +7 -0
  132. package/dist/core/config/loader.js +221 -0
  133. package/dist/core/config/loader.js.map +7 -0
  134. package/dist/core/config/migrations.js +128 -0
  135. package/dist/core/config/migrations.js.map +7 -0
  136. package/dist/core/config/schema.js +178 -0
  137. package/dist/core/config/schema.js.map +7 -0
  138. package/dist/core/costTracker.js +138 -0
  139. package/dist/core/costTracker.js.map +7 -0
  140. package/dist/core/index.js +5 -0
  141. package/dist/core/index.js.map +7 -0
  142. package/dist/core/permissions/auditLog.js +204 -0
  143. package/dist/core/permissions/auditLog.js.map +7 -0
  144. package/dist/core/permissions/engine/index.js +3 -0
  145. package/dist/core/permissions/engine/index.js.map +7 -0
  146. package/dist/core/permissions/engine/permissionEngine.js +106 -0
  147. package/dist/core/permissions/engine/permissionEngine.js.map +7 -0
  148. package/dist/core/permissions/engine/types.js +1 -0
  149. package/dist/core/permissions/engine/types.js.map +7 -0
  150. package/dist/core/permissions/index.js +84 -0
  151. package/dist/core/permissions/index.js.map +7 -0
  152. package/dist/core/permissions/ruleEngine.js +259 -0
  153. package/dist/core/permissions/ruleEngine.js.map +7 -0
  154. package/dist/core/permissions/rules/allowedToolsRule.js +62 -0
  155. package/dist/core/permissions/rules/allowedToolsRule.js.map +7 -0
  156. package/dist/core/permissions/rules/autoEscalationRule.js +291 -0
  157. package/dist/core/permissions/rules/autoEscalationRule.js.map +7 -0
  158. package/dist/core/permissions/rules/index.js +46 -0
  159. package/dist/core/permissions/rules/index.js.map +7 -0
  160. package/dist/core/permissions/rules/planModeRule.js +55 -0
  161. package/dist/core/permissions/rules/planModeRule.js.map +7 -0
  162. package/dist/core/permissions/rules/projectBoundaryRule.js +168 -0
  163. package/dist/core/permissions/rules/projectBoundaryRule.js.map +7 -0
  164. package/dist/core/permissions/rules/safeModeRule.js +65 -0
  165. package/dist/core/permissions/rules/safeModeRule.js.map +7 -0
  166. package/dist/core/permissions/rules/sensitivePathsRule.js +340 -0
  167. package/dist/core/permissions/rules/sensitivePathsRule.js.map +7 -0
  168. package/dist/core/permissions/types.js +127 -0
  169. package/dist/core/permissions/types.js.map +7 -0
  170. package/dist/core/tools/executor.js +143 -0
  171. package/dist/core/tools/executor.js.map +7 -0
  172. package/dist/core/tools/index.js +15 -0
  173. package/dist/core/tools/index.js.map +7 -0
  174. package/dist/core/tools/registry.js +183 -0
  175. package/dist/core/tools/registry.js.map +7 -0
  176. package/dist/core/tools/types.js +1 -0
  177. package/dist/core/tools/types.js.map +7 -0
  178. package/dist/cost-tracker.js +23 -15
  179. package/dist/cost-tracker.js.map +2 -2
  180. package/dist/entrypoints/cli.js +43 -43
  181. package/dist/entrypoints/cli.js.map +2 -2
  182. package/dist/entrypoints/mcp.js +12 -4
  183. package/dist/entrypoints/mcp.js.map +2 -2
  184. package/dist/history.js +14 -3
  185. package/dist/history.js.map +2 -2
  186. package/dist/hooks/useAgentTranscripts.js +116 -0
  187. package/dist/hooks/useAgentTranscripts.js.map +7 -0
  188. package/dist/hooks/useAnimationSync.js +53 -0
  189. package/dist/hooks/useAnimationSync.js.map +7 -0
  190. package/dist/hooks/useArrowKeyHistory.js +4 -2
  191. package/dist/hooks/useArrowKeyHistory.js.map +2 -2
  192. package/dist/hooks/useCanUseTool.js +3 -1
  193. package/dist/hooks/useCanUseTool.js.map +2 -2
  194. package/dist/hooks/useCancelRequest.js +4 -1
  195. package/dist/hooks/useCancelRequest.js.map +2 -2
  196. package/dist/hooks/useExitOnCtrlCD.js +9 -5
  197. package/dist/hooks/useExitOnCtrlCD.js.map +2 -2
  198. package/dist/hooks/useHookStatus.js +40 -0
  199. package/dist/hooks/useHookStatus.js.map +7 -0
  200. package/dist/hooks/useLogMessages.js +17 -1
  201. package/dist/hooks/useLogMessages.js.map +2 -2
  202. package/dist/hooks/useMessageGroups.js +43 -0
  203. package/dist/hooks/useMessageGroups.js.map +7 -0
  204. package/dist/hooks/useTerminalSize.js +62 -6
  205. package/dist/hooks/useTerminalSize.js.map +2 -2
  206. package/dist/hooks/useUnifiedCompletion.js +69 -0
  207. package/dist/hooks/useUnifiedCompletion.js.map +2 -2
  208. package/dist/i18n/index.js +109 -0
  209. package/dist/i18n/index.js.map +7 -0
  210. package/dist/i18n/locales/en.js +347 -0
  211. package/dist/i18n/locales/en.js.map +7 -0
  212. package/dist/i18n/locales/index.js +7 -0
  213. package/dist/i18n/locales/index.js.map +7 -0
  214. package/dist/i18n/locales/zh-CN.js +347 -0
  215. package/dist/i18n/locales/zh-CN.js.map +7 -0
  216. package/dist/i18n/types.js +8 -0
  217. package/dist/i18n/types.js.map +7 -0
  218. package/dist/query.js +175 -17
  219. package/dist/query.js.map +3 -3
  220. package/dist/screens/REPL.js +501 -192
  221. package/dist/screens/REPL.js.map +3 -3
  222. package/dist/services/adapters/chatCompletions.js +3 -1
  223. package/dist/services/adapters/chatCompletions.js.map +2 -2
  224. package/dist/services/adapters/messageNormalizer.js +354 -0
  225. package/dist/services/adapters/messageNormalizer.js.map +7 -0
  226. package/dist/services/adapters/responsesAPI.js +6 -3
  227. package/dist/services/adapters/responsesAPI.js.map +2 -2
  228. package/dist/services/checkpointManager.js +386 -0
  229. package/dist/services/checkpointManager.js.map +7 -0
  230. package/dist/services/claude.js +138 -11
  231. package/dist/services/claude.js.map +3 -3
  232. package/dist/services/compressionService.js +50 -1
  233. package/dist/services/compressionService.js.map +2 -2
  234. package/dist/services/contextMonitor.js +162 -0
  235. package/dist/services/contextMonitor.js.map +7 -0
  236. package/dist/services/customCommands.js +60 -41
  237. package/dist/services/customCommands.js.map +2 -2
  238. package/dist/services/hookExecutor.js +173 -1
  239. package/dist/services/hookExecutor.js.map +2 -2
  240. package/dist/services/intelligentCompactor.js +281 -0
  241. package/dist/services/intelligentCompactor.js.map +7 -0
  242. package/dist/services/lspConfig.js +109 -0
  243. package/dist/services/lspConfig.js.map +7 -0
  244. package/dist/services/mcpClient.js +273 -34
  245. package/dist/services/mcpClient.js.map +2 -2
  246. package/dist/services/modelOrchestrator.js +310 -0
  247. package/dist/services/modelOrchestrator.js.map +7 -0
  248. package/dist/services/openai.js +8 -1
  249. package/dist/services/openai.js.map +2 -2
  250. package/dist/services/outputStyles.js +138 -0
  251. package/dist/services/outputStyles.js.map +7 -0
  252. package/dist/services/plugins/index.js +5 -0
  253. package/dist/services/plugins/index.js.map +7 -0
  254. package/dist/services/plugins/lspServers.js +188 -0
  255. package/dist/services/plugins/lspServers.js.map +7 -0
  256. package/dist/services/plugins/pluginRuntime.js +229 -0
  257. package/dist/services/plugins/pluginRuntime.js.map +7 -0
  258. package/dist/services/plugins/pluginValidation.js +219 -0
  259. package/dist/services/plugins/pluginValidation.js.map +7 -0
  260. package/dist/services/plugins/skillMarketplace.js +556 -0
  261. package/dist/services/plugins/skillMarketplace.js.map +7 -0
  262. package/dist/services/responseStateManager.js +37 -3
  263. package/dist/services/responseStateManager.js.map +2 -2
  264. package/dist/services/sandbox/filesystemBoundary.js +300 -0
  265. package/dist/services/sandbox/filesystemBoundary.js.map +7 -0
  266. package/dist/services/sandbox/index.js +14 -0
  267. package/dist/services/sandbox/index.js.map +7 -0
  268. package/dist/services/sandbox/networkProxy.js +293 -0
  269. package/dist/services/sandbox/networkProxy.js.map +7 -0
  270. package/dist/services/sandbox/sandboxController.js +574 -0
  271. package/dist/services/sandbox/sandboxController.js.map +7 -0
  272. package/dist/services/sandbox/types.js +50 -0
  273. package/dist/services/sandbox/types.js.map +7 -0
  274. package/dist/services/sessionMemory.js +266 -0
  275. package/dist/services/sessionMemory.js.map +7 -0
  276. package/dist/services/taskRouter.js +324 -0
  277. package/dist/services/taskRouter.js.map +7 -0
  278. package/dist/tools/ArchitectTool/ArchitectTool.js +10 -3
  279. package/dist/tools/ArchitectTool/ArchitectTool.js.map +2 -2
  280. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +3 -0
  281. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
  282. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js +8 -1
  283. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +2 -2
  284. package/dist/tools/BaseTool.js +72 -0
  285. package/dist/tools/BaseTool.js.map +7 -0
  286. package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js +3 -0
  287. package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js.map +2 -2
  288. package/dist/tools/BashTool/BashTool.js +60 -3
  289. package/dist/tools/BashTool/BashTool.js.map +2 -2
  290. package/dist/tools/BashTool/BashToolResultMessage.js +3 -0
  291. package/dist/tools/BashTool/BashToolResultMessage.js.map +2 -2
  292. package/dist/tools/BashTool/OutputLine.js +54 -0
  293. package/dist/tools/BashTool/OutputLine.js.map +2 -2
  294. package/dist/tools/BashTool/prompt.js +192 -3
  295. package/dist/tools/BashTool/prompt.js.map +2 -2
  296. package/dist/tools/FileEditTool/FileEditTool.js +29 -4
  297. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  298. package/dist/tools/FileReadTool/FileReadTool.js +23 -4
  299. package/dist/tools/FileReadTool/FileReadTool.js.map +2 -2
  300. package/dist/tools/FileWriteTool/FileWriteTool.js +5 -5
  301. package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
  302. package/dist/tools/GlobTool/GlobTool.js +14 -3
  303. package/dist/tools/GlobTool/GlobTool.js.map +2 -2
  304. package/dist/tools/GrepTool/GrepTool.js +41 -7
  305. package/dist/tools/GrepTool/GrepTool.js.map +2 -2
  306. package/dist/tools/KillShellTool/KillShellToolResultMessage.js +3 -0
  307. package/dist/tools/KillShellTool/KillShellToolResultMessage.js.map +2 -2
  308. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js +109 -0
  309. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +7 -0
  310. package/dist/tools/ListMcpResourcesTool/prompt.js +19 -0
  311. package/dist/tools/ListMcpResourcesTool/prompt.js.map +7 -0
  312. package/dist/tools/LspTool/LspTool.js +664 -0
  313. package/dist/tools/LspTool/LspTool.js.map +7 -0
  314. package/dist/tools/LspTool/prompt.js +27 -0
  315. package/dist/tools/LspTool/prompt.js.map +7 -0
  316. package/dist/tools/MCPTool/MCPTool.js +11 -4
  317. package/dist/tools/MCPTool/MCPTool.js.map +2 -2
  318. package/dist/tools/MemoryReadTool/MemoryReadTool.js +19 -6
  319. package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
  320. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +6 -6
  321. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
  322. package/dist/tools/MultiEditTool/MultiEditTool.js +19 -2
  323. package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
  324. package/dist/tools/NotebookEditTool/NotebookEditTool.js +5 -1
  325. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
  326. package/dist/tools/NotebookReadTool/NotebookReadTool.js +8 -4
  327. package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +2 -2
  328. package/dist/tools/PlanModeTool/EnterPlanModeTool.js +74 -0
  329. package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +7 -0
  330. package/dist/tools/PlanModeTool/ExitPlanModeTool.js +108 -0
  331. package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +7 -0
  332. package/dist/tools/PlanModeTool/prompt.js +94 -0
  333. package/dist/tools/PlanModeTool/prompt.js.map +7 -0
  334. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js +130 -0
  335. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +7 -0
  336. package/dist/tools/ReadMcpResourceTool/prompt.js +17 -0
  337. package/dist/tools/ReadMcpResourceTool/prompt.js.map +7 -0
  338. package/dist/tools/SkillTool/SkillTool.js +14 -3
  339. package/dist/tools/SkillTool/SkillTool.js.map +2 -2
  340. package/dist/tools/SlashCommandTool/SlashCommandTool.js +260 -0
  341. package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +7 -0
  342. package/dist/tools/SlashCommandTool/prompt.js +35 -0
  343. package/dist/tools/SlashCommandTool/prompt.js.map +7 -0
  344. package/dist/tools/TaskOutputTool/TaskOutputTool.js +189 -0
  345. package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +7 -0
  346. package/dist/tools/TaskOutputTool/prompt.js +15 -0
  347. package/dist/tools/TaskOutputTool/prompt.js.map +7 -0
  348. package/dist/tools/TaskTool/TaskTool.js +321 -146
  349. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  350. package/dist/tools/TaskTool/prompt.js.map +2 -2
  351. package/dist/tools/TodoWriteTool/TodoWriteTool.js +42 -73
  352. package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +2 -2
  353. package/dist/tools/URLFetcherTool/URLFetcherTool.js +7 -1
  354. package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
  355. package/dist/tools/URLFetcherTool/cache.js +55 -8
  356. package/dist/tools/URLFetcherTool/cache.js.map +2 -2
  357. package/dist/tools/WebSearchTool/WebSearchTool.js +6 -1
  358. package/dist/tools/WebSearchTool/WebSearchTool.js.map +2 -2
  359. package/dist/tools.js +31 -2
  360. package/dist/tools.js.map +2 -2
  361. package/dist/types/hooks.js +4 -0
  362. package/dist/types/hooks.js.map +2 -2
  363. package/dist/types/marketplace.js.map +2 -2
  364. package/dist/types/messageGroup.js +36 -0
  365. package/dist/types/messageGroup.js.map +7 -0
  366. package/dist/types/plugin.js.map +2 -2
  367. package/dist/types/thinking.js +1 -0
  368. package/dist/types/thinking.js.map +7 -0
  369. package/dist/utils/BackgroundShellManager.js +136 -39
  370. package/dist/utils/BackgroundShellManager.js.map +2 -2
  371. package/dist/utils/MessageBatchBuffer.js +102 -0
  372. package/dist/utils/MessageBatchBuffer.js.map +7 -0
  373. package/dist/utils/PersistentShell.js +151 -1
  374. package/dist/utils/PersistentShell.js.map +2 -2
  375. package/dist/utils/agentLoader.js +1 -23
  376. package/dist/utils/agentLoader.js.map +2 -2
  377. package/dist/utils/agentTranscripts.js +641 -0
  378. package/dist/utils/agentTranscripts.js.map +7 -0
  379. package/dist/utils/animationManager.js +213 -0
  380. package/dist/utils/animationManager.js.map +7 -0
  381. package/dist/utils/animationSync.js +110 -0
  382. package/dist/utils/animationSync.js.map +7 -0
  383. package/dist/utils/asyncFile.js +215 -0
  384. package/dist/utils/asyncFile.js.map +7 -0
  385. package/dist/utils/backgroundAgentManager.js +231 -0
  386. package/dist/utils/backgroundAgentManager.js.map +7 -0
  387. package/dist/utils/config.js +63 -7
  388. package/dist/utils/config.js.map +2 -2
  389. package/dist/utils/conversationRecovery.js +19 -0
  390. package/dist/utils/conversationRecovery.js.map +2 -2
  391. package/dist/utils/exit.js +73 -0
  392. package/dist/utils/exit.js.map +7 -0
  393. package/dist/utils/format.js +73 -5
  394. package/dist/utils/format.js.map +2 -2
  395. package/dist/utils/generators.js +76 -6
  396. package/dist/utils/generators.js.map +2 -2
  397. package/dist/utils/globalErrorHandler.js +149 -0
  398. package/dist/utils/globalErrorHandler.js.map +7 -0
  399. package/dist/utils/groupHandlers/index.js +8 -0
  400. package/dist/utils/groupHandlers/index.js.map +7 -0
  401. package/dist/utils/groupHandlers/parallelTasksHandler.js +140 -0
  402. package/dist/utils/groupHandlers/parallelTasksHandler.js.map +7 -0
  403. package/dist/utils/groupHandlers/taskHandler.js +104 -0
  404. package/dist/utils/groupHandlers/taskHandler.js.map +7 -0
  405. package/dist/utils/groupHandlers/types.js +1 -0
  406. package/dist/utils/groupHandlers/types.js.map +7 -0
  407. package/dist/utils/logRotation.js +224 -0
  408. package/dist/utils/logRotation.js.map +7 -0
  409. package/dist/utils/marketplaceManager.js +3 -5
  410. package/dist/utils/marketplaceManager.js.map +2 -2
  411. package/dist/utils/memSafety.js +264 -0
  412. package/dist/utils/memSafety.js.map +7 -0
  413. package/dist/utils/messageGroupManager.js +274 -0
  414. package/dist/utils/messageGroupManager.js.map +7 -0
  415. package/dist/utils/messages.js +13 -4
  416. package/dist/utils/messages.js.map +2 -2
  417. package/dist/utils/model.js +119 -15
  418. package/dist/utils/model.js.map +3 -3
  419. package/dist/utils/permissions/filesystem.js +157 -5
  420. package/dist/utils/permissions/filesystem.js.map +2 -2
  421. package/dist/utils/plan/planMode.js +143 -0
  422. package/dist/utils/plan/planMode.js.map +7 -0
  423. package/dist/utils/pluginLoader.js +17 -21
  424. package/dist/utils/pluginLoader.js.map +2 -2
  425. package/dist/utils/ripgrep.js +55 -2
  426. package/dist/utils/ripgrep.js.map +2 -2
  427. package/dist/utils/sanitizeInput.js +32 -0
  428. package/dist/utils/sanitizeInput.js.map +7 -0
  429. package/dist/utils/secureKeyStorage.js +312 -0
  430. package/dist/utils/secureKeyStorage.js.map +7 -0
  431. package/dist/utils/session/sessionPlugins.js +67 -0
  432. package/dist/utils/session/sessionPlugins.js.map +7 -0
  433. package/dist/utils/taskDisplayUtils.js +257 -0
  434. package/dist/utils/taskDisplayUtils.js.map +7 -0
  435. package/dist/utils/teamConfig.js +2 -1
  436. package/dist/utils/teamConfig.js.map +2 -2
  437. package/dist/utils/todoStorage.js +92 -2
  438. package/dist/utils/todoStorage.js.map +2 -2
  439. package/dist/utils/toolTimeout.js +136 -0
  440. package/dist/utils/toolTimeout.js.map +7 -0
  441. package/dist/utils/tooling/safeRender.js +115 -0
  442. package/dist/utils/tooling/safeRender.js.map +7 -0
  443. package/dist/utils/userFriendlyError.js +346 -0
  444. package/dist/utils/userFriendlyError.js.map +7 -0
  445. package/dist/utils/vendor/ripgrep/arm64-darwin/rg +0 -0
  446. package/dist/version.js +2 -2
  447. package/dist/version.js.map +1 -1
  448. package/package.json +14 -4
  449. package/scripts/postinstall.js +128 -38
  450. package/dist/commands/agents.js +0 -2086
  451. package/dist/commands/agents.js.map +0 -7
  452. package/dist/commands/build.js +0 -74
  453. package/dist/commands/build.js.map +0 -7
  454. package/dist/commands/compression.js +0 -57
  455. package/dist/commands/compression.js.map +0 -7
  456. package/dist/commands/listen.js +0 -37
  457. package/dist/commands/listen.js.map +0 -7
  458. package/dist/commands/login.js +0 -37
  459. package/dist/commands/login.js.map +0 -7
  460. package/dist/commands/logout.js +0 -33
  461. package/dist/commands/logout.js.map +0 -7
  462. package/dist/commands/mcp.js +0 -40
  463. package/dist/commands/mcp.js.map +0 -7
  464. package/dist/commands/mcp_refresh.js +0 -40
  465. package/dist/commands/mcp_refresh.js.map +0 -7
  466. package/dist/commands/modelstatus.js +0 -21
  467. package/dist/commands/modelstatus.js.map +0 -7
  468. package/dist/commands/onboarding.js +0 -36
  469. package/dist/commands/onboarding.js.map +0 -7
  470. package/dist/commands/plugin-interactive.js +0 -446
  471. package/dist/commands/plugin-interactive.js.map +0 -7
  472. package/dist/commands/pr_comments.js +0 -61
  473. package/dist/commands/pr_comments.js.map +0 -7
  474. package/dist/commands/release-notes.js +0 -30
  475. package/dist/commands/release-notes.js.map +0 -7
  476. package/dist/commands/review.js +0 -51
  477. package/dist/commands/review.js.map +0 -7
  478. package/dist/components/Bug.js +0 -147
  479. package/dist/components/Bug.js.map +0 -7
  480. package/dist/components/ModelSelector.js +0 -2062
  481. package/dist/components/ModelSelector.js.map +0 -7
  482. package/dist/components/ModelStatusDisplay.js +0 -87
  483. package/dist/components/ModelStatusDisplay.js.map +0 -7
  484. package/dist/entrypoints/cli-wrapper.js +0 -61
  485. package/dist/entrypoints/cli-wrapper.js.map +0 -7
  486. package/dist/screens/Doctor.js +0 -22
  487. package/dist/screens/Doctor.js.map +0 -7
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/services/sandbox/types.ts"],
4
+ "sourcesContent": ["/**\n * Sandbox System Types\n *\n * Type definitions for the sandbox execution system that provides\n * OS-level isolation for Bash commands.\n */\n\n/**\n * Filesystem access policy\n */\nexport interface FilesystemPolicy {\n /** Directories/files allowed for writing (glob patterns) */\n writeAllowed: string[]\n /** Directories/files allowed for reading (glob patterns) */\n readAllowed: string[]\n /** Directories/files explicitly denied (glob patterns) - highest priority */\n denied: string[]\n}\n\n/**\n * Network access policy\n */\nexport interface NetworkPolicy {\n /** Domains allowed for network access */\n allowedDomains: string[]\n /** Whether to prompt user for new domains */\n promptForNewDomains: boolean\n /** Whether to block all network access */\n blockAll: boolean\n}\n\n/**\n * Process isolation policy\n */\nexport interface ProcessPolicy {\n /** Commands excluded from sandboxing (e.g., 'docker', 'git') */\n excludedCommands: string[]\n /** Maximum execution time in milliseconds */\n maxExecutionTime: number\n /** Maximum memory usage in bytes (0 = unlimited) */\n maxMemory: number\n /** Maximum number of processes (0 = unlimited) */\n maxProcesses: number\n}\n\n/**\n * Complete sandbox configuration\n */\nexport interface SandboxConfig {\n /** Whether sandboxing is enabled */\n enabled: boolean\n /** Filesystem access policy */\n filesystem: FilesystemPolicy\n /** Network access policy */\n network: NetworkPolicy\n /** Process isolation policy */\n process: ProcessPolicy\n}\n\n/**\n * Sandbox execution result\n */\nexport interface SandboxExecutionResult {\n /** Standard output */\n stdout: string\n /** Standard error */\n stderr: string\n /** Exit code */\n exitCode: number\n /** Whether execution was interrupted */\n interrupted: boolean\n /** Whether execution was blocked by sandbox */\n blocked: boolean\n /** Reason for blocking (if blocked) */\n blockReason?: string\n /** Execution duration in milliseconds */\n duration: number\n}\n\n/**\n * Sandbox violation types\n */\nexport type SandboxViolationType =\n | 'filesystem_write_denied'\n | 'filesystem_read_denied'\n | 'filesystem_path_denied'\n | 'network_domain_denied'\n | 'network_blocked'\n | 'process_limit_exceeded'\n | 'memory_limit_exceeded'\n | 'execution_time_exceeded'\n | 'command_excluded'\n\n/**\n * Sandbox violation record\n */\nexport interface SandboxViolation {\n type: SandboxViolationType\n timestamp: number\n command: string\n details: string\n path?: string\n domain?: string\n}\n\n/**\n * OS-specific sandbox implementation type\n */\nexport type SandboxImplementation =\n | 'seatbelt'\n | 'bubblewrap'\n | 'docker'\n | 'none'\n\n/**\n * Sandbox controller interface\n */\nexport interface ISandboxController {\n /** Check if sandbox is available on this system */\n isAvailable(): Promise<boolean>\n\n /** Get the implementation type */\n getImplementationType(): SandboxImplementation\n\n /** Initialize the sandbox */\n initialize(config: SandboxConfig): Promise<void>\n\n /** Execute a command in the sandbox */\n execute(\n command: string,\n workingDir: string,\n signal?: AbortSignal,\n timeout?: number,\n ): Promise<SandboxExecutionResult>\n\n /** Pre-validate a command against policies */\n validateCommand(command: string): Promise<{\n valid: boolean\n violations: SandboxViolation[]\n }>\n\n /** Get current configuration */\n getConfig(): SandboxConfig\n\n /** Update configuration */\n updateConfig(config: Partial<SandboxConfig>): void\n\n /** Get violation history */\n getViolations(): SandboxViolation[]\n\n /** Clear violation history */\n clearViolations(): void\n}\n\n/**\n * Default sandbox configuration\n */\nexport const DEFAULT_SANDBOX_CONFIG: SandboxConfig = {\n enabled: false, // Disabled by default for backward compatibility\n filesystem: {\n writeAllowed: ['./'], // Current working directory\n readAllowed: ['*'], // Allow reading everything by default\n denied: [\n '.env*',\n '.env',\n '.env.local',\n '.env.*.local',\n 'secrets/**',\n '.ssh/**',\n '.gnupg/**',\n '.aws/credentials',\n '.config/gcloud/**',\n '**/*.pem',\n '**/*.key',\n '**/id_rsa',\n '**/id_ed25519',\n ],\n },\n network: {\n allowedDomains: [\n 'api.anthropic.com',\n 'api.openai.com',\n 'github.com',\n 'api.github.com',\n 'registry.npmjs.org',\n 'pypi.org',\n ],\n promptForNewDomains: true,\n blockAll: false,\n },\n process: {\n excludedCommands: ['docker', 'git', 'node', 'npm', 'bun', 'pnpm', 'yarn'],\n maxExecutionTime: 600000, // 10 minutes\n maxMemory: 0, // Unlimited\n maxProcesses: 0, // Unlimited\n },\n}\n"],
5
+ "mappings": "AA6JO,MAAM,yBAAwC;AAAA,EACnD,SAAS;AAAA;AAAA,EACT,YAAY;AAAA,IACV,cAAc,CAAC,IAAI;AAAA;AAAA,IACnB,aAAa,CAAC,GAAG;AAAA;AAAA,IACjB,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP,gBAAgB;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,qBAAqB;AAAA,IACrB,UAAU;AAAA,EACZ;AAAA,EACA,SAAS;AAAA,IACP,kBAAkB,CAAC,UAAU,OAAO,QAAQ,OAAO,OAAO,QAAQ,MAAM;AAAA,IACxE,kBAAkB;AAAA;AAAA,IAClB,WAAW;AAAA;AAAA,IACX,cAAc;AAAA;AAAA,EAChB;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,266 @@
1
+ import {
2
+ existsSync,
3
+ mkdirSync,
4
+ readFileSync,
5
+ writeFileSync,
6
+ readdirSync,
7
+ unlinkSync,
8
+ rmdirSync
9
+ } from "fs";
10
+ import { join, resolve } from "path";
11
+ import { homedir } from "os";
12
+ import crypto from "crypto";
13
+ class SessionMemoryManager {
14
+ baseDir;
15
+ projectHash;
16
+ sessionId;
17
+ constructor(projectPath, sessionId) {
18
+ this.baseDir = join(homedir(), ".minto", "projects");
19
+ this.projectHash = this.hashPath(projectPath);
20
+ this.sessionId = sessionId || crypto.randomUUID();
21
+ this.ensureDirectories();
22
+ }
23
+ /**
24
+ * Get the session ID
25
+ */
26
+ getSessionId() {
27
+ return this.sessionId;
28
+ }
29
+ /**
30
+ * Get the project hash
31
+ */
32
+ getProjectHash() {
33
+ return this.projectHash;
34
+ }
35
+ /**
36
+ * Save session memory
37
+ */
38
+ saveMemory(memory, metadata) {
39
+ const sessionDir = this.getSessionDir();
40
+ const fullMetadata = {
41
+ sessionId: this.sessionId,
42
+ projectPath: "",
43
+ // Will be set by caller
44
+ projectHash: this.projectHash,
45
+ createdAt: Date.now(),
46
+ updatedAt: Date.now(),
47
+ messageCount: 0,
48
+ ...this.loadMetadata(),
49
+ ...metadata
50
+ };
51
+ writeFileSync(
52
+ join(sessionDir, "session_memory.json"),
53
+ JSON.stringify(memory, null, 2)
54
+ );
55
+ writeFileSync(
56
+ join(sessionDir, "metadata.json"),
57
+ JSON.stringify(fullMetadata, null, 2)
58
+ );
59
+ if (memory.decisions.length > 0) {
60
+ writeFileSync(
61
+ join(sessionDir, "decisions.json"),
62
+ JSON.stringify(memory.decisions, null, 2)
63
+ );
64
+ }
65
+ }
66
+ /**
67
+ * Save full conversation (optional, for debugging/recovery)
68
+ */
69
+ saveConversation(messages) {
70
+ const sessionDir = this.getSessionDir();
71
+ writeFileSync(
72
+ join(sessionDir, "conversation.json"),
73
+ JSON.stringify(messages, null, 2)
74
+ );
75
+ const metadata = this.loadMetadata();
76
+ if (metadata) {
77
+ metadata.messageCount = messages.length;
78
+ metadata.updatedAt = Date.now();
79
+ writeFileSync(
80
+ join(sessionDir, "metadata.json"),
81
+ JSON.stringify(metadata, null, 2)
82
+ );
83
+ }
84
+ }
85
+ /**
86
+ * Load session memory
87
+ */
88
+ loadMemory() {
89
+ const memoryPath = join(this.getSessionDir(), "session_memory.json");
90
+ if (!existsSync(memoryPath)) return null;
91
+ try {
92
+ const content = readFileSync(memoryPath, "utf-8");
93
+ return JSON.parse(content);
94
+ } catch {
95
+ return null;
96
+ }
97
+ }
98
+ /**
99
+ * Load session metadata
100
+ */
101
+ loadMetadata() {
102
+ const metadataPath = join(this.getSessionDir(), "metadata.json");
103
+ if (!existsSync(metadataPath)) return null;
104
+ try {
105
+ const content = readFileSync(metadataPath, "utf-8");
106
+ return JSON.parse(content);
107
+ } catch {
108
+ return null;
109
+ }
110
+ }
111
+ /**
112
+ * Load conversation history
113
+ */
114
+ loadConversation() {
115
+ const convoPath = join(this.getSessionDir(), "conversation.json");
116
+ if (!existsSync(convoPath)) return null;
117
+ try {
118
+ const content = readFileSync(convoPath, "utf-8");
119
+ return JSON.parse(content);
120
+ } catch {
121
+ return null;
122
+ }
123
+ }
124
+ /**
125
+ * Load decisions from current or previous session
126
+ */
127
+ loadDecisions() {
128
+ const decisionsPath = join(this.getSessionDir(), "decisions.json");
129
+ if (!existsSync(decisionsPath)) return [];
130
+ try {
131
+ const content = readFileSync(decisionsPath, "utf-8");
132
+ return JSON.parse(content);
133
+ } catch {
134
+ return [];
135
+ }
136
+ }
137
+ /**
138
+ * List all sessions for current project
139
+ */
140
+ listSessions() {
141
+ const projectDir = this.getProjectDir();
142
+ if (!existsSync(projectDir)) return [];
143
+ const sessions = [];
144
+ try {
145
+ const entries = readdirSync(projectDir, { withFileTypes: true });
146
+ for (const entry of entries) {
147
+ if (entry.isDirectory() && entry.name.startsWith("session-")) {
148
+ const metadataPath = join(projectDir, entry.name, "metadata.json");
149
+ if (existsSync(metadataPath)) {
150
+ try {
151
+ const content = readFileSync(metadataPath, "utf-8");
152
+ sessions.push(JSON.parse(content));
153
+ } catch {
154
+ }
155
+ }
156
+ }
157
+ }
158
+ } catch {
159
+ }
160
+ return sessions.sort((a, b) => b.updatedAt - a.updatedAt);
161
+ }
162
+ /**
163
+ * Get the most recent session for current project
164
+ */
165
+ getMostRecentSession() {
166
+ const sessions = this.listSessions();
167
+ if (sessions.length === 0) return null;
168
+ const mostRecent = sessions[0];
169
+ if (!mostRecent) return null;
170
+ const tempManager = new SessionMemoryManager("", mostRecent.sessionId);
171
+ Object.assign(tempManager, { projectHash: this.projectHash });
172
+ return {
173
+ metadata: mostRecent,
174
+ memory: tempManager.loadMemory() || {
175
+ summary: "",
176
+ decisions: [],
177
+ codeChanges: [],
178
+ toolUsageSummary: {},
179
+ focusAreas: [],
180
+ preservedContext: []
181
+ },
182
+ messages: tempManager.loadConversation() || void 0
183
+ };
184
+ }
185
+ /**
186
+ * Clean up old sessions (keep only N most recent)
187
+ */
188
+ cleanupOldSessions(keepCount = 5) {
189
+ const sessions = this.listSessions();
190
+ let cleaned = 0;
191
+ if (sessions.length <= keepCount) return 0;
192
+ const toDelete = sessions.slice(keepCount);
193
+ for (const session of toDelete) {
194
+ try {
195
+ const sessionDir = join(
196
+ this.getProjectDir(),
197
+ "session-" + session.sessionId
198
+ );
199
+ if (existsSync(sessionDir)) {
200
+ this.deleteDirectory(sessionDir);
201
+ cleaned++;
202
+ }
203
+ } catch {
204
+ }
205
+ }
206
+ return cleaned;
207
+ }
208
+ /**
209
+ * Check if a session exists
210
+ */
211
+ sessionExists() {
212
+ return existsSync(this.getSessionDir());
213
+ }
214
+ /**
215
+ * Get session directory path
216
+ */
217
+ getSessionDir() {
218
+ return join(this.getProjectDir(), "session-" + this.sessionId);
219
+ }
220
+ /**
221
+ * Get project directory path
222
+ */
223
+ getProjectDir() {
224
+ return join(this.baseDir, this.projectHash);
225
+ }
226
+ /**
227
+ * Ensure required directories exist
228
+ */
229
+ ensureDirectories() {
230
+ const sessionDir = this.getSessionDir();
231
+ if (!existsSync(sessionDir)) {
232
+ mkdirSync(sessionDir, { recursive: true });
233
+ }
234
+ }
235
+ /**
236
+ * Hash a path to create a safe directory name
237
+ */
238
+ hashPath(path) {
239
+ const normalized = resolve(path).toLowerCase();
240
+ return crypto.createHash("sha256").update(normalized).digest("hex").slice(0, 16);
241
+ }
242
+ /**
243
+ * Recursively delete a directory
244
+ */
245
+ deleteDirectory(dirPath) {
246
+ if (!existsSync(dirPath)) return;
247
+ const entries = readdirSync(dirPath, { withFileTypes: true });
248
+ for (const entry of entries) {
249
+ const fullPath = join(dirPath, entry.name);
250
+ if (entry.isDirectory()) {
251
+ this.deleteDirectory(fullPath);
252
+ } else {
253
+ unlinkSync(fullPath);
254
+ }
255
+ }
256
+ rmdirSync(dirPath);
257
+ }
258
+ }
259
+ function createSessionMemory(projectPath, sessionId) {
260
+ return new SessionMemoryManager(projectPath, sessionId);
261
+ }
262
+ export {
263
+ SessionMemoryManager,
264
+ createSessionMemory
265
+ };
266
+ //# sourceMappingURL=sessionMemory.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/services/sessionMemory.ts"],
4
+ "sourcesContent": ["/**\n * Session Memory Service\n *\n * Provides persistent session memory for context compression.\n * Stores compressed contexts, decisions, and session metadata.\n *\n * Storage structure:\n * ~/.minto/projects/\n * <project-hash>/\n * session-<uuid>/\n * session_memory.json # Compressed context\n * conversation.json # Full conversation (optional)\n * decisions.json # Key decisions\n * metadata.json # Session metadata\n */\n\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n readdirSync,\n unlinkSync,\n rmdirSync,\n} from 'fs'\nimport { join, resolve } from 'path'\nimport { homedir } from 'os'\nimport crypto from 'crypto'\nimport type { Message } from '@query'\nimport type {\n ExtractedDecision,\n ExtractedCodeChange,\n} from './intelligentCompactor'\n\n/**\n * Session metadata\n */\nexport interface SessionMetadata {\n sessionId: string\n projectPath: string\n projectHash: string\n createdAt: number\n updatedAt: number\n messageCount: number\n compressedAt?: number\n compressionRatio?: number\n focusArea?: string\n}\n\n/**\n * Session memory data\n */\nexport interface SessionMemoryData {\n summary: string\n decisions: ExtractedDecision[]\n codeChanges: ExtractedCodeChange[]\n toolUsageSummary: Record<string, number>\n focusAreas: string[]\n preservedContext: string[]\n}\n\n/**\n * Full session record\n */\nexport interface SessionRecord {\n metadata: SessionMetadata\n memory: SessionMemoryData\n messages?: Message[]\n}\n\n/**\n * Session Memory Manager\n */\nexport class SessionMemoryManager {\n private baseDir: string\n private projectHash: string\n private sessionId: string\n\n constructor(projectPath: string, sessionId?: string) {\n this.baseDir = join(homedir(), '.minto', 'projects')\n this.projectHash = this.hashPath(projectPath)\n this.sessionId = sessionId || crypto.randomUUID()\n this.ensureDirectories()\n }\n\n /**\n * Get the session ID\n */\n getSessionId(): string {\n return this.sessionId\n }\n\n /**\n * Get the project hash\n */\n getProjectHash(): string {\n return this.projectHash\n }\n\n /**\n * Save session memory\n */\n saveMemory(\n memory: SessionMemoryData,\n metadata?: Partial<SessionMetadata>,\n ): void {\n const sessionDir = this.getSessionDir()\n\n const fullMetadata: SessionMetadata = {\n sessionId: this.sessionId,\n projectPath: '', // Will be set by caller\n projectHash: this.projectHash,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n messageCount: 0,\n ...this.loadMetadata(),\n ...metadata,\n }\n\n // Save memory\n writeFileSync(\n join(sessionDir, 'session_memory.json'),\n JSON.stringify(memory, null, 2),\n )\n\n // Save metadata\n writeFileSync(\n join(sessionDir, 'metadata.json'),\n JSON.stringify(fullMetadata, null, 2),\n )\n\n // Save decisions separately for quick access\n if (memory.decisions.length > 0) {\n writeFileSync(\n join(sessionDir, 'decisions.json'),\n JSON.stringify(memory.decisions, null, 2),\n )\n }\n }\n\n /**\n * Save full conversation (optional, for debugging/recovery)\n */\n saveConversation(messages: Message[]): void {\n const sessionDir = this.getSessionDir()\n writeFileSync(\n join(sessionDir, 'conversation.json'),\n JSON.stringify(messages, null, 2),\n )\n\n // Update metadata\n const metadata = this.loadMetadata()\n if (metadata) {\n metadata.messageCount = messages.length\n metadata.updatedAt = Date.now()\n writeFileSync(\n join(sessionDir, 'metadata.json'),\n JSON.stringify(metadata, null, 2),\n )\n }\n }\n\n /**\n * Load session memory\n */\n loadMemory(): SessionMemoryData | null {\n const memoryPath = join(this.getSessionDir(), 'session_memory.json')\n if (!existsSync(memoryPath)) return null\n\n try {\n const content = readFileSync(memoryPath, 'utf-8')\n return JSON.parse(content) as SessionMemoryData\n } catch {\n return null\n }\n }\n\n /**\n * Load session metadata\n */\n loadMetadata(): SessionMetadata | null {\n const metadataPath = join(this.getSessionDir(), 'metadata.json')\n if (!existsSync(metadataPath)) return null\n\n try {\n const content = readFileSync(metadataPath, 'utf-8')\n return JSON.parse(content) as SessionMetadata\n } catch {\n return null\n }\n }\n\n /**\n * Load conversation history\n */\n loadConversation(): Message[] | null {\n const convoPath = join(this.getSessionDir(), 'conversation.json')\n if (!existsSync(convoPath)) return null\n\n try {\n const content = readFileSync(convoPath, 'utf-8')\n return JSON.parse(content) as Message[]\n } catch {\n return null\n }\n }\n\n /**\n * Load decisions from current or previous session\n */\n loadDecisions(): ExtractedDecision[] {\n const decisionsPath = join(this.getSessionDir(), 'decisions.json')\n if (!existsSync(decisionsPath)) return []\n\n try {\n const content = readFileSync(decisionsPath, 'utf-8')\n return JSON.parse(content) as ExtractedDecision[]\n } catch {\n return []\n }\n }\n\n /**\n * List all sessions for current project\n */\n listSessions(): SessionMetadata[] {\n const projectDir = this.getProjectDir()\n if (!existsSync(projectDir)) return []\n\n const sessions: SessionMetadata[] = []\n\n try {\n const entries = readdirSync(projectDir, { withFileTypes: true })\n for (const entry of entries) {\n if (entry.isDirectory() && entry.name.startsWith('session-')) {\n const metadataPath = join(projectDir, entry.name, 'metadata.json')\n if (existsSync(metadataPath)) {\n try {\n const content = readFileSync(metadataPath, 'utf-8')\n sessions.push(JSON.parse(content) as SessionMetadata)\n } catch {\n // Skip invalid session\n }\n }\n }\n }\n } catch {\n // Return empty if directory cannot be read\n }\n\n return sessions.sort((a, b) => b.updatedAt - a.updatedAt)\n }\n\n /**\n * Get the most recent session for current project\n */\n getMostRecentSession(): SessionRecord | null {\n const sessions = this.listSessions()\n if (sessions.length === 0) return null\n\n const mostRecent = sessions[0]\n if (!mostRecent) return null\n\n const tempManager = new SessionMemoryManager('', mostRecent.sessionId)\n // Hack to use the same project dir\n Object.assign(tempManager, { projectHash: this.projectHash })\n\n return {\n metadata: mostRecent,\n memory: tempManager.loadMemory() || {\n summary: '',\n decisions: [],\n codeChanges: [],\n toolUsageSummary: {},\n focusAreas: [],\n preservedContext: [],\n },\n messages: tempManager.loadConversation() || undefined,\n }\n }\n\n /**\n * Clean up old sessions (keep only N most recent)\n */\n cleanupOldSessions(keepCount: number = 5): number {\n const sessions = this.listSessions()\n let cleaned = 0\n\n if (sessions.length <= keepCount) return 0\n\n const toDelete = sessions.slice(keepCount)\n for (const session of toDelete) {\n try {\n const sessionDir = join(\n this.getProjectDir(),\n 'session-' + session.sessionId,\n )\n if (existsSync(sessionDir)) {\n // Simple recursive delete using fs\n this.deleteDirectory(sessionDir)\n cleaned++\n }\n } catch {\n // Continue with other sessions\n }\n }\n\n return cleaned\n }\n\n /**\n * Check if a session exists\n */\n sessionExists(): boolean {\n return existsSync(this.getSessionDir())\n }\n\n /**\n * Get session directory path\n */\n private getSessionDir(): string {\n return join(this.getProjectDir(), 'session-' + this.sessionId)\n }\n\n /**\n * Get project directory path\n */\n private getProjectDir(): string {\n return join(this.baseDir, this.projectHash)\n }\n\n /**\n * Ensure required directories exist\n */\n private ensureDirectories(): void {\n const sessionDir = this.getSessionDir()\n if (!existsSync(sessionDir)) {\n mkdirSync(sessionDir, { recursive: true })\n }\n }\n\n /**\n * Hash a path to create a safe directory name\n */\n private hashPath(path: string): string {\n const normalized = resolve(path).toLowerCase()\n return crypto\n .createHash('sha256')\n .update(normalized)\n .digest('hex')\n .slice(0, 16)\n }\n\n /**\n * Recursively delete a directory\n */\n private deleteDirectory(dirPath: string): void {\n if (!existsSync(dirPath)) return\n\n const entries = readdirSync(dirPath, { withFileTypes: true })\n for (const entry of entries) {\n const fullPath = join(dirPath, entry.name)\n if (entry.isDirectory()) {\n this.deleteDirectory(fullPath)\n } else {\n unlinkSync(fullPath)\n }\n }\n rmdirSync(dirPath)\n }\n}\n\n/**\n * Create a session memory manager for the current project\n */\nexport function createSessionMemory(\n projectPath: string,\n sessionId?: string,\n): SessionMemoryManager {\n return new SessionMemoryManager(projectPath, sessionId)\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,324 @@
1
+ import { getModelManager } from "../utils/model.js";
2
+ const DEFAULT_ROUTING_RULES = [
3
+ // Simple tasks → fast model
4
+ { pattern: "simple-query", model: "haiku", priority: 1 },
5
+ { pattern: "simple-generation", model: "haiku", priority: 1 },
6
+ // Moderate tasks → balanced model
7
+ { pattern: "moderate-query", model: "sonnet", priority: 2 },
8
+ { pattern: "moderate-generation", model: "sonnet", priority: 2 },
9
+ { pattern: "moderate-review", model: "sonnet", priority: 2 },
10
+ { pattern: "moderate-refactor", model: "sonnet", priority: 2 },
11
+ { pattern: "moderate-debug", model: "sonnet", priority: 2 },
12
+ // Complex tasks → powerful model
13
+ { pattern: "complex-reasoning", model: "opus", priority: 3 },
14
+ { pattern: "complex-architecture", model: "opus", priority: 3 },
15
+ { pattern: "complex-generation", model: "opus", priority: 3 },
16
+ { pattern: "complex-creative", model: "opus", priority: 3 },
17
+ // Specific task types
18
+ { pattern: "*-architecture", model: "opus", priority: 0 },
19
+ { pattern: "*-reasoning", model: "opus", priority: 0 },
20
+ { pattern: "*-review", model: "sonnet", priority: 1 },
21
+ { pattern: "*-debug", model: "sonnet", priority: 1 }
22
+ ];
23
+ const ANALYSIS_PATTERNS = [
24
+ // Query patterns
25
+ {
26
+ name: "question",
27
+ patterns: [
28
+ /\b(what|how|why|when|where|who|which|can you explain)\b/i,
29
+ /\?$/,
30
+ /\b(tell me|show me|help me understand)\b/i
31
+ ],
32
+ type: "query",
33
+ complexityWeight: -0.2
34
+ },
35
+ // Generation patterns
36
+ {
37
+ name: "generation",
38
+ patterns: [
39
+ /\b(create|generate|write|build|implement|add|make)\b/i,
40
+ /\b(new|feature|function|class|component|module)\b/i
41
+ ],
42
+ type: "generation",
43
+ complexityWeight: 0.1
44
+ },
45
+ // Review patterns
46
+ {
47
+ name: "review",
48
+ patterns: [
49
+ /\b(review|check|analyze|examine|inspect|audit)\b/i,
50
+ /\b(code review|pull request|pr|merge)\b/i
51
+ ],
52
+ type: "review",
53
+ complexityWeight: 0
54
+ },
55
+ // Reasoning patterns
56
+ {
57
+ name: "reasoning",
58
+ patterns: [
59
+ /\b(think|reason|consider|evaluate|compare|decide)\b/i,
60
+ /\b(trade-?off|pros and cons|best approach|optimal)\b/i,
61
+ /\b(algorithm|complexity|performance|efficiency)\b/i
62
+ ],
63
+ type: "reasoning",
64
+ complexityWeight: 0.3
65
+ },
66
+ // Creative patterns
67
+ {
68
+ name: "creative",
69
+ patterns: [
70
+ /\b(creative|brainstorm|innovative|design|imagine)\b/i,
71
+ /\b(suggest|propose|come up with|ideas)\b/i
72
+ ],
73
+ type: "creative",
74
+ complexityWeight: 0.2
75
+ },
76
+ // Refactoring patterns
77
+ {
78
+ name: "refactor",
79
+ patterns: [
80
+ /\b(refactor|restructure|reorganize|clean up|improve)\b/i,
81
+ /\b(optimize|simplify|modularize|extract)\b/i
82
+ ],
83
+ type: "refactor",
84
+ complexityWeight: 0.15
85
+ },
86
+ // Debug patterns
87
+ {
88
+ name: "debug",
89
+ patterns: [
90
+ /\b(debug|fix|error|bug|issue|problem|crash)\b/i,
91
+ /\b(broken|doesn't work|failing|wrong)\b/i,
92
+ /\b(stack trace|exception|undefined|null)\b/i
93
+ ],
94
+ type: "debug",
95
+ complexityWeight: 0.1
96
+ },
97
+ // Architecture patterns
98
+ {
99
+ name: "architecture",
100
+ patterns: [
101
+ /\b(architect|design|system|infrastructure|scale)\b/i,
102
+ /\b(microservice|monolith|distributed|database)\b/i,
103
+ /\b(api design|schema|data model|integration)\b/i
104
+ ],
105
+ type: "architecture",
106
+ complexityWeight: 0.4
107
+ }
108
+ ];
109
+ const COMPLEXITY_INDICATORS = {
110
+ simple: [
111
+ /\b(simple|quick|basic|easy|trivial|small)\b/i,
112
+ /\b(one line|single|just|only)\b/i
113
+ ],
114
+ complex: [
115
+ /\b(complex|difficult|challenging|advanced|comprehensive)\b/i,
116
+ /\b(entire|whole|all|complete|full|extensive)\b/i,
117
+ /\b(multiple|several|many|various)\b/i,
118
+ /\b(system|platform|framework|infrastructure)\b/i
119
+ ]
120
+ };
121
+ class TaskRouter {
122
+ routingRules = /* @__PURE__ */ new Map();
123
+ modelManager = getModelManager();
124
+ customRules = [];
125
+ constructor(customRules) {
126
+ this.loadRules(DEFAULT_ROUTING_RULES);
127
+ if (customRules) {
128
+ this.customRules = customRules;
129
+ this.loadRules(customRules);
130
+ }
131
+ }
132
+ /**
133
+ * Load routing rules into the map
134
+ */
135
+ loadRules(rules) {
136
+ const sorted = [...rules].sort((a, b) => a.priority - b.priority);
137
+ for (const rule of sorted) {
138
+ this.routingRules.set(rule.pattern, rule.model);
139
+ }
140
+ }
141
+ /**
142
+ * Analyze a task and return detailed analysis
143
+ */
144
+ analyzeTask(task) {
145
+ const detectedPatterns = [];
146
+ let complexityScore = 0.5;
147
+ let primaryType = "query";
148
+ let typeMatchCount = 0;
149
+ for (const pattern of ANALYSIS_PATTERNS) {
150
+ let matches = 0;
151
+ for (const regex of pattern.patterns) {
152
+ if (regex.test(task)) {
153
+ matches++;
154
+ }
155
+ }
156
+ if (matches > 0) {
157
+ detectedPatterns.push(pattern.name);
158
+ complexityScore += pattern.complexityWeight * (matches / pattern.patterns.length);
159
+ if (matches > typeMatchCount) {
160
+ typeMatchCount = matches;
161
+ primaryType = pattern.type;
162
+ }
163
+ }
164
+ }
165
+ for (const regex of COMPLEXITY_INDICATORS.simple) {
166
+ if (regex.test(task)) {
167
+ complexityScore -= 0.2;
168
+ detectedPatterns.push("simple-indicator");
169
+ }
170
+ }
171
+ for (const regex of COMPLEXITY_INDICATORS.complex) {
172
+ if (regex.test(task)) {
173
+ complexityScore += 0.2;
174
+ detectedPatterns.push("complex-indicator");
175
+ }
176
+ }
177
+ const wordCount = task.split(/\s+/).length;
178
+ if (wordCount < 10) {
179
+ complexityScore -= 0.1;
180
+ } else if (wordCount > 50) {
181
+ complexityScore += 0.1;
182
+ } else if (wordCount > 100) {
183
+ complexityScore += 0.2;
184
+ }
185
+ complexityScore = Math.max(0, Math.min(1, complexityScore));
186
+ let complexity;
187
+ if (complexityScore < 0.35) {
188
+ complexity = "simple";
189
+ } else if (complexityScore < 0.65) {
190
+ complexity = "moderate";
191
+ } else {
192
+ complexity = "complex";
193
+ }
194
+ const estimatedInputTokens = Math.ceil(task.length / 4);
195
+ const estimatedOutputTokens = this.estimateOutputTokens(
196
+ complexity,
197
+ primaryType
198
+ );
199
+ const suggestedModel = this.route(complexity, primaryType);
200
+ const confidence = typeMatchCount > 0 ? Math.min(
201
+ 1,
202
+ 0.5 + typeMatchCount * 0.15 + detectedPatterns.length * 0.05
203
+ ) : 0.5;
204
+ return {
205
+ complexity,
206
+ type: primaryType,
207
+ estimatedInputTokens,
208
+ estimatedOutputTokens,
209
+ suggestedModel,
210
+ confidence,
211
+ detectedPatterns: [...new Set(detectedPatterns)]
212
+ };
213
+ }
214
+ /**
215
+ * Route a task to the appropriate model
216
+ */
217
+ route(complexity, type) {
218
+ const exactKey = `${complexity}-${type}`;
219
+ if (this.routingRules.has(exactKey)) {
220
+ return this.routingRules.get(exactKey);
221
+ }
222
+ const wildcardKey = `*-${type}`;
223
+ if (this.routingRules.has(wildcardKey)) {
224
+ return this.routingRules.get(wildcardKey);
225
+ }
226
+ switch (complexity) {
227
+ case "simple":
228
+ return "haiku";
229
+ case "moderate":
230
+ return "sonnet";
231
+ case "complex":
232
+ return "opus";
233
+ }
234
+ }
235
+ /**
236
+ * Route a task directly from task text
237
+ */
238
+ routeTask(task) {
239
+ const analysis = this.analyzeTask(task);
240
+ return analysis.suggestedModel;
241
+ }
242
+ /**
243
+ * Estimate output tokens based on task type and complexity
244
+ */
245
+ estimateOutputTokens(complexity, type) {
246
+ const baseTokens = {
247
+ query: 200,
248
+ generation: 500,
249
+ review: 400,
250
+ reasoning: 600,
251
+ creative: 400,
252
+ refactor: 800,
253
+ debug: 500,
254
+ architecture: 1e3
255
+ };
256
+ const multipliers = {
257
+ simple: 0.5,
258
+ moderate: 1,
259
+ complex: 2
260
+ };
261
+ return Math.ceil(baseTokens[type] * multipliers[complexity]);
262
+ }
263
+ /**
264
+ * Add a custom routing rule
265
+ */
266
+ addRule(rule) {
267
+ this.customRules.push(rule);
268
+ this.routingRules.set(rule.pattern, rule.model);
269
+ }
270
+ /**
271
+ * Remove a routing rule
272
+ */
273
+ removeRule(pattern) {
274
+ const index = this.customRules.findIndex((r) => r.pattern === pattern);
275
+ if (index >= 0) {
276
+ this.customRules.splice(index, 1);
277
+ this.routingRules.delete(pattern);
278
+ return true;
279
+ }
280
+ return false;
281
+ }
282
+ /**
283
+ * Get all current routing rules
284
+ */
285
+ getRules() {
286
+ return [...DEFAULT_ROUTING_RULES, ...this.customRules];
287
+ }
288
+ /**
289
+ * Get cost estimate for a task
290
+ */
291
+ estimateCost(task) {
292
+ const analysis = this.analyzeTask(task);
293
+ return {
294
+ model: analysis.suggestedModel,
295
+ estimatedInputTokens: analysis.estimatedInputTokens,
296
+ estimatedOutputTokens: analysis.estimatedOutputTokens,
297
+ estimatedTotalTokens: analysis.estimatedInputTokens + analysis.estimatedOutputTokens
298
+ };
299
+ }
300
+ }
301
+ let routerInstance = null;
302
+ function getTaskRouter() {
303
+ if (!routerInstance) {
304
+ routerInstance = new TaskRouter();
305
+ }
306
+ return routerInstance;
307
+ }
308
+ function resetTaskRouter() {
309
+ routerInstance = null;
310
+ }
311
+ function routeTask(task) {
312
+ return getTaskRouter().routeTask(task);
313
+ }
314
+ function analyzeTask(task) {
315
+ return getTaskRouter().analyzeTask(task);
316
+ }
317
+ export {
318
+ TaskRouter,
319
+ analyzeTask,
320
+ getTaskRouter,
321
+ resetTaskRouter,
322
+ routeTask
323
+ };
324
+ //# sourceMappingURL=taskRouter.js.map