grok-agent 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/CHANGELOG.md +113 -0
  2. package/LICENSE +190 -0
  3. package/README.md +449 -0
  4. package/bin/grok-cli.js +26 -0
  5. package/dist/agent.d.ts +4 -0
  6. package/dist/agent.d.ts.map +1 -0
  7. package/dist/agent.js +898 -0
  8. package/dist/agent.js.map +1 -0
  9. package/dist/approvals.d.ts +4 -0
  10. package/dist/approvals.d.ts.map +1 -0
  11. package/dist/approvals.js +90 -0
  12. package/dist/approvals.js.map +1 -0
  13. package/dist/batch-api.d.ts +11 -0
  14. package/dist/batch-api.d.ts.map +1 -0
  15. package/dist/batch-api.js +101 -0
  16. package/dist/batch-api.js.map +1 -0
  17. package/dist/cli-errors.d.ts +6 -0
  18. package/dist/cli-errors.d.ts.map +1 -0
  19. package/dist/cli-errors.js +80 -0
  20. package/dist/cli-errors.js.map +1 -0
  21. package/dist/client.d.ts +6 -0
  22. package/dist/client.d.ts.map +1 -0
  23. package/dist/client.js +41 -0
  24. package/dist/client.js.map +1 -0
  25. package/dist/collections-api.d.ts +11 -0
  26. package/dist/collections-api.d.ts.map +1 -0
  27. package/dist/collections-api.js +144 -0
  28. package/dist/collections-api.js.map +1 -0
  29. package/dist/compaction.d.ts +11 -0
  30. package/dist/compaction.d.ts.map +1 -0
  31. package/dist/compaction.js +94 -0
  32. package/dist/compaction.js.map +1 -0
  33. package/dist/config.d.ts +12 -0
  34. package/dist/config.d.ts.map +1 -0
  35. package/dist/config.js +142 -0
  36. package/dist/config.js.map +1 -0
  37. package/dist/diff.d.ts +5 -0
  38. package/dist/diff.d.ts.map +1 -0
  39. package/dist/diff.js +80 -0
  40. package/dist/diff.js.map +1 -0
  41. package/dist/hooks.d.ts +11 -0
  42. package/dist/hooks.d.ts.map +1 -0
  43. package/dist/hooks.js +30 -0
  44. package/dist/hooks.js.map +1 -0
  45. package/dist/image.d.ts +8 -0
  46. package/dist/image.d.ts.map +1 -0
  47. package/dist/image.js +58 -0
  48. package/dist/image.js.map +1 -0
  49. package/dist/index.d.ts +3 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +1264 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/json-output.d.ts +27 -0
  54. package/dist/json-output.d.ts.map +1 -0
  55. package/dist/json-output.js +62 -0
  56. package/dist/json-output.js.map +1 -0
  57. package/dist/notifications.d.ts +6 -0
  58. package/dist/notifications.d.ts.map +1 -0
  59. package/dist/notifications.js +25 -0
  60. package/dist/notifications.js.map +1 -0
  61. package/dist/project-context.d.ts +6 -0
  62. package/dist/project-context.d.ts.map +1 -0
  63. package/dist/project-context.js +34 -0
  64. package/dist/project-context.js.map +1 -0
  65. package/dist/response-utils.d.ts +10 -0
  66. package/dist/response-utils.d.ts.map +1 -0
  67. package/dist/response-utils.js +123 -0
  68. package/dist/response-utils.js.map +1 -0
  69. package/dist/server-tools.d.ts +7 -0
  70. package/dist/server-tools.d.ts.map +1 -0
  71. package/dist/server-tools.js +205 -0
  72. package/dist/server-tools.js.map +1 -0
  73. package/dist/session.d.ts +46 -0
  74. package/dist/session.d.ts.map +1 -0
  75. package/dist/session.js +305 -0
  76. package/dist/session.js.map +1 -0
  77. package/dist/stream.d.ts +22 -0
  78. package/dist/stream.d.ts.map +1 -0
  79. package/dist/stream.js +102 -0
  80. package/dist/stream.js.map +1 -0
  81. package/dist/system-prompt.d.ts +3 -0
  82. package/dist/system-prompt.d.ts.map +1 -0
  83. package/dist/system-prompt.js +64 -0
  84. package/dist/system-prompt.js.map +1 -0
  85. package/dist/tools/bash.d.ts +8 -0
  86. package/dist/tools/bash.d.ts.map +1 -0
  87. package/dist/tools/bash.js +49 -0
  88. package/dist/tools/bash.js.map +1 -0
  89. package/dist/tools/definitions.d.ts +3 -0
  90. package/dist/tools/definitions.d.ts.map +1 -0
  91. package/dist/tools/definitions.js +190 -0
  92. package/dist/tools/definitions.js.map +1 -0
  93. package/dist/tools/edit-file.d.ts +10 -0
  94. package/dist/tools/edit-file.d.ts.map +1 -0
  95. package/dist/tools/edit-file.js +73 -0
  96. package/dist/tools/edit-file.js.map +1 -0
  97. package/dist/tools/glob.d.ts +7 -0
  98. package/dist/tools/glob.d.ts.map +1 -0
  99. package/dist/tools/glob.js +44 -0
  100. package/dist/tools/glob.js.map +1 -0
  101. package/dist/tools/grep.d.ts +10 -0
  102. package/dist/tools/grep.d.ts.map +1 -0
  103. package/dist/tools/grep.js +102 -0
  104. package/dist/tools/grep.js.map +1 -0
  105. package/dist/tools/index.d.ts +10 -0
  106. package/dist/tools/index.d.ts.map +1 -0
  107. package/dist/tools/index.js +41 -0
  108. package/dist/tools/index.js.map +1 -0
  109. package/dist/tools/list-dir.d.ts +7 -0
  110. package/dist/tools/list-dir.d.ts.map +1 -0
  111. package/dist/tools/list-dir.js +68 -0
  112. package/dist/tools/list-dir.js.map +1 -0
  113. package/dist/tools/policy.d.ts +4 -0
  114. package/dist/tools/policy.d.ts.map +1 -0
  115. package/dist/tools/policy.js +36 -0
  116. package/dist/tools/policy.js.map +1 -0
  117. package/dist/tools/read-file.d.ts +8 -0
  118. package/dist/tools/read-file.d.ts.map +1 -0
  119. package/dist/tools/read-file.js +45 -0
  120. package/dist/tools/read-file.js.map +1 -0
  121. package/dist/tools/write-file.d.ts +7 -0
  122. package/dist/tools/write-file.d.ts.map +1 -0
  123. package/dist/tools/write-file.js +35 -0
  124. package/dist/tools/write-file.js.map +1 -0
  125. package/dist/truncation.d.ts +13 -0
  126. package/dist/truncation.d.ts.map +1 -0
  127. package/dist/truncation.js +55 -0
  128. package/dist/truncation.js.map +1 -0
  129. package/dist/types.d.ts +159 -0
  130. package/dist/types.d.ts.map +1 -0
  131. package/dist/types.js +2 -0
  132. package/dist/types.js.map +1 -0
  133. package/dist/usage.d.ts +17 -0
  134. package/dist/usage.d.ts.map +1 -0
  135. package/dist/usage.js +80 -0
  136. package/dist/usage.js.map +1 -0
  137. package/dist/voice-api.d.ts +16 -0
  138. package/dist/voice-api.d.ts.map +1 -0
  139. package/dist/voice-api.js +84 -0
  140. package/dist/voice-api.js.map +1 -0
  141. package/package.json +64 -0
