@within-7/minto 0.2.0 → 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 (254) hide show
  1. package/dist/commands/agents/AgentsCommand.js +22 -24
  2. package/dist/commands/agents/AgentsCommand.js.map +2 -2
  3. package/dist/commands/context.js +2 -1
  4. package/dist/commands/context.js.map +2 -2
  5. package/dist/commands/export.js +2 -1
  6. package/dist/commands/export.js.map +2 -2
  7. package/dist/commands/mcp-interactive.js +7 -6
  8. package/dist/commands/mcp-interactive.js.map +2 -2
  9. package/dist/commands/model.js +3 -2
  10. package/dist/commands/model.js.map +2 -2
  11. package/dist/commands/permissions.js +4 -3
  12. package/dist/commands/permissions.js.map +2 -2
  13. package/dist/commands/plugin/AddMarketplaceForm.js +3 -2
  14. package/dist/commands/plugin/AddMarketplaceForm.js.map +2 -2
  15. package/dist/commands/plugin/ConfirmDialog.js +2 -1
  16. package/dist/commands/plugin/ConfirmDialog.js.map +2 -2
  17. package/dist/commands/plugin/ErrorView.js +2 -1
  18. package/dist/commands/plugin/ErrorView.js.map +2 -2
  19. package/dist/commands/plugin/InstalledPluginsByMarketplace.js +5 -4
  20. package/dist/commands/plugin/InstalledPluginsByMarketplace.js.map +2 -2
  21. package/dist/commands/plugin/InstalledPluginsManager.js +5 -4
  22. package/dist/commands/plugin/InstalledPluginsManager.js.map +2 -2
  23. package/dist/commands/plugin/MainMenu.js +2 -1
  24. package/dist/commands/plugin/MainMenu.js.map +2 -2
  25. package/dist/commands/plugin/MarketplaceManager.js +5 -4
  26. package/dist/commands/plugin/MarketplaceManager.js.map +2 -2
  27. package/dist/commands/plugin/MarketplaceSelector.js +4 -3
  28. package/dist/commands/plugin/MarketplaceSelector.js.map +2 -2
  29. package/dist/commands/plugin/PlaceholderScreen.js +3 -2
  30. package/dist/commands/plugin/PlaceholderScreen.js.map +2 -2
  31. package/dist/commands/plugin/PluginBrowser.js +6 -5
  32. package/dist/commands/plugin/PluginBrowser.js.map +2 -2
  33. package/dist/commands/plugin/PluginDetailsInstall.js +5 -4
  34. package/dist/commands/plugin/PluginDetailsInstall.js.map +2 -2
  35. package/dist/commands/plugin/PluginDetailsManage.js +4 -3
  36. package/dist/commands/plugin/PluginDetailsManage.js.map +2 -2
  37. package/dist/commands/plugin.js +16 -15
  38. package/dist/commands/plugin.js.map +2 -2
  39. package/dist/commands/sandbox.js +4 -3
  40. package/dist/commands/sandbox.js.map +2 -2
  41. package/dist/commands/setup.js +2 -1
  42. package/dist/commands/setup.js.map +2 -2
  43. package/dist/commands/status.js +2 -1
  44. package/dist/commands/status.js.map +2 -2
  45. package/dist/commands/undo.js +245 -0
  46. package/dist/commands/undo.js.map +7 -0
  47. package/dist/commands.js +2 -0
  48. package/dist/commands.js.map +2 -2
  49. package/dist/components/AgentThinkingBlock.js +1 -1
  50. package/dist/components/AgentThinkingBlock.js.map +2 -2
  51. package/dist/components/AsciiLogo.js +7 -8
  52. package/dist/components/AsciiLogo.js.map +2 -2
  53. package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js +3 -2
  54. package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js.map +2 -2
  55. package/dist/components/AskUserQuestionDialog/QuestionView.js +2 -1
  56. package/dist/components/AskUserQuestionDialog/QuestionView.js.map +2 -2
  57. package/dist/components/CollapsibleHint.js +2 -1
  58. package/dist/components/CollapsibleHint.js.map +2 -2
  59. package/dist/components/Config.js +3 -2
  60. package/dist/components/Config.js.map +2 -2
  61. package/dist/components/ConsoleOAuthFlow.js +2 -1
  62. package/dist/components/ConsoleOAuthFlow.js.map +2 -2
  63. package/dist/components/Cost.js +2 -1
  64. package/dist/components/Cost.js.map +2 -2
  65. package/dist/components/HeaderBar.js +13 -8
  66. package/dist/components/HeaderBar.js.map +2 -2
  67. package/dist/components/HistorySearchOverlay.js +4 -3
  68. package/dist/components/HistorySearchOverlay.js.map +2 -2
  69. package/dist/components/HotkeyHelpPanel.js +8 -11
  70. package/dist/components/HotkeyHelpPanel.js.map +2 -2
  71. package/dist/components/InvalidConfigDialog.js +2 -1
  72. package/dist/components/InvalidConfigDialog.js.map +2 -2
  73. package/dist/components/Logo.js +23 -67
  74. package/dist/components/Logo.js.map +2 -2
  75. package/dist/components/MCPServerApprovalDialog.js +2 -1
  76. package/dist/components/MCPServerApprovalDialog.js.map +2 -2
  77. package/dist/components/MCPServerDialogCopy.js +2 -1
  78. package/dist/components/MCPServerDialogCopy.js.map +2 -2
  79. package/dist/components/MCPServerMultiselectDialog.js +2 -1
  80. package/dist/components/MCPServerMultiselectDialog.js.map +2 -2
  81. package/dist/components/MessageSelector.js +4 -3
  82. package/dist/components/MessageSelector.js.map +2 -2
  83. package/dist/components/ModeIndicator.js +2 -1
  84. package/dist/components/ModeIndicator.js.map +2 -2
  85. package/dist/components/ModelConfig.js +4 -3
  86. package/dist/components/ModelConfig.js.map +2 -2
  87. package/dist/components/ModelListManager.js +4 -3
  88. package/dist/components/ModelListManager.js.map +2 -2
  89. package/dist/components/ModelSelector/ModelSelector.js +26 -13
  90. package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
  91. package/dist/components/Onboarding.js +3 -2
  92. package/dist/components/Onboarding.js.map +2 -2
  93. package/dist/components/OperationSummary.js +130 -0
  94. package/dist/components/OperationSummary.js.map +7 -0
  95. package/dist/components/PromptInput.js +88 -75
  96. package/dist/components/PromptInput.js.map +2 -2
  97. package/dist/components/SensitiveFileWarning.js +31 -0
  98. package/dist/components/SensitiveFileWarning.js.map +7 -0
  99. package/dist/components/Spinner.js +71 -22
  100. package/dist/components/Spinner.js.map +2 -2
  101. package/dist/components/StructuredDiff.js +6 -8
  102. package/dist/components/StructuredDiff.js.map +2 -2
  103. package/dist/components/SubagentBlock.js +4 -2
  104. package/dist/components/SubagentBlock.js.map +2 -2
  105. package/dist/components/SubagentProgress.js +7 -4
  106. package/dist/components/SubagentProgress.js.map +2 -2
  107. package/dist/components/TaskCard.js +14 -11
  108. package/dist/components/TaskCard.js.map +2 -2
  109. package/dist/components/TextInput.js +9 -1
  110. package/dist/components/TextInput.js.map +2 -2
  111. package/dist/components/TodoPanel.js +44 -26
  112. package/dist/components/TodoPanel.js.map +2 -2
  113. package/dist/components/ToolUseLoader.js +2 -2
  114. package/dist/components/ToolUseLoader.js.map +2 -2
  115. package/dist/components/TreeConnector.js +4 -3
  116. package/dist/components/TreeConnector.js.map +2 -2
  117. package/dist/components/TrustDialog.js +2 -1
  118. package/dist/components/TrustDialog.js.map +2 -2
  119. package/dist/components/binary-feedback/BinaryFeedbackView.js +2 -1
  120. package/dist/components/binary-feedback/BinaryFeedbackView.js.map +2 -2
  121. package/dist/components/messages/AssistantTextMessage.js +17 -9
  122. package/dist/components/messages/AssistantTextMessage.js.map +2 -2
  123. package/dist/components/messages/AssistantToolUseMessage.js +8 -4
  124. package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
  125. package/dist/components/messages/GroupRenderer.js +2 -1
  126. package/dist/components/messages/GroupRenderer.js.map +2 -2
  127. package/dist/components/messages/NestedTasksPreview.js +13 -1
  128. package/dist/components/messages/NestedTasksPreview.js.map +2 -2
  129. package/dist/components/messages/ParallelTasksGroupView.js +4 -3
  130. package/dist/components/messages/ParallelTasksGroupView.js.map +2 -2
  131. package/dist/components/messages/TaskInModuleView.js +35 -15
  132. package/dist/components/messages/TaskInModuleView.js.map +2 -2
  133. package/dist/components/messages/TaskOutputContent.js +9 -6
  134. package/dist/components/messages/TaskOutputContent.js.map +2 -2
  135. package/dist/components/messages/UserPromptMessage.js +2 -2
  136. package/dist/components/messages/UserPromptMessage.js.map +2 -2
  137. package/dist/constants/colors.js +90 -72
  138. package/dist/constants/colors.js.map +2 -2
  139. package/dist/constants/toolInputExamples.js +84 -0
  140. package/dist/constants/toolInputExamples.js.map +7 -0
  141. package/dist/core/backupManager.js +321 -0
  142. package/dist/core/backupManager.js.map +7 -0
  143. package/dist/core/costTracker.js +9 -18
  144. package/dist/core/costTracker.js.map +2 -2
  145. package/dist/core/gitAutoCommit.js +287 -0
  146. package/dist/core/gitAutoCommit.js.map +7 -0
  147. package/dist/core/index.js +3 -0
  148. package/dist/core/index.js.map +2 -2
  149. package/dist/core/operationTracker.js +212 -0
  150. package/dist/core/operationTracker.js.map +7 -0
  151. package/dist/core/permissions/rules/allowedToolsRule.js +1 -1
  152. package/dist/core/permissions/rules/allowedToolsRule.js.map +2 -2
  153. package/dist/core/permissions/rules/autoEscalationRule.js +5 -0
  154. package/dist/core/permissions/rules/autoEscalationRule.js.map +2 -2
  155. package/dist/core/permissions/rules/projectBoundaryRule.js +5 -0
  156. package/dist/core/permissions/rules/projectBoundaryRule.js.map +2 -2
  157. package/dist/core/permissions/rules/sensitivePathsRule.js +5 -0
  158. package/dist/core/permissions/rules/sensitivePathsRule.js.map +2 -2
  159. package/dist/core/tokenStats.js +9 -0
  160. package/dist/core/tokenStats.js.map +7 -0
  161. package/dist/core/tokenStatsManager.js +331 -0
  162. package/dist/core/tokenStatsManager.js.map +7 -0
  163. package/dist/entrypoints/cli.js +115 -87
  164. package/dist/entrypoints/cli.js.map +2 -2
  165. package/dist/hooks/useAgentTokenStats.js +72 -0
  166. package/dist/hooks/useAgentTokenStats.js.map +7 -0
  167. package/dist/hooks/useAgentTranscripts.js +30 -6
  168. package/dist/hooks/useAgentTranscripts.js.map +2 -2
  169. package/dist/hooks/useLogMessages.js +12 -1
  170. package/dist/hooks/useLogMessages.js.map +2 -2
  171. package/dist/i18n/locales/en.js +6 -5
  172. package/dist/i18n/locales/en.js.map +2 -2
  173. package/dist/i18n/locales/zh-CN.js +6 -5
  174. package/dist/i18n/locales/zh-CN.js.map +2 -2
  175. package/dist/i18n/types.js.map +1 -1
  176. package/dist/permissions.js +28 -1
  177. package/dist/permissions.js.map +2 -2
  178. package/dist/query.js +78 -4
  179. package/dist/query.js.map +3 -3
  180. package/dist/screens/REPL.js +23 -3
  181. package/dist/screens/REPL.js.map +2 -2
  182. package/dist/services/claude.js +54 -3
  183. package/dist/services/claude.js.map +2 -2
  184. package/dist/services/intelligentCompactor.js +1 -1
  185. package/dist/services/intelligentCompactor.js.map +2 -2
  186. package/dist/services/mcpClient.js +81 -25
  187. package/dist/services/mcpClient.js.map +2 -2
  188. package/dist/services/sandbox/filesystemBoundary.js +58 -17
  189. package/dist/services/sandbox/filesystemBoundary.js.map +2 -2
  190. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +3 -2
  191. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
  192. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js +2 -1
  193. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +2 -2
  194. package/dist/tools/BashTool/BashTool.js +22 -3
  195. package/dist/tools/BashTool/BashTool.js.map +2 -2
  196. package/dist/tools/BashTool/prompt.js +178 -34
  197. package/dist/tools/BashTool/prompt.js.map +2 -2
  198. package/dist/tools/FileEditTool/prompt.js +6 -3
  199. package/dist/tools/FileEditTool/prompt.js.map +2 -2
  200. package/dist/tools/FileWriteTool/prompt.js +4 -2
  201. package/dist/tools/FileWriteTool/prompt.js.map +2 -2
  202. package/dist/tools/MultiEditTool/prompt.js +5 -3
  203. package/dist/tools/MultiEditTool/prompt.js.map +2 -2
  204. package/dist/tools/NotebookEditTool/NotebookEditTool.js +2 -1
  205. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
  206. package/dist/tools/PlanModeTool/EnterPlanModeTool.js +3 -2
  207. package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +2 -2
  208. package/dist/tools/PlanModeTool/ExitPlanModeTool.js +3 -2
  209. package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +2 -2
  210. package/dist/tools/PlanModeTool/prompt.js +1 -1
  211. package/dist/tools/PlanModeTool/prompt.js.map +1 -1
  212. package/dist/tools/SkillTool/SkillTool.js +4 -3
  213. package/dist/tools/SkillTool/SkillTool.js.map +2 -2
  214. package/dist/tools/SkillTool/prompt.js +1 -1
  215. package/dist/tools/SkillTool/prompt.js.map +1 -1
  216. package/dist/tools/TaskOutputTool/TaskOutputTool.js +3 -2
  217. package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +2 -2
  218. package/dist/tools/TaskTool/TaskTool.js +8 -0
  219. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  220. package/dist/utils/CircuitBreaker.js +242 -0
  221. package/dist/utils/CircuitBreaker.js.map +7 -0
  222. package/dist/utils/ask.js +2 -0
  223. package/dist/utils/ask.js.map +2 -2
  224. package/dist/utils/config.js +47 -5
  225. package/dist/utils/config.js.map +2 -2
  226. package/dist/utils/credentials/CredentialStore.js +1 -0
  227. package/dist/utils/credentials/CredentialStore.js.map +7 -0
  228. package/dist/utils/credentials/EncryptedFileStore.js +157 -0
  229. package/dist/utils/credentials/EncryptedFileStore.js.map +7 -0
  230. package/dist/utils/credentials/index.js +37 -0
  231. package/dist/utils/credentials/index.js.map +7 -0
  232. package/dist/utils/credentials/migration.js +82 -0
  233. package/dist/utils/credentials/migration.js.map +7 -0
  234. package/dist/utils/markdown.js +13 -1
  235. package/dist/utils/markdown.js.map +2 -2
  236. package/dist/utils/permissions/filesystem.js +5 -1
  237. package/dist/utils/permissions/filesystem.js.map +2 -2
  238. package/dist/utils/safePath.js +132 -0
  239. package/dist/utils/safePath.js.map +7 -0
  240. package/dist/utils/sensitiveFiles.js +125 -0
  241. package/dist/utils/sensitiveFiles.js.map +7 -0
  242. package/dist/utils/taskDisplayUtils.js +9 -9
  243. package/dist/utils/taskDisplayUtils.js.map +2 -2
  244. package/dist/utils/theme.js +6 -6
  245. package/dist/utils/theme.js.map +1 -1
  246. package/dist/utils/toolRiskClassification.js +207 -0
  247. package/dist/utils/toolRiskClassification.js.map +7 -0
  248. package/dist/utils/tooling/safeRender.js +5 -4
  249. package/dist/utils/tooling/safeRender.js.map +2 -2
  250. package/dist/version.js +2 -2
  251. package/dist/version.js.map +1 -1
  252. package/package.json +9 -7
  253. package/dist/hooks/useCancelRequest.js +0 -31
  254. package/dist/hooks/useCancelRequest.js.map +0 -7
