@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,574 @@
1
+ import { spawn } from "child_process";
2
+ import { platform } from "os";
3
+ import { existsSync } from "fs";
4
+ import { resolve } from "path";
5
+ import { DEFAULT_SANDBOX_CONFIG } from "./types.js";
6
+ import { FilesystemBoundary } from "./filesystemBoundary.js";
7
+ import { NetworkProxy } from "./networkProxy.js";
8
+ class SandboxController {
9
+ config;
10
+ implementation;
11
+ filesystemBoundary;
12
+ networkProxy;
13
+ violations = [];
14
+ workingDir;
15
+ constructor(workingDir, config) {
16
+ this.workingDir = resolve(workingDir);
17
+ this.config = { ...DEFAULT_SANDBOX_CONFIG, ...config };
18
+ this.implementation = this.detectImplementation();
19
+ this.filesystemBoundary = new FilesystemBoundary(
20
+ this.config.filesystem,
21
+ this.workingDir
22
+ );
23
+ this.networkProxy = new NetworkProxy(this.config.network);
24
+ }
25
+ /**
26
+ * Check if sandbox is available on this system
27
+ */
28
+ async isAvailable() {
29
+ if (!this.config.enabled) {
30
+ return false;
31
+ }
32
+ switch (this.implementation) {
33
+ case "seatbelt":
34
+ return this.isSeatbeltAvailable();
35
+ case "bubblewrap":
36
+ return this.isBubblewrapAvailable();
37
+ case "docker":
38
+ return this.isDockerAvailable();
39
+ default:
40
+ return false;
41
+ }
42
+ }
43
+ /**
44
+ * Get the implementation type
45
+ */
46
+ getImplementationType() {
47
+ return this.implementation;
48
+ }
49
+ /**
50
+ * Initialize the sandbox
51
+ */
52
+ async initialize(config) {
53
+ this.config = config;
54
+ this.filesystemBoundary = new FilesystemBoundary(
55
+ config.filesystem,
56
+ this.workingDir
57
+ );
58
+ this.networkProxy = new NetworkProxy(config.network);
59
+ this.violations = [];
60
+ }
61
+ /**
62
+ * Pre-validate a command against policies
63
+ */
64
+ async validateCommand(command) {
65
+ const violations = [];
66
+ if (this.isExcludedCommand(command)) {
67
+ return { valid: true, violations: [] };
68
+ }
69
+ const fsResult = this.filesystemBoundary.analyzeCommand(command);
70
+ for (const violation of fsResult.violations) {
71
+ violation.command = command;
72
+ violations.push(violation);
73
+ }
74
+ const netResult = this.networkProxy.analyzeCommand(command);
75
+ for (const violation of netResult.violations) {
76
+ violation.command = command;
77
+ violations.push(violation);
78
+ }
79
+ this.violations.push(...violations);
80
+ return {
81
+ valid: violations.length === 0,
82
+ violations
83
+ };
84
+ }
85
+ /**
86
+ * Execute a command in the sandbox
87
+ */
88
+ async execute(command, workingDir, signal, timeout) {
89
+ const startTime = Date.now();
90
+ this.workingDir = resolve(workingDir);
91
+ this.filesystemBoundary.setWorkingDir(this.workingDir);
92
+ if (!this.config.enabled) {
93
+ return this.executeDirectly(command, signal, timeout);
94
+ }
95
+ const validation = await this.validateCommand(command);
96
+ if (!validation.valid) {
97
+ return {
98
+ stdout: "",
99
+ stderr: `Sandbox blocked command:
100
+ ${validation.violations.map((v) => `- ${v.details}`).join("\n")}`,
101
+ exitCode: 1,
102
+ interrupted: false,
103
+ blocked: true,
104
+ blockReason: validation.violations[0]?.details,
105
+ duration: Date.now() - startTime
106
+ };
107
+ }
108
+ if (this.isExcludedCommand(command)) {
109
+ return this.executeDirectly(command, signal, timeout);
110
+ }
111
+ switch (this.implementation) {
112
+ case "seatbelt":
113
+ return this.executeWithSeatbelt(command, signal, timeout, startTime);
114
+ case "bubblewrap":
115
+ return this.executeWithBubblewrap(command, signal, timeout, startTime);
116
+ case "docker":
117
+ return this.executeWithDocker(command, signal, timeout, startTime);
118
+ default:
119
+ return this.executeDirectly(command, signal, timeout);
120
+ }
121
+ }
122
+ /**
123
+ * Get current configuration
124
+ */
125
+ getConfig() {
126
+ return { ...this.config };
127
+ }
128
+ /**
129
+ * Update configuration
130
+ */
131
+ updateConfig(config) {
132
+ this.config = { ...this.config, ...config };
133
+ if (config.filesystem) {
134
+ this.filesystemBoundary.updatePolicy(config.filesystem);
135
+ }
136
+ if (config.network) {
137
+ this.networkProxy.updatePolicy(config.network);
138
+ }
139
+ }
140
+ /**
141
+ * Get violation history
142
+ */
143
+ getViolations() {
144
+ return [
145
+ ...this.violations,
146
+ ...this.filesystemBoundary.getViolations(),
147
+ ...this.networkProxy.getViolations()
148
+ ];
149
+ }
150
+ /**
151
+ * Clear violation history
152
+ */
153
+ clearViolations() {
154
+ this.violations = [];
155
+ this.filesystemBoundary.clearViolations();
156
+ this.networkProxy.clearViolations();
157
+ }
158
+ /**
159
+ * Get filesystem boundary instance
160
+ */
161
+ getFilesystemBoundary() {
162
+ return this.filesystemBoundary;
163
+ }
164
+ /**
165
+ * Get network proxy instance
166
+ */
167
+ getNetworkProxy() {
168
+ return this.networkProxy;
169
+ }
170
+ /**
171
+ * Detect the best available sandbox implementation
172
+ */
173
+ detectImplementation() {
174
+ const os = platform();
175
+ if (os === "darwin") {
176
+ return "seatbelt";
177
+ } else if (os === "linux") {
178
+ if (this.hasBubblewrap()) {
179
+ return "bubblewrap";
180
+ } else if (this.hasDocker()) {
181
+ return "docker";
182
+ }
183
+ }
184
+ return "none";
185
+ }
186
+ /**
187
+ * Check if bubblewrap is installed
188
+ */
189
+ hasBubblewrap() {
190
+ return existsSync("/usr/bin/bwrap") || existsSync("/usr/local/bin/bwrap");
191
+ }
192
+ /**
193
+ * Check if docker is available
194
+ */
195
+ hasDocker() {
196
+ return existsSync("/usr/bin/docker") || existsSync("/usr/local/bin/docker");
197
+ }
198
+ /**
199
+ * Check if seatbelt (macOS sandbox-exec) is available
200
+ */
201
+ async isSeatbeltAvailable() {
202
+ return platform() === "darwin" && existsSync("/usr/bin/sandbox-exec");
203
+ }
204
+ /**
205
+ * Check if bubblewrap is available and working
206
+ */
207
+ async isBubblewrapAvailable() {
208
+ if (!this.hasBubblewrap()) return false;
209
+ try {
210
+ const result = await this.spawnAsync("bwrap", ["--version"]);
211
+ return result.exitCode === 0;
212
+ } catch {
213
+ return false;
214
+ }
215
+ }
216
+ /**
217
+ * Check if docker is available and running
218
+ */
219
+ async isDockerAvailable() {
220
+ if (!this.hasDocker()) return false;
221
+ try {
222
+ const result = await this.spawnAsync("docker", ["info"]);
223
+ return result.exitCode === 0;
224
+ } catch {
225
+ return false;
226
+ }
227
+ }
228
+ /**
229
+ * Check if a command is excluded from sandboxing
230
+ */
231
+ isExcludedCommand(command) {
232
+ const firstWord = command.trim().split(/\s+/)[0]?.toLowerCase();
233
+ if (!firstWord) return false;
234
+ return this.config.process.excludedCommands.some(
235
+ (excluded) => firstWord === excluded.toLowerCase()
236
+ );
237
+ }
238
+ /**
239
+ * Execute command directly without sandboxing
240
+ */
241
+ async executeDirectly(command, signal, timeout) {
242
+ const startTime = Date.now();
243
+ const effectiveTimeout = timeout || this.config.process.maxExecutionTime;
244
+ try {
245
+ const result = await this.spawnAsync("sh", ["-c", command], {
246
+ cwd: this.workingDir,
247
+ signal,
248
+ timeout: effectiveTimeout
249
+ });
250
+ return {
251
+ stdout: result.stdout,
252
+ stderr: result.stderr,
253
+ exitCode: result.exitCode,
254
+ interrupted: result.interrupted,
255
+ blocked: false,
256
+ duration: Date.now() - startTime
257
+ };
258
+ } catch (error) {
259
+ const err = error;
260
+ return {
261
+ stdout: "",
262
+ stderr: err.message,
263
+ exitCode: 1,
264
+ interrupted: signal?.aborted || false,
265
+ blocked: false,
266
+ duration: Date.now() - startTime
267
+ };
268
+ }
269
+ }
270
+ /**
271
+ * Execute command with macOS seatbelt sandbox
272
+ */
273
+ async executeWithSeatbelt(command, signal, timeout, startTime) {
274
+ const start = startTime || Date.now();
275
+ const effectiveTimeout = timeout || this.config.process.maxExecutionTime;
276
+ const profile = this.generateSeatbeltProfile();
277
+ try {
278
+ const result = await this.spawnAsync(
279
+ "sandbox-exec",
280
+ ["-p", profile, "sh", "-c", command],
281
+ {
282
+ cwd: this.workingDir,
283
+ signal,
284
+ timeout: effectiveTimeout
285
+ }
286
+ );
287
+ return {
288
+ stdout: result.stdout,
289
+ stderr: result.stderr,
290
+ exitCode: result.exitCode,
291
+ interrupted: result.interrupted,
292
+ blocked: false,
293
+ duration: Date.now() - start
294
+ };
295
+ } catch (error) {
296
+ const err = error;
297
+ const isBlocked = err.message.includes("sandbox") || err.message.includes("denied");
298
+ return {
299
+ stdout: "",
300
+ stderr: err.message,
301
+ exitCode: 1,
302
+ interrupted: signal?.aborted || false,
303
+ blocked: isBlocked,
304
+ blockReason: isBlocked ? "Sandbox policy violation" : void 0,
305
+ duration: Date.now() - start
306
+ };
307
+ }
308
+ }
309
+ /**
310
+ * Generate macOS seatbelt profile
311
+ */
312
+ generateSeatbeltProfile() {
313
+ const writeAllowed = this.config.filesystem.writeAllowed.map((p) => {
314
+ if (p === "./") return `(subpath "${this.workingDir}")`;
315
+ if (p === "*") return '(subpath "/")';
316
+ const absPath = resolve(this.workingDir, p);
317
+ return `(subpath "${absPath}")`;
318
+ }).join("\n ");
319
+ const readAllowed = this.config.filesystem.readAllowed.map((p) => {
320
+ if (p === "*") return '(subpath "/")';
321
+ const absPath = resolve(this.workingDir, p);
322
+ return `(subpath "${absPath}")`;
323
+ }).join("\n ");
324
+ const networkRules = this.config.network.blockAll ? "(deny network*)" : this.config.network.allowedDomains.length > 0 ? `(allow network-outbound
325
+ (remote tcp "${this.config.network.allowedDomains.join('", "')}"))` : "(allow network-outbound)";
326
+ return `
327
+ (version 1)
328
+ (deny default)
329
+
330
+ ; Allow basic system operations
331
+ (allow process-exec*)
332
+ (allow process-fork)
333
+ (allow file-read-metadata)
334
+ (allow sysctl-read)
335
+
336
+ ; Allow reading system libraries and executables
337
+ (allow file-read*
338
+ (subpath "/usr")
339
+ (subpath "/bin")
340
+ (subpath "/sbin")
341
+ (subpath "/System")
342
+ (subpath "/Library")
343
+ (subpath "/private/var")
344
+ (subpath "/private/tmp")
345
+ (subpath "/dev")
346
+ (subpath "/tmp")
347
+ ${readAllowed}
348
+ )
349
+
350
+ ; Allow writing to specific paths
351
+ (allow file-write*
352
+ (subpath "/dev")
353
+ (subpath "/private/tmp")
354
+ (subpath "/tmp")
355
+ ${writeAllowed}
356
+ )
357
+
358
+ ; Network rules
359
+ ${networkRules}
360
+
361
+ ; Allow stdout/stderr
362
+ (allow file-write-data
363
+ (literal "/dev/null")
364
+ (literal "/dev/zero")
365
+ (literal "/dev/random")
366
+ (literal "/dev/urandom")
367
+ (literal "/dev/tty")
368
+ (literal "/dev/console")
369
+ )
370
+
371
+ ; Allow process management
372
+ (allow signal)
373
+ (allow mach-lookup)
374
+ (allow ipc-posix-shm-read-data)
375
+ (allow ipc-posix-shm-write-data)
376
+ `;
377
+ }
378
+ /**
379
+ * Execute command with Linux bubblewrap sandbox
380
+ */
381
+ async executeWithBubblewrap(command, signal, timeout, startTime) {
382
+ const start = startTime || Date.now();
383
+ const effectiveTimeout = timeout || this.config.process.maxExecutionTime;
384
+ const bwrapArgs = this.buildBubblewrapArgs();
385
+ try {
386
+ const result = await this.spawnAsync(
387
+ "bwrap",
388
+ [...bwrapArgs, "sh", "-c", command],
389
+ {
390
+ cwd: this.workingDir,
391
+ signal,
392
+ timeout: effectiveTimeout
393
+ }
394
+ );
395
+ return {
396
+ stdout: result.stdout,
397
+ stderr: result.stderr,
398
+ exitCode: result.exitCode,
399
+ interrupted: result.interrupted,
400
+ blocked: false,
401
+ duration: Date.now() - start
402
+ };
403
+ } catch (error) {
404
+ const err = error;
405
+ return {
406
+ stdout: "",
407
+ stderr: err.message,
408
+ exitCode: 1,
409
+ interrupted: signal?.aborted || false,
410
+ blocked: false,
411
+ duration: Date.now() - start
412
+ };
413
+ }
414
+ }
415
+ /**
416
+ * Build bubblewrap command arguments
417
+ */
418
+ buildBubblewrapArgs() {
419
+ const args = [];
420
+ args.push("--unshare-all");
421
+ args.push("--die-with-parent");
422
+ args.push("--ro-bind", "/usr", "/usr");
423
+ args.push("--ro-bind", "/bin", "/bin");
424
+ args.push("--ro-bind", "/lib", "/lib");
425
+ if (existsSync("/lib64")) {
426
+ args.push("--ro-bind", "/lib64", "/lib64");
427
+ }
428
+ args.push("--ro-bind", "/etc", "/etc");
429
+ args.push("--tmpfs", "/tmp");
430
+ args.push("--bind", this.workingDir, this.workingDir);
431
+ args.push("--chdir", this.workingDir);
432
+ for (const path of this.config.filesystem.readAllowed) {
433
+ if (path !== "*" && path !== "./" && existsSync(path)) {
434
+ const absPath = resolve(this.workingDir, path);
435
+ if (existsSync(absPath)) {
436
+ args.push("--ro-bind", absPath, absPath);
437
+ }
438
+ }
439
+ }
440
+ for (const path of this.config.filesystem.writeAllowed) {
441
+ if (path !== "./" && path !== "*") {
442
+ const absPath = resolve(this.workingDir, path);
443
+ if (existsSync(absPath)) {
444
+ args.push("--bind", absPath, absPath);
445
+ }
446
+ }
447
+ }
448
+ if (this.config.network.blockAll) {
449
+ args.push("--unshare-net");
450
+ }
451
+ if (this.config.process.maxProcesses > 0) {
452
+ args.push(
453
+ "--setenv",
454
+ "MINTO_MAX_PROCS",
455
+ String(this.config.process.maxProcesses)
456
+ );
457
+ }
458
+ return args;
459
+ }
460
+ /**
461
+ * Execute command with Docker sandbox
462
+ */
463
+ async executeWithDocker(command, signal, timeout, startTime) {
464
+ const start = startTime || Date.now();
465
+ const effectiveTimeout = timeout || this.config.process.maxExecutionTime;
466
+ const dockerArgs = [
467
+ "run",
468
+ "--rm",
469
+ "-i",
470
+ "--network",
471
+ this.config.network.blockAll ? "none" : "bridge",
472
+ "-v",
473
+ `${this.workingDir}:/workspace`,
474
+ "-w",
475
+ "/workspace"
476
+ ];
477
+ if (this.config.process.maxMemory > 0) {
478
+ dockerArgs.push("--memory", `${this.config.process.maxMemory}`);
479
+ }
480
+ dockerArgs.push("alpine:latest");
481
+ dockerArgs.push("sh", "-c", command);
482
+ try {
483
+ const result = await this.spawnAsync("docker", dockerArgs, {
484
+ cwd: this.workingDir,
485
+ signal,
486
+ timeout: effectiveTimeout
487
+ });
488
+ return {
489
+ stdout: result.stdout,
490
+ stderr: result.stderr,
491
+ exitCode: result.exitCode,
492
+ interrupted: result.interrupted,
493
+ blocked: false,
494
+ duration: Date.now() - start
495
+ };
496
+ } catch (error) {
497
+ const err = error;
498
+ return {
499
+ stdout: "",
500
+ stderr: err.message,
501
+ exitCode: 1,
502
+ interrupted: signal?.aborted || false,
503
+ blocked: false,
504
+ duration: Date.now() - start
505
+ };
506
+ }
507
+ }
508
+ /**
509
+ * Spawn a process with promise wrapper
510
+ */
511
+ spawnAsync(cmd, args, options) {
512
+ return new Promise((resolve2, reject) => {
513
+ let stdout = "";
514
+ let stderr = "";
515
+ let interrupted = false;
516
+ let child = null;
517
+ const timeoutId = options?.timeout ? setTimeout(() => {
518
+ interrupted = true;
519
+ child?.kill("SIGTERM");
520
+ }, options.timeout) : null;
521
+ if (options?.signal) {
522
+ options.signal.addEventListener("abort", () => {
523
+ interrupted = true;
524
+ child?.kill("SIGTERM");
525
+ });
526
+ }
527
+ child = spawn(cmd, args, {
528
+ cwd: options?.cwd || this.workingDir,
529
+ shell: false,
530
+ stdio: ["pipe", "pipe", "pipe"]
531
+ });
532
+ child.stdout?.on("data", (data) => {
533
+ stdout += data.toString();
534
+ });
535
+ child.stderr?.on("data", (data) => {
536
+ stderr += data.toString();
537
+ });
538
+ child.on("error", (error) => {
539
+ if (timeoutId) clearTimeout(timeoutId);
540
+ reject(error);
541
+ });
542
+ child.on("close", (code) => {
543
+ if (timeoutId) clearTimeout(timeoutId);
544
+ resolve2({
545
+ stdout,
546
+ stderr,
547
+ exitCode: code ?? 1,
548
+ interrupted
549
+ });
550
+ });
551
+ });
552
+ }
553
+ }
554
+ let globalSandboxController = null;
555
+ function getSandboxController(workingDir) {
556
+ if (!globalSandboxController) {
557
+ globalSandboxController = new SandboxController(workingDir || process.cwd());
558
+ } else if (workingDir) {
559
+ globalSandboxController = new SandboxController(
560
+ workingDir,
561
+ globalSandboxController.getConfig()
562
+ );
563
+ }
564
+ return globalSandboxController;
565
+ }
566
+ function resetSandboxController() {
567
+ globalSandboxController = null;
568
+ }
569
+ export {
570
+ SandboxController,
571
+ getSandboxController,
572
+ resetSandboxController
573
+ };
574
+ //# sourceMappingURL=sandboxController.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/services/sandbox/sandboxController.ts"],
4
+ "sourcesContent": ["/**\n * Sandbox Controller\n *\n * Main controller for the sandbox execution system.\n * Coordinates filesystem, network, and process isolation.\n */\n\nimport { spawn, type ChildProcess } from 'child_process'\nimport { platform } from 'os'\nimport { existsSync } from 'fs'\nimport { resolve } from 'path'\nimport type {\n ISandboxController,\n SandboxConfig,\n SandboxExecutionResult,\n SandboxImplementation,\n SandboxViolation,\n} from './types'\nimport { DEFAULT_SANDBOX_CONFIG } from './types'\nimport { FilesystemBoundary } from './filesystemBoundary'\nimport { NetworkProxy } from './networkProxy'\n\n/**\n * Sandbox Controller Implementation\n *\n * Provides unified sandbox management with OS-specific implementations.\n */\nexport class SandboxController implements ISandboxController {\n private config: SandboxConfig\n private implementation: SandboxImplementation\n private filesystemBoundary: FilesystemBoundary\n private networkProxy: NetworkProxy\n private violations: SandboxViolation[] = []\n private workingDir: string\n\n constructor(workingDir: string, config?: Partial<SandboxConfig>) {\n this.workingDir = resolve(workingDir)\n this.config = { ...DEFAULT_SANDBOX_CONFIG, ...config }\n this.implementation = this.detectImplementation()\n this.filesystemBoundary = new FilesystemBoundary(\n this.config.filesystem,\n this.workingDir,\n )\n this.networkProxy = new NetworkProxy(this.config.network)\n }\n\n /**\n * Check if sandbox is available on this system\n */\n async isAvailable(): Promise<boolean> {\n if (!this.config.enabled) {\n return false\n }\n\n switch (this.implementation) {\n case 'seatbelt':\n return this.isSeatbeltAvailable()\n case 'bubblewrap':\n return this.isBubblewrapAvailable()\n case 'docker':\n return this.isDockerAvailable()\n default:\n return false\n }\n }\n\n /**\n * Get the implementation type\n */\n getImplementationType(): SandboxImplementation {\n return this.implementation\n }\n\n /**\n * Initialize the sandbox\n */\n async initialize(config: SandboxConfig): Promise<void> {\n this.config = config\n this.filesystemBoundary = new FilesystemBoundary(\n config.filesystem,\n this.workingDir,\n )\n this.networkProxy = new NetworkProxy(config.network)\n this.violations = []\n }\n\n /**\n * Pre-validate a command against policies\n */\n async validateCommand(command: string): Promise<{\n valid: boolean\n violations: SandboxViolation[]\n }> {\n const violations: SandboxViolation[] = []\n\n // Check if command is excluded from sandboxing\n if (this.isExcludedCommand(command)) {\n return { valid: true, violations: [] }\n }\n\n // Validate filesystem access\n const fsResult = this.filesystemBoundary.analyzeCommand(command)\n for (const violation of fsResult.violations) {\n violation.command = command\n violations.push(violation)\n }\n\n // Validate network access\n const netResult = this.networkProxy.analyzeCommand(command)\n for (const violation of netResult.violations) {\n violation.command = command\n violations.push(violation)\n }\n\n // Store all violations\n this.violations.push(...violations)\n\n return {\n valid: violations.length === 0,\n violations,\n }\n }\n\n /**\n * Execute a command in the sandbox\n */\n async execute(\n command: string,\n workingDir: string,\n signal?: AbortSignal,\n timeout?: number,\n ): Promise<SandboxExecutionResult> {\n const startTime = Date.now()\n this.workingDir = resolve(workingDir)\n this.filesystemBoundary.setWorkingDir(this.workingDir)\n\n // If sandbox is disabled, execute directly\n if (!this.config.enabled) {\n return this.executeDirectly(command, signal, timeout)\n }\n\n // Validate command first\n const validation = await this.validateCommand(command)\n if (!validation.valid) {\n return {\n stdout: '',\n stderr: `Sandbox blocked command:\\n${validation.violations\n .map(v => `- ${v.details}`)\n .join('\\n')}`,\n exitCode: 1,\n interrupted: false,\n blocked: true,\n blockReason: validation.violations[0]?.details,\n duration: Date.now() - startTime,\n }\n }\n\n // Check if command is excluded from sandboxing\n if (this.isExcludedCommand(command)) {\n return this.executeDirectly(command, signal, timeout)\n }\n\n // Execute with appropriate sandbox\n switch (this.implementation) {\n case 'seatbelt':\n return this.executeWithSeatbelt(command, signal, timeout, startTime)\n case 'bubblewrap':\n return this.executeWithBubblewrap(command, signal, timeout, startTime)\n case 'docker':\n return this.executeWithDocker(command, signal, timeout, startTime)\n default:\n // No sandbox available, execute directly with validation only\n return this.executeDirectly(command, signal, timeout)\n }\n }\n\n /**\n * Get current configuration\n */\n getConfig(): SandboxConfig {\n return { ...this.config }\n }\n\n /**\n * Update configuration\n */\n updateConfig(config: Partial<SandboxConfig>): void {\n this.config = { ...this.config, ...config }\n if (config.filesystem) {\n this.filesystemBoundary.updatePolicy(config.filesystem)\n }\n if (config.network) {\n this.networkProxy.updatePolicy(config.network)\n }\n }\n\n /**\n * Get violation history\n */\n getViolations(): SandboxViolation[] {\n return [\n ...this.violations,\n ...this.filesystemBoundary.getViolations(),\n ...this.networkProxy.getViolations(),\n ]\n }\n\n /**\n * Clear violation history\n */\n clearViolations(): void {\n this.violations = []\n this.filesystemBoundary.clearViolations()\n this.networkProxy.clearViolations()\n }\n\n /**\n * Get filesystem boundary instance\n */\n getFilesystemBoundary(): FilesystemBoundary {\n return this.filesystemBoundary\n }\n\n /**\n * Get network proxy instance\n */\n getNetworkProxy(): NetworkProxy {\n return this.networkProxy\n }\n\n /**\n * Detect the best available sandbox implementation\n */\n private detectImplementation(): SandboxImplementation {\n const os = platform()\n\n if (os === 'darwin') {\n // macOS - use seatbelt/sandbox-exec\n return 'seatbelt'\n } else if (os === 'linux') {\n // Linux - prefer bubblewrap, fallback to docker\n if (this.hasBubblewrap()) {\n return 'bubblewrap'\n } else if (this.hasDocker()) {\n return 'docker'\n }\n }\n\n return 'none'\n }\n\n /**\n * Check if bubblewrap is installed\n */\n private hasBubblewrap(): boolean {\n return existsSync('/usr/bin/bwrap') || existsSync('/usr/local/bin/bwrap')\n }\n\n /**\n * Check if docker is available\n */\n private hasDocker(): boolean {\n return existsSync('/usr/bin/docker') || existsSync('/usr/local/bin/docker')\n }\n\n /**\n * Check if seatbelt (macOS sandbox-exec) is available\n */\n private async isSeatbeltAvailable(): Promise<boolean> {\n return platform() === 'darwin' && existsSync('/usr/bin/sandbox-exec')\n }\n\n /**\n * Check if bubblewrap is available and working\n */\n private async isBubblewrapAvailable(): Promise<boolean> {\n if (!this.hasBubblewrap()) return false\n try {\n const result = await this.spawnAsync('bwrap', ['--version'])\n return result.exitCode === 0\n } catch {\n return false\n }\n }\n\n /**\n * Check if docker is available and running\n */\n private async isDockerAvailable(): Promise<boolean> {\n if (!this.hasDocker()) return false\n try {\n const result = await this.spawnAsync('docker', ['info'])\n return result.exitCode === 0\n } catch {\n return false\n }\n }\n\n /**\n * Check if a command is excluded from sandboxing\n */\n private isExcludedCommand(command: string): boolean {\n const firstWord = command.trim().split(/\\s+/)[0]?.toLowerCase()\n if (!firstWord) return false\n return this.config.process.excludedCommands.some(\n excluded => firstWord === excluded.toLowerCase(),\n )\n }\n\n /**\n * Execute command directly without sandboxing\n */\n private async executeDirectly(\n command: string,\n signal?: AbortSignal,\n timeout?: number,\n ): Promise<SandboxExecutionResult> {\n const startTime = Date.now()\n const effectiveTimeout = timeout || this.config.process.maxExecutionTime\n\n try {\n const result = await this.spawnAsync('sh', ['-c', command], {\n cwd: this.workingDir,\n signal,\n timeout: effectiveTimeout,\n })\n\n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n interrupted: result.interrupted,\n blocked: false,\n duration: Date.now() - startTime,\n }\n } catch (error) {\n const err = error as Error\n return {\n stdout: '',\n stderr: err.message,\n exitCode: 1,\n interrupted: signal?.aborted || false,\n blocked: false,\n duration: Date.now() - startTime,\n }\n }\n }\n\n /**\n * Execute command with macOS seatbelt sandbox\n */\n private async executeWithSeatbelt(\n command: string,\n signal?: AbortSignal,\n timeout?: number,\n startTime?: number,\n ): Promise<SandboxExecutionResult> {\n const start = startTime || Date.now()\n const effectiveTimeout = timeout || this.config.process.maxExecutionTime\n\n // Generate seatbelt profile\n const profile = this.generateSeatbeltProfile()\n\n try {\n const result = await this.spawnAsync(\n 'sandbox-exec',\n ['-p', profile, 'sh', '-c', command],\n {\n cwd: this.workingDir,\n signal,\n timeout: effectiveTimeout,\n },\n )\n\n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n interrupted: result.interrupted,\n blocked: false,\n duration: Date.now() - start,\n }\n } catch (error) {\n const err = error as Error\n const isBlocked =\n err.message.includes('sandbox') || err.message.includes('denied')\n return {\n stdout: '',\n stderr: err.message,\n exitCode: 1,\n interrupted: signal?.aborted || false,\n blocked: isBlocked,\n blockReason: isBlocked ? 'Sandbox policy violation' : undefined,\n duration: Date.now() - start,\n }\n }\n }\n\n /**\n * Generate macOS seatbelt profile\n */\n private generateSeatbeltProfile(): string {\n const writeAllowed = this.config.filesystem.writeAllowed\n .map(p => {\n if (p === './') return `(subpath \"${this.workingDir}\")`\n if (p === '*') return '(subpath \"/\")'\n const absPath = resolve(this.workingDir, p)\n return `(subpath \"${absPath}\")`\n })\n .join('\\n ')\n\n const readAllowed = this.config.filesystem.readAllowed\n .map(p => {\n if (p === '*') return '(subpath \"/\")'\n const absPath = resolve(this.workingDir, p)\n return `(subpath \"${absPath}\")`\n })\n .join('\\n ')\n\n const networkRules = this.config.network.blockAll\n ? '(deny network*)'\n : this.config.network.allowedDomains.length > 0\n ? `(allow network-outbound\n (remote tcp \"${this.config.network.allowedDomains.join('\", \"')}\"))`\n : '(allow network-outbound)'\n\n return `\n(version 1)\n(deny default)\n\n; Allow basic system operations\n(allow process-exec*)\n(allow process-fork)\n(allow file-read-metadata)\n(allow sysctl-read)\n\n; Allow reading system libraries and executables\n(allow file-read*\n (subpath \"/usr\")\n (subpath \"/bin\")\n (subpath \"/sbin\")\n (subpath \"/System\")\n (subpath \"/Library\")\n (subpath \"/private/var\")\n (subpath \"/private/tmp\")\n (subpath \"/dev\")\n (subpath \"/tmp\")\n ${readAllowed}\n)\n\n; Allow writing to specific paths\n(allow file-write*\n (subpath \"/dev\")\n (subpath \"/private/tmp\")\n (subpath \"/tmp\")\n ${writeAllowed}\n)\n\n; Network rules\n${networkRules}\n\n; Allow stdout/stderr\n(allow file-write-data\n (literal \"/dev/null\")\n (literal \"/dev/zero\")\n (literal \"/dev/random\")\n (literal \"/dev/urandom\")\n (literal \"/dev/tty\")\n (literal \"/dev/console\")\n)\n\n; Allow process management\n(allow signal)\n(allow mach-lookup)\n(allow ipc-posix-shm-read-data)\n(allow ipc-posix-shm-write-data)\n`\n }\n\n /**\n * Execute command with Linux bubblewrap sandbox\n */\n private async executeWithBubblewrap(\n command: string,\n signal?: AbortSignal,\n timeout?: number,\n startTime?: number,\n ): Promise<SandboxExecutionResult> {\n const start = startTime || Date.now()\n const effectiveTimeout = timeout || this.config.process.maxExecutionTime\n\n // Build bubblewrap arguments\n const bwrapArgs = this.buildBubblewrapArgs()\n\n try {\n const result = await this.spawnAsync(\n 'bwrap',\n [...bwrapArgs, 'sh', '-c', command],\n {\n cwd: this.workingDir,\n signal,\n timeout: effectiveTimeout,\n },\n )\n\n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n interrupted: result.interrupted,\n blocked: false,\n duration: Date.now() - start,\n }\n } catch (error) {\n const err = error as Error\n return {\n stdout: '',\n stderr: err.message,\n exitCode: 1,\n interrupted: signal?.aborted || false,\n blocked: false,\n duration: Date.now() - start,\n }\n }\n }\n\n /**\n * Build bubblewrap command arguments\n */\n private buildBubblewrapArgs(): string[] {\n const args: string[] = []\n\n // Basic sandboxing\n args.push('--unshare-all')\n args.push('--die-with-parent')\n\n // Mount system directories read-only\n args.push('--ro-bind', '/usr', '/usr')\n args.push('--ro-bind', '/bin', '/bin')\n args.push('--ro-bind', '/lib', '/lib')\n if (existsSync('/lib64')) {\n args.push('--ro-bind', '/lib64', '/lib64')\n }\n args.push('--ro-bind', '/etc', '/etc')\n\n // Allow /tmp\n args.push('--tmpfs', '/tmp')\n\n // Set working directory with read-write access\n args.push('--bind', this.workingDir, this.workingDir)\n args.push('--chdir', this.workingDir)\n\n // Add additional read paths\n for (const path of this.config.filesystem.readAllowed) {\n if (path !== '*' && path !== './' && existsSync(path)) {\n const absPath = resolve(this.workingDir, path)\n if (existsSync(absPath)) {\n args.push('--ro-bind', absPath, absPath)\n }\n }\n }\n\n // Add additional write paths\n for (const path of this.config.filesystem.writeAllowed) {\n if (path !== './' && path !== '*') {\n const absPath = resolve(this.workingDir, path)\n if (existsSync(absPath)) {\n args.push('--bind', absPath, absPath)\n }\n }\n }\n\n // Network isolation (if blocking all)\n if (this.config.network.blockAll) {\n args.push('--unshare-net')\n }\n\n // Process limits\n if (this.config.process.maxProcesses > 0) {\n args.push(\n '--setenv',\n 'MINTO_MAX_PROCS',\n String(this.config.process.maxProcesses),\n )\n }\n\n return args\n }\n\n /**\n * Execute command with Docker sandbox\n */\n private async executeWithDocker(\n command: string,\n signal?: AbortSignal,\n timeout?: number,\n startTime?: number,\n ): Promise<SandboxExecutionResult> {\n const start = startTime || Date.now()\n const effectiveTimeout = timeout || this.config.process.maxExecutionTime\n\n // Build docker run arguments\n const dockerArgs = [\n 'run',\n '--rm',\n '-i',\n '--network',\n this.config.network.blockAll ? 'none' : 'bridge',\n '-v',\n `${this.workingDir}:/workspace`,\n '-w',\n '/workspace',\n ]\n\n // Add memory limit\n if (this.config.process.maxMemory > 0) {\n dockerArgs.push('--memory', `${this.config.process.maxMemory}`)\n }\n\n // Use a minimal image\n dockerArgs.push('alpine:latest')\n dockerArgs.push('sh', '-c', command)\n\n try {\n const result = await this.spawnAsync('docker', dockerArgs, {\n cwd: this.workingDir,\n signal,\n timeout: effectiveTimeout,\n })\n\n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n interrupted: result.interrupted,\n blocked: false,\n duration: Date.now() - start,\n }\n } catch (error) {\n const err = error as Error\n return {\n stdout: '',\n stderr: err.message,\n exitCode: 1,\n interrupted: signal?.aborted || false,\n blocked: false,\n duration: Date.now() - start,\n }\n }\n }\n\n /**\n * Spawn a process with promise wrapper\n */\n private spawnAsync(\n cmd: string,\n args: string[],\n options?: {\n cwd?: string\n signal?: AbortSignal\n timeout?: number\n },\n ): Promise<{\n stdout: string\n stderr: string\n exitCode: number\n interrupted: boolean\n }> {\n return new Promise((resolve, reject) => {\n let stdout = ''\n let stderr = ''\n let interrupted = false\n let child: ChildProcess | null = null\n\n const timeoutId = options?.timeout\n ? setTimeout(() => {\n interrupted = true\n child?.kill('SIGTERM')\n }, options.timeout)\n : null\n\n // Handle abort signal\n if (options?.signal) {\n options.signal.addEventListener('abort', () => {\n interrupted = true\n child?.kill('SIGTERM')\n })\n }\n\n child = spawn(cmd, args, {\n cwd: options?.cwd || this.workingDir,\n shell: false,\n stdio: ['pipe', 'pipe', 'pipe'],\n })\n\n child.stdout?.on('data', (data: Buffer) => {\n stdout += data.toString()\n })\n\n child.stderr?.on('data', (data: Buffer) => {\n stderr += data.toString()\n })\n\n child.on('error', (error: Error) => {\n if (timeoutId) clearTimeout(timeoutId)\n reject(error)\n })\n\n child.on('close', (code: number | null) => {\n if (timeoutId) clearTimeout(timeoutId)\n resolve({\n stdout,\n stderr,\n exitCode: code ?? 1,\n interrupted,\n })\n })\n })\n }\n}\n\n// Global singleton instance\nlet globalSandboxController: SandboxController | null = null\n\n/**\n * Get the global sandbox controller instance\n */\nexport function getSandboxController(workingDir?: string): SandboxController {\n if (!globalSandboxController) {\n globalSandboxController = new SandboxController(workingDir || process.cwd())\n } else if (workingDir) {\n // Update working directory if provided\n globalSandboxController = new SandboxController(\n workingDir,\n globalSandboxController.getConfig(),\n )\n }\n return globalSandboxController\n}\n\n/**\n * Reset the global sandbox controller (for testing)\n */\nexport function resetSandboxController(): void {\n globalSandboxController = null\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["resolve"]
7
+ }
@@ -0,0 +1,50 @@
1
+ const DEFAULT_SANDBOX_CONFIG = {
2
+ enabled: false,
3
+ // Disabled by default for backward compatibility
4
+ filesystem: {
5
+ writeAllowed: ["./"],
6
+ // Current working directory
7
+ readAllowed: ["*"],
8
+ // Allow reading everything by default
9
+ denied: [
10
+ ".env*",
11
+ ".env",
12
+ ".env.local",
13
+ ".env.*.local",
14
+ "secrets/**",
15
+ ".ssh/**",
16
+ ".gnupg/**",
17
+ ".aws/credentials",
18
+ ".config/gcloud/**",
19
+ "**/*.pem",
20
+ "**/*.key",
21
+ "**/id_rsa",
22
+ "**/id_ed25519"
23
+ ]
24
+ },
25
+ network: {
26
+ allowedDomains: [
27
+ "api.anthropic.com",
28
+ "api.openai.com",
29
+ "github.com",
30
+ "api.github.com",
31
+ "registry.npmjs.org",
32
+ "pypi.org"
33
+ ],
34
+ promptForNewDomains: true,
35
+ blockAll: false
36
+ },
37
+ process: {
38
+ excludedCommands: ["docker", "git", "node", "npm", "bun", "pnpm", "yarn"],
39
+ maxExecutionTime: 6e5,
40
+ // 10 minutes
41
+ maxMemory: 0,
42
+ // Unlimited
43
+ maxProcesses: 0
44
+ // Unlimited
45
+ }
46
+ };
47
+ export {
48
+ DEFAULT_SANDBOX_CONFIG
49
+ };
50
+ //# sourceMappingURL=types.js.map