@within-7/minto 0.1.7 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (601) hide show
  1. package/cli.js +155 -37
  2. package/dist/Tool.js +38 -0
  3. package/dist/Tool.js.map +3 -3
  4. package/dist/commands/agents/AgentsCommand.js +73 -49
  5. package/dist/commands/agents/AgentsCommand.js.map +2 -2
  6. package/dist/commands/agents/constants.js +1 -1
  7. package/dist/commands/agents/constants.js.map +1 -1
  8. package/dist/commands/agents/index.js +1 -1
  9. package/dist/commands/bug.js +74 -7
  10. package/dist/commands/bug.js.map +3 -3
  11. package/dist/commands/clear.js +3 -0
  12. package/dist/commands/clear.js.map +2 -2
  13. package/dist/commands/compact.js +37 -0
  14. package/dist/commands/compact.js.map +2 -2
  15. package/dist/commands/context.js +85 -0
  16. package/dist/commands/context.js.map +7 -0
  17. package/dist/commands/ctx_viz.js +18 -10
  18. package/dist/commands/ctx_viz.js.map +2 -2
  19. package/dist/commands/doctor.js +158 -12
  20. package/dist/commands/doctor.js.map +2 -2
  21. package/dist/commands/export.js +157 -0
  22. package/dist/commands/export.js.map +7 -0
  23. package/dist/commands/mcp-interactive.js +28 -18
  24. package/dist/commands/mcp-interactive.js.map +2 -2
  25. package/dist/commands/model.js +9 -7
  26. package/dist/commands/model.js.map +2 -2
  27. package/dist/commands/permissions.js +87 -0
  28. package/dist/commands/permissions.js.map +7 -0
  29. package/dist/commands/plugin/AddMarketplaceForm.js +3 -2
  30. package/dist/commands/plugin/AddMarketplaceForm.js.map +2 -2
  31. package/dist/commands/plugin/ConfirmDialog.js +2 -1
  32. package/dist/commands/plugin/ConfirmDialog.js.map +2 -2
  33. package/dist/commands/plugin/ErrorView.js +2 -1
  34. package/dist/commands/plugin/ErrorView.js.map +2 -2
  35. package/dist/commands/plugin/InstalledPluginsByMarketplace.js +5 -4
  36. package/dist/commands/plugin/InstalledPluginsByMarketplace.js.map +2 -2
  37. package/dist/commands/plugin/InstalledPluginsManager.js +5 -4
  38. package/dist/commands/plugin/InstalledPluginsManager.js.map +2 -2
  39. package/dist/commands/plugin/MainMenu.js +2 -1
  40. package/dist/commands/plugin/MainMenu.js.map +2 -2
  41. package/dist/commands/plugin/MarketplaceManager.js +5 -4
  42. package/dist/commands/plugin/MarketplaceManager.js.map +2 -2
  43. package/dist/commands/plugin/MarketplaceSelector.js +4 -3
  44. package/dist/commands/plugin/MarketplaceSelector.js.map +2 -2
  45. package/dist/commands/plugin/PlaceholderScreen.js +3 -2
  46. package/dist/commands/plugin/PlaceholderScreen.js.map +2 -2
  47. package/dist/commands/plugin/PluginBrowser.js +6 -5
  48. package/dist/commands/plugin/PluginBrowser.js.map +2 -2
  49. package/dist/commands/plugin/PluginDetailsInstall.js +5 -4
  50. package/dist/commands/plugin/PluginDetailsInstall.js.map +2 -2
  51. package/dist/commands/plugin/PluginDetailsManage.js +4 -3
  52. package/dist/commands/plugin/PluginDetailsManage.js.map +2 -2
  53. package/dist/commands/plugin.js +16 -15
  54. package/dist/commands/plugin.js.map +2 -2
  55. package/dist/commands/quit.js +3 -1
  56. package/dist/commands/quit.js.map +2 -2
  57. package/dist/commands/sandbox.js +105 -0
  58. package/dist/commands/sandbox.js.map +7 -0
  59. package/dist/commands/setup.js +2 -1
  60. package/dist/commands/setup.js.map +2 -2
  61. package/dist/commands/status.js +59 -0
  62. package/dist/commands/status.js.map +7 -0
  63. package/dist/commands/tasks.js +108 -0
  64. package/dist/commands/tasks.js.map +7 -0
  65. package/dist/commands/todos.js +123 -0
  66. package/dist/commands/todos.js.map +7 -0
  67. package/dist/commands/undo.js +245 -0
  68. package/dist/commands/undo.js.map +7 -0
  69. package/dist/commands.js +22 -2
  70. package/dist/commands.js.map +2 -2
  71. package/dist/components/AgentThinkingBlock.js +10 -18
  72. package/dist/components/AgentThinkingBlock.js.map +2 -2
  73. package/dist/components/AsciiLogo.js +7 -8
  74. package/dist/components/AsciiLogo.js.map +2 -2
  75. package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js +3 -2
  76. package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js.map +2 -2
  77. package/dist/components/AskUserQuestionDialog/QuestionView.js +2 -1
  78. package/dist/components/AskUserQuestionDialog/QuestionView.js.map +2 -2
  79. package/dist/components/BackgroundTasksPanel.js +78 -29
  80. package/dist/components/BackgroundTasksPanel.js.map +2 -2
  81. package/dist/components/BashStreamingProgress.js +24 -0
  82. package/dist/components/BashStreamingProgress.js.map +7 -0
  83. package/dist/components/CollapsibleHint.js +15 -0
  84. package/dist/components/CollapsibleHint.js.map +7 -0
  85. package/dist/components/Config.js +3 -2
  86. package/dist/components/Config.js.map +2 -2
  87. package/dist/components/ConsoleOAuthFlow.js +2 -1
  88. package/dist/components/ConsoleOAuthFlow.js.map +2 -2
  89. package/dist/components/Cost.js +2 -1
  90. package/dist/components/Cost.js.map +2 -2
  91. package/dist/components/FileEditToolUpdatedMessage.js +1 -1
  92. package/dist/components/FileEditToolUpdatedMessage.js.map +2 -2
  93. package/dist/components/HeaderBar.js +13 -8
  94. package/dist/components/HeaderBar.js.map +2 -2
  95. package/dist/components/HistorySearchOverlay.js +4 -3
  96. package/dist/components/HistorySearchOverlay.js.map +2 -2
  97. package/dist/components/HotkeyHelpPanel.js +134 -0
  98. package/dist/components/HotkeyHelpPanel.js.map +7 -0
  99. package/dist/components/InvalidConfigDialog.js +2 -1
  100. package/dist/components/InvalidConfigDialog.js.map +2 -2
  101. package/dist/components/Logo.js +24 -68
  102. package/dist/components/Logo.js.map +2 -2
  103. package/dist/components/MCPServerApprovalDialog.js +2 -1
  104. package/dist/components/MCPServerApprovalDialog.js.map +2 -2
  105. package/dist/components/MCPServerDialogCopy.js +2 -1
  106. package/dist/components/MCPServerDialogCopy.js.map +2 -2
  107. package/dist/components/MCPServerMultiselectDialog.js +2 -1
  108. package/dist/components/MCPServerMultiselectDialog.js.map +2 -2
  109. package/dist/components/Message.js +23 -7
  110. package/dist/components/Message.js.map +3 -3
  111. package/dist/components/MessageSelector.js +4 -3
  112. package/dist/components/MessageSelector.js.map +2 -2
  113. package/dist/components/ModeIndicator.js +2 -1
  114. package/dist/components/ModeIndicator.js.map +2 -2
  115. package/dist/components/ModelConfig.js +20 -6
  116. package/dist/components/ModelConfig.js.map +2 -2
  117. package/dist/components/ModelListManager.js +7 -6
  118. package/dist/components/ModelListManager.js.map +2 -2
  119. package/dist/components/ModelSelector/ModelSelector.js +27 -14
  120. package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
  121. package/dist/components/Onboarding.js +22 -16
  122. package/dist/components/Onboarding.js.map +2 -2
  123. package/dist/components/OperationSummary.js +130 -0
  124. package/dist/components/OperationSummary.js.map +7 -0
  125. package/dist/components/ProgressBar.js +74 -0
  126. package/dist/components/ProgressBar.js.map +7 -0
  127. package/dist/components/PromptInput.js +210 -87
  128. package/dist/components/PromptInput.js.map +2 -2
  129. package/dist/components/RequestStatusIndicator.js +194 -0
  130. package/dist/components/RequestStatusIndicator.js.map +7 -0
  131. package/dist/components/SensitiveFileWarning.js +31 -0
  132. package/dist/components/SensitiveFileWarning.js.map +7 -0
  133. package/dist/components/Spinner.js +141 -27
  134. package/dist/components/Spinner.js.map +2 -2
  135. package/dist/components/SpinnerSymbol.js +21 -27
  136. package/dist/components/SpinnerSymbol.js.map +2 -2
  137. package/dist/components/StreamingBashOutput.js +9 -8
  138. package/dist/components/StreamingBashOutput.js.map +2 -2
  139. package/dist/components/StructuredDiff.js +6 -8
  140. package/dist/components/StructuredDiff.js.map +2 -2
  141. package/dist/components/SubagentBlock.js +5 -3
  142. package/dist/components/SubagentBlock.js.map +2 -2
  143. package/dist/components/SubagentProgress.js +17 -15
  144. package/dist/components/SubagentProgress.js.map +2 -2
  145. package/dist/components/TaskCard.js +30 -24
  146. package/dist/components/TaskCard.js.map +2 -2
  147. package/dist/components/TextInput.js +9 -1
  148. package/dist/components/TextInput.js.map +2 -2
  149. package/dist/components/TodoChangeBlock.js +1 -1
  150. package/dist/components/TodoChangeBlock.js.map +2 -2
  151. package/dist/components/TodoPanel.js +140 -31
  152. package/dist/components/TodoPanel.js.map +3 -3
  153. package/dist/components/TokenCounter.js +74 -0
  154. package/dist/components/TokenCounter.js.map +7 -0
  155. package/dist/components/TokenWarning.js +2 -1
  156. package/dist/components/TokenWarning.js.map +2 -2
  157. package/dist/components/ToolUseLoader.js +2 -2
  158. package/dist/components/ToolUseLoader.js.map +2 -2
  159. package/dist/components/TreeConnector.js +26 -0
  160. package/dist/components/TreeConnector.js.map +7 -0
  161. package/dist/components/TrustDialog.js +2 -1
  162. package/dist/components/TrustDialog.js.map +2 -2
  163. package/dist/components/TurnCompletionIndicator.js +18 -0
  164. package/dist/components/TurnCompletionIndicator.js.map +7 -0
  165. package/dist/components/binary-feedback/BinaryFeedbackView.js +2 -1
  166. package/dist/components/binary-feedback/BinaryFeedbackView.js.map +2 -2
  167. package/dist/components/messages/AssistantTextMessage.js +20 -9
  168. package/dist/components/messages/AssistantTextMessage.js.map +2 -2
  169. package/dist/components/messages/AssistantThinkingMessage.js +18 -3
  170. package/dist/components/messages/AssistantThinkingMessage.js.map +2 -2
  171. package/dist/components/messages/AssistantToolUseMessage.js +17 -10
  172. package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
  173. package/dist/components/messages/GroupRenderer.js +54 -0
  174. package/dist/components/messages/GroupRenderer.js.map +7 -0
  175. package/dist/components/messages/NestedTasksPreview.js +24 -0
  176. package/dist/components/messages/NestedTasksPreview.js.map +7 -0
  177. package/dist/components/messages/ParallelTasksGroupView.js +93 -0
  178. package/dist/components/messages/ParallelTasksGroupView.js.map +7 -0
  179. package/dist/components/messages/TaskInModuleView.js +218 -0
  180. package/dist/components/messages/TaskInModuleView.js.map +7 -0
  181. package/dist/components/messages/TaskOutputContent.js +56 -0
  182. package/dist/components/messages/TaskOutputContent.js.map +7 -0
  183. package/dist/components/messages/UserPromptMessage.js +2 -2
  184. package/dist/components/messages/UserPromptMessage.js.map +2 -2
  185. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +2 -3
  186. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +2 -2
  187. package/dist/components/permissions/FallbackPermissionRequest.js +4 -4
  188. package/dist/components/permissions/FallbackPermissionRequest.js.map +2 -2
  189. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +4 -4
  190. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js.map +2 -2
  191. package/dist/constants/colors.js +120 -54
  192. package/dist/constants/colors.js.map +2 -2
  193. package/dist/constants/formatRules.js +102 -0
  194. package/dist/constants/formatRules.js.map +7 -0
  195. package/dist/constants/prompts.js +12 -34
  196. package/dist/constants/prompts.js.map +2 -2
  197. package/dist/constants/symbols.js +64 -6
  198. package/dist/constants/symbols.js.map +2 -2
  199. package/dist/constants/timing.js +5 -0
  200. package/dist/constants/timing.js.map +2 -2
  201. package/dist/constants/toolInputExamples.js +84 -0
  202. package/dist/constants/toolInputExamples.js.map +7 -0
  203. package/dist/core/backupManager.js +321 -0
  204. package/dist/core/backupManager.js.map +7 -0
  205. package/dist/core/config/defaults.js +84 -0
  206. package/dist/core/config/defaults.js.map +7 -0
  207. package/dist/core/config/index.js +111 -0
  208. package/dist/core/config/index.js.map +7 -0
  209. package/dist/core/config/loader.js +221 -0
  210. package/dist/core/config/loader.js.map +7 -0
  211. package/dist/core/config/migrations.js +128 -0
  212. package/dist/core/config/migrations.js.map +7 -0
  213. package/dist/core/config/schema.js +178 -0
  214. package/dist/core/config/schema.js.map +7 -0
  215. package/dist/core/costTracker.js +129 -0
  216. package/dist/core/costTracker.js.map +7 -0
  217. package/dist/core/gitAutoCommit.js +287 -0
  218. package/dist/core/gitAutoCommit.js.map +7 -0
  219. package/dist/core/index.js +8 -0
  220. package/dist/core/index.js.map +7 -0
  221. package/dist/core/operationTracker.js +212 -0
  222. package/dist/core/operationTracker.js.map +7 -0
  223. package/dist/core/permissions/auditLog.js +204 -0
  224. package/dist/core/permissions/auditLog.js.map +7 -0
  225. package/dist/core/permissions/engine/index.js +3 -0
  226. package/dist/core/permissions/engine/index.js.map +7 -0
  227. package/dist/core/permissions/engine/permissionEngine.js +106 -0
  228. package/dist/core/permissions/engine/permissionEngine.js.map +7 -0
  229. package/dist/core/permissions/engine/types.js +1 -0
  230. package/dist/core/permissions/engine/types.js.map +7 -0
  231. package/dist/core/permissions/index.js +84 -0
  232. package/dist/core/permissions/index.js.map +7 -0
  233. package/dist/core/permissions/ruleEngine.js +259 -0
  234. package/dist/core/permissions/ruleEngine.js.map +7 -0
  235. package/dist/core/permissions/rules/allowedToolsRule.js +62 -0
  236. package/dist/core/permissions/rules/allowedToolsRule.js.map +7 -0
  237. package/dist/core/permissions/rules/autoEscalationRule.js +296 -0
  238. package/dist/core/permissions/rules/autoEscalationRule.js.map +7 -0
  239. package/dist/core/permissions/rules/index.js +46 -0
  240. package/dist/core/permissions/rules/index.js.map +7 -0
  241. package/dist/core/permissions/rules/planModeRule.js +55 -0
  242. package/dist/core/permissions/rules/planModeRule.js.map +7 -0
  243. package/dist/core/permissions/rules/projectBoundaryRule.js +173 -0
  244. package/dist/core/permissions/rules/projectBoundaryRule.js.map +7 -0
  245. package/dist/core/permissions/rules/safeModeRule.js +65 -0
  246. package/dist/core/permissions/rules/safeModeRule.js.map +7 -0
  247. package/dist/core/permissions/rules/sensitivePathsRule.js +345 -0
  248. package/dist/core/permissions/rules/sensitivePathsRule.js.map +7 -0
  249. package/dist/core/permissions/types.js +127 -0
  250. package/dist/core/permissions/types.js.map +7 -0
  251. package/dist/core/tokenStats.js +9 -0
  252. package/dist/core/tokenStats.js.map +7 -0
  253. package/dist/core/tokenStatsManager.js +331 -0
  254. package/dist/core/tokenStatsManager.js.map +7 -0
  255. package/dist/core/tools/executor.js +143 -0
  256. package/dist/core/tools/executor.js.map +7 -0
  257. package/dist/core/tools/index.js +15 -0
  258. package/dist/core/tools/index.js.map +7 -0
  259. package/dist/core/tools/registry.js +183 -0
  260. package/dist/core/tools/registry.js.map +7 -0
  261. package/dist/core/tools/types.js +1 -0
  262. package/dist/core/tools/types.js.map +7 -0
  263. package/dist/cost-tracker.js +23 -15
  264. package/dist/cost-tracker.js.map +2 -2
  265. package/dist/entrypoints/cli.js +158 -130
  266. package/dist/entrypoints/cli.js.map +2 -2
  267. package/dist/entrypoints/mcp.js +12 -4
  268. package/dist/entrypoints/mcp.js.map +2 -2
  269. package/dist/history.js +14 -3
  270. package/dist/history.js.map +2 -2
  271. package/dist/hooks/useAgentTokenStats.js +72 -0
  272. package/dist/hooks/useAgentTokenStats.js.map +7 -0
  273. package/dist/hooks/useAgentTranscripts.js +140 -0
  274. package/dist/hooks/useAgentTranscripts.js.map +7 -0
  275. package/dist/hooks/useAnimationSync.js +53 -0
  276. package/dist/hooks/useAnimationSync.js.map +7 -0
  277. package/dist/hooks/useArrowKeyHistory.js +4 -2
  278. package/dist/hooks/useArrowKeyHistory.js.map +2 -2
  279. package/dist/hooks/useCanUseTool.js +3 -1
  280. package/dist/hooks/useCanUseTool.js.map +2 -2
  281. package/dist/hooks/useExitOnCtrlCD.js +9 -5
  282. package/dist/hooks/useExitOnCtrlCD.js.map +2 -2
  283. package/dist/hooks/useHookStatus.js +40 -0
  284. package/dist/hooks/useHookStatus.js.map +7 -0
  285. package/dist/hooks/useLogMessages.js +29 -2
  286. package/dist/hooks/useLogMessages.js.map +2 -2
  287. package/dist/hooks/useMessageGroups.js +43 -0
  288. package/dist/hooks/useMessageGroups.js.map +7 -0
  289. package/dist/hooks/useTerminalSize.js +62 -6
  290. package/dist/hooks/useTerminalSize.js.map +2 -2
  291. package/dist/hooks/useUnifiedCompletion.js +69 -0
  292. package/dist/hooks/useUnifiedCompletion.js.map +2 -2
  293. package/dist/i18n/index.js +109 -0
  294. package/dist/i18n/index.js.map +7 -0
  295. package/dist/i18n/locales/en.js +348 -0
  296. package/dist/i18n/locales/en.js.map +7 -0
  297. package/dist/i18n/locales/index.js +7 -0
  298. package/dist/i18n/locales/index.js.map +7 -0
  299. package/dist/i18n/locales/zh-CN.js +348 -0
  300. package/dist/i18n/locales/zh-CN.js.map +7 -0
  301. package/dist/i18n/types.js +8 -0
  302. package/dist/i18n/types.js.map +7 -0
  303. package/dist/permissions.js +28 -1
  304. package/dist/permissions.js.map +2 -2
  305. package/dist/query.js +253 -21
  306. package/dist/query.js.map +3 -3
  307. package/dist/screens/REPL.js +523 -194
  308. package/dist/screens/REPL.js.map +3 -3
  309. package/dist/services/adapters/chatCompletions.js +3 -1
  310. package/dist/services/adapters/chatCompletions.js.map +2 -2
  311. package/dist/services/adapters/messageNormalizer.js +354 -0
  312. package/dist/services/adapters/messageNormalizer.js.map +7 -0
  313. package/dist/services/adapters/responsesAPI.js +6 -3
  314. package/dist/services/adapters/responsesAPI.js.map +2 -2
  315. package/dist/services/checkpointManager.js +386 -0
  316. package/dist/services/checkpointManager.js.map +7 -0
  317. package/dist/services/claude.js +192 -14
  318. package/dist/services/claude.js.map +3 -3
  319. package/dist/services/compressionService.js +50 -1
  320. package/dist/services/compressionService.js.map +2 -2
  321. package/dist/services/contextMonitor.js +162 -0
  322. package/dist/services/contextMonitor.js.map +7 -0
  323. package/dist/services/customCommands.js +60 -41
  324. package/dist/services/customCommands.js.map +2 -2
  325. package/dist/services/hookExecutor.js +173 -1
  326. package/dist/services/hookExecutor.js.map +2 -2
  327. package/dist/services/intelligentCompactor.js +281 -0
  328. package/dist/services/intelligentCompactor.js.map +7 -0
  329. package/dist/services/lspConfig.js +109 -0
  330. package/dist/services/lspConfig.js.map +7 -0
  331. package/dist/services/mcpClient.js +338 -43
  332. package/dist/services/mcpClient.js.map +2 -2
  333. package/dist/services/modelOrchestrator.js +310 -0
  334. package/dist/services/modelOrchestrator.js.map +7 -0
  335. package/dist/services/openai.js +8 -1
  336. package/dist/services/openai.js.map +2 -2
  337. package/dist/services/outputStyles.js +138 -0
  338. package/dist/services/outputStyles.js.map +7 -0
  339. package/dist/services/plugins/index.js +5 -0
  340. package/dist/services/plugins/index.js.map +7 -0
  341. package/dist/services/plugins/lspServers.js +188 -0
  342. package/dist/services/plugins/lspServers.js.map +7 -0
  343. package/dist/services/plugins/pluginRuntime.js +229 -0
  344. package/dist/services/plugins/pluginRuntime.js.map +7 -0
  345. package/dist/services/plugins/pluginValidation.js +219 -0
  346. package/dist/services/plugins/pluginValidation.js.map +7 -0
  347. package/dist/services/plugins/skillMarketplace.js +556 -0
  348. package/dist/services/plugins/skillMarketplace.js.map +7 -0
  349. package/dist/services/responseStateManager.js +37 -3
  350. package/dist/services/responseStateManager.js.map +2 -2
  351. package/dist/services/sandbox/filesystemBoundary.js +341 -0
  352. package/dist/services/sandbox/filesystemBoundary.js.map +7 -0
  353. package/dist/services/sandbox/index.js +14 -0
  354. package/dist/services/sandbox/index.js.map +7 -0
  355. package/dist/services/sandbox/networkProxy.js +293 -0
  356. package/dist/services/sandbox/networkProxy.js.map +7 -0
  357. package/dist/services/sandbox/sandboxController.js +574 -0
  358. package/dist/services/sandbox/sandboxController.js.map +7 -0
  359. package/dist/services/sandbox/types.js +50 -0
  360. package/dist/services/sandbox/types.js.map +7 -0
  361. package/dist/services/sessionMemory.js +266 -0
  362. package/dist/services/sessionMemory.js.map +7 -0
  363. package/dist/services/taskRouter.js +324 -0
  364. package/dist/services/taskRouter.js.map +7 -0
  365. package/dist/tools/ArchitectTool/ArchitectTool.js +7 -1
  366. package/dist/tools/ArchitectTool/ArchitectTool.js.map +2 -2
  367. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +6 -2
  368. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
  369. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js +2 -1
  370. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +2 -2
  371. package/dist/tools/BaseTool.js +72 -0
  372. package/dist/tools/BaseTool.js.map +7 -0
  373. package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js +3 -0
  374. package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js.map +2 -2
  375. package/dist/tools/BashTool/BashTool.js +79 -3
  376. package/dist/tools/BashTool/BashTool.js.map +2 -2
  377. package/dist/tools/BashTool/BashToolResultMessage.js +3 -0
  378. package/dist/tools/BashTool/BashToolResultMessage.js.map +2 -2
  379. package/dist/tools/BashTool/OutputLine.js +54 -0
  380. package/dist/tools/BashTool/OutputLine.js.map +2 -2
  381. package/dist/tools/BashTool/prompt.js +336 -3
  382. package/dist/tools/BashTool/prompt.js.map +2 -2
  383. package/dist/tools/FileEditTool/FileEditTool.js +29 -4
  384. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  385. package/dist/tools/FileEditTool/prompt.js +6 -3
  386. package/dist/tools/FileEditTool/prompt.js.map +2 -2
  387. package/dist/tools/FileWriteTool/FileWriteTool.js +5 -5
  388. package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
  389. package/dist/tools/FileWriteTool/prompt.js +4 -2
  390. package/dist/tools/FileWriteTool/prompt.js.map +2 -2
  391. package/dist/tools/GlobTool/GlobTool.js +4 -2
  392. package/dist/tools/GlobTool/GlobTool.js.map +2 -2
  393. package/dist/tools/GrepTool/GrepTool.js +36 -7
  394. package/dist/tools/GrepTool/GrepTool.js.map +2 -2
  395. package/dist/tools/KillShellTool/KillShellToolResultMessage.js +3 -0
  396. package/dist/tools/KillShellTool/KillShellToolResultMessage.js.map +2 -2
  397. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js +109 -0
  398. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +7 -0
  399. package/dist/tools/ListMcpResourcesTool/prompt.js +19 -0
  400. package/dist/tools/ListMcpResourcesTool/prompt.js.map +7 -0
  401. package/dist/tools/LspTool/LspTool.js +664 -0
  402. package/dist/tools/LspTool/LspTool.js.map +7 -0
  403. package/dist/tools/LspTool/prompt.js +27 -0
  404. package/dist/tools/LspTool/prompt.js.map +7 -0
  405. package/dist/tools/MCPTool/MCPTool.js +9 -1
  406. package/dist/tools/MCPTool/MCPTool.js.map +2 -2
  407. package/dist/tools/MemoryReadTool/MemoryReadTool.js +19 -6
  408. package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
  409. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +6 -6
  410. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
  411. package/dist/tools/MultiEditTool/MultiEditTool.js +19 -2
  412. package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
  413. package/dist/tools/MultiEditTool/prompt.js +5 -3
  414. package/dist/tools/MultiEditTool/prompt.js.map +2 -2
  415. package/dist/tools/NotebookEditTool/NotebookEditTool.js +7 -2
  416. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
  417. package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +2 -2
  418. package/dist/tools/PlanModeTool/EnterPlanModeTool.js +75 -0
  419. package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +7 -0
  420. package/dist/tools/PlanModeTool/ExitPlanModeTool.js +109 -0
  421. package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +7 -0
  422. package/dist/tools/PlanModeTool/prompt.js +94 -0
  423. package/dist/tools/PlanModeTool/prompt.js.map +7 -0
  424. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js +130 -0
  425. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +7 -0
  426. package/dist/tools/ReadMcpResourceTool/prompt.js +17 -0
  427. package/dist/tools/ReadMcpResourceTool/prompt.js.map +7 -0
  428. package/dist/tools/SkillTool/SkillTool.js +10 -4
  429. package/dist/tools/SkillTool/SkillTool.js.map +2 -2
  430. package/dist/tools/SkillTool/prompt.js +1 -1
  431. package/dist/tools/SkillTool/prompt.js.map +1 -1
  432. package/dist/tools/SlashCommandTool/SlashCommandTool.js +260 -0
  433. package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +7 -0
  434. package/dist/tools/SlashCommandTool/prompt.js +35 -0
  435. package/dist/tools/SlashCommandTool/prompt.js.map +7 -0
  436. package/dist/tools/TaskOutputTool/TaskOutputTool.js +190 -0
  437. package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +7 -0
  438. package/dist/tools/TaskOutputTool/prompt.js +15 -0
  439. package/dist/tools/TaskOutputTool/prompt.js.map +7 -0
  440. package/dist/tools/TaskTool/TaskTool.js +310 -104
  441. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  442. package/dist/tools/TaskTool/prompt.js.map +2 -2
  443. package/dist/tools/TodoWriteTool/TodoWriteTool.js +42 -77
  444. package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +2 -2
  445. package/dist/tools/URLFetcherTool/URLFetcherTool.js +4 -1
  446. package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
  447. package/dist/tools/URLFetcherTool/cache.js +55 -8
  448. package/dist/tools/URLFetcherTool/cache.js.map +2 -2
  449. package/dist/tools.js +31 -2
  450. package/dist/tools.js.map +2 -2
  451. package/dist/types/hooks.js +4 -0
  452. package/dist/types/hooks.js.map +2 -2
  453. package/dist/types/marketplace.js.map +2 -2
  454. package/dist/types/messageGroup.js +36 -0
  455. package/dist/types/messageGroup.js.map +7 -0
  456. package/dist/types/plugin.js.map +2 -2
  457. package/dist/types/thinking.js +1 -0
  458. package/dist/types/thinking.js.map +7 -0
  459. package/dist/utils/BackgroundShellManager.js +136 -39
  460. package/dist/utils/BackgroundShellManager.js.map +2 -2
  461. package/dist/utils/CircuitBreaker.js +242 -0
  462. package/dist/utils/CircuitBreaker.js.map +7 -0
  463. package/dist/utils/MessageBatchBuffer.js +102 -0
  464. package/dist/utils/MessageBatchBuffer.js.map +7 -0
  465. package/dist/utils/PersistentShell.js +151 -1
  466. package/dist/utils/PersistentShell.js.map +2 -2
  467. package/dist/utils/agentLoader.js +1 -23
  468. package/dist/utils/agentLoader.js.map +2 -2
  469. package/dist/utils/agentTranscripts.js +641 -0
  470. package/dist/utils/agentTranscripts.js.map +7 -0
  471. package/dist/utils/animationManager.js +213 -0
  472. package/dist/utils/animationManager.js.map +7 -0
  473. package/dist/utils/animationSync.js +110 -0
  474. package/dist/utils/animationSync.js.map +7 -0
  475. package/dist/utils/ask.js +2 -0
  476. package/dist/utils/ask.js.map +2 -2
  477. package/dist/utils/asyncFile.js +215 -0
  478. package/dist/utils/asyncFile.js.map +7 -0
  479. package/dist/utils/backgroundAgentManager.js +231 -0
  480. package/dist/utils/backgroundAgentManager.js.map +7 -0
  481. package/dist/utils/config.js +108 -10
  482. package/dist/utils/config.js.map +2 -2
  483. package/dist/utils/conversationRecovery.js +19 -0
  484. package/dist/utils/conversationRecovery.js.map +2 -2
  485. package/dist/utils/credentials/CredentialStore.js +1 -0
  486. package/dist/utils/credentials/CredentialStore.js.map +7 -0
  487. package/dist/utils/credentials/EncryptedFileStore.js +157 -0
  488. package/dist/utils/credentials/EncryptedFileStore.js.map +7 -0
  489. package/dist/utils/credentials/index.js +37 -0
  490. package/dist/utils/credentials/index.js.map +7 -0
  491. package/dist/utils/credentials/migration.js +82 -0
  492. package/dist/utils/credentials/migration.js.map +7 -0
  493. package/dist/utils/exit.js +73 -0
  494. package/dist/utils/exit.js.map +7 -0
  495. package/dist/utils/format.js +73 -5
  496. package/dist/utils/format.js.map +2 -2
  497. package/dist/utils/generators.js +76 -6
  498. package/dist/utils/generators.js.map +2 -2
  499. package/dist/utils/globalErrorHandler.js +149 -0
  500. package/dist/utils/globalErrorHandler.js.map +7 -0
  501. package/dist/utils/groupHandlers/index.js +8 -0
  502. package/dist/utils/groupHandlers/index.js.map +7 -0
  503. package/dist/utils/groupHandlers/parallelTasksHandler.js +140 -0
  504. package/dist/utils/groupHandlers/parallelTasksHandler.js.map +7 -0
  505. package/dist/utils/groupHandlers/taskHandler.js +104 -0
  506. package/dist/utils/groupHandlers/taskHandler.js.map +7 -0
  507. package/dist/utils/groupHandlers/types.js +1 -0
  508. package/dist/utils/groupHandlers/types.js.map +7 -0
  509. package/dist/utils/logRotation.js +224 -0
  510. package/dist/utils/logRotation.js.map +7 -0
  511. package/dist/utils/markdown.js +13 -1
  512. package/dist/utils/markdown.js.map +2 -2
  513. package/dist/utils/marketplaceManager.js +3 -5
  514. package/dist/utils/marketplaceManager.js.map +2 -2
  515. package/dist/utils/memSafety.js +264 -0
  516. package/dist/utils/memSafety.js.map +7 -0
  517. package/dist/utils/messageGroupManager.js +274 -0
  518. package/dist/utils/messageGroupManager.js.map +7 -0
  519. package/dist/utils/messages.js +13 -4
  520. package/dist/utils/messages.js.map +2 -2
  521. package/dist/utils/model.js +119 -15
  522. package/dist/utils/model.js.map +3 -3
  523. package/dist/utils/permissions/filesystem.js +162 -6
  524. package/dist/utils/permissions/filesystem.js.map +2 -2
  525. package/dist/utils/plan/planMode.js +143 -0
  526. package/dist/utils/plan/planMode.js.map +7 -0
  527. package/dist/utils/pluginLoader.js +17 -21
  528. package/dist/utils/pluginLoader.js.map +2 -2
  529. package/dist/utils/ripgrep.js +55 -2
  530. package/dist/utils/ripgrep.js.map +2 -2
  531. package/dist/utils/safePath.js +132 -0
  532. package/dist/utils/safePath.js.map +7 -0
  533. package/dist/utils/sanitizeInput.js +32 -0
  534. package/dist/utils/sanitizeInput.js.map +7 -0
  535. package/dist/utils/secureKeyStorage.js +312 -0
  536. package/dist/utils/secureKeyStorage.js.map +7 -0
  537. package/dist/utils/sensitiveFiles.js +125 -0
  538. package/dist/utils/sensitiveFiles.js.map +7 -0
  539. package/dist/utils/session/sessionPlugins.js +67 -0
  540. package/dist/utils/session/sessionPlugins.js.map +7 -0
  541. package/dist/utils/taskDisplayUtils.js +257 -0
  542. package/dist/utils/taskDisplayUtils.js.map +7 -0
  543. package/dist/utils/teamConfig.js +2 -1
  544. package/dist/utils/teamConfig.js.map +2 -2
  545. package/dist/utils/theme.js +6 -6
  546. package/dist/utils/theme.js.map +1 -1
  547. package/dist/utils/todoStorage.js +92 -2
  548. package/dist/utils/todoStorage.js.map +2 -2
  549. package/dist/utils/toolRiskClassification.js +207 -0
  550. package/dist/utils/toolRiskClassification.js.map +7 -0
  551. package/dist/utils/toolTimeout.js +136 -0
  552. package/dist/utils/toolTimeout.js.map +7 -0
  553. package/dist/utils/tooling/safeRender.js +116 -0
  554. package/dist/utils/tooling/safeRender.js.map +7 -0
  555. package/dist/utils/userFriendlyError.js +346 -0
  556. package/dist/utils/userFriendlyError.js.map +7 -0
  557. package/dist/utils/vendor/ripgrep/arm64-darwin/rg +0 -0
  558. package/dist/version.js +2 -2
  559. package/dist/version.js.map +1 -1
  560. package/package.json +17 -5
  561. package/scripts/postinstall.js +128 -38
  562. package/dist/commands/agents.js +0 -2086
  563. package/dist/commands/agents.js.map +0 -7
  564. package/dist/commands/build.js +0 -74
  565. package/dist/commands/build.js.map +0 -7
  566. package/dist/commands/compression.js +0 -57
  567. package/dist/commands/compression.js.map +0 -7
  568. package/dist/commands/listen.js +0 -37
  569. package/dist/commands/listen.js.map +0 -7
  570. package/dist/commands/login.js +0 -37
  571. package/dist/commands/login.js.map +0 -7
  572. package/dist/commands/logout.js +0 -33
  573. package/dist/commands/logout.js.map +0 -7
  574. package/dist/commands/mcp.js +0 -40
  575. package/dist/commands/mcp.js.map +0 -7
  576. package/dist/commands/mcp_refresh.js +0 -40
  577. package/dist/commands/mcp_refresh.js.map +0 -7
  578. package/dist/commands/modelstatus.js +0 -21
  579. package/dist/commands/modelstatus.js.map +0 -7
  580. package/dist/commands/onboarding.js +0 -36
  581. package/dist/commands/onboarding.js.map +0 -7
  582. package/dist/commands/plugin-interactive.js +0 -446
  583. package/dist/commands/plugin-interactive.js.map +0 -7
  584. package/dist/commands/pr_comments.js +0 -61
  585. package/dist/commands/pr_comments.js.map +0 -7
  586. package/dist/commands/release-notes.js +0 -30
  587. package/dist/commands/release-notes.js.map +0 -7
  588. package/dist/commands/review.js +0 -51
  589. package/dist/commands/review.js.map +0 -7
  590. package/dist/components/Bug.js +0 -147
  591. package/dist/components/Bug.js.map +0 -7
  592. package/dist/components/ModelSelector.js +0 -2062
  593. package/dist/components/ModelSelector.js.map +0 -7
  594. package/dist/components/ModelStatusDisplay.js +0 -87
  595. package/dist/components/ModelStatusDisplay.js.map +0 -7
  596. package/dist/entrypoints/cli-wrapper.js +0 -61
  597. package/dist/entrypoints/cli-wrapper.js.map +0 -7
  598. package/dist/hooks/useCancelRequest.js +0 -28
  599. package/dist/hooks/useCancelRequest.js.map +0 -7
  600. package/dist/screens/Doctor.js +0 -22
  601. package/dist/screens/Doctor.js.map +0 -7