@@ -0,0 +1,144 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { getResponseErrorMessage } from "./cli-errors.js";
4
+ function requireManagementApiKey(config) {
5
+ if (!config.managementApiKey) {
6
+ throw new Error("XAI_MANAGEMENT_API_KEY not set. Collections management requires a management key.");
7
+ }
8
+ return config.managementApiKey;
9
+ }
10
+ function inferHeaders(config) {
11
+ return { Authorization: `Bearer ${config.apiKey}` };
12
+ }
13
+ function managementHeaders(config, json = false) {
14
+ const headers = {
15
+ Authorization: `Bearer ${requireManagementApiKey(config)}`,
16
+ };
17
+ if (json)
18
+ headers["Content-Type"] = "application/json";
19
+ return headers;
20
+ }
21
+ export async function listCollections(config) {
22
+ const response = await fetch(`${config.managementBaseUrl}/collections`, {
23
+ headers: managementHeaders(config),
24
+ });
25
+ if (!response.ok)
26
+ throw new Error(await getResponseErrorMessage("Failed to list collections", response));
27
+ const data = await response.json();
28
+ return data.collections || data.data || [];
29
+ }
30
+ export async function getCollection(config, collectionId) {
31
+ const response = await fetch(`${config.managementBaseUrl}/collections/${collectionId}`, {
32
+ headers: managementHeaders(config),
33
+ });
34
+ if (!response.ok)
35
+ throw new Error(await getResponseErrorMessage(`Failed to load collection ${collectionId}`, response));
36
+ return response.json();
37
+ }
38
+ export async function createCollection(config, name) {
39
+ const response = await fetch(`${config.managementBaseUrl}/collections`, {
40
+ method: "POST",
41
+ headers: managementHeaders(config, true),
42
+ body: JSON.stringify({ collection_name: name }),
43
+ });
44
+ if (!response.ok)
45
+ throw new Error(await getResponseErrorMessage("Failed to create collection", response));
46
+ return response.json();
47
+ }
48
+ export async function updateCollection(config, collectionId, name) {
49
+ const response = await fetch(`${config.managementBaseUrl}/collections/${collectionId}`, {
50
+ method: "PUT",
51
+ headers: managementHeaders(config, true),
52
+ body: JSON.stringify({ collection_name: name }),
53
+ });
54
+ if (!response.ok)
55
+ throw new Error(await getResponseErrorMessage(`Failed to update collection ${collectionId}`, response));
56
+ return response.json();
57
+ }
58
+ export async function deleteCollection(config, collectionId) {
59
+ const response = await fetch(`${config.managementBaseUrl}/collections/${collectionId}`, {
60
+ method: "DELETE",
61
+ headers: managementHeaders(config),
62
+ });
63
+ if (!response.ok)
64
+ throw new Error(await getResponseErrorMessage(`Failed to delete collection ${collectionId}`, response));
65
+ }
66
+ export async function listCollectionDocuments(config, collectionId) {
67
+ const response = await fetch(`${config.managementBaseUrl}/collections/${collectionId}/documents`, {
68
+ headers: managementHeaders(config),
69
+ });
70
+ if (!response.ok)
71
+ throw new Error(await getResponseErrorMessage(`Failed to list documents for ${collectionId}`, response));
72
+ const data = await response.json();
73
+ return data.documents || data.data || [];
74
+ }
75
+ export async function uploadCollectionDocument(config, collectionId, filePath, fields) {
76
+ const resolved = path.resolve(filePath);
77
+ const buffer = fs.readFileSync(resolved);
78
+ const fileName = path.basename(resolved);
79
+ if (fields && Object.keys(fields).length > 0) {
80
+ const form = new FormData();
81
+ form.append("name", fileName);
82
+ form.append("data", new Blob([buffer]), fileName);
83
+ form.append("content_type", "application/octet-stream");
84
+ form.append("fields", JSON.stringify(fields));
85
+ const response = await fetch(`${config.managementBaseUrl}/collections/${collectionId}/documents`, {
86
+ method: "POST",
87
+ headers: managementHeaders(config),
88
+ body: form,
89
+ });
90
+ if (!response.ok) {
91
+ throw new Error(await getResponseErrorMessage(`Failed to upload document to ${collectionId}`, response));
92
+ }
93
+ return response.json();
94
+ }
95
+ const uploadForm = new FormData();
96
+ uploadForm.append("file", new Blob([buffer]), fileName);
97
+ uploadForm.append("purpose", "assistants");
98
+ const uploadResponse = await fetch(`${config.baseUrl}/files`, {
99
+ method: "POST",
100
+ headers: inferHeaders(config),
101
+ body: uploadForm,
102
+ });
103
+ if (!uploadResponse.ok) {
104
+ throw new Error(await getResponseErrorMessage("Failed to upload file", uploadResponse));
105
+ }
106
+ const uploaded = await uploadResponse.json();
107
+ const fileId = uploaded.id || uploaded.file_id;
108
+ const attachResponse = await fetch(`${config.managementBaseUrl}/collections/${collectionId}/documents/${fileId}`, {
109
+ method: "POST",
110
+ headers: managementHeaders(config),
111
+ });
112
+ if (!attachResponse.ok) {
113
+ throw new Error(await getResponseErrorMessage(`Failed to attach uploaded file to ${collectionId}`, attachResponse));
114
+ }
115
+ return attachResponse.json().catch(() => ({ file_id: fileId }));
116
+ }
117
+ export async function removeCollectionDocument(config, collectionId, fileId) {
118
+ const response = await fetch(`${config.managementBaseUrl}/collections/${collectionId}/documents/${fileId}`, {
119
+ method: "DELETE",
120
+ headers: managementHeaders(config),
121
+ });
122
+ if (!response.ok)
123
+ throw new Error(await getResponseErrorMessage(`Failed to delete document ${fileId}`, response));
124
+ }
125
+ export async function searchCollectionDocuments(config, query, collectionIds, retrievalMode) {
126
+ const body = {
127
+ query,
128
+ source: { collection_ids: collectionIds },
129
+ };
130
+ if (retrievalMode)
131
+ body.retrieval_mode = { type: retrievalMode };
132
+ const response = await fetch(`${config.baseUrl}/documents/search`, {
133
+ method: "POST",
134
+ headers: {
135
+ "Content-Type": "application/json",
136
+ ...inferHeaders(config),
137
+ },
138
+ body: JSON.stringify(body),
139
+ });
140
+ if (!response.ok)
141
+ throw new Error(await getResponseErrorMessage("Failed to search documents", response));
142
+ return response.json();
143
+ }
144
+ //# sourceMappingURL=collections-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collections-api.js","sourceRoot":"","sources":["../src/collections-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { GrokConfig, ChatMessage } from "./types.js";
2
+ /**
3
+ * Check if conversation needs compaction based on estimated token count.
4
+ */
5
+ export declare function needsCompaction(messages: ChatMessage[], threshold?: number): boolean;
6
+ /**
7
+ * Compact a conversation by summarizing older messages.
8
+ * Keeps the system prompt and recent messages, summarizes the middle.
9
+ */
10
+ export declare function compactConversation(config: GrokConfig, messages: ChatMessage[]): Promise<ChatMessage[]>;
11
+ //# sourceMappingURL=compaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compaction.d.ts","sourceRoot":"","sources":["../src/compaction.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAK1D;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,WAAW,EAAE,EACvB,SAAS,GAAE,MAAkC,GAC5C,OAAO,CAcT;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,WAAW,EAAE,GACtB,OAAO,CAAC,WAAW,EAAE,CAAC,CAoExB"}
@@ -0,0 +1,94 @@
1
+ import chalk from "chalk";
2
+ import { createClient } from "./client.js";
3
+ import { approxTokenCountFromChars } from "./truncation.js";
4
+ // Auto-compact when conversation exceeds this many estimated tokens
5
+ const DEFAULT_COMPACT_THRESHOLD = 100_000; // ~100k tokens
6
+ /**
7
+ * Check if conversation needs compaction based on estimated token count.
8
+ */
9
+ export function needsCompaction(messages, threshold = DEFAULT_COMPACT_THRESHOLD) {
10
+ let totalChars = 0;
11
+ for (const msg of messages) {
12
+ const content = msg.content;
13
+ if (typeof content === "string") {
14
+ totalChars += content.length;
15
+ }
16
+ else if (content != null) {
17
+ totalChars += JSON.stringify(content).length;
18
+ }
19
+ // Tool calls add tokens too
20
+ const tc = msg.tool_calls;
21
+ if (tc)
22
+ totalChars += JSON.stringify(tc).length;
23
+ }
24
+ return approxTokenCountFromChars(totalChars) > threshold;
25
+ }
26
+ /**
27
+ * Compact a conversation by summarizing older messages.
28
+ * Keeps the system prompt and recent messages, summarizes the middle.
29
+ */
30
+ export async function compactConversation(config, messages) {
31
+ if (messages.length < 6)
32
+ return messages; // Too short to compact
33
+ console.error(chalk.dim(" Compacting conversation history..."));
34
+ const client = createClient(config);
35
+ // Keep system prompt (first message) and last 4 messages
36
+ const systemMsg = messages[0];
37
+ const recentMessages = messages.slice(-4);
38
+ const middleMessages = messages.slice(1, -4);
39
+ // Build summary of middle messages
40
+ const summaryParts = [];
41
+ for (const msg of middleMessages) {
42
+ const role = msg.role;
43
+ const content = typeof msg.content === "string" ? msg.content : null;
44
+ const tc = msg.tool_calls;
45
+ if (role === "user" && content) {
46
+ summaryParts.push(`User: ${content.slice(0, 200)}`);
47
+ }
48
+ else if (role === "assistant" && content) {
49
+ summaryParts.push(`Assistant: ${content.slice(0, 200)}`);
50
+ }
51
+ else if (role === "assistant" && tc) {
52
+ const names = tc.map((t) => t.function?.name).filter(Boolean).join(", ");
53
+ summaryParts.push(`Assistant called: ${names}`);
54
+ }
55
+ else if (role === "tool" && content) {
56
+ summaryParts.push(`Tool result: ${content.slice(0, 100)}`);
57
+ }
58
+ }
59
+ const historyText = summaryParts.join("\n");
60
+ try {
61
+ const response = await client.chat.completions.create({
62
+ model: config.model,
63
+ messages: [
64
+ {
65
+ role: "system",
66
+ content: "Summarize this conversation history into a concise handoff summary. Include: key decisions made, important context, what remains to be done. Be brief but comprehensive.",
67
+ },
68
+ {
69
+ role: "user",
70
+ content: `Summarize this conversation history:\n\n${historyText}`,
71
+ },
72
+ ],
73
+ max_tokens: 1000,
74
+ temperature: 0,
75
+ });
76
+ const summary = response.choices[0]?.message?.content || "Previous conversation context.";
77
+ console.error(chalk.dim(` Compacted ${middleMessages.length} messages → summary`));
78
+ // Rebuild messages: system + summary + recent
79
+ return [
80
+ systemMsg,
81
+ {
82
+ role: "user",
83
+ content: `[CONVERSATION SUMMARY - A previous assistant worked on this task. Here is a summary of what happened:]\n\n${summary}\n\n[END SUMMARY - Continue from where the previous assistant left off.]`,
84
+ },
85
+ ...recentMessages,
86
+ ];
87
+ }
88
+ catch (err) {
89
+ console.error(chalk.dim(` Compaction failed: ${err.message}. Trimming instead.`));
90
+ // Fallback: just keep system + recent messages
91
+ return [systemMsg, ...messages.slice(-8)];
92
+ }
93
+ }
94
+ //# sourceMappingURL=compaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compaction.js","sourceRoot":"","sources":["../src/compaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { GrokConfig } from "./types.js";
2
+ declare const MODELS: {
3
+ readonly default: "grok-4-1-fast-reasoning";
4
+ readonly fast: "grok-4-1-fast-reasoning";
5
+ readonly reasoning: "grok-4.20-0309-reasoning";
6
+ readonly nonReasoning: "grok-4.20-0309-non-reasoning";
7
+ readonly multiAgent: "grok-4.20-multi-agent-0309";
8
+ readonly code: "grok-code-fast-1";
9
+ };
10
+ export declare function getConfig(overrides?: Partial<GrokConfig>): GrokConfig;
11
+ export { MODELS };
12
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAEV,UAAU,EAKX,MAAM,YAAY,CAAC;AAcpB,QAAA,MAAM,MAAM;;;;;;;CAOF,CAAC;AAiDX,wBAAgB,SAAS,CAAC,SAAS,GAAE,OAAO,CAAC,UAAU,CAAM,GAAG,UAAU,CAsFzE;AAED,OAAO,EAAE,MAAM,EAAE,CAAC"}
package/dist/config.js ADDED
@@ -0,0 +1,142 @@
1
+ import { config as loadEnv } from "dotenv";
2
+ import path from "node:path";
3
+ import fs from "node:fs";
4
+ import os from "node:os";
5
+ import { normalizeServerTools } from "./server-tools.js";
6
+ const envPaths = [
7
+ path.join(process.cwd(), ".env"),
8
+ path.join(process.cwd(), "..", ".env"),
9
+ path.join(os.homedir(), ".grok-cli", ".env"),
10
+ ];
11
+ for (const p of envPaths) {
12
+ if (fs.existsSync(p)) {
13
+ loadEnv({ path: p });
14
+ break;
15
+ }
16
+ }
17
+ const MODELS = {
18
+ default: "grok-4-1-fast-reasoning",
19
+ fast: "grok-4-1-fast-reasoning",
20
+ reasoning: "grok-4.20-0309-reasoning",
21
+ nonReasoning: "grok-4.20-0309-non-reasoning",
22
+ multiAgent: "grok-4.20-multi-agent-0309",
23
+ code: "grok-code-fast-1",
24
+ };
25
+ function getBaseDir() {
26
+ return process.env.GROK_SESSION_DIR || path.join(os.homedir(), ".grok-cli");
27
+ }
28
+ function getManagementBaseUrl() {
29
+ return process.env.XAI_MANAGEMENT_BASE_URL || "https://management-api.x.ai/v1";
30
+ }
31
+ function loadConfigFile() {
32
+ const configPath = path.join(getBaseDir(), "config.json");
33
+ if (!fs.existsSync(configPath))
34
+ return {};
35
+ try {
36
+ return JSON.parse(fs.readFileSync(configPath, "utf-8"));
37
+ }
38
+ catch {
39
+ return {};
40
+ }
41
+ }
42
+ function normalizeMcpServers(value) {
43
+ if (!value)
44
+ return [];
45
+ if (Array.isArray(value)) {
46
+ return value.map((server) => ({
47
+ label: server.label,
48
+ url: server.url,
49
+ description: server.description,
50
+ allowedTools: server.allowedTools || [],
51
+ }));
52
+ }
53
+ return Object.entries(value).map(([label, url]) => ({ label, url }));
54
+ }
55
+ function mergeMcpServers(primary, secondary) {
56
+ const merged = [...primary];
57
+ for (const server of secondary) {
58
+ const existing = merged.find((entry) => entry.label === server.label || entry.url === server.url);
59
+ if (!existing) {
60
+ merged.push({ ...server, allowedTools: server.allowedTools || [] });
61
+ continue;
62
+ }
63
+ existing.description = existing.description || server.description;
64
+ existing.allowedTools = [
65
+ ...new Set([...(existing.allowedTools || []), ...(server.allowedTools || [])]),
66
+ ];
67
+ }
68
+ return merged;
69
+ }
70
+ export function getConfig(overrides = {}) {
71
+ const fileConfig = loadConfigFile();
72
+ const jsonOutput = overrides.jsonOutput ?? false;
73
+ const apiKey = overrides.apiKey || process.env.XAI_API_KEY || process.env.xAI_API_KEY || "";
74
+ const managementApiKey = overrides.managementApiKey ||
75
+ fileConfig.management_api_key ||
76
+ process.env.XAI_MANAGEMENT_API_KEY ||
77
+ process.env.GROK_MANAGEMENT_API_KEY ||
78
+ "";
79
+ if (!apiKey) {
80
+ console.error("Error: XAI_API_KEY not set.\n" +
81
+ "Get one at https://console.x.ai/team/default/api-keys\n" +
82
+ "Then: export XAI_API_KEY=your_key_here");
83
+ process.exit(1);
84
+ }
85
+ const fileMcpServers = normalizeMcpServers(fileConfig.mcp_servers);
86
+ const mcpServers = mergeMcpServers(fileMcpServers, overrides.mcpServers || []);
87
+ const fileServerTools = normalizeServerTools(fileConfig.server_tools);
88
+ const overrideServerTools = normalizeServerTools(overrides.serverTools);
89
+ const serverTools = normalizeServerTools([...fileServerTools, ...overrideServerTools]);
90
+ const needsResponsesApi = overrides.useResponsesApi ||
91
+ serverTools.length > 0 ||
92
+ mcpServers.length > 0 ||
93
+ (overrides.fileAttachments && overrides.fileAttachments.length > 0);
94
+ const sandboxMode = overrides.sandboxMode ||
95
+ fileConfig.sandbox_mode ||
96
+ process.env.GROK_SANDBOX_MODE ||
97
+ "danger-full-access";
98
+ return {
99
+ apiKey,
100
+ managementApiKey,
101
+ baseUrl: overrides.baseUrl || process.env.XAI_BASE_URL || "https://api.x.ai/v1",
102
+ managementBaseUrl: overrides.managementBaseUrl || fileConfig.management_base_url || getManagementBaseUrl(),
103
+ model: overrides.model || fileConfig.model || process.env.GROK_MODEL || MODELS.default,
104
+ maxTokens: overrides.maxTokens || 16384,
105
+ timeout: overrides.timeout || 600_000,
106
+ reasoningEffort: overrides.reasoningEffort || "high",
107
+ showReasoning: overrides.showReasoning ?? fileConfig.show_reasoning ?? false,
108
+ showToolCalls: jsonOutput ? false : (overrides.showToolCalls ?? true),
109
+ showUsage: overrides.showUsage ?? fileConfig.show_usage ?? false,
110
+ showCitations: overrides.showCitations ?? fileConfig.show_citations ?? true,
111
+ showDiffs: overrides.showDiffs ?? fileConfig.show_diffs ?? true,
112
+ showServerToolUsage: overrides.showServerToolUsage ?? fileConfig.show_server_tool_usage ?? false,
113
+ maxToolRounds: overrides.maxToolRounds || fileConfig.max_turns || 50,
114
+ serverTools,
115
+ useResponsesApi: !!needsResponsesApi,
116
+ sessionDir: getBaseDir(),
117
+ mcpServers,
118
+ imageInputs: overrides.imageInputs || [],
119
+ fileAttachments: overrides.fileAttachments || [],
120
+ jsonSchema: overrides.jsonSchema || null,
121
+ approvalPolicy: overrides.approvalPolicy || fileConfig.approval_policy || "always-approve",
122
+ sandboxMode,
123
+ toolApprovals: {
124
+ defaultMode: overrides.toolApprovals?.defaultMode || fileConfig.tool_approvals?.defaultMode,
125
+ tools: {
126
+ ...(fileConfig.tool_approvals?.tools || {}),
127
+ ...(overrides.toolApprovals?.tools || {}),
128
+ },
129
+ },
130
+ includeToolOutputs: overrides.includeToolOutputs ?? fileConfig.include_tool_outputs ?? false,
131
+ notify: overrides.notify ?? fileConfig.notify ?? false,
132
+ hooks: overrides.hooks || fileConfig.hooks || {},
133
+ convId: overrides.convId || null,
134
+ jsonOutput,
135
+ ephemeral: overrides.ephemeral ?? false,
136
+ outputFile: overrides.outputFile || null,
137
+ color: overrides.color || "auto",
138
+ maxOutputTokens: overrides.maxOutputTokens || 8000,
139
+ };
140
+ }
141
+ export { MODELS };
142
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/diff.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generate and display a simple unified diff between old and new content.
3
+ */
4
+ export declare function showDiff(filePath: string, oldContent: string, newContent: string): void;
5
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CA6EvF"}
package/dist/diff.js ADDED
@@ -0,0 +1,80 @@
1
+ import chalk from "chalk";
2
+ /**
3
+ * Generate and display a simple unified diff between old and new content.
4
+ */
5
+ export function showDiff(filePath, oldContent, newContent) {
6
+ const oldLines = oldContent.split("\n");
7
+ const newLines = newContent.split("\n");
8
+ console.error(chalk.dim(`--- a/${filePath}`));
9
+ console.error(chalk.dim(`+++ b/${filePath}`));
10
+ // Simple line-by-line diff (not optimal but clear)
11
+ const maxLen = Math.max(oldLines.length, newLines.length);
12
+ let inHunk = false;
13
+ let hunkStart = -1;
14
+ const hunks = [];
15
+ let currentHunk = [];
16
+ for (let i = 0; i < maxLen; i++) {
17
+ const oldLine = i < oldLines.length ? oldLines[i] : undefined;
18
+ const newLine = i < newLines.length ? newLines[i] : undefined;
19
+ if (oldLine === newLine) {
20
+ if (inHunk) {
21
+ // Context line after changes
22
+ currentHunk.push(` ${oldLine}`);
23
+ if (currentHunk.filter(l => l.startsWith("+") || l.startsWith("-")).length > 0) {
24
+ // Close hunk after 2 context lines
25
+ const remaining = currentHunk.slice(-2).every(l => l.startsWith(" "));
26
+ if (remaining && currentHunk.length > 6) {
27
+ hunks.push({ start: hunkStart, lines: currentHunk });
28
+ currentHunk = [];
29
+ inHunk = false;
30
+ }
31
+ }
32
+ }
33
+ }
34
+ else {
35
+ if (!inHunk) {
36
+ inHunk = true;
37
+ hunkStart = Math.max(0, i - 2);
38
+ // Add up to 2 context lines before
39
+ for (let j = Math.max(0, i - 2); j < i; j++) {
40
+ if (j < oldLines.length)
41
+ currentHunk.push(` ${oldLines[j]}`);
42
+ }
43
+ }
44
+ if (oldLine !== undefined && newLine !== undefined) {
45
+ currentHunk.push(`-${oldLine}`);
46
+ currentHunk.push(`+${newLine}`);
47
+ }
48
+ else if (oldLine !== undefined) {
49
+ currentHunk.push(`-${oldLine}`);
50
+ }
51
+ else if (newLine !== undefined) {
52
+ currentHunk.push(`+${newLine}`);
53
+ }
54
+ }
55
+ }
56
+ if (currentHunk.length > 0) {
57
+ hunks.push({ start: hunkStart, lines: currentHunk });
58
+ }
59
+ // Display hunks
60
+ for (const hunk of hunks) {
61
+ const removed = hunk.lines.filter(l => l.startsWith("-")).length;
62
+ const added = hunk.lines.filter(l => l.startsWith("+")).length;
63
+ console.error(chalk.cyan(`@@ -${hunk.start + 1},${removed} +${hunk.start + 1},${added} @@`));
64
+ for (const line of hunk.lines.slice(0, 30)) { // Cap display
65
+ if (line.startsWith("+")) {
66
+ console.error(chalk.green(line));
67
+ }
68
+ else if (line.startsWith("-")) {
69
+ console.error(chalk.red(line));
70
+ }
71
+ else {
72
+ console.error(chalk.dim(line));
73
+ }
74
+ }
75
+ if (hunk.lines.length > 30) {
76
+ console.error(chalk.dim(` ... ${hunk.lines.length - 30} more lines`));
77
+ }
78
+ }
79
+ }
80
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,QAAgB,EAAE,UAAkB,EAAE,UAAkB;IAC/E,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAExC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC9C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAC,CAAC;IAE9C,mDAAmD;IACnD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1D,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC;IACnB,MAAM,KAAK,GAAyC,EAAE,CAAC;IACvD,IAAI,WAAW,GAAa,EAAE,CAAC;IAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9D,MAAM,OAAO,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAE9D,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;YACxB,IAAI,MAAM,EAAE,CAAC;gBACX,6BAA6B;gBAC7B,WAAW,CAAC,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;gBAChC,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC/E,mCAAmC;oBACnC,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;oBACtE,IAAI,SAAS,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACxC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;wBACrD,WAAW,GAAG,EAAE,CAAC;wBACjB,MAAM,GAAG,KAAK,CAAC;oBACjB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,GAAG,IAAI,CAAC;gBACd,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC/B,mCAAmC;gBACnC,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC5C,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM;wBAAE,WAAW,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC/D,CAAC;YACH,CAAC;YAED,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBACnD,WAAW,CAAC,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;gBAChC,WAAW,CAAC,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;YAClC,CAAC;iBAAM,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBACjC,WAAW,CAAC,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;YAClC,CAAC;iBAAM,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBACjC,WAAW,CAAC,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,gBAAgB;IAChB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;QACjE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;QAC/D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,OAAO,KAAK,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC;QAE7F,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,cAAc;YAC1D,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACnC,CAAC;iBAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { HooksConfig } from "./types.js";
2
+ export interface HookEvent {
3
+ type: "pre-tool" | "post-tool" | "session-start" | "session-end";
4
+ tool?: string;
5
+ args?: string;
6
+ output?: string;
7
+ error?: boolean;
8
+ sessionId?: string;
9
+ }
10
+ export declare function runHooks(hooks: HooksConfig, event: HookEvent): void;
11
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,UAAU,GAAG,WAAW,GAAG,eAAe,GAAG,aAAa,CAAC;IACjE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,CA0BnE"}
package/dist/hooks.js ADDED
@@ -0,0 +1,30 @@
1
+ import { execSync } from "node:child_process";
2
+ import chalk from "chalk";
3
+ export function runHooks(hooks, event) {
4
+ const hookList = hooks[event.type];
5
+ if (!hookList || hookList.length === 0)
6
+ return;
7
+ for (const hookCmd of hookList) {
8
+ try {
9
+ const env = {
10
+ ...process.env,
11
+ GROK_HOOK_TYPE: event.type,
12
+ GROK_TOOL_NAME: event.tool || "",
13
+ GROK_TOOL_ARGS: event.args || "",
14
+ GROK_TOOL_OUTPUT: (event.output || "").slice(0, 4096),
15
+ GROK_TOOL_ERROR: String(event.error || false),
16
+ GROK_SESSION_ID: event.sessionId || "",
17
+ };
18
+ execSync(hookCmd, {
19
+ env,
20
+ stdio: "pipe",
21
+ timeout: 10_000,
22
+ encoding: "utf-8",
23
+ });
24
+ }
25
+ catch (err) {
26
+ console.error(chalk.dim(` Hook failed (${event.type}): ${err.message}`));
27
+ }
28
+ }
29
+ }
30
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,MAAM,OAAO,CAAC;AAY1B,MAAM,UAAU,QAAQ,CAAC,KAAkB,EAAE,KAAgB;IAC3D,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAE/C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG;gBACV,GAAG,OAAO,CAAC,GAAG;gBACd,cAAc,EAAE,KAAK,CAAC,IAAI;gBAC1B,cAAc,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE;gBAChC,cAAc,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE;gBAChC,gBAAgB,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;gBACrD,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC;gBAC7C,eAAe,EAAE,KAAK,CAAC,SAAS,IAAI,EAAE;aACvC,CAAC;YAEF,QAAQ,CAAC,OAAO,EAAE;gBAChB,GAAG;gBACH,KAAK,EAAE,MAAM;gBACb,OAAO,EAAE,MAAM;gBACf,QAAQ,EAAE,OAAO;aAClB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,KAAK,CAAC,IAAI,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare function isUrl(str: string): boolean;
2
+ export declare function readImageAsBase64(imagePath: string, cwd: string): string;
3
+ export declare function getImageDataUrl(imagePath: string, cwd: string): string;
4
+ /** Build chat.completions message content with image + text */
5
+ export declare function buildImageMessageContent(imageUrl: string, text: string): any[];
6
+ /** Build Responses API input content with image + text */
7
+ export declare function buildImageInputContent(imageUrl: string, text: string): any[];
8
+ //# sourceMappingURL=image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../src/image.ts"],"names":[],"mappings":"AAMA,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE1C;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAqBxE;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGtE;AAED,+DAA+D;AAC/D,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,GAAG,EAAE,CAW9E;AAED,0DAA0D;AAC1D,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,GAAG,EAAE,CAY5E"}