grok-dev 1.0.0-rc1
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/.cursor/rules/development-workflow.mdc +66 -0
- package/.cursor/rules/project-overview.mdc +66 -0
- package/.cursor/rules/react-ink-components.mdc +45 -0
- package/.cursor/rules/tools-and-agent.mdc +62 -0
- package/.cursor/rules/typescript-conventions.mdc +54 -0
- package/.grok/settings.json +3 -0
- package/.husky/pre-commit +1 -0
- package/LICENSE +21 -0
- package/README.md +526 -0
- package/biome.json +51 -0
- package/dist/agent/agent.d.ts +62 -0
- package/dist/agent/agent.js +701 -0
- package/dist/agent/agent.js.map +1 -0
- package/dist/agent/delegations.d.ts +42 -0
- package/dist/agent/delegations.js +273 -0
- package/dist/agent/delegations.js.map +1 -0
- package/dist/grok/client.d.ts +12 -0
- package/dist/grok/client.js +37 -0
- package/dist/grok/client.js.map +1 -0
- package/dist/grok/models.d.ts +5 -0
- package/dist/grok/models.js +73 -0
- package/dist/grok/models.js.map +1 -0
- package/dist/grok/tools.d.ts +12 -0
- package/dist/grok/tools.js +230 -0
- package/dist/grok/tools.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +192 -0
- package/dist/index.js.map +1 -0
- package/dist/storage/db.d.ts +18 -0
- package/dist/storage/db.js +71 -0
- package/dist/storage/db.js.map +1 -0
- package/dist/storage/index.d.ts +4 -0
- package/dist/storage/index.js +5 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/migrations.d.ts +2 -0
- package/dist/storage/migrations.js +92 -0
- package/dist/storage/migrations.js.map +1 -0
- package/dist/storage/sessions.d.ts +15 -0
- package/dist/storage/sessions.js +135 -0
- package/dist/storage/sessions.js.map +1 -0
- package/dist/storage/transcript.d.ts +6 -0
- package/dist/storage/transcript.js +261 -0
- package/dist/storage/transcript.js.map +1 -0
- package/dist/storage/usage.d.ts +9 -0
- package/dist/storage/usage.js +58 -0
- package/dist/storage/usage.js.map +1 -0
- package/dist/storage/workspaces.d.ts +9 -0
- package/dist/storage/workspaces.js +60 -0
- package/dist/storage/workspaces.js.map +1 -0
- package/dist/telegram/bridge.d.ts +39 -0
- package/dist/telegram/bridge.js +164 -0
- package/dist/telegram/bridge.js.map +1 -0
- package/dist/telegram/index.d.ts +3 -0
- package/dist/telegram/index.js +4 -0
- package/dist/telegram/index.js.map +1 -0
- package/dist/telegram/limits.d.ts +3 -0
- package/dist/telegram/limits.js +12 -0
- package/dist/telegram/limits.js.map +1 -0
- package/dist/telegram/pairing.d.ts +9 -0
- package/dist/telegram/pairing.js +30 -0
- package/dist/telegram/pairing.js.map +1 -0
- package/dist/telegram/preview-stream.d.ts +22 -0
- package/dist/telegram/preview-stream.js +181 -0
- package/dist/telegram/preview-stream.js.map +1 -0
- package/dist/telegram/turn-coordinator.d.ts +7 -0
- package/dist/telegram/turn-coordinator.js +14 -0
- package/dist/telegram/turn-coordinator.js.map +1 -0
- package/dist/telegram/typing-refresh.d.ts +3 -0
- package/dist/telegram/typing-refresh.js +12 -0
- package/dist/telegram/typing-refresh.js.map +1 -0
- package/dist/tools/bash.d.ts +27 -0
- package/dist/tools/bash.js +261 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/file.d.ts +15 -0
- package/dist/tools/file.js +94 -0
- package/dist/tools/file.js.map +1 -0
- package/dist/types/index.d.ts +151 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/dist/ui/app.d.ts +15 -0
- package/dist/ui/app.js +1720 -0
- package/dist/ui/app.js.map +1 -0
- package/dist/ui/markdown.d.ts +5 -0
- package/dist/ui/markdown.js +38 -0
- package/dist/ui/markdown.js.map +1 -0
- package/dist/ui/plan.d.ts +24 -0
- package/dist/ui/plan.js +122 -0
- package/dist/ui/plan.js.map +1 -0
- package/dist/ui/terminal-selection-text.d.ts +23 -0
- package/dist/ui/terminal-selection-text.js +59 -0
- package/dist/ui/terminal-selection-text.js.map +1 -0
- package/dist/ui/theme.d.ts +53 -0
- package/dist/ui/theme.js +53 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/utils/git-root.d.ts +1 -0
- package/dist/utils/git-root.js +16 -0
- package/dist/utils/git-root.js.map +1 -0
- package/dist/utils/host-clipboard.d.ts +4 -0
- package/dist/utils/host-clipboard.js +32 -0
- package/dist/utils/host-clipboard.js.map +1 -0
- package/dist/utils/instructions.d.ts +1 -0
- package/dist/utils/instructions.js +73 -0
- package/dist/utils/instructions.js.map +1 -0
- package/dist/utils/settings.d.ts +33 -0
- package/dist/utils/settings.js +88 -0
- package/dist/utils/settings.js.map +1 -0
- package/dist/utils/skills.d.ts +17 -0
- package/dist/utils/skills.js +161 -0
- package/dist/utils/skills.js.map +1 -0
- package/package.json +67 -0
- package/skills-lock.json +10 -0
- package/tmp/large_class.py +633 -0
package/dist/ui/theme.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export const dark = {
|
|
2
|
+
background: "#000000",
|
|
3
|
+
backgroundPanel: "#111111",
|
|
4
|
+
backgroundElement: "#1a1a1a",
|
|
5
|
+
border: "#333333",
|
|
6
|
+
borderActive: "#555555",
|
|
7
|
+
text: "#e0e0e0",
|
|
8
|
+
textMuted: "#666666",
|
|
9
|
+
textDim: "#444444",
|
|
10
|
+
primary: "#ffffff",
|
|
11
|
+
accent: "#5c9cf5",
|
|
12
|
+
subagentAccent: "#66d9c2",
|
|
13
|
+
selected: "#ffffff",
|
|
14
|
+
selectedBg: "#2a2a2a",
|
|
15
|
+
diffAdded: "#1e3a1e",
|
|
16
|
+
diffAddedFg: "#8adf8a",
|
|
17
|
+
diffAddedLineNum: "#3a6a3a",
|
|
18
|
+
diffRemoved: "#3a1e1e",
|
|
19
|
+
diffRemovedFg: "#df8a8a",
|
|
20
|
+
diffRemovedLineNum: "#6a3a3a",
|
|
21
|
+
diffContext: "#161616",
|
|
22
|
+
diffContextFg: "#999999",
|
|
23
|
+
diffLineNumber: "#555555",
|
|
24
|
+
diffHeader: "#1c1c1c",
|
|
25
|
+
diffHeaderFg: "#888888",
|
|
26
|
+
diffSeparator: "#1a1a1a",
|
|
27
|
+
diffSeparatorFg: "#555555",
|
|
28
|
+
mdHeading: "#e0e0e0",
|
|
29
|
+
mdBold: "#e8a465",
|
|
30
|
+
mdItalic: "#e5c07b",
|
|
31
|
+
mdCode: "#6abf6a",
|
|
32
|
+
mdCodeBlockBg: "#141414",
|
|
33
|
+
mdCodeBlockFg: "#c0c0c0",
|
|
34
|
+
mdLink: "#5c9cf5",
|
|
35
|
+
mdLinkText: "#d4a0d4",
|
|
36
|
+
mdHr: "#333333",
|
|
37
|
+
mdListBullet: "#666666",
|
|
38
|
+
planBorder: "#e5c07b",
|
|
39
|
+
planTitle: "#e5c07b",
|
|
40
|
+
planStepNum: "#e5c07b",
|
|
41
|
+
planStepTitle: "#e0e0e0",
|
|
42
|
+
planStepDesc: "#999999",
|
|
43
|
+
planStepFile: "#5c9cf5",
|
|
44
|
+
planQuestionText: "#e0e0e0",
|
|
45
|
+
planOptionDefault: "#888888",
|
|
46
|
+
planOptionSelected: "#e5c07b",
|
|
47
|
+
planOptionCheck: "#22c55e",
|
|
48
|
+
planInputBg: "#1a1a1a",
|
|
49
|
+
planInputText: "#e0e0e0",
|
|
50
|
+
planHint: "#555555",
|
|
51
|
+
queueBg: "#222222",
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/ui/theme.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,UAAU,EAAE,SAAS;IACrB,eAAe,EAAE,SAAS;IAC1B,iBAAiB,EAAE,SAAS;IAC5B,MAAM,EAAE,SAAS;IACjB,YAAY,EAAE,SAAS;IACvB,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,SAAS;IACpB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,SAAS;IACjB,cAAc,EAAE,SAAS;IACzB,QAAQ,EAAE,SAAS;IACnB,UAAU,EAAE,SAAS;IACrB,SAAS,EAAE,SAAS;IACpB,WAAW,EAAE,SAAS;IACtB,gBAAgB,EAAE,SAAS;IAC3B,WAAW,EAAE,SAAS;IACtB,aAAa,EAAE,SAAS;IACxB,kBAAkB,EAAE,SAAS;IAC7B,WAAW,EAAE,SAAS;IACtB,aAAa,EAAE,SAAS;IACxB,cAAc,EAAE,SAAS;IACzB,UAAU,EAAE,SAAS;IACrB,YAAY,EAAE,SAAS;IACvB,aAAa,EAAE,SAAS;IACxB,eAAe,EAAE,SAAS;IAC1B,SAAS,EAAE,SAAS;IACpB,MAAM,EAAE,SAAS;IACjB,QAAQ,EAAE,SAAS;IACnB,MAAM,EAAE,SAAS;IACjB,aAAa,EAAE,SAAS;IACxB,aAAa,EAAE,SAAS;IACxB,MAAM,EAAE,SAAS;IACjB,UAAU,EAAE,SAAS;IACrB,IAAI,EAAE,SAAS;IACf,YAAY,EAAE,SAAS;IACvB,UAAU,EAAE,SAAS;IACrB,SAAS,EAAE,SAAS;IACpB,WAAW,EAAE,SAAS;IACtB,aAAa,EAAE,SAAS;IACxB,YAAY,EAAE,SAAS;IACvB,YAAY,EAAE,SAAS;IACvB,gBAAgB,EAAE,SAAS;IAC3B,iBAAiB,EAAE,SAAS;IAC5B,kBAAkB,EAAE,SAAS;IAC7B,eAAe,EAAE,SAAS;IAC1B,WAAW,EAAE,SAAS;IACtB,aAAa,EAAE,SAAS;IACxB,QAAQ,EAAE,SAAS;IACnB,OAAO,EAAE,SAAS;CACV,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function findGitRoot(start: string): string | null;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
export function findGitRoot(start) {
|
|
4
|
+
let current = start;
|
|
5
|
+
while (true) {
|
|
6
|
+
const gitPath = path.join(current, ".git");
|
|
7
|
+
if (fs.existsSync(gitPath)) {
|
|
8
|
+
return current;
|
|
9
|
+
}
|
|
10
|
+
const parent = path.dirname(current);
|
|
11
|
+
if (parent === current)
|
|
12
|
+
return null;
|
|
13
|
+
current = parent;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=git-root.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-root.js","sourceRoot":"","sources":["../../src/utils/git-root.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3C,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,MAAM,KAAK,OAAO;YAAE,OAAO,IAAI,CAAC;QACpC,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
/**
|
|
4
|
+
* Put plain text on the OS clipboard (OpenCode-style fallback when OSC 52 is not enough).
|
|
5
|
+
*/
|
|
6
|
+
export function copyTextToHostClipboard(text) {
|
|
7
|
+
const platform = os.platform();
|
|
8
|
+
if (platform === "darwin") {
|
|
9
|
+
const r = spawnSync("pbcopy", [], { input: text });
|
|
10
|
+
if (r.status === 0)
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
if (platform === "linux") {
|
|
14
|
+
if (process.env.WAYLAND_DISPLAY) {
|
|
15
|
+
const w = spawnSync("wl-copy", [], { input: text });
|
|
16
|
+
if (w.status === 0)
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const x = spawnSync("xclip", ["-selection", "clipboard"], { input: text });
|
|
20
|
+
if (x.status === 0)
|
|
21
|
+
return;
|
|
22
|
+
const s = spawnSync("xsel", ["--clipboard", "--input"], { input: text });
|
|
23
|
+
if (s.status === 0)
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (platform === "win32") {
|
|
27
|
+
const clip = spawnSync("clip", [], { input: text });
|
|
28
|
+
if (clip.status === 0)
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=host-clipboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-clipboard.js","sourceRoot":"","sources":["../../src/utils/host-clipboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAE/B,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,SAAS,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;IAC7B,CAAC;IAED,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;YAChC,MAAM,CAAC,GAAG,SAAS,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACpD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;QAC7B,CAAC;QACD,MAAM,CAAC,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3E,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC3B,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,aAAa,EAAE,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACzE,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;IAC7B,CAAC;IAED,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;IAChC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function loadCustomInstructions(cwd: string): string | null;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import * as fs from "fs";
|
|
2
|
+
import * as os from "os";
|
|
3
|
+
import * as path from "path";
|
|
4
|
+
import { findGitRoot } from "./git-root";
|
|
5
|
+
function readNonEmptyFile(filePath) {
|
|
6
|
+
try {
|
|
7
|
+
if (!fs.existsSync(filePath))
|
|
8
|
+
return null;
|
|
9
|
+
const text = fs.readFileSync(filePath, "utf-8").trim();
|
|
10
|
+
return text.length > 0 ? text : null;
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function directoryChain(fromRoot, toCwd) {
|
|
17
|
+
const rel = path.relative(fromRoot, toCwd);
|
|
18
|
+
if (rel === "")
|
|
19
|
+
return [fromRoot];
|
|
20
|
+
if (rel.startsWith(".."))
|
|
21
|
+
return [toCwd];
|
|
22
|
+
const segments = rel.split(path.sep).filter(Boolean);
|
|
23
|
+
const chain = [];
|
|
24
|
+
let acc = fromRoot;
|
|
25
|
+
chain.push(acc);
|
|
26
|
+
for (const segment of segments) {
|
|
27
|
+
acc = path.join(acc, segment);
|
|
28
|
+
chain.push(acc);
|
|
29
|
+
}
|
|
30
|
+
return chain;
|
|
31
|
+
}
|
|
32
|
+
function loadGrokMd(cwd) {
|
|
33
|
+
const projectPath = path.join(cwd, ".grok", "GROK.md");
|
|
34
|
+
const globalPath = path.join(os.homedir(), ".grok", "GROK.md");
|
|
35
|
+
return readNonEmptyFile(projectPath) ?? readNonEmptyFile(globalPath);
|
|
36
|
+
}
|
|
37
|
+
function loadAgentsSegments(canonicalCwd) {
|
|
38
|
+
const segments = [];
|
|
39
|
+
const globalAgents = readNonEmptyFile(path.join(os.homedir(), ".grok", "AGENTS.md"));
|
|
40
|
+
if (globalAgents)
|
|
41
|
+
segments.push(globalAgents);
|
|
42
|
+
const root = findGitRoot(canonicalCwd) ?? canonicalCwd;
|
|
43
|
+
for (const dir of directoryChain(root, canonicalCwd)) {
|
|
44
|
+
const overridePath = path.join(dir, "AGENTS.override.md");
|
|
45
|
+
if (fs.existsSync(overridePath)) {
|
|
46
|
+
const text = readNonEmptyFile(overridePath);
|
|
47
|
+
if (text)
|
|
48
|
+
segments.push(text);
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
const text = readNonEmptyFile(path.join(dir, "AGENTS.md"));
|
|
52
|
+
if (text)
|
|
53
|
+
segments.push(text);
|
|
54
|
+
}
|
|
55
|
+
return segments;
|
|
56
|
+
}
|
|
57
|
+
export function loadCustomInstructions(cwd) {
|
|
58
|
+
let canonical;
|
|
59
|
+
try {
|
|
60
|
+
canonical = fs.realpathSync.native(cwd);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
canonical = path.resolve(cwd);
|
|
64
|
+
}
|
|
65
|
+
const parts = [...loadAgentsSegments(canonical)];
|
|
66
|
+
const grok = loadGrokMd(canonical);
|
|
67
|
+
if (grok)
|
|
68
|
+
parts.push(grok);
|
|
69
|
+
if (parts.length === 0)
|
|
70
|
+
return null;
|
|
71
|
+
return parts.join("\n\n");
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=instructions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instructions.js","sourceRoot":"","sources":["../../src/utils/instructions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export type TelegramStreamingMode = "off" | "partial";
|
|
2
|
+
export interface TelegramSettings {
|
|
3
|
+
botToken?: string;
|
|
4
|
+
approvedUserIds?: number[];
|
|
5
|
+
sessionsByUserId?: Record<string, string>;
|
|
6
|
+
/** Live preview while generating. Default: partial (send + edit). Use `off` for buffer-then-send only. */
|
|
7
|
+
streaming?: TelegramStreamingMode;
|
|
8
|
+
/** Send `typing` chat action on an interval while the agent runs. Default: true. */
|
|
9
|
+
typingIndicator?: boolean;
|
|
10
|
+
/** Reserved: Bot API `sendMessageDraft` for private DMs (not implemented yet). */
|
|
11
|
+
nativeDrafts?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface UserSettings {
|
|
14
|
+
apiKey?: string;
|
|
15
|
+
defaultModel?: string;
|
|
16
|
+
telegram?: TelegramSettings;
|
|
17
|
+
}
|
|
18
|
+
export interface ProjectSettings {
|
|
19
|
+
model?: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function loadUserSettings(): UserSettings;
|
|
22
|
+
export declare function saveUserSettings(partial: Partial<UserSettings>): void;
|
|
23
|
+
export declare function loadProjectSettings(): ProjectSettings;
|
|
24
|
+
export declare function saveProjectSettings(partial: Partial<ProjectSettings>): void;
|
|
25
|
+
export declare function getApiKey(): string | undefined;
|
|
26
|
+
export declare function getBaseURL(): string;
|
|
27
|
+
export declare function getCurrentModel(): string;
|
|
28
|
+
export declare function getTelegramBotToken(): string | undefined;
|
|
29
|
+
export declare function resolveTelegramStreamSettings(t: TelegramSettings | undefined): {
|
|
30
|
+
streaming: TelegramStreamingMode;
|
|
31
|
+
typingIndicator: boolean;
|
|
32
|
+
nativeDrafts: boolean;
|
|
33
|
+
};
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import * as fs from "fs";
|
|
2
|
+
import * as os from "os";
|
|
3
|
+
import * as path from "path";
|
|
4
|
+
import { DEFAULT_MODEL } from "../grok/models";
|
|
5
|
+
const USER_DIR = path.join(os.homedir(), ".grok");
|
|
6
|
+
const USER_SETTINGS_PATH = path.join(USER_DIR, "user-settings.json");
|
|
7
|
+
function ensureDir(dir) {
|
|
8
|
+
if (!fs.existsSync(dir)) {
|
|
9
|
+
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function readJson(filePath) {
|
|
13
|
+
try {
|
|
14
|
+
if (!fs.existsSync(filePath))
|
|
15
|
+
return null;
|
|
16
|
+
return JSON.parse(fs.readFileSync(filePath, "utf-8"));
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function writeJson(filePath, data) {
|
|
23
|
+
ensureDir(path.dirname(filePath));
|
|
24
|
+
fs.writeFileSync(filePath, JSON.stringify(data, null, 2), { mode: 0o600 });
|
|
25
|
+
}
|
|
26
|
+
export function loadUserSettings() {
|
|
27
|
+
return readJson(USER_SETTINGS_PATH) || {};
|
|
28
|
+
}
|
|
29
|
+
export function saveUserSettings(partial) {
|
|
30
|
+
const current = loadUserSettings();
|
|
31
|
+
const next = {
|
|
32
|
+
...current,
|
|
33
|
+
...partial,
|
|
34
|
+
...(partial.apiKey !== undefined ? { apiKey: partial.apiKey } : {}),
|
|
35
|
+
...(partial.defaultModel !== undefined ? { defaultModel: partial.defaultModel } : {}),
|
|
36
|
+
...(partial.telegram !== undefined
|
|
37
|
+
? {
|
|
38
|
+
telegram: {
|
|
39
|
+
...current.telegram,
|
|
40
|
+
...partial.telegram,
|
|
41
|
+
sessionsByUserId: {
|
|
42
|
+
...current.telegram?.sessionsByUserId,
|
|
43
|
+
...partial.telegram?.sessionsByUserId,
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
}
|
|
47
|
+
: {}),
|
|
48
|
+
};
|
|
49
|
+
writeJson(USER_SETTINGS_PATH, next);
|
|
50
|
+
}
|
|
51
|
+
export function loadProjectSettings() {
|
|
52
|
+
const projectPath = path.join(process.cwd(), ".grok", "settings.json");
|
|
53
|
+
return readJson(projectPath) || {};
|
|
54
|
+
}
|
|
55
|
+
export function saveProjectSettings(partial) {
|
|
56
|
+
const projectPath = path.join(process.cwd(), ".grok", "settings.json");
|
|
57
|
+
const current = loadProjectSettings();
|
|
58
|
+
writeJson(projectPath, { ...current, ...partial });
|
|
59
|
+
}
|
|
60
|
+
export function getApiKey() {
|
|
61
|
+
return process.env.GROK_API_KEY || loadUserSettings().apiKey;
|
|
62
|
+
}
|
|
63
|
+
export function getBaseURL() {
|
|
64
|
+
return process.env.GROK_BASE_URL || "https://api.x.ai/v1";
|
|
65
|
+
}
|
|
66
|
+
export function getCurrentModel() {
|
|
67
|
+
if (process.env.GROK_MODEL)
|
|
68
|
+
return process.env.GROK_MODEL;
|
|
69
|
+
const project = loadProjectSettings();
|
|
70
|
+
if (project.model)
|
|
71
|
+
return project.model;
|
|
72
|
+
const user = loadUserSettings();
|
|
73
|
+
return user.defaultModel || DEFAULT_MODEL;
|
|
74
|
+
}
|
|
75
|
+
export function getTelegramBotToken() {
|
|
76
|
+
const env = process.env.TELEGRAM_BOT_TOKEN?.trim();
|
|
77
|
+
if (env)
|
|
78
|
+
return env;
|
|
79
|
+
return loadUserSettings().telegram?.botToken?.trim();
|
|
80
|
+
}
|
|
81
|
+
export function resolveTelegramStreamSettings(t) {
|
|
82
|
+
return {
|
|
83
|
+
streaming: t?.streaming === "off" ? "off" : "partial",
|
|
84
|
+
typingIndicator: t?.typingIndicator !== false,
|
|
85
|
+
nativeDrafts: t?.nativeDrafts === true,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/utils/settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type SkillScope = "project" | "user";
|
|
2
|
+
export interface DiscoveredSkill {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
skillMdPath: string;
|
|
6
|
+
rootDir: string;
|
|
7
|
+
scope: SkillScope;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Discover Agent Skills under ~/.agents/skills and <projectRoot>/.agents/skills.
|
|
11
|
+
* Project-level skills override user-level skills with the same `name` (frontmatter).
|
|
12
|
+
*/
|
|
13
|
+
export declare function discoverSkills(projectRoot: string): DiscoveredSkill[];
|
|
14
|
+
/** OpenCode-style XML catalog plus activation instructions for read_file. Returns null if no skills. */
|
|
15
|
+
export declare function formatSkillsForPrompt(skills: DiscoveredSkill[]): string | null;
|
|
16
|
+
/** Plain-text listing for /skills slash command in the TUI. */
|
|
17
|
+
export declare function formatSkillsForChat(skills: DiscoveredSkill[], projectRoot: string): string;
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import * as fs from "fs";
|
|
2
|
+
import * as os from "os";
|
|
3
|
+
import * as path from "path";
|
|
4
|
+
function escapeXml(text) {
|
|
5
|
+
return text.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
6
|
+
}
|
|
7
|
+
function stripQuotes(s) {
|
|
8
|
+
const t = s.trim();
|
|
9
|
+
if ((t.startsWith('"') && t.endsWith('"')) || (t.startsWith("'") && t.endsWith("'"))) {
|
|
10
|
+
return t.slice(1, -1).replace(/\\n/g, "\n");
|
|
11
|
+
}
|
|
12
|
+
return t;
|
|
13
|
+
}
|
|
14
|
+
/** Minimal YAML frontmatter key extraction for flat `key: value` and optional `|` / `>` blocks after description. */
|
|
15
|
+
function parseSkillFrontmatter(raw) {
|
|
16
|
+
const lines = raw.split(/\r?\n/);
|
|
17
|
+
const out = {};
|
|
18
|
+
for (let i = 0; i < lines.length; i++) {
|
|
19
|
+
const line = lines[i];
|
|
20
|
+
const nameM = line.match(/^name:\s*(.*)$/);
|
|
21
|
+
if (nameM) {
|
|
22
|
+
const rest = nameM[1].trim();
|
|
23
|
+
out.name = stripQuotes(rest);
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
const descM = line.match(/^description:\s*(.*)$/);
|
|
27
|
+
if (descM) {
|
|
28
|
+
const rest = descM[1].trim();
|
|
29
|
+
if (rest === "|" || rest === ">" || rest === "|-" || rest === ">-") {
|
|
30
|
+
i++;
|
|
31
|
+
const block = [];
|
|
32
|
+
while (i < lines.length) {
|
|
33
|
+
const L = lines[i];
|
|
34
|
+
if (L.match(/^[a-zA-Z0-9_-]+:\s/) && !/^\s/.test(L))
|
|
35
|
+
break;
|
|
36
|
+
if (/^\s/.test(L) || (block.length > 0 && L === "")) {
|
|
37
|
+
block.push(L.replace(/^\s+/, ""));
|
|
38
|
+
i++;
|
|
39
|
+
}
|
|
40
|
+
else if (block.length > 0) {
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
i--;
|
|
48
|
+
out.description = block.join("\n").trim();
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
out.description = stripQuotes(rest);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return out;
|
|
56
|
+
}
|
|
57
|
+
function extractFrontmatter(fileContent) {
|
|
58
|
+
const trimmed = fileContent.trimStart();
|
|
59
|
+
if (!trimmed.startsWith("---"))
|
|
60
|
+
return { frontmatter: "", ok: false };
|
|
61
|
+
const afterFirst = trimmed.slice(3).split(/\r?\n/);
|
|
62
|
+
const restLines = afterFirst.slice(1);
|
|
63
|
+
const end = restLines.findIndex((l) => l.trim() === "---");
|
|
64
|
+
if (end < 0)
|
|
65
|
+
return { frontmatter: "", ok: false };
|
|
66
|
+
return { frontmatter: restLines.slice(0, end).join("\n"), ok: true };
|
|
67
|
+
}
|
|
68
|
+
function loadSkillFromDir(rootDir, scope) {
|
|
69
|
+
const skillMdPath = path.join(rootDir, "SKILL.md");
|
|
70
|
+
try {
|
|
71
|
+
if (!fs.existsSync(skillMdPath) || !fs.statSync(skillMdPath).isFile())
|
|
72
|
+
return null;
|
|
73
|
+
const content = fs.readFileSync(skillMdPath, "utf-8");
|
|
74
|
+
const { frontmatter, ok } = extractFrontmatter(content);
|
|
75
|
+
if (!ok)
|
|
76
|
+
return null;
|
|
77
|
+
const meta = parseSkillFrontmatter(frontmatter);
|
|
78
|
+
const name = meta.name?.trim();
|
|
79
|
+
const description = meta.description?.trim();
|
|
80
|
+
if (!name || !description)
|
|
81
|
+
return null;
|
|
82
|
+
return {
|
|
83
|
+
name,
|
|
84
|
+
description,
|
|
85
|
+
skillMdPath: path.resolve(skillMdPath),
|
|
86
|
+
rootDir: path.resolve(rootDir),
|
|
87
|
+
scope,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function listSkillDirectories(skillsRoot) {
|
|
95
|
+
try {
|
|
96
|
+
if (!fs.existsSync(skillsRoot) || !fs.statSync(skillsRoot).isDirectory())
|
|
97
|
+
return [];
|
|
98
|
+
const entries = fs.readdirSync(skillsRoot, { withFileTypes: true });
|
|
99
|
+
const dirs = [];
|
|
100
|
+
for (const e of entries) {
|
|
101
|
+
if (!e.isDirectory())
|
|
102
|
+
continue;
|
|
103
|
+
if (e.name.startsWith("."))
|
|
104
|
+
continue;
|
|
105
|
+
dirs.push(path.join(skillsRoot, e.name));
|
|
106
|
+
}
|
|
107
|
+
return dirs.sort();
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return [];
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Discover Agent Skills under ~/.agents/skills and <projectRoot>/.agents/skills.
|
|
115
|
+
* Project-level skills override user-level skills with the same `name` (frontmatter).
|
|
116
|
+
*/
|
|
117
|
+
export function discoverSkills(projectRoot) {
|
|
118
|
+
const userRoot = path.join(os.homedir(), ".agents", "skills");
|
|
119
|
+
const projectSkillsRoot = path.join(projectRoot, ".agents", "skills");
|
|
120
|
+
const byName = new Map();
|
|
121
|
+
for (const dir of listSkillDirectories(userRoot)) {
|
|
122
|
+
const s = loadSkillFromDir(dir, "user");
|
|
123
|
+
if (s)
|
|
124
|
+
byName.set(s.name, s);
|
|
125
|
+
}
|
|
126
|
+
for (const dir of listSkillDirectories(projectSkillsRoot)) {
|
|
127
|
+
const s = loadSkillFromDir(dir, "project");
|
|
128
|
+
if (s)
|
|
129
|
+
byName.set(s.name, s);
|
|
130
|
+
}
|
|
131
|
+
return [...byName.values()].sort((a, b) => a.name.localeCompare(b.name));
|
|
132
|
+
}
|
|
133
|
+
const SKILLS_INSTRUCTIONS = `AGENT SKILLS (optional):
|
|
134
|
+
The following <available_skills> list specialized workflows. Use them when they might help the user's request — not only on exact keyword matches.
|
|
135
|
+
If a skill's description fits the task or could improve consistency, read that skill's instructions first using read_file with the path from <location>, then follow the SKILL.md body.
|
|
136
|
+
Paths inside a skill (scripts/, references/, assets/) are relative to the skill directory (the folder containing SKILL.md); prefer absolute paths in tool calls.`;
|
|
137
|
+
/** OpenCode-style XML catalog plus activation instructions for read_file. Returns null if no skills. */
|
|
138
|
+
export function formatSkillsForPrompt(skills) {
|
|
139
|
+
if (skills.length === 0)
|
|
140
|
+
return null;
|
|
141
|
+
const parts = skills.map((s) => ` <skill>\n <name>${escapeXml(s.name)}</name>\n <description>${escapeXml(s.description)}</description>\n <location>${escapeXml(s.skillMdPath)}</location>\n </skill>`);
|
|
142
|
+
return `${SKILLS_INSTRUCTIONS}\n\n<available_skills>\n${parts.join("\n")}\n</available_skills>`;
|
|
143
|
+
}
|
|
144
|
+
/** Plain-text listing for /skills slash command in the TUI. */
|
|
145
|
+
export function formatSkillsForChat(skills, projectRoot) {
|
|
146
|
+
if (skills.length === 0) {
|
|
147
|
+
return [
|
|
148
|
+
"No Agent Skills found.",
|
|
149
|
+
"",
|
|
150
|
+
`Add skills under ${path.join(projectRoot, ".agents", "skills", "<name>", "SKILL.md")} or ~/.agents/skills/<name>/SKILL.md`,
|
|
151
|
+
"Install manually or use scripts such as skills.sh; see https://agentskills.io",
|
|
152
|
+
].join("\n");
|
|
153
|
+
}
|
|
154
|
+
const lines = [
|
|
155
|
+
`Agent Skills (${skills.length})`,
|
|
156
|
+
"",
|
|
157
|
+
...skills.map((s) => `- ${s.name} [${s.scope}]\n ${s.description}\n ${s.skillMdPath}`),
|
|
158
|
+
];
|
|
159
|
+
return lines.join("\n");
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/utils/skills.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "grok-dev",
|
|
3
|
+
"version": "1.0.0-rc1",
|
|
4
|
+
"description": "An open-source AI coding agent powered by Grok, built with Bun and OpenTUI.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"import": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"bin": {
|
|
14
|
+
"grok": "dist/index.js"
|
|
15
|
+
},
|
|
16
|
+
"scripts": {
|
|
17
|
+
"dev": "bun run src/index.ts",
|
|
18
|
+
"build": "tsc",
|
|
19
|
+
"start": "bun run dist/index.js",
|
|
20
|
+
"typecheck": "tsc --noEmit",
|
|
21
|
+
"lint": "biome check src/",
|
|
22
|
+
"format": "biome format src/",
|
|
23
|
+
"format:fix": "biome format --write src/",
|
|
24
|
+
"lint:fix": "biome check --fix src/",
|
|
25
|
+
"pre-commit": "lint-staged",
|
|
26
|
+
"prepare": "husky"
|
|
27
|
+
},
|
|
28
|
+
"lint-staged": {
|
|
29
|
+
"*.{ts,tsx,js,mjs,cjs,json}": "biome check --write --no-errors-on-unmatched"
|
|
30
|
+
},
|
|
31
|
+
"keywords": [
|
|
32
|
+
"cli",
|
|
33
|
+
"agent",
|
|
34
|
+
"grok",
|
|
35
|
+
"ai",
|
|
36
|
+
"coding",
|
|
37
|
+
"terminal",
|
|
38
|
+
"opentui"
|
|
39
|
+
],
|
|
40
|
+
"author": "Vibe Kit",
|
|
41
|
+
"license": "MIT",
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"@ai-sdk/xai": "^3.0.67",
|
|
44
|
+
"@opentui/core": "^0.1.88",
|
|
45
|
+
"@opentui/react": "^0.1.88",
|
|
46
|
+
"ai": "^6.0.116",
|
|
47
|
+
"commander": "^12.1.0",
|
|
48
|
+
"diff": "^8.0.3",
|
|
49
|
+
"dotenv": "^16.6.1",
|
|
50
|
+
"grammy": "^1.41.1",
|
|
51
|
+
"react": "^19.2.4",
|
|
52
|
+
"zod": "^4.3.6"
|
|
53
|
+
},
|
|
54
|
+
"devDependencies": {
|
|
55
|
+
"@biomejs/biome": "^2.4.8",
|
|
56
|
+
"@types/diff": "^8.0.0",
|
|
57
|
+
"@types/node": "^22.19.15",
|
|
58
|
+
"@types/react": "^19.2.14",
|
|
59
|
+
"husky": "^9.1.7",
|
|
60
|
+
"lint-staged": "^16.4.0",
|
|
61
|
+
"typescript": "^5.9.3"
|
|
62
|
+
},
|
|
63
|
+
"engines": {
|
|
64
|
+
"node": ">=18.0.0"
|
|
65
|
+
},
|
|
66
|
+
"preferGlobal": true
|
|
67
|
+
}
|