@within-7/minto 0.1.6 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (487) hide show
  1. package/cli.js +155 -37
  2. package/dist/Tool.js +38 -0
  3. package/dist/Tool.js.map +3 -3
  4. package/dist/commands/agents/AgentsCommand.js +52 -26
  5. package/dist/commands/agents/AgentsCommand.js.map +2 -2
  6. package/dist/commands/agents/constants.js +1 -1
  7. package/dist/commands/agents/constants.js.map +1 -1
  8. package/dist/commands/agents/index.js +1 -1
  9. package/dist/commands/bug.js +74 -7
  10. package/dist/commands/bug.js.map +3 -3
  11. package/dist/commands/clear.js +3 -0
  12. package/dist/commands/clear.js.map +2 -2
  13. package/dist/commands/compact.js +37 -0
  14. package/dist/commands/compact.js.map +2 -2
  15. package/dist/commands/context.js +84 -0
  16. package/dist/commands/context.js.map +7 -0
  17. package/dist/commands/ctx_viz.js +18 -10
  18. package/dist/commands/ctx_viz.js.map +2 -2
  19. package/dist/commands/doctor.js +158 -12
  20. package/dist/commands/doctor.js.map +2 -2
  21. package/dist/commands/export.js +156 -0
  22. package/dist/commands/export.js.map +7 -0
  23. package/dist/commands/mcp-interactive.js +21 -12
  24. package/dist/commands/mcp-interactive.js.map +2 -2
  25. package/dist/commands/model.js +6 -5
  26. package/dist/commands/model.js.map +2 -2
  27. package/dist/commands/permissions.js +86 -0
  28. package/dist/commands/permissions.js.map +7 -0
  29. package/dist/commands/quit.js +3 -1
  30. package/dist/commands/quit.js.map +2 -2
  31. package/dist/commands/sandbox.js +104 -0
  32. package/dist/commands/sandbox.js.map +7 -0
  33. package/dist/commands/status.js +58 -0
  34. package/dist/commands/status.js.map +7 -0
  35. package/dist/commands/tasks.js +108 -0
  36. package/dist/commands/tasks.js.map +7 -0
  37. package/dist/commands/todos.js +123 -0
  38. package/dist/commands/todos.js.map +7 -0
  39. package/dist/commands.js +20 -2
  40. package/dist/commands.js.map +2 -2
  41. package/dist/components/AgentThinkingBlock.js +10 -18
  42. package/dist/components/AgentThinkingBlock.js.map +2 -2
  43. package/dist/components/BackgroundTasksPanel.js +78 -29
  44. package/dist/components/BackgroundTasksPanel.js.map +2 -2
  45. package/dist/components/BashStreamingProgress.js +24 -0
  46. package/dist/components/BashStreamingProgress.js.map +7 -0
  47. package/dist/components/CollapsibleHint.js +14 -0
  48. package/dist/components/CollapsibleHint.js.map +7 -0
  49. package/dist/components/FileEditToolUpdatedMessage.js +1 -1
  50. package/dist/components/FileEditToolUpdatedMessage.js.map +2 -2
  51. package/dist/components/HotkeyHelpPanel.js +137 -0
  52. package/dist/components/HotkeyHelpPanel.js.map +7 -0
  53. package/dist/components/Logo.js +5 -5
  54. package/dist/components/Logo.js.map +2 -2
  55. package/dist/components/Message.js +23 -7
  56. package/dist/components/Message.js.map +3 -3
  57. package/dist/components/ModelConfig.js +16 -3
  58. package/dist/components/ModelConfig.js.map +2 -2
  59. package/dist/components/ModelListManager.js +3 -3
  60. package/dist/components/ModelListManager.js.map +2 -2
  61. package/dist/components/ModelSelector/ModelSelector.js +1 -1
  62. package/dist/components/Onboarding.js +19 -14
  63. package/dist/components/Onboarding.js.map +2 -2
  64. package/dist/components/ProgressBar.js +74 -0
  65. package/dist/components/ProgressBar.js.map +7 -0
  66. package/dist/components/PromptInput.js +156 -46
  67. package/dist/components/PromptInput.js.map +2 -2
  68. package/dist/components/RequestStatusIndicator.js +194 -0
  69. package/dist/components/RequestStatusIndicator.js.map +7 -0
  70. package/dist/components/Spinner.js +92 -27
  71. package/dist/components/Spinner.js.map +2 -2
  72. package/dist/components/SpinnerSymbol.js +21 -27
  73. package/dist/components/SpinnerSymbol.js.map +2 -2
  74. package/dist/components/StreamingBashOutput.js +9 -8
  75. package/dist/components/StreamingBashOutput.js.map +2 -2
  76. package/dist/components/SubagentBlock.js +1 -1
  77. package/dist/components/SubagentBlock.js.map +1 -1
  78. package/dist/components/SubagentProgress.js +10 -11
  79. package/dist/components/SubagentProgress.js.map +2 -2
  80. package/dist/components/TaskCard.js +16 -13
  81. package/dist/components/TaskCard.js.map +2 -2
  82. package/dist/components/TodoChangeBlock.js +1 -1
  83. package/dist/components/TodoChangeBlock.js.map +2 -2
  84. package/dist/components/TodoPanel.js +120 -29
  85. package/dist/components/TodoPanel.js.map +3 -3
  86. package/dist/components/TokenCounter.js +74 -0
  87. package/dist/components/TokenCounter.js.map +7 -0
  88. package/dist/components/TokenWarning.js +2 -1
  89. package/dist/components/TokenWarning.js.map +2 -2
  90. package/dist/components/TreeConnector.js +25 -0
  91. package/dist/components/TreeConnector.js.map +7 -0
  92. package/dist/components/TurnCompletionIndicator.js +18 -0
  93. package/dist/components/TurnCompletionIndicator.js.map +7 -0
  94. package/dist/components/messages/AssistantTextMessage.js +5 -2
  95. package/dist/components/messages/AssistantTextMessage.js.map +2 -2
  96. package/dist/components/messages/AssistantThinkingMessage.js +18 -3
  97. package/dist/components/messages/AssistantThinkingMessage.js.map +2 -2
  98. package/dist/components/messages/AssistantToolUseMessage.js +11 -8
  99. package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
  100. package/dist/components/messages/GroupRenderer.js +53 -0
  101. package/dist/components/messages/GroupRenderer.js.map +7 -0
  102. package/dist/components/messages/NestedTasksPreview.js +12 -0
  103. package/dist/components/messages/NestedTasksPreview.js.map +7 -0
  104. package/dist/components/messages/ParallelTasksGroupView.js +92 -0
  105. package/dist/components/messages/ParallelTasksGroupView.js.map +7 -0
  106. package/dist/components/messages/TaskInModuleView.js +198 -0
  107. package/dist/components/messages/TaskInModuleView.js.map +7 -0
  108. package/dist/components/messages/TaskOutputContent.js +53 -0
  109. package/dist/components/messages/TaskOutputContent.js.map +7 -0
  110. package/dist/components/messages/UserPromptMessage.js +1 -1
  111. package/dist/components/messages/UserPromptMessage.js.map +2 -2
  112. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +2 -3
  113. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +2 -2
  114. package/dist/components/permissions/FallbackPermissionRequest.js +4 -4
  115. package/dist/components/permissions/FallbackPermissionRequest.js.map +2 -2
  116. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +4 -4
  117. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js.map +2 -2
  118. package/dist/constants/colors.js +48 -0
  119. package/dist/constants/colors.js.map +2 -2
  120. package/dist/constants/formatRules.js +102 -0
  121. package/dist/constants/formatRules.js.map +7 -0
  122. package/dist/constants/prompts.js +12 -34
  123. package/dist/constants/prompts.js.map +2 -2
  124. package/dist/constants/symbols.js +64 -6
  125. package/dist/constants/symbols.js.map +2 -2
  126. package/dist/constants/timing.js +5 -0
  127. package/dist/constants/timing.js.map +2 -2
  128. package/dist/core/config/defaults.js +84 -0
  129. package/dist/core/config/defaults.js.map +7 -0
  130. package/dist/core/config/index.js +111 -0
  131. package/dist/core/config/index.js.map +7 -0
  132. package/dist/core/config/loader.js +221 -0
  133. package/dist/core/config/loader.js.map +7 -0
  134. package/dist/core/config/migrations.js +128 -0
  135. package/dist/core/config/migrations.js.map +7 -0
  136. package/dist/core/config/schema.js +178 -0
  137. package/dist/core/config/schema.js.map +7 -0
  138. package/dist/core/costTracker.js +138 -0
  139. package/dist/core/costTracker.js.map +7 -0
  140. package/dist/core/index.js +5 -0
  141. package/dist/core/index.js.map +7 -0
  142. package/dist/core/permissions/auditLog.js +204 -0
  143. package/dist/core/permissions/auditLog.js.map +7 -0
  144. package/dist/core/permissions/engine/index.js +3 -0
  145. package/dist/core/permissions/engine/index.js.map +7 -0
  146. package/dist/core/permissions/engine/permissionEngine.js +106 -0
  147. package/dist/core/permissions/engine/permissionEngine.js.map +7 -0
  148. package/dist/core/permissions/engine/types.js +1 -0
  149. package/dist/core/permissions/engine/types.js.map +7 -0
  150. package/dist/core/permissions/index.js +84 -0
  151. package/dist/core/permissions/index.js.map +7 -0
  152. package/dist/core/permissions/ruleEngine.js +259 -0
  153. package/dist/core/permissions/ruleEngine.js.map +7 -0
  154. package/dist/core/permissions/rules/allowedToolsRule.js +62 -0
  155. package/dist/core/permissions/rules/allowedToolsRule.js.map +7 -0
  156. package/dist/core/permissions/rules/autoEscalationRule.js +291 -0
  157. package/dist/core/permissions/rules/autoEscalationRule.js.map +7 -0
  158. package/dist/core/permissions/rules/index.js +46 -0
  159. package/dist/core/permissions/rules/index.js.map +7 -0
  160. package/dist/core/permissions/rules/planModeRule.js +55 -0
  161. package/dist/core/permissions/rules/planModeRule.js.map +7 -0
  162. package/dist/core/permissions/rules/projectBoundaryRule.js +168 -0
  163. package/dist/core/permissions/rules/projectBoundaryRule.js.map +7 -0
  164. package/dist/core/permissions/rules/safeModeRule.js +65 -0
  165. package/dist/core/permissions/rules/safeModeRule.js.map +7 -0
  166. package/dist/core/permissions/rules/sensitivePathsRule.js +340 -0
  167. package/dist/core/permissions/rules/sensitivePathsRule.js.map +7 -0
  168. package/dist/core/permissions/types.js +127 -0
  169. package/dist/core/permissions/types.js.map +7 -0
  170. package/dist/core/tools/executor.js +143 -0
  171. package/dist/core/tools/executor.js.map +7 -0
  172. package/dist/core/tools/index.js +15 -0
  173. package/dist/core/tools/index.js.map +7 -0
  174. package/dist/core/tools/registry.js +183 -0
  175. package/dist/core/tools/registry.js.map +7 -0
  176. package/dist/core/tools/types.js +1 -0
  177. package/dist/core/tools/types.js.map +7 -0
  178. package/dist/cost-tracker.js +23 -15
  179. package/dist/cost-tracker.js.map +2 -2
  180. package/dist/entrypoints/cli.js +43 -43
  181. package/dist/entrypoints/cli.js.map +2 -2
  182. package/dist/entrypoints/mcp.js +12 -4
  183. package/dist/entrypoints/mcp.js.map +2 -2
  184. package/dist/history.js +14 -3
  185. package/dist/history.js.map +2 -2
  186. package/dist/hooks/useAgentTranscripts.js +116 -0
  187. package/dist/hooks/useAgentTranscripts.js.map +7 -0
  188. package/dist/hooks/useAnimationSync.js +53 -0
  189. package/dist/hooks/useAnimationSync.js.map +7 -0
  190. package/dist/hooks/useArrowKeyHistory.js +4 -2
  191. package/dist/hooks/useArrowKeyHistory.js.map +2 -2
  192. package/dist/hooks/useCanUseTool.js +3 -1
  193. package/dist/hooks/useCanUseTool.js.map +2 -2
  194. package/dist/hooks/useCancelRequest.js +4 -1
  195. package/dist/hooks/useCancelRequest.js.map +2 -2
  196. package/dist/hooks/useExitOnCtrlCD.js +9 -5
  197. package/dist/hooks/useExitOnCtrlCD.js.map +2 -2
  198. package/dist/hooks/useHookStatus.js +40 -0
  199. package/dist/hooks/useHookStatus.js.map +7 -0
  200. package/dist/hooks/useLogMessages.js +17 -1
  201. package/dist/hooks/useLogMessages.js.map +2 -2
  202. package/dist/hooks/useMessageGroups.js +43 -0
  203. package/dist/hooks/useMessageGroups.js.map +7 -0
  204. package/dist/hooks/useTerminalSize.js +62 -6
  205. package/dist/hooks/useTerminalSize.js.map +2 -2
  206. package/dist/hooks/useUnifiedCompletion.js +69 -0
  207. package/dist/hooks/useUnifiedCompletion.js.map +2 -2
  208. package/dist/i18n/index.js +109 -0
  209. package/dist/i18n/index.js.map +7 -0
  210. package/dist/i18n/locales/en.js +347 -0
  211. package/dist/i18n/locales/en.js.map +7 -0
  212. package/dist/i18n/locales/index.js +7 -0
  213. package/dist/i18n/locales/index.js.map +7 -0
  214. package/dist/i18n/locales/zh-CN.js +347 -0
  215. package/dist/i18n/locales/zh-CN.js.map +7 -0
  216. package/dist/i18n/types.js +8 -0
  217. package/dist/i18n/types.js.map +7 -0
  218. package/dist/query.js +175 -17
  219. package/dist/query.js.map +3 -3
  220. package/dist/screens/REPL.js +501 -192
  221. package/dist/screens/REPL.js.map +3 -3
  222. package/dist/services/adapters/chatCompletions.js +3 -1
  223. package/dist/services/adapters/chatCompletions.js.map +2 -2
  224. package/dist/services/adapters/messageNormalizer.js +354 -0
  225. package/dist/services/adapters/messageNormalizer.js.map +7 -0
  226. package/dist/services/adapters/responsesAPI.js +6 -3
  227. package/dist/services/adapters/responsesAPI.js.map +2 -2
  228. package/dist/services/checkpointManager.js +386 -0
  229. package/dist/services/checkpointManager.js.map +7 -0
  230. package/dist/services/claude.js +138 -11
  231. package/dist/services/claude.js.map +3 -3
  232. package/dist/services/compressionService.js +50 -1
  233. package/dist/services/compressionService.js.map +2 -2
  234. package/dist/services/contextMonitor.js +162 -0
  235. package/dist/services/contextMonitor.js.map +7 -0
  236. package/dist/services/customCommands.js +60 -41
  237. package/dist/services/customCommands.js.map +2 -2
  238. package/dist/services/hookExecutor.js +173 -1
  239. package/dist/services/hookExecutor.js.map +2 -2
  240. package/dist/services/intelligentCompactor.js +281 -0
  241. package/dist/services/intelligentCompactor.js.map +7 -0
  242. package/dist/services/lspConfig.js +109 -0
  243. package/dist/services/lspConfig.js.map +7 -0
  244. package/dist/services/mcpClient.js +273 -34
  245. package/dist/services/mcpClient.js.map +2 -2
  246. package/dist/services/modelOrchestrator.js +310 -0
  247. package/dist/services/modelOrchestrator.js.map +7 -0
  248. package/dist/services/openai.js +8 -1
  249. package/dist/services/openai.js.map +2 -2
  250. package/dist/services/outputStyles.js +138 -0
  251. package/dist/services/outputStyles.js.map +7 -0
  252. package/dist/services/plugins/index.js +5 -0
  253. package/dist/services/plugins/index.js.map +7 -0
  254. package/dist/services/plugins/lspServers.js +188 -0
  255. package/dist/services/plugins/lspServers.js.map +7 -0
  256. package/dist/services/plugins/pluginRuntime.js +229 -0
  257. package/dist/services/plugins/pluginRuntime.js.map +7 -0
  258. package/dist/services/plugins/pluginValidation.js +219 -0
  259. package/dist/services/plugins/pluginValidation.js.map +7 -0
  260. package/dist/services/plugins/skillMarketplace.js +556 -0
  261. package/dist/services/plugins/skillMarketplace.js.map +7 -0
  262. package/dist/services/responseStateManager.js +37 -3
  263. package/dist/services/responseStateManager.js.map +2 -2
  264. package/dist/services/sandbox/filesystemBoundary.js +300 -0
  265. package/dist/services/sandbox/filesystemBoundary.js.map +7 -0
  266. package/dist/services/sandbox/index.js +14 -0
  267. package/dist/services/sandbox/index.js.map +7 -0
  268. package/dist/services/sandbox/networkProxy.js +293 -0
  269. package/dist/services/sandbox/networkProxy.js.map +7 -0
  270. package/dist/services/sandbox/sandboxController.js +574 -0
  271. package/dist/services/sandbox/sandboxController.js.map +7 -0
  272. package/dist/services/sandbox/types.js +50 -0
  273. package/dist/services/sandbox/types.js.map +7 -0
  274. package/dist/services/sessionMemory.js +266 -0
  275. package/dist/services/sessionMemory.js.map +7 -0
  276. package/dist/services/taskRouter.js +324 -0
  277. package/dist/services/taskRouter.js.map +7 -0
  278. package/dist/tools/ArchitectTool/ArchitectTool.js +10 -3
  279. package/dist/tools/ArchitectTool/ArchitectTool.js.map +2 -2
  280. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +3 -0
  281. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
  282. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js +8 -1
  283. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +2 -2
  284. package/dist/tools/BaseTool.js +72 -0
  285. package/dist/tools/BaseTool.js.map +7 -0
  286. package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js +3 -0
  287. package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js.map +2 -2
  288. package/dist/tools/BashTool/BashTool.js +60 -3
  289. package/dist/tools/BashTool/BashTool.js.map +2 -2
  290. package/dist/tools/BashTool/BashToolResultMessage.js +3 -0
  291. package/dist/tools/BashTool/BashToolResultMessage.js.map +2 -2
  292. package/dist/tools/BashTool/OutputLine.js +54 -0
  293. package/dist/tools/BashTool/OutputLine.js.map +2 -2
  294. package/dist/tools/BashTool/prompt.js +192 -3
  295. package/dist/tools/BashTool/prompt.js.map +2 -2
  296. package/dist/tools/FileEditTool/FileEditTool.js +29 -4
  297. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  298. package/dist/tools/FileReadTool/FileReadTool.js +23 -4
  299. package/dist/tools/FileReadTool/FileReadTool.js.map +2 -2
  300. package/dist/tools/FileWriteTool/FileWriteTool.js +5 -5
  301. package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
  302. package/dist/tools/GlobTool/GlobTool.js +14 -3
  303. package/dist/tools/GlobTool/GlobTool.js.map +2 -2
  304. package/dist/tools/GrepTool/GrepTool.js +41 -7
  305. package/dist/tools/GrepTool/GrepTool.js.map +2 -2
  306. package/dist/tools/KillShellTool/KillShellToolResultMessage.js +3 -0
  307. package/dist/tools/KillShellTool/KillShellToolResultMessage.js.map +2 -2
  308. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js +109 -0
  309. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +7 -0
  310. package/dist/tools/ListMcpResourcesTool/prompt.js +19 -0
  311. package/dist/tools/ListMcpResourcesTool/prompt.js.map +7 -0
  312. package/dist/tools/LspTool/LspTool.js +664 -0
  313. package/dist/tools/LspTool/LspTool.js.map +7 -0
  314. package/dist/tools/LspTool/prompt.js +27 -0
  315. package/dist/tools/LspTool/prompt.js.map +7 -0
  316. package/dist/tools/MCPTool/MCPTool.js +11 -4
  317. package/dist/tools/MCPTool/MCPTool.js.map +2 -2
  318. package/dist/tools/MemoryReadTool/MemoryReadTool.js +19 -6
  319. package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
  320. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +6 -6
  321. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
  322. package/dist/tools/MultiEditTool/MultiEditTool.js +19 -2
  323. package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
  324. package/dist/tools/NotebookEditTool/NotebookEditTool.js +5 -1
  325. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
  326. package/dist/tools/NotebookReadTool/NotebookReadTool.js +8 -4
  327. package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +2 -2
  328. package/dist/tools/PlanModeTool/EnterPlanModeTool.js +74 -0
  329. package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +7 -0
  330. package/dist/tools/PlanModeTool/ExitPlanModeTool.js +108 -0
  331. package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +7 -0
  332. package/dist/tools/PlanModeTool/prompt.js +94 -0
  333. package/dist/tools/PlanModeTool/prompt.js.map +7 -0
  334. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js +130 -0
  335. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +7 -0
  336. package/dist/tools/ReadMcpResourceTool/prompt.js +17 -0
  337. package/dist/tools/ReadMcpResourceTool/prompt.js.map +7 -0
  338. package/dist/tools/SkillTool/SkillTool.js +14 -3
  339. package/dist/tools/SkillTool/SkillTool.js.map +2 -2
  340. package/dist/tools/SlashCommandTool/SlashCommandTool.js +260 -0
  341. package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +7 -0
  342. package/dist/tools/SlashCommandTool/prompt.js +35 -0
  343. package/dist/tools/SlashCommandTool/prompt.js.map +7 -0
  344. package/dist/tools/TaskOutputTool/TaskOutputTool.js +189 -0
  345. package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +7 -0
  346. package/dist/tools/TaskOutputTool/prompt.js +15 -0
  347. package/dist/tools/TaskOutputTool/prompt.js.map +7 -0
  348. package/dist/tools/TaskTool/TaskTool.js +321 -146
  349. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  350. package/dist/tools/TaskTool/prompt.js.map +2 -2
  351. package/dist/tools/TodoWriteTool/TodoWriteTool.js +42 -73
  352. package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +2 -2
  353. package/dist/tools/URLFetcherTool/URLFetcherTool.js +7 -1
  354. package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
  355. package/dist/tools/URLFetcherTool/cache.js +55 -8
  356. package/dist/tools/URLFetcherTool/cache.js.map +2 -2
  357. package/dist/tools/WebSearchTool/WebSearchTool.js +6 -1
  358. package/dist/tools/WebSearchTool/WebSearchTool.js.map +2 -2
  359. package/dist/tools.js +31 -2
  360. package/dist/tools.js.map +2 -2
  361. package/dist/types/hooks.js +4 -0
  362. package/dist/types/hooks.js.map +2 -2
  363. package/dist/types/marketplace.js.map +2 -2
  364. package/dist/types/messageGroup.js +36 -0
  365. package/dist/types/messageGroup.js.map +7 -0
  366. package/dist/types/plugin.js.map +2 -2
  367. package/dist/types/thinking.js +1 -0
  368. package/dist/types/thinking.js.map +7 -0
  369. package/dist/utils/BackgroundShellManager.js +136 -39
  370. package/dist/utils/BackgroundShellManager.js.map +2 -2
  371. package/dist/utils/MessageBatchBuffer.js +102 -0
  372. package/dist/utils/MessageBatchBuffer.js.map +7 -0
  373. package/dist/utils/PersistentShell.js +151 -1
  374. package/dist/utils/PersistentShell.js.map +2 -2
  375. package/dist/utils/agentLoader.js +1 -23
  376. package/dist/utils/agentLoader.js.map +2 -2
  377. package/dist/utils/agentTranscripts.js +641 -0
  378. package/dist/utils/agentTranscripts.js.map +7 -0
  379. package/dist/utils/animationManager.js +213 -0
  380. package/dist/utils/animationManager.js.map +7 -0
  381. package/dist/utils/animationSync.js +110 -0
  382. package/dist/utils/animationSync.js.map +7 -0
  383. package/dist/utils/asyncFile.js +215 -0
  384. package/dist/utils/asyncFile.js.map +7 -0
  385. package/dist/utils/backgroundAgentManager.js +231 -0
  386. package/dist/utils/backgroundAgentManager.js.map +7 -0
  387. package/dist/utils/config.js +63 -7
  388. package/dist/utils/config.js.map +2 -2
  389. package/dist/utils/conversationRecovery.js +19 -0
  390. package/dist/utils/conversationRecovery.js.map +2 -2
  391. package/dist/utils/exit.js +73 -0
  392. package/dist/utils/exit.js.map +7 -0
  393. package/dist/utils/format.js +73 -5
  394. package/dist/utils/format.js.map +2 -2
  395. package/dist/utils/generators.js +76 -6
  396. package/dist/utils/generators.js.map +2 -2
  397. package/dist/utils/globalErrorHandler.js +149 -0
  398. package/dist/utils/globalErrorHandler.js.map +7 -0
  399. package/dist/utils/groupHandlers/index.js +8 -0
  400. package/dist/utils/groupHandlers/index.js.map +7 -0
  401. package/dist/utils/groupHandlers/parallelTasksHandler.js +140 -0
  402. package/dist/utils/groupHandlers/parallelTasksHandler.js.map +7 -0
  403. package/dist/utils/groupHandlers/taskHandler.js +104 -0
  404. package/dist/utils/groupHandlers/taskHandler.js.map +7 -0
  405. package/dist/utils/groupHandlers/types.js +1 -0
  406. package/dist/utils/groupHandlers/types.js.map +7 -0
  407. package/dist/utils/logRotation.js +224 -0
  408. package/dist/utils/logRotation.js.map +7 -0
  409. package/dist/utils/marketplaceManager.js +3 -5
  410. package/dist/utils/marketplaceManager.js.map +2 -2
  411. package/dist/utils/memSafety.js +264 -0
  412. package/dist/utils/memSafety.js.map +7 -0
  413. package/dist/utils/messageGroupManager.js +274 -0
  414. package/dist/utils/messageGroupManager.js.map +7 -0
  415. package/dist/utils/messages.js +13 -4
  416. package/dist/utils/messages.js.map +2 -2
  417. package/dist/utils/model.js +119 -15
  418. package/dist/utils/model.js.map +3 -3
  419. package/dist/utils/permissions/filesystem.js +157 -5
  420. package/dist/utils/permissions/filesystem.js.map +2 -2
  421. package/dist/utils/plan/planMode.js +143 -0
  422. package/dist/utils/plan/planMode.js.map +7 -0
  423. package/dist/utils/pluginLoader.js +17 -21
  424. package/dist/utils/pluginLoader.js.map +2 -2
  425. package/dist/utils/ripgrep.js +55 -2
  426. package/dist/utils/ripgrep.js.map +2 -2
  427. package/dist/utils/sanitizeInput.js +32 -0
  428. package/dist/utils/sanitizeInput.js.map +7 -0
  429. package/dist/utils/secureKeyStorage.js +312 -0
  430. package/dist/utils/secureKeyStorage.js.map +7 -0
  431. package/dist/utils/session/sessionPlugins.js +67 -0
  432. package/dist/utils/session/sessionPlugins.js.map +7 -0
  433. package/dist/utils/taskDisplayUtils.js +257 -0
  434. package/dist/utils/taskDisplayUtils.js.map +7 -0
  435. package/dist/utils/teamConfig.js +2 -1
  436. package/dist/utils/teamConfig.js.map +2 -2
  437. package/dist/utils/todoStorage.js +92 -2
  438. package/dist/utils/todoStorage.js.map +2 -2
  439. package/dist/utils/toolTimeout.js +136 -0
  440. package/dist/utils/toolTimeout.js.map +7 -0
  441. package/dist/utils/tooling/safeRender.js +115 -0
  442. package/dist/utils/tooling/safeRender.js.map +7 -0
  443. package/dist/utils/userFriendlyError.js +346 -0
  444. package/dist/utils/userFriendlyError.js.map +7 -0
  445. package/dist/utils/vendor/ripgrep/arm64-darwin/rg +0 -0
  446. package/dist/version.js +2 -2
  447. package/dist/version.js.map +1 -1
  448. package/package.json +14 -4
  449. package/scripts/postinstall.js +128 -38
  450. package/dist/commands/agents.js +0 -2086
  451. package/dist/commands/agents.js.map +0 -7
  452. package/dist/commands/build.js +0 -74
  453. package/dist/commands/build.js.map +0 -7
  454. package/dist/commands/compression.js +0 -57
  455. package/dist/commands/compression.js.map +0 -7
  456. package/dist/commands/listen.js +0 -37
  457. package/dist/commands/listen.js.map +0 -7
  458. package/dist/commands/login.js +0 -37
  459. package/dist/commands/login.js.map +0 -7
  460. package/dist/commands/logout.js +0 -33
  461. package/dist/commands/logout.js.map +0 -7
  462. package/dist/commands/mcp.js +0 -40
  463. package/dist/commands/mcp.js.map +0 -7
  464. package/dist/commands/mcp_refresh.js +0 -40
  465. package/dist/commands/mcp_refresh.js.map +0 -7
  466. package/dist/commands/modelstatus.js +0 -21
  467. package/dist/commands/modelstatus.js.map +0 -7
  468. package/dist/commands/onboarding.js +0 -36
  469. package/dist/commands/onboarding.js.map +0 -7
  470. package/dist/commands/plugin-interactive.js +0 -446
  471. package/dist/commands/plugin-interactive.js.map +0 -7
  472. package/dist/commands/pr_comments.js +0 -61
  473. package/dist/commands/pr_comments.js.map +0 -7
  474. package/dist/commands/release-notes.js +0 -30
  475. package/dist/commands/release-notes.js.map +0 -7
  476. package/dist/commands/review.js +0 -51
  477. package/dist/commands/review.js.map +0 -7
  478. package/dist/components/Bug.js +0 -147
  479. package/dist/components/Bug.js.map +0 -7
  480. package/dist/components/ModelSelector.js +0 -2062
  481. package/dist/components/ModelSelector.js.map +0 -7
  482. package/dist/components/ModelStatusDisplay.js +0 -87
  483. package/dist/components/ModelStatusDisplay.js.map +0 -7
  484. package/dist/entrypoints/cli-wrapper.js +0 -61
  485. package/dist/entrypoints/cli-wrapper.js.map +0 -7
  486. package/dist/screens/Doctor.js +0 -22
  487. package/dist/screens/Doctor.js.map +0 -7
