@defai.digital/ax-cli 0.0.34
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/.automatosx/agents/aerospace-scientist.yaml +159 -0
- package/.automatosx/agents/architecture.yaml +244 -0
- package/.automatosx/agents/backend.yaml +172 -0
- package/.automatosx/agents/ceo.yaml +105 -0
- package/.automatosx/agents/creative-marketer.yaml +173 -0
- package/.automatosx/agents/cto.yaml +118 -0
- package/.automatosx/agents/data-scientist.yaml +200 -0
- package/.automatosx/agents/data.yaml +106 -0
- package/.automatosx/agents/design.yaml +115 -0
- package/.automatosx/agents/devops.yaml +124 -0
- package/.automatosx/agents/frontend.yaml +171 -0
- package/.automatosx/agents/fullstack.yaml +172 -0
- package/.automatosx/agents/mobile.yaml +185 -0
- package/.automatosx/agents/product.yaml +103 -0
- package/.automatosx/agents/quality.yaml +93 -0
- package/.automatosx/agents/quantum-engineer.yaml +167 -0
- package/.automatosx/agents/researcher.yaml +122 -0
- package/.automatosx/agents/security.yaml +115 -0
- package/.automatosx/agents/standard.yaml +214 -0
- package/.automatosx/agents/writer.yaml +122 -0
- package/.automatosx/feature-flags.json +13 -0
- package/.automatosx/memory/memory.db +0 -0
- package/.automatosx/providers/README.md +117 -0
- package/.automatosx/providers/grok-zai.yaml.template +61 -0
- package/.automatosx/providers/grok.yaml.template +71 -0
- package/.automatosx/status/backend-1763517593334-85037.json +9 -0
- package/.automatosx/status/quality-1763516867087-82043.json +9 -0
- package/.automatosx/status/quality-1763516976722-84817.json +9 -0
- package/.automatosx/status/security-1763517871950-87357.json +9 -0
- package/.automatosx/teams/business.yaml +56 -0
- package/.automatosx/teams/core.yaml +60 -0
- package/.automatosx/teams/design.yaml +58 -0
- package/.automatosx/teams/engineering.yaml +69 -0
- package/.automatosx/teams/research.yaml +56 -0
- package/.automatosx/templates/analyst.yaml +60 -0
- package/.automatosx/templates/assistant.yaml +48 -0
- package/.automatosx/templates/basic-agent.yaml +28 -0
- package/.automatosx/templates/code-reviewer.yaml +52 -0
- package/.automatosx/templates/debugger.yaml +63 -0
- package/.automatosx/templates/designer.yaml +69 -0
- package/.automatosx/templates/developer.yaml +60 -0
- package/.automatosx/templates/fullstack-developer.yaml +395 -0
- package/.automatosx/templates/qa-specialist.yaml +71 -0
- package/.claude/mcp/automatosx.json +244 -0
- package/.claude/settings.local.json +34 -0
- package/.grok/settings.json +37 -0
- package/LICENSE +26 -0
- package/README.md +518 -0
- package/automatosx/PRD/README.md +9 -0
- package/automatosx/tmp/README.md +10 -0
- package/automatosx.config.json +333 -0
- package/dist/agent/grok-agent.d.ts +52 -0
- package/dist/agent/grok-agent.js +627 -0
- package/dist/agent/grok-agent.js.map +1 -0
- package/dist/agent/index.d.ts +14 -0
- package/dist/agent/index.js +136 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/commands/mcp.d.ts +2 -0
- package/dist/commands/mcp.js +239 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/grok/client.d.ts +49 -0
- package/dist/grok/client.js +80 -0
- package/dist/grok/client.js.map +1 -0
- package/dist/grok/tools.d.ts +8 -0
- package/dist/grok/tools.js +349 -0
- package/dist/grok/tools.js.map +1 -0
- package/dist/hooks/use-enhanced-input.d.ts +37 -0
- package/dist/hooks/use-enhanced-input.js +214 -0
- package/dist/hooks/use-enhanced-input.js.map +1 -0
- package/dist/hooks/use-input-handler.d.ts +34 -0
- package/dist/hooks/use-input-handler.js +608 -0
- package/dist/hooks/use-input-handler.js.map +1 -0
- package/dist/hooks/use-input-history.d.ts +9 -0
- package/dist/hooks/use-input-history.js +69 -0
- package/dist/hooks/use-input-history.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +339 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/client.d.ts +31 -0
- package/dist/mcp/client.js +152 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/config.d.ts +13 -0
- package/dist/mcp/config.js +43 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/transports.d.ts +48 -0
- package/dist/mcp/transports.js +217 -0
- package/dist/mcp/transports.js.map +1 -0
- package/dist/schemas/index.d.ts +102 -0
- package/dist/schemas/index.js +105 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/tools/bash.d.ts +10 -0
- package/dist/tools/bash.js +82 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/confirmation-tool.d.ts +16 -0
- package/dist/tools/confirmation-tool.js +72 -0
- package/dist/tools/confirmation-tool.js.map +1 -0
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.js +7 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/morph-editor.d.ts +36 -0
- package/dist/tools/morph-editor.js +308 -0
- package/dist/tools/morph-editor.js.map +1 -0
- package/dist/tools/search.d.ts +68 -0
- package/dist/tools/search.js +300 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/text-editor.d.ts +16 -0
- package/dist/tools/text-editor.js +526 -0
- package/dist/tools/text-editor.js.map +1 -0
- package/dist/tools/todo-tool.d.ts +20 -0
- package/dist/tools/todo-tool.js +129 -0
- package/dist/tools/todo-tool.js.map +1 -0
- package/dist/types/index.d.ts +30 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/ui/app.d.ts +7 -0
- package/dist/ui/app.js +99 -0
- package/dist/ui/app.js.map +1 -0
- package/dist/ui/components/api-key-input.d.ts +7 -0
- package/dist/ui/components/api-key-input.js +80 -0
- package/dist/ui/components/api-key-input.js.map +1 -0
- package/dist/ui/components/chat-history.d.ts +8 -0
- package/dist/ui/components/chat-history.js +157 -0
- package/dist/ui/components/chat-history.js.map +1 -0
- package/dist/ui/components/chat-input.d.ts +9 -0
- package/dist/ui/components/chat-input.js +67 -0
- package/dist/ui/components/chat-input.js.map +1 -0
- package/dist/ui/components/chat-interface.d.ts +8 -0
- package/dist/ui/components/chat-interface.js +272 -0
- package/dist/ui/components/chat-interface.js.map +1 -0
- package/dist/ui/components/command-suggestions.d.ts +17 -0
- package/dist/ui/components/command-suggestions.js +22 -0
- package/dist/ui/components/command-suggestions.js.map +1 -0
- package/dist/ui/components/confirmation-dialog.d.ts +11 -0
- package/dist/ui/components/confirmation-dialog.js +105 -0
- package/dist/ui/components/confirmation-dialog.js.map +1 -0
- package/dist/ui/components/diff-renderer.d.ts +13 -0
- package/dist/ui/components/diff-renderer.js +186 -0
- package/dist/ui/components/diff-renderer.js.map +1 -0
- package/dist/ui/components/loading-spinner.d.ts +8 -0
- package/dist/ui/components/loading-spinner.js +59 -0
- package/dist/ui/components/loading-spinner.js.map +1 -0
- package/dist/ui/components/mcp-status.d.ts +5 -0
- package/dist/ui/components/mcp-status.js +36 -0
- package/dist/ui/components/mcp-status.js.map +1 -0
- package/dist/ui/components/model-selection.d.ts +12 -0
- package/dist/ui/components/model-selection.js +17 -0
- package/dist/ui/components/model-selection.js.map +1 -0
- package/dist/ui/shared/max-sized-box.d.ts +8 -0
- package/dist/ui/shared/max-sized-box.js +6 -0
- package/dist/ui/shared/max-sized-box.js.map +1 -0
- package/dist/ui/utils/code-colorizer.d.ts +2 -0
- package/dist/ui/utils/code-colorizer.js +7 -0
- package/dist/ui/utils/code-colorizer.js.map +1 -0
- package/dist/ui/utils/colors.d.ts +14 -0
- package/dist/ui/utils/colors.js +15 -0
- package/dist/ui/utils/colors.js.map +1 -0
- package/dist/ui/utils/markdown-renderer.d.ts +4 -0
- package/dist/ui/utils/markdown-renderer.js +23 -0
- package/dist/ui/utils/markdown-renderer.js.map +1 -0
- package/dist/utils/confirmation-service.d.ts +32 -0
- package/dist/utils/confirmation-service.js +109 -0
- package/dist/utils/confirmation-service.js.map +1 -0
- package/dist/utils/custom-instructions.d.ts +1 -0
- package/dist/utils/custom-instructions.js +17 -0
- package/dist/utils/custom-instructions.js.map +1 -0
- package/dist/utils/model-config.d.ts +28 -0
- package/dist/utils/model-config.js +42 -0
- package/dist/utils/model-config.js.map +1 -0
- package/dist/utils/settings-manager.d.ts +94 -0
- package/dist/utils/settings-manager.js +240 -0
- package/dist/utils/settings-manager.js.map +1 -0
- package/dist/utils/settings.d.ts +1 -0
- package/dist/utils/settings.js +4 -0
- package/dist/utils/settings.js.map +1 -0
- package/dist/utils/text-utils.d.ts +80 -0
- package/dist/utils/text-utils.js +182 -0
- package/dist/utils/text-utils.js.map +1 -0
- package/dist/utils/token-counter.d.ts +33 -0
- package/dist/utils/token-counter.js +78 -0
- package/dist/utils/token-counter.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { useState, useCallback } from "react";
|
|
2
|
+
const MAX_HISTORY_SIZE = 1000;
|
|
3
|
+
export function useInputHistory() {
|
|
4
|
+
const [history, setHistory] = useState([]);
|
|
5
|
+
const [currentIndex, setCurrentIndex] = useState(-1);
|
|
6
|
+
const [originalInput, setOriginalInput] = useState("");
|
|
7
|
+
const addToHistory = useCallback((input) => {
|
|
8
|
+
if (input.trim() && !history.includes(input.trim())) {
|
|
9
|
+
setHistory(prev => {
|
|
10
|
+
const newHistory = [...prev, input.trim()];
|
|
11
|
+
// Keep only the last MAX_HISTORY_SIZE entries to prevent unbounded growth
|
|
12
|
+
if (newHistory.length > MAX_HISTORY_SIZE) {
|
|
13
|
+
return newHistory.slice(-MAX_HISTORY_SIZE);
|
|
14
|
+
}
|
|
15
|
+
return newHistory;
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
setCurrentIndex(-1);
|
|
19
|
+
setOriginalInput("");
|
|
20
|
+
}, [history]);
|
|
21
|
+
const navigateHistory = useCallback((direction) => {
|
|
22
|
+
if (history.length === 0)
|
|
23
|
+
return null;
|
|
24
|
+
let newIndex;
|
|
25
|
+
if (direction === "up") {
|
|
26
|
+
if (currentIndex === -1) {
|
|
27
|
+
newIndex = history.length - 1;
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
newIndex = Math.max(0, currentIndex - 1);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
if (currentIndex === -1) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
else if (currentIndex === history.length - 1) {
|
|
38
|
+
newIndex = -1;
|
|
39
|
+
return originalInput;
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
newIndex = Math.min(history.length - 1, currentIndex + 1);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
setCurrentIndex(newIndex);
|
|
46
|
+
return newIndex === -1 ? originalInput : history[newIndex];
|
|
47
|
+
}, [history, currentIndex, originalInput]);
|
|
48
|
+
const getCurrentHistoryIndex = useCallback(() => currentIndex, [currentIndex]);
|
|
49
|
+
const resetHistory = useCallback(() => {
|
|
50
|
+
setHistory([]);
|
|
51
|
+
setCurrentIndex(-1);
|
|
52
|
+
setOriginalInput("");
|
|
53
|
+
}, []);
|
|
54
|
+
const isNavigatingHistory = useCallback(() => currentIndex !== -1, [currentIndex]);
|
|
55
|
+
const setOriginalInputCallback = useCallback((input) => {
|
|
56
|
+
if (currentIndex === -1) {
|
|
57
|
+
setOriginalInput(input);
|
|
58
|
+
}
|
|
59
|
+
}, [currentIndex]);
|
|
60
|
+
return {
|
|
61
|
+
addToHistory,
|
|
62
|
+
navigateHistory,
|
|
63
|
+
getCurrentHistoryIndex,
|
|
64
|
+
resetHistory,
|
|
65
|
+
isNavigatingHistory,
|
|
66
|
+
setOriginalInput: setOriginalInputCallback,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=use-input-history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-input-history.js","sourceRoot":"","sources":["../../src/hooks/use-input-history.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { render } from "ink";
|
|
4
|
+
import { program } from "commander";
|
|
5
|
+
import * as dotenv from "dotenv";
|
|
6
|
+
import { GrokAgent } from "./agent/grok-agent.js";
|
|
7
|
+
import ChatInterface from "./ui/components/chat-interface.js";
|
|
8
|
+
import { getSettingsManager } from "./utils/settings-manager.js";
|
|
9
|
+
import { ConfirmationService } from "./utils/confirmation-service.js";
|
|
10
|
+
import { createMCPCommand } from "./commands/mcp.js";
|
|
11
|
+
// Load environment variables
|
|
12
|
+
dotenv.config();
|
|
13
|
+
// Disable default SIGINT handling to let Ink handle Ctrl+C
|
|
14
|
+
// We'll handle exit through the input system instead
|
|
15
|
+
process.on("SIGTERM", () => {
|
|
16
|
+
// Restore terminal to normal mode before exit
|
|
17
|
+
if (process.stdin.isTTY && process.stdin.setRawMode) {
|
|
18
|
+
try {
|
|
19
|
+
process.stdin.setRawMode(false);
|
|
20
|
+
}
|
|
21
|
+
catch (e) {
|
|
22
|
+
// Ignore errors when setting raw mode
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
console.log("\nGracefully shutting down...");
|
|
26
|
+
process.exit(0);
|
|
27
|
+
});
|
|
28
|
+
// Handle uncaught exceptions to prevent hanging
|
|
29
|
+
process.on("uncaughtException", (error) => {
|
|
30
|
+
console.error("Uncaught exception:", error);
|
|
31
|
+
process.exit(1);
|
|
32
|
+
});
|
|
33
|
+
process.on("unhandledRejection", (reason, promise) => {
|
|
34
|
+
console.error("Unhandled rejection at:", promise, "reason:", reason);
|
|
35
|
+
process.exit(1);
|
|
36
|
+
});
|
|
37
|
+
// Ensure user settings are initialized
|
|
38
|
+
function ensureUserSettingsDirectory() {
|
|
39
|
+
try {
|
|
40
|
+
const manager = getSettingsManager();
|
|
41
|
+
// This will create default settings if they don't exist
|
|
42
|
+
manager.loadUserSettings();
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
// Silently ignore errors during setup
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Load API key from user settings if not in environment
|
|
49
|
+
function loadApiKey() {
|
|
50
|
+
const manager = getSettingsManager();
|
|
51
|
+
return manager.getApiKey();
|
|
52
|
+
}
|
|
53
|
+
// Load base URL from user settings if not in environment
|
|
54
|
+
function loadBaseURL() {
|
|
55
|
+
const manager = getSettingsManager();
|
|
56
|
+
return manager.getBaseURL();
|
|
57
|
+
}
|
|
58
|
+
// Save command line settings to user settings file
|
|
59
|
+
async function saveCommandLineSettings(apiKey, baseURL) {
|
|
60
|
+
try {
|
|
61
|
+
const manager = getSettingsManager();
|
|
62
|
+
// Update with command line values
|
|
63
|
+
if (apiKey) {
|
|
64
|
+
manager.updateUserSetting("apiKey", apiKey);
|
|
65
|
+
console.log("✅ API key saved to ~/.grok/user-settings.json");
|
|
66
|
+
}
|
|
67
|
+
if (baseURL) {
|
|
68
|
+
manager.updateUserSetting("baseURL", baseURL);
|
|
69
|
+
console.log("✅ Base URL saved to ~/.grok/user-settings.json");
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
console.warn("⚠️ Could not save settings to file:", error instanceof Error ? error.message : "Unknown error");
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Load model from user settings if not in environment
|
|
77
|
+
function loadModel() {
|
|
78
|
+
// First check environment variables
|
|
79
|
+
let model = process.env.GROK_MODEL;
|
|
80
|
+
if (!model) {
|
|
81
|
+
// Use the unified model loading from settings manager
|
|
82
|
+
try {
|
|
83
|
+
const manager = getSettingsManager();
|
|
84
|
+
model = manager.getCurrentModel();
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
// Ignore errors, model will remain undefined
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return model;
|
|
91
|
+
}
|
|
92
|
+
// Handle commit-and-push command in headless mode
|
|
93
|
+
async function handleCommitAndPushHeadless(apiKey, baseURL, model, maxToolRounds) {
|
|
94
|
+
try {
|
|
95
|
+
const agent = new GrokAgent(apiKey, baseURL, model, maxToolRounds);
|
|
96
|
+
// Configure confirmation service for headless mode (auto-approve all operations)
|
|
97
|
+
const confirmationService = ConfirmationService.getInstance();
|
|
98
|
+
confirmationService.setSessionFlag("allOperations", true);
|
|
99
|
+
console.log("🤖 Processing commit and push...\n");
|
|
100
|
+
console.log("> /commit-and-push\n");
|
|
101
|
+
// First check if there are any changes at all
|
|
102
|
+
const initialStatusResult = await agent.executeBashCommand("git status --porcelain");
|
|
103
|
+
if (!initialStatusResult.success || !initialStatusResult.output?.trim()) {
|
|
104
|
+
console.log("❌ No changes to commit. Working directory is clean.");
|
|
105
|
+
process.exit(1);
|
|
106
|
+
}
|
|
107
|
+
console.log("✅ git status: Changes detected");
|
|
108
|
+
// Add all changes
|
|
109
|
+
const addResult = await agent.executeBashCommand("git add .");
|
|
110
|
+
if (!addResult.success) {
|
|
111
|
+
console.log(`❌ git add: ${addResult.error || "Failed to stage changes"}`);
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
console.log("✅ git add: Changes staged");
|
|
115
|
+
// Get staged changes for commit message generation
|
|
116
|
+
const diffResult = await agent.executeBashCommand("git diff --cached");
|
|
117
|
+
// Generate commit message using AI
|
|
118
|
+
const commitPrompt = `Generate a concise, professional git commit message for these changes:
|
|
119
|
+
|
|
120
|
+
Git Status:
|
|
121
|
+
${initialStatusResult.output}
|
|
122
|
+
|
|
123
|
+
Git Diff (staged changes):
|
|
124
|
+
${diffResult.output || "No staged changes shown"}
|
|
125
|
+
|
|
126
|
+
Follow conventional commit format (feat:, fix:, docs:, etc.) and keep it under 72 characters.
|
|
127
|
+
Respond with ONLY the commit message, no additional text.`;
|
|
128
|
+
console.log("🤖 Generating commit message...");
|
|
129
|
+
const commitMessageEntries = await agent.processUserMessage(commitPrompt);
|
|
130
|
+
let commitMessage = "";
|
|
131
|
+
// Extract the commit message from the AI response
|
|
132
|
+
for (const entry of commitMessageEntries) {
|
|
133
|
+
if (entry.type === "assistant" && entry.content.trim()) {
|
|
134
|
+
commitMessage = entry.content.trim();
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (!commitMessage) {
|
|
139
|
+
console.log("❌ Failed to generate commit message");
|
|
140
|
+
process.exit(1);
|
|
141
|
+
}
|
|
142
|
+
// Clean the commit message
|
|
143
|
+
const cleanCommitMessage = commitMessage.replace(/^["']|["']$/g, "");
|
|
144
|
+
console.log(`✅ Generated commit message: "${cleanCommitMessage}"`);
|
|
145
|
+
// Execute the commit
|
|
146
|
+
const commitCommand = `git commit -m "${cleanCommitMessage}"`;
|
|
147
|
+
const commitResult = await agent.executeBashCommand(commitCommand);
|
|
148
|
+
if (commitResult.success) {
|
|
149
|
+
console.log(`✅ git commit: ${commitResult.output?.split("\n")[0] || "Commit successful"}`);
|
|
150
|
+
// If commit was successful, push to remote
|
|
151
|
+
// First try regular push, if it fails try with upstream setup
|
|
152
|
+
let pushResult = await agent.executeBashCommand("git push");
|
|
153
|
+
if (!pushResult.success &&
|
|
154
|
+
pushResult.error?.includes("no upstream branch")) {
|
|
155
|
+
console.log("🔄 Setting upstream and pushing...");
|
|
156
|
+
pushResult = await agent.executeBashCommand("git push -u origin HEAD");
|
|
157
|
+
}
|
|
158
|
+
if (pushResult.success) {
|
|
159
|
+
console.log(`✅ git push: ${pushResult.output?.split("\n")[0] || "Push successful"}`);
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
console.log(`❌ git push: ${pushResult.error || "Push failed"}`);
|
|
163
|
+
process.exit(1);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
console.log(`❌ git commit: ${commitResult.error || "Commit failed"}`);
|
|
168
|
+
process.exit(1);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
console.error("❌ Error during commit and push:", error.message);
|
|
173
|
+
process.exit(1);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// Headless mode processing function
|
|
177
|
+
async function processPromptHeadless(prompt, apiKey, baseURL, model, maxToolRounds) {
|
|
178
|
+
try {
|
|
179
|
+
const agent = new GrokAgent(apiKey, baseURL, model, maxToolRounds);
|
|
180
|
+
// Configure confirmation service for headless mode (auto-approve all operations)
|
|
181
|
+
const confirmationService = ConfirmationService.getInstance();
|
|
182
|
+
confirmationService.setSessionFlag("allOperations", true);
|
|
183
|
+
// Process the user message
|
|
184
|
+
const chatEntries = await agent.processUserMessage(prompt);
|
|
185
|
+
// Convert chat entries to OpenAI compatible message objects
|
|
186
|
+
const messages = [];
|
|
187
|
+
for (const entry of chatEntries) {
|
|
188
|
+
switch (entry.type) {
|
|
189
|
+
case "user":
|
|
190
|
+
messages.push({
|
|
191
|
+
role: "user",
|
|
192
|
+
content: entry.content,
|
|
193
|
+
});
|
|
194
|
+
break;
|
|
195
|
+
case "assistant":
|
|
196
|
+
const assistantMessage = {
|
|
197
|
+
role: "assistant",
|
|
198
|
+
content: entry.content,
|
|
199
|
+
};
|
|
200
|
+
// Add tool calls if present
|
|
201
|
+
if (entry.toolCalls && entry.toolCalls.length > 0) {
|
|
202
|
+
assistantMessage.tool_calls = entry.toolCalls.map((toolCall) => ({
|
|
203
|
+
id: toolCall.id,
|
|
204
|
+
type: "function",
|
|
205
|
+
function: {
|
|
206
|
+
name: toolCall.function.name,
|
|
207
|
+
arguments: toolCall.function.arguments,
|
|
208
|
+
},
|
|
209
|
+
}));
|
|
210
|
+
}
|
|
211
|
+
messages.push(assistantMessage);
|
|
212
|
+
break;
|
|
213
|
+
case "tool_result":
|
|
214
|
+
if (entry.toolCall) {
|
|
215
|
+
messages.push({
|
|
216
|
+
role: "tool",
|
|
217
|
+
tool_call_id: entry.toolCall.id,
|
|
218
|
+
content: entry.content,
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
break;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
// Output each message as a separate JSON object
|
|
225
|
+
for (const message of messages) {
|
|
226
|
+
console.log(JSON.stringify(message));
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
catch (error) {
|
|
230
|
+
// Output error in OpenAI compatible format
|
|
231
|
+
console.log(JSON.stringify({
|
|
232
|
+
role: "assistant",
|
|
233
|
+
content: `Error: ${error.message}`,
|
|
234
|
+
}));
|
|
235
|
+
process.exit(1);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
program
|
|
239
|
+
.name("grok")
|
|
240
|
+
.description("A conversational AI CLI tool powered by Grok with text editor capabilities")
|
|
241
|
+
.version("1.0.1")
|
|
242
|
+
.argument("[message...]", "Initial message to send to Grok")
|
|
243
|
+
.option("-d, --directory <dir>", "set working directory", process.cwd())
|
|
244
|
+
.option("-k, --api-key <key>", "Grok API key (or set GROK_API_KEY env var)")
|
|
245
|
+
.option("-u, --base-url <url>", "Grok API base URL (or set GROK_BASE_URL env var)")
|
|
246
|
+
.option("-m, --model <model>", "AI model to use (e.g., grok-code-fast-1, grok-4-latest) (or set GROK_MODEL env var)")
|
|
247
|
+
.option("-p, --prompt <prompt>", "process a single prompt and exit (headless mode)")
|
|
248
|
+
.option("--max-tool-rounds <rounds>", "maximum number of tool execution rounds (default: 400)", "400")
|
|
249
|
+
.action(async (message, options) => {
|
|
250
|
+
if (options.directory) {
|
|
251
|
+
try {
|
|
252
|
+
process.chdir(options.directory);
|
|
253
|
+
}
|
|
254
|
+
catch (error) {
|
|
255
|
+
console.error(`Error changing directory to ${options.directory}:`, error.message);
|
|
256
|
+
process.exit(1);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
try {
|
|
260
|
+
// Get API key from options, environment, or user settings
|
|
261
|
+
const apiKey = options.apiKey || loadApiKey();
|
|
262
|
+
const baseURL = options.baseUrl || loadBaseURL();
|
|
263
|
+
const model = options.model || loadModel();
|
|
264
|
+
const maxToolRounds = parseInt(options.maxToolRounds) || 400;
|
|
265
|
+
if (!apiKey) {
|
|
266
|
+
console.error("❌ Error: API key required. Set GROK_API_KEY environment variable, use --api-key flag, or save to ~/.grok/user-settings.json");
|
|
267
|
+
process.exit(1);
|
|
268
|
+
}
|
|
269
|
+
// Save API key and base URL to user settings if provided via command line
|
|
270
|
+
if (options.apiKey || options.baseUrl) {
|
|
271
|
+
await saveCommandLineSettings(options.apiKey, options.baseUrl);
|
|
272
|
+
}
|
|
273
|
+
// Headless mode: process prompt and exit
|
|
274
|
+
if (options.prompt) {
|
|
275
|
+
await processPromptHeadless(options.prompt, apiKey, baseURL, model, maxToolRounds);
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
// Interactive mode: launch UI
|
|
279
|
+
const agent = new GrokAgent(apiKey, baseURL, model, maxToolRounds);
|
|
280
|
+
console.log("🤖 Starting Grok CLI Conversational Assistant...\n");
|
|
281
|
+
ensureUserSettingsDirectory();
|
|
282
|
+
// Support variadic positional arguments for multi-word initial message
|
|
283
|
+
const initialMessage = Array.isArray(message)
|
|
284
|
+
? message.join(" ")
|
|
285
|
+
: message;
|
|
286
|
+
render(React.createElement(ChatInterface, { agent, initialMessage }));
|
|
287
|
+
}
|
|
288
|
+
catch (error) {
|
|
289
|
+
console.error("❌ Error initializing Grok CLI:", error.message);
|
|
290
|
+
process.exit(1);
|
|
291
|
+
}
|
|
292
|
+
});
|
|
293
|
+
// Git subcommand
|
|
294
|
+
const gitCommand = program
|
|
295
|
+
.command("git")
|
|
296
|
+
.description("Git operations with AI assistance");
|
|
297
|
+
gitCommand
|
|
298
|
+
.command("commit-and-push")
|
|
299
|
+
.description("Generate AI commit message and push to remote")
|
|
300
|
+
.option("-d, --directory <dir>", "set working directory", process.cwd())
|
|
301
|
+
.option("-k, --api-key <key>", "Grok API key (or set GROK_API_KEY env var)")
|
|
302
|
+
.option("-u, --base-url <url>", "Grok API base URL (or set GROK_BASE_URL env var)")
|
|
303
|
+
.option("-m, --model <model>", "AI model to use (e.g., grok-code-fast-1, grok-4-latest) (or set GROK_MODEL env var)")
|
|
304
|
+
.option("--max-tool-rounds <rounds>", "maximum number of tool execution rounds (default: 400)", "400")
|
|
305
|
+
.action(async (options) => {
|
|
306
|
+
if (options.directory) {
|
|
307
|
+
try {
|
|
308
|
+
process.chdir(options.directory);
|
|
309
|
+
}
|
|
310
|
+
catch (error) {
|
|
311
|
+
console.error(`Error changing directory to ${options.directory}:`, error.message);
|
|
312
|
+
process.exit(1);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
try {
|
|
316
|
+
// Get API key from options, environment, or user settings
|
|
317
|
+
const apiKey = options.apiKey || loadApiKey();
|
|
318
|
+
const baseURL = options.baseUrl || loadBaseURL();
|
|
319
|
+
const model = options.model || loadModel();
|
|
320
|
+
const maxToolRounds = parseInt(options.maxToolRounds) || 400;
|
|
321
|
+
if (!apiKey) {
|
|
322
|
+
console.error("❌ Error: API key required. Set GROK_API_KEY environment variable, use --api-key flag, or save to ~/.grok/user-settings.json");
|
|
323
|
+
process.exit(1);
|
|
324
|
+
}
|
|
325
|
+
// Save API key and base URL to user settings if provided via command line
|
|
326
|
+
if (options.apiKey || options.baseUrl) {
|
|
327
|
+
await saveCommandLineSettings(options.apiKey, options.baseUrl);
|
|
328
|
+
}
|
|
329
|
+
await handleCommitAndPushHeadless(apiKey, baseURL, model, maxToolRounds);
|
|
330
|
+
}
|
|
331
|
+
catch (error) {
|
|
332
|
+
console.error("❌ Error during git commit-and-push:", error.message);
|
|
333
|
+
process.exit(1);
|
|
334
|
+
}
|
|
335
|
+
});
|
|
336
|
+
// MCP command
|
|
337
|
+
program.addCommand(createMCPCommand());
|
|
338
|
+
program.parse();
|
|
339
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
import { EventEmitter } from "events";
|
|
3
|
+
import { TransportType, TransportConfig } from "./transports.js";
|
|
4
|
+
export interface MCPServerConfig {
|
|
5
|
+
name: string;
|
|
6
|
+
transport: TransportConfig;
|
|
7
|
+
command?: string;
|
|
8
|
+
args?: string[];
|
|
9
|
+
env?: Record<string, string>;
|
|
10
|
+
}
|
|
11
|
+
export interface MCPTool {
|
|
12
|
+
name: string;
|
|
13
|
+
description: string;
|
|
14
|
+
inputSchema: any;
|
|
15
|
+
serverName: string;
|
|
16
|
+
}
|
|
17
|
+
export declare class MCPManager extends EventEmitter {
|
|
18
|
+
private clients;
|
|
19
|
+
private transports;
|
|
20
|
+
private tools;
|
|
21
|
+
private pendingConnections;
|
|
22
|
+
addServer(config: MCPServerConfig): Promise<void>;
|
|
23
|
+
private _addServerInternal;
|
|
24
|
+
removeServer(serverName: string): Promise<void>;
|
|
25
|
+
callTool(toolName: string, arguments_: any): Promise<CallToolResult>;
|
|
26
|
+
getTools(): MCPTool[];
|
|
27
|
+
getServers(): string[];
|
|
28
|
+
shutdown(): Promise<void>;
|
|
29
|
+
getTransportType(serverName: string): TransportType | undefined;
|
|
30
|
+
ensureServersInitialized(): Promise<void>;
|
|
31
|
+
}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
2
|
+
import { EventEmitter } from "events";
|
|
3
|
+
import { createTransport } from "./transports.js";
|
|
4
|
+
export class MCPManager extends EventEmitter {
|
|
5
|
+
clients = new Map();
|
|
6
|
+
transports = new Map();
|
|
7
|
+
tools = new Map();
|
|
8
|
+
pendingConnections = new Map();
|
|
9
|
+
async addServer(config) {
|
|
10
|
+
// Check if already connecting to prevent race condition
|
|
11
|
+
const pending = this.pendingConnections.get(config.name);
|
|
12
|
+
if (pending) {
|
|
13
|
+
return pending;
|
|
14
|
+
}
|
|
15
|
+
// Create a promise for this connection attempt
|
|
16
|
+
const connectionPromise = this._addServerInternal(config);
|
|
17
|
+
this.pendingConnections.set(config.name, connectionPromise);
|
|
18
|
+
try {
|
|
19
|
+
await connectionPromise;
|
|
20
|
+
}
|
|
21
|
+
finally {
|
|
22
|
+
this.pendingConnections.delete(config.name);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
async _addServerInternal(config) {
|
|
26
|
+
try {
|
|
27
|
+
// Handle legacy stdio-only configuration
|
|
28
|
+
let transportConfig = config.transport;
|
|
29
|
+
if (!transportConfig && config.command) {
|
|
30
|
+
transportConfig = {
|
|
31
|
+
type: 'stdio',
|
|
32
|
+
command: config.command,
|
|
33
|
+
args: config.args,
|
|
34
|
+
env: config.env
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
if (!transportConfig) {
|
|
38
|
+
throw new Error('Transport configuration is required');
|
|
39
|
+
}
|
|
40
|
+
// Create transport
|
|
41
|
+
const transport = createTransport(transportConfig);
|
|
42
|
+
this.transports.set(config.name, transport);
|
|
43
|
+
// Create client
|
|
44
|
+
const client = new Client({
|
|
45
|
+
name: "ax-cli",
|
|
46
|
+
version: "1.0.0"
|
|
47
|
+
}, {
|
|
48
|
+
capabilities: {
|
|
49
|
+
tools: {}
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
this.clients.set(config.name, client);
|
|
53
|
+
// Connect
|
|
54
|
+
const sdkTransport = await transport.connect();
|
|
55
|
+
await client.connect(sdkTransport);
|
|
56
|
+
// List available tools
|
|
57
|
+
const toolsResult = await client.listTools();
|
|
58
|
+
// Register tools
|
|
59
|
+
for (const tool of toolsResult.tools) {
|
|
60
|
+
const mcpTool = {
|
|
61
|
+
name: `mcp__${config.name}__${tool.name}`,
|
|
62
|
+
description: tool.description || `Tool from ${config.name} server`,
|
|
63
|
+
inputSchema: tool.inputSchema,
|
|
64
|
+
serverName: config.name
|
|
65
|
+
};
|
|
66
|
+
this.tools.set(mcpTool.name, mcpTool);
|
|
67
|
+
}
|
|
68
|
+
this.emit('serverAdded', config.name, toolsResult.tools.length);
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
// Clean up on error
|
|
72
|
+
this.clients.delete(config.name);
|
|
73
|
+
const transport = this.transports.get(config.name);
|
|
74
|
+
if (transport) {
|
|
75
|
+
await transport.disconnect().catch(() => { });
|
|
76
|
+
this.transports.delete(config.name);
|
|
77
|
+
}
|
|
78
|
+
this.emit('serverError', config.name, error);
|
|
79
|
+
throw error;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async removeServer(serverName) {
|
|
83
|
+
// Remove tools
|
|
84
|
+
for (const [toolName, tool] of this.tools.entries()) {
|
|
85
|
+
if (tool.serverName === serverName) {
|
|
86
|
+
this.tools.delete(toolName);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// Disconnect client
|
|
90
|
+
const client = this.clients.get(serverName);
|
|
91
|
+
if (client) {
|
|
92
|
+
await client.close();
|
|
93
|
+
this.clients.delete(serverName);
|
|
94
|
+
}
|
|
95
|
+
// Close transport
|
|
96
|
+
const transport = this.transports.get(serverName);
|
|
97
|
+
if (transport) {
|
|
98
|
+
await transport.disconnect();
|
|
99
|
+
this.transports.delete(serverName);
|
|
100
|
+
}
|
|
101
|
+
this.emit('serverRemoved', serverName);
|
|
102
|
+
}
|
|
103
|
+
async callTool(toolName, arguments_) {
|
|
104
|
+
const tool = this.tools.get(toolName);
|
|
105
|
+
if (!tool) {
|
|
106
|
+
throw new Error(`Tool ${toolName} not found`);
|
|
107
|
+
}
|
|
108
|
+
const client = this.clients.get(tool.serverName);
|
|
109
|
+
if (!client) {
|
|
110
|
+
throw new Error(`Server ${tool.serverName} not connected`);
|
|
111
|
+
}
|
|
112
|
+
// Extract the original tool name (remove mcp__servername__ prefix)
|
|
113
|
+
const originalToolName = toolName.replace(`mcp__${tool.serverName}__`, '');
|
|
114
|
+
const result = await client.callTool({
|
|
115
|
+
name: originalToolName,
|
|
116
|
+
arguments: arguments_
|
|
117
|
+
});
|
|
118
|
+
return result;
|
|
119
|
+
}
|
|
120
|
+
getTools() {
|
|
121
|
+
return Array.from(this.tools.values());
|
|
122
|
+
}
|
|
123
|
+
getServers() {
|
|
124
|
+
return Array.from(this.clients.keys());
|
|
125
|
+
}
|
|
126
|
+
async shutdown() {
|
|
127
|
+
const serverNames = Array.from(this.clients.keys());
|
|
128
|
+
await Promise.all(serverNames.map(name => this.removeServer(name)));
|
|
129
|
+
}
|
|
130
|
+
getTransportType(serverName) {
|
|
131
|
+
const transport = this.transports.get(serverName);
|
|
132
|
+
return transport?.getType();
|
|
133
|
+
}
|
|
134
|
+
async ensureServersInitialized() {
|
|
135
|
+
if (this.clients.size > 0) {
|
|
136
|
+
return; // Already initialized
|
|
137
|
+
}
|
|
138
|
+
const { loadMCPConfig } = await import('../mcp/config');
|
|
139
|
+
const config = loadMCPConfig();
|
|
140
|
+
// Initialize servers in parallel to avoid blocking
|
|
141
|
+
const initPromises = config.servers.map(async (serverConfig) => {
|
|
142
|
+
try {
|
|
143
|
+
await this.addServer(serverConfig);
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
console.warn(`Failed to initialize MCP server ${serverConfig.name}:`, error);
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
await Promise.all(initPromises);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/mcp/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { MCPServerConfig } from "./client.js";
|
|
2
|
+
export interface MCPConfig {
|
|
3
|
+
servers: MCPServerConfig[];
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Load MCP configuration from project settings
|
|
7
|
+
*/
|
|
8
|
+
export declare function loadMCPConfig(): MCPConfig;
|
|
9
|
+
export declare function saveMCPConfig(config: MCPConfig): void;
|
|
10
|
+
export declare function addMCPServer(config: MCPServerConfig): void;
|
|
11
|
+
export declare function removeMCPServer(serverName: string): void;
|
|
12
|
+
export declare function getMCPServer(serverName: string): MCPServerConfig | undefined;
|
|
13
|
+
export declare const PREDEFINED_SERVERS: Record<string, MCPServerConfig>;
|