@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
package/dist/cli.js
ADDED
|
@@ -0,0 +1,772 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Drain performance entries to prevent buffer overflow warning from dependencies
|
|
3
|
+
import { PerformanceObserver, performance } from "node:perf_hooks";
|
|
4
|
+
new PerformanceObserver((list) => {
|
|
5
|
+
for (const entry of list.getEntries()) {
|
|
6
|
+
if (entry.entryType === "measure")
|
|
7
|
+
performance.clearMeasures(entry.name);
|
|
8
|
+
else if (entry.entryType === "mark")
|
|
9
|
+
performance.clearMarks(entry.name);
|
|
10
|
+
}
|
|
11
|
+
}).observe({ entryTypes: ["measure", "mark"] });
|
|
12
|
+
import { parseArgs } from "node:util";
|
|
13
|
+
import fs from "node:fs";
|
|
14
|
+
import readline from "node:readline/promises";
|
|
15
|
+
import { execFile } from "node:child_process";
|
|
16
|
+
import { createRequire } from "node:module";
|
|
17
|
+
import { renderApp } from "./ui/render.js";
|
|
18
|
+
import { runJsonMode } from "./modes/json-mode.js";
|
|
19
|
+
import { runRpcMode } from "./modes/rpc-mode.js";
|
|
20
|
+
import { runServeMode } from "./modes/serve-mode.js";
|
|
21
|
+
import { renderLoginSelector } from "./ui/login.js";
|
|
22
|
+
import { renderSessionSelector } from "./ui/sessions.js";
|
|
23
|
+
import { formatUserError } from "./utils/error-handler.js";
|
|
24
|
+
import { AuthStorage } from "./core/auth-storage.js";
|
|
25
|
+
import { SessionManager } from "./core/session-manager.js";
|
|
26
|
+
import { ensureAppDirs, getAppPaths } from "./config.js";
|
|
27
|
+
import { initLogger, log, closeLogger } from "./core/logger.js";
|
|
28
|
+
import { buildSystemPrompt } from "./system-prompt.js";
|
|
29
|
+
import { createTools } from "./tools/index.js";
|
|
30
|
+
import { shouldCompact, compact } from "./core/compaction/compactor.js";
|
|
31
|
+
import { setEstimatorModel } from "./core/compaction/token-estimator.js";
|
|
32
|
+
import { getContextWindow } from "./core/model-registry.js";
|
|
33
|
+
import { MCPClientManager, getMCPServers } from "./core/mcp/index.js";
|
|
34
|
+
import { discoverAgents } from "./core/agents.js";
|
|
35
|
+
import { loginAnthropic } from "./core/oauth/anthropic.js";
|
|
36
|
+
import { loginOpenAI } from "./core/oauth/openai.js";
|
|
37
|
+
import chalk from "chalk";
|
|
38
|
+
import { checkAndAutoUpdate } from "./core/auto-update.js";
|
|
39
|
+
const _require = createRequire(import.meta.url);
|
|
40
|
+
const CLI_VERSION = _require("../package.json").version;
|
|
41
|
+
function main() {
|
|
42
|
+
// Silent auto-update check (throttled, non-blocking on failure)
|
|
43
|
+
const updateMessage = checkAndAutoUpdate(CLI_VERSION);
|
|
44
|
+
if (updateMessage) {
|
|
45
|
+
console.error(chalk.hex("#60a5fa")(updateMessage));
|
|
46
|
+
}
|
|
47
|
+
// Handle subcommands before parseArgs
|
|
48
|
+
const subcommand = process.argv[2];
|
|
49
|
+
if (subcommand === "login") {
|
|
50
|
+
runLogin().catch((err) => {
|
|
51
|
+
log("ERROR", "fatal", err instanceof Error ? err.message : String(err));
|
|
52
|
+
closeLogger();
|
|
53
|
+
process.stderr.write(formatUserError(err) + "\n");
|
|
54
|
+
process.exit(1);
|
|
55
|
+
});
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (subcommand === "logout") {
|
|
59
|
+
runLogout().catch((err) => {
|
|
60
|
+
log("ERROR", "fatal", err instanceof Error ? err.message : String(err));
|
|
61
|
+
closeLogger();
|
|
62
|
+
process.stderr.write(formatUserError(err) + "\n");
|
|
63
|
+
process.exit(1);
|
|
64
|
+
});
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if (subcommand === "sessions") {
|
|
68
|
+
process.argv.splice(2, 1);
|
|
69
|
+
runSessions().catch((err) => {
|
|
70
|
+
log("ERROR", "fatal", err instanceof Error ? err.message : String(err));
|
|
71
|
+
closeLogger();
|
|
72
|
+
process.stderr.write(formatUserError(err) + "\n");
|
|
73
|
+
process.exit(1);
|
|
74
|
+
});
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (subcommand === "telegram") {
|
|
78
|
+
runTelegramSetup().catch((err) => {
|
|
79
|
+
log("ERROR", "fatal", err instanceof Error ? err.message : String(err));
|
|
80
|
+
closeLogger();
|
|
81
|
+
process.stderr.write(formatUserError(err) + "\n");
|
|
82
|
+
process.exit(1);
|
|
83
|
+
});
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (subcommand === "serve") {
|
|
87
|
+
process.argv.splice(2, 1);
|
|
88
|
+
runServe().catch((err) => {
|
|
89
|
+
log("ERROR", "fatal", err instanceof Error ? err.message : String(err));
|
|
90
|
+
closeLogger();
|
|
91
|
+
process.stderr.write(formatUserError(err) + "\n");
|
|
92
|
+
process.exit(1);
|
|
93
|
+
});
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (subcommand === "continue") {
|
|
97
|
+
// Remove "continue" so parseArgs handles remaining flags
|
|
98
|
+
process.argv.splice(2, 1);
|
|
99
|
+
}
|
|
100
|
+
const { values, positionals } = parseArgs({
|
|
101
|
+
options: {
|
|
102
|
+
version: { type: "boolean", short: "v" },
|
|
103
|
+
json: { type: "boolean" },
|
|
104
|
+
rpc: { type: "boolean" },
|
|
105
|
+
provider: { type: "string" },
|
|
106
|
+
model: { type: "string" },
|
|
107
|
+
"max-turns": { type: "string" },
|
|
108
|
+
"system-prompt": { type: "string" },
|
|
109
|
+
},
|
|
110
|
+
allowPositionals: true,
|
|
111
|
+
strict: true,
|
|
112
|
+
});
|
|
113
|
+
if (values.version) {
|
|
114
|
+
console.log(CLI_VERSION);
|
|
115
|
+
process.exit(0);
|
|
116
|
+
}
|
|
117
|
+
// JSON mode — used by sub-agents
|
|
118
|
+
if (values.json) {
|
|
119
|
+
const message = positionals[0] ?? "";
|
|
120
|
+
const jsonProvider = (values.provider ?? "anthropic");
|
|
121
|
+
const jsonModel = values.model ?? "claude-opus-4-6";
|
|
122
|
+
const maxTurns = values["max-turns"] ? parseInt(values["max-turns"], 10) : undefined;
|
|
123
|
+
const systemPrompt = values["system-prompt"];
|
|
124
|
+
const cwd = process.cwd();
|
|
125
|
+
runJsonMode({
|
|
126
|
+
message,
|
|
127
|
+
provider: jsonProvider,
|
|
128
|
+
model: jsonModel,
|
|
129
|
+
cwd,
|
|
130
|
+
systemPrompt,
|
|
131
|
+
maxTurns,
|
|
132
|
+
}).catch((err) => {
|
|
133
|
+
process.stderr.write(formatUserError(err) + "\n");
|
|
134
|
+
process.exit(1);
|
|
135
|
+
});
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
// RPC mode — headless JSON-over-stdio for IDE integrations
|
|
139
|
+
if (values.rpc) {
|
|
140
|
+
const rpcProvider = (values.provider ?? "anthropic");
|
|
141
|
+
const rpcModel = values.model ?? "claude-opus-4-6";
|
|
142
|
+
const systemPrompt = values["system-prompt"];
|
|
143
|
+
const cwd = process.cwd();
|
|
144
|
+
runRpcMode({
|
|
145
|
+
provider: rpcProvider,
|
|
146
|
+
model: rpcModel,
|
|
147
|
+
cwd,
|
|
148
|
+
systemPrompt,
|
|
149
|
+
}).catch((err) => {
|
|
150
|
+
process.stderr.write(formatUserError(err) + "\n");
|
|
151
|
+
process.exit(1);
|
|
152
|
+
});
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
// Load saved settings for model/provider persistence
|
|
156
|
+
let savedProvider;
|
|
157
|
+
let savedModel;
|
|
158
|
+
let savedThinkingEnabled = false;
|
|
159
|
+
let savedTheme = "auto";
|
|
160
|
+
try {
|
|
161
|
+
const raw = JSON.parse(fs.readFileSync(getAppPaths().settingsFile, "utf-8"));
|
|
162
|
+
if (raw.defaultProvider)
|
|
163
|
+
savedProvider = raw.defaultProvider;
|
|
164
|
+
if (raw.defaultModel)
|
|
165
|
+
savedModel = raw.defaultModel;
|
|
166
|
+
if (raw.thinkingEnabled === true)
|
|
167
|
+
savedThinkingEnabled = true;
|
|
168
|
+
if (raw.theme === "dark" || raw.theme === "light" || raw.theme === "auto")
|
|
169
|
+
savedTheme = raw.theme;
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
// No settings file or invalid JSON — use defaults
|
|
173
|
+
}
|
|
174
|
+
const provider = savedProvider ?? "anthropic";
|
|
175
|
+
function getHardcodedDefault(p) {
|
|
176
|
+
if (p === "openai")
|
|
177
|
+
return "gpt-5.3-codex";
|
|
178
|
+
if (p === "glm")
|
|
179
|
+
return "glm-5";
|
|
180
|
+
if (p === "moonshot")
|
|
181
|
+
return "kimi-k2.5";
|
|
182
|
+
return "claude-opus-4-6";
|
|
183
|
+
}
|
|
184
|
+
const model = savedModel ?? getHardcodedDefault(provider);
|
|
185
|
+
const thinkingLevel = savedThinkingEnabled ? "medium" : undefined;
|
|
186
|
+
// Interactive mode (Ink TUI)
|
|
187
|
+
const cwd = process.cwd();
|
|
188
|
+
const continueRecent = subcommand === "continue";
|
|
189
|
+
runInkTUI({
|
|
190
|
+
provider,
|
|
191
|
+
model,
|
|
192
|
+
cwd,
|
|
193
|
+
thinkingLevel,
|
|
194
|
+
continueRecent,
|
|
195
|
+
theme: savedTheme,
|
|
196
|
+
}).catch((err) => {
|
|
197
|
+
log("ERROR", "fatal", err instanceof Error ? err.message : String(err));
|
|
198
|
+
closeLogger();
|
|
199
|
+
process.stderr.write(formatUserError(err) + "\n");
|
|
200
|
+
process.exit(1);
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
// ── Ink TUI ───────────────────────────────────────────────
|
|
204
|
+
async function runInkTUI(opts) {
|
|
205
|
+
const { provider, model, cwd } = opts;
|
|
206
|
+
// Set model for token estimation accuracy
|
|
207
|
+
setEstimatorModel(model);
|
|
208
|
+
// Resolve auth
|
|
209
|
+
const paths = await ensureAppDirs();
|
|
210
|
+
initLogger(paths.logFile, {
|
|
211
|
+
version: CLI_VERSION,
|
|
212
|
+
provider,
|
|
213
|
+
model,
|
|
214
|
+
thinking: opts.thinkingLevel,
|
|
215
|
+
});
|
|
216
|
+
const authStorage = new AuthStorage(paths.authFile);
|
|
217
|
+
await authStorage.load();
|
|
218
|
+
const creds = await authStorage.resolveCredentials(provider);
|
|
219
|
+
// Detect all logged-in providers and preload their credentials
|
|
220
|
+
const allProviders = ["anthropic", "openai", "glm", "moonshot"];
|
|
221
|
+
const loggedInProviders = [];
|
|
222
|
+
const credentialsByProvider = {};
|
|
223
|
+
for (const p of allProviders) {
|
|
224
|
+
const stored = await authStorage.getCredentials(p);
|
|
225
|
+
if (stored) {
|
|
226
|
+
loggedInProviders.push(p);
|
|
227
|
+
try {
|
|
228
|
+
const resolved = await authStorage.resolveCredentials(p);
|
|
229
|
+
credentialsByProvider[p] = {
|
|
230
|
+
accessToken: resolved.accessToken,
|
|
231
|
+
accountId: resolved.accountId,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
catch {
|
|
235
|
+
// Token refresh failed — still mark as logged in
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// Discover agents and build tools
|
|
240
|
+
const agents = await discoverAgents({
|
|
241
|
+
globalAgentsDir: paths.agentsDir,
|
|
242
|
+
projectDir: cwd,
|
|
243
|
+
});
|
|
244
|
+
// Build system prompt & tools (with sub-agent support)
|
|
245
|
+
const systemPrompt = await buildSystemPrompt(cwd);
|
|
246
|
+
const { tools, processManager } = createTools(cwd, { agents, provider, model });
|
|
247
|
+
// Connect MCP servers
|
|
248
|
+
const mcpManager = new MCPClientManager();
|
|
249
|
+
try {
|
|
250
|
+
const providerApiKey = provider === "glm" ? credentialsByProvider["glm"]?.accessToken : undefined;
|
|
251
|
+
const mcpTools = await mcpManager.connectAll(getMCPServers(provider, providerApiKey));
|
|
252
|
+
tools.push(...mcpTools);
|
|
253
|
+
}
|
|
254
|
+
catch (err) {
|
|
255
|
+
log("WARN", "mcp", `MCP initialization failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
256
|
+
}
|
|
257
|
+
// Kill all background processes on exit (synchronous — catches all exit paths)
|
|
258
|
+
process.on("exit", () => {
|
|
259
|
+
processManager.shutdownAll();
|
|
260
|
+
mcpManager.dispose().catch(() => { });
|
|
261
|
+
});
|
|
262
|
+
// Seed messages with system prompt
|
|
263
|
+
const messages = [{ role: "system", content: systemPrompt }];
|
|
264
|
+
// Session management — create or reuse session file
|
|
265
|
+
const sessionManager = new SessionManager(paths.sessionsDir);
|
|
266
|
+
let sessionPath;
|
|
267
|
+
let initialHistory;
|
|
268
|
+
// Determine which session to resume (explicit path or most recent)
|
|
269
|
+
const resumePath = opts.resumeSessionPath ??
|
|
270
|
+
(opts.continueRecent ? await sessionManager.getMostRecent(cwd) : null);
|
|
271
|
+
if (resumePath) {
|
|
272
|
+
try {
|
|
273
|
+
const loaded = await sessionManager.load(resumePath);
|
|
274
|
+
const loadedMessages = sessionManager.getMessages(loaded.entries);
|
|
275
|
+
if (loadedMessages.length > 0) {
|
|
276
|
+
messages.push(...loadedMessages);
|
|
277
|
+
sessionPath = resumePath;
|
|
278
|
+
log("INFO", "session", `Restored session`, {
|
|
279
|
+
path: resumePath,
|
|
280
|
+
messageCount: String(loadedMessages.length),
|
|
281
|
+
});
|
|
282
|
+
// Auto-compact on load if the restored session exceeds the context window.
|
|
283
|
+
// Without this, huge sessions (1M+ tokens) get loaded into memory and OOM.
|
|
284
|
+
const contextWindow = getContextWindow(model);
|
|
285
|
+
if (shouldCompact(messages, contextWindow, 0.8)) {
|
|
286
|
+
log("INFO", "session", `Restored session exceeds context — auto-compacting`);
|
|
287
|
+
const compacted = await compact(messages, {
|
|
288
|
+
provider,
|
|
289
|
+
model,
|
|
290
|
+
apiKey: creds.accessToken,
|
|
291
|
+
contextWindow,
|
|
292
|
+
});
|
|
293
|
+
// Replace messages array contents with compacted messages
|
|
294
|
+
messages.length = 0;
|
|
295
|
+
messages.push(...compacted.messages);
|
|
296
|
+
log("INFO", "session", `Auto-compaction complete`, {
|
|
297
|
+
before: String(compacted.result.originalCount),
|
|
298
|
+
after: String(compacted.result.newCount),
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
initialHistory = messagesToHistoryItems(loadedMessages);
|
|
302
|
+
initialHistory.push({
|
|
303
|
+
kind: "info",
|
|
304
|
+
text: `↻ Restored session (${loadedMessages.length} messages)`,
|
|
305
|
+
id: `restore-info`,
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
catch {
|
|
310
|
+
// Session file corrupt or missing — start fresh
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
// Create a new session file if we didn't reuse one
|
|
314
|
+
if (!sessionPath) {
|
|
315
|
+
const session = await sessionManager.create(cwd, provider, model);
|
|
316
|
+
sessionPath = session.path;
|
|
317
|
+
log("INFO", "session", `New session created`, { path: sessionPath });
|
|
318
|
+
}
|
|
319
|
+
await renderApp({
|
|
320
|
+
provider,
|
|
321
|
+
model,
|
|
322
|
+
tools,
|
|
323
|
+
webSearch: true,
|
|
324
|
+
messages,
|
|
325
|
+
version: CLI_VERSION,
|
|
326
|
+
maxTokens: 16384,
|
|
327
|
+
thinking: opts.thinkingLevel,
|
|
328
|
+
apiKey: creds.accessToken,
|
|
329
|
+
accountId: creds.accountId,
|
|
330
|
+
cwd,
|
|
331
|
+
theme: opts.theme,
|
|
332
|
+
loggedInProviders,
|
|
333
|
+
credentialsByProvider,
|
|
334
|
+
initialHistory,
|
|
335
|
+
sessionsDir: paths.sessionsDir,
|
|
336
|
+
sessionPath,
|
|
337
|
+
processManager,
|
|
338
|
+
settingsFile: paths.settingsFile,
|
|
339
|
+
mcpManager,
|
|
340
|
+
authStorage,
|
|
341
|
+
});
|
|
342
|
+
closeLogger();
|
|
343
|
+
}
|
|
344
|
+
// ── Login ──────────────────────────────────────────────────
|
|
345
|
+
async function runLogin() {
|
|
346
|
+
process.stdout.write("\x1b[2J\x1b[3J\x1b[H");
|
|
347
|
+
const paths = await ensureAppDirs();
|
|
348
|
+
initLogger(paths.logFile, { version: CLI_VERSION });
|
|
349
|
+
log("INFO", "auth", "Login flow started");
|
|
350
|
+
const authStorage = new AuthStorage();
|
|
351
|
+
await authStorage.load();
|
|
352
|
+
// Phase 1: Ink-based provider selector
|
|
353
|
+
const provider = await renderLoginSelector(CLI_VERSION);
|
|
354
|
+
if (!provider) {
|
|
355
|
+
console.log(chalk.hex("#6b7280")("Login cancelled."));
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
console.log(chalk.hex("#60a5fa").bold("\nLogging in to ") +
|
|
359
|
+
chalk.hex("#a78bfa")(displayName(provider)) +
|
|
360
|
+
chalk.hex("#60a5fa").bold("...\n"));
|
|
361
|
+
// Phase 2: OAuth flow (readline needed for Anthropic code paste)
|
|
362
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
363
|
+
try {
|
|
364
|
+
const callbacks = {
|
|
365
|
+
onOpenUrl: (url) => {
|
|
366
|
+
console.log(chalk.hex("#60a5fa").bold("Opening browser..."));
|
|
367
|
+
openBrowser(url);
|
|
368
|
+
console.log(chalk.hex("#6b7280")("\nIf the browser didn't open, visit:\n") +
|
|
369
|
+
chalk.hex("#6b7280")(url) +
|
|
370
|
+
"\n");
|
|
371
|
+
},
|
|
372
|
+
onPromptCode: async (message) => {
|
|
373
|
+
return rl.question(message + " ");
|
|
374
|
+
},
|
|
375
|
+
onStatus: (message) => {
|
|
376
|
+
console.log(chalk.hex("#6b7280")(message));
|
|
377
|
+
},
|
|
378
|
+
};
|
|
379
|
+
let creds;
|
|
380
|
+
if (provider === "glm" || provider === "moonshot") {
|
|
381
|
+
const keyLabel = provider === "glm" ? "Z.AI" : "Moonshot";
|
|
382
|
+
const apiKey = await rl.question(chalk.hex("#60a5fa")(`Paste your ${keyLabel} API key: `));
|
|
383
|
+
if (!apiKey.trim()) {
|
|
384
|
+
console.log(chalk.hex("#ef4444")("No API key provided. Login cancelled."));
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
creds = {
|
|
388
|
+
accessToken: apiKey.trim(),
|
|
389
|
+
refreshToken: "",
|
|
390
|
+
expiresAt: Date.now() + 365 * 24 * 60 * 60 * 1000 * 100, // ~100 years
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
else {
|
|
394
|
+
creds =
|
|
395
|
+
provider === "anthropic" ? await loginAnthropic(callbacks) : await loginOpenAI(callbacks);
|
|
396
|
+
}
|
|
397
|
+
await authStorage.setCredentials(provider, creds);
|
|
398
|
+
log("INFO", "auth", `Login succeeded for ${displayName(provider)}`);
|
|
399
|
+
console.log(chalk.hex("#4ade80")(`\n✓ Logged in to ${displayName(provider)} successfully!`));
|
|
400
|
+
}
|
|
401
|
+
finally {
|
|
402
|
+
rl.close();
|
|
403
|
+
closeLogger();
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
// ── Logout ─────────────────────────────────────────────────
|
|
407
|
+
async function runLogout() {
|
|
408
|
+
const paths = await ensureAppDirs();
|
|
409
|
+
initLogger(paths.logFile, { version: CLI_VERSION });
|
|
410
|
+
log("INFO", "auth", "Logout requested");
|
|
411
|
+
const authStorage = new AuthStorage();
|
|
412
|
+
await authStorage.load();
|
|
413
|
+
await authStorage.clearAll();
|
|
414
|
+
log("INFO", "auth", "Logout succeeded");
|
|
415
|
+
closeLogger();
|
|
416
|
+
console.log(chalk.green("Logged out successfully."));
|
|
417
|
+
}
|
|
418
|
+
// ── Sessions ──────────────────────────────────────────────
|
|
419
|
+
async function runSessions() {
|
|
420
|
+
process.stdout.write("\x1b[2J\x1b[3J\x1b[H");
|
|
421
|
+
const paths = await ensureAppDirs();
|
|
422
|
+
initLogger(paths.logFile, { version: CLI_VERSION });
|
|
423
|
+
log("INFO", "session", "Sessions selector started");
|
|
424
|
+
const cwd = process.cwd();
|
|
425
|
+
const selectedPath = await renderSessionSelector(paths.sessionsDir, cwd, CLI_VERSION);
|
|
426
|
+
if (!selectedPath) {
|
|
427
|
+
console.log(chalk.hex("#6b7280")("No session selected."));
|
|
428
|
+
closeLogger();
|
|
429
|
+
process.exit(0);
|
|
430
|
+
}
|
|
431
|
+
// Load saved settings for provider/model/theme
|
|
432
|
+
let savedProvider;
|
|
433
|
+
let savedModel;
|
|
434
|
+
let savedThinkingEnabled = false;
|
|
435
|
+
let savedTheme = "auto";
|
|
436
|
+
try {
|
|
437
|
+
const raw = JSON.parse(fs.readFileSync(paths.settingsFile, "utf-8"));
|
|
438
|
+
if (raw.defaultProvider)
|
|
439
|
+
savedProvider = raw.defaultProvider;
|
|
440
|
+
if (raw.defaultModel)
|
|
441
|
+
savedModel = raw.defaultModel;
|
|
442
|
+
if (raw.thinkingEnabled === true)
|
|
443
|
+
savedThinkingEnabled = true;
|
|
444
|
+
if (raw.theme === "dark" || raw.theme === "light" || raw.theme === "auto")
|
|
445
|
+
savedTheme = raw.theme;
|
|
446
|
+
}
|
|
447
|
+
catch {
|
|
448
|
+
// No settings file — use defaults
|
|
449
|
+
}
|
|
450
|
+
const provider = savedProvider ?? "anthropic";
|
|
451
|
+
function getDefault(p) {
|
|
452
|
+
if (p === "openai")
|
|
453
|
+
return "gpt-5.3-codex";
|
|
454
|
+
if (p === "glm")
|
|
455
|
+
return "glm-5";
|
|
456
|
+
if (p === "moonshot")
|
|
457
|
+
return "kimi-k2.5";
|
|
458
|
+
return "claude-opus-4-6";
|
|
459
|
+
}
|
|
460
|
+
const model = savedModel ?? getDefault(provider);
|
|
461
|
+
const thinkingLevel = savedThinkingEnabled ? "medium" : undefined;
|
|
462
|
+
closeLogger();
|
|
463
|
+
await runInkTUI({
|
|
464
|
+
provider,
|
|
465
|
+
model,
|
|
466
|
+
cwd,
|
|
467
|
+
thinkingLevel,
|
|
468
|
+
resumeSessionPath: selectedPath,
|
|
469
|
+
theme: savedTheme,
|
|
470
|
+
});
|
|
471
|
+
}
|
|
472
|
+
async function loadTelegramConfig() {
|
|
473
|
+
try {
|
|
474
|
+
const raw = await fs.promises.readFile(getAppPaths().telegramFile, "utf-8");
|
|
475
|
+
const data = JSON.parse(raw);
|
|
476
|
+
if (data.botToken && data.userId)
|
|
477
|
+
return data;
|
|
478
|
+
return null;
|
|
479
|
+
}
|
|
480
|
+
catch {
|
|
481
|
+
return null;
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
async function saveTelegramConfig(config) {
|
|
485
|
+
const paths = await ensureAppDirs();
|
|
486
|
+
await fs.promises.writeFile(paths.telegramFile, JSON.stringify(config, null, 2), {
|
|
487
|
+
encoding: "utf-8",
|
|
488
|
+
mode: 0o600,
|
|
489
|
+
});
|
|
490
|
+
}
|
|
491
|
+
async function runTelegramSetup() {
|
|
492
|
+
process.stdout.write("\x1b[2J\x1b[3J\x1b[H");
|
|
493
|
+
const paths = await ensureAppDirs();
|
|
494
|
+
initLogger(paths.logFile, { version: CLI_VERSION });
|
|
495
|
+
log("INFO", "telegram", "Telegram setup started");
|
|
496
|
+
const existing = await loadTelegramConfig();
|
|
497
|
+
// Banner (matches Banner.tsx)
|
|
498
|
+
const LOGO = [
|
|
499
|
+
" ╭●╮ ",
|
|
500
|
+
" [◉‿◉]",
|
|
501
|
+
" ╰┬╯ ",
|
|
502
|
+
];
|
|
503
|
+
const GRADIENT = [
|
|
504
|
+
"#60a5fa",
|
|
505
|
+
"#6da1f9",
|
|
506
|
+
"#7a9df7",
|
|
507
|
+
"#8799f5",
|
|
508
|
+
"#9495f3",
|
|
509
|
+
"#a18ff1",
|
|
510
|
+
"#a78bfa",
|
|
511
|
+
"#a18ff1",
|
|
512
|
+
"#9495f3",
|
|
513
|
+
"#8799f5",
|
|
514
|
+
"#7a9df7",
|
|
515
|
+
"#6da1f9",
|
|
516
|
+
];
|
|
517
|
+
function gradientText(text) {
|
|
518
|
+
let colorIdx = 0;
|
|
519
|
+
return text
|
|
520
|
+
.split("")
|
|
521
|
+
.map((ch) => {
|
|
522
|
+
if (ch === " ")
|
|
523
|
+
return ch;
|
|
524
|
+
const color = GRADIENT[colorIdx++ % GRADIENT.length];
|
|
525
|
+
return chalk.hex(color)(ch);
|
|
526
|
+
})
|
|
527
|
+
.join("");
|
|
528
|
+
}
|
|
529
|
+
const GAP = " ";
|
|
530
|
+
console.log();
|
|
531
|
+
console.log(` ${gradientText(LOGO[0])}${GAP}` +
|
|
532
|
+
chalk.hex("#60a5fa").bold("MR Agentix Coder") +
|
|
533
|
+
chalk.hex("#6b7280")(` v${CLI_VERSION}`) +
|
|
534
|
+
chalk.hex("#6b7280")(" · By ") +
|
|
535
|
+
chalk.white.bold("Michael Rathgeb"));
|
|
536
|
+
console.log(` ${gradientText(LOGO[1])}${GAP}` + chalk.hex("#a78bfa")("Telegram Setup"));
|
|
537
|
+
console.log(` ${gradientText(LOGO[2])}${GAP}` + chalk.hex("#6b7280")("Remote Control"));
|
|
538
|
+
console.log();
|
|
539
|
+
if (existing) {
|
|
540
|
+
console.log(chalk.hex("#6b7280")(" Current config:\n") +
|
|
541
|
+
chalk.hex("#6b7280")(` Bot token: ${existing.botToken.slice(0, 10)}...${existing.botToken.slice(-4)}\n`) +
|
|
542
|
+
chalk.hex("#6b7280")(` User ID: ${existing.userId}\n`));
|
|
543
|
+
}
|
|
544
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
545
|
+
try {
|
|
546
|
+
// Step 1: Bot token
|
|
547
|
+
console.log(chalk.hex("#a78bfa")(" Step 1: Bot Token\n") +
|
|
548
|
+
chalk.hex("#6b7280")(" 1. Open BotFather: ") +
|
|
549
|
+
chalk.hex("#60a5fa").underline("https://t.me/BotFather") +
|
|
550
|
+
"\n" +
|
|
551
|
+
chalk.hex("#6b7280")(" 2. Send /newbot and follow the prompts\n") +
|
|
552
|
+
chalk.hex("#6b7280")(" 3. Copy the bot token\n"));
|
|
553
|
+
const tokenPrompt = existing
|
|
554
|
+
? chalk.hex("#60a5fa")(" Paste bot token (enter to keep current): ")
|
|
555
|
+
: chalk.hex("#60a5fa")(" Paste bot token: ");
|
|
556
|
+
const tokenInput = await rl.question(tokenPrompt);
|
|
557
|
+
const botToken = tokenInput.trim() || existing?.botToken;
|
|
558
|
+
if (!botToken) {
|
|
559
|
+
console.log(chalk.hex("#ef4444")("\n No bot token provided. Setup cancelled."));
|
|
560
|
+
return;
|
|
561
|
+
}
|
|
562
|
+
// Validate token format (roughly: digits:alphanumeric)
|
|
563
|
+
if (!/^\d+:[A-Za-z0-9_-]+$/.test(botToken)) {
|
|
564
|
+
console.log(chalk.hex("#ef4444")("\n Invalid token format. Expected: 123456789:ABCdef..."));
|
|
565
|
+
return;
|
|
566
|
+
}
|
|
567
|
+
// Step 2: User ID
|
|
568
|
+
console.log(chalk.hex("#a78bfa")("\n Step 2: User ID\n") +
|
|
569
|
+
chalk.hex("#6b7280")(" 1. Open userinfobot: ") +
|
|
570
|
+
chalk.hex("#60a5fa").underline("https://t.me/userinfobot") +
|
|
571
|
+
"\n" +
|
|
572
|
+
chalk.hex("#6b7280")(" 2. Send any message — it replies with your numeric ID\n") +
|
|
573
|
+
chalk.hex("#6b7280")(" Only this user ID can control the bot.\n"));
|
|
574
|
+
const userPrompt = existing
|
|
575
|
+
? chalk.hex("#60a5fa")(` Your Telegram user ID (enter to keep ${existing.userId}): `)
|
|
576
|
+
: chalk.hex("#60a5fa")(" Your Telegram user ID: ");
|
|
577
|
+
const userInput = await rl.question(userPrompt);
|
|
578
|
+
const userId = userInput.trim() ? parseInt(userInput.trim(), 10) : existing?.userId;
|
|
579
|
+
if (!userId || isNaN(userId)) {
|
|
580
|
+
console.log(chalk.hex("#ef4444")("\n Invalid user ID. Must be a number."));
|
|
581
|
+
return;
|
|
582
|
+
}
|
|
583
|
+
// Step 3: Verify bot token by calling getMe
|
|
584
|
+
console.log(chalk.hex("#6b7280")("\n Verifying bot token..."));
|
|
585
|
+
const verifyRes = await fetch(`https://api.telegram.org/bot${botToken}/getMe`, {
|
|
586
|
+
method: "POST",
|
|
587
|
+
});
|
|
588
|
+
const verifyData = (await verifyRes.json());
|
|
589
|
+
if (!verifyData.ok || !verifyData.result) {
|
|
590
|
+
console.log(chalk.hex("#ef4444")("\n Invalid bot token — Telegram rejected it. Check and try again."));
|
|
591
|
+
return;
|
|
592
|
+
}
|
|
593
|
+
const botName = verifyData.result.first_name;
|
|
594
|
+
const botUsername = verifyData.result.username;
|
|
595
|
+
// Save config
|
|
596
|
+
await saveTelegramConfig({ botToken, userId });
|
|
597
|
+
log("INFO", "telegram", `Telegram setup complete: @${botUsername} (user ${userId})`);
|
|
598
|
+
console.log(chalk.hex("#4ade80")(`\n ✓ Connected to @${botUsername} (${botName})\n`) +
|
|
599
|
+
chalk.hex("#4ade80")(` ✓ Authorized user ID: ${userId}\n`) +
|
|
600
|
+
chalk.hex("#4ade80")(` ✓ Config saved to ${paths.telegramFile}\n\n`) +
|
|
601
|
+
chalk.hex("#a78bfa")(" For group chats:\n") +
|
|
602
|
+
chalk.hex("#6b7280")(" 1. Message @BotFather → /setprivacy → select your bot → Disable\n") +
|
|
603
|
+
chalk.hex("#6b7280")(" 2. Add the bot to your group\n") +
|
|
604
|
+
chalk.hex("#6b7280")(" 3. Send /link in the group to connect it to a project\n\n") +
|
|
605
|
+
chalk.hex("#60a5fa")(" To start:\n") +
|
|
606
|
+
chalk.hex("#6b7280")(" cd your-project && mragentix serve\n"));
|
|
607
|
+
}
|
|
608
|
+
finally {
|
|
609
|
+
rl.close();
|
|
610
|
+
closeLogger();
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
// ── Serve (Telegram) ─────────────────────────────────────
|
|
614
|
+
async function runServe() {
|
|
615
|
+
const { values: serveValues } = parseArgs({
|
|
616
|
+
options: {
|
|
617
|
+
"bot-token": { type: "string" },
|
|
618
|
+
"user-id": { type: "string" },
|
|
619
|
+
provider: { type: "string" },
|
|
620
|
+
model: { type: "string" },
|
|
621
|
+
},
|
|
622
|
+
strict: true,
|
|
623
|
+
});
|
|
624
|
+
// Priority: CLI flags > env vars > saved config
|
|
625
|
+
const saved = await loadTelegramConfig();
|
|
626
|
+
const botToken = serveValues["bot-token"] ?? process.env.MRAGENTIX_TELEGRAM_BOT_TOKEN ?? saved?.botToken;
|
|
627
|
+
const userIdStr = serveValues["user-id"] ?? process.env.MRAGENTIX_TELEGRAM_USER_ID;
|
|
628
|
+
const userId = userIdStr ? parseInt(userIdStr, 10) : saved?.userId;
|
|
629
|
+
if (!botToken || !userId || isNaN(userId)) {
|
|
630
|
+
console.error(chalk.hex("#ef4444")("Telegram not configured.\n\n") +
|
|
631
|
+
"Run " +
|
|
632
|
+
chalk.hex("#60a5fa").bold("mragentix telegram") +
|
|
633
|
+
" to set up your bot token and user ID.\n\n" +
|
|
634
|
+
chalk.hex("#6b7280")("Or provide manually:\n") +
|
|
635
|
+
chalk.hex("#6b7280")(" mragentix serve --bot-token TOKEN --user-id ID"));
|
|
636
|
+
process.exit(1);
|
|
637
|
+
}
|
|
638
|
+
// Load saved settings
|
|
639
|
+
let savedProvider;
|
|
640
|
+
let savedModel;
|
|
641
|
+
let savedThinkingEnabled = false;
|
|
642
|
+
try {
|
|
643
|
+
const raw = JSON.parse(fs.readFileSync(getAppPaths().settingsFile, "utf-8"));
|
|
644
|
+
if (raw.defaultProvider)
|
|
645
|
+
savedProvider = raw.defaultProvider;
|
|
646
|
+
if (raw.defaultModel)
|
|
647
|
+
savedModel = raw.defaultModel;
|
|
648
|
+
if (raw.thinkingEnabled === true)
|
|
649
|
+
savedThinkingEnabled = true;
|
|
650
|
+
}
|
|
651
|
+
catch {
|
|
652
|
+
// No settings file
|
|
653
|
+
}
|
|
654
|
+
const provider = serveValues.provider ?? savedProvider ?? "anthropic";
|
|
655
|
+
function getDefault(p) {
|
|
656
|
+
if (p === "openai")
|
|
657
|
+
return "gpt-5.3-codex";
|
|
658
|
+
if (p === "glm")
|
|
659
|
+
return "glm-5";
|
|
660
|
+
if (p === "moonshot")
|
|
661
|
+
return "kimi-k2.5";
|
|
662
|
+
return "claude-opus-4-6";
|
|
663
|
+
}
|
|
664
|
+
const model = serveValues.model ?? savedModel ?? getDefault(provider);
|
|
665
|
+
const thinkingLevel = savedThinkingEnabled ? "medium" : undefined;
|
|
666
|
+
const paths = await ensureAppDirs();
|
|
667
|
+
initLogger(paths.logFile, {
|
|
668
|
+
version: CLI_VERSION,
|
|
669
|
+
provider,
|
|
670
|
+
model,
|
|
671
|
+
});
|
|
672
|
+
setEstimatorModel(model);
|
|
673
|
+
await runServeMode({
|
|
674
|
+
provider,
|
|
675
|
+
model,
|
|
676
|
+
cwd: process.cwd(),
|
|
677
|
+
version: CLI_VERSION,
|
|
678
|
+
thinkingLevel,
|
|
679
|
+
telegram: { botToken, userId },
|
|
680
|
+
});
|
|
681
|
+
}
|
|
682
|
+
// ── Helpers ────────────────────────────────────────────────
|
|
683
|
+
function displayName(provider) {
|
|
684
|
+
if (provider === "anthropic")
|
|
685
|
+
return "Anthropic";
|
|
686
|
+
if (provider === "glm")
|
|
687
|
+
return "Z.AI (GLM)";
|
|
688
|
+
if (provider === "moonshot")
|
|
689
|
+
return "Moonshot";
|
|
690
|
+
return "OpenAI";
|
|
691
|
+
}
|
|
692
|
+
function extractText(content) {
|
|
693
|
+
if (typeof content === "string")
|
|
694
|
+
return content;
|
|
695
|
+
return content
|
|
696
|
+
.filter((b) => b.type === "text" && b.text)
|
|
697
|
+
.map((b) => b.text)
|
|
698
|
+
.join("\n");
|
|
699
|
+
}
|
|
700
|
+
function messagesToHistoryItems(msgs) {
|
|
701
|
+
const items = [];
|
|
702
|
+
let id = 0;
|
|
703
|
+
// Index tool results by toolCallId for pairing with tool calls
|
|
704
|
+
const toolResults = new Map();
|
|
705
|
+
for (const msg of msgs) {
|
|
706
|
+
if (msg.role === "tool") {
|
|
707
|
+
for (const tr of msg.content) {
|
|
708
|
+
toolResults.set(tr.toolCallId, {
|
|
709
|
+
content: tr.content,
|
|
710
|
+
isError: tr.isError ?? false,
|
|
711
|
+
});
|
|
712
|
+
}
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
const roleCounts = {};
|
|
716
|
+
const blockTypeCounts = {};
|
|
717
|
+
for (const msg of msgs) {
|
|
718
|
+
roleCounts[msg.role] = (roleCounts[msg.role] ?? 0) + 1;
|
|
719
|
+
if (msg.role === "user") {
|
|
720
|
+
const text = extractText(msg.content);
|
|
721
|
+
if (text)
|
|
722
|
+
items.push({ kind: "user", text, id: `restore-${id++}` });
|
|
723
|
+
}
|
|
724
|
+
else if (msg.role === "assistant") {
|
|
725
|
+
const content = msg.content;
|
|
726
|
+
if (typeof content === "string") {
|
|
727
|
+
if (content)
|
|
728
|
+
items.push({ kind: "assistant", text: content, id: `restore-${id++}` });
|
|
729
|
+
continue;
|
|
730
|
+
}
|
|
731
|
+
// Count block types for debugging
|
|
732
|
+
for (const block of content) {
|
|
733
|
+
blockTypeCounts[block.type] = (blockTypeCounts[block.type] ?? 0) + 1;
|
|
734
|
+
}
|
|
735
|
+
// Process content blocks in order — text and tool calls
|
|
736
|
+
const text = extractText(content);
|
|
737
|
+
if (text)
|
|
738
|
+
items.push({ kind: "assistant", text, id: `restore-${id++}` });
|
|
739
|
+
for (const block of content) {
|
|
740
|
+
if (block.type === "tool_call") {
|
|
741
|
+
const result = toolResults.get(block.id);
|
|
742
|
+
items.push({
|
|
743
|
+
kind: "tool_done",
|
|
744
|
+
name: block.name,
|
|
745
|
+
args: block.args,
|
|
746
|
+
result: result?.content ?? "",
|
|
747
|
+
isError: result?.isError ?? false,
|
|
748
|
+
durationMs: 0,
|
|
749
|
+
id: `restore-${id++}`,
|
|
750
|
+
});
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
}
|
|
755
|
+
log("INFO", "session", "messagesToHistoryItems", {
|
|
756
|
+
totalMessages: String(msgs.length),
|
|
757
|
+
roleCounts: JSON.stringify(roleCounts),
|
|
758
|
+
blockTypeCounts: JSON.stringify(blockTypeCounts),
|
|
759
|
+
toolResultsIndexed: String(toolResults.size),
|
|
760
|
+
historyItemsProduced: String(items.length),
|
|
761
|
+
itemKinds: JSON.stringify(items.map((i) => i.kind)),
|
|
762
|
+
});
|
|
763
|
+
return items;
|
|
764
|
+
}
|
|
765
|
+
function openBrowser(url) {
|
|
766
|
+
const cmd = process.platform === "darwin" ? "open" : process.platform === "win32" ? "start" : "xdg-open";
|
|
767
|
+
execFile(cmd, [url], () => {
|
|
768
|
+
// Ignore errors — user can copy URL manually
|
|
769
|
+
});
|
|
770
|
+
}
|
|
771
|
+
main();
|
|
772
|
+
//# sourceMappingURL=cli.js.map
|