@@ -1,11 +1,32 @@
1
1
  class ResponseStateManager {
2
2
  conversationStates = /* @__PURE__ */ new Map();
3
+ cleanupIntervalId = null;
3
4
  // Cache cleanup after 1 hour of inactivity
4
5
  CLEANUP_INTERVAL = 60 * 60 * 1e3;
5
6
  constructor() {
6
- setInterval(() => {
7
- this.cleanup();
8
- }, this.CLEANUP_INTERVAL);
7
+ this.startCleanupInterval();
8
+ }
9
+ /**
10
+ * Start the periodic cleanup interval
11
+ */
12
+ startCleanupInterval() {
13
+ if (this.cleanupIntervalId === null) {
14
+ this.cleanupIntervalId = setInterval(() => {
15
+ this.cleanup();
16
+ }, this.CLEANUP_INTERVAL);
17
+ if (this.cleanupIntervalId.unref) {
18
+ this.cleanupIntervalId.unref();
19
+ }
20
+ }
21
+ }
22
+ /**
23
+ * Stop the periodic cleanup interval
24
+ */
25
+ stopCleanupInterval() {
26
+ if (this.cleanupIntervalId !== null) {
27
+ clearInterval(this.cleanupIntervalId);
28
+ this.cleanupIntervalId = null;
29
+ }
9
30
  }
10
31
  /**
11
32
  * Set the previous response ID for a conversation
@@ -56,8 +77,21 @@ class ResponseStateManager {
56
77
  getStateSize() {
57
78
  return this.conversationStates.size;
58
79
  }
80
+ /**
81
+ * Dispose of the manager and stop cleanup interval
82
+ * Call this when shutting down to prevent memory leaks
83
+ */
84
+ dispose() {
85
+ this.stopCleanupInterval();
86
+ this.conversationStates.clear();
87
+ }
59
88
  }
