@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
@@ -0,0 +1,106 @@
1
+ class PermissionEngine {
2
+ rules = [];
3
+ rulesByName = /* @__PURE__ */ new Map();
4
+ /**
5
+ * Register a permission rule
6
+ */
7
+ registerRule(rule) {
8
+ this.unregisterRule(rule.name);
9
+ this.rules.push(rule);
10
+ this.rulesByName.set(rule.name, rule);
11
+ this.rules.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
12
+ }
13
+ /**
14
+ * Register multiple rules at once
15
+ */
16
+ registerRules(rules) {
17
+ for (const rule of rules) {
18
+ this.registerRule(rule);
19
+ }
20
+ }
21
+ /**
22
+ * Unregister a rule by name
23
+ */
24
+ unregisterRule(name) {
25
+ const index = this.rules.findIndex((r) => r.name === name);
26
+ if (index !== -1) {
27
+ this.rules.splice(index, 1);
28
+ this.rulesByName.delete(name);
29
+ return true;
30
+ }
31
+ return false;
32
+ }
33
+ /**
34
+ * Get a rule by name
35
+ */
36
+ getRule(name) {
37
+ return this.rulesByName.get(name);
38
+ }
39
+ /**
40
+ * Get all registered rules
41
+ */
42
+ getRules() {
43
+ return [...this.rules];
44
+ }
45
+ /**
46
+ * Check permission for a tool operation
47
+ *
48
+ * Rules are evaluated in priority order. The first rule that
49
+ * returns a non-allowed result stops evaluation.
50
+ */
51
+ async checkPermission(context) {
52
+ const toolName = context.tool.name;
53
+ for (const rule of this.rules) {
54
+ if (rule.appliesTo && rule.appliesTo.length > 0) {
55
+ if (!rule.appliesTo.includes(toolName)) {
56
+ continue;
57
+ }
58
+ }
59
+ try {
60
+ const result = await Promise.resolve(rule.check(context));
61
+ if (!result.allowed) {
62
+ return {
63
+ ...result,
64
+ reason: result.reason || `Denied by rule: ${rule.name}`
65
+ };
66
+ }
67
+ } catch (error) {
68
+ console.warn(`Permission rule ${rule.name} threw error:`, error);
69
+ }
70
+ }
71
+ return { allowed: true };
72
+ }
73
+ /**
74
+ * Check if a specific rule would allow the operation
75
+ */
76
+ async checkRuleOnly(ruleName, context) {
77
+ const rule = this.rulesByName.get(ruleName);
78
+ if (!rule) {
79
+ return null;
80
+ }
81
+ return Promise.resolve(rule.check(context));
82
+ }
83
+ /**
84
+ * Clear all rules
85
+ */
86
+ clearRules() {
87
+ this.rules = [];
88
+ this.rulesByName.clear();
89
+ }
90
+ }
91
+ let globalEngine = null;
92
+ function getPermissionEngine() {
93
+ if (!globalEngine) {
94
+ globalEngine = new PermissionEngine();
95
+ }
96
+ return globalEngine;
97
+ }
98
+ function resetPermissionEngine() {
99
+ globalEngine = null;
100
+ }
101
+ export {
102
+ PermissionEngine,
103
+ getPermissionEngine,
104
+ resetPermissionEngine
105
+ };
106
+ //# sourceMappingURL=permissionEngine.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/core/permissions/engine/permissionEngine.ts"],
4
+ "sourcesContent": ["/**\n * Permission Engine\n *\n * Extensible rule-based permission system for tool access control.\n */\n\nimport type {\n PermissionContext,\n PermissionResult,\n PermissionRule,\n} from './types'\n\n/**\n * Permission Engine\n *\n * Manages permission rules and evaluates tool access requests.\n */\nexport class PermissionEngine {\n private rules: PermissionRule[] = []\n private rulesByName: Map<string, PermissionRule> = new Map()\n\n /**\n * Register a permission rule\n */\n registerRule(rule: PermissionRule): void {\n // Remove existing rule with same name\n this.unregisterRule(rule.name)\n\n this.rules.push(rule)\n this.rulesByName.set(rule.name, rule)\n\n // Sort by priority (descending)\n this.rules.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0))\n }\n\n /**\n * Register multiple rules at once\n */\n registerRules(rules: PermissionRule[]): void {\n for (const rule of rules) {\n this.registerRule(rule)\n }\n }\n\n /**\n * Unregister a rule by name\n */\n unregisterRule(name: string): boolean {\n const index = this.rules.findIndex(r => r.name === name)\n if (index !== -1) {\n this.rules.splice(index, 1)\n this.rulesByName.delete(name)\n return true\n }\n return false\n }\n\n /**\n * Get a rule by name\n */\n getRule(name: string): PermissionRule | undefined {\n return this.rulesByName.get(name)\n }\n\n /**\n * Get all registered rules\n */\n getRules(): PermissionRule[] {\n return [...this.rules]\n }\n\n /**\n * Check permission for a tool operation\n *\n * Rules are evaluated in priority order. The first rule that\n * returns a non-allowed result stops evaluation.\n */\n async checkPermission(context: PermissionContext): Promise<PermissionResult> {\n const toolName = context.tool.name\n\n for (const rule of this.rules) {\n // Skip rules that don't apply to this tool\n if (rule.appliesTo && rule.appliesTo.length > 0) {\n if (!rule.appliesTo.includes(toolName)) {\n continue\n }\n }\n\n try {\n const result = await Promise.resolve(rule.check(context))\n\n // If not allowed, return immediately\n if (!result.allowed) {\n return {\n ...result,\n reason: result.reason || `Denied by rule: ${rule.name}`,\n }\n }\n } catch (error) {\n // Log error but continue to next rule\n console.warn(`Permission rule ${rule.name} threw error:`, error)\n }\n }\n\n // All rules passed\n return { allowed: true }\n }\n\n /**\n * Check if a specific rule would allow the operation\n */\n async checkRuleOnly(\n ruleName: string,\n context: PermissionContext,\n ): Promise<PermissionResult | null> {\n const rule = this.rulesByName.get(ruleName)\n if (!rule) {\n return null\n }\n\n return Promise.resolve(rule.check(context))\n }\n\n /**\n * Clear all rules\n */\n clearRules(): void {\n this.rules = []\n this.rulesByName.clear()\n }\n}\n\n// Global singleton instance\nlet globalEngine: PermissionEngine | null = null\n\n/**\n * Get the global permission engine instance\n */\nexport function getPermissionEngine(): PermissionEngine {\n if (!globalEngine) {\n globalEngine = new PermissionEngine()\n }\n return globalEngine\n}\n\n/**\n * Reset the global permission engine (for testing)\n */\nexport function resetPermissionEngine(): void {\n globalEngine = null\n}\n"],
5
+ "mappings": "AAiBO,MAAM,iBAAiB;AAAA,EACpB,QAA0B,CAAC;AAAA,EAC3B,cAA2C,oBAAI,IAAI;AAAA;AAAA;AAAA;AAAA,EAK3D,aAAa,MAA4B;AAEvC,SAAK,eAAe,KAAK,IAAI;AAE7B,SAAK,MAAM,KAAK,IAAI;AACpB,SAAK,YAAY,IAAI,KAAK,MAAM,IAAI;AAGpC,SAAK,MAAM,KAAK,CAAC,GAAG,OAAO,EAAE,YAAY,MAAM,EAAE,YAAY,EAAE;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,OAA+B;AAC3C,eAAW,QAAQ,OAAO;AACxB,WAAK,aAAa,IAAI;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,MAAuB;AACpC,UAAM,QAAQ,KAAK,MAAM,UAAU,OAAK,EAAE,SAAS,IAAI;AACvD,QAAI,UAAU,IAAI;AAChB,WAAK,MAAM,OAAO,OAAO,CAAC;AAC1B,WAAK,YAAY,OAAO,IAAI;AAC5B,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,MAA0C;AAChD,WAAO,KAAK,YAAY,IAAI,IAAI;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,WAA6B;AAC3B,WAAO,CAAC,GAAG,KAAK,KAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,gBAAgB,SAAuD;AAC3E,UAAM,WAAW,QAAQ,KAAK;AAE9B,eAAW,QAAQ,KAAK,OAAO;AAE7B,UAAI,KAAK,aAAa,KAAK,UAAU,SAAS,GAAG;AAC/C,YAAI,CAAC,KAAK,UAAU,SAAS,QAAQ,GAAG;AACtC;AAAA,QACF;AAAA,MACF;AAEA,UAAI;AACF,cAAM,SAAS,MAAM,QAAQ,QAAQ,KAAK,MAAM,OAAO,CAAC;AAGxD,YAAI,CAAC,OAAO,SAAS;AACnB,iBAAO;AAAA,YACL,GAAG;AAAA,YACH,QAAQ,OAAO,UAAU,mBAAmB,KAAK,IAAI;AAAA,UACvD;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AAEd,gBAAQ,KAAK,mBAAmB,KAAK,IAAI,iBAAiB,KAAK;AAAA,MACjE;AAAA,IACF;AAGA,WAAO,EAAE,SAAS,KAAK;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cACJ,UACA,SACkC;AAClC,UAAM,OAAO,KAAK,YAAY,IAAI,QAAQ;AAC1C,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,IACT;AAEA,WAAO,QAAQ,QAAQ,KAAK,MAAM,OAAO,CAAC;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,aAAmB;AACjB,SAAK,QAAQ,CAAC;AACd,SAAK,YAAY,MAAM;AAAA,EACzB;AACF;AAGA,IAAI,eAAwC;AAKrC,SAAS,sBAAwC;AACtD,MAAI,CAAC,cAAc;AACjB,mBAAe,IAAI,iBAAiB;AAAA,EACtC;AACA,SAAO;AACT;AAKO,SAAS,wBAA8B;AAC5C,iBAAe;AACjB;",
6
+ "names": []
7
+ }
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,84 @@
1
+ import {
2
+ DEFAULT_PERMISSION_RULES,
3
+ DEFAULT_PERMISSION_CONFIG
4
+ } from "./types.js";
5
+ import {
6
+ PermissionRuleEngine,
7
+ getPermissionRuleEngine,
8
+ resetPermissionRuleEngine
9
+ } from "./ruleEngine.js";
10
+ import {
11
+ PermissionEngine,
12
+ getPermissionEngine,
13
+ resetPermissionEngine
14
+ } from "./engine/permissionEngine.js";
15
+ export * from "./rules/index.js";
16
+ import {
17
+ logSecurityEvent,
18
+ logPermissionGranted,
19
+ logPermissionDenied,
20
+ logOperationBlocked,
21
+ logSensitivePathAccess,
22
+ logExternalOperation,
23
+ logDangerousCommand,
24
+ getSessionLog,
25
+ getEntriesByType,
26
+ getEntriesByOutcome,
27
+ getSessionSecuritySummary,
28
+ getRecentSecurityEvents,
29
+ formatAuditEntry,
30
+ readAuditLog,
31
+ clearSessionLog,
32
+ resetSession
33
+ } from "./auditLog.js";
34
+ import {
35
+ SENSITIVE_PATHS,
36
+ isSensitivePath,
37
+ getSensitivePathInfo,
38
+ findMatchingSensitivePaths
39
+ } from "./rules/sensitivePathsRule.js";
40
+ import {
41
+ isOutsideProject,
42
+ getRelativeFromProject,
43
+ calculateExternalOperationRisk,
44
+ isExternalOperation
45
+ } from "./rules/projectBoundaryRule.js";
46
+ import {
47
+ shouldAutoEscalate
48
+ } from "./rules/autoEscalationRule.js";
49
+ export {
50
+ DEFAULT_PERMISSION_CONFIG,
51
+ DEFAULT_PERMISSION_RULES,
52
+ PermissionEngine,
53
+ PermissionRuleEngine,
54
+ SENSITIVE_PATHS,
55
+ calculateExternalOperationRisk,
56
+ clearSessionLog,
57
+ findMatchingSensitivePaths,
58
+ formatAuditEntry,
59
+ getEntriesByOutcome,
60
+ getEntriesByType,
61
+ getPermissionEngine,
62
+ getPermissionRuleEngine,
63
+ getRecentSecurityEvents,
64
+ getRelativeFromProject,
65
+ getSensitivePathInfo,
66
+ getSessionLog,
67
+ getSessionSecuritySummary,
68
+ isExternalOperation,
69
+ isOutsideProject,
70
+ isSensitivePath,
71
+ logDangerousCommand,
72
+ logExternalOperation,
73
+ logOperationBlocked,
74
+ logPermissionDenied,
75
+ logPermissionGranted,
76
+ logSecurityEvent,
77
+ logSensitivePathAccess,
78
+ readAuditLog,
79
+ resetPermissionEngine,
80
+ resetPermissionRuleEngine,
81
+ resetSession,
82
+ shouldAutoEscalate
83
+ };
84
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/core/permissions/index.ts"],
4
+ "sourcesContent": ["/**\n * Permission System\n *\n * Enhanced permission rules system with pattern matching and priorities.\n *\n * Security Features:\n * - Sensitive path protection (SSH keys, credentials, etc.)\n * - Project boundary enforcement (external operations require confirmation)\n * - Auto-escalation for high-risk operations\n * - Comprehensive audit logging\n * - Persistent and session-based permissions\n */\n\n// Pattern-based rule engine types (rule-based system)\nexport {\n type PermissionDecision as RulePermissionDecision,\n type PermissionScope,\n type PermissionRule as PatternPermissionRule,\n type PermissionEvaluationResult,\n type PermissionRulesConfig,\n DEFAULT_PERMISSION_RULES,\n DEFAULT_PERMISSION_CONFIG,\n} from './types'\n\n// Pattern-based rule engine\nexport {\n PermissionRuleEngine,\n getPermissionRuleEngine,\n resetPermissionRuleEngine,\n} from './ruleEngine'\n\n// Permission engine for tool access control (original engine types)\nexport {\n type PermissionContext,\n type PermissionResult,\n type PermissionRule,\n type PermissionDecision,\n type HookPermissionOutput,\n} from './engine/types'\n\nexport {\n PermissionEngine,\n getPermissionEngine,\n resetPermissionEngine,\n} from './engine/permissionEngine'\n\n// Built-in permission rules\nexport * from './rules'\n\n// Audit logging\nexport {\n type AuditEventType,\n type AuditLogEntry,\n logSecurityEvent,\n logPermissionGranted,\n logPermissionDenied,\n logOperationBlocked,\n logSensitivePathAccess,\n logExternalOperation,\n logDangerousCommand,\n getSessionLog,\n getEntriesByType,\n getEntriesByOutcome,\n getSessionSecuritySummary,\n getRecentSecurityEvents,\n formatAuditEntry,\n readAuditLog,\n clearSessionLog,\n resetSession,\n} from './auditLog'\n\n// Sensitive paths utilities\nexport {\n type SensitivePathCategory,\n type SensitivePath,\n SENSITIVE_PATHS,\n isSensitivePath,\n getSensitivePathInfo,\n findMatchingSensitivePaths,\n} from './rules/sensitivePathsRule'\n\n// Project boundary utilities\nexport {\n type ExternalOperationRisk,\n isOutsideProject,\n getRelativeFromProject,\n calculateExternalOperationRisk,\n isExternalOperation,\n} from './rules/projectBoundaryRule'\n\n// Auto-escalation utilities\nexport {\n type EscalationReason,\n shouldAutoEscalate,\n} from './rules/autoEscalationRule'\n"],
5
+ "mappings": "AAcA;AAAA,EAME;AAAA,EACA;AAAA,OACK;AAGP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAWP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,cAAc;AAGd;AAAA,EAGE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP;AAAA,EAGE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP;AAAA,EAEE;AAAA,OACK;",
6
+ "names": []
7
+ }
@@ -0,0 +1,259 @@
1
+ import { DEFAULT_PERMISSION_CONFIG } from "./types.js";
2
+ class PermissionRuleEngine {
3
+ globalRules = [];
4
+ projectRules = [];
5
+ defaultDecision = "ask";
6
+ debug = false;
7
+ patternCache = /* @__PURE__ */ new Map();
8
+ constructor(config) {
9
+ const fullConfig = { ...DEFAULT_PERMISSION_CONFIG, ...config };
10
+ this.loadRules(fullConfig.rules);
11
+ this.defaultDecision = fullConfig.defaultDecision;
12
+ this.debug = fullConfig.debug ?? false;
13
+ }
14
+ /**
15
+ * Load rules from configuration
16
+ */
17
+ loadRules(rules) {
18
+ this.globalRules = [];
19
+ this.projectRules = [];
20
+ this.patternCache.clear();
21
+ for (const rule of rules) {
22
+ if (this.isRuleValid(rule)) {
23
+ if (rule.scope === "global") {
24
+ this.globalRules.push(rule);
25
+ } else {
26
+ this.projectRules.push(rule);
27
+ }
28
+ }
29
+ }
30
+ this.globalRules.sort((a, b) => a.priority - b.priority);
31
+ this.projectRules.sort((a, b) => a.priority - b.priority);
32
+ }
33
+ /**
34
+ * Add a new rule
35
+ */
36
+ addRule(rule) {
37
+ if (!this.isRuleValid(rule)) {
38
+ throw new Error(`Invalid rule: ${JSON.stringify(rule)}`);
39
+ }
40
+ if (rule.scope === "global") {
41
+ this.globalRules.push(rule);
42
+ this.globalRules.sort((a, b) => a.priority - b.priority);
43
+ } else {
44
+ this.projectRules.push(rule);
45
+ this.projectRules.sort((a, b) => a.priority - b.priority);
46
+ }
47
+ }
48
+ /**
49
+ * Remove a rule by ID
50
+ */
51
+ removeRule(ruleId) {
52
+ const globalIndex = this.globalRules.findIndex((r) => r.id === ruleId);
53
+ if (globalIndex >= 0) {
54
+ this.globalRules.splice(globalIndex, 1);
55
+ return true;
56
+ }
57
+ const projectIndex = this.projectRules.findIndex((r) => r.id === ruleId);
58
+ if (projectIndex >= 0) {
59
+ this.projectRules.splice(projectIndex, 1);
60
+ return true;
61
+ }
62
+ return false;
63
+ }
64
+ /**
65
+ * Evaluate a tool use against permission rules
66
+ *
67
+ * Precedence: DENY > ALLOW > ASK
68
+ * Project rules take precedence over global rules within the same decision type.
69
+ */
70
+ evaluate(toolName, params) {
71
+ const toolUseString = this.formatToolUse(toolName, params);
72
+ const evaluationPath = [];
73
+ if (this.debug) {
74
+ evaluationPath.push(`Evaluating: ${toolUseString}`);
75
+ }
76
+ const now = Date.now();
77
+ const activeGlobalRules = this.globalRules.filter(
78
+ (r) => !r.expiresAt || r.expiresAt > now
79
+ );
80
+ const activeProjectRules = this.projectRules.filter(
81
+ (r) => !r.expiresAt || r.expiresAt > now
82
+ );
83
+ const allRules = [...activeProjectRules, ...activeGlobalRules];
84
+ const denyRules = allRules.filter((r) => r.decision === "deny");
85
+ for (const rule of denyRules) {
86
+ if (this.matchPattern(rule.pattern, toolUseString)) {
87
+ if (this.debug) {
88
+ evaluationPath.push(`DENY matched: ${rule.pattern} (${rule.id})`);
89
+ }
90
+ return {
91
+ decision: "deny",
92
+ matchedRule: rule,
93
+ evaluationPath: this.debug ? evaluationPath : void 0
94
+ };
95
+ }
96
+ }
97
+ const allowRules = allRules.filter((r) => r.decision === "allow");
98
+ for (const rule of allowRules) {
99
+ if (this.matchPattern(rule.pattern, toolUseString)) {
100
+ if (this.debug) {
101
+ evaluationPath.push(`ALLOW matched: ${rule.pattern} (${rule.id})`);
102
+ }
103
+ return {
104
+ decision: "allow",
105
+ matchedRule: rule,
106
+ evaluationPath: this.debug ? evaluationPath : void 0
107
+ };
108
+ }
109
+ }
110
+ const askRules = allRules.filter((r) => r.decision === "ask");
111
+ for (const rule of askRules) {
112
+ if (this.matchPattern(rule.pattern, toolUseString)) {
113
+ if (this.debug) {
114
+ evaluationPath.push(`ASK matched: ${rule.pattern} (${rule.id})`);
115
+ }
116
+ return {
117
+ decision: "ask",
118
+ matchedRule: rule,
119
+ evaluationPath: this.debug ? evaluationPath : void 0
120
+ };
121
+ }
122
+ }
123
+ if (this.debug) {
124
+ evaluationPath.push(
125
+ `No rule matched, using default: ${this.defaultDecision}`
126
+ );
127
+ }
128
+ return {
129
+ decision: this.defaultDecision,
130
+ matchedRule: null,
131
+ evaluationPath: this.debug ? evaluationPath : void 0
132
+ };
133
+ }
134
+ /**
135
+ * Get all rules
136
+ */
137
+ getRules(scope) {
138
+ if (scope === "global") return [...this.globalRules];
139
+ if (scope === "project") return [...this.projectRules];
140
+ return [...this.projectRules, ...this.globalRules];
141
+ }
142
+ /**
143
+ * Get the default decision
144
+ */
145
+ getDefaultDecision() {
146
+ return this.defaultDecision;
147
+ }
148
+ /**
149
+ * Set the default decision
150
+ */
151
+ setDefaultDecision(decision) {
152
+ this.defaultDecision = decision;
153
+ }
154
+ /**
155
+ * Export rules as configuration
156
+ */
157
+ exportConfig() {
158
+ return {
159
+ rules: [...this.projectRules, ...this.globalRules],
160
+ defaultDecision: this.defaultDecision,
161
+ debug: this.debug
162
+ };
163
+ }
164
+ /**
165
+ * Match a pattern against a tool use string
166
+ *
167
+ * Supports patterns:
168
+ * - "ToolName" - matches tool name (with any params)
169
+ * - "ToolName(*)" - matches any params
170
+ * - "ToolName(prefix:*)" - matches prefix with any suffix
171
+ * - "ToolName(exact)" - matches exact param
172
+ * - "*" - matches everything
173
+ */
174
+ matchPattern(pattern, toolUseString) {
175
+ if (!pattern.includes("(") && !pattern.includes("*")) {
176
+ if (toolUseString.startsWith(pattern + "(") || toolUseString === pattern) {
177
+ return true;
178
+ }
179
+ }
180
+ let regex = this.patternCache.get(pattern);
181
+ if (!regex) {
182
+ regex = this.patternToRegex(pattern);
183
+ this.patternCache.set(pattern, regex);
184
+ }
185
+ return regex.test(toolUseString);
186
+ }
187
+ /**
188
+ * Convert a pattern to a regular expression
189
+ */
190
+ patternToRegex(pattern) {
191
+ if (pattern === "*") {
192
+ return /^.*$/;
193
+ }
194
+ let regexStr = pattern.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*/g, ".*").replace(/\?/g, ".");
195
+ regexStr = `^${regexStr}$`;
196
+ try {
197
+ return new RegExp(regexStr, "i");
198
+ } catch {
199
+ return /^\0$/;
200
+ }
201
+ }
202
+ /**
203
+ * Format a tool use as a string for pattern matching
204
+ *
205
+ * Format: "ToolName(param_summary)"
206
+ * For Bash: "Bash(command_prefix)"
207
+ * For Read: "Read(file_path)"
208
+ * For Edit: "Edit(file_path)"
209
+ */
210
+ formatToolUse(toolName, params) {
211
+ if (!params || typeof params !== "object") {
212
+ return toolName;
213
+ }
214
+ const p = params;
215
+ if (toolName === "Bash" && typeof p.command === "string") {
216
+ const command = p.command.trim();
217
+ const parts = command.split(/\s+/);
218
+ const prefix = parts.slice(0, 2).join(" ");
219
+ return `Bash(${prefix})`;
220
+ }
221
+ if (typeof p.file_path === "string") {
222
+ return `${toolName}(${p.file_path})`;
223
+ }
224
+ if (typeof p.path === "string") {
225
+ return `${toolName}(${p.path})`;
226
+ }
227
+ if (typeof p.pattern === "string") {
228
+ return `${toolName}(${p.pattern})`;
229
+ }
230
+ return toolName;
231
+ }
232
+ /**
233
+ * Validate a rule
234
+ */
235
+ isRuleValid(rule) {
236
+ if (!rule.id || typeof rule.id !== "string") return false;
237
+ if (!rule.pattern || typeof rule.pattern !== "string") return false;
238
+ if (!["allow", "deny", "ask"].includes(rule.decision)) return false;
239
+ if (!["global", "project"].includes(rule.scope)) return false;
240
+ if (typeof rule.priority !== "number") return false;
241
+ return true;
242
+ }
243
+ }
244
+ let globalRuleEngine = null;
245
+ function getPermissionRuleEngine() {
246
+ if (!globalRuleEngine) {
247
+ globalRuleEngine = new PermissionRuleEngine();
248
+ }
249
+ return globalRuleEngine;
250
+ }
251
+ function resetPermissionRuleEngine() {
252
+ globalRuleEngine = null;
253
+ }
254
+ export {
255
+ PermissionRuleEngine,
256
+ getPermissionRuleEngine,
257
+ resetPermissionRuleEngine
258
+ };
259
+ //# sourceMappingURL=ruleEngine.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/core/permissions/ruleEngine.ts"],
4
+ "sourcesContent": ["/**\n * Permission Rule Engine\n *\n * Evaluates permission rules with pattern matching and priority handling.\n * Implements DENY > ALLOW > ASK precedence for security.\n */\n\nimport type {\n PermissionRule,\n PermissionDecision,\n PermissionEvaluationResult,\n PermissionRulesConfig,\n PermissionScope,\n} from './types'\nimport { DEFAULT_PERMISSION_CONFIG } from './types'\n\n/**\n * Permission Rule Engine\n *\n * Evaluates tool use requests against permission rules.\n */\nexport class PermissionRuleEngine {\n private globalRules: PermissionRule[] = []\n private projectRules: PermissionRule[] = []\n private defaultDecision: PermissionDecision = 'ask'\n private debug: boolean = false\n private patternCache: Map<string, RegExp> = new Map()\n\n constructor(config?: Partial<PermissionRulesConfig>) {\n const fullConfig = { ...DEFAULT_PERMISSION_CONFIG, ...config }\n this.loadRules(fullConfig.rules)\n this.defaultDecision = fullConfig.defaultDecision\n this.debug = fullConfig.debug ?? false\n }\n\n /**\n * Load rules from configuration\n */\n loadRules(rules: PermissionRule[]): void {\n this.globalRules = []\n this.projectRules = []\n this.patternCache.clear()\n\n for (const rule of rules) {\n if (this.isRuleValid(rule)) {\n if (rule.scope === 'global') {\n this.globalRules.push(rule)\n } else {\n this.projectRules.push(rule)\n }\n }\n }\n\n // Sort by priority (lower number = higher priority)\n this.globalRules.sort((a, b) => a.priority - b.priority)\n this.projectRules.sort((a, b) => a.priority - b.priority)\n }\n\n /**\n * Add a new rule\n */\n addRule(rule: PermissionRule): void {\n if (!this.isRuleValid(rule)) {\n throw new Error(`Invalid rule: ${JSON.stringify(rule)}`)\n }\n\n if (rule.scope === 'global') {\n this.globalRules.push(rule)\n this.globalRules.sort((a, b) => a.priority - b.priority)\n } else {\n this.projectRules.push(rule)\n this.projectRules.sort((a, b) => a.priority - b.priority)\n }\n }\n\n /**\n * Remove a rule by ID\n */\n removeRule(ruleId: string): boolean {\n const globalIndex = this.globalRules.findIndex(r => r.id === ruleId)\n if (globalIndex >= 0) {\n this.globalRules.splice(globalIndex, 1)\n return true\n }\n\n const projectIndex = this.projectRules.findIndex(r => r.id === ruleId)\n if (projectIndex >= 0) {\n this.projectRules.splice(projectIndex, 1)\n return true\n }\n\n return false\n }\n\n /**\n * Evaluate a tool use against permission rules\n *\n * Precedence: DENY > ALLOW > ASK\n * Project rules take precedence over global rules within the same decision type.\n */\n evaluate(toolName: string, params: unknown): PermissionEvaluationResult {\n const toolUseString = this.formatToolUse(toolName, params)\n const evaluationPath: string[] = []\n\n if (this.debug) {\n evaluationPath.push(`Evaluating: ${toolUseString}`)\n }\n\n // Check for expired rules and filter them out\n const now = Date.now()\n const activeGlobalRules = this.globalRules.filter(\n r => !r.expiresAt || r.expiresAt > now,\n )\n const activeProjectRules = this.projectRules.filter(\n r => !r.expiresAt || r.expiresAt > now,\n )\n\n // Combine all rules for evaluation, project rules first\n const allRules = [...activeProjectRules, ...activeGlobalRules]\n\n // 1. Check DENY rules first (highest priority for security)\n const denyRules = allRules.filter(r => r.decision === 'deny')\n for (const rule of denyRules) {\n if (this.matchPattern(rule.pattern, toolUseString)) {\n if (this.debug) {\n evaluationPath.push(`DENY matched: ${rule.pattern} (${rule.id})`)\n }\n return {\n decision: 'deny',\n matchedRule: rule,\n evaluationPath: this.debug ? evaluationPath : undefined,\n }\n }\n }\n\n // 2. Check ALLOW rules next\n const allowRules = allRules.filter(r => r.decision === 'allow')\n for (const rule of allowRules) {\n if (this.matchPattern(rule.pattern, toolUseString)) {\n if (this.debug) {\n evaluationPath.push(`ALLOW matched: ${rule.pattern} (${rule.id})`)\n }\n return {\n decision: 'allow',\n matchedRule: rule,\n evaluationPath: this.debug ? evaluationPath : undefined,\n }\n }\n }\n\n // 3. Check ASK rules\n const askRules = allRules.filter(r => r.decision === 'ask')\n for (const rule of askRules) {\n if (this.matchPattern(rule.pattern, toolUseString)) {\n if (this.debug) {\n evaluationPath.push(`ASK matched: ${rule.pattern} (${rule.id})`)\n }\n return {\n decision: 'ask',\n matchedRule: rule,\n evaluationPath: this.debug ? evaluationPath : undefined,\n }\n }\n }\n\n // 4. No rule matched, use default\n if (this.debug) {\n evaluationPath.push(\n `No rule matched, using default: ${this.defaultDecision}`,\n )\n }\n return {\n decision: this.defaultDecision,\n matchedRule: null,\n evaluationPath: this.debug ? evaluationPath : undefined,\n }\n }\n\n /**\n * Get all rules\n */\n getRules(scope?: PermissionScope): PermissionRule[] {\n if (scope === 'global') return [...this.globalRules]\n if (scope === 'project') return [...this.projectRules]\n return [...this.projectRules, ...this.globalRules]\n }\n\n /**\n * Get the default decision\n */\n getDefaultDecision(): PermissionDecision {\n return this.defaultDecision\n }\n\n /**\n * Set the default decision\n */\n setDefaultDecision(decision: PermissionDecision): void {\n this.defaultDecision = decision\n }\n\n /**\n * Export rules as configuration\n */\n exportConfig(): PermissionRulesConfig {\n return {\n rules: [...this.projectRules, ...this.globalRules],\n defaultDecision: this.defaultDecision,\n debug: this.debug,\n }\n }\n\n /**\n * Match a pattern against a tool use string\n *\n * Supports patterns:\n * - \"ToolName\" - matches tool name (with any params)\n * - \"ToolName(*)\" - matches any params\n * - \"ToolName(prefix:*)\" - matches prefix with any suffix\n * - \"ToolName(exact)\" - matches exact param\n * - \"*\" - matches everything\n */\n private matchPattern(pattern: string, toolUseString: string): boolean {\n // Special case: pattern without parens matches tool name with any params\n // e.g., \"Read\" should match \"Read(/some/path)\"\n if (!pattern.includes('(') && !pattern.includes('*')) {\n // Check if tool use starts with the pattern tool name\n if (\n toolUseString.startsWith(pattern + '(') ||\n toolUseString === pattern\n ) {\n return true\n }\n }\n\n // Check cache first\n let regex = this.patternCache.get(pattern)\n if (!regex) {\n regex = this.patternToRegex(pattern)\n this.patternCache.set(pattern, regex)\n }\n return regex.test(toolUseString)\n }\n\n /**\n * Convert a pattern to a regular expression\n */\n private patternToRegex(pattern: string): RegExp {\n // Handle special case: \"*\" matches everything\n if (pattern === '*') {\n return /^.*$/\n }\n\n // Escape special regex characters except * and ?\n let regexStr = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n // Handle wildcards: * matches anything, ? matches single char\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.')\n\n // Make it a full match\n regexStr = `^${regexStr}$`\n\n try {\n return new RegExp(regexStr, 'i')\n } catch {\n // If regex creation fails, return a pattern that won't match\n return /^\\0$/\n }\n }\n\n /**\n * Format a tool use as a string for pattern matching\n *\n * Format: \"ToolName(param_summary)\"\n * For Bash: \"Bash(command_prefix)\"\n * For Read: \"Read(file_path)\"\n * For Edit: \"Edit(file_path)\"\n */\n private formatToolUse(toolName: string, params: unknown): string {\n if (!params || typeof params !== 'object') {\n return toolName\n }\n\n const p = params as Record<string, unknown>\n\n // Handle Bash tool specially - extract command prefix\n if (toolName === 'Bash' && typeof p.command === 'string') {\n const command = p.command.trim()\n // Extract the first word or first two words as prefix\n const parts = command.split(/\\s+/)\n const prefix = parts.slice(0, 2).join(' ')\n return `Bash(${prefix})`\n }\n\n // Handle file-related tools\n if (typeof p.file_path === 'string') {\n return `${toolName}(${p.file_path})`\n }\n if (typeof p.path === 'string') {\n return `${toolName}(${p.path})`\n }\n\n // Handle tools with patterns\n if (typeof p.pattern === 'string') {\n return `${toolName}(${p.pattern})`\n }\n\n // Default: just the tool name\n return toolName\n }\n\n /**\n * Validate a rule\n */\n private isRuleValid(rule: PermissionRule): boolean {\n if (!rule.id || typeof rule.id !== 'string') return false\n if (!rule.pattern || typeof rule.pattern !== 'string') return false\n if (!['allow', 'deny', 'ask'].includes(rule.decision)) return false\n if (!['global', 'project'].includes(rule.scope)) return false\n if (typeof rule.priority !== 'number') return false\n return true\n }\n}\n\n// Global singleton instance\nlet globalRuleEngine: PermissionRuleEngine | null = null\n\n/**\n * Get the global permission rule engine instance\n */\nexport function getPermissionRuleEngine(): PermissionRuleEngine {\n if (!globalRuleEngine) {\n globalRuleEngine = new PermissionRuleEngine()\n }\n return globalRuleEngine\n}\n\n/**\n * Reset the global permission rule engine (for testing)\n */\nexport function resetPermissionRuleEngine(): void {\n globalRuleEngine = null\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,62 @@
1
+ const ALWAYS_ALLOWED_TOOLS = /* @__PURE__ */ new Set([
2
+ "Read",
3
+ "Glob",
4
+ "Grep",
5
+ "LS",
6
+ "LSP",
7
+ "TodoWrite",
8
+ "AskUserQuestion",
9
+ "Think"
10
+ ]);
11
+ function getPermissionKey(toolName, input, prefix) {
12
+ if (toolName === "Bash") {
13
+ const command = input.command;
14
+ if (prefix) {
15
+ return `Bash(${prefix}:*)`;
16
+ }
17
+ if (command) {
18
+ return `Bash(${command})`;
19
+ }
20
+ }
21
+ if (toolName === "Edit" || toolName === "Replace" || toolName === "Write" || toolName === "MultiEdit") {
22
+ const filePath = input.file_path;
23
+ if (filePath) {
24
+ return `${toolName}(${filePath})`;
25
+ }
26
+ }
27
+ return toolName;
28
+ }
29
+ const allowedToolsRule = {
30
+ name: "allowed-tools",
31
+ description: "Checks tool against allowed tools list",
32
+ priority: 50,
33
+ // Medium priority
34
+ check(context) {
35
+ const toolName = context.tool.name;
36
+ if (ALWAYS_ALLOWED_TOOLS.has(toolName)) {
37
+ return { allowed: true };
38
+ }
39
+ if (context.tool.needsPermissions && !context.tool.needsPermissions()) {
40
+ return { allowed: true };
41
+ }
42
+ const permissionKey = getPermissionKey(toolName, context.input, null);
43
+ if (context.allowedTools.includes(toolName)) {
44
+ return { allowed: true };
45
+ }
46
+ if (context.allowedTools.includes(permissionKey)) {
47
+ return { allowed: true };
48
+ }
49
+ return {
50
+ allowed: true,
51
+ // Allow but mark for prompting
52
+ promptUser: true,
53
+ permissionKey,
54
+ message: `Permission needed for ${toolName}`
55
+ };
56
+ }
57
+ };
58
+ export {
59
+ allowedToolsRule,
60
+ getPermissionKey
61
+ };
62
+ //# sourceMappingURL=allowedToolsRule.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/core/permissions/rules/allowedToolsRule.ts"],
4
+ "sourcesContent": ["/**\n * Allowed Tools Permission Rule\n *\n * Checks if a tool is in the allowed tools list.\n */\n\nimport type {\n PermissionRule,\n PermissionContext,\n PermissionResult,\n} from '../engine/types'\n\n/**\n * Tools that are always allowed (no permission needed)\n */\nconst ALWAYS_ALLOWED_TOOLS = new Set([\n 'Read',\n 'Glob',\n 'Grep',\n 'LS',\n 'LSP',\n 'TodoWrite',\n 'AskUserQuestion',\n 'Think',\n])\n\n/**\n * Generate permission key for a tool\n */\nexport function getPermissionKey(\n toolName: string,\n input: Record<string, unknown>,\n prefix: string | null,\n): string {\n if (toolName === 'Bash') {\n const command = input.command as string | undefined\n if (prefix) {\n return `Bash(${prefix}:*)`\n }\n if (command) {\n return `Bash(${command})`\n }\n }\n\n // Note: 'Replace' is the actual API name for FileWriteTool (userFacingName is 'Write')\n if (\n toolName === 'Edit' ||\n toolName === 'Replace' ||\n toolName === 'Write' ||\n toolName === 'MultiEdit'\n ) {\n const filePath = input.file_path as string | undefined\n if (filePath) {\n return `${toolName}(${filePath})`\n }\n }\n\n return toolName\n}\n\n/**\n * Allowed Tools Rule\n *\n * Checks if a tool operation is in the allowed tools list.\n */\nexport const allowedToolsRule: PermissionRule = {\n name: 'allowed-tools',\n description: 'Checks tool against allowed tools list',\n priority: 50, // Medium priority\n\n check(context: PermissionContext): PermissionResult {\n const toolName = context.tool.name\n\n // Always allowed tools don't need permission\n if (ALWAYS_ALLOWED_TOOLS.has(toolName)) {\n return { allowed: true }\n }\n\n // Check if tool doesn't need permissions\n if (context.tool.needsPermissions && !context.tool.needsPermissions()) {\n return { allowed: true }\n }\n\n // Generate permission key\n const permissionKey = getPermissionKey(toolName, context.input, null)\n\n // Check if in allowed tools list\n if (context.allowedTools.includes(toolName)) {\n return { allowed: true }\n }\n\n if (context.allowedTools.includes(permissionKey)) {\n return { allowed: true }\n }\n\n // Not in allowed list - prompt user\n return {\n allowed: true, // Allow but mark for prompting\n promptUser: true,\n permissionKey,\n message: `Permission needed for ${toolName}`,\n }\n },\n}\n"],
5
+ "mappings": "AAeA,MAAM,uBAAuB,oBAAI,IAAI;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAKM,SAAS,iBACd,UACA,OACA,QACQ;AACR,MAAI,aAAa,QAAQ;AACvB,UAAM,UAAU,MAAM;AACtB,QAAI,QAAQ;AACV,aAAO,QAAQ,MAAM;AAAA,IACvB;AACA,QAAI,SAAS;AACX,aAAO,QAAQ,OAAO;AAAA,IACxB;AAAA,EACF;AAGA,MACE,aAAa,UACb,aAAa,aACb,aAAa,WACb,aAAa,aACb;AACA,UAAM,WAAW,MAAM;AACvB,QAAI,UAAU;AACZ,aAAO,GAAG,QAAQ,IAAI,QAAQ;AAAA,IAChC;AAAA,EACF;AAEA,SAAO;AACT;AAOO,MAAM,mBAAmC;AAAA,EAC9C,MAAM;AAAA,EACN,aAAa;AAAA,EACb,UAAU;AAAA;AAAA,EAEV,MAAM,SAA8C;AAClD,UAAM,WAAW,QAAQ,KAAK;AAG9B,QAAI,qBAAqB,IAAI,QAAQ,GAAG;AACtC,aAAO,EAAE,SAAS,KAAK;AAAA,IACzB;AAGA,QAAI,QAAQ,KAAK,oBAAoB,CAAC,QAAQ,KAAK,iBAAiB,GAAG;AACrE,aAAO,EAAE,SAAS,KAAK;AAAA,IACzB;AAGA,UAAM,gBAAgB,iBAAiB,UAAU,QAAQ,OAAO,IAAI;AAGpE,QAAI,QAAQ,aAAa,SAAS,QAAQ,GAAG;AAC3C,aAAO,EAAE,SAAS,KAAK;AAAA,IACzB;AAEA,QAAI,QAAQ,aAAa,SAAS,aAAa,GAAG;AAChD,aAAO,EAAE,SAAS,KAAK;AAAA,IACzB;AAGA,WAAO;AAAA,MACL,SAAS;AAAA;AAAA,MACT,YAAY;AAAA,MACZ;AAAA,MACA,SAAS,yBAAyB,QAAQ;AAAA,IAC5C;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }