@mragentix/cli 4.2.37
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.
- package/LICENSE +21 -0
- package/README.md +149 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +772 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +16 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +29 -0
- package/dist/config.js.map +1 -0
- package/dist/core/agent-session.d.ts +87 -0
- package/dist/core/agent-session.d.ts.map +1 -0
- package/dist/core/agent-session.js +498 -0
- package/dist/core/agent-session.js.map +1 -0
- package/dist/core/agents.d.ts +30 -0
- package/dist/core/agents.d.ts.map +1 -0
- package/dist/core/agents.js +91 -0
- package/dist/core/agents.js.map +1 -0
- package/dist/core/auth-storage.d.ts +35 -0
- package/dist/core/auth-storage.d.ts.map +1 -0
- package/dist/core/auth-storage.js +144 -0
- package/dist/core/auth-storage.js.map +1 -0
- package/dist/core/auto-update.d.ts +8 -0
- package/dist/core/auto-update.d.ts.map +1 -0
- package/dist/core/auto-update.js +152 -0
- package/dist/core/auto-update.js.map +1 -0
- package/dist/core/compaction/compactor.d.ts +69 -0
- package/dist/core/compaction/compactor.d.ts.map +1 -0
- package/dist/core/compaction/compactor.js +405 -0
- package/dist/core/compaction/compactor.js.map +1 -0
- package/dist/core/compaction/compactor.test.d.ts +2 -0
- package/dist/core/compaction/compactor.test.d.ts.map +1 -0
- package/dist/core/compaction/compactor.test.js +461 -0
- package/dist/core/compaction/compactor.test.js.map +1 -0
- package/dist/core/compaction/token-estimator.d.ts +10 -0
- package/dist/core/compaction/token-estimator.d.ts.map +1 -0
- package/dist/core/compaction/token-estimator.js +75 -0
- package/dist/core/compaction/token-estimator.js.map +1 -0
- package/dist/core/compaction/token-estimator.test.d.ts +2 -0
- package/dist/core/compaction/token-estimator.test.d.ts.map +1 -0
- package/dist/core/compaction/token-estimator.test.js +137 -0
- package/dist/core/compaction/token-estimator.test.js.map +1 -0
- package/dist/core/custom-commands.d.ts +13 -0
- package/dist/core/custom-commands.d.ts.map +1 -0
- package/dist/core/custom-commands.js +40 -0
- package/dist/core/custom-commands.js.map +1 -0
- package/dist/core/event-bus.d.ts +95 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/event-bus.js +99 -0
- package/dist/core/event-bus.js.map +1 -0
- package/dist/core/extensions/loader.d.ts +8 -0
- package/dist/core/extensions/loader.d.ts.map +1 -0
- package/dist/core/extensions/loader.js +48 -0
- package/dist/core/extensions/loader.js.map +1 -0
- package/dist/core/extensions/types.d.ts +19 -0
- package/dist/core/extensions/types.d.ts.map +1 -0
- package/dist/core/extensions/types.js +2 -0
- package/dist/core/extensions/types.js.map +1 -0
- package/dist/core/file-lock.d.ts +6 -0
- package/dist/core/file-lock.d.ts.map +1 -0
- package/dist/core/file-lock.js +76 -0
- package/dist/core/file-lock.js.map +1 -0
- package/dist/core/index.d.ts +14 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +13 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/logger.d.ts +26 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +132 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/mcp/client.d.ts +9 -0
- package/dist/core/mcp/client.d.ts.map +1 -0
- package/dist/core/mcp/client.js +126 -0
- package/dist/core/mcp/client.js.map +1 -0
- package/dist/core/mcp/defaults.d.ts +9 -0
- package/dist/core/mcp/defaults.d.ts.map +1 -0
- package/dist/core/mcp/defaults.js +47 -0
- package/dist/core/mcp/defaults.js.map +1 -0
- package/dist/core/mcp/index.d.ts +4 -0
- package/dist/core/mcp/index.d.ts.map +1 -0
- package/dist/core/mcp/index.js +3 -0
- package/dist/core/mcp/index.js.map +1 -0
- package/dist/core/mcp/types.d.ts +15 -0
- package/dist/core/mcp/types.d.ts.map +1 -0
- package/dist/core/mcp/types.js +2 -0
- package/dist/core/mcp/types.js.map +1 -0
- package/dist/core/model-registry.d.ts +25 -0
- package/dist/core/model-registry.d.ts.map +1 -0
- package/dist/core/model-registry.js +135 -0
- package/dist/core/model-registry.js.map +1 -0
- package/dist/core/oauth/anthropic.d.ts +4 -0
- package/dist/core/oauth/anthropic.d.ts.map +1 -0
- package/dist/core/oauth/anthropic.js +75 -0
- package/dist/core/oauth/anthropic.js.map +1 -0
- package/dist/core/oauth/openai.d.ts +4 -0
- package/dist/core/oauth/openai.d.ts.map +1 -0
- package/dist/core/oauth/openai.js +186 -0
- package/dist/core/oauth/openai.js.map +1 -0
- package/dist/core/oauth/pkce.d.ts +5 -0
- package/dist/core/oauth/pkce.d.ts.map +1 -0
- package/dist/core/oauth/pkce.js +17 -0
- package/dist/core/oauth/pkce.js.map +1 -0
- package/dist/core/oauth/types.d.ts +12 -0
- package/dist/core/oauth/types.d.ts.map +1 -0
- package/dist/core/oauth/types.js +2 -0
- package/dist/core/oauth/types.js.map +1 -0
- package/dist/core/process-manager.d.ts +30 -0
- package/dist/core/process-manager.d.ts.map +1 -0
- package/dist/core/process-manager.js +130 -0
- package/dist/core/process-manager.js.map +1 -0
- package/dist/core/prompt-commands.d.ts +14 -0
- package/dist/core/prompt-commands.d.ts.map +1 -0
- package/dist/core/prompt-commands.js +496 -0
- package/dist/core/prompt-commands.js.map +1 -0
- package/dist/core/session-manager.d.ts +112 -0
- package/dist/core/session-manager.d.ts.map +1 -0
- package/dist/core/session-manager.js +326 -0
- package/dist/core/session-manager.js.map +1 -0
- package/dist/core/settings-manager.d.ts +43 -0
- package/dist/core/settings-manager.d.ts.map +1 -0
- package/dist/core/settings-manager.js +64 -0
- package/dist/core/settings-manager.js.map +1 -0
- package/dist/core/skills.d.ts +23 -0
- package/dist/core/skills.d.ts.map +1 -0
- package/dist/core/skills.js +89 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/slash-commands.d.ts +35 -0
- package/dist/core/slash-commands.d.ts.map +1 -0
- package/dist/core/slash-commands.js +183 -0
- package/dist/core/slash-commands.js.map +1 -0
- package/dist/core/telegram.d.ts +94 -0
- package/dist/core/telegram.d.ts.map +1 -0
- package/dist/core/telegram.js +227 -0
- package/dist/core/telegram.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/interactive.d.ts +3 -0
- package/dist/interactive.d.ts.map +1 -0
- package/dist/interactive.js +173 -0
- package/dist/interactive.js.map +1 -0
- package/dist/modes/index.d.ts +3 -0
- package/dist/modes/index.d.ts.map +1 -0
- package/dist/modes/index.js +3 -0
- package/dist/modes/index.js.map +1 -0
- package/dist/modes/json-mode.d.ts +13 -0
- package/dist/modes/json-mode.d.ts.map +1 -0
- package/dist/modes/json-mode.js +74 -0
- package/dist/modes/json-mode.js.map +1 -0
- package/dist/modes/print-mode.d.ts +12 -0
- package/dist/modes/print-mode.d.ts.map +1 -0
- package/dist/modes/print-mode.js +49 -0
- package/dist/modes/print-mode.js.map +1 -0
- package/dist/modes/rpc-mode.d.ts +28 -0
- package/dist/modes/rpc-mode.d.ts.map +1 -0
- package/dist/modes/rpc-mode.js +145 -0
- package/dist/modes/rpc-mode.js.map +1 -0
- package/dist/modes/serve-mode.d.ts +21 -0
- package/dist/modes/serve-mode.d.ts.map +1 -0
- package/dist/modes/serve-mode.js +649 -0
- package/dist/modes/serve-mode.js.map +1 -0
- package/dist/session.d.ts +16 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +129 -0
- package/dist/session.js.map +1 -0
- package/dist/system-prompt.d.ts +6 -0
- package/dist/system-prompt.d.ts.map +1 -0
- package/dist/system-prompt.js +115 -0
- package/dist/system-prompt.js.map +1 -0
- package/dist/tools/bash.d.ts +13 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +165 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/edit-diff.d.ts +18 -0
- package/dist/tools/edit-diff.d.ts.map +1 -0
- package/dist/tools/edit-diff.js +92 -0
- package/dist/tools/edit-diff.js.map +1 -0
- package/dist/tools/edit.d.ts +11 -0
- package/dist/tools/edit.d.ts.map +1 -0
- package/dist/tools/edit.js +57 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/find.d.ts +9 -0
- package/dist/tools/find.d.ts.map +1 -0
- package/dist/tools/find.js +59 -0
- package/dist/tools/find.js.map +1 -0
- package/dist/tools/grep.d.ts +13 -0
- package/dist/tools/grep.d.ts.map +1 -0
- package/dist/tools/grep.js +121 -0
- package/dist/tools/grep.js.map +1 -0
- package/dist/tools/index.d.ts +30 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +50 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/ls.d.ts +10 -0
- package/dist/tools/ls.d.ts.map +1 -0
- package/dist/tools/ls.js +56 -0
- package/dist/tools/ls.js.map +1 -0
- package/dist/tools/operations.d.ts +39 -0
- package/dist/tools/operations.d.ts.map +1 -0
- package/dist/tools/operations.js +27 -0
- package/dist/tools/operations.js.map +1 -0
- package/dist/tools/path-utils.d.ts +7 -0
- package/dist/tools/path-utils.d.ts.map +1 -0
- package/dist/tools/path-utils.js +27 -0
- package/dist/tools/path-utils.js.map +1 -0
- package/dist/tools/read.d.ts +12 -0
- package/dist/tools/read.d.ts.map +1 -0
- package/dist/tools/read.js +113 -0
- package/dist/tools/read.js.map +1 -0
- package/dist/tools/subagent.d.ts +26 -0
- package/dist/tools/subagent.d.ts.map +1 -0
- package/dist/tools/subagent.js +210 -0
- package/dist/tools/subagent.js.map +1 -0
- package/dist/tools/task-output.d.ts +10 -0
- package/dist/tools/task-output.d.ts.map +1 -0
- package/dist/tools/task-output.js +33 -0
- package/dist/tools/task-output.js.map +1 -0
- package/dist/tools/task-stop.d.ts +9 -0
- package/dist/tools/task-stop.d.ts.map +1 -0
- package/dist/tools/task-stop.js +15 -0
- package/dist/tools/task-stop.js.map +1 -0
- package/dist/tools/tasks.d.ts +16 -0
- package/dist/tools/tasks.d.ts.map +1 -0
- package/dist/tools/tasks.js +132 -0
- package/dist/tools/tasks.js.map +1 -0
- package/dist/tools/truncate.d.ts +19 -0
- package/dist/tools/truncate.d.ts.map +1 -0
- package/dist/tools/truncate.js +59 -0
- package/dist/tools/truncate.js.map +1 -0
- package/dist/tools/truncate.test.d.ts +2 -0
- package/dist/tools/truncate.test.d.ts.map +1 -0
- package/dist/tools/truncate.test.js +100 -0
- package/dist/tools/truncate.test.js.map +1 -0
- package/dist/tools/web-fetch.d.ts +9 -0
- package/dist/tools/web-fetch.d.ts.map +1 -0
- package/dist/tools/web-fetch.js +97 -0
- package/dist/tools/web-fetch.js.map +1 -0
- package/dist/tools/write.d.ts +10 -0
- package/dist/tools/write.d.ts.map +1 -0
- package/dist/tools/write.js +30 -0
- package/dist/tools/write.js.map +1 -0
- package/dist/tools/write.test.d.ts +2 -0
- package/dist/tools/write.test.d.ts.map +1 -0
- package/dist/tools/write.test.js +84 -0
- package/dist/tools/write.test.js.map +1 -0
- package/dist/types.d.ts +36 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/App.d.ts +148 -0
- package/dist/ui/App.d.ts.map +1 -0
- package/dist/ui/App.js +1191 -0
- package/dist/ui/App.js.map +1 -0
- package/dist/ui/components/ActivityIndicator.d.ts +13 -0
- package/dist/ui/components/ActivityIndicator.d.ts.map +1 -0
- package/dist/ui/components/ActivityIndicator.js +313 -0
- package/dist/ui/components/ActivityIndicator.js.map +1 -0
- package/dist/ui/components/AnimationContext.d.ts +22 -0
- package/dist/ui/components/AnimationContext.d.ts.map +1 -0
- package/dist/ui/components/AnimationContext.js +35 -0
- package/dist/ui/components/AnimationContext.js.map +1 -0
- package/dist/ui/components/AssistantMessage.d.ts +9 -0
- package/dist/ui/components/AssistantMessage.d.ts.map +1 -0
- package/dist/ui/components/AssistantMessage.js +11 -0
- package/dist/ui/components/AssistantMessage.js.map +1 -0
- package/dist/ui/components/BackgroundTasksBar.d.ts +15 -0
- package/dist/ui/components/BackgroundTasksBar.d.ts.map +1 -0
- package/dist/ui/components/BackgroundTasksBar.js +74 -0
- package/dist/ui/components/BackgroundTasksBar.js.map +1 -0
- package/dist/ui/components/Banner.d.ts +11 -0
- package/dist/ui/components/Banner.d.ts.map +1 -0
- package/dist/ui/components/Banner.js +55 -0
- package/dist/ui/components/Banner.js.map +1 -0
- package/dist/ui/components/CompactionNotice.d.ts +10 -0
- package/dist/ui/components/CompactionNotice.d.ts.map +1 -0
- package/dist/ui/components/CompactionNotice.js +27 -0
- package/dist/ui/components/CompactionNotice.js.map +1 -0
- package/dist/ui/components/DiffView.d.ts +4 -0
- package/dist/ui/components/DiffView.d.ts.map +1 -0
- package/dist/ui/components/DiffView.js +20 -0
- package/dist/ui/components/DiffView.js.map +1 -0
- package/dist/ui/components/Footer.d.ts +10 -0
- package/dist/ui/components/Footer.d.ts.map +1 -0
- package/dist/ui/components/Footer.js +105 -0
- package/dist/ui/components/Footer.js.map +1 -0
- package/dist/ui/components/InputArea.d.ts +21 -0
- package/dist/ui/components/InputArea.d.ts.map +1 -0
- package/dist/ui/components/InputArea.js +465 -0
- package/dist/ui/components/InputArea.js.map +1 -0
- package/dist/ui/components/Markdown.d.ts +9 -0
- package/dist/ui/components/Markdown.d.ts.map +1 -0
- package/dist/ui/components/Markdown.js +246 -0
- package/dist/ui/components/Markdown.js.map +1 -0
- package/dist/ui/components/ModelSelector.d.ts +11 -0
- package/dist/ui/components/ModelSelector.d.ts.map +1 -0
- package/dist/ui/components/ModelSelector.js +20 -0
- package/dist/ui/components/ModelSelector.js.map +1 -0
- package/dist/ui/components/Overlay.d.ts +8 -0
- package/dist/ui/components/Overlay.d.ts.map +1 -0
- package/dist/ui/components/Overlay.js +9 -0
- package/dist/ui/components/Overlay.js.map +1 -0
- package/dist/ui/components/SelectList.d.ts +14 -0
- package/dist/ui/components/SelectList.d.ts.map +1 -0
- package/dist/ui/components/SelectList.js +46 -0
- package/dist/ui/components/SelectList.js.map +1 -0
- package/dist/ui/components/ServerToolExecution.d.ts +17 -0
- package/dist/ui/components/ServerToolExecution.d.ts.map +1 -0
- package/dist/ui/components/ServerToolExecution.js +26 -0
- package/dist/ui/components/ServerToolExecution.js.map +1 -0
- package/dist/ui/components/SessionSelector.d.ts +9 -0
- package/dist/ui/components/SessionSelector.d.ts.map +1 -0
- package/dist/ui/components/SessionSelector.js +13 -0
- package/dist/ui/components/SessionSelector.js.map +1 -0
- package/dist/ui/components/SettingsSelector.d.ts +9 -0
- package/dist/ui/components/SettingsSelector.d.ts.map +1 -0
- package/dist/ui/components/SettingsSelector.js +13 -0
- package/dist/ui/components/SettingsSelector.js.map +1 -0
- package/dist/ui/components/SlashCommandMenu.d.ts +15 -0
- package/dist/ui/components/SlashCommandMenu.d.ts.map +1 -0
- package/dist/ui/components/SlashCommandMenu.js +32 -0
- package/dist/ui/components/SlashCommandMenu.js.map +1 -0
- package/dist/ui/components/Spinner.d.ts +4 -0
- package/dist/ui/components/Spinner.d.ts.map +1 -0
- package/dist/ui/components/Spinner.js +13 -0
- package/dist/ui/components/Spinner.js.map +1 -0
- package/dist/ui/components/StreamingArea.d.ts +10 -0
- package/dist/ui/components/StreamingArea.d.ts.map +1 -0
- package/dist/ui/components/StreamingArea.js +58 -0
- package/dist/ui/components/StreamingArea.js.map +1 -0
- package/dist/ui/components/SubAgentPanel.d.ts +21 -0
- package/dist/ui/components/SubAgentPanel.d.ts.map +1 -0
- package/dist/ui/components/SubAgentPanel.js +71 -0
- package/dist/ui/components/SubAgentPanel.js.map +1 -0
- package/dist/ui/components/TaskOverlay.d.ts +10 -0
- package/dist/ui/components/TaskOverlay.d.ts.map +1 -0
- package/dist/ui/components/TaskOverlay.js +263 -0
- package/dist/ui/components/TaskOverlay.js.map +1 -0
- package/dist/ui/components/ThinkingBlock.d.ts +11 -0
- package/dist/ui/components/ThinkingBlock.d.ts.map +1 -0
- package/dist/ui/components/ThinkingBlock.js +43 -0
- package/dist/ui/components/ThinkingBlock.js.map +1 -0
- package/dist/ui/components/ThinkingIndicator.d.ts +6 -0
- package/dist/ui/components/ThinkingIndicator.d.ts.map +1 -0
- package/dist/ui/components/ThinkingIndicator.js +144 -0
- package/dist/ui/components/ThinkingIndicator.js.map +1 -0
- package/dist/ui/components/ToolExecution.d.ts +16 -0
- package/dist/ui/components/ToolExecution.d.ts.map +1 -0
- package/dist/ui/components/ToolExecution.js +490 -0
- package/dist/ui/components/ToolExecution.js.map +1 -0
- package/dist/ui/components/ToolGroupExecution.d.ts +7 -0
- package/dist/ui/components/ToolGroupExecution.d.ts.map +1 -0
- package/dist/ui/components/ToolGroupExecution.js +115 -0
- package/dist/ui/components/ToolGroupExecution.js.map +1 -0
- package/dist/ui/components/UserMessage.d.ts +7 -0
- package/dist/ui/components/UserMessage.d.ts.map +1 -0
- package/dist/ui/components/UserMessage.js +16 -0
- package/dist/ui/components/UserMessage.js.map +1 -0
- package/dist/ui/components/index.d.ts +15 -0
- package/dist/ui/components/index.d.ts.map +1 -0
- package/dist/ui/components/index.js +15 -0
- package/dist/ui/components/index.js.map +1 -0
- package/dist/ui/hooks/useAgentLoop.d.ts +69 -0
- package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -0
- package/dist/ui/hooks/useAgentLoop.js +483 -0
- package/dist/ui/hooks/useAgentLoop.js.map +1 -0
- package/dist/ui/hooks/useSessionManager.d.ts +13 -0
- package/dist/ui/hooks/useSessionManager.d.ts.map +1 -0
- package/dist/ui/hooks/useSessionManager.js +43 -0
- package/dist/ui/hooks/useSessionManager.js.map +1 -0
- package/dist/ui/hooks/useSlashCommands.d.ts +7 -0
- package/dist/ui/hooks/useSlashCommands.d.ts.map +1 -0
- package/dist/ui/hooks/useSlashCommands.js +11 -0
- package/dist/ui/hooks/useSlashCommands.js.map +1 -0
- package/dist/ui/hooks/useTerminalSize.d.ts +20 -0
- package/dist/ui/hooks/useTerminalSize.d.ts.map +1 -0
- package/dist/ui/hooks/useTerminalSize.js +55 -0
- package/dist/ui/hooks/useTerminalSize.js.map +1 -0
- package/dist/ui/hooks/useTerminalTitle.d.ts +3 -0
- package/dist/ui/hooks/useTerminalTitle.d.ts.map +1 -0
- package/dist/ui/hooks/useTerminalTitle.js +41 -0
- package/dist/ui/hooks/useTerminalTitle.js.map +1 -0
- package/dist/ui/live-item-flush.d.ts +59 -0
- package/dist/ui/live-item-flush.d.ts.map +1 -0
- package/dist/ui/live-item-flush.js +135 -0
- package/dist/ui/live-item-flush.js.map +1 -0
- package/dist/ui/live-item-flush.test.d.ts +2 -0
- package/dist/ui/live-item-flush.test.d.ts.map +1 -0
- package/dist/ui/live-item-flush.test.js +307 -0
- package/dist/ui/live-item-flush.test.js.map +1 -0
- package/dist/ui/login.d.ts +3 -0
- package/dist/ui/login.d.ts.map +1 -0
- package/dist/ui/login.js +117 -0
- package/dist/ui/login.js.map +1 -0
- package/dist/ui/render.d.ts +38 -0
- package/dist/ui/render.d.ts.map +1 -0
- package/dist/ui/render.js +72 -0
- package/dist/ui/render.js.map +1 -0
- package/dist/ui/sessions.d.ts +2 -0
- package/dist/ui/sessions.d.ts.map +1 -0
- package/dist/ui/sessions.js +208 -0
- package/dist/ui/sessions.js.map +1 -0
- package/dist/ui/spinner-frames.d.ts +3 -0
- package/dist/ui/spinner-frames.d.ts.map +1 -0
- package/dist/ui/spinner-frames.js +7 -0
- package/dist/ui/spinner-frames.js.map +1 -0
- package/dist/ui/theme/dark.json +24 -0
- package/dist/ui/theme/detect-theme.d.ts +12 -0
- package/dist/ui/theme/detect-theme.d.ts.map +1 -0
- package/dist/ui/theme/detect-theme.js +152 -0
- package/dist/ui/theme/detect-theme.js.map +1 -0
- package/dist/ui/theme/light.json +24 -0
- package/dist/ui/theme/theme.d.ts +29 -0
- package/dist/ui/theme/theme.d.ts.map +1 -0
- package/dist/ui/theme/theme.js +11 -0
- package/dist/ui/theme/theme.js.map +1 -0
- package/dist/ui/utils/highlight.d.ts +8 -0
- package/dist/ui/utils/highlight.d.ts.map +1 -0
- package/dist/ui/utils/highlight.js +49 -0
- package/dist/ui/utils/highlight.js.map +1 -0
- package/dist/ui/utils/table-text.d.ts +25 -0
- package/dist/ui/utils/table-text.d.ts.map +1 -0
- package/dist/ui/utils/table-text.js +78 -0
- package/dist/ui/utils/table-text.js.map +1 -0
- package/dist/ui/utils/table-text.test.d.ts +2 -0
- package/dist/ui/utils/table-text.test.d.ts.map +1 -0
- package/dist/ui/utils/table-text.test.js +202 -0
- package/dist/ui/utils/table-text.test.js.map +1 -0
- package/dist/utils/error-handler.d.ts +5 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +120 -0
- package/dist/utils/error-handler.js.map +1 -0
- package/dist/utils/format.d.ts +21 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +120 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/git.d.ts +2 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +13 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/image.d.ts +30 -0
- package/dist/utils/image.d.ts.map +1 -0
- package/dist/utils/image.js +231 -0
- package/dist/utils/image.js.map +1 -0
- package/dist/utils/markdown.d.ts +6 -0
- package/dist/utils/markdown.d.ts.map +1 -0
- package/dist/utils/markdown.js +25 -0
- package/dist/utils/markdown.js.map +1 -0
- package/dist/utils/process.d.ts +6 -0
- package/dist/utils/process.d.ts.map +1 -0
- package/dist/utils/process.js +19 -0
- package/dist/utils/process.js.map +1 -0
- package/dist/utils/shell.d.ts +3 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +8 -0
- package/dist/utils/shell.js.map +1 -0
- package/dist/utils/sound.d.ts +2 -0
- package/dist/utils/sound.d.ts.map +1 -0
- package/dist/utils/sound.js +11 -0
- package/dist/utils/sound.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../src/utils/error-handler.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CA4GpD"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
/**
|
|
3
|
+
* Convert raw errors into clean, user-friendly one-liners.
|
|
4
|
+
*/
|
|
5
|
+
export function formatUserError(err) {
|
|
6
|
+
if (err instanceof Error && err.name === "AbortError") {
|
|
7
|
+
return chalk.red("Interrupted.");
|
|
8
|
+
}
|
|
9
|
+
const { message, provider, statusCode } = extractErrorInfo(err);
|
|
10
|
+
const lowerMsg = message.toLowerCase();
|
|
11
|
+
// Auth: not logged in
|
|
12
|
+
if (lowerMsg.includes("not logged in") ||
|
|
13
|
+
lowerMsg.includes("resolve authentication") ||
|
|
14
|
+
lowerMsg.includes("api key") ||
|
|
15
|
+
lowerMsg.includes("apikey") ||
|
|
16
|
+
lowerMsg.includes("no auth")) {
|
|
17
|
+
return chalk.red('Not logged in. Run "mragentix login" to authenticate.');
|
|
18
|
+
}
|
|
19
|
+
// Auth: invalid/expired token
|
|
20
|
+
if (statusCode === 401 ||
|
|
21
|
+
lowerMsg.includes("unauthorized") ||
|
|
22
|
+
/invalid.*key/.test(lowerMsg) ||
|
|
23
|
+
/invalid.*token/.test(lowerMsg)) {
|
|
24
|
+
return chalk.red('Session expired or invalid. Run "mragentix login" to re-authenticate.');
|
|
25
|
+
}
|
|
26
|
+
// Billing/quota errors (GLM returns 429 for these)
|
|
27
|
+
if (lowerMsg.includes("insufficient balance") ||
|
|
28
|
+
lowerMsg.includes("no resource package") ||
|
|
29
|
+
lowerMsg.includes("quota exceeded") ||
|
|
30
|
+
lowerMsg.includes("recharge")) {
|
|
31
|
+
const name = displayProvider(provider);
|
|
32
|
+
return chalk.red(`${name} reports a billing or quota issue. Check your account balance or resource package.`);
|
|
33
|
+
}
|
|
34
|
+
// Rate limiting
|
|
35
|
+
if (statusCode === 429 || lowerMsg.includes("rate limit")) {
|
|
36
|
+
const name = displayProvider(provider);
|
|
37
|
+
return chalk.red(`Rate limited by ${name}. Wait a moment and try again.`);
|
|
38
|
+
}
|
|
39
|
+
// Server errors (5xx)
|
|
40
|
+
if (statusCode && statusCode >= 500 && statusCode < 600) {
|
|
41
|
+
const name = displayProvider(provider);
|
|
42
|
+
return chalk.red(`${name} server error (${statusCode}). Try again shortly.`);
|
|
43
|
+
}
|
|
44
|
+
// Network errors
|
|
45
|
+
if (lowerMsg.includes("econnrefused") ||
|
|
46
|
+
lowerMsg.includes("fetch failed") ||
|
|
47
|
+
lowerMsg.includes("enotfound") ||
|
|
48
|
+
lowerMsg.includes("etimedout") ||
|
|
49
|
+
lowerMsg.includes("network")) {
|
|
50
|
+
const name = displayProvider(provider);
|
|
51
|
+
return chalk.red(`Cannot reach ${name} API. Check your internet connection.`);
|
|
52
|
+
}
|
|
53
|
+
// Model not found (404) — provider says the model doesn't exist or account lacks access
|
|
54
|
+
if (statusCode === 404 ||
|
|
55
|
+
lowerMsg.includes("model_not_found") ||
|
|
56
|
+
lowerMsg.includes("does not exist") ||
|
|
57
|
+
/model.*not.*exist/.test(lowerMsg) ||
|
|
58
|
+
/not have access.*model/.test(lowerMsg)) {
|
|
59
|
+
const name = displayProvider(provider);
|
|
60
|
+
const modelMatch = message.match(/model[:\s]+["']?([^\s"',)]+)/i);
|
|
61
|
+
const modelHint = modelMatch ? ` (${modelMatch[1]})` : "";
|
|
62
|
+
return chalk.red(`${name} does not recognize the requested model${modelHint}. It may not exist or your account may not have access. Check the model name and your account permissions.`);
|
|
63
|
+
}
|
|
64
|
+
// Bad request (400)
|
|
65
|
+
if (statusCode === 400) {
|
|
66
|
+
const name = displayProvider(provider);
|
|
67
|
+
const firstLine = message.split("\n")[0];
|
|
68
|
+
return chalk.red(`Request error (${name}): ${firstLine}`);
|
|
69
|
+
}
|
|
70
|
+
// File not found
|
|
71
|
+
if (lowerMsg.includes("enoent")) {
|
|
72
|
+
const path = extractPath(message);
|
|
73
|
+
return chalk.red(path ? `File not found: ${path}` : "File not found.");
|
|
74
|
+
}
|
|
75
|
+
// Permission denied
|
|
76
|
+
if (lowerMsg.includes("eacces")) {
|
|
77
|
+
const path = extractPath(message);
|
|
78
|
+
return chalk.red(path ? `Permission denied: ${path}` : "Permission denied.");
|
|
79
|
+
}
|
|
80
|
+
// Generic Error — show first line only, no stack
|
|
81
|
+
if (message) {
|
|
82
|
+
const firstLine = message.split("\n")[0];
|
|
83
|
+
return chalk.red(`Error: ${firstLine}`);
|
|
84
|
+
}
|
|
85
|
+
return chalk.red("An unexpected error occurred.");
|
|
86
|
+
}
|
|
87
|
+
function extractErrorInfo(err) {
|
|
88
|
+
if (typeof err !== "object" || err === null) {
|
|
89
|
+
return { message: String(err), provider: undefined, statusCode: undefined };
|
|
90
|
+
}
|
|
91
|
+
const e = err;
|
|
92
|
+
const message = typeof e.message === "string" ? e.message : String(err);
|
|
93
|
+
const provider = typeof e.provider === "string" ? e.provider : undefined;
|
|
94
|
+
const statusCode = typeof e.statusCode === "number"
|
|
95
|
+
? e.statusCode
|
|
96
|
+
: typeof e.status === "number"
|
|
97
|
+
? e.status
|
|
98
|
+
: undefined;
|
|
99
|
+
return { message, provider, statusCode };
|
|
100
|
+
}
|
|
101
|
+
function displayProvider(provider) {
|
|
102
|
+
switch (provider) {
|
|
103
|
+
case "anthropic":
|
|
104
|
+
return "Anthropic";
|
|
105
|
+
case "openai":
|
|
106
|
+
return "OpenAI";
|
|
107
|
+
case "glm":
|
|
108
|
+
return "Z.AI (GLM)";
|
|
109
|
+
case "moonshot":
|
|
110
|
+
return "Moonshot";
|
|
111
|
+
default:
|
|
112
|
+
return "The provider";
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
function extractPath(message) {
|
|
116
|
+
// Match common ENOENT/EACCES patterns: "... 'path'" or "... \"path\""
|
|
117
|
+
const match = message.match(/['"]([^'"]+)['"]/);
|
|
118
|
+
return match?.[1];
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=error-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/utils/error-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Format tool call start for display.
|
|
3
|
+
*/
|
|
4
|
+
export declare function formatToolCallStart(name: string, args: Record<string, unknown>): string;
|
|
5
|
+
/**
|
|
6
|
+
* Format tool call end for display.
|
|
7
|
+
*/
|
|
8
|
+
export declare function formatToolCallEnd(name: string, result: string, isError: boolean, durationMs: number): string;
|
|
9
|
+
/**
|
|
10
|
+
* Format token usage for display.
|
|
11
|
+
*/
|
|
12
|
+
export declare function formatUsage(inputTokens: number, outputTokens: number): string;
|
|
13
|
+
/**
|
|
14
|
+
* Format an error for display.
|
|
15
|
+
*/
|
|
16
|
+
export declare function formatError(error: Error): string;
|
|
17
|
+
/**
|
|
18
|
+
* Format the welcome banner.
|
|
19
|
+
*/
|
|
20
|
+
export declare function formatWelcome(model: string, provider: string, cwd: string): string;
|
|
21
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAGvF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,GACjB,MAAM,CAQR;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAEhD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAWlF"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { formatUserError } from "./error-handler.js";
|
|
3
|
+
/**
|
|
4
|
+
* Format tool call start for display.
|
|
5
|
+
*/
|
|
6
|
+
export function formatToolCallStart(name, args) {
|
|
7
|
+
const argsStr = formatArgs(name, args);
|
|
8
|
+
return chalk.dim(` ● ${name}${argsStr}`);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Format tool call end for display.
|
|
12
|
+
*/
|
|
13
|
+
export function formatToolCallEnd(name, result, isError, durationMs) {
|
|
14
|
+
const duration = chalk.dim(`(${formatDuration(durationMs)})`);
|
|
15
|
+
const summary = summarizeResult(name, result, isError);
|
|
16
|
+
if (isError) {
|
|
17
|
+
return chalk.red(` ✗ ${name} ${duration} — ${summary}`);
|
|
18
|
+
}
|
|
19
|
+
return chalk.dim(` ✓ ${name} ${duration} — ${summary}`);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Format token usage for display.
|
|
23
|
+
*/
|
|
24
|
+
export function formatUsage(inputTokens, outputTokens) {
|
|
25
|
+
return chalk.dim(` tokens: ${formatNumber(inputTokens)} in / ${formatNumber(outputTokens)} out`);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Format an error for display.
|
|
29
|
+
*/
|
|
30
|
+
export function formatError(error) {
|
|
31
|
+
return formatUserError(error);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Format the welcome banner.
|
|
35
|
+
*/
|
|
36
|
+
export function formatWelcome(model, provider, cwd) {
|
|
37
|
+
const lines = [
|
|
38
|
+
chalk.bold("mragentix"),
|
|
39
|
+
chalk.dim(` model: ${model}`),
|
|
40
|
+
chalk.dim(` provider: ${provider}`),
|
|
41
|
+
chalk.dim(` cwd: ${cwd}`),
|
|
42
|
+
"",
|
|
43
|
+
chalk.dim(" Type your message and press Enter. Ctrl+D to exit."),
|
|
44
|
+
"",
|
|
45
|
+
];
|
|
46
|
+
return lines.join("\n");
|
|
47
|
+
}
|
|
48
|
+
// ── Helpers ──────────────────────────────────────────────────
|
|
49
|
+
function formatArgs(name, args) {
|
|
50
|
+
switch (name) {
|
|
51
|
+
case "bash": {
|
|
52
|
+
const cmd = String(args.command ?? "");
|
|
53
|
+
const short = cmd.length > 80 ? cmd.slice(0, 77) + "..." : cmd;
|
|
54
|
+
return ` ${chalk.dim(short)}`;
|
|
55
|
+
}
|
|
56
|
+
case "read":
|
|
57
|
+
case "write":
|
|
58
|
+
case "edit":
|
|
59
|
+
return args.file_path ? ` ${chalk.dim(String(args.file_path))}` : "";
|
|
60
|
+
case "find":
|
|
61
|
+
return ` ${chalk.dim(String(args.pattern ?? ""))}`;
|
|
62
|
+
case "grep":
|
|
63
|
+
return ` ${chalk.dim(String(args.pattern ?? ""))}`;
|
|
64
|
+
case "ls":
|
|
65
|
+
return args.path ? ` ${chalk.dim(String(args.path))}` : "";
|
|
66
|
+
default:
|
|
67
|
+
return "";
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function summarizeResult(name, result, isError) {
|
|
71
|
+
if (isError) {
|
|
72
|
+
const firstLine = result.split("\n")[0];
|
|
73
|
+
return firstLine.length > 100 ? firstLine.slice(0, 97) + "..." : firstLine;
|
|
74
|
+
}
|
|
75
|
+
switch (name) {
|
|
76
|
+
case "bash": {
|
|
77
|
+
const match = result.match(/^Exit code: (.+)/);
|
|
78
|
+
return match ? `exit ${match[1]}` : "done";
|
|
79
|
+
}
|
|
80
|
+
case "read": {
|
|
81
|
+
const lines = result.split("\n").length;
|
|
82
|
+
return `${lines} lines`;
|
|
83
|
+
}
|
|
84
|
+
case "write": {
|
|
85
|
+
return result.split("\n")[0];
|
|
86
|
+
}
|
|
87
|
+
case "edit": {
|
|
88
|
+
const added = (result.match(/^\+[^+]/gm) ?? []).length;
|
|
89
|
+
const removed = (result.match(/^-[^-]/gm) ?? []).length;
|
|
90
|
+
return `+${added} -${removed} lines`;
|
|
91
|
+
}
|
|
92
|
+
case "find": {
|
|
93
|
+
const match = result.match(/(\d+) file\(s\) found/);
|
|
94
|
+
return match ? `${match[1]} files` : "done";
|
|
95
|
+
}
|
|
96
|
+
case "grep": {
|
|
97
|
+
const match = result.match(/(\d+) match\(es\) found/);
|
|
98
|
+
return match ? `${match[1]} matches` : "done";
|
|
99
|
+
}
|
|
100
|
+
case "ls": {
|
|
101
|
+
const lineCount = result.split("\n").length;
|
|
102
|
+
return `${lineCount} entries`;
|
|
103
|
+
}
|
|
104
|
+
default:
|
|
105
|
+
return "done";
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function formatDuration(ms) {
|
|
109
|
+
if (ms < 1000)
|
|
110
|
+
return `${ms}ms`;
|
|
111
|
+
return `${(ms / 1000).toFixed(1)}s`;
|
|
112
|
+
}
|
|
113
|
+
function formatNumber(n) {
|
|
114
|
+
if (n >= 1_000_000)
|
|
115
|
+
return `${(n / 1_000_000).toFixed(1)}M`;
|
|
116
|
+
if (n >= 1_000)
|
|
117
|
+
return `${(n / 1_000).toFixed(1)}K`;
|
|
118
|
+
return String(n);
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAEA,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAehE"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
export function getGitBranch(cwd) {
|
|
3
|
+
return new Promise((resolve) => {
|
|
4
|
+
execFile("git", ["rev-parse", "--abbrev-ref", "HEAD"], { cwd, timeout: 2000 }, (error, stdout) => {
|
|
5
|
+
if (error) {
|
|
6
|
+
resolve(null);
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
resolve(stdout.trim() || null);
|
|
10
|
+
});
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,QAAQ,CACN,KAAK,EACL,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,EACrC,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,EACtB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YAChB,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,IAAI,CAAC,CAAC;gBACd,OAAO;YACT,CAAC;YACD,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,CAAC;QACjC,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export interface ImageAttachment {
|
|
2
|
+
kind: "image" | "text";
|
|
3
|
+
fileName: string;
|
|
4
|
+
filePath: string;
|
|
5
|
+
mediaType: string;
|
|
6
|
+
data: string;
|
|
7
|
+
}
|
|
8
|
+
/** Check if a file path points to an image based on extension. */
|
|
9
|
+
export declare function isImagePath(filePath: string): boolean;
|
|
10
|
+
/** Check if a file path points to an attachable file (image or text). */
|
|
11
|
+
export declare function isAttachablePath(filePath: string): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Extract attachable file paths from input text by checking if tokens resolve
|
|
14
|
+
* to existing files on disk. Returns verified paths and the remaining text.
|
|
15
|
+
*
|
|
16
|
+
* Only tokens that look like explicit paths (contain `/`, `~`, `\`, or `file://`)
|
|
17
|
+
* are considered. Bare filenames like "readme.md" are left as text.
|
|
18
|
+
*/
|
|
19
|
+
export declare function extractImagePaths(text: string, cwd: string): Promise<{
|
|
20
|
+
imagePaths: string[];
|
|
21
|
+
cleanText: string;
|
|
22
|
+
}>;
|
|
23
|
+
/** Read a file and return an attachment (base64 for images, raw text for text files). */
|
|
24
|
+
export declare function readImageFile(filePath: string): Promise<ImageAttachment>;
|
|
25
|
+
/**
|
|
26
|
+
* Try to read image data from the system clipboard (macOS only).
|
|
27
|
+
* Returns null if no image is on the clipboard.
|
|
28
|
+
*/
|
|
29
|
+
export declare function getClipboardImage(): Promise<ImageAttachment | null>;
|
|
30
|
+
//# sourceMappingURL=image.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../src/utils/image.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,kEAAkE;AAClE,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGrD;AAED,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAG1D;AAyCD;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CA2BtD;AAqED,yFAAyF;AACzF,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA4B9E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAoDnE"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { execFile } from "node:child_process";
|
|
4
|
+
import sharp from "sharp";
|
|
5
|
+
/** Anthropic's maximum image size in bytes (5 MB). */
|
|
6
|
+
const MAX_IMAGE_BYTES = 5 * 1024 * 1024;
|
|
7
|
+
const IMAGE_EXTENSIONS = new Set([".png", ".jpg", ".jpeg", ".gif", ".webp", ".bmp"]);
|
|
8
|
+
const TEXT_EXTENSIONS = new Set([".md", ".txt"]);
|
|
9
|
+
const ATTACHABLE_EXTENSIONS = new Set([...IMAGE_EXTENSIONS, ...TEXT_EXTENSIONS]);
|
|
10
|
+
const MEDIA_TYPES = {
|
|
11
|
+
".png": "image/png",
|
|
12
|
+
".jpg": "image/jpeg",
|
|
13
|
+
".jpeg": "image/jpeg",
|
|
14
|
+
".gif": "image/gif",
|
|
15
|
+
".webp": "image/webp",
|
|
16
|
+
".bmp": "image/bmp",
|
|
17
|
+
};
|
|
18
|
+
/** Check if a file path points to an image based on extension. */
|
|
19
|
+
export function isImagePath(filePath) {
|
|
20
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
21
|
+
return IMAGE_EXTENSIONS.has(ext);
|
|
22
|
+
}
|
|
23
|
+
/** Check if a file path points to an attachable file (image or text). */
|
|
24
|
+
export function isAttachablePath(filePath) {
|
|
25
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
26
|
+
return ATTACHABLE_EXTENSIONS.has(ext);
|
|
27
|
+
}
|
|
28
|
+
function resolvePath(filePath, cwd) {
|
|
29
|
+
let resolved = filePath.trim();
|
|
30
|
+
// Strip surrounding quotes
|
|
31
|
+
if ((resolved.startsWith("'") && resolved.endsWith("'")) ||
|
|
32
|
+
(resolved.startsWith('"') && resolved.endsWith('"'))) {
|
|
33
|
+
resolved = resolved.slice(1, -1);
|
|
34
|
+
}
|
|
35
|
+
// Strip file:// prefix
|
|
36
|
+
if (resolved.startsWith("file://")) {
|
|
37
|
+
resolved = resolved.slice(7);
|
|
38
|
+
}
|
|
39
|
+
// Unescape backslash-escaped characters (e.g. "\ " → " ")
|
|
40
|
+
resolved = resolved.replace(/\\(.)/g, "$1");
|
|
41
|
+
// Resolve home dir
|
|
42
|
+
if (resolved.startsWith("~/")) {
|
|
43
|
+
resolved = path.join(process.env.HOME ?? "/", resolved.slice(2));
|
|
44
|
+
}
|
|
45
|
+
else if (!path.isAbsolute(resolved)) {
|
|
46
|
+
resolved = path.join(cwd, resolved);
|
|
47
|
+
}
|
|
48
|
+
return resolved;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Check if a token looks like an intentional file path rather than a bare filename
|
|
52
|
+
* mentioned in conversation. Bare names like "claude.md" should not be auto-attached;
|
|
53
|
+
* only explicit paths like "./claude.md", "/tmp/file.md", "~/notes.md", etc.
|
|
54
|
+
*/
|
|
55
|
+
function looksLikePath(token) {
|
|
56
|
+
const stripped = token.replace(/^['"]|['"]$/g, "");
|
|
57
|
+
return (stripped.includes("/") ||
|
|
58
|
+
stripped.includes("\\") ||
|
|
59
|
+
stripped.startsWith("~") ||
|
|
60
|
+
stripped.startsWith("file://"));
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Extract attachable file paths from input text by checking if tokens resolve
|
|
64
|
+
* to existing files on disk. Returns verified paths and the remaining text.
|
|
65
|
+
*
|
|
66
|
+
* Only tokens that look like explicit paths (contain `/`, `~`, `\`, or `file://`)
|
|
67
|
+
* are considered. Bare filenames like "readme.md" are left as text.
|
|
68
|
+
*/
|
|
69
|
+
export async function extractImagePaths(text, cwd) {
|
|
70
|
+
const imagePaths = [];
|
|
71
|
+
const cleanParts = [];
|
|
72
|
+
// Try the entire input as a single path first (only if it looks like a path)
|
|
73
|
+
if (looksLikePath(text)) {
|
|
74
|
+
const wholePath = resolvePath(text, cwd);
|
|
75
|
+
if (isAttachablePath(wholePath) && (await fileExists(wholePath))) {
|
|
76
|
+
return { imagePaths: [wholePath], cleanText: "" };
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Split on unescaped whitespace (respect backslash-escaped spaces like "file\ name.png")
|
|
80
|
+
const tokens = text.match(/(?:[^\s\\]|\\.)+/g) ?? [];
|
|
81
|
+
for (const token of tokens) {
|
|
82
|
+
if (!token)
|
|
83
|
+
continue;
|
|
84
|
+
if (looksLikePath(token)) {
|
|
85
|
+
const resolved = resolvePath(token, cwd);
|
|
86
|
+
if (isAttachablePath(resolved) && (await fileExists(resolved))) {
|
|
87
|
+
imagePaths.push(resolved);
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
cleanParts.push(token);
|
|
92
|
+
}
|
|
93
|
+
return { imagePaths, cleanText: cleanParts.join(" ") };
|
|
94
|
+
}
|
|
95
|
+
async function fileExists(filePath) {
|
|
96
|
+
try {
|
|
97
|
+
const stat = await fs.stat(filePath);
|
|
98
|
+
return stat.isFile();
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Downscale an image buffer so it fits within MAX_IMAGE_BYTES.
|
|
106
|
+
* Preserves format (PNG→PNG, JPEG→JPEG, etc.) and aspect ratio.
|
|
107
|
+
* Progressively reduces dimensions by 25% until under the limit.
|
|
108
|
+
*/
|
|
109
|
+
async function shrinkToFit(buffer, mediaType) {
|
|
110
|
+
if (buffer.length <= MAX_IMAGE_BYTES)
|
|
111
|
+
return { buffer, mediaType };
|
|
112
|
+
let img = sharp(buffer);
|
|
113
|
+
const meta = await img.metadata();
|
|
114
|
+
let width = meta.width ?? 4096;
|
|
115
|
+
let height = meta.height ?? 4096;
|
|
116
|
+
// Determine output format from mediaType
|
|
117
|
+
const formatMap = {
|
|
118
|
+
"image/png": "png",
|
|
119
|
+
"image/jpeg": "jpeg",
|
|
120
|
+
"image/gif": "gif",
|
|
121
|
+
"image/webp": "webp",
|
|
122
|
+
"image/bmp": "png", // convert BMP to PNG (sharp doesn't output BMP)
|
|
123
|
+
};
|
|
124
|
+
let outFormat = formatMap[mediaType] ?? "png";
|
|
125
|
+
let outMediaType = mediaType === "image/bmp" ? "image/png" : mediaType;
|
|
126
|
+
// Try progressively smaller sizes (75% each step)
|
|
127
|
+
for (let attempt = 0; attempt < 10; attempt++) {
|
|
128
|
+
width = Math.round(width * 0.75);
|
|
129
|
+
height = Math.round(height * 0.75);
|
|
130
|
+
if (width < 1 || height < 1)
|
|
131
|
+
break;
|
|
132
|
+
img = sharp(buffer).resize(width, height, { fit: "inside", withoutEnlargement: true });
|
|
133
|
+
const result = await img.toFormat(outFormat).toBuffer();
|
|
134
|
+
if (result.length <= MAX_IMAGE_BYTES) {
|
|
135
|
+
return { buffer: result, mediaType: outMediaType };
|
|
136
|
+
}
|
|
137
|
+
// If PNG is still too big after 3 attempts, switch to JPEG for better compression
|
|
138
|
+
if (attempt === 2 && outFormat === "png") {
|
|
139
|
+
outFormat = "jpeg";
|
|
140
|
+
outMediaType = "image/jpeg";
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// Last resort: aggressive JPEG compression at small size
|
|
144
|
+
const result = await sharp(buffer)
|
|
145
|
+
.resize(Math.round(width * 0.5), Math.round(height * 0.5), {
|
|
146
|
+
fit: "inside",
|
|
147
|
+
withoutEnlargement: true,
|
|
148
|
+
})
|
|
149
|
+
.jpeg({ quality: 60 })
|
|
150
|
+
.toBuffer();
|
|
151
|
+
return { buffer: result, mediaType: "image/jpeg" };
|
|
152
|
+
}
|
|
153
|
+
/** Read a file and return an attachment (base64 for images, raw text for text files). */
|
|
154
|
+
export async function readImageFile(filePath) {
|
|
155
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
156
|
+
if (TEXT_EXTENSIONS.has(ext)) {
|
|
157
|
+
const content = await fs.readFile(filePath, "utf-8");
|
|
158
|
+
return {
|
|
159
|
+
kind: "text",
|
|
160
|
+
fileName: path.basename(filePath),
|
|
161
|
+
filePath,
|
|
162
|
+
mediaType: "text/plain",
|
|
163
|
+
data: content,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
let mediaType = MEDIA_TYPES[ext] ?? "image/png";
|
|
167
|
+
const rawBuffer = await fs.readFile(filePath);
|
|
168
|
+
const { buffer, mediaType: finalMediaType } = await shrinkToFit(rawBuffer, mediaType);
|
|
169
|
+
mediaType = finalMediaType;
|
|
170
|
+
const data = buffer.toString("base64");
|
|
171
|
+
return {
|
|
172
|
+
kind: "image",
|
|
173
|
+
fileName: path.basename(filePath),
|
|
174
|
+
filePath,
|
|
175
|
+
mediaType,
|
|
176
|
+
data,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Try to read image data from the system clipboard (macOS only).
|
|
181
|
+
* Returns null if no image is on the clipboard.
|
|
182
|
+
*/
|
|
183
|
+
export function getClipboardImage() {
|
|
184
|
+
if (process.platform !== "darwin")
|
|
185
|
+
return Promise.resolve(null);
|
|
186
|
+
return new Promise((resolve) => {
|
|
187
|
+
// Check if clipboard has image data
|
|
188
|
+
execFile("osascript", ["-e", "clipboard info"], (err, stdout) => {
|
|
189
|
+
if (err || (!stdout.includes("PNGf") && !stdout.includes("TIFF"))) {
|
|
190
|
+
resolve(null);
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
// Determine format — prefer PNG
|
|
194
|
+
const isPng = stdout.includes("PNGf");
|
|
195
|
+
const clipClass = isPng ? "PNGf" : "TIFF";
|
|
196
|
+
const ext = isPng ? "png" : "tiff";
|
|
197
|
+
const mediaType = isPng ? "image/png" : "image/tiff";
|
|
198
|
+
// Write clipboard image to temp file, then read as base64
|
|
199
|
+
const tmpPath = `/tmp/mragentix-clipboard-${Date.now()}.${ext}`;
|
|
200
|
+
const writeScript = [
|
|
201
|
+
`set imgData to the clipboard as «class ${clipClass}»`,
|
|
202
|
+
`set filePath to POSIX file "${tmpPath}"`,
|
|
203
|
+
`set fileRef to open for access filePath with write permission`,
|
|
204
|
+
`write imgData to fileRef`,
|
|
205
|
+
`close access fileRef`,
|
|
206
|
+
].join("\n");
|
|
207
|
+
execFile("osascript", ["-e", writeScript], async (writeErr) => {
|
|
208
|
+
if (writeErr) {
|
|
209
|
+
resolve(null);
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
try {
|
|
213
|
+
const rawBuffer = await fs.readFile(tmpPath);
|
|
214
|
+
await fs.unlink(tmpPath).catch(() => { });
|
|
215
|
+
const { buffer: finalBuffer, mediaType: finalMediaType } = await shrinkToFit(rawBuffer, mediaType);
|
|
216
|
+
resolve({
|
|
217
|
+
kind: "image",
|
|
218
|
+
fileName: `clipboard.${ext}`,
|
|
219
|
+
filePath: tmpPath,
|
|
220
|
+
mediaType: finalMediaType,
|
|
221
|
+
data: finalBuffer.toString("base64"),
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
resolve(null);
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image.js","sourceRoot":"","sources":["../../src/utils/image.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/utils/markdown.ts"],"names":[],"mappings":"AAqBA;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGnD"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { marked } from "marked";
|
|
2
|
+
import { markedTerminal } from "marked-terminal";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
// Force chalk to output ANSI codes — Ink manages the TTY so
|
|
5
|
+
// chalk's auto-detection may incorrectly disable colors.
|
|
6
|
+
chalk.level = 3;
|
|
7
|
+
marked.use(markedTerminal({
|
|
8
|
+
code: chalk.yellow,
|
|
9
|
+
codespan: chalk.yellow,
|
|
10
|
+
strong: chalk.bold,
|
|
11
|
+
em: chalk.italic,
|
|
12
|
+
heading: chalk.bold.cyan,
|
|
13
|
+
link: chalk.underline.blueBright,
|
|
14
|
+
href: chalk.dim,
|
|
15
|
+
tab: 2,
|
|
16
|
+
}));
|
|
17
|
+
/**
|
|
18
|
+
* Render markdown string to ANSI-formatted terminal text.
|
|
19
|
+
* Trims trailing whitespace/newlines.
|
|
20
|
+
*/
|
|
21
|
+
export function renderMarkdown(text) {
|
|
22
|
+
const rendered = marked.parse(text, { async: false });
|
|
23
|
+
return rendered.trimEnd();
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/utils/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,MAAM,EAAE,MAAM,QAAQ,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,4DAA4D;AAC5D,yDAAyD;AACzD,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;AAEhB,MAAM,CAAC,GAAG,CACR,cAAc,CAAC;IACb,IAAI,EAAE,KAAK,CAAC,MAAM;IAClB,QAAQ,EAAE,KAAK,CAAC,MAAM;IACtB,MAAM,EAAE,KAAK,CAAC,IAAI;IAClB,EAAE,EAAE,KAAK,CAAC,MAAM;IAChB,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI;IACxB,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,UAAU;IAChC,IAAI,EAAE,KAAK,CAAC,GAAG;IACf,GAAG,EAAE,CAAC;CACP,CAAoB,CACtB,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAW,CAAC;IAChE,OAAO,QAAQ,CAAC,OAAO,EAAE,CAAC;AAC5B,CAAC"}
|