@@ -0,0 +1,115 @@
1
+ import * as React from "react";
2
+ import { Box, Text } from "ink";
3
+ function DefaultToolResult({
4
+ output
5
+ }) {
6
+ let displayContent;
7
+ if (output === null || output === void 0) {
8
+ displayContent = "(no output)";
9
+ } else if (typeof output === "string") {
10
+ displayContent = output.length > 500 ? output.slice(0, 500) + "..." : output;
11
+ } else if (typeof output === "object") {
12
+ try {
13
+ const json = JSON.stringify(output, null, 2);
14
+ displayContent = json.length > 500 ? json.slice(0, 500) + "..." : json;
15
+ } catch {
16
+ displayContent = "[Object - cannot stringify]";
17
+ }
18
+ } else {
19
+ displayContent = String(output);
20
+ }
21
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, displayContent));
22
+ }
23
+ function ErrorToolResult({
24
+ error,
25
+ toolName
26
+ }) {
27
+ 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
+ }
30
+ function safeRenderToolResult(tool, output, options) {
31
+ if (!tool) {
32
+ return /* @__PURE__ */ React.createElement(DefaultToolResult, { output });
33
+ }
34
+ if (!tool.renderToolResultMessage) {
35
+ return /* @__PURE__ */ React.createElement(DefaultToolResult, { output });
36
+ }
37
+ try {
38
+ const rendered = tool.renderToolResultMessage(output, options);
39
+ if (rendered === null || rendered === void 0) {
40
+ return /* @__PURE__ */ React.createElement(DefaultToolResult, { output });
41
+ }
42
+ return rendered;
43
+ } catch (error) {
44
+ return /* @__PURE__ */ React.createElement(ErrorToolResult, { error, toolName: tool.name });
45
+ }
46
+ }
47
+ function safeRenderToolUseMessage(tool, input, options) {
48
+ if (!tool) {
49
+ return /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Unknown tool call"));
50
+ }
51
+ 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
+ }
54
+ try {
55
+ const rendered = tool.renderToolUseMessage(input, options);
56
+ if (rendered === null || rendered === void 0) {
57
+ return /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: "cyan" }, tool.name));
58
+ }
59
+ return rendered;
60
+ } catch (error) {
61
+ return /* @__PURE__ */ React.createElement(ErrorToolResult, { error, toolName: tool.name });
62
+ }
63
+ }
64
+ function safeRenderToolRejectedMessage(tool, ...args) {
65
+ if (!tool || !tool.renderToolUseRejectedMessage) {
66
+ return /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: "yellow" }, "Tool use rejected"));
67
+ }
68
+ try {
69
+ const rendered = tool.renderToolUseRejectedMessage(...args);
70
+ if (rendered === null || rendered === void 0) {
71
+ return /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: "yellow" }, tool.name, " rejected"));
72
+ }
73
+ return rendered;
74
+ } catch (error) {
75
+ return /* @__PURE__ */ React.createElement(ErrorToolResult, { error, toolName: tool.name });
76
+ }
77
+ }
78
+ function isValidReactNode(value) {
79
+ if (value === null || value === void 0) {
80
+ return true;
81
+ }
82
+ if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
83
+ return true;
84
+ }
85
+ if (Array.isArray(value)) {
86
+ return value.every(isValidReactNode);
87
+ }
88
+ if (typeof value === "object" && value !== null) {
89
+ return "$$typeof" in value || React.isValidElement(value);
90
+ }
91
+ return false;
92
+ }
93
+ function wrapRenderFunction(renderFn, fallback) {
94
+ return (...args) => {
95
+ try {
96
+ const result = renderFn(...args);
97
+ if (result === null || result === void 0) {
98
+ return fallback;
99
+ }
100
+ return result;
101
+ } catch {
102
+ return fallback;
103
+ }
104
+ };
105
+ }
106
+ export {
107
+ DefaultToolResult,
108
+ ErrorToolResult,
109
+ isValidReactNode,
110
+ safeRenderToolRejectedMessage,
111
+ safeRenderToolResult,
112
+ safeRenderToolUseMessage,
113
+ wrapRenderFunction
114
+ };
115
+ //# sourceMappingURL=safeRender.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 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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",
6
+ "names": []
7
+ }
@@ -0,0 +1,346 @@
1
+ import { randomUUID } from "crypto";
2
+ import * as fs from "fs";
3
+ import * as path from "path";
4
+ import { t, tSafe } from "../i18n/index.js";
5
+ var ErrorCategory = /* @__PURE__ */ ((ErrorCategory2) => {
6
+ ErrorCategory2["NETWORK_CONNECTION"] = "network_connection";
7
+ ErrorCategory2["NETWORK_TIMEOUT"] = "network_timeout";
8
+ ErrorCategory2["NETWORK_DNS"] = "network_dns";
9
+ ErrorCategory2["API_RATE_LIMIT"] = "api_rate_limit";
10
+ ErrorCategory2["API_AUTH"] = "api_auth";
11
+ ErrorCategory2["API_QUOTA"] = "api_quota";
12
+ ErrorCategory2["API_SERVER_ERROR"] = "api_server_error";
13
+ ErrorCategory2["API_INVALID_RESPONSE"] = "api_invalid_response";
14
+ ErrorCategory2["FILE_NOT_FOUND"] = "file_not_found";
15
+ ErrorCategory2["FILE_PERMISSION"] = "file_permission";
16
+ ErrorCategory2["FILE_TOO_LARGE"] = "file_too_large";
17
+ ErrorCategory2["FILE_ENCODING"] = "file_encoding";
18
+ ErrorCategory2["CONFIG_MISSING"] = "config_missing";
19
+ ErrorCategory2["CONFIG_INVALID"] = "config_invalid";
20
+ ErrorCategory2["CONFIG_API_KEY"] = "config_api_key";
21
+ ErrorCategory2["MODEL_UNAVAILABLE"] = "model_unavailable";
22
+ ErrorCategory2["MODEL_CONTEXT_LENGTH"] = "model_context_length";
23
+ ErrorCategory2["MODEL_CONTENT_FILTER"] = "model_content_filter";
24
+ ErrorCategory2["SYSTEM_MEMORY"] = "system_memory";
25
+ ErrorCategory2["SYSTEM_PROCESS"] = "system_process";
26
+ ErrorCategory2["UNKNOWN"] = "unknown";
27
+ return ErrorCategory2;
28
+ })(ErrorCategory || {});
29
+ const CATEGORY_TO_I18N_PREFIX = {
30
+ ["network_connection" /* NETWORK_CONNECTION */]: "friendlyError.networkConnection",
31
+ ["network_timeout" /* NETWORK_TIMEOUT */]: "friendlyError.networkTimeout",
32
+ ["network_dns" /* NETWORK_DNS */]: "friendlyError.networkDns",
33
+ ["api_rate_limit" /* API_RATE_LIMIT */]: "friendlyError.apiRateLimit",
34
+ ["api_auth" /* API_AUTH */]: "friendlyError.apiAuth",
35
+ ["api_quota" /* API_QUOTA */]: "friendlyError.apiQuota",
36
+ ["api_server_error" /* API_SERVER_ERROR */]: "friendlyError.apiServerError",
37
+ ["api_invalid_response" /* API_INVALID_RESPONSE */]: "friendlyError.apiInvalidResponse",
38
+ ["file_not_found" /* FILE_NOT_FOUND */]: "friendlyError.fileNotFound",
39
+ ["file_permission" /* FILE_PERMISSION */]: "friendlyError.filePermission",
40
+ ["file_too_large" /* FILE_TOO_LARGE */]: "friendlyError.fileTooLarge",
41
+ ["file_encoding" /* FILE_ENCODING */]: "friendlyError.fileEncoding",
42
+ ["config_missing" /* CONFIG_MISSING */]: "friendlyError.configMissing",
43
+ ["config_invalid" /* CONFIG_INVALID */]: "friendlyError.configInvalid",
44
+ ["config_api_key" /* CONFIG_API_KEY */]: "friendlyError.configApiKey",
45
+ ["model_unavailable" /* MODEL_UNAVAILABLE */]: "friendlyError.modelUnavailable",
46
+ ["model_context_length" /* MODEL_CONTEXT_LENGTH */]: "friendlyError.modelContextLength",
47
+ ["model_content_filter" /* MODEL_CONTENT_FILTER */]: "friendlyError.modelContentFilter",
48
+ ["system_memory" /* SYSTEM_MEMORY */]: "friendlyError.systemMemory",
49
+ ["system_process" /* SYSTEM_PROCESS */]: "friendlyError.systemProcess",
50
+ ["unknown" /* UNKNOWN */]: "friendlyError.unknown"
51
+ };
52
+ function getFriendlyMessage(category) {
53
+ const prefix = CATEGORY_TO_I18N_PREFIX[category];
54
+ const suggestions = [];
55
+ for (let i = 1; i <= 3; i++) {
56
+ const suggestion = tSafe(`${prefix}.suggestion${i}`);
57
+ if (suggestion) {
58
+ suggestions.push(suggestion);
59
+ }
60
+ }
61
+ return {
62
+ title: tSafe(`${prefix}.title`) || category,
63
+ description: tSafe(`${prefix}.description`) || "",
64
+ suggestions
65
+ };
66
+ }
67
+ const FRIENDLY_MESSAGES = Object.fromEntries(
68
+ Object.values(ErrorCategory).map((category) => [
69
+ category,
70
+ getFriendlyMessage(category)
71
+ ])
72
+ );
73
+ const ERROR_PATTERNS = [
74
+ // Network errors
75
+ {
76
+ category: "network_connection" /* NETWORK_CONNECTION */,
77
+ patterns: [
78
+ "socket.*closed",
79
+ "ECONNREFUSED",
80
+ "ECONNRESET",
81
+ "ENOTFOUND",
82
+ "connection.*refused",
83
+ "connection.*closed",
84
+ "network.*error",
85
+ "fetch failed"
86
+ ]
87
+ },
88
+ {
89
+ category: "network_timeout" /* NETWORK_TIMEOUT */,
90
+ patterns: [
91
+ "timeout",
92
+ "ETIMEDOUT",
93
+ "timed out",
94
+ "deadline exceeded",
95
+ "request.*timeout"
96
+ ]
97
+ },
98
+ {
99
+ category: "network_dns" /* NETWORK_DNS */,
100
+ patterns: ["ENOTFOUND", "getaddrinfo", "DNS", "resolve.*failed"]
101
+ },
102
+ // API errors
103
+ {
104
+ category: "api_rate_limit" /* API_RATE_LIMIT */,
105
+ patterns: ["rate.*limit", "429", "too many requests", "quota.*exceeded"]
106
+ },
107
+ {
108
+ category: "api_auth" /* API_AUTH */,
109
+ patterns: [
110
+ "401",
111
+ "unauthorized",
112
+ "authentication.*failed",
113
+ "invalid.*key",
114
+ "api.*key.*invalid"
115
+ ]
116
+ },
117
+ {
118
+ category: "api_quota" /* API_QUOTA */,
119
+ patterns: [
120
+ "insufficient.*quota",
121
+ "billing",
122
+ "credit",
123
+ "exceeded.*quota",
124
+ "402"
125
+ ]
126
+ },
127
+ {
128
+ category: "api_server_error" /* API_SERVER_ERROR */,
129
+ patterns: ["500", "502", "503", "504", "internal.*error", "server.*error"]
130
+ },
131
+ // File errors
132
+ {
133
+ category: "file_not_found" /* FILE_NOT_FOUND */,
134
+ patterns: ["ENOENT", "no such file", "file.*not.*found", "does not exist"]
135
+ },
136
+ {
137
+ category: "file_permission" /* FILE_PERMISSION */,
138
+ patterns: ["EACCES", "EPERM", "permission.*denied", "access.*denied"]
139
+ },
140
+ {
141
+ category: "file_too_large" /* FILE_TOO_LARGE */,
142
+ patterns: ["file.*too.*large", "EFBIG", "size.*limit"]
143
+ },
144
+ // Model errors
145
+ {
146
+ category: "model_context_length" /* MODEL_CONTEXT_LENGTH */,
147
+ patterns: [
148
+ "context.*length",
149
+ "token.*limit",
150
+ "max.*tokens",
151
+ "too.*long",
152
+ "exceeds.*maximum"
153
+ ]
154
+ },
155
+ {
156
+ category: "model_content_filter" /* MODEL_CONTENT_FILTER */,
157
+ patterns: ["content.*filter", "safety", "blocked", "moderation"]
158
+ },
159
+ {
160
+ category: "model_unavailable" /* MODEL_UNAVAILABLE */,
161
+ patterns: ["model.*not.*found", "model.*unavailable", "does not exist"]
162
+ },
163
+ // Config errors
164
+ {
165
+ category: "config_api_key" /* CONFIG_API_KEY */,
166
+ patterns: [
167
+ "api.*key.*not.*set",
168
+ "missing.*api.*key",
169
+ "ANTHROPIC_API_KEY",
170
+ "OPENAI_API_KEY"
171
+ ]
172
+ },
173
+ // System errors
174
+ {
175
+ category: "system_memory" /* SYSTEM_MEMORY */,
176
+ patterns: ["ENOMEM", "out of memory", "heap", "memory.*limit"]
177
+ }
178
+ ];
179
+ function classifyError(error) {
180
+ const errorString = getErrorString(error).toLowerCase();
181
+ for (const { category, patterns } of ERROR_PATTERNS) {
182
+ for (const pattern of patterns) {
183
+ if (typeof pattern === "string") {
184
+ if (errorString.includes(pattern.toLowerCase())) {
185
+ return category;
186
+ }
187
+ } else if (pattern.test(errorString)) {
188
+ return category;
189
+ }
190
+ }
191
+ }
192
+ return "unknown" /* UNKNOWN */;
193
+ }
194
+ function getErrorString(error) {
195
+ if (error instanceof Error) {
196
+ return `${error.name}: ${error.message} ${error.stack || ""}`;
197
+ }
198
+ return String(error);
199
+ }
200
+ class UserFriendlyError extends Error {
201
+ id;
202
+ category;
203
+ friendlyMessage;
204
+ originalError;
205
+ context;
206
+ timestamp;
207
+ constructor(originalError, context = {}, categoryOverride) {
208
+ const category = categoryOverride || classifyError(originalError);
209
+ const friendly = FRIENDLY_MESSAGES[category];
210
+ super(friendly.title);
211
+ this.name = "UserFriendlyError";
212
+ this.id = randomUUID().slice(0, 8);
213
+ this.category = category;
214
+ this.friendlyMessage = friendly;
215
+ this.originalError = originalError;
216
+ this.context = context;
217
+ this.timestamp = /* @__PURE__ */ new Date();
218
+ if (originalError instanceof Error && originalError.stack) {
219
+ this.stack = originalError.stack;
220
+ }
221
+ }
222
+ /**
223
+ * Get user-facing display message
224
+ */
225
+ getUserMessage() {
226
+ const message = getFriendlyMessage(this.category);
227
+ const suggestionLabel = t("friendlyError.suggestionLabel");
228
+ const errorIdLabel = t("friendlyError.errorIdLabel");
229
+ const lines = [
230
+ `\u26A0\uFE0F ${message.title}`,
231
+ "",
232
+ message.description,
233
+ "",
234
+ `\u{1F4A1} ${suggestionLabel}:`,
235
+ ...message.suggestions.map((s) => ` \u2022 ${s}`),
236
+ "",
237
+ `\u{1F4CB} ${errorIdLabel}: ${this.id}`
238
+ ];
239
+ return lines.join("\n");
240
+ }
241
+ /**
242
+ * Get technical message for developers
243
+ */
244
+ getTechnicalMessage() {
245
+ const original = this.originalError instanceof Error ? this.originalError.message : String(this.originalError);
246
+ return `[${this.category}] ${original}`;
247
+ }
248
+ /**
249
+ * Create structured log entry
250
+ */
251
+ toLogEntry() {
252
+ return {
253
+ id: this.id,
254
+ timestamp: this.timestamp.toISOString(),
255
+ category: this.category,
256
+ friendlyTitle: this.friendlyMessage.title,
257
+ technicalMessage: this.getTechnicalMessage(),
258
+ stack: this.stack,
259
+ context: this.context,
260
+ systemInfo: {
261
+ platform: process.platform,
262
+ nodeVersion: process.version,
263
+ mintoVersion: getMintoVersion()
264
+ }
265
+ };
266
+ }
267
+ }
268
+ let errorLogPath = null;
269
+ function getErrorLogPath() {
270
+ if (!errorLogPath) {
271
+ const logDir = path.join(process.env.HOME || "", ".minto", "logs");
272
+ errorLogPath = path.join(logDir, "errors.jsonl");
273
+ }
274
+ return errorLogPath;
275
+ }
276
+ function logUserFriendlyError(error) {
277
+ try {
278
+ const logPath = getErrorLogPath();
279
+ const logDir = path.dirname(logPath);
280
+ if (!fs.existsSync(logDir)) {
281
+ fs.mkdirSync(logDir, { recursive: true });
282
+ }
283
+ const entry = error.toLogEntry();
284
+ fs.appendFileSync(logPath, JSON.stringify(entry) + "\n");
285
+ } catch {
286
+ }
287
+ }
288
+ function getRecentErrors(limit = 10) {
289
+ try {
290
+ const logPath = getErrorLogPath();
291
+ if (!fs.existsSync(logPath)) {
292
+ return [];
293
+ }
294
+ const content = fs.readFileSync(logPath, "utf-8");
295
+ const lines = content.trim().split("\n").filter(Boolean);
296
+ const entries = lines.slice(-limit).map((line) => {
297
+ try {
298
+ return JSON.parse(line);
299
+ } catch {
300
+ return null;
301
+ }
302
+ }).filter((e) => e !== null);
303
+ return entries.reverse();
304
+ } catch {
305
+ return [];
306
+ }
307
+ }
308
+ function getMintoVersion() {
309
+ try {
310
+ const packageJsonPath = path.join(__dirname, "../../package.json");
311
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
312
+ return packageJson.version || "unknown";
313
+ } catch {
314
+ return "unknown";
315
+ }
316
+ }
317
+ function toUserFriendlyError(error, context) {
318
+ if (error instanceof UserFriendlyError) {
319
+ return error;
320
+ }
321
+ return new UserFriendlyError(error, context);
322
+ }
323
+ function formatErrorForUser(error, options = {}) {
324
+ const friendly = toUserFriendlyError(error, options.context);
325
+ logUserFriendlyError(friendly);
326
+ let message = friendly.getUserMessage();
327
+ if (options.showTechnical) {
328
+ const technicalLabel = t("friendlyError.technicalDetailsLabel");
329
+ message += `
330
+
331
+ \u{1F527} ${technicalLabel}: ${friendly.getTechnicalMessage()}`;
332
+ }
333
+ return message;
334
+ }
335
+ export {
336
+ ERROR_PATTERNS,
337
+ ErrorCategory,
338
+ FRIENDLY_MESSAGES,
339
+ UserFriendlyError,
340
+ classifyError,
341
+ formatErrorForUser,
342
+ getRecentErrors,
343
+ logUserFriendlyError,
344
+ toUserFriendlyError
345
+ };
346
+ //# sourceMappingURL=userFriendlyError.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/userFriendlyError.ts"],
4
+ "sourcesContent": ["/**\n * User-Friendly Error System\n *\n * Transforms technical errors into friendly messages for non-developer users.\n * Provides structured logging for debugging and optional cloud reporting.\n *\n * Design Philosophy:\n * - User layer: Simple, actionable messages in their language\n * - Developer layer: Full technical details for debugging\n * - Operations layer: Structured data for analysis and improvement\n */\n\nimport { randomUUID } from 'crypto'\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport { t, tSafe } from '@i18n/index'\n\n// ============================================================================\n// Error Categories\n// ============================================================================\n\n/**\n * High-level error categories that map to user-understandable concepts\n */\nexport enum ErrorCategory {\n // Network & Connectivity\n NETWORK_CONNECTION = 'network_connection', // Can't reach the server\n NETWORK_TIMEOUT = 'network_timeout', // Request took too long\n NETWORK_DNS = 'network_dns', // Can't find the server\n\n // API & Service\n API_RATE_LIMIT = 'api_rate_limit', // Too many requests\n API_AUTH = 'api_auth', // Authentication failed\n API_QUOTA = 'api_quota', // Usage quota exceeded\n API_SERVER_ERROR = 'api_server_error', // Server is having issues\n API_INVALID_RESPONSE = 'api_invalid_response', // Unexpected response\n\n // File & Storage\n FILE_NOT_FOUND = 'file_not_found', // File doesn't exist\n FILE_PERMISSION = 'file_permission', // Can't access file\n FILE_TOO_LARGE = 'file_too_large', // File is too big\n FILE_ENCODING = 'file_encoding', // Can't read file format\n\n // Configuration\n CONFIG_MISSING = 'config_missing', // Missing required setting\n CONFIG_INVALID = 'config_invalid', // Invalid setting value\n CONFIG_API_KEY = 'config_api_key', // API key issue\n\n // Model & AI\n MODEL_UNAVAILABLE = 'model_unavailable', // Model not accessible\n MODEL_CONTEXT_LENGTH = 'model_context_length', // Input too long\n MODEL_CONTENT_FILTER = 'model_content_filter', // Content blocked\n\n // System\n SYSTEM_MEMORY = 'system_memory', // Out of memory\n SYSTEM_PROCESS = 'system_process', // Process error\n\n // Unknown\n UNKNOWN = 'unknown', // Unclassified error\n}\n\n// ============================================================================\n// User-Friendly Messages (Multi-language support via i18n)\n// ============================================================================\n\ninterface FriendlyMessage {\n title: string\n description: string\n suggestions: string[]\n}\n\n/**\n * Maps error categories to i18n translation key prefixes\n */\nconst CATEGORY_TO_I18N_PREFIX: Record<ErrorCategory, string> = {\n [ErrorCategory.NETWORK_CONNECTION]: 'friendlyError.networkConnection',\n [ErrorCategory.NETWORK_TIMEOUT]: 'friendlyError.networkTimeout',\n [ErrorCategory.NETWORK_DNS]: 'friendlyError.networkDns',\n [ErrorCategory.API_RATE_LIMIT]: 'friendlyError.apiRateLimit',\n [ErrorCategory.API_AUTH]: 'friendlyError.apiAuth',\n [ErrorCategory.API_QUOTA]: 'friendlyError.apiQuota',\n [ErrorCategory.API_SERVER_ERROR]: 'friendlyError.apiServerError',\n [ErrorCategory.API_INVALID_RESPONSE]: 'friendlyError.apiInvalidResponse',\n [ErrorCategory.FILE_NOT_FOUND]: 'friendlyError.fileNotFound',\n [ErrorCategory.FILE_PERMISSION]: 'friendlyError.filePermission',\n [ErrorCategory.FILE_TOO_LARGE]: 'friendlyError.fileTooLarge',\n [ErrorCategory.FILE_ENCODING]: 'friendlyError.fileEncoding',\n [ErrorCategory.CONFIG_MISSING]: 'friendlyError.configMissing',\n [ErrorCategory.CONFIG_INVALID]: 'friendlyError.configInvalid',\n [ErrorCategory.CONFIG_API_KEY]: 'friendlyError.configApiKey',\n [ErrorCategory.MODEL_UNAVAILABLE]: 'friendlyError.modelUnavailable',\n [ErrorCategory.MODEL_CONTEXT_LENGTH]: 'friendlyError.modelContextLength',\n [ErrorCategory.MODEL_CONTENT_FILTER]: 'friendlyError.modelContentFilter',\n [ErrorCategory.SYSTEM_MEMORY]: 'friendlyError.systemMemory',\n [ErrorCategory.SYSTEM_PROCESS]: 'friendlyError.systemProcess',\n [ErrorCategory.UNKNOWN]: 'friendlyError.unknown',\n}\n\n/**\n * Get friendly message using i18n\n * Designed for non-technical users (analysts, researchers, writers, etc.)\n */\nfunction getFriendlyMessage(category: ErrorCategory): FriendlyMessage {\n const prefix = CATEGORY_TO_I18N_PREFIX[category]\n\n // Build suggestions array dynamically (use tSafe to avoid warnings for missing keys)\n const suggestions: string[] = []\n for (let i = 1; i <= 3; i++) {\n const suggestion = tSafe(`${prefix}.suggestion${i}`)\n if (suggestion) {\n suggestions.push(suggestion)\n }\n }\n\n return {\n title: tSafe(`${prefix}.title`) || category,\n description: tSafe(`${prefix}.description`) || '',\n suggestions,\n }\n}\n\n/**\n * Legacy FRIENDLY_MESSAGES for backward compatibility\n * @deprecated Use getFriendlyMessage() for i18n support\n */\nconst FRIENDLY_MESSAGES: Record<ErrorCategory, FriendlyMessage> =\n Object.fromEntries(\n Object.values(ErrorCategory).map(category => [\n category,\n getFriendlyMessage(category),\n ]),\n ) as Record<ErrorCategory, FriendlyMessage>\n\n// ============================================================================\n// Error Classification Logic\n// ============================================================================\n\ninterface ErrorPattern {\n category: ErrorCategory\n patterns: (string | RegExp)[]\n}\n\n/**\n * Patterns to classify raw errors into categories\n * Order matters - more specific patterns should come first\n */\nconst ERROR_PATTERNS: ErrorPattern[] = [\n // Network errors\n {\n category: ErrorCategory.NETWORK_CONNECTION,\n patterns: [\n 'socket.*closed',\n 'ECONNREFUSED',\n 'ECONNRESET',\n 'ENOTFOUND',\n 'connection.*refused',\n 'connection.*closed',\n 'network.*error',\n 'fetch failed',\n ],\n },\n {\n category: ErrorCategory.NETWORK_TIMEOUT,\n patterns: [\n 'timeout',\n 'ETIMEDOUT',\n 'timed out',\n 'deadline exceeded',\n 'request.*timeout',\n ],\n },\n {\n category: ErrorCategory.NETWORK_DNS,\n patterns: ['ENOTFOUND', 'getaddrinfo', 'DNS', 'resolve.*failed'],\n },\n\n // API errors\n {\n category: ErrorCategory.API_RATE_LIMIT,\n patterns: ['rate.*limit', '429', 'too many requests', 'quota.*exceeded'],\n },\n {\n category: ErrorCategory.API_AUTH,\n patterns: [\n '401',\n 'unauthorized',\n 'authentication.*failed',\n 'invalid.*key',\n 'api.*key.*invalid',\n ],\n },\n {\n category: ErrorCategory.API_QUOTA,\n patterns: [\n 'insufficient.*quota',\n 'billing',\n 'credit',\n 'exceeded.*quota',\n '402',\n ],\n },\n {\n category: ErrorCategory.API_SERVER_ERROR,\n patterns: ['500', '502', '503', '504', 'internal.*error', 'server.*error'],\n },\n\n // File errors\n {\n category: ErrorCategory.FILE_NOT_FOUND,\n patterns: ['ENOENT', 'no such file', 'file.*not.*found', 'does not exist'],\n },\n {\n category: ErrorCategory.FILE_PERMISSION,\n patterns: ['EACCES', 'EPERM', 'permission.*denied', 'access.*denied'],\n },\n {\n category: ErrorCategory.FILE_TOO_LARGE,\n patterns: ['file.*too.*large', 'EFBIG', 'size.*limit'],\n },\n\n // Model errors\n {\n category: ErrorCategory.MODEL_CONTEXT_LENGTH,\n patterns: [\n 'context.*length',\n 'token.*limit',\n 'max.*tokens',\n 'too.*long',\n 'exceeds.*maximum',\n ],\n },\n {\n category: ErrorCategory.MODEL_CONTENT_FILTER,\n patterns: ['content.*filter', 'safety', 'blocked', 'moderation'],\n },\n {\n category: ErrorCategory.MODEL_UNAVAILABLE,\n patterns: ['model.*not.*found', 'model.*unavailable', 'does not exist'],\n },\n\n // Config errors\n {\n category: ErrorCategory.CONFIG_API_KEY,\n patterns: [\n 'api.*key.*not.*set',\n 'missing.*api.*key',\n 'ANTHROPIC_API_KEY',\n 'OPENAI_API_KEY',\n ],\n },\n\n // System errors\n {\n category: ErrorCategory.SYSTEM_MEMORY,\n patterns: ['ENOMEM', 'out of memory', 'heap', 'memory.*limit'],\n },\n]\n\n/**\n * Classifies a raw error into a category\n */\nexport function classifyError(error: unknown): ErrorCategory {\n const errorString = getErrorString(error).toLowerCase()\n\n for (const { category, patterns } of ERROR_PATTERNS) {\n for (const pattern of patterns) {\n if (typeof pattern === 'string') {\n if (errorString.includes(pattern.toLowerCase())) {\n return category\n }\n } else if (pattern.test(errorString)) {\n return category\n }\n }\n }\n\n return ErrorCategory.UNKNOWN\n}\n\nfunction getErrorString(error: unknown): string {\n if (error instanceof Error) {\n return `${error.name}: ${error.message} ${error.stack || ''}`\n }\n return String(error)\n}\n\n// ============================================================================\n// User-Friendly Error Class\n// ============================================================================\n\nexport interface ErrorContext {\n /** Operation being performed (e.g., \"reading file\", \"calling API\") */\n operation?: string\n /** Model being used */\n model?: string\n /** File path involved */\n filePath?: string\n /** API endpoint */\n endpoint?: string\n /** Additional context */\n [key: string]: unknown\n}\n\nexport interface ErrorLogEntry {\n id: string\n timestamp: string\n category: ErrorCategory\n friendlyTitle: string\n technicalMessage: string\n stack?: string\n context: ErrorContext\n systemInfo: {\n platform: string\n nodeVersion: string\n mintoVersion: string\n }\n}\n\n/**\n * User-Friendly Error wrapper\n * Provides both user-facing messages and technical details\n */\nexport class UserFriendlyError extends Error {\n readonly id: string\n readonly category: ErrorCategory\n readonly friendlyMessage: FriendlyMessage\n readonly originalError: unknown\n readonly context: ErrorContext\n readonly timestamp: Date\n\n constructor(\n originalError: unknown,\n context: ErrorContext = {},\n categoryOverride?: ErrorCategory,\n ) {\n const category = categoryOverride || classifyError(originalError)\n const friendly = FRIENDLY_MESSAGES[category]\n\n super(friendly.title)\n this.name = 'UserFriendlyError'\n this.id = randomUUID().slice(0, 8)\n this.category = category\n this.friendlyMessage = friendly\n this.originalError = originalError\n this.context = context\n this.timestamp = new Date()\n\n // Preserve original stack\n if (originalError instanceof Error && originalError.stack) {\n this.stack = originalError.stack\n }\n }\n\n /**\n * Get user-facing display message\n */\n getUserMessage(): string {\n // Get fresh translations (in case language changed)\n const message = getFriendlyMessage(this.category)\n const suggestionLabel = t('friendlyError.suggestionLabel')\n const errorIdLabel = t('friendlyError.errorIdLabel')\n\n const lines = [\n `\u26A0\uFE0F ${message.title}`,\n '',\n message.description,\n '',\n `\uD83D\uDCA1 ${suggestionLabel}:`,\n ...message.suggestions.map(s => ` \u2022 ${s}`),\n '',\n `\uD83D\uDCCB ${errorIdLabel}: ${this.id}`,\n ]\n return lines.join('\\n')\n }\n\n /**\n * Get technical message for developers\n */\n getTechnicalMessage(): string {\n const original =\n this.originalError instanceof Error\n ? this.originalError.message\n : String(this.originalError)\n return `[${this.category}] ${original}`\n }\n\n /**\n * Create structured log entry\n */\n toLogEntry(): ErrorLogEntry {\n return {\n id: this.id,\n timestamp: this.timestamp.toISOString(),\n category: this.category,\n friendlyTitle: this.friendlyMessage.title,\n technicalMessage: this.getTechnicalMessage(),\n stack: this.stack,\n context: this.context,\n systemInfo: {\n platform: process.platform,\n nodeVersion: process.version,\n mintoVersion: getMintoVersion(),\n },\n }\n }\n}\n\n// ============================================================================\n// Error Logging\n// ============================================================================\n\nlet errorLogPath: string | null = null\n\nfunction getErrorLogPath(): string {\n if (!errorLogPath) {\n const logDir = path.join(process.env.HOME || '', '.minto', 'logs')\n errorLogPath = path.join(logDir, 'errors.jsonl')\n }\n return errorLogPath\n}\n\n/**\n * Log error to local file (JSONL format for easy analysis)\n */\nexport function logUserFriendlyError(error: UserFriendlyError): void {\n try {\n const logPath = getErrorLogPath()\n const logDir = path.dirname(logPath)\n\n // Ensure log directory exists\n if (!fs.existsSync(logDir)) {\n fs.mkdirSync(logDir, { recursive: true })\n }\n\n const entry = error.toLogEntry()\n fs.appendFileSync(logPath, JSON.stringify(entry) + '\\n')\n } catch {\n // Silent fail - don't let logging errors break the app\n }\n}\n\n/**\n * Get recent errors for debugging\n */\nexport function getRecentErrors(limit = 10): ErrorLogEntry[] {\n try {\n const logPath = getErrorLogPath()\n if (!fs.existsSync(logPath)) {\n return []\n }\n\n const content = fs.readFileSync(logPath, 'utf-8')\n const lines = content.trim().split('\\n').filter(Boolean)\n const entries = lines\n .slice(-limit)\n .map(line => {\n try {\n return JSON.parse(line) as ErrorLogEntry\n } catch {\n return null\n }\n })\n .filter((e): e is ErrorLogEntry => e !== null)\n\n return entries.reverse()\n } catch {\n return []\n }\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction getMintoVersion(): string {\n try {\n const packageJsonPath = path.join(__dirname, '../../package.json')\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'))\n return packageJson.version || 'unknown'\n } catch {\n return 'unknown'\n }\n}\n\n/**\n * Wrap any error into a UserFriendlyError\n */\nexport function toUserFriendlyError(\n error: unknown,\n context?: ErrorContext,\n): UserFriendlyError {\n if (error instanceof UserFriendlyError) {\n return error\n }\n return new UserFriendlyError(error, context)\n}\n\n/**\n * Format error for display to user\n * Returns the friendly message, optionally with technical details\n */\nexport function formatErrorForUser(\n error: unknown,\n options: { showTechnical?: boolean; context?: ErrorContext } = {},\n): string {\n const friendly = toUserFriendlyError(error, options.context)\n\n // Log the error\n logUserFriendlyError(friendly)\n\n let message = friendly.getUserMessage()\n\n if (options.showTechnical) {\n const technicalLabel = t('friendlyError.technicalDetailsLabel')\n message += `\\n\\n\uD83D\uDD27 ${technicalLabel}: ${friendly.getTechnicalMessage()}`\n }\n\n return message\n}\n\n// ============================================================================\n// Exports for Integration\n// ============================================================================\n\nexport { FRIENDLY_MESSAGES, ERROR_PATTERNS }\n"],
5
+ "mappings": "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",
6
+ "names": ["ErrorCategory"]
7
+ }
package/dist/version.js CHANGED
@@ -1,5 +1,5 @@
1
- const VERSION = "0.1.6";
2
- const BUILD_DATE = "2025-12-30T04:03:47.920Z";
1
+ const VERSION = "0.2.0";
2
+ const BUILD_DATE = "2026-01-30T12:44:29.956Z";
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.1.6'\nexport const BUILD_DATE = '2025-12-30T04:03:47.920Z'\n"],
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"],
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.1.6",
3
+ "version": "0.2.0",
4
4
  "bin": {
5
5
  "minto": "cli.js"
6
6
  },