60
89
  const responseStateManager = new ResponseStateManager();
90
+ if (typeof process !== "undefined" && process.on) {
91
+ process.on("beforeExit", () => {
92
+ responseStateManager.dispose();
93
+ });
94
+ }
61
95
  function getConversationId(agentId, messageId) {
62
96
  return agentId || messageId || `conv_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
63
97
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/services/responseStateManager.ts"],
4
- "sourcesContent": ["/**\n * GPT-5 Responses API state management\n * Manages previous_response_id for conversation continuity and reasoning context reuse\n */\n\ninterface ConversationState {\n previousResponseId?: string\n lastUpdate: number\n}\n\nclass ResponseStateManager {\n private conversationStates = new Map<string, ConversationState>()\n\n // Cache cleanup after 1 hour of inactivity\n private readonly CLEANUP_INTERVAL = 60 * 60 * 1000\n\n constructor() {\n // Periodic cleanup of stale conversations\n setInterval(() => {\n this.cleanup()\n }, this.CLEANUP_INTERVAL)\n }\n\n /**\n * Set the previous response ID for a conversation\n */\n setPreviousResponseId(conversationId: string, responseId: string): void {\n this.conversationStates.set(conversationId, {\n previousResponseId: responseId,\n lastUpdate: Date.now(),\n })\n }\n\n /**\n * Get the previous response ID for a conversation\n */\n getPreviousResponseId(conversationId: string): string | undefined {\n const state = this.conversationStates.get(conversationId)\n if (state) {\n // Update last access time\n state.lastUpdate = Date.now()\n return state.previousResponseId\n }\n return undefined\n }\n\n /**\n * Clear state for a conversation\n */\n clearConversation(conversationId: string): void {\n this.conversationStates.delete(conversationId)\n }\n\n /**\n * Clear all conversation states\n */\n clearAll(): void {\n this.conversationStates.clear()\n }\n\n /**\n * Clean up stale conversations\n */\n private cleanup(): void {\n const now = Date.now()\n for (const [conversationId, state] of this.conversationStates.entries()) {\n if (now - state.lastUpdate > this.CLEANUP_INTERVAL) {\n this.conversationStates.delete(conversationId)\n }\n }\n }\n\n /**\n * Get current state size (for debugging/monitoring)\n */\n getStateSize(): number {\n return this.conversationStates.size\n }\n}\n\n// Singleton instance\nexport const responseStateManager = new ResponseStateManager()\n\n/**\n * Helper to generate conversation ID from context\n */\nexport function getConversationId(\n agentId?: string,\n messageId?: string,\n): string {\n // Use agentId as primary identifier, fallback to messageId or timestamp\n return (\n agentId ||\n messageId ||\n `conv_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`\n )\n}\n"],
5
- "mappings": "AAUA,MAAM,qBAAqB;AAAA,EACjB,qBAAqB,oBAAI,IAA+B;AAAA;AAAA,EAG/C,mBAAmB,KAAK,KAAK;AAAA,EAE9C,cAAc;AAEZ,gBAAY,MAAM;AAChB,WAAK,QAAQ;AAAA,IACf,GAAG,KAAK,gBAAgB;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAsB,gBAAwB,YAA0B;AACtE,SAAK,mBAAmB,IAAI,gBAAgB;AAAA,MAC1C,oBAAoB;AAAA,MACpB,YAAY,KAAK,IAAI;AAAA,IACvB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAsB,gBAA4C;AAChE,UAAM,QAAQ,KAAK,mBAAmB,IAAI,cAAc;AACxD,QAAI,OAAO;AAET,YAAM,aAAa,KAAK,IAAI;AAC5B,aAAO,MAAM;AAAA,IACf;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,gBAA8B;AAC9C,SAAK,mBAAmB,OAAO,cAAc;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,WAAiB;AACf,SAAK,mBAAmB,MAAM;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAgB;AACtB,UAAM,MAAM,KAAK,IAAI;AACrB,eAAW,CAAC,gBAAgB,KAAK,KAAK,KAAK,mBAAmB,QAAQ,GAAG;AACvE,UAAI,MAAM,MAAM,aAAa,KAAK,kBAAkB;AAClD,aAAK,mBAAmB,OAAO,cAAc;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAuB;AACrB,WAAO,KAAK,mBAAmB;AAAA,EACjC;AACF;AAGO,MAAM,uBAAuB,IAAI,qBAAqB;AAKtD,SAAS,kBACd,SACA,WACQ;AAER,SACE,WACA,aACA,QAAQ,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AAEjE;",
4
+ "sourcesContent": ["/**\n * GPT-5 Responses API state management\n * Manages previous_response_id for conversation continuity and reasoning context reuse\n */\n\ninterface ConversationState {\n previousResponseId?: string\n lastUpdate: number\n}\n\nclass ResponseStateManager {\n private conversationStates = new Map<string, ConversationState>()\n private cleanupIntervalId: ReturnType<typeof setInterval> | null = null\n\n // Cache cleanup after 1 hour of inactivity\n private readonly CLEANUP_INTERVAL = 60 * 60 * 1000\n\n constructor() {\n this.startCleanupInterval()\n }\n\n /**\n * Start the periodic cleanup interval\n */\n private startCleanupInterval(): void {\n // Only start if not already running\n if (this.cleanupIntervalId === null) {\n this.cleanupIntervalId = setInterval(() => {\n this.cleanup()\n }, this.CLEANUP_INTERVAL)\n\n // Ensure the interval doesn't prevent process exit\n if (this.cleanupIntervalId.unref) {\n this.cleanupIntervalId.unref()\n }\n }\n }\n\n /**\n * Stop the periodic cleanup interval\n */\n private stopCleanupInterval(): void {\n if (this.cleanupIntervalId !== null) {\n clearInterval(this.cleanupIntervalId)\n this.cleanupIntervalId = null\n }\n }\n\n /**\n * Set the previous response ID for a conversation\n */\n setPreviousResponseId(conversationId: string, responseId: string): void {\n this.conversationStates.set(conversationId, {\n previousResponseId: responseId,\n lastUpdate: Date.now(),\n })\n }\n\n /**\n * Get the previous response ID for a conversation\n */\n getPreviousResponseId(conversationId: string): string | undefined {\n const state = this.conversationStates.get(conversationId)\n if (state) {\n // Update last access time\n state.lastUpdate = Date.now()\n return state.previousResponseId\n }\n return undefined\n }\n\n /**\n * Clear state for a conversation\n */\n clearConversation(conversationId: string): void {\n this.conversationStates.delete(conversationId)\n }\n\n /**\n * Clear all conversation states\n */\n clearAll(): void {\n this.conversationStates.clear()\n }\n\n /**\n * Clean up stale conversations\n */\n private cleanup(): void {\n const now = Date.now()\n for (const [conversationId, state] of this.conversationStates.entries()) {\n if (now - state.lastUpdate > this.CLEANUP_INTERVAL) {\n this.conversationStates.delete(conversationId)\n }\n }\n }\n\n /**\n * Get current state size (for debugging/monitoring)\n */\n getStateSize(): number {\n return this.conversationStates.size\n }\n\n /**\n * Dispose of the manager and stop cleanup interval\n * Call this when shutting down to prevent memory leaks\n */\n dispose(): void {\n this.stopCleanupInterval()\n this.conversationStates.clear()\n }\n}\n\n// Singleton instance\nexport const responseStateManager = new ResponseStateManager()\n\n// Register cleanup on process exit\nif (typeof process !== 'undefined' && process.on) {\n process.on('beforeExit', () => {\n responseStateManager.dispose()\n })\n}\n\n/**\n * Helper to generate conversation ID from context\n */\nexport function getConversationId(\n agentId?: string,\n messageId?: string,\n): string {\n // Use agentId as primary identifier, fallback to messageId or timestamp\n return (\n agentId ||\n messageId ||\n `conv_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`\n )\n}\n"],
5
+ "mappings": "AAUA,MAAM,qBAAqB;AAAA,EACjB,qBAAqB,oBAAI,IAA+B;AAAA,EACxD,oBAA2D;AAAA;AAAA,EAGlD,mBAAmB,KAAK,KAAK;AAAA,EAE9C,cAAc;AACZ,SAAK,qBAAqB;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAA6B;AAEnC,QAAI,KAAK,sBAAsB,MAAM;AACnC,WAAK,oBAAoB,YAAY,MAAM;AACzC,aAAK,QAAQ;AAAA,MACf,GAAG,KAAK,gBAAgB;AAGxB,UAAI,KAAK,kBAAkB,OAAO;AAChC,aAAK,kBAAkB,MAAM;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAA4B;AAClC,QAAI,KAAK,sBAAsB,MAAM;AACnC,oBAAc,KAAK,iBAAiB;AACpC,WAAK,oBAAoB;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAsB,gBAAwB,YAA0B;AACtE,SAAK,mBAAmB,IAAI,gBAAgB;AAAA,MAC1C,oBAAoB;AAAA,MACpB,YAAY,KAAK,IAAI;AAAA,IACvB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAsB,gBAA4C;AAChE,UAAM,QAAQ,KAAK,mBAAmB,IAAI,cAAc;AACxD,QAAI,OAAO;AAET,YAAM,aAAa,KAAK,IAAI;AAC5B,aAAO,MAAM;AAAA,IACf;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,gBAA8B;AAC9C,SAAK,mBAAmB,OAAO,cAAc;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,WAAiB;AACf,SAAK,mBAAmB,MAAM;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAgB;AACtB,UAAM,MAAM,KAAK,IAAI;AACrB,eAAW,CAAC,gBAAgB,KAAK,KAAK,KAAK,mBAAmB,QAAQ,GAAG;AACvE,UAAI,MAAM,MAAM,aAAa,KAAK,kBAAkB;AAClD,aAAK,mBAAmB,OAAO,cAAc;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAuB;AACrB,WAAO,KAAK,mBAAmB;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAgB;AACd,SAAK,oBAAoB;AACzB,SAAK,mBAAmB,MAAM;AAAA,EAChC;AACF;AAGO,MAAM,uBAAuB,IAAI,qBAAqB;AAG7D,IAAI,OAAO,YAAY,eAAe,QAAQ,IAAI;AAChD,UAAQ,GAAG,cAAc,MAAM;AAC7B,yBAAqB,QAAQ;AAAA,EAC/B,CAAC;AACH;AAKO,SAAS,kBACd,SACA,WACQ;AAER,SACE,WACA,aACA,QAAQ,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AAEjE;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,341 @@
1
+ import { resolve, relative, isAbsolute, dirname } from "path";
2
+ import { minimatch } from "minimatch";
3
+ import { safeResolvePath } from "../../utils/safePath.js";
4
+ class FilesystemBoundary {
5
+ policy;
6
+ workingDir;
7
+ violations = [];
8
+ constructor(policy, workingDir) {
9
+ this.policy = policy;
10
+ this.workingDir = resolve(workingDir);
11
+ }
12
+ /**
13
+ * Update the filesystem policy
14
+ */
15
+ updatePolicy(policy) {
16
+ this.policy = { ...this.policy, ...policy };
17
+ }
18
+ /**
19
+ * Update the working directory
20
+ */
21
+ setWorkingDir(dir) {
22
+ this.workingDir = resolve(dir);
23
+ }
24
+ /**
25
+ * Check if a path can be read
26
+ */
27
+ canRead(path) {
28
+ const validationResult = safeResolvePath(
29
+ path,
30
+ this.workingDir,
31
+ this.workingDir
32
+ );
33
+ const absolutePath = validationResult.resolvedPath;
34
+ if (!validationResult.valid) {
35
+ const violation2 = this.createViolation(
36
+ "filesystem_path_denied",
37
+ `Symlink traversal detected: ${validationResult.error}`,
38
+ absolutePath
39
+ );
40
+ return { allowed: false, violation: violation2, isSymlink: true };
41
+ }
42
+ const relativePath = this.getRelativePath(absolutePath);
43
+ if (this.matchesPattern(relativePath, this.policy.denied)) {
44
+ const violation2 = this.createViolation(
45
+ "filesystem_path_denied",
46
+ `Read access denied for path matching deny pattern: ${path}`,
47
+ absolutePath
48
+ );
49
+ return {
50
+ allowed: false,
51
+ violation: violation2,
52
+ isSymlink: validationResult.isSymlink
53
+ };
54
+ }
55
+ if (this.matchesPattern(relativePath, this.policy.readAllowed)) {
56
+ return { allowed: true, isSymlink: validationResult.isSymlink };
57
+ }
58
+ if (this.matchesPattern(absolutePath, this.policy.readAllowed)) {
59
+ return { allowed: true, isSymlink: validationResult.isSymlink };
60
+ }
61
+ if (this.policy.readAllowed.includes("*")) {
62
+ return { allowed: true, isSymlink: validationResult.isSymlink };
63
+ }
64
+ const violation = this.createViolation(
65
+ "filesystem_read_denied",
66
+ `Read access denied: path does not match any allowed pattern: ${path}`,
67
+ absolutePath
68
+ );
69
+ return { allowed: false, violation, isSymlink: validationResult.isSymlink };
70
+ }
71
+ /**
72
+ * Check if a path can be written
73
+ */
74
+ canWrite(path) {
75
+ const validationResult = safeResolvePath(
76
+ path,
77
+ this.workingDir,
78
+ this.workingDir
79
+ );
80
+ const absolutePath = validationResult.resolvedPath;
81
+ if (!validationResult.valid) {
82
+ const violation2 = this.createViolation(
83
+ "filesystem_path_denied",
84
+ `Symlink traversal detected: ${validationResult.error}`,
85
+ absolutePath
86
+ );
87
+ return { allowed: false, violation: violation2, isSymlink: true };
88
+ }
89
+ const relativePath = this.getRelativePath(absolutePath);
90
+ if (this.matchesPattern(relativePath, this.policy.denied)) {
91
+ const violation2 = this.createViolation(
92
+ "filesystem_path_denied",
93
+ `Write access denied for path matching deny pattern: ${path}`,
94
+ absolutePath
95
+ );
96
+ return {
97
+ allowed: false,
98
+ violation: violation2,
99
+ isSymlink: validationResult.isSymlink
100
+ };
101
+ }
102
+ if (this.matchesPattern(relativePath, this.policy.writeAllowed)) {
103
+ return { allowed: true, isSymlink: validationResult.isSymlink };
104
+ }
105
+ if (this.matchesPattern(absolutePath, this.policy.writeAllowed)) {
106
+ return { allowed: true, isSymlink: validationResult.isSymlink };
107
+ }
108
+ if (this.policy.writeAllowed.includes("*")) {
109
+ return { allowed: true, isSymlink: validationResult.isSymlink };
110
+ }
111
+ if (this.isUnderWorkingDir(absolutePath)) {
112
+ if (this.policy.writeAllowed.includes("./")) {
113
+ return { allowed: true, isSymlink: validationResult.isSymlink };
114
+ }
115
+ }
116
+ const violation = this.createViolation(
117
+ "filesystem_write_denied",
118
+ `Write access denied: path does not match any allowed pattern: ${path}`,
119
+ absolutePath
120
+ );
121
+ return { allowed: false, violation, isSymlink: validationResult.isSymlink };
122
+ }
123
+ /**
124
+ * Analyze a command for filesystem operations and validate them
125
+ */
126
+ analyzeCommand(command) {
127
+ const readPaths = [];
128
+ const writePaths = [];
129
+ const violations = [];
130
+ const extractedPaths = this.extractPathsFromCommand(command);
131
+ const redirectMatches = command.matchAll(/>\s*["']?([^\s"';&|]+)["']?/g);
132
+ for (const match of redirectMatches) {
133
+ if (match[1] && !match[1].startsWith("&")) {
134
+ writePaths.push(match[1]);
135
+ }
136
+ }
137
+ const teeMatches = command.matchAll(
138
+ /\btee\s+(?:-a\s+)?["']?([^\s"';&|]+)["']?/g
139
+ );
140
+ for (const match of teeMatches) {
141
+ if (match[1]) writePaths.push(match[1]);
142
+ }
143
+ const cpMatches = command.matchAll(
144
+ /\bcp\s+(?:-[a-zA-Z]+\s+)*\S+\s+["']?([^\s"';&|]+)["']?/g
145
+ );
146
+ for (const match of cpMatches) {
147
+ if (match[1]) writePaths.push(match[1]);
148
+ }
149
+ const mvMatches = command.matchAll(
150
+ /\bmv\s+(?:-[a-zA-Z]+\s+)*\S+\s+["']?([^\s"';&|]+)["']?/g
151
+ );
152
+ for (const match of mvMatches) {
153
+ if (match[1]) writePaths.push(match[1]);
154
+ }
155
+ const rmMatches = command.matchAll(
156
+ /\brm\s+(?:-[a-zA-Z]+\s+)*["']?([^\s"';&|]+)["']?/g
157
+ );
158
+ for (const match of rmMatches) {
159
+ if (match[1]) writePaths.push(match[1]);
160
+ }
161
+ const mkdirMatches = command.matchAll(
162
+ /\bmkdir\s+(?:-[a-zA-Z]+\s+)*["']?([^\s"';&|]+)["']?/g
163
+ );
164
+ for (const match of mkdirMatches) {
165
+ if (match[1]) writePaths.push(match[1]);
166
+ }
167
+ const rmdirMatches = command.matchAll(
168
+ /\brmdir\s+(?:-[a-zA-Z]+\s+)*["']?([^\s"';&|]+)["']?/g
169
+ );
170
+ for (const match of rmdirMatches) {
171
+ if (match[1]) writePaths.push(match[1]);
172
+ }
173
+ const touchMatches = command.matchAll(/\btouch\s+["']?([^\s"';&|]+)["']?/g);
174
+ for (const match of touchMatches) {
175
+ if (match[1]) writePaths.push(match[1]);
176
+ }
177
+ const chmodMatches = command.matchAll(
178
+ /\bchmod\s+(?:-[a-zA-Z]+\s+)*\S+\s+["']?([^\s"';&|]+)["']?/g
179
+ );
180
+ for (const match of chmodMatches) {
181
+ if (match[1]) writePaths.push(match[1]);
182
+ }
183
+ const chownMatches = command.matchAll(
184
+ /\bchown\s+(?:-[a-zA-Z]+\s+)*\S+\s+["']?([^\s"';&|]+)["']?/g
185
+ );
186
+ for (const match of chownMatches) {
187
+ if (match[1]) writePaths.push(match[1]);
188
+ }
189
+ if (!command.includes(">")) {
190
+ const catMatches = command.matchAll(/\bcat\s+["']?([^\s"';&|]+)["']?/g);
191
+ for (const match of catMatches) {
192
+ if (match[1]) readPaths.push(match[1]);
193
+ }
194
+ }
195
+ const headTailMatches = command.matchAll(
196
+ /\b(?:head|tail)\s+(?:-[a-zA-Z0-9]+\s+)*["']?([^\s"';&|]+)["']?/g
197
+ );
198
+ for (const match of headTailMatches) {
199
+ if (match[1]) readPaths.push(match[1]);
200
+ }
201
+ const pagerMatches = command.matchAll(
202
+ /\b(?:less|more)\s+["']?([^\s"';&|]+)["']?/g
203
+ );
204
+ for (const match of pagerMatches) {
205
+ if (match[1]) readPaths.push(match[1]);
206
+ }
207
+ for (const path of extractedPaths) {
208
+ if (!writePaths.includes(path) && !readPaths.includes(path)) {
209
+ readPaths.push(path);
210
+ }
211
+ }
212
+ const uniqueWritePaths = [...new Set(writePaths)];
213
+ const uniqueReadPaths = [...new Set(readPaths)];
214
+ for (const path of uniqueReadPaths) {
215
+ const result = this.canRead(path);
216
+ if (!result.allowed && result.violation) {
217
+ violations.push(result.violation);
218
+ }
219
+ }
220
+ for (const path of uniqueWritePaths) {
221
+ const result = this.canWrite(path);
222
+ if (!result.allowed && result.violation) {
223
+ violations.push(result.violation);
224
+ }
225
+ }
226
+ this.violations.push(...violations);
227
+ return {
228
+ readPaths: uniqueReadPaths,
229
+ writePaths: uniqueWritePaths,
230
+ violations
231
+ };
232
+ }
233
+ /**
234
+ * Get all recorded violations
235
+ */
236
+ getViolations() {
237
+ return [...this.violations];
238
+ }
239
+ /**
240
+ * Clear violation history
241
+ */
242
+ clearViolations() {
243
+ this.violations = [];
244
+ }
245
+ /**
246
+ * Extract potential file paths from a command string
247
+ */
248
+ extractPathsFromCommand(command) {
249
+ const paths = [];
250
+ const quotedMatches = command.matchAll(/["']([^"']+)["']/g);
251
+ for (const match of quotedMatches) {
252
+ if (match[1] && this.looksLikePath(match[1])) {
253
+ paths.push(match[1]);
254
+ }
255
+ }
256
+ const unquotedMatches = command.matchAll(
257
+ /(?:^|\s)((?:\.\/|\/|\.\.\/)[^\s;&|>]+)/g
258
+ );
259
+ for (const match of unquotedMatches) {
260
+ if (match[1]) {
261
+ paths.push(match[1]);
262
+ }
263
+ }
264
+ return [...new Set(paths)];
265
+ }
266
+ /**
267
+ * Check if a string looks like a file path
268
+ */
269
+ looksLikePath(str) {
270
+ return str.includes("/") || str.startsWith(".") || str.endsWith(".txt") || str.endsWith(".json") || str.endsWith(".js") || str.endsWith(".ts") || str.endsWith(".md");
271
+ }
272
+ /**
273
+ * Resolve a path to absolute, following symlinks and validating boundaries.
274
+ * Uses safe resolution to prevent symlink traversal attacks.
275
+ */
276
+ resolvePath(path) {
277
+ const validationResult = safeResolvePath(
278
+ path,
279
+ this.workingDir,
280
+ this.workingDir
281
+ );
282
+ if (!validationResult.valid) {
283
+ return validationResult.resolvedPath;
284
+ }
285
+ return validationResult.resolvedPath;
286
+ }
287
+ /**
288
+ * Get path relative to working directory
289
+ */
290
+ getRelativePath(absolutePath) {
291
+ return relative(this.workingDir, absolutePath);
292
+ }
293
+ /**
294
+ * Check if a path is under the working directory
295
+ */
296
+ isUnderWorkingDir(absolutePath) {
297
+ const rel = relative(this.workingDir, absolutePath);
298
+ return !rel.startsWith("..") && !isAbsolute(rel);
299
+ }
300
+ /**
301
+ * Check if a path matches any of the given patterns
302
+ */
303
+ matchesPattern(path, patterns) {
304
+ for (const pattern of patterns) {
305
+ if (pattern === "*") {
306
+ return true;
307
+ }
308
+ if (pattern === "./") {
309
+ if (this.isUnderWorkingDir(this.resolvePath(path))) {
310
+ return true;
311
+ }
312
+ continue;
313
+ }
314
+ if (minimatch(path, pattern, { dot: true }) || minimatch(path, `**/${pattern}`, { dot: true })) {
315
+ return true;
316
+ }
317
+ const pathDir = dirname(path);
318
+ if (minimatch(pathDir, pattern, { dot: true })) {
319
+ return true;
320
+ }
321
+ }
322
+ return false;
323
+ }
324
+ /**
325
+ * Create a violation record
326
+ */
327
+ createViolation(type, details, path) {
328
+ return {
329
+ type,
330
+ timestamp: Date.now(),
331
+ command: "",
332
+ // Will be set by caller
333
+ details,
334
+ path
335
+ };
336
+ }
337
+ }
338
+ export {
339
+ FilesystemBoundary
340
+ };
341
+ //# sourceMappingURL=filesystemBoundary.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/services/sandbox/filesystemBoundary.ts"],
4
+ "sourcesContent": ["/**\n * Filesystem Boundary Service\n *\n * Validates file system access against configured policies.\n * Provides path validation and access control for sandboxed execution.\n */\n\nimport { resolve, relative, isAbsolute, dirname } from 'path'\nimport { minimatch } from 'minimatch'\nimport { safeResolvePath } from '../../utils/safePath'\nimport type { FilesystemPolicy, SandboxViolation } from './types'\n\n/**\n * Result of a filesystem access check\n */\nexport interface FilesystemCheckResult {\n allowed: boolean\n violation?: SandboxViolation\n /**\n * Whether the path or any component in its chain is a symbolic link.\n * Set when symlink traversal protection detects symlinks.\n */\n isSymlink?: boolean\n}\n\n/**\n * Filesystem Boundary Validator\n */\nexport class FilesystemBoundary {\n private policy: FilesystemPolicy\n private workingDir: string\n private violations: SandboxViolation[] = []\n\n constructor(policy: FilesystemPolicy, workingDir: string) {\n this.policy = policy\n this.workingDir = resolve(workingDir)\n }\n\n /**\n * Update the filesystem policy\n */\n updatePolicy(policy: Partial<FilesystemPolicy>): void {\n this.policy = { ...this.policy, ...policy }\n }\n\n /**\n * Update the working directory\n */\n setWorkingDir(dir: string): void {\n this.workingDir = resolve(dir)\n }\n\n /**\n * Check if a path can be read\n */\n canRead(path: string): FilesystemCheckResult {\n // Use safe resolution to detect symlinks and validate boundaries\n const validationResult = safeResolvePath(\n path,\n this.workingDir,\n this.workingDir,\n )\n const absolutePath = validationResult.resolvedPath\n\n // If safe resolution detected a boundary escape, deny access\n if (!validationResult.valid) {\n const violation = this.createViolation(\n 'filesystem_path_denied',\n `Symlink traversal detected: ${validationResult.error}`,\n absolutePath,\n )\n return { allowed: false, violation, isSymlink: true }\n }\n\n const relativePath = this.getRelativePath(absolutePath)\n\n // Check denied patterns first (highest priority)\n if (this.matchesPattern(relativePath, this.policy.denied)) {\n const violation = this.createViolation(\n 'filesystem_path_denied',\n `Read access denied for path matching deny pattern: ${path}`,\n absolutePath,\n )\n return {\n allowed: false,\n violation,\n isSymlink: validationResult.isSymlink,\n }\n }\n\n // Check if path matches read-allowed patterns\n if (this.matchesPattern(relativePath, this.policy.readAllowed)) {\n return { allowed: true, isSymlink: validationResult.isSymlink }\n }\n\n // Also check with absolute path\n if (this.matchesPattern(absolutePath, this.policy.readAllowed)) {\n return { allowed: true, isSymlink: validationResult.isSymlink }\n }\n\n // Wildcard allows all reads\n if (this.policy.readAllowed.includes('*')) {\n return { allowed: true, isSymlink: validationResult.isSymlink }\n }\n\n const violation = this.createViolation(\n 'filesystem_read_denied',\n `Read access denied: path does not match any allowed pattern: ${path}`,\n absolutePath,\n )\n return { allowed: false, violation, isSymlink: validationResult.isSymlink }\n }\n\n /**\n * Check if a path can be written\n */\n canWrite(path: string): FilesystemCheckResult {\n // Use safe resolution to detect symlinks and validate boundaries\n const validationResult = safeResolvePath(\n path,\n this.workingDir,\n this.workingDir,\n )\n const absolutePath = validationResult.resolvedPath\n\n // If safe resolution detected a boundary escape, deny access\n if (!validationResult.valid) {\n const violation = this.createViolation(\n 'filesystem_path_denied',\n `Symlink traversal detected: ${validationResult.error}`,\n absolutePath,\n )\n return { allowed: false, violation, isSymlink: true }\n }\n\n const relativePath = this.getRelativePath(absolutePath)\n\n // Check denied patterns first (highest priority)\n if (this.matchesPattern(relativePath, this.policy.denied)) {\n const violation = this.createViolation(\n 'filesystem_path_denied',\n `Write access denied for path matching deny pattern: ${path}`,\n absolutePath,\n )\n return {\n allowed: false,\n violation,\n isSymlink: validationResult.isSymlink,\n }\n }\n\n // Check if path matches write-allowed patterns\n if (this.matchesPattern(relativePath, this.policy.writeAllowed)) {\n return { allowed: true, isSymlink: validationResult.isSymlink }\n }\n\n // Also check with absolute path\n if (this.matchesPattern(absolutePath, this.policy.writeAllowed)) {\n return { allowed: true, isSymlink: validationResult.isSymlink }\n }\n\n // Wildcard allows all writes\n if (this.policy.writeAllowed.includes('*')) {\n return { allowed: true, isSymlink: validationResult.isSymlink }\n }\n\n // Check if path is under working directory (default write location)\n if (this.isUnderWorkingDir(absolutePath)) {\n // Only allow if './' is in writeAllowed\n if (this.policy.writeAllowed.includes('./')) {\n return { allowed: true, isSymlink: validationResult.isSymlink }\n }\n }\n\n const violation = this.createViolation(\n 'filesystem_write_denied',\n `Write access denied: path does not match any allowed pattern: ${path}`,\n absolutePath,\n )\n return { allowed: false, violation, isSymlink: validationResult.isSymlink }\n }\n\n /**\n * Analyze a command for filesystem operations and validate them\n */\n analyzeCommand(command: string): {\n readPaths: string[]\n writePaths: string[]\n violations: SandboxViolation[]\n } {\n const readPaths: string[] = []\n const writePaths: string[] = []\n const violations: SandboxViolation[] = []\n\n // Extract potential paths from command\n const extractedPaths = this.extractPathsFromCommand(command)\n\n // Detect redirect write operations first (highest priority)\n // Match patterns like: command > file, command >> file\n const redirectMatches = command.matchAll(/>\\s*[\"']?([^\\s\"';&|]+)[\"']?/g)\n for (const match of redirectMatches) {\n if (match[1] && !match[1].startsWith('&')) {\n writePaths.push(match[1])\n }\n }\n\n // Detect write operations with specific commands\n // tee command\n const teeMatches = command.matchAll(\n /\\btee\\s+(?:-a\\s+)?[\"']?([^\\s\"';&|]+)[\"']?/g,\n )\n for (const match of teeMatches) {\n if (match[1]) writePaths.push(match[1])\n }\n\n // cp command - target is the last argument\n const cpMatches = command.matchAll(\n /\\bcp\\s+(?:-[a-zA-Z]+\\s+)*\\S+\\s+[\"']?([^\\s\"';&|]+)[\"']?/g,\n )\n for (const match of cpMatches) {\n if (match[1]) writePaths.push(match[1])\n }\n\n // mv command - target is the last argument\n const mvMatches = command.matchAll(\n /\\bmv\\s+(?:-[a-zA-Z]+\\s+)*\\S+\\s+[\"']?([^\\s\"';&|]+)[\"']?/g,\n )\n for (const match of mvMatches) {\n if (match[1]) writePaths.push(match[1])\n }\n\n // rm command\n const rmMatches = command.matchAll(\n /\\brm\\s+(?:-[a-zA-Z]+\\s+)*[\"']?([^\\s\"';&|]+)[\"']?/g,\n )\n for (const match of rmMatches) {\n if (match[1]) writePaths.push(match[1])\n }\n\n // mkdir command\n const mkdirMatches = command.matchAll(\n /\\bmkdir\\s+(?:-[a-zA-Z]+\\s+)*[\"']?([^\\s\"';&|]+)[\"']?/g,\n )\n for (const match of mkdirMatches) {\n if (match[1]) writePaths.push(match[1])\n }\n\n // rmdir command\n const rmdirMatches = command.matchAll(\n /\\brmdir\\s+(?:-[a-zA-Z]+\\s+)*[\"']?([^\\s\"';&|]+)[\"']?/g,\n )\n for (const match of rmdirMatches) {\n if (match[1]) writePaths.push(match[1])\n }\n\n // touch command\n const touchMatches = command.matchAll(/\\btouch\\s+[\"']?([^\\s\"';&|]+)[\"']?/g)\n for (const match of touchMatches) {\n if (match[1]) writePaths.push(match[1])\n }\n\n // chmod command - target is the last argument\n const chmodMatches = command.matchAll(\n /\\bchmod\\s+(?:-[a-zA-Z]+\\s+)*\\S+\\s+[\"']?([^\\s\"';&|]+)[\"']?/g,\n )\n for (const match of chmodMatches) {\n if (match[1]) writePaths.push(match[1])\n }\n\n // chown command - target is the last argument\n const chownMatches = command.matchAll(\n /\\bchown\\s+(?:-[a-zA-Z]+\\s+)*\\S+\\s+[\"']?([^\\s\"';&|]+)[\"']?/g,\n )\n for (const match of chownMatches) {\n if (match[1]) writePaths.push(match[1])\n }\n\n // Detect read operations\n // cat command (when not redirecting)\n if (!command.includes('>')) {\n const catMatches = command.matchAll(/\\bcat\\s+[\"']?([^\\s\"';&|]+)[\"']?/g)\n for (const match of catMatches) {\n if (match[1]) readPaths.push(match[1])\n }\n }\n\n // head/tail commands\n const headTailMatches = command.matchAll(\n /\\b(?:head|tail)\\s+(?:-[a-zA-Z0-9]+\\s+)*[\"']?([^\\s\"';&|]+)[\"']?/g,\n )\n for (const match of headTailMatches) {\n if (match[1]) readPaths.push(match[1])\n }\n\n // less/more commands\n const pagerMatches = command.matchAll(\n /\\b(?:less|more)\\s+[\"']?([^\\s\"';&|]+)[\"']?/g,\n )\n for (const match of pagerMatches) {\n if (match[1]) readPaths.push(match[1])\n }\n\n // Add extracted paths that might be read (if not already in writePaths)\n for (const path of extractedPaths) {\n if (!writePaths.includes(path) && !readPaths.includes(path)) {\n readPaths.push(path)\n }\n }\n\n // Deduplicate paths\n const uniqueWritePaths = [...new Set(writePaths)]\n const uniqueReadPaths = [...new Set(readPaths)]\n\n // Validate all paths\n for (const path of uniqueReadPaths) {\n const result = this.canRead(path)\n if (!result.allowed && result.violation) {\n violations.push(result.violation)\n }\n }\n\n for (const path of uniqueWritePaths) {\n const result = this.canWrite(path)\n if (!result.allowed && result.violation) {\n violations.push(result.violation)\n }\n }\n\n // Store violations\n this.violations.push(...violations)\n\n return {\n readPaths: uniqueReadPaths,\n writePaths: uniqueWritePaths,\n violations,\n }\n }\n\n /**\n * Get all recorded violations\n */\n getViolations(): SandboxViolation[] {\n return [...this.violations]\n }\n\n /**\n * Clear violation history\n */\n clearViolations(): void {\n this.violations = []\n }\n\n /**\n * Extract potential file paths from a command string\n */\n private extractPathsFromCommand(command: string): string[] {\n const paths: string[] = []\n\n // Match quoted strings\n const quotedMatches = command.matchAll(/[\"']([^\"']+)[\"']/g)\n for (const match of quotedMatches) {\n if (match[1] && this.looksLikePath(match[1])) {\n paths.push(match[1])\n }\n }\n\n // Match unquoted paths (starting with ./ or / or containing /)\n const unquotedMatches = command.matchAll(\n /(?:^|\\s)((?:\\.\\/|\\/|\\.\\.\\/)[^\\s;&|>]+)/g,\n )\n for (const match of unquotedMatches) {\n if (match[1]) {\n paths.push(match[1])\n }\n }\n\n return [...new Set(paths)] // Deduplicate\n }\n\n /**\n * Check if a string looks like a file path\n */\n private looksLikePath(str: string): boolean {\n return (\n str.includes('/') ||\n str.startsWith('.') ||\n str.endsWith('.txt') ||\n str.endsWith('.json') ||\n str.endsWith('.js') ||\n str.endsWith('.ts') ||\n str.endsWith('.md')\n )\n }\n\n /**\n * Resolve a path to absolute, following symlinks and validating boundaries.\n * Uses safe resolution to prevent symlink traversal attacks.\n */\n private resolvePath(path: string): string {\n // Use safe path resolution to follow symlinks and validate boundaries\n const validationResult = safeResolvePath(\n path,\n this.workingDir,\n this.workingDir,\n )\n\n if (!validationResult.valid) {\n // If validation fails, still return the attempted path for error reporting\n // The caller (canRead/canWrite) will handle the violation\n return validationResult.resolvedPath\n }\n\n return validationResult.resolvedPath\n }\n\n /**\n * Get path relative to working directory\n */\n private getRelativePath(absolutePath: string): string {\n return relative(this.workingDir, absolutePath)\n }\n\n /**\n * Check if a path is under the working directory\n */\n private isUnderWorkingDir(absolutePath: string): boolean {\n const rel = relative(this.workingDir, absolutePath)\n return !rel.startsWith('..') && !isAbsolute(rel)\n }\n\n /**\n * Check if a path matches any of the given patterns\n */\n private matchesPattern(path: string, patterns: string[]): boolean {\n for (const pattern of patterns) {\n // Handle special '*' pattern for everything\n if (pattern === '*') {\n return true\n }\n\n // Handle './' for current directory\n if (pattern === './') {\n if (this.isUnderWorkingDir(this.resolvePath(path))) {\n return true\n }\n continue\n }\n\n // Use minimatch for glob patterns\n if (\n minimatch(path, pattern, { dot: true }) ||\n minimatch(path, `**/${pattern}`, { dot: true })\n ) {\n return true\n }\n\n // Check if pattern matches directory\n const pathDir = dirname(path)\n if (minimatch(pathDir, pattern, { dot: true })) {\n return true\n }\n }\n return false\n }\n\n /**\n * Create a violation record\n */\n private createViolation(\n type: SandboxViolation['type'],\n details: string,\n path: string,\n ): SandboxViolation {\n return {\n type,\n timestamp: Date.now(),\n command: '', // Will be set by caller\n details,\n path,\n }\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["violation"]
7
+ }
@@ -0,0 +1,14 @@
1
+ export * from "./types.js";
2
+ export * from "./filesystemBoundary.js";
3
+ export * from "./networkProxy.js";
4
+ import {
5
+ SandboxController,
6
+ getSandboxController,
7
+ resetSandboxController
8
+ } from "./sandboxController.js";
9
+ export {
10
+ SandboxController,
11
+ getSandboxController,
12
+ resetSandboxController
13
+ };
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/services/sandbox/index.ts"],
4
+ "sourcesContent": ["/**\n * Sandbox System\n *\n * Provides OS-level isolation for command execution.\n *\n * Features:\n * - Filesystem boundary enforcement\n * - Network access control\n * - Process isolation (macOS seatbelt, Linux bubblewrap, Docker)\n * - Violation tracking and reporting\n *\n * Usage:\n * ```typescript\n * import { getSandboxController } from '@services/sandbox'\n *\n * const sandbox = getSandboxController('/path/to/project')\n * sandbox.updateConfig({ enabled: true })\n *\n * const result = await sandbox.execute('npm install', '/path/to/project')\n * if (result.blocked) {\n * console.log('Command blocked:', result.blockReason)\n * }\n * ```\n */\n\nexport * from './types'\nexport * from './filesystemBoundary'\nexport * from './networkProxy'\nexport {\n SandboxController,\n getSandboxController,\n resetSandboxController,\n} from './sandboxController'\n"],
5
+ "mappings": "AAyBA,cAAc;AACd,cAAc;AACd,cAAc;AACd;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;",
6
+ "names": []
7
+ }