@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
@@ -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,300 @@
1
+ import { resolve, relative, isAbsolute, dirname } from "path";
2
+ import { minimatch } from "minimatch";
3
+ class FilesystemBoundary {
4
+ policy;
5
+ workingDir;
6
+ violations = [];
7
+ constructor(policy, workingDir) {
8
+ this.policy = policy;
9
+ this.workingDir = resolve(workingDir);
10
+ }
11
+ /**
12
+ * Update the filesystem policy
13
+ */
14
+ updatePolicy(policy) {
15
+ this.policy = { ...this.policy, ...policy };
16
+ }
17
+ /**
18
+ * Update the working directory
19
+ */
20
+ setWorkingDir(dir) {
21
+ this.workingDir = resolve(dir);
22
+ }
23
+ /**
24
+ * Check if a path can be read
25
+ */
26
+ canRead(path) {
27
+ const absolutePath = this.resolvePath(path);
28
+ const relativePath = this.getRelativePath(absolutePath);
29
+ if (this.matchesPattern(relativePath, this.policy.denied)) {
30
+ const violation2 = this.createViolation(
31
+ "filesystem_path_denied",
32
+ `Read access denied for path matching deny pattern: ${path}`,
33
+ absolutePath
34
+ );
35
+ return { allowed: false, violation: violation2 };
36
+ }
37
+ if (this.matchesPattern(relativePath, this.policy.readAllowed)) {
38
+ return { allowed: true };
39
+ }
40
+ if (this.matchesPattern(absolutePath, this.policy.readAllowed)) {
41
+ return { allowed: true };
42
+ }
43
+ if (this.policy.readAllowed.includes("*")) {
44
+ return { allowed: true };
45
+ }
46
+ const violation = this.createViolation(
47
+ "filesystem_read_denied",
48
+ `Read access denied: path does not match any allowed pattern: ${path}`,
49
+ absolutePath
50
+ );
51
+ return { allowed: false, violation };
52
+ }
53
+ /**
54
+ * Check if a path can be written
55
+ */
56
+ canWrite(path) {
57
+ const absolutePath = this.resolvePath(path);
58
+ const relativePath = this.getRelativePath(absolutePath);
59
+ if (this.matchesPattern(relativePath, this.policy.denied)) {
60
+ const violation2 = this.createViolation(
61
+ "filesystem_path_denied",
62
+ `Write access denied for path matching deny pattern: ${path}`,
63
+ absolutePath
64
+ );
65
+ return { allowed: false, violation: violation2 };
66
+ }
67
+ if (this.matchesPattern(relativePath, this.policy.writeAllowed)) {
68
+ return { allowed: true };
69
+ }
70
+ if (this.matchesPattern(absolutePath, this.policy.writeAllowed)) {
71
+ return { allowed: true };
72
+ }
73
+ if (this.policy.writeAllowed.includes("*")) {
74
+ return { allowed: true };
75
+ }
76
+ if (this.isUnderWorkingDir(absolutePath)) {
77
+ if (this.policy.writeAllowed.includes("./")) {
78
+ return { allowed: true };
79
+ }
80
+ }
81
+ const violation = this.createViolation(
82
+ "filesystem_write_denied",
83
+ `Write access denied: path does not match any allowed pattern: ${path}`,
84
+ absolutePath
85
+ );
86
+ return { allowed: false, violation };
87
+ }
88
+ /**
89
+ * Analyze a command for filesystem operations and validate them
90
+ */
91
+ analyzeCommand(command) {
92
+ const readPaths = [];
93
+ const writePaths = [];
94
+ const violations = [];
95
+ const extractedPaths = this.extractPathsFromCommand(command);
96
+ const redirectMatches = command.matchAll(/>\s*["']?([^\s"';&|]+)["']?/g);
97
+ for (const match of redirectMatches) {
98
+ if (match[1] && !match[1].startsWith("&")) {
99
+ writePaths.push(match[1]);
100
+ }
101
+ }
102
+ const teeMatches = command.matchAll(
103
+ /\btee\s+(?:-a\s+)?["']?([^\s"';&|]+)["']?/g
104
+ );
105
+ for (const match of teeMatches) {
106
+ if (match[1]) writePaths.push(match[1]);
107
+ }
108
+ const cpMatches = command.matchAll(
109
+ /\bcp\s+(?:-[a-zA-Z]+\s+)*\S+\s+["']?([^\s"';&|]+)["']?/g
110
+ );
111
+ for (const match of cpMatches) {
112
+ if (match[1]) writePaths.push(match[1]);
113
+ }
114
+ const mvMatches = command.matchAll(
115
+ /\bmv\s+(?:-[a-zA-Z]+\s+)*\S+\s+["']?([^\s"';&|]+)["']?/g
116
+ );
117
+ for (const match of mvMatches) {
118
+ if (match[1]) writePaths.push(match[1]);
119
+ }
120
+ const rmMatches = command.matchAll(
121
+ /\brm\s+(?:-[a-zA-Z]+\s+)*["']?([^\s"';&|]+)["']?/g
122
+ );
123
+ for (const match of rmMatches) {
124
+ if (match[1]) writePaths.push(match[1]);
125
+ }
126
+ const mkdirMatches = command.matchAll(
127
+ /\bmkdir\s+(?:-[a-zA-Z]+\s+)*["']?([^\s"';&|]+)["']?/g
128
+ );
129
+ for (const match of mkdirMatches) {
130
+ if (match[1]) writePaths.push(match[1]);
131
+ }
132
+ const rmdirMatches = command.matchAll(
133
+ /\brmdir\s+(?:-[a-zA-Z]+\s+)*["']?([^\s"';&|]+)["']?/g
134
+ );
135
+ for (const match of rmdirMatches) {
136
+ if (match[1]) writePaths.push(match[1]);
137
+ }
138
+ const touchMatches = command.matchAll(/\btouch\s+["']?([^\s"';&|]+)["']?/g);
139
+ for (const match of touchMatches) {
140
+ if (match[1]) writePaths.push(match[1]);
141
+ }
142
+ const chmodMatches = command.matchAll(
143
+ /\bchmod\s+(?:-[a-zA-Z]+\s+)*\S+\s+["']?([^\s"';&|]+)["']?/g
144
+ );
145
+ for (const match of chmodMatches) {
146
+ if (match[1]) writePaths.push(match[1]);
147
+ }
148
+ const chownMatches = command.matchAll(
149
+ /\bchown\s+(?:-[a-zA-Z]+\s+)*\S+\s+["']?([^\s"';&|]+)["']?/g
150
+ );
151
+ for (const match of chownMatches) {
152
+ if (match[1]) writePaths.push(match[1]);
153
+ }
154
+ if (!command.includes(">")) {
155
+ const catMatches = command.matchAll(/\bcat\s+["']?([^\s"';&|]+)["']?/g);
156
+ for (const match of catMatches) {
157
+ if (match[1]) readPaths.push(match[1]);
158
+ }
159
+ }
160
+ const headTailMatches = command.matchAll(
161
+ /\b(?:head|tail)\s+(?:-[a-zA-Z0-9]+\s+)*["']?([^\s"';&|]+)["']?/g
162
+ );
163
+ for (const match of headTailMatches) {
164
+ if (match[1]) readPaths.push(match[1]);
165
+ }
166
+ const pagerMatches = command.matchAll(
167
+ /\b(?:less|more)\s+["']?([^\s"';&|]+)["']?/g
168
+ );
169
+ for (const match of pagerMatches) {
170
+ if (match[1]) readPaths.push(match[1]);
171
+ }
172
+ for (const path of extractedPaths) {
173
+ if (!writePaths.includes(path) && !readPaths.includes(path)) {
174
+ readPaths.push(path);
175
+ }
176
+ }
177
+ const uniqueWritePaths = [...new Set(writePaths)];
178
+ const uniqueReadPaths = [...new Set(readPaths)];
179
+ for (const path of uniqueReadPaths) {
180
+ const result = this.canRead(path);
181
+ if (!result.allowed && result.violation) {
182
+ violations.push(result.violation);
183
+ }
184
+ }
185
+ for (const path of uniqueWritePaths) {
186
+ const result = this.canWrite(path);
187
+ if (!result.allowed && result.violation) {
188
+ violations.push(result.violation);
189
+ }
190
+ }
191
+ this.violations.push(...violations);
192
+ return {
193
+ readPaths: uniqueReadPaths,
194
+ writePaths: uniqueWritePaths,
195
+ violations
196
+ };
197
+ }
198
+ /**
199
+ * Get all recorded violations
200
+ */
201
+ getViolations() {
202
+ return [...this.violations];
203
+ }
204
+ /**
205
+ * Clear violation history
206
+ */
207
+ clearViolations() {
208
+ this.violations = [];
209
+ }
210
+ /**
211
+ * Extract potential file paths from a command string
212
+ */
213
+ extractPathsFromCommand(command) {
214
+ const paths = [];
215
+ const quotedMatches = command.matchAll(/["']([^"']+)["']/g);
216
+ for (const match of quotedMatches) {
217
+ if (match[1] && this.looksLikePath(match[1])) {
218
+ paths.push(match[1]);
219
+ }
220
+ }
221
+ const unquotedMatches = command.matchAll(
222
+ /(?:^|\s)((?:\.\/|\/|\.\.\/)[^\s;&|>]+)/g
223
+ );
224
+ for (const match of unquotedMatches) {
225
+ if (match[1]) {
226
+ paths.push(match[1]);
227
+ }
228
+ }
229
+ return [...new Set(paths)];
230
+ }
231
+ /**
232
+ * Check if a string looks like a file path
233
+ */
234
+ looksLikePath(str) {
235
+ return str.includes("/") || str.startsWith(".") || str.endsWith(".txt") || str.endsWith(".json") || str.endsWith(".js") || str.endsWith(".ts") || str.endsWith(".md");
236
+ }
237
+ /**
238
+ * Resolve a path to absolute
239
+ */
240
+ resolvePath(path) {
241
+ if (isAbsolute(path)) {
242
+ return path;
243
+ }
244
+ return resolve(this.workingDir, path);
245
+ }
246
+ /**
247
+ * Get path relative to working directory
248
+ */
249
+ getRelativePath(absolutePath) {
250
+ return relative(this.workingDir, absolutePath);
251
+ }
252
+ /**
253
+ * Check if a path is under the working directory
254
+ */
255
+ isUnderWorkingDir(absolutePath) {
256
+ const rel = relative(this.workingDir, absolutePath);
257
+ return !rel.startsWith("..") && !isAbsolute(rel);
258
+ }
259
+ /**
260
+ * Check if a path matches any of the given patterns
261
+ */
262
+ matchesPattern(path, patterns) {
263
+ for (const pattern of patterns) {
264
+ if (pattern === "*") {
265
+ return true;
266
+ }
267
+ if (pattern === "./") {
268
+ if (this.isUnderWorkingDir(this.resolvePath(path))) {
269
+ return true;
270
+ }
271
+ continue;
272
+ }
273
+ if (minimatch(path, pattern, { dot: true }) || minimatch(path, `**/${pattern}`, { dot: true })) {
274
+ return true;
275
+ }
276
+ const pathDir = dirname(path);
277
+ if (minimatch(pathDir, pattern, { dot: true })) {
278
+ return true;
279
+ }
280
+ }
281
+ return false;
282
+ }
283
+ /**
284
+ * Create a violation record
285
+ */
286
+ createViolation(type, details, path) {
287
+ return {
288
+ type,
289
+ timestamp: Date.now(),
290
+ command: "",
291
+ // Will be set by caller
292
+ details,
293
+ path
294
+ };
295
+ }
296
+ }
297
+ export {
298
+ FilesystemBoundary
299
+ };
300
+ //# 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 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\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 const absolutePath = this.resolvePath(path)\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 { allowed: false, violation }\n }\n\n // Check if path matches read-allowed patterns\n if (this.matchesPattern(relativePath, this.policy.readAllowed)) {\n return { allowed: true }\n }\n\n // Also check with absolute path\n if (this.matchesPattern(absolutePath, this.policy.readAllowed)) {\n return { allowed: true }\n }\n\n // Wildcard allows all reads\n if (this.policy.readAllowed.includes('*')) {\n return { allowed: true }\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 }\n }\n\n /**\n * Check if a path can be written\n */\n canWrite(path: string): FilesystemCheckResult {\n const absolutePath = this.resolvePath(path)\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 { allowed: false, violation }\n }\n\n // Check if path matches write-allowed patterns\n if (this.matchesPattern(relativePath, this.policy.writeAllowed)) {\n return { allowed: true }\n }\n\n // Also check with absolute path\n if (this.matchesPattern(absolutePath, this.policy.writeAllowed)) {\n return { allowed: true }\n }\n\n // Wildcard allows all writes\n if (this.policy.writeAllowed.includes('*')) {\n return { allowed: true }\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 }\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 }\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\n */\n private resolvePath(path: string): string {\n if (isAbsolute(path)) {\n return path\n }\n return resolve(this.workingDir, path)\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
+ }