@@ -1,7 +1,7 @@
1
1
  import { getGlobalConfig } from "./config.js";
2
2
  const lightTheme = {
3
3
  bashBorder: "#FF6E57",
4
- minto: "#FFC233",
4
+ minto: "#B668C8",
5
5
  noting: "#222222",
6
6
  permission: "#e9c61aff",
7
7
  secondaryBorder: "#999",
@@ -19,7 +19,7 @@ const lightTheme = {
19
19
  addedDimmed: "#c7e1cb",
20
20
  removedDimmed: "#fdd2d8"
21
21
  },
22
- brand: "#D4BBFF",
22
+ brand: "#667EEA",
23
23
  dimmedText: "#888",
24
24
  mutedText: "#999",
25
25
  secondaryTextNew: "#666",
@@ -30,7 +30,7 @@ const lightTheme = {
30
30
  };
31
31
  const lightDaltonizedTheme = {
32
32
  bashBorder: "#FF6E57",
33
- minto: "#FFC233",
33
+ minto: "#B668C8",
34
34
  noting: "#222222",
35
35
  permission: "#3366ff",
36
36
  secondaryBorder: "#999",
@@ -59,7 +59,7 @@ const lightDaltonizedTheme = {
59
59
  };
60
60
  const darkTheme = {
61
61
  bashBorder: "#FF6E57",
62
- minto: "#FFC233",
62
+ minto: "#B668C8",
63
63
  noting: "#222222",
64
64
  permission: "#b1b9f9",
65
65
  secondaryBorder: "#888",
@@ -77,7 +77,7 @@ const darkTheme = {
77
77
  addedDimmed: "#47584a",
78
78
  removedDimmed: "#69484d"
79
79
  },
80
- brand: "#D4BBFF",
80
+ brand: "#667EEA",
81
81
  dimmedText: "#666",
82
82
  mutedText: "#555",
83
83
  secondaryTextNew: "#999",
@@ -88,7 +88,7 @@ const darkTheme = {
88
88
  };
89
89
  const darkDaltonizedTheme = {
90
90
  bashBorder: "#FF6E57",
91
- minto: "#FFC233",
91
+ minto: "#B668C8",
92
92
  noting: "#222222",
93
93
  permission: "#99ccff",
94
94
  secondaryBorder: "#888",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/theme.ts"],
4
- "sourcesContent": ["import { getGlobalConfig } from './config'\n\nexport interface Theme {\n bashBorder: string\n minto: string\n noting: string\n permission: string\n secondaryBorder: string\n text: string\n secondaryText: string\n suggestion: string\n success: string\n error: string\n warning: string\n primary: string\n secondary: string\n diff: {\n added: string\n removed: string\n addedDimmed: string\n removedDimmed: string\n }\n // Additional color properties used in components\n brand: string\n dimmedText: string\n mutedText: string\n secondaryTextNew: string\n selectionBg: string\n info: string\n dim: string\n primaryText: string\n}\n\nconst lightTheme: Theme = {\n bashBorder: '#FF6E57',\n minto: '#FFC233',\n noting: '#222222',\n permission: '#e9c61aff',\n secondaryBorder: '#999',\n text: '#000',\n secondaryText: '#666',\n suggestion: '#32e98aff',\n success: '#2c7a39',\n error: '#ab2b3f',\n warning: '#966c1e',\n primary: '#000',\n secondary: '#666',\n diff: {\n added: '#69db7c',\n removed: '#ffa8b4',\n addedDimmed: '#c7e1cb',\n removedDimmed: '#fdd2d8',\n },\n brand: '#D4BBFF',\n dimmedText: '#888',\n mutedText: '#999',\n secondaryTextNew: '#666',\n selectionBg: '#3C3C3C',\n info: '#3399ff',\n dim: '#aaa',\n primaryText: '#000',\n}\n\nconst lightDaltonizedTheme: Theme = {\n bashBorder: '#FF6E57',\n minto: '#FFC233',\n noting: '#222222',\n permission: '#3366ff',\n secondaryBorder: '#999',\n text: '#000',\n secondaryText: '#666',\n suggestion: '#3366ff',\n success: '#006699',\n error: '#cc0000',\n warning: '#ff9900',\n primary: '#000',\n secondary: '#666',\n diff: {\n added: '#99ccff',\n removed: '#ffcccc',\n addedDimmed: '#d1e7fd',\n removedDimmed: '#ffe9e9',\n },\n brand: '#3366ff',\n dimmedText: '#888',\n mutedText: '#999',\n secondaryTextNew: '#666',\n selectionBg: '#3C3C3C',\n info: '#3366ff',\n dim: '#aaa',\n primaryText: '#000',\n}\n\nconst darkTheme: Theme = {\n bashBorder: '#FF6E57',\n minto: '#FFC233',\n noting: '#222222',\n permission: '#b1b9f9',\n secondaryBorder: '#888',\n text: '#fff',\n secondaryText: '#999',\n suggestion: '#b1b9f9',\n success: '#4eba65',\n error: '#ff6b80',\n warning: '#ffc107',\n primary: '#fff',\n secondary: '#999',\n diff: {\n added: '#225c2b',\n removed: '#7a2936',\n addedDimmed: '#47584a',\n removedDimmed: '#69484d',\n },\n brand: '#D4BBFF',\n dimmedText: '#666',\n mutedText: '#555',\n secondaryTextNew: '#999',\n selectionBg: '#3C3C3C',\n info: '#5DADE2',\n dim: '#444',\n primaryText: '#fff',\n}\n\nconst darkDaltonizedTheme: Theme = {\n bashBorder: '#FF6E57',\n minto: '#FFC233',\n noting: '#222222',\n permission: '#99ccff',\n secondaryBorder: '#888',\n text: '#fff',\n secondaryText: '#999',\n suggestion: '#99ccff',\n success: '#3399ff',\n error: '#ff6666',\n warning: '#ffcc00',\n primary: '#fff',\n secondary: '#999',\n diff: {\n added: '#004466',\n removed: '#660000',\n addedDimmed: '#3e515b',\n removedDimmed: '#3e2c2c',\n },\n brand: '#99ccff',\n dimmedText: '#666',\n mutedText: '#555',\n secondaryTextNew: '#999',\n selectionBg: '#3C3C3C',\n info: '#99ccff',\n dim: '#444',\n primaryText: '#fff',\n}\n\nexport type ThemeNames =\n | 'dark'\n | 'light'\n | 'light-daltonized'\n | 'dark-daltonized'\n\nexport function getTheme(overrideTheme?: ThemeNames): Theme {\n const config = getGlobalConfig()\n switch (overrideTheme ?? config.theme) {\n case 'light':\n return lightTheme\n case 'light-daltonized':\n return lightDaltonizedTheme\n case 'dark-daltonized':\n return darkDaltonizedTheme\n default:\n return darkTheme\n }\n}\n"],
4
+ "sourcesContent": ["import { getGlobalConfig } from './config'\n\nexport interface Theme {\n bashBorder: string\n minto: string\n noting: string\n permission: string\n secondaryBorder: string\n text: string\n secondaryText: string\n suggestion: string\n success: string\n error: string\n warning: string\n primary: string\n secondary: string\n diff: {\n added: string\n removed: string\n addedDimmed: string\n removedDimmed: string\n }\n // Additional color properties used in components\n brand: string\n dimmedText: string\n mutedText: string\n secondaryTextNew: string\n selectionBg: string\n info: string\n dim: string\n primaryText: string\n}\n\nconst lightTheme: Theme = {\n bashBorder: '#FF6E57',\n minto: '#B668C8',\n noting: '#222222',\n permission: '#e9c61aff',\n secondaryBorder: '#999',\n text: '#000',\n secondaryText: '#666',\n suggestion: '#32e98aff',\n success: '#2c7a39',\n error: '#ab2b3f',\n warning: '#966c1e',\n primary: '#000',\n secondary: '#666',\n diff: {\n added: '#69db7c',\n removed: '#ffa8b4',\n addedDimmed: '#c7e1cb',\n removedDimmed: '#fdd2d8',\n },\n brand: '#667EEA',\n dimmedText: '#888',\n mutedText: '#999',\n secondaryTextNew: '#666',\n selectionBg: '#3C3C3C',\n info: '#3399ff',\n dim: '#aaa',\n primaryText: '#000',\n}\n\nconst lightDaltonizedTheme: Theme = {\n bashBorder: '#FF6E57',\n minto: '#B668C8',\n noting: '#222222',\n permission: '#3366ff',\n secondaryBorder: '#999',\n text: '#000',\n secondaryText: '#666',\n suggestion: '#3366ff',\n success: '#006699',\n error: '#cc0000',\n warning: '#ff9900',\n primary: '#000',\n secondary: '#666',\n diff: {\n added: '#99ccff',\n removed: '#ffcccc',\n addedDimmed: '#d1e7fd',\n removedDimmed: '#ffe9e9',\n },\n brand: '#3366ff',\n dimmedText: '#888',\n mutedText: '#999',\n secondaryTextNew: '#666',\n selectionBg: '#3C3C3C',\n info: '#3366ff',\n dim: '#aaa',\n primaryText: '#000',\n}\n\nconst darkTheme: Theme = {\n bashBorder: '#FF6E57',\n minto: '#B668C8',\n noting: '#222222',\n permission: '#b1b9f9',\n secondaryBorder: '#888',\n text: '#fff',\n secondaryText: '#999',\n suggestion: '#b1b9f9',\n success: '#4eba65',\n error: '#ff6b80',\n warning: '#ffc107',\n primary: '#fff',\n secondary: '#999',\n diff: {\n added: '#225c2b',\n removed: '#7a2936',\n addedDimmed: '#47584a',\n removedDimmed: '#69484d',\n },\n brand: '#667EEA',\n dimmedText: '#666',\n mutedText: '#555',\n secondaryTextNew: '#999',\n selectionBg: '#3C3C3C',\n info: '#5DADE2',\n dim: '#444',\n primaryText: '#fff',\n}\n\nconst darkDaltonizedTheme: Theme = {\n bashBorder: '#FF6E57',\n minto: '#B668C8',\n noting: '#222222',\n permission: '#99ccff',\n secondaryBorder: '#888',\n text: '#fff',\n secondaryText: '#999',\n suggestion: '#99ccff',\n success: '#3399ff',\n error: '#ff6666',\n warning: '#ffcc00',\n primary: '#fff',\n secondary: '#999',\n diff: {\n added: '#004466',\n removed: '#660000',\n addedDimmed: '#3e515b',\n removedDimmed: '#3e2c2c',\n },\n brand: '#99ccff',\n dimmedText: '#666',\n mutedText: '#555',\n secondaryTextNew: '#999',\n selectionBg: '#3C3C3C',\n info: '#99ccff',\n dim: '#444',\n primaryText: '#fff',\n}\n\nexport type ThemeNames =\n | 'dark'\n | 'light'\n | 'light-daltonized'\n | 'dark-daltonized'\n\nexport function getTheme(overrideTheme?: ThemeNames): Theme {\n const config = getGlobalConfig()\n switch (overrideTheme ?? config.theme) {\n case 'light':\n return lightTheme\n case 'light-daltonized':\n return lightDaltonizedTheme\n case 'dark-daltonized':\n return darkDaltonizedTheme\n default:\n return darkTheme\n }\n}\n"],
5
5
  "mappings": "AAAA,SAAS,uBAAuB;AAiChC,MAAM,aAAoB;AAAA,EACxB,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,MAAM;AAAA,EACN,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AAAA,EACT,WAAW;AAAA,EACX,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,eAAe;AAAA,EACjB;AAAA,EACA,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,MAAM;AAAA,EACN,KAAK;AAAA,EACL,aAAa;AACf;AAEA,MAAM,uBAA8B;AAAA,EAClC,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,MAAM;AAAA,EACN,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AAAA,EACT,WAAW;AAAA,EACX,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,eAAe;AAAA,EACjB;AAAA,EACA,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,MAAM;AAAA,EACN,KAAK;AAAA,EACL,aAAa;AACf;AAEA,MAAM,YAAmB;AAAA,EACvB,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,MAAM;AAAA,EACN,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AAAA,EACT,WAAW;AAAA,EACX,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,eAAe;AAAA,EACjB;AAAA,EACA,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,MAAM;AAAA,EACN,KAAK;AAAA,EACL,aAAa;AACf;AAEA,MAAM,sBAA6B;AAAA,EACjC,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,MAAM;AAAA,EACN,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AAAA,EACT,WAAW;AAAA,EACX,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,eAAe;AAAA,EACjB;AAAA,EACA,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,MAAM;AAAA,EACN,KAAK;AAAA,EACL,aAAa;AACf;AAQO,SAAS,SAAS,eAAmC;AAC1D,QAAM,SAAS,gBAAgB;AAC/B,UAAQ,iBAAiB,OAAO,OAAO;AAAA,IACrC,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,207 @@
1
+ const TOOL_RISK_LEVELS = {
2
+ // 🟢 Safe layer: Read-only, no side effects
3
+ Read: "safe",
4
+ Glob: "safe",
5
+ Grep: "safe",
6
+ LS: "safe",
7
+ WebSearch: "safe",
8
+ WebFetch: "safe",
9
+ Think: "safe",
10
+ AskUserQuestion: "safe",
11
+ MemoryRead: "safe",
12
+ NotebookRead: "safe",
13
+ TaskOutput: "safe",
14
+ EnterPlanMode: "safe",
15
+ ExitPlanMode: "safe",
16
+ TaskList: "safe",
17
+ TaskGet: "safe",
18
+ Skill: "safe",
19
+ // 🟡 Monitored layer: Has side effects but reversible/low risk
20
+ Edit: "monitored",
21
+ Write: "monitored",
22
+ NotebookEdit: "monitored",
23
+ MemoryWrite: "monitored",
24
+ TodoWrite: "monitored",
25
+ Task: "monitored",
26
+ TaskCreate: "monitored",
27
+ TaskUpdate: "monitored",
28
+ TaskStop: "monitored",
29
+ // 🔴 Dangerous layer: Requires confirmation (Bash handled separately)
30
+ Bash: "dangerous",
31
+ MCPTool: "dangerous"
32
+ };
33
+ const SAFE_BASH_PATTERNS = [
34
+ // Git - all common operations
35
+ /^git\s+(status|diff|log|branch|show|remote|fetch|pull|push|commit|add|checkout|merge|rebase|stash|tag|clone|init|config|rev-parse|symbolic-ref)/i,
36
+ // File viewing (read-only)
37
+ /^ls(\s|$)/i,
38
+ /^cat\s/i,
39
+ /^head\s/i,
40
+ /^tail\s/i,
41
+ /^pwd$/i,
42
+ /^echo\s/i,
43
+ /^which\s/i,
44
+ /^tree(\s|$)/i,
45
+ /^date$/i,
46
+ /^whoami$/i,
47
+ /^find\s/i,
48
+ /^wc\s/i,
49
+ /^grep\s/i,
50
+ /^rg\s/i,
51
+ /^less\s/i,
52
+ /^more\s/i,
53
+ /^file\s/i,
54
+ /^stat\s/i,
55
+ /^du\s/i,
56
+ /^df\s/i,
57
+ // Package managers - common development operations
58
+ /^npm\s+(install|i|ci|run|test|start|build|list|ls|outdated|view|info|init|publish|pack|version|audit|dedupe)/i,
59
+ /^npx\s/i,
60
+ /^bun\s+(install|i|add|remove|run|test|build|pm|create|init|link|unlink|update|outdated)/i,
61
+ /^bunx\s/i,
62
+ /^yarn\s+(install|add|remove|run|test|build|init|create|link|unlink|upgrade|outdated)/i,
63
+ /^pnpm\s+(install|i|add|remove|run|test|build|init|create|link|unlink|update|outdated)/i,
64
+ /^pip\s+(install|list|show|freeze|check)/i,
65
+ /^pip3\s+(install|list|show|freeze|check)/i,
66
+ /^poetry\s+(install|add|remove|run|build|init|check|show)/i,
67
+ /^cargo\s+(build|run|test|check|clippy|fmt|doc|bench|new|init|add|remove)/i,
68
+ /^go\s+(build|run|test|get|mod|fmt|vet|generate)/i,
69
+ /^composer\s+(install|require|remove|update|dump-autoload)/i,
70
+ /^gem\s+(install|list|update)/i,
71
+ /^bundle\s+(install|exec|update)/i,
72
+ // Version queries
73
+ /^(node|npm|bun|yarn|pnpm|python|python3|pip|pip3|cargo|rustc|go|java|ruby|php)\s+(--version|-v|-V)$/i,
74
+ /^(node|npm|bun|yarn|pnpm|python|python3|pip|pip3|cargo|rustc|go|java|ruby|php)\s+-version$/i,
75
+ // Build and test tools
76
+ /^make(\s|$)/i,
77
+ /^cmake\s/i,
78
+ /^ninja(\s|$)/i,
79
+ /^pytest(\s|$)/i,
80
+ /^jest(\s|$)/i,
81
+ /^vitest(\s|$)/i,
82
+ /^mocha(\s|$)/i,
83
+ /^ava(\s|$)/i,
84
+ /^tape(\s|$)/i,
85
+ /^tap(\s|$)/i,
86
+ /^tsc(\s|$)/i,
87
+ /^eslint(\s|$)/i,
88
+ /^prettier(\s|$)/i,
89
+ /^biome(\s|$)/i,
90
+ // Docker (read-only and common operations)
91
+ /^docker\s+(ps|images|logs|inspect|version|info|stats|top|port|diff)/i,
92
+ /^docker\s+(build|run|exec|pull|push|start|stop|restart)/i,
93
+ /^docker-compose\s+(ps|logs|config|up|down|build|pull|restart)/i,
94
+ // Kubernetes (read-only)
95
+ /^kubectl\s+(get|describe|logs|explain|version|config|cluster-info)/i,
96
+ // Environment and shell
97
+ /^env$/i,
98
+ /^printenv/i,
99
+ /^export\s/i,
100
+ /^source\s/i,
101
+ /^\.\s/i,
102
+ // Process viewing
103
+ /^ps(\s|$)/i,
104
+ /^top$/i,
105
+ /^htop$/i,
106
+ // Network diagnostics (read-only)
107
+ /^ping\s/i,
108
+ /^traceroute\s/i,
109
+ /^dig\s/i,
110
+ /^nslookup\s/i,
111
+ /^host\s/i,
112
+ /^ifconfig$/i,
113
+ /^ip\s+(addr|link|route)/i,
114
+ // Archive viewing
115
+ /^tar\s+(-t|--list)/i,
116
+ /^unzip\s+-l/i,
117
+ /^zipinfo\s/i,
118
+ // Text processing
119
+ /^sort(\s|$)/i,
120
+ /^uniq(\s|$)/i,
121
+ /^cut(\s|$)/i,
122
+ /^awk\s/i,
123
+ /^sed\s/i,
124
+ /^tr\s/i,
125
+ /^diff\s/i,
126
+ /^md5sum\s/i,
127
+ /^sha256sum\s/i,
128
+ // Directory operations (safe)
129
+ /^mkdir\s/i,
130
+ /^touch\s/i,
131
+ /^cp\s/i,
132
+ /^mv\s/i
133
+ ];
134
+ const DANGEROUS_BASH_PATTERNS = [
135
+ // File deletion
136
+ /\brm\s/i,
137
+ /\brmdir\s/i,
138
+ /\bunlink\s/i,
139
+ // Privilege escalation
140
+ /\bsudo\s/i,
141
+ /\bsu\s/i,
142
+ /\bdoas\s/i,
143
+ /\bpkexec\s/i,
144
+ // Permission changes
145
+ /\bchmod\s/i,
146
+ /\bchown\s/i,
147
+ /\bchgrp\s/i,
148
+ // Disk operations
149
+ /\bmkfs\b/i,
150
+ /\bfdisk\s/i,
151
+ /\bparted\s/i,
152
+ /\bdd\s+if=/i,
153
+ /\bshred\s/i,
154
+ // System control
155
+ /\bsystemctl\s/i,
156
+ /\bservice\s/i,
157
+ /\breboot\b/i,
158
+ /\bshutdown\s/i,
159
+ /\bhalt\b/i,
160
+ /\bpoweroff\b/i,
161
+ // Dangerous redirections
162
+ />\s*\/(?!tmp|dev\/null)/i,
163
+ // Redirect to root paths (except /tmp and /dev/null)
164
+ />\s*~\//i,
165
+ // Redirect to home directory paths
166
+ // Shell execution from network
167
+ /\|\s*(bash|sh|zsh|fish)/i,
168
+ /curl.*\|\s*(bash|sh)/i,
169
+ /wget.*\|\s*(bash|sh)/i,
170
+ // Environment destruction
171
+ /\bkillall\s/i,
172
+ /\bpkill\s/i,
173
+ /kill\s+-9/i,
174
+ // Network dangerous
175
+ /\bnc\s+-l/i,
176
+ // netcat listen mode
177
+ /\biptables\s/i,
178
+ /\bufw\s/i,
179
+ // Crontab
180
+ /\bcrontab\s+-r/i,
181
+ // Git destructive
182
+ /\bgit\s+(reset\s+--hard|clean\s+-f|push\s+--force|push\s+-f)/i
183
+ ];
184
+ function classifyBashCommand(command) {
185
+ const normalizedCommand = command.trim().replace(/\s+/g, " ");
186
+ if (DANGEROUS_BASH_PATTERNS.some((p) => p.test(normalizedCommand))) {
187
+ return "dangerous";
188
+ }
189
+ if (SAFE_BASH_PATTERNS.some((p) => p.test(normalizedCommand))) {
190
+ return "safe";
191
+ }
192
+ return "monitored";
193
+ }
194
+ function getToolRiskLevel(toolName, input) {
195
+ if (toolName === "Bash" && input?.command) {
196
+ return classifyBashCommand(input.command);
197
+ }
198
+ return TOOL_RISK_LEVELS[toolName] ?? "dangerous";
199
+ }
200
+ export {
201
+ DANGEROUS_BASH_PATTERNS,
202
+ SAFE_BASH_PATTERNS,
203
+ TOOL_RISK_LEVELS,
204
+ classifyBashCommand,
205
+ getToolRiskLevel
206
+ };
207
+ //# sourceMappingURL=toolRiskClassification.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/toolRiskClassification.ts"],
4
+ "sourcesContent": ["/**\n * Tool Risk Classification System\n *\n * Classifies tools into three risk levels for the Smart Safety Mode:\n * - safe: Read-only operations, no side effects\n * - monitored: Has side effects but reversible/low risk\n * - dangerous: Potentially destructive, requires confirmation\n */\n\nexport type RiskLevel = 'safe' | 'monitored' | 'dangerous'\n\n/**\n * Default risk levels for each tool type\n */\nexport const TOOL_RISK_LEVELS: Record<string, RiskLevel> = {\n // \uD83D\uDFE2 Safe layer: Read-only, no side effects\n Read: 'safe',\n Glob: 'safe',\n Grep: 'safe',\n LS: 'safe',\n WebSearch: 'safe',\n WebFetch: 'safe',\n Think: 'safe',\n AskUserQuestion: 'safe',\n MemoryRead: 'safe',\n NotebookRead: 'safe',\n TaskOutput: 'safe',\n EnterPlanMode: 'safe',\n ExitPlanMode: 'safe',\n TaskList: 'safe',\n TaskGet: 'safe',\n Skill: 'safe',\n\n // \uD83D\uDFE1 Monitored layer: Has side effects but reversible/low risk\n Edit: 'monitored',\n Write: 'monitored',\n NotebookEdit: 'monitored',\n MemoryWrite: 'monitored',\n TodoWrite: 'monitored',\n Task: 'monitored',\n TaskCreate: 'monitored',\n TaskUpdate: 'monitored',\n TaskStop: 'monitored',\n\n // \uD83D\uDD34 Dangerous layer: Requires confirmation (Bash handled separately)\n Bash: 'dangerous',\n MCPTool: 'dangerous',\n}\n\n/**\n * Safe Bash command patterns - automatically allowed even in Smart/Strict mode\n * These patterns match common development commands that are low-risk\n */\nexport const SAFE_BASH_PATTERNS: RegExp[] = [\n // Git - all common operations\n /^git\\s+(status|diff|log|branch|show|remote|fetch|pull|push|commit|add|checkout|merge|rebase|stash|tag|clone|init|config|rev-parse|symbolic-ref)/i,\n\n // File viewing (read-only)\n /^ls(\\s|$)/i,\n /^cat\\s/i,\n /^head\\s/i,\n /^tail\\s/i,\n /^pwd$/i,\n /^echo\\s/i,\n /^which\\s/i,\n /^tree(\\s|$)/i,\n /^date$/i,\n /^whoami$/i,\n /^find\\s/i,\n /^wc\\s/i,\n /^grep\\s/i,\n /^rg\\s/i,\n /^less\\s/i,\n /^more\\s/i,\n /^file\\s/i,\n /^stat\\s/i,\n /^du\\s/i,\n /^df\\s/i,\n\n // Package managers - common development operations\n /^npm\\s+(install|i|ci|run|test|start|build|list|ls|outdated|view|info|init|publish|pack|version|audit|dedupe)/i,\n /^npx\\s/i,\n /^bun\\s+(install|i|add|remove|run|test|build|pm|create|init|link|unlink|update|outdated)/i,\n /^bunx\\s/i,\n /^yarn\\s+(install|add|remove|run|test|build|init|create|link|unlink|upgrade|outdated)/i,\n /^pnpm\\s+(install|i|add|remove|run|test|build|init|create|link|unlink|update|outdated)/i,\n /^pip\\s+(install|list|show|freeze|check)/i,\n /^pip3\\s+(install|list|show|freeze|check)/i,\n /^poetry\\s+(install|add|remove|run|build|init|check|show)/i,\n /^cargo\\s+(build|run|test|check|clippy|fmt|doc|bench|new|init|add|remove)/i,\n /^go\\s+(build|run|test|get|mod|fmt|vet|generate)/i,\n /^composer\\s+(install|require|remove|update|dump-autoload)/i,\n /^gem\\s+(install|list|update)/i,\n /^bundle\\s+(install|exec|update)/i,\n\n // Version queries\n /^(node|npm|bun|yarn|pnpm|python|python3|pip|pip3|cargo|rustc|go|java|ruby|php)\\s+(--version|-v|-V)$/i,\n /^(node|npm|bun|yarn|pnpm|python|python3|pip|pip3|cargo|rustc|go|java|ruby|php)\\s+-version$/i,\n\n // Build and test tools\n /^make(\\s|$)/i,\n /^cmake\\s/i,\n /^ninja(\\s|$)/i,\n /^pytest(\\s|$)/i,\n /^jest(\\s|$)/i,\n /^vitest(\\s|$)/i,\n /^mocha(\\s|$)/i,\n /^ava(\\s|$)/i,\n /^tape(\\s|$)/i,\n /^tap(\\s|$)/i,\n /^tsc(\\s|$)/i,\n /^eslint(\\s|$)/i,\n /^prettier(\\s|$)/i,\n /^biome(\\s|$)/i,\n\n // Docker (read-only and common operations)\n /^docker\\s+(ps|images|logs|inspect|version|info|stats|top|port|diff)/i,\n /^docker\\s+(build|run|exec|pull|push|start|stop|restart)/i,\n /^docker-compose\\s+(ps|logs|config|up|down|build|pull|restart)/i,\n\n // Kubernetes (read-only)\n /^kubectl\\s+(get|describe|logs|explain|version|config|cluster-info)/i,\n\n // Environment and shell\n /^env$/i,\n /^printenv/i,\n /^export\\s/i,\n /^source\\s/i,\n /^\\.\\s/i,\n\n // Process viewing\n /^ps(\\s|$)/i,\n /^top$/i,\n /^htop$/i,\n\n // Network diagnostics (read-only)\n /^ping\\s/i,\n /^traceroute\\s/i,\n /^dig\\s/i,\n /^nslookup\\s/i,\n /^host\\s/i,\n /^ifconfig$/i,\n /^ip\\s+(addr|link|route)/i,\n\n // Archive viewing\n /^tar\\s+(-t|--list)/i,\n /^unzip\\s+-l/i,\n /^zipinfo\\s/i,\n\n // Text processing\n /^sort(\\s|$)/i,\n /^uniq(\\s|$)/i,\n /^cut(\\s|$)/i,\n /^awk\\s/i,\n /^sed\\s/i,\n /^tr\\s/i,\n /^diff\\s/i,\n /^md5sum\\s/i,\n /^sha256sum\\s/i,\n\n // Directory operations (safe)\n /^mkdir\\s/i,\n /^touch\\s/i,\n /^cp\\s/i,\n /^mv\\s/i,\n]\n\n/**\n * Dangerous Bash command patterns - always require confirmation\n * These patterns match potentially destructive commands\n */\nexport const DANGEROUS_BASH_PATTERNS: RegExp[] = [\n // File deletion\n /\\brm\\s/i,\n /\\brmdir\\s/i,\n /\\bunlink\\s/i,\n\n // Privilege escalation\n /\\bsudo\\s/i,\n /\\bsu\\s/i,\n /\\bdoas\\s/i,\n /\\bpkexec\\s/i,\n\n // Permission changes\n /\\bchmod\\s/i,\n /\\bchown\\s/i,\n /\\bchgrp\\s/i,\n\n // Disk operations\n /\\bmkfs\\b/i,\n /\\bfdisk\\s/i,\n /\\bparted\\s/i,\n /\\bdd\\s+if=/i,\n /\\bshred\\s/i,\n\n // System control\n /\\bsystemctl\\s/i,\n /\\bservice\\s/i,\n /\\breboot\\b/i,\n /\\bshutdown\\s/i,\n /\\bhalt\\b/i,\n /\\bpoweroff\\b/i,\n\n // Dangerous redirections\n />\\s*\\/(?!tmp|dev\\/null)/i, // Redirect to root paths (except /tmp and /dev/null)\n />\\s*~\\//i, // Redirect to home directory paths\n\n // Shell execution from network\n /\\|\\s*(bash|sh|zsh|fish)/i,\n /curl.*\\|\\s*(bash|sh)/i,\n /wget.*\\|\\s*(bash|sh)/i,\n\n // Environment destruction\n /\\bkillall\\s/i,\n /\\bpkill\\s/i,\n /kill\\s+-9/i,\n\n // Network dangerous\n /\\bnc\\s+-l/i, // netcat listen mode\n /\\biptables\\s/i,\n /\\bufw\\s/i,\n\n // Crontab\n /\\bcrontab\\s+-r/i,\n\n // Git destructive\n /\\bgit\\s+(reset\\s+--hard|clean\\s+-f|push\\s+--force|push\\s+-f)/i,\n]\n\n/**\n * Classify a Bash command into a risk level\n *\n * @param command The bash command to classify\n * @returns The risk level of the command\n */\nexport function classifyBashCommand(command: string): RiskLevel {\n // Trim and normalize whitespace\n const normalizedCommand = command.trim().replace(/\\s+/g, ' ')\n\n // Check dangerous patterns first (higher priority)\n if (DANGEROUS_BASH_PATTERNS.some(p => p.test(normalizedCommand))) {\n return 'dangerous'\n }\n\n // Check safe patterns\n if (SAFE_BASH_PATTERNS.some(p => p.test(normalizedCommand))) {\n return 'safe'\n }\n\n // Default to monitored (allows in Smart mode, asks in Strict mode)\n return 'monitored'\n}\n\n/**\n * Get the risk level for a tool\n *\n * @param toolName The name of the tool\n * @param input Optional tool input for command-specific classification\n * @returns The risk level of the tool\n */\nexport function getToolRiskLevel(\n toolName: string,\n input?: { command?: string },\n): RiskLevel {\n // Special handling for Bash commands\n if (toolName === 'Bash' && input?.command) {\n return classifyBashCommand(input.command)\n }\n\n // Look up in the static table\n return TOOL_RISK_LEVELS[toolName] ?? 'dangerous'\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,5 +1,6 @@
1
1
  import * as React from "react";
2
2
  import { Box, Text } from "ink";
3
+ import { SEMANTIC_COLORS } from "../../constants/colors.js";
3
4
  function DefaultToolResult({
4
5
  output
5
6
  }) {
@@ -18,14 +19,14 @@ function DefaultToolResult({
18
19
  } else {
19
20
  displayContent = String(output);
20
21
  }
21
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, displayContent));
22
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, displayContent));
22
23
  }
23
24
  function ErrorToolResult({
24
25
  error,
25
26
  toolName
26
27
  }) {
27
28
  const errorMessage = error instanceof Error ? error.message : String(error || "Unknown error");
28
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: "red" }, toolName ? `[${toolName}] ` : "", "Error rendering result:"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, errorMessage));
29
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: "red" }, toolName ? `[${toolName}] ` : "", "Error rendering result:"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, errorMessage));
29
30
  }
