@kenkaiiii/ggcoder 0.0.1
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/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +220 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +13 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +25 -0
- package/dist/config.js.map +1 -0
- package/dist/core/agent-session.d.ts +63 -0
- package/dist/core/agent-session.d.ts.map +1 -0
- package/dist/core/agent-session.js +269 -0
- package/dist/core/agent-session.js.map +1 -0
- package/dist/core/auth-storage.d.ts +29 -0
- package/dist/core/auth-storage.d.ts.map +1 -0
- package/dist/core/auth-storage.js +89 -0
- package/dist/core/auth-storage.js.map +1 -0
- package/dist/core/compaction/compactor.d.ts +26 -0
- package/dist/core/compaction/compactor.d.ts.map +1 -0
- package/dist/core/compaction/compactor.js +87 -0
- package/dist/core/compaction/compactor.js.map +1 -0
- package/dist/core/compaction/token-estimator.d.ts +5 -0
- package/dist/core/compaction/token-estimator.d.ts.map +1 -0
- package/dist/core/compaction/token-estimator.js +36 -0
- package/dist/core/compaction/token-estimator.js.map +1 -0
- package/dist/core/event-bus.d.ts +71 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/event-bus.js +72 -0
- package/dist/core/event-bus.js.map +1 -0
- package/dist/core/extensions/loader.d.ts +8 -0
- package/dist/core/extensions/loader.d.ts.map +1 -0
- package/dist/core/extensions/loader.js +48 -0
- package/dist/core/extensions/loader.js.map +1 -0
- package/dist/core/extensions/types.d.ts +19 -0
- package/dist/core/extensions/types.d.ts.map +1 -0
- package/dist/core/extensions/types.js +2 -0
- package/dist/core/extensions/types.js.map +1 -0
- package/dist/core/index.d.ts +13 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +12 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/model-registry.d.ts +17 -0
- package/dist/core/model-registry.d.ts.map +1 -0
- package/dist/core/model-registry.js +86 -0
- package/dist/core/model-registry.js.map +1 -0
- package/dist/core/oauth/anthropic.d.ts +4 -0
- package/dist/core/oauth/anthropic.d.ts.map +1 -0
- package/dist/core/oauth/anthropic.js +73 -0
- package/dist/core/oauth/anthropic.js.map +1 -0
- package/dist/core/oauth/openai.d.ts +4 -0
- package/dist/core/oauth/openai.d.ts.map +1 -0
- package/dist/core/oauth/openai.js +186 -0
- package/dist/core/oauth/openai.js.map +1 -0
- package/dist/core/oauth/pkce.d.ts +5 -0
- package/dist/core/oauth/pkce.d.ts.map +1 -0
- package/dist/core/oauth/pkce.js +17 -0
- package/dist/core/oauth/pkce.js.map +1 -0
- package/dist/core/oauth/types.d.ts +12 -0
- package/dist/core/oauth/types.d.ts.map +1 -0
- package/dist/core/oauth/types.js +2 -0
- package/dist/core/oauth/types.js.map +1 -0
- package/dist/core/session-manager.d.ts +74 -0
- package/dist/core/session-manager.d.ts.map +1 -0
- package/dist/core/session-manager.js +166 -0
- package/dist/core/session-manager.js.map +1 -0
- package/dist/core/settings-manager.d.ts +38 -0
- package/dist/core/settings-manager.d.ts.map +1 -0
- package/dist/core/settings-manager.js +62 -0
- package/dist/core/settings-manager.js.map +1 -0
- package/dist/core/skills.d.ts +23 -0
- package/dist/core/skills.d.ts.map +1 -0
- package/dist/core/skills.js +89 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/slash-commands.d.ts +31 -0
- package/dist/core/slash-commands.d.ts.map +1 -0
- package/dist/core/slash-commands.js +161 -0
- package/dist/core/slash-commands.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/interactive.d.ts +3 -0
- package/dist/interactive.d.ts.map +1 -0
- package/dist/interactive.js +153 -0
- package/dist/interactive.js.map +1 -0
- package/dist/modes/index.d.ts +2 -0
- package/dist/modes/index.d.ts.map +1 -0
- package/dist/modes/index.js +2 -0
- package/dist/modes/index.js.map +1 -0
- package/dist/modes/print-mode.d.ts +12 -0
- package/dist/modes/print-mode.d.ts.map +1 -0
- package/dist/modes/print-mode.js +42 -0
- package/dist/modes/print-mode.js.map +1 -0
- package/dist/session.d.ts +16 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +122 -0
- package/dist/session.js.map +1 -0
- package/dist/system-prompt.d.ts +6 -0
- package/dist/system-prompt.d.ts.map +1 -0
- package/dist/system-prompt.js +70 -0
- package/dist/system-prompt.js.map +1 -0
- package/dist/tools/bash.d.ts +9 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +81 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/edit-diff.d.ts +18 -0
- package/dist/tools/edit-diff.d.ts.map +1 -0
- package/dist/tools/edit-diff.js +92 -0
- package/dist/tools/edit-diff.js.map +1 -0
- package/dist/tools/edit.d.ts +10 -0
- package/dist/tools/edit.d.ts.map +1 -0
- package/dist/tools/edit.js +53 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/find.d.ts +9 -0
- package/dist/tools/find.d.ts.map +1 -0
- package/dist/tools/find.js +59 -0
- package/dist/tools/find.js.map +1 -0
- package/dist/tools/grep.d.ts +12 -0
- package/dist/tools/grep.d.ts.map +1 -0
- package/dist/tools/grep.js +107 -0
- package/dist/tools/grep.js.map +1 -0
- package/dist/tools/index.d.ts +10 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +26 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/ls.d.ts +9 -0
- package/dist/tools/ls.d.ts.map +1 -0
- package/dist/tools/ls.js +56 -0
- package/dist/tools/ls.js.map +1 -0
- package/dist/tools/path-utils.d.ts +2 -0
- package/dist/tools/path-utils.d.ts.map +1 -0
- package/dist/tools/path-utils.js +9 -0
- package/dist/tools/path-utils.js.map +1 -0
- package/dist/tools/read.d.ts +11 -0
- package/dist/tools/read.d.ts.map +1 -0
- package/dist/tools/read.js +98 -0
- package/dist/tools/read.js.map +1 -0
- package/dist/tools/truncate.d.ts +19 -0
- package/dist/tools/truncate.d.ts.map +1 -0
- package/dist/tools/truncate.js +59 -0
- package/dist/tools/truncate.js.map +1 -0
- package/dist/tools/write.d.ts +9 -0
- package/dist/tools/write.d.ts.map +1 -0
- package/dist/tools/write.js +23 -0
- package/dist/tools/write.js.map +1 -0
- package/dist/types.d.ts +36 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/App.d.ts +19 -0
- package/dist/ui/App.d.ts.map +1 -0
- package/dist/ui/App.js +209 -0
- package/dist/ui/App.js.map +1 -0
- package/dist/ui/components/AssistantMessage.d.ts +8 -0
- package/dist/ui/components/AssistantMessage.d.ts.map +1 -0
- package/dist/ui/components/AssistantMessage.js +10 -0
- package/dist/ui/components/AssistantMessage.js.map +1 -0
- package/dist/ui/components/DiffView.d.ts +4 -0
- package/dist/ui/components/DiffView.d.ts.map +1 -0
- package/dist/ui/components/DiffView.js +20 -0
- package/dist/ui/components/DiffView.js.map +1 -0
- package/dist/ui/components/Footer.d.ts +9 -0
- package/dist/ui/components/Footer.d.ts.map +1 -0
- package/dist/ui/components/Footer.js +79 -0
- package/dist/ui/components/Footer.js.map +1 -0
- package/dist/ui/components/InputArea.d.ts +8 -0
- package/dist/ui/components/InputArea.d.ts.map +1 -0
- package/dist/ui/components/InputArea.js +143 -0
- package/dist/ui/components/InputArea.js.map +1 -0
- package/dist/ui/components/Markdown.d.ts +7 -0
- package/dist/ui/components/Markdown.d.ts.map +1 -0
- package/dist/ui/components/Markdown.js +215 -0
- package/dist/ui/components/Markdown.js.map +1 -0
- package/dist/ui/components/ModelSelector.d.ts +7 -0
- package/dist/ui/components/ModelSelector.d.ts.map +1 -0
- package/dist/ui/components/ModelSelector.js +14 -0
- package/dist/ui/components/ModelSelector.js.map +1 -0
- package/dist/ui/components/Overlay.d.ts +8 -0
- package/dist/ui/components/Overlay.d.ts.map +1 -0
- package/dist/ui/components/Overlay.js +9 -0
- package/dist/ui/components/Overlay.js.map +1 -0
- package/dist/ui/components/SelectList.d.ts +13 -0
- package/dist/ui/components/SelectList.d.ts.map +1 -0
- package/dist/ui/components/SelectList.js +46 -0
- package/dist/ui/components/SelectList.js.map +1 -0
- package/dist/ui/components/SessionSelector.d.ts +9 -0
- package/dist/ui/components/SessionSelector.d.ts.map +1 -0
- package/dist/ui/components/SessionSelector.js +13 -0
- package/dist/ui/components/SessionSelector.js.map +1 -0
- package/dist/ui/components/SettingsSelector.d.ts +9 -0
- package/dist/ui/components/SettingsSelector.d.ts.map +1 -0
- package/dist/ui/components/SettingsSelector.js +13 -0
- package/dist/ui/components/SettingsSelector.js.map +1 -0
- package/dist/ui/components/Spinner.d.ts +4 -0
- package/dist/ui/components/Spinner.d.ts.map +1 -0
- package/dist/ui/components/Spinner.js +17 -0
- package/dist/ui/components/Spinner.js.map +1 -0
- package/dist/ui/components/StreamingArea.d.ts +12 -0
- package/dist/ui/components/StreamingArea.d.ts.map +1 -0
- package/dist/ui/components/StreamingArea.js +47 -0
- package/dist/ui/components/StreamingArea.js.map +1 -0
- package/dist/ui/components/ThinkingIndicator.d.ts +6 -0
- package/dist/ui/components/ThinkingIndicator.d.ts.map +1 -0
- package/dist/ui/components/ThinkingIndicator.js +171 -0
- package/dist/ui/components/ThinkingIndicator.js.map +1 -0
- package/dist/ui/components/ToolExecution.d.ts +16 -0
- package/dist/ui/components/ToolExecution.d.ts.map +1 -0
- package/dist/ui/components/ToolExecution.js +262 -0
- package/dist/ui/components/ToolExecution.js.map +1 -0
- package/dist/ui/components/UserMessage.d.ts +4 -0
- package/dist/ui/components/UserMessage.d.ts.map +1 -0
- package/dist/ui/components/UserMessage.js +9 -0
- package/dist/ui/components/UserMessage.js.map +1 -0
- package/dist/ui/components/index.d.ts +14 -0
- package/dist/ui/components/index.d.ts.map +1 -0
- package/dist/ui/components/index.js +14 -0
- package/dist/ui/components/index.js.map +1 -0
- package/dist/ui/hooks/useAgentLoop.d.ts +40 -0
- package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -0
- package/dist/ui/hooks/useAgentLoop.js +195 -0
- package/dist/ui/hooks/useAgentLoop.js.map +1 -0
- package/dist/ui/hooks/useSessionManager.d.ts +13 -0
- package/dist/ui/hooks/useSessionManager.d.ts.map +1 -0
- package/dist/ui/hooks/useSessionManager.js +43 -0
- package/dist/ui/hooks/useSessionManager.js.map +1 -0
- package/dist/ui/hooks/useSlashCommands.d.ts +7 -0
- package/dist/ui/hooks/useSlashCommands.d.ts.map +1 -0
- package/dist/ui/hooks/useSlashCommands.js +11 -0
- package/dist/ui/hooks/useSlashCommands.js.map +1 -0
- package/dist/ui/render.d.ts +20 -0
- package/dist/ui/render.d.ts.map +1 -0
- package/dist/ui/render.js +24 -0
- package/dist/ui/render.js.map +1 -0
- package/dist/ui/theme/dark.json +23 -0
- package/dist/ui/theme/light.json +23 -0
- package/dist/ui/theme/theme.d.ts +28 -0
- package/dist/ui/theme/theme.d.ts.map +1 -0
- package/dist/ui/theme/theme.js +11 -0
- package/dist/ui/theme/theme.js.map +1 -0
- package/dist/utils/error-handler.d.ts +5 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +97 -0
- package/dist/utils/error-handler.js.map +1 -0
- package/dist/utils/format.d.ts +21 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +120 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/git.d.ts +2 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +13 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/markdown.d.ts +6 -0
- package/dist/utils/markdown.d.ts.map +1 -0
- package/dist/utils/markdown.js +25 -0
- package/dist/utils/markdown.js.map +1 -0
- package/dist/utils/process.d.ts +6 -0
- package/dist/utils/process.d.ts.map +1 -0
- package/dist/utils/process.js +19 -0
- package/dist/utils/process.js.map +1 -0
- package/dist/utils/shell.d.ts +3 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +8 -0
- package/dist/utils/shell.js.map +1 -0
- package/package.json +51 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Tools
|
|
2
|
+
export { createTools, createReadTool, createWriteTool, createEditTool, createBashTool, createFindTool, createGrepTool, createLsTool, } from "./tools/index.js";
|
|
3
|
+
// System prompt
|
|
4
|
+
export { buildSystemPrompt } from "./system-prompt.js";
|
|
5
|
+
// Session (legacy — still usable)
|
|
6
|
+
export { createSession, loadSession, listSessions, getMostRecentSession, persistMessage, } from "./session.js";
|
|
7
|
+
// Interactive (legacy readline REPL)
|
|
8
|
+
export { runInteractive } from "./interactive.js";
|
|
9
|
+
// Core
|
|
10
|
+
export { EventBus, AgentSession, SessionManager, SettingsManager, AuthStorage, SlashCommandRegistry, ExtensionLoader, MODELS, getModel, getModelsForProvider, getDefaultModel, getContextWindow, shouldCompact, compact, discoverSkills, estimateTokens, estimateConversationTokens, } from "./core/index.js";
|
|
11
|
+
// Modes
|
|
12
|
+
export { runPrintMode } from "./modes/index.js";
|
|
13
|
+
// UI entry
|
|
14
|
+
export { renderApp } from "./ui/render.js";
|
|
15
|
+
// Config
|
|
16
|
+
export { APP_NAME, VERSION, getAppPaths, ensureAppDirs } from "./config.js";
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,QAAQ;AACR,OAAO,EACL,WAAW,EACX,cAAc,EACd,eAAe,EACf,cAAc,EACd,cAAc,EACd,cAAc,EACd,cAAc,EACd,YAAY,GACb,MAAM,kBAAkB,CAAC;AAE1B,gBAAgB;AAChB,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,kCAAkC;AAClC,OAAO,EACL,aAAa,EACb,WAAW,EACX,YAAY,EACZ,oBAAoB,EACpB,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,qCAAqC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO;AACP,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,eAAe,EACf,WAAW,EACX,oBAAoB,EACpB,eAAe,EACf,MAAM,EACN,QAAQ,EACR,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,OAAO,EACP,cAAc,EACd,cAAc,EACd,0BAA0B,GAC3B,MAAM,iBAAiB,CAAC;AAEzB,QAAQ;AACR,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,WAAW;AACX,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,SAAS;AACT,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../src/interactive.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAoB5C,wBAAsB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CA2HrE"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import readline from "node:readline/promises";
|
|
2
|
+
import { stdin, stdout } from "node:process";
|
|
3
|
+
import { agentLoop } from "@kenkaiiii/gg-agent";
|
|
4
|
+
import { buildSystemPrompt } from "./system-prompt.js";
|
|
5
|
+
import { createTools } from "./tools/index.js";
|
|
6
|
+
import { createSession, loadSession, getMostRecentSession, persistMessage, } from "./session.js";
|
|
7
|
+
import { formatToolCallStart, formatToolCallEnd, formatUsage, formatError, formatWelcome, } from "./utils/format.js";
|
|
8
|
+
import { AuthStorage } from "./core/auth-storage.js";
|
|
9
|
+
import { ensureAppDirs } from "./config.js";
|
|
10
|
+
export async function runInteractive(config) {
|
|
11
|
+
const { provider, model, cwd } = config;
|
|
12
|
+
// Build system prompt
|
|
13
|
+
const systemPrompt = config.systemPrompt ?? (await buildSystemPrompt(cwd));
|
|
14
|
+
// Create tools
|
|
15
|
+
const tools = createTools(cwd);
|
|
16
|
+
// Load auth
|
|
17
|
+
const paths = await ensureAppDirs();
|
|
18
|
+
const authStorage = new AuthStorage(paths.authFile);
|
|
19
|
+
await authStorage.load();
|
|
20
|
+
// Initialize messages and session
|
|
21
|
+
const messages = [];
|
|
22
|
+
let session;
|
|
23
|
+
// Resume session or create new
|
|
24
|
+
if (config.sessionId) {
|
|
25
|
+
const loaded = await loadSession(config.sessionId);
|
|
26
|
+
messages.push({ role: "system", content: systemPrompt });
|
|
27
|
+
messages.push(...loaded.messages);
|
|
28
|
+
session = await createSession(cwd, provider, model);
|
|
29
|
+
// Re-persist loaded messages to new session file
|
|
30
|
+
for (const msg of loaded.messages) {
|
|
31
|
+
await persistMessage(session, msg);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
else if (config.continueRecent) {
|
|
35
|
+
const recentPath = await getMostRecentSession(cwd);
|
|
36
|
+
if (recentPath) {
|
|
37
|
+
const loaded = await loadSession(recentPath);
|
|
38
|
+
messages.push({ role: "system", content: systemPrompt });
|
|
39
|
+
messages.push(...loaded.messages);
|
|
40
|
+
session = await createSession(cwd, provider, model);
|
|
41
|
+
for (const msg of loaded.messages) {
|
|
42
|
+
await persistMessage(session, msg);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
messages.push({ role: "system", content: systemPrompt });
|
|
47
|
+
session = await createSession(cwd, provider, model);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
messages.push({ role: "system", content: systemPrompt });
|
|
52
|
+
session = await createSession(cwd, provider, model);
|
|
53
|
+
}
|
|
54
|
+
// Welcome banner
|
|
55
|
+
stdout.write(formatWelcome(model, provider, cwd) + "\n");
|
|
56
|
+
// Readline loop
|
|
57
|
+
const rl = readline.createInterface({ input: stdin, output: stdout });
|
|
58
|
+
rl.on("close", () => {
|
|
59
|
+
stdout.write("\nGoodbye!\n");
|
|
60
|
+
process.exit(0);
|
|
61
|
+
});
|
|
62
|
+
while (true) {
|
|
63
|
+
let input;
|
|
64
|
+
try {
|
|
65
|
+
input = await rl.question("> ");
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
break; // readline closed
|
|
69
|
+
}
|
|
70
|
+
input = input.trim();
|
|
71
|
+
if (!input)
|
|
72
|
+
continue;
|
|
73
|
+
// Push user message
|
|
74
|
+
const userMessage = { role: "user", content: input };
|
|
75
|
+
messages.push(userMessage);
|
|
76
|
+
await persistMessage(session, userMessage);
|
|
77
|
+
// Track where we are for persisting new messages after agentLoop
|
|
78
|
+
const lastPersistedIndex = messages.length;
|
|
79
|
+
// Create abort controller for this run
|
|
80
|
+
const ac = new AbortController();
|
|
81
|
+
const onSigint = () => {
|
|
82
|
+
ac.abort();
|
|
83
|
+
};
|
|
84
|
+
process.on("SIGINT", onSigint);
|
|
85
|
+
try {
|
|
86
|
+
stdout.write("\n");
|
|
87
|
+
const creds = await authStorage.resolveCredentials(provider);
|
|
88
|
+
const generator = agentLoop(messages, {
|
|
89
|
+
provider,
|
|
90
|
+
model,
|
|
91
|
+
tools,
|
|
92
|
+
maxTokens: 16384,
|
|
93
|
+
apiKey: creds.accessToken,
|
|
94
|
+
baseUrl: config.baseUrl,
|
|
95
|
+
signal: ac.signal,
|
|
96
|
+
accountId: creds.accountId,
|
|
97
|
+
});
|
|
98
|
+
for await (const event of generator) {
|
|
99
|
+
renderEvent(event);
|
|
100
|
+
}
|
|
101
|
+
stdout.write("\n");
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
if (err instanceof Error && err.name === "AbortError") {
|
|
105
|
+
stdout.write("\n\nInterrupted.\n");
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
stdout.write("\n" + formatError(err instanceof Error ? err : new Error(String(err))) + "\n");
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
finally {
|
|
112
|
+
process.removeListener("SIGINT", onSigint);
|
|
113
|
+
}
|
|
114
|
+
// Persist new messages added by agentLoop
|
|
115
|
+
for (let i = lastPersistedIndex; i < messages.length; i++) {
|
|
116
|
+
await persistMessage(session, messages[i]);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
rl.close();
|
|
120
|
+
}
|
|
121
|
+
// Track tool names by toolCallId since tool_call_end doesn't include name
|
|
122
|
+
const toolCallNames = new Map();
|
|
123
|
+
function renderEvent(event) {
|
|
124
|
+
switch (event.type) {
|
|
125
|
+
case "text_delta":
|
|
126
|
+
stdout.write(event.text);
|
|
127
|
+
break;
|
|
128
|
+
case "thinking_delta":
|
|
129
|
+
// Show thinking in dim
|
|
130
|
+
stdout.write(`\x1b[2m${event.text}\x1b[0m`);
|
|
131
|
+
break;
|
|
132
|
+
case "tool_call_start":
|
|
133
|
+
toolCallNames.set(event.toolCallId, event.name);
|
|
134
|
+
stdout.write("\n" + formatToolCallStart(event.name, event.args) + "\n");
|
|
135
|
+
break;
|
|
136
|
+
case "tool_call_end": {
|
|
137
|
+
const name = toolCallNames.get(event.toolCallId) ?? "unknown";
|
|
138
|
+
toolCallNames.delete(event.toolCallId);
|
|
139
|
+
stdout.write(formatToolCallEnd(name, event.result, event.isError, event.durationMs) + "\n\n");
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
case "turn_end":
|
|
143
|
+
stdout.write(formatUsage(event.usage.inputTokens, event.usage.outputTokens) + "\n");
|
|
144
|
+
break;
|
|
145
|
+
case "agent_done":
|
|
146
|
+
// Final usage summary already shown via turn_end
|
|
147
|
+
break;
|
|
148
|
+
case "error":
|
|
149
|
+
stdout.write(formatError(event.error) + "\n");
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=interactive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactive.js","sourceRoot":"","sources":["../src/interactive.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/modes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/modes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAyB,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Provider, ThinkingLevel } from "@kenkaiiii/gg-ai";
|
|
2
|
+
export interface PrintModeOptions {
|
|
3
|
+
message: string;
|
|
4
|
+
provider: Provider;
|
|
5
|
+
model: string;
|
|
6
|
+
baseUrl?: string;
|
|
7
|
+
systemPrompt?: string;
|
|
8
|
+
cwd: string;
|
|
9
|
+
thinkingLevel?: ThinkingLevel;
|
|
10
|
+
}
|
|
11
|
+
export declare function runPrintMode(options: PrintModeOptions): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=print-mode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"print-mode.d.ts","sourceRoot":"","sources":["../../src/modes/print-mode.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEhE,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0C3E"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { AgentSession } from "../core/agent-session.js";
|
|
2
|
+
import { formatUserError } from "../utils/error-handler.js";
|
|
3
|
+
export async function runPrintMode(options) {
|
|
4
|
+
const ac = new AbortController();
|
|
5
|
+
const onSigint = () => ac.abort();
|
|
6
|
+
process.on("SIGINT", onSigint);
|
|
7
|
+
const sessionOpts = {
|
|
8
|
+
provider: options.provider,
|
|
9
|
+
model: options.model,
|
|
10
|
+
baseUrl: options.baseUrl,
|
|
11
|
+
systemPrompt: options.systemPrompt,
|
|
12
|
+
cwd: options.cwd,
|
|
13
|
+
thinkingLevel: options.thinkingLevel,
|
|
14
|
+
signal: ac.signal,
|
|
15
|
+
};
|
|
16
|
+
const session = new AgentSession(sessionOpts);
|
|
17
|
+
// Subscribe to events
|
|
18
|
+
session.eventBus.on("text_delta", ({ text }) => {
|
|
19
|
+
process.stdout.write(text);
|
|
20
|
+
});
|
|
21
|
+
session.eventBus.on("error", ({ error }) => {
|
|
22
|
+
process.stderr.write(`Error: ${error.message}\n`);
|
|
23
|
+
});
|
|
24
|
+
try {
|
|
25
|
+
await session.initialize();
|
|
26
|
+
await session.prompt(options.message);
|
|
27
|
+
process.stdout.write("\n");
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
if (err instanceof Error && err.name === "AbortError") {
|
|
31
|
+
process.stderr.write("\nInterrupted.\n");
|
|
32
|
+
process.exit(130);
|
|
33
|
+
}
|
|
34
|
+
process.stderr.write(formatUserError(err) + "\n");
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
process.removeListener("SIGINT", onSigint);
|
|
39
|
+
await session.dispose();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=print-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"print-mode.js","sourceRoot":"","sources":["../../src/modes/print-mode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA4B,MAAM,0BAA0B,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAa5D,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAyB;IAC1D,MAAM,EAAE,GAAG,IAAI,eAAe,EAAE,CAAC;IAEjC,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAE/B,MAAM,WAAW,GAAwB;QACvC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,MAAM,EAAE,EAAE,CAAC,MAAM;KAClB,CAAC;IAEF,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,WAAW,CAAC,CAAC;IAE9C,sBAAsB;IACtB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;QAC7C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;QACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;QAC3B,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACtD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC3C,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Message } from "@kenkaiiii/gg-ai";
|
|
2
|
+
import type { SessionHeader, SessionEntry, SessionInfo } from "./types.js";
|
|
3
|
+
export interface Session {
|
|
4
|
+
id: string;
|
|
5
|
+
path: string;
|
|
6
|
+
append(entry: SessionEntry): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
export declare function createSession(cwd: string, provider: string, model: string): Promise<Session>;
|
|
9
|
+
export declare function loadSession(sessionPath: string): Promise<{
|
|
10
|
+
header: SessionHeader;
|
|
11
|
+
messages: Message[];
|
|
12
|
+
}>;
|
|
13
|
+
export declare function listSessions(cwd: string): Promise<SessionInfo[]>;
|
|
14
|
+
export declare function getMostRecentSession(cwd: string): Promise<string | null>;
|
|
15
|
+
export declare function persistMessage(session: Session, message: Message): Promise<void>;
|
|
16
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAuB,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAchG,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C;AAED,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC,CA4BlB;AAID,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,QAAQ,EAAE,OAAO,EAAE,CAAA;CAAE,CAAC,CAwBzD;AAID,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAgDtE;AAID,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAG9E;AAID,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAOhF"}
|
package/dist/session.js
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import crypto from "node:crypto";
|
|
5
|
+
const SESSION_DIR = path.join(os.homedir(), ".gg", "sessions");
|
|
6
|
+
function encodeCwd(cwd) {
|
|
7
|
+
return cwd.replace(/\//g, "_").replace(/^_/, "");
|
|
8
|
+
}
|
|
9
|
+
function sessionDirForCwd(cwd) {
|
|
10
|
+
return path.join(SESSION_DIR, encodeCwd(cwd));
|
|
11
|
+
}
|
|
12
|
+
export async function createSession(cwd, provider, model) {
|
|
13
|
+
const id = crypto.randomUUID();
|
|
14
|
+
const timestamp = new Date().toISOString();
|
|
15
|
+
const dir = sessionDirForCwd(cwd);
|
|
16
|
+
await fs.mkdir(dir, { recursive: true });
|
|
17
|
+
const fileName = `${timestamp.replace(/[:.]/g, "-")}_${id.slice(0, 8)}.jsonl`;
|
|
18
|
+
const filePath = path.join(dir, fileName);
|
|
19
|
+
const header = {
|
|
20
|
+
type: "session",
|
|
21
|
+
version: 1,
|
|
22
|
+
id,
|
|
23
|
+
timestamp,
|
|
24
|
+
cwd,
|
|
25
|
+
provider: provider,
|
|
26
|
+
model,
|
|
27
|
+
};
|
|
28
|
+
await fs.appendFile(filePath, JSON.stringify(header) + "\n", "utf-8");
|
|
29
|
+
return {
|
|
30
|
+
id,
|
|
31
|
+
path: filePath,
|
|
32
|
+
async append(entry) {
|
|
33
|
+
await fs.appendFile(filePath, JSON.stringify(entry) + "\n", "utf-8");
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
// ── Load Session ────────────────────────────────────────────
|
|
38
|
+
export async function loadSession(sessionPath) {
|
|
39
|
+
const content = await fs.readFile(sessionPath, "utf-8");
|
|
40
|
+
const lines = content.trim().split("\n").filter(Boolean);
|
|
41
|
+
let header = null;
|
|
42
|
+
const messages = [];
|
|
43
|
+
for (const line of lines) {
|
|
44
|
+
const entry = JSON.parse(line);
|
|
45
|
+
if (entry.type === "session") {
|
|
46
|
+
header = entry;
|
|
47
|
+
}
|
|
48
|
+
else if (entry.type === "message") {
|
|
49
|
+
// Skip system messages — they'll be rebuilt fresh
|
|
50
|
+
if (entry.message.role !== "system") {
|
|
51
|
+
messages.push(entry.message);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (!header) {
|
|
56
|
+
throw new Error(`Invalid session file: no header found in ${sessionPath}`);
|
|
57
|
+
}
|
|
58
|
+
return { header, messages };
|
|
59
|
+
}
|
|
60
|
+
// ── List Sessions ───────────────────────────────────────────
|
|
61
|
+
export async function listSessions(cwd) {
|
|
62
|
+
const dir = sessionDirForCwd(cwd);
|
|
63
|
+
let files;
|
|
64
|
+
try {
|
|
65
|
+
files = await fs.readdir(dir);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return [];
|
|
69
|
+
}
|
|
70
|
+
const sessions = [];
|
|
71
|
+
for (const file of files) {
|
|
72
|
+
if (!file.endsWith(".jsonl"))
|
|
73
|
+
continue;
|
|
74
|
+
const filePath = path.join(dir, file);
|
|
75
|
+
try {
|
|
76
|
+
const content = await fs.readFile(filePath, "utf-8");
|
|
77
|
+
const lines = content.trim().split("\n").filter(Boolean);
|
|
78
|
+
if (lines.length === 0)
|
|
79
|
+
continue;
|
|
80
|
+
const header = JSON.parse(lines[0]);
|
|
81
|
+
if (header.type !== "session")
|
|
82
|
+
continue;
|
|
83
|
+
const messageCount = lines.filter((line) => {
|
|
84
|
+
try {
|
|
85
|
+
const entry = JSON.parse(line);
|
|
86
|
+
return entry.type === "message";
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
}).length;
|
|
92
|
+
sessions.push({
|
|
93
|
+
id: header.id,
|
|
94
|
+
path: filePath,
|
|
95
|
+
timestamp: header.timestamp,
|
|
96
|
+
cwd: header.cwd,
|
|
97
|
+
messageCount,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// Skip corrupt files
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Sort by timestamp descending (most recent first)
|
|
105
|
+
sessions.sort((a, b) => b.timestamp.localeCompare(a.timestamp));
|
|
106
|
+
return sessions;
|
|
107
|
+
}
|
|
108
|
+
// ── Get Most Recent Session ─────────────────────────────────
|
|
109
|
+
export async function getMostRecentSession(cwd) {
|
|
110
|
+
const sessions = await listSessions(cwd);
|
|
111
|
+
return sessions.length > 0 ? sessions[0].path : null;
|
|
112
|
+
}
|
|
113
|
+
// ── Persist Messages ────────────────────────────────────────
|
|
114
|
+
export function persistMessage(session, message) {
|
|
115
|
+
const entry = {
|
|
116
|
+
type: "message",
|
|
117
|
+
timestamp: new Date().toISOString(),
|
|
118
|
+
message,
|
|
119
|
+
};
|
|
120
|
+
return session.append(entry);
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,MAAM,MAAM,aAAa,CAAC;AAIjC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;AAE/D,SAAS,SAAS,CAAC,GAAW;IAC5B,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW;IACnC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AAChD,CAAC;AAUD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAW,EACX,QAAgB,EAChB,KAAa;IAEb,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IAC/B,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,GAAG,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEzC,MAAM,QAAQ,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC;IAC9E,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAE1C,MAAM,MAAM,GAAkB;QAC5B,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,CAAC;QACV,EAAE;QACF,SAAS;QACT,GAAG;QACH,QAAQ,EAAE,QAAqC;QAC/C,KAAK;KACN,CAAC;IAEF,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IAEtE,OAAO;QACL,EAAE;QACF,IAAI,EAAE,QAAQ;QACd,KAAK,CAAC,MAAM,CAAC,KAAmB;YAC9B,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;QACvE,CAAC;KACF,CAAC;AACJ,CAAC;AAED,+DAA+D;AAE/D,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,WAAmB;IAEnB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEzD,IAAI,MAAM,GAAyB,IAAI,CAAC;IACxC,MAAM,QAAQ,GAAc,EAAE,CAAC;IAE/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAiB,CAAC;QAC/C,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,GAAG,KAAK,CAAC;QACjB,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACpC,kDAAkD;YAClD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACpC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,4CAA4C,WAAW,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC;AAED,+DAA+D;AAE/D,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW;IAC5C,MAAM,GAAG,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAElC,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,QAAQ,GAAkB,EAAE,CAAC;IAEnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,SAAS;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAEtC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACzD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAEjC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAiB,CAAC;YACpD,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;gBAAE,SAAS;YAExC,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;gBACzC,IAAI,CAAC;oBACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAiB,CAAC;oBAC/C,OAAO,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC;gBAClC,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC,CAAC,CAAC,MAAM,CAAC;YAEV,QAAQ,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,MAAM,CAAC,EAAE;gBACb,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,GAAG,EAAE,MAAM,CAAC,GAAG;gBACf,YAAY;aACb,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,qBAAqB;QACvB,CAAC;IACH,CAAC;IAED,mDAAmD;IACnD,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAChE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,+DAA+D;AAE/D,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,GAAW;IACpD,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;IACzC,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACvD,CAAC;AAED,+DAA+D;AAE/D,MAAM,UAAU,cAAc,CAAC,OAAgB,EAAE,OAAgB;IAC/D,MAAM,KAAK,GAAwB;QACjC,IAAI,EAAE,SAAS;QACf,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,OAAO;KACR,CAAC;IACF,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../src/system-prompt.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyB,KAAK,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAIrE;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA4EtF"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { formatSkillsForPrompt } from "./core/skills.js";
|
|
4
|
+
const CONTEXT_FILES = ["AGENTS.md", "CLAUDE.md"];
|
|
5
|
+
/**
|
|
6
|
+
* Build the system prompt dynamically based on cwd and context.
|
|
7
|
+
*/
|
|
8
|
+
export async function buildSystemPrompt(cwd, skills) {
|
|
9
|
+
const sections = [];
|
|
10
|
+
// Role
|
|
11
|
+
sections.push(`You are an expert coding assistant. You help users with software engineering tasks ` +
|
|
12
|
+
`including writing code, debugging, refactoring, and explaining code. ` +
|
|
13
|
+
`You have access to tools for reading, writing, and editing files, and running bash commands.`);
|
|
14
|
+
// Response style
|
|
15
|
+
sections.push(`## Response Style\n\n` +
|
|
16
|
+
`Keep responses short and to the point. After completing a task, respond with a brief summary in this structure:\n\n` +
|
|
17
|
+
`1. **What was done** — A concise summary of the changes made (1-3 sentences max).\n` +
|
|
18
|
+
`2. **What else was affected** — Only if relevant: side effects, related changes, or things to note.\n` +
|
|
19
|
+
`3. **Recommended next steps** — Only if applicable: what the user might want to do next (e.g. run tests, review a file, consider a follow-up change).\n\n` +
|
|
20
|
+
`Do NOT write long explanations, repeat back what the user asked, or pad responses with filler. ` +
|
|
21
|
+
`Lead with the answer or action, not the reasoning. ` +
|
|
22
|
+
`If you can say it in one sentence, do not use three. ` +
|
|
23
|
+
`Skip sections that don't apply — not every response needs all three parts.\n\n` +
|
|
24
|
+
`For pure questions (no code changes), answer directly and concisely.`);
|
|
25
|
+
// Tool guidelines
|
|
26
|
+
sections.push(`## Tool Guidelines\n\n` +
|
|
27
|
+
`- **read**: Always read a file before editing it. Use offset/limit for large files.\n` +
|
|
28
|
+
`- **edit**: Use for surgical changes to existing files. The old_text must uniquely match one location.\n` +
|
|
29
|
+
`- **write**: Use for creating new files or complete rewrites. Prefer edit for small changes.\n` +
|
|
30
|
+
`- **bash**: Use for running commands, installing packages, running tests, git operations, etc. ` +
|
|
31
|
+
`Avoid long-running or interactive commands.`);
|
|
32
|
+
// Project context — walk from cwd to root looking for context files
|
|
33
|
+
const contextParts = [];
|
|
34
|
+
let dir = cwd;
|
|
35
|
+
const visited = new Set();
|
|
36
|
+
while (!visited.has(dir)) {
|
|
37
|
+
visited.add(dir);
|
|
38
|
+
for (const name of CONTEXT_FILES) {
|
|
39
|
+
const filePath = path.join(dir, name);
|
|
40
|
+
try {
|
|
41
|
+
const content = await fs.readFile(filePath, "utf-8");
|
|
42
|
+
const relPath = path.relative(cwd, filePath) || name;
|
|
43
|
+
contextParts.push(`### ${relPath}\n\n${content.trim()}`);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// File doesn't exist, skip
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const parent = path.dirname(dir);
|
|
50
|
+
if (parent === dir)
|
|
51
|
+
break;
|
|
52
|
+
dir = parent;
|
|
53
|
+
}
|
|
54
|
+
if (contextParts.length > 0) {
|
|
55
|
+
sections.push(`## Project Context\n\n${contextParts.join("\n\n")}`);
|
|
56
|
+
}
|
|
57
|
+
// Skills
|
|
58
|
+
if (skills && skills.length > 0) {
|
|
59
|
+
const skillsSection = formatSkillsForPrompt(skills);
|
|
60
|
+
if (skillsSection) {
|
|
61
|
+
sections.push(skillsSection);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Metadata
|
|
65
|
+
sections.push(`## Environment\n\n` +
|
|
66
|
+
`- Current date: ${new Date().toISOString().split("T")[0]}\n` +
|
|
67
|
+
`- Working directory: ${cwd}`);
|
|
68
|
+
return sections.join("\n\n");
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=system-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../src/system-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,qBAAqB,EAAc,MAAM,kBAAkB,CAAC;AAErE,MAAM,aAAa,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;AAEjD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAW,EAAE,MAAgB;IACnE,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,OAAO;IACP,QAAQ,CAAC,IAAI,CACX,qFAAqF;QACnF,uEAAuE;QACvE,8FAA8F,CACjG,CAAC;IAEF,iBAAiB;IACjB,QAAQ,CAAC,IAAI,CACX,uBAAuB;QACrB,qHAAqH;QACrH,qFAAqF;QACrF,uGAAuG;QACvG,2JAA2J;QAC3J,iGAAiG;QACjG,qDAAqD;QACrD,uDAAuD;QACvD,gFAAgF;QAChF,sEAAsE,CACzE,CAAC;IAEF,kBAAkB;IAClB,QAAQ,CAAC,IAAI,CACX,wBAAwB;QACtB,uFAAuF;QACvF,0GAA0G;QAC1G,gGAAgG;QAChG,iGAAiG;QACjG,6CAA6C,CAChD,CAAC;IAEF,oEAAoE;IACpE,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,IAAI,GAAG,GAAG,GAAG,CAAC;IACd,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAElC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjB,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACtC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACrD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC;gBACrD,YAAY,CAAC,IAAI,CAAC,OAAO,OAAO,OAAO,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC3D,CAAC;YAAC,MAAM,CAAC;gBACP,2BAA2B;YAC7B,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM;QAC1B,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,QAAQ,CAAC,IAAI,CAAC,yBAAyB,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,SAAS;IACT,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,aAAa,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,aAAa,EAAE,CAAC;YAClB,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,WAAW;IACX,QAAQ,CAAC,IAAI,CACX,oBAAoB;QAClB,mBAAmB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;QAC7D,wBAAwB,GAAG,EAAE,CAChC,CAAC;IAEF,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { AgentTool } from "@kenkaiiii/gg-agent";
|
|
3
|
+
declare const BashParams: z.ZodObject<{
|
|
4
|
+
command: z.ZodString;
|
|
5
|
+
timeout: z.ZodOptional<z.ZodNumber>;
|
|
6
|
+
}, z.core.$strip>;
|
|
7
|
+
export declare function createBashTool(cwd: string): AgentTool<typeof BashParams>;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=bash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAMrD,QAAA,MAAM,UAAU;;;iBAQd,CAAC;AAEH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,UAAU,CAAC,CAyExE"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { killProcessTree } from "../utils/process.js";
|
|
7
|
+
import { truncateTail } from "./truncate.js";
|
|
8
|
+
const DEFAULT_TIMEOUT = 120_000; // 120 seconds
|
|
9
|
+
const BashParams = z.object({
|
|
10
|
+
command: z.string().describe("The bash command to execute"),
|
|
11
|
+
timeout: z
|
|
12
|
+
.number()
|
|
13
|
+
.int()
|
|
14
|
+
.min(1000)
|
|
15
|
+
.optional()
|
|
16
|
+
.describe("Timeout in milliseconds (default: 120000)"),
|
|
17
|
+
});
|
|
18
|
+
export function createBashTool(cwd) {
|
|
19
|
+
return {
|
|
20
|
+
name: "bash",
|
|
21
|
+
description: "Execute a bash command. Returns exit code and combined stdout/stderr. " +
|
|
22
|
+
"Commands run in a non-interactive bash shell with TERM=dumb. " +
|
|
23
|
+
"Long output is truncated (tail kept).",
|
|
24
|
+
parameters: BashParams,
|
|
25
|
+
async execute({ command, timeout: timeoutMs }, context) {
|
|
26
|
+
const effectiveTimeout = timeoutMs ?? DEFAULT_TIMEOUT;
|
|
27
|
+
return new Promise((resolve) => {
|
|
28
|
+
const child = spawn("bash", ["-c", command], {
|
|
29
|
+
cwd,
|
|
30
|
+
detached: true,
|
|
31
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
32
|
+
env: { ...process.env, TERM: "dumb" },
|
|
33
|
+
});
|
|
34
|
+
const chunks = [];
|
|
35
|
+
child.stdout?.on("data", (data) => chunks.push(data));
|
|
36
|
+
child.stderr?.on("data", (data) => chunks.push(data));
|
|
37
|
+
let killed = false;
|
|
38
|
+
let timedOut = false;
|
|
39
|
+
// Timeout handling
|
|
40
|
+
const timer = setTimeout(() => {
|
|
41
|
+
timedOut = true;
|
|
42
|
+
killed = true;
|
|
43
|
+
if (child.pid)
|
|
44
|
+
killProcessTree(child.pid);
|
|
45
|
+
}, effectiveTimeout);
|
|
46
|
+
// Abort signal handling
|
|
47
|
+
const onAbort = () => {
|
|
48
|
+
killed = true;
|
|
49
|
+
if (child.pid)
|
|
50
|
+
killProcessTree(child.pid);
|
|
51
|
+
};
|
|
52
|
+
context.signal.addEventListener("abort", onAbort, { once: true });
|
|
53
|
+
child.on("close", async (code) => {
|
|
54
|
+
clearTimeout(timer);
|
|
55
|
+
context.signal.removeEventListener("abort", onAbort);
|
|
56
|
+
const rawOutput = Buffer.concat(chunks).toString("utf-8");
|
|
57
|
+
const result = truncateTail(rawOutput);
|
|
58
|
+
let output = result.content;
|
|
59
|
+
if (result.truncated) {
|
|
60
|
+
// Save full output to temp file
|
|
61
|
+
const tmpPath = path.join(os.tmpdir(), `gg-bash-${Date.now()}.txt`);
|
|
62
|
+
await fs.writeFile(tmpPath, rawOutput, "utf-8").catch(() => { });
|
|
63
|
+
output = `[Truncated: showing last ${result.keptLines} of ${result.totalLines} lines. Full output: ${tmpPath}]\n${output}`;
|
|
64
|
+
}
|
|
65
|
+
const exitCode = timedOut
|
|
66
|
+
? `TIMEOUT (${effectiveTimeout}ms)`
|
|
67
|
+
: killed
|
|
68
|
+
? "KILLED"
|
|
69
|
+
: String(code ?? 1);
|
|
70
|
+
resolve(`Exit code: ${exitCode}\n${output}`);
|
|
71
|
+
});
|
|
72
|
+
child.on("error", (err) => {
|
|
73
|
+
clearTimeout(timer);
|
|
74
|
+
context.signal.removeEventListener("abort", onAbort);
|
|
75
|
+
resolve(`Exit code: 1\nFailed to spawn: ${err.message}`);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=bash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Find text in content, trying exact match first then fuzzy.
|
|
3
|
+
*/
|
|
4
|
+
export declare function fuzzyFindText(content: string, oldText: string): {
|
|
5
|
+
found: boolean;
|
|
6
|
+
index: number;
|
|
7
|
+
matchLength: number;
|
|
8
|
+
usedFuzzy: boolean;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Count occurrences of oldText in content (exact first, then fuzzy).
|
|
12
|
+
*/
|
|
13
|
+
export declare function countOccurrences(content: string, oldText: string): number;
|
|
14
|
+
/**
|
|
15
|
+
* Generate a unified diff string.
|
|
16
|
+
*/
|
|
17
|
+
export declare function generateDiff(oldContent: string, newContent: string, filePath: string): string;
|
|
18
|
+
//# sourceMappingURL=edit-diff.d.ts.map
|