@@ -27,7 +27,8 @@
27
27
  "scripts": {
28
28
  "dev": "bun run ./src/entrypoints/cli.tsx --verbose",
29
29
  "build": "node scripts/build.mjs",
30
- "clean": "rm -rf cli.js",
30
+ "build:packages": "node scripts/build-platform-packages.mjs",
31
+ "clean": "rm -rf cli.js binaries packages",
31
32
  "prepublishOnly": "node scripts/build.mjs && node scripts/prepublish-check.js",
32
33
  "postinstall": "node scripts/postinstall.js || true",
33
34
  "format": "prettier --write \"src/**/*.{ts,tsx,js,jsx,json}\"",
@@ -37,9 +38,17 @@
37
38
  "test": "cd tests && bun test",
38
39
  "typecheck": "tsc --noEmit",
39
40
  "prepare": "",
41
+ "publish:packages": "node scripts/publish-platform-packages.mjs",
40
42
  "publish:dev": "node scripts/publish-dev.js",
41
43
  "publish:release": "node scripts/publish-release.js"
42
44
  },
45
+ "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"
51
+ },
43
52
  "dependencies": {
44
53
  "@anthropic-ai/bedrock-sdk": "^0.12.6",
45
54
  "@anthropic-ai/sdk": "^0.39.0",
@@ -49,7 +58,6 @@
49
58
  "@modelcontextprotocol/sdk": "^1.15.1",
50
59
  "@types/lodash-es": "^4.17.12",
51
60
  "@types/react": "^19.1.8",
52
- "@within-7/minto": "0.1.5",
53
61
  "ansi-escapes": "^7.0.0",
54
62
  "chalk": "^5.4.1",
55
63
  "cli-highlight": "^2.1.11",
@@ -70,6 +78,7 @@
70
78
  "lodash-es": "^4.17.21",
71
79
  "lru-cache": "^11.1.0",
72
80
  "marked": "^15.0.12",
81
+ "minimatch": "10.1.1",
73
82
  "nanoid": "^5.1.5",
74
83
  "node-fetch": "^3.3.2",
75
84
  "node-html-parser": "^7.0.1",
@@ -92,6 +101,7 @@
92
101
  "devDependencies": {
93
102
  "@types/bun": "latest",
94
103
  "@types/jest": "^30.0.0",
104
+ "@types/minimatch": "6.0.0",
95
105
  "@types/node": "^24.1.0",
96
106
  "bun-types": "latest",
97
107
  "esbuild": "^0.25.9",
@@ -112,4 +122,4 @@
112
122
  "formdata-node": "^6.0.3",
113
123
  "node-domexception": "npm:domexception@^4.0.0"
114
124
  }
115
- }
125
+ }