30
31
  function safeRenderToolResult(tool, output, options) {
31
32
  if (!tool) {
@@ -46,10 +47,10 @@ function safeRenderToolResult(tool, output, options) {
46
47
  }
47
48
  function safeRenderToolUseMessage(tool, input, options) {
48
49
  if (!tool) {
49
- return /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Unknown tool call"));
50
+ return /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Unknown tool call"));
50
51
  }
51
52
  if (!tool.renderToolUseMessage) {
52
- return /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: "cyan" }, tool.name), options.verbose && /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " ", JSON.stringify(input).slice(0, 100))));
53
+ return /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: "cyan" }, tool.name), options.verbose && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", JSON.stringify(input).slice(0, 100))));
53
54
  }
54
55
  try {
55
56
  const rendered = tool.renderToolUseMessage(input, options);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/utils/tooling/safeRender.tsx"],
4
- "sourcesContent": ["/**\n * Safe Rendering Utilities for Tool Results\n *\n * Provides null-safe wrappers for tool rendering methods to prevent\n * crashes from undefined returns or exceptions.\n *\n * Part of Phase 1.3: Null Guards Completion\n */\n\nimport * as React from 'react'\nimport { Box, Text } from 'ink'\nimport { Tool } from '@tool'\n\n/**\n * Default tool result component when tool doesn't provide a renderer.\n */\nexport function DefaultToolResult({\n output,\n}: {\n output: unknown\n}): React.ReactElement {\n let displayContent: string\n\n if (output === null || output === undefined) {\n displayContent = '(no output)'\n } else if (typeof output === 'string') {\n displayContent = output.length > 500 ? output.slice(0, 500) + '...' : output\n } else if (typeof output === 'object') {\n try {\n const json = JSON.stringify(output, null, 2)\n displayContent = json.length > 500 ? json.slice(0, 500) + '...' : json\n } catch {\n displayContent = '[Object - cannot stringify]'\n }\n } else {\n displayContent = String(output)\n }\n\n return (\n <Box flexDirection=\"column\">\n <Text dimColor>{displayContent}</Text>\n </Box>\n )\n}\n\n/**\n * Error display component for tool rendering failures.\n */\nexport function ErrorToolResult({\n error,\n toolName,\n}: {\n error: unknown\n toolName?: string\n}): React.ReactElement {\n const errorMessage =\n error instanceof Error ? error.message : String(error || 'Unknown error')\n\n return (\n <Box flexDirection=\"column\">\n <Text color=\"red\">\n {toolName ? `[${toolName}] ` : ''}Error rendering result:\n </Text>\n <Text dimColor>{errorMessage}</Text>\n </Box>\n )\n}\n\n/**\n * Safely render a tool result with comprehensive error handling.\n *\n * @param tool - The tool that produced the result\n * @param output - The tool's output data\n * @param options - Rendering options\n * @returns A React node that is guaranteed to be renderable\n */\nexport function safeRenderToolResult(\n tool: Tool | undefined | null,\n output: unknown,\n options: { verbose: boolean },\n): React.ReactNode {\n // No tool provided\n if (!tool) {\n return <DefaultToolResult output={output} />\n }\n\n // Tool doesn't have a renderer\n if (!tool.renderToolResultMessage) {\n return <DefaultToolResult output={output} />\n }\n\n try {\n const rendered = tool.renderToolResultMessage(output, options)\n\n // Handle null/undefined returns\n if (rendered === null || rendered === undefined) {\n return <DefaultToolResult output={output} />\n }\n\n return rendered\n } catch (error) {\n // Catch any rendering errors\n return <ErrorToolResult error={error} toolName={tool.name} />\n }\n}\n\n/**\n * Safely render a tool use message with comprehensive error handling.\n *\n * @param tool - The tool being used\n * @param input - The tool's input parameters\n * @param options - Rendering options\n * @returns A React node that is guaranteed to be renderable\n */\nexport function safeRenderToolUseMessage(\n tool: Tool | undefined | null,\n input: unknown,\n options: { verbose: boolean },\n): React.ReactNode {\n // No tool provided\n if (!tool) {\n return (\n <Box>\n <Text dimColor>Unknown tool call</Text>\n </Box>\n )\n }\n\n // Tool doesn't have a renderer\n if (!tool.renderToolUseMessage) {\n return (\n <Box>\n <Text>\n <Text color=\"cyan\">{tool.name}</Text>\n {options.verbose && (\n <Text dimColor> {JSON.stringify(input).slice(0, 100)}</Text>\n )}\n </Text>\n </Box>\n )\n }\n\n try {\n const rendered = tool.renderToolUseMessage(input, options)\n\n // Handle null/undefined returns\n if (rendered === null || rendered === undefined) {\n return (\n <Box>\n <Text color=\"cyan\">{tool.name}</Text>\n </Box>\n )\n }\n\n return rendered\n } catch (error) {\n return <ErrorToolResult error={error} toolName={tool.name} />\n }\n}\n\n/**\n * Safely render a tool rejection message with comprehensive error handling.\n *\n * @param tool - The tool that was rejected\n * @param args - Arguments to pass to the rejection renderer\n * @returns A React node that is guaranteed to be renderable\n */\nexport function safeRenderToolRejectedMessage(\n tool: Tool | undefined | null,\n ...args: unknown[]\n): React.ReactNode {\n // No tool or no renderer\n if (!tool || !tool.renderToolUseRejectedMessage) {\n return (\n <Box>\n <Text color=\"yellow\">Tool use rejected</Text>\n </Box>\n )\n }\n\n try {\n const rendered = tool.renderToolUseRejectedMessage(...args)\n\n // Handle null/undefined returns\n if (rendered === null || rendered === undefined) {\n return (\n <Box>\n <Text color=\"yellow\">{tool.name} rejected</Text>\n </Box>\n )\n }\n\n return rendered\n } catch (error) {\n return <ErrorToolResult error={error} toolName={tool.name} />\n }\n}\n\n/**\n * Type guard to check if a value is a valid React node.\n */\nexport function isValidReactNode(value: unknown): value is React.ReactNode {\n if (value === null || value === undefined) {\n return true // React accepts null/undefined\n }\n\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return true\n }\n\n if (Array.isArray(value)) {\n return value.every(isValidReactNode)\n }\n\n // Check for React element\n if (typeof value === 'object' && value !== null) {\n return '$$typeof' in value || React.isValidElement(value)\n }\n\n return false\n}\n\n/**\n * Wrap a potentially unsafe render function with error boundaries.\n *\n * @param renderFn - The render function to wrap\n * @param fallback - Fallback content on error\n * @returns A safe render function\n */\nexport function wrapRenderFunction<TArgs extends unknown[]>(\n renderFn: (...args: TArgs) => React.ReactNode,\n fallback: React.ReactNode,\n): (...args: TArgs) => React.ReactNode {\n return (...args: TArgs) => {\n try {\n const result = renderFn(...args)\n if (result === null || result === undefined) {\n return fallback\n }\n return result\n } catch {\n return fallback\n }\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Safe Rendering Utilities for Tool Results\n *\n * Provides null-safe wrappers for tool rendering methods to prevent\n * crashes from undefined returns or exceptions.\n *\n * Part of Phase 1.3: Null Guards Completion\n */\n\nimport * as React from 'react'\nimport { Box, Text } from 'ink'\nimport { Tool } from '@tool'\nimport { SEMANTIC_COLORS } from '@constants/colors'\n\n/**\n * Default tool result component when tool doesn't provide a renderer.\n */\nexport function DefaultToolResult({\n output,\n}: {\n output: unknown\n}): React.ReactElement {\n let displayContent: string\n\n if (output === null || output === undefined) {\n displayContent = '(no output)'\n } else if (typeof output === 'string') {\n displayContent = output.length > 500 ? output.slice(0, 500) + '...' : output\n } else if (typeof output === 'object') {\n try {\n const json = JSON.stringify(output, null, 2)\n displayContent = json.length > 500 ? json.slice(0, 500) + '...' : json\n } catch {\n displayContent = '[Object - cannot stringify]'\n }\n } else {\n displayContent = String(output)\n }\n\n return (\n <Box flexDirection=\"column\">\n <Text color={SEMANTIC_COLORS.dim}>{displayContent}</Text>\n </Box>\n )\n}\n\n/**\n * Error display component for tool rendering failures.\n */\nexport function ErrorToolResult({\n error,\n toolName,\n}: {\n error: unknown\n toolName?: string\n}): React.ReactElement {\n const errorMessage =\n error instanceof Error ? error.message : String(error || 'Unknown error')\n\n return (\n <Box flexDirection=\"column\">\n <Text color=\"red\">\n {toolName ? `[${toolName}] ` : ''}Error rendering result:\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>{errorMessage}</Text>\n </Box>\n )\n}\n\n/**\n * Safely render a tool result with comprehensive error handling.\n *\n * @param tool - The tool that produced the result\n * @param output - The tool's output data\n * @param options - Rendering options\n * @returns A React node that is guaranteed to be renderable\n */\nexport function safeRenderToolResult(\n tool: Tool | undefined | null,\n output: unknown,\n options: { verbose: boolean },\n): React.ReactNode {\n // No tool provided\n if (!tool) {\n return <DefaultToolResult output={output} />\n }\n\n // Tool doesn't have a renderer\n if (!tool.renderToolResultMessage) {\n return <DefaultToolResult output={output} />\n }\n\n try {\n const rendered = tool.renderToolResultMessage(output, options)\n\n // Handle null/undefined returns\n if (rendered === null || rendered === undefined) {\n return <DefaultToolResult output={output} />\n }\n\n return rendered\n } catch (error) {\n // Catch any rendering errors\n return <ErrorToolResult error={error} toolName={tool.name} />\n }\n}\n\n/**\n * Safely render a tool use message with comprehensive error handling.\n *\n * @param tool - The tool being used\n * @param input - The tool's input parameters\n * @param options - Rendering options\n * @returns A React node that is guaranteed to be renderable\n */\nexport function safeRenderToolUseMessage(\n tool: Tool | undefined | null,\n input: unknown,\n options: { verbose: boolean },\n): React.ReactNode {\n // No tool provided\n if (!tool) {\n return (\n <Box>\n <Text color={SEMANTIC_COLORS.dim}>Unknown tool call</Text>\n </Box>\n )\n }\n\n // Tool doesn't have a renderer\n if (!tool.renderToolUseMessage) {\n return (\n <Box>\n <Text>\n <Text color=\"cyan\">{tool.name}</Text>\n {options.verbose && (\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n {JSON.stringify(input).slice(0, 100)}\n </Text>\n )}\n </Text>\n </Box>\n )\n }\n\n try {\n const rendered = tool.renderToolUseMessage(input, options)\n\n // Handle null/undefined returns\n if (rendered === null || rendered === undefined) {\n return (\n <Box>\n <Text color=\"cyan\">{tool.name}</Text>\n </Box>\n )\n }\n\n return rendered\n } catch (error) {\n return <ErrorToolResult error={error} toolName={tool.name} />\n }\n}\n\n/**\n * Safely render a tool rejection message with comprehensive error handling.\n *\n * @param tool - The tool that was rejected\n * @param args - Arguments to pass to the rejection renderer\n * @returns A React node that is guaranteed to be renderable\n */\nexport function safeRenderToolRejectedMessage(\n tool: Tool | undefined | null,\n ...args: unknown[]\n): React.ReactNode {\n // No tool or no renderer\n if (!tool || !tool.renderToolUseRejectedMessage) {\n return (\n <Box>\n <Text color=\"yellow\">Tool use rejected</Text>\n </Box>\n )\n }\n\n try {\n const rendered = tool.renderToolUseRejectedMessage(...args)\n\n // Handle null/undefined returns\n if (rendered === null || rendered === undefined) {\n return (\n <Box>\n <Text color=\"yellow\">{tool.name} rejected</Text>\n </Box>\n )\n }\n\n return rendered\n } catch (error) {\n return <ErrorToolResult error={error} toolName={tool.name} />\n }\n}\n\n/**\n * Type guard to check if a value is a valid React node.\n */\nexport function isValidReactNode(value: unknown): value is React.ReactNode {\n if (value === null || value === undefined) {\n return true // React accepts null/undefined\n }\n\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return true\n }\n\n if (Array.isArray(value)) {\n return value.every(isValidReactNode)\n }\n\n // Check for React element\n if (typeof value === 'object' && value !== null) {\n return '$$typeof' in value || React.isValidElement(value)\n }\n\n return false\n}\n\n/**\n * Wrap a potentially unsafe render function with error boundaries.\n *\n * @param renderFn - The render function to wrap\n * @param fallback - Fallback content on error\n * @returns A safe render function\n */\nexport function wrapRenderFunction<TArgs extends unknown[]>(\n renderFn: (...args: TArgs) => React.ReactNode,\n fallback: React.ReactNode,\n): (...args: TArgs) => React.ReactNode {\n return (...args: TArgs) => {\n try {\n const result = renderFn(...args)\n if (result === null || result === undefined) {\n return fallback\n }\n return result\n } catch {\n return fallback\n }\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/dist/version.js CHANGED
@@ -1,5 +1,5 @@
1
- const VERSION = "0.2.0";
2
- const BUILD_DATE = "2026-01-30T12:44:29.956Z";
1
+ const VERSION = "0.3.0";
2
+ const BUILD_DATE = "2026-02-02T01:21:32.241Z";
3
3
  export {
4
4
  BUILD_DATE,
5
5
  VERSION
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/version.ts"],
4
- "sourcesContent": ["/**\n * Application version\n * This file is auto-generated during build process\n */\n\nexport const VERSION = '0.2.0'\nexport const BUILD_DATE = '2026-01-30T12:44:29.956Z'\n"],
4
+ "sourcesContent": ["/**\n * Application version\n * This file is auto-generated during build process\n */\n\nexport const VERSION = '0.3.0'\nexport const BUILD_DATE = '2026-02-02T01:21:32.241Z'\n"],
5
5
  "mappings": "AAKO,MAAM,UAAU;AAChB,MAAM,aAAa;",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@within-7/minto",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "bin": {
5
5
  "minto": "cli.js"
6
6
  },
@@ -40,14 +40,16 @@
40
40
  "prepare": "",
41
41
  "publish:packages": "node scripts/publish-platform-packages.mjs",
42
42
  "publish:dev": "node scripts/publish-dev.js",
43
- "publish:release": "node scripts/publish-release.js"
43
+ "publish:release": "node scripts/publish-release.js",
44
+ "release": "node scripts/release-full.js",
45
+ "release:dry-run": "node scripts/release-full.js --dry-run"
44
46
  },
45
47
  "optionalDependencies": {
46
- "@within-7/minto-darwin-arm64": "0.2.0",
47
- "@within-7/minto-darwin-x64": "0.2.0",
48
- "@within-7/minto-linux-arm64": "0.2.0",
49
- "@within-7/minto-linux-x64": "0.2.0",
50
- "@within-7/minto-win32-x64": "0.2.0"
48
+ "@within-7/minto-darwin-arm64": "0.3.0",
49
+ "@within-7/minto-darwin-x64": "0.3.0",
50
+ "@within-7/minto-linux-arm64": "0.3.0",
51
+ "@within-7/minto-linux-x64": "0.3.0",
52
+ "@within-7/minto-win32-x64": "0.3.0"
51
53
  },
52
54
  "dependencies": {
53
55
  "@anthropic-ai/bedrock-sdk": "^0.12.6",
@@ -1,31 +0,0 @@
1
- import { useInput } from "ink";
2
- function useCancelRequest(setToolJSX, setToolUseConfirm, setBinaryFeedbackContext, onCancel, isLoading, isMessageSelectorVisible, abortSignal, hasInputContent) {
3
- useInput((_, key) => {
4
- if (!key.escape) {
5
- return;
6
- }
7
- if (abortSignal?.aborted) {
8
- return;
9
- }
10
- if (!abortSignal) {
11
- return;
12
- }
13
- if (!isLoading) {
14
- return;
15
- }
16
- if (isMessageSelectorVisible) {
17
- return;
18
- }
19
- if (hasInputContent) {
20
- return;
21
- }
22
- setToolJSX(null);
23
- setToolUseConfirm(null);
24
- setBinaryFeedbackContext(null);
25
- onCancel();
26
- });
27
- }
28
- export {
29
- useCancelRequest
30
- };
31
- //# sourceMappingURL=useCancelRequest.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/hooks/useCancelRequest.ts"],
4
- "sourcesContent": ["import { useInput } from 'ink'\nimport { ToolUseConfirm } from '@components/permissions/PermissionRequest'\nimport { BinaryFeedbackContext } from '@screens/REPL'\nimport type { SetToolJSXFn } from '@tool'\n\nexport function useCancelRequest(\n setToolJSX: SetToolJSXFn,\n setToolUseConfirm: (toolUseConfirm: ToolUseConfirm | null) => void,\n setBinaryFeedbackContext: (bfContext: BinaryFeedbackContext | null) => void,\n onCancel: () => void,\n isLoading: boolean,\n isMessageSelectorVisible: boolean,\n abortSignal?: AbortSignal,\n /** If true, ESC will first clear input before canceling. Pass input.length > 0 */\n hasInputContent?: boolean,\n) {\n useInput((_, key) => {\n if (!key.escape) {\n return\n }\n if (abortSignal?.aborted) {\n return\n }\n if (!abortSignal) {\n return\n }\n if (!isLoading) {\n return\n }\n if (isMessageSelectorVisible) {\n // Esc closes the message selector\n return\n }\n // If input has content, let PromptInput handle ESC to clear input first\n if (hasInputContent) {\n return\n }\n\n setToolJSX(null)\n setToolUseConfirm(null)\n setBinaryFeedbackContext(null)\n onCancel()\n })\n}\n"],
5
- "mappings": "AAAA,SAAS,gBAAgB;AAKlB,SAAS,iBACd,YACA,mBACA,0BACA,UACA,WACA,0BACA,aAEA,iBACA;AACA,WAAS,CAAC,GAAG,QAAQ;AACnB,QAAI,CAAC,IAAI,QAAQ;AACf;AAAA,IACF;AACA,QAAI,aAAa,SAAS;AACxB;AAAA,IACF;AACA,QAAI,CAAC,aAAa;AAChB;AAAA,IACF;AACA,QAAI,CAAC,WAAW;AACd;AAAA,IACF;AACA,QAAI,0BAA0B;AAE5B;AAAA,IACF;AAEA,QAAI,iBAAiB;AACnB;AAAA,IACF;AAEA,eAAW,IAAI;AACf,sBAAkB,IAAI;AACtB,6BAAyB,IAAI;AAC7B,aAAS;AAAA,EACX,CAAC;AACH;",
6
- "names": []
7
- }