@kenkaiiii/ggcoder 0.0.3 → 1.0.4
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.js +153 -31
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +5 -0
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/agents.d.ts +32 -0
- package/dist/core/agents.d.ts.map +1 -0
- package/dist/core/agents.js +95 -0
- package/dist/core/agents.js.map +1 -0
- package/dist/core/compaction/compactor.d.ts +7 -0
- package/dist/core/compaction/compactor.d.ts.map +1 -1
- package/dist/core/compaction/compactor.js +32 -1
- package/dist/core/compaction/compactor.js.map +1 -1
- package/dist/core/compaction/compactor.test.d.ts +2 -0
- package/dist/core/compaction/compactor.test.d.ts.map +1 -0
- package/dist/core/compaction/compactor.test.js +116 -0
- package/dist/core/compaction/compactor.test.js.map +1 -0
- package/dist/core/compaction/token-estimator.test.d.ts +2 -0
- package/dist/core/compaction/token-estimator.test.d.ts.map +1 -0
- package/dist/core/compaction/token-estimator.test.js +115 -0
- package/dist/core/compaction/token-estimator.test.js.map +1 -0
- package/dist/core/event-bus.d.ts +14 -0
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/event-bus.js +20 -0
- package/dist/core/event-bus.js.map +1 -1
- package/dist/modes/json-mode.d.ts +13 -0
- package/dist/modes/json-mode.d.ts.map +1 -0
- package/dist/modes/json-mode.js +70 -0
- package/dist/modes/json-mode.js.map +1 -0
- package/dist/tools/index.d.ts +8 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +10 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/subagent.d.ts +26 -0
- package/dist/tools/subagent.d.ts.map +1 -0
- package/dist/tools/subagent.js +163 -0
- package/dist/tools/subagent.js.map +1 -0
- package/dist/tools/truncate.test.d.ts +2 -0
- package/dist/tools/truncate.test.d.ts.map +1 -0
- package/dist/tools/truncate.test.js +100 -0
- package/dist/tools/truncate.test.js.map +1 -0
- package/dist/tools/web-fetch.d.ts +9 -0
- package/dist/tools/web-fetch.d.ts.map +1 -0
- package/dist/tools/web-fetch.js +50 -0
- package/dist/tools/web-fetch.js.map +1 -0
- package/dist/tools/write.test.d.ts +2 -0
- package/dist/tools/write.test.d.ts.map +1 -0
- package/dist/tools/write.test.js +84 -0
- package/dist/tools/write.test.js.map +1 -0
- package/dist/ui/App.d.ts +82 -1
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +209 -28
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/components/ActivityIndicator.d.ts +12 -0
- package/dist/ui/components/ActivityIndicator.d.ts.map +1 -0
- package/dist/ui/components/ActivityIndicator.js +243 -0
- package/dist/ui/components/ActivityIndicator.js.map +1 -0
- package/dist/ui/components/AssistantMessage.js +1 -1
- package/dist/ui/components/AssistantMessage.js.map +1 -1
- package/dist/ui/components/Banner.d.ts +10 -0
- package/dist/ui/components/Banner.d.ts.map +1 -0
- package/dist/ui/components/Banner.js +34 -0
- package/dist/ui/components/Banner.js.map +1 -0
- package/dist/ui/components/Markdown.d.ts.map +1 -1
- package/dist/ui/components/Markdown.js +14 -9
- package/dist/ui/components/Markdown.js.map +1 -1
- package/dist/ui/components/ModelSelector.d.ts +5 -1
- package/dist/ui/components/ModelSelector.d.ts.map +1 -1
- package/dist/ui/components/ModelSelector.js +14 -8
- package/dist/ui/components/ModelSelector.js.map +1 -1
- package/dist/ui/components/ScrollableContent.d.ts +22 -0
- package/dist/ui/components/ScrollableContent.d.ts.map +1 -0
- package/dist/ui/components/ScrollableContent.js +44 -0
- package/dist/ui/components/ScrollableContent.js.map +1 -0
- package/dist/ui/components/SelectList.d.ts +2 -1
- package/dist/ui/components/SelectList.d.ts.map +1 -1
- package/dist/ui/components/SelectList.js +2 -2
- package/dist/ui/components/SelectList.js.map +1 -1
- package/dist/ui/components/ServerToolExecution.d.ts +16 -0
- package/dist/ui/components/ServerToolExecution.d.ts.map +1 -0
- package/dist/ui/components/ServerToolExecution.js +51 -0
- package/dist/ui/components/ServerToolExecution.js.map +1 -0
- package/dist/ui/components/StreamingArea.d.ts +1 -4
- package/dist/ui/components/StreamingArea.d.ts.map +1 -1
- package/dist/ui/components/StreamingArea.js +2 -42
- package/dist/ui/components/StreamingArea.js.map +1 -1
- package/dist/ui/components/SubAgentPanel.d.ts +22 -0
- package/dist/ui/components/SubAgentPanel.d.ts.map +1 -0
- package/dist/ui/components/SubAgentPanel.js +47 -0
- package/dist/ui/components/SubAgentPanel.js.map +1 -0
- package/dist/ui/components/ToolExecution.d.ts.map +1 -1
- package/dist/ui/components/ToolExecution.js +88 -11
- package/dist/ui/components/ToolExecution.js.map +1 -1
- package/dist/ui/hooks/useAgentLoop.d.ts +17 -2
- package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
- package/dist/ui/hooks/useAgentLoop.js +133 -7
- package/dist/ui/hooks/useAgentLoop.js.map +1 -1
- package/dist/ui/hooks/useMouseScroll.d.ts.map +1 -0
- package/dist/ui/hooks/useMouseScroll.js.map +1 -0
- package/dist/ui/hooks/useScrollViewport.d.ts +25 -0
- package/dist/ui/hooks/useScrollViewport.d.ts.map +1 -0
- package/dist/ui/hooks/useScrollViewport.js +32 -0
- package/dist/ui/hooks/useScrollViewport.js.map +1 -0
- package/dist/ui/login.d.ts +3 -0
- package/dist/ui/login.d.ts.map +1 -0
- package/dist/ui/login.js +90 -0
- package/dist/ui/login.js.map +1 -0
- package/dist/ui/render.d.ts +12 -1
- package/dist/ui/render.d.ts.map +1 -1
- package/dist/ui/render.js +7 -0
- package/dist/ui/render.js.map +1 -1
- package/dist/ui/utils/highlight.d.ts +8 -0
- package/dist/ui/utils/highlight.d.ts.map +1 -0
- package/dist/ui/utils/highlight.js +49 -0
- package/dist/ui/utils/highlight.js.map +1 -0
- package/dist/ui/utils/item-heights.d.ts +17 -0
- package/dist/ui/utils/item-heights.d.ts.map +1 -0
- package/dist/ui/utils/item-heights.js +73 -0
- package/dist/ui/utils/item-heights.js.map +1 -0
- package/package.json +6 -4
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { createInterface } from "node:readline";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { truncateHead } from "./truncate.js";
|
|
5
|
+
const SUB_AGENT_MAX_TURNS = 10;
|
|
6
|
+
const SUB_AGENT_MAX_OUTPUT_CHARS = 100_000; // ~25k tokens, matches other tool limits
|
|
7
|
+
const SUB_AGENT_MAX_OUTPUT_LINES = 500;
|
|
8
|
+
const SubAgentParams = z.object({
|
|
9
|
+
task: z.string().describe("The task to delegate to the sub-agent"),
|
|
10
|
+
agent: z
|
|
11
|
+
.string()
|
|
12
|
+
.optional()
|
|
13
|
+
.describe("Named agent definition to use (from ~/.gg/agents/ or .gg/agents/)"),
|
|
14
|
+
});
|
|
15
|
+
export function createSubAgentTool(cwd, agents, parentProvider, parentModel) {
|
|
16
|
+
const agentList = agents.map((a) => `- ${a.name}: ${a.description}`).join("\n");
|
|
17
|
+
const agentDesc = agentList
|
|
18
|
+
? `\n\nAvailable named agents:\n${agentList}`
|
|
19
|
+
: "\n\nNo named agents configured.";
|
|
20
|
+
return {
|
|
21
|
+
name: "subagent",
|
|
22
|
+
description: `Spawn an isolated sub-agent to handle a focused task. The sub-agent runs as a separate process with its own context window, tools, and system prompt. Use this for tasks that benefit from isolation or parallelism.` +
|
|
23
|
+
agentDesc,
|
|
24
|
+
parameters: SubAgentParams,
|
|
25
|
+
async execute(args, context) {
|
|
26
|
+
const startTime = Date.now();
|
|
27
|
+
// Resolve agent definition if specified
|
|
28
|
+
let agentDef;
|
|
29
|
+
if (args.agent) {
|
|
30
|
+
agentDef = agents.find((a) => a.name.toLowerCase() === args.agent.toLowerCase());
|
|
31
|
+
if (!agentDef) {
|
|
32
|
+
return {
|
|
33
|
+
content: `Unknown agent: "${args.agent}". Available agents: ${agents.map((a) => a.name).join(", ") || "none"}`,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const useModel = agentDef?.model ?? parentModel;
|
|
38
|
+
const useProvider = parentProvider;
|
|
39
|
+
// Build CLI args — limit turns to prevent runaway context growth
|
|
40
|
+
const cliArgs = [
|
|
41
|
+
"--json",
|
|
42
|
+
"--provider",
|
|
43
|
+
useProvider,
|
|
44
|
+
"--model",
|
|
45
|
+
useModel,
|
|
46
|
+
"--max-turns",
|
|
47
|
+
String(SUB_AGENT_MAX_TURNS),
|
|
48
|
+
];
|
|
49
|
+
if (agentDef?.systemPrompt) {
|
|
50
|
+
cliArgs.push("--system-prompt", agentDef.systemPrompt);
|
|
51
|
+
}
|
|
52
|
+
cliArgs.push(args.task);
|
|
53
|
+
// Spawn child process using same binary
|
|
54
|
+
const binPath = process.argv[1];
|
|
55
|
+
const child = spawn(process.execPath, [binPath, ...cliArgs], {
|
|
56
|
+
cwd,
|
|
57
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
58
|
+
env: { ...process.env },
|
|
59
|
+
});
|
|
60
|
+
// Track progress
|
|
61
|
+
let toolUseCount = 0;
|
|
62
|
+
const tokenUsage = { input: 0, output: 0 };
|
|
63
|
+
let currentActivity;
|
|
64
|
+
let textOutput = "";
|
|
65
|
+
// Handle abort signal
|
|
66
|
+
const abortHandler = () => {
|
|
67
|
+
child.kill("SIGTERM");
|
|
68
|
+
setTimeout(() => {
|
|
69
|
+
if (!child.killed)
|
|
70
|
+
child.kill("SIGKILL");
|
|
71
|
+
}, 3000);
|
|
72
|
+
};
|
|
73
|
+
context.signal.addEventListener("abort", abortHandler, { once: true });
|
|
74
|
+
return new Promise((resolve) => {
|
|
75
|
+
// Read NDJSON from stdout
|
|
76
|
+
const rl = createInterface({ input: child.stdout });
|
|
77
|
+
rl.on("line", (line) => {
|
|
78
|
+
try {
|
|
79
|
+
const event = JSON.parse(line);
|
|
80
|
+
const type = event.type;
|
|
81
|
+
switch (type) {
|
|
82
|
+
case "text_delta":
|
|
83
|
+
textOutput += event.text;
|
|
84
|
+
break;
|
|
85
|
+
case "tool_call_start":
|
|
86
|
+
toolUseCount++;
|
|
87
|
+
currentActivity = `${event.name}: ${truncateStr(JSON.stringify(event.args), 60)}`;
|
|
88
|
+
context.onUpdate?.({
|
|
89
|
+
toolUseCount,
|
|
90
|
+
tokenUsage: { ...tokenUsage },
|
|
91
|
+
currentActivity,
|
|
92
|
+
});
|
|
93
|
+
break;
|
|
94
|
+
case "tool_call_end":
|
|
95
|
+
currentActivity = undefined;
|
|
96
|
+
context.onUpdate?.({
|
|
97
|
+
toolUseCount,
|
|
98
|
+
tokenUsage: { ...tokenUsage },
|
|
99
|
+
currentActivity,
|
|
100
|
+
});
|
|
101
|
+
break;
|
|
102
|
+
case "turn_end": {
|
|
103
|
+
const usage = event.usage;
|
|
104
|
+
if (usage) {
|
|
105
|
+
tokenUsage.input += usage.inputTokens;
|
|
106
|
+
tokenUsage.output += usage.outputTokens;
|
|
107
|
+
}
|
|
108
|
+
context.onUpdate?.({
|
|
109
|
+
toolUseCount,
|
|
110
|
+
tokenUsage: { ...tokenUsage },
|
|
111
|
+
currentActivity,
|
|
112
|
+
});
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// Skip malformed lines
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
// Collect stderr
|
|
122
|
+
let stderr = "";
|
|
123
|
+
child.stderr?.on("data", (chunk) => {
|
|
124
|
+
stderr += chunk.toString();
|
|
125
|
+
});
|
|
126
|
+
child.on("close", (code) => {
|
|
127
|
+
context.signal.removeEventListener("abort", abortHandler);
|
|
128
|
+
const durationMs = Date.now() - startTime;
|
|
129
|
+
const details = {
|
|
130
|
+
toolUseCount,
|
|
131
|
+
tokenUsage: { ...tokenUsage },
|
|
132
|
+
durationMs,
|
|
133
|
+
};
|
|
134
|
+
if (code !== 0 && !textOutput) {
|
|
135
|
+
resolve({
|
|
136
|
+
content: `Sub-agent failed (exit ${code}): ${stderr.trim() || "unknown error"}`,
|
|
137
|
+
details,
|
|
138
|
+
});
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
// Truncate output to prevent blowing up parent's context
|
|
142
|
+
const raw = textOutput || "(no output)";
|
|
143
|
+
const result = truncateHead(raw, SUB_AGENT_MAX_OUTPUT_LINES, SUB_AGENT_MAX_OUTPUT_CHARS);
|
|
144
|
+
const content = result.truncated
|
|
145
|
+
? result.content +
|
|
146
|
+
`\n\n[Sub-agent output truncated: ${result.totalLines} total lines, showing first ${result.keptLines}]`
|
|
147
|
+
: result.content;
|
|
148
|
+
resolve({ content, details });
|
|
149
|
+
});
|
|
150
|
+
child.on("error", (err) => {
|
|
151
|
+
context.signal.removeEventListener("abort", abortHandler);
|
|
152
|
+
resolve({
|
|
153
|
+
content: `Failed to spawn sub-agent: ${err.message}`,
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
function truncateStr(s, max) {
|
|
161
|
+
return s.length > max ? s.slice(0, max - 1) + "…" : s;
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=subagent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagent.js","sourceRoot":"","sources":["../../src/tools/subagent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"truncate.test.d.ts","sourceRoot":"","sources":["../../src/tools/truncate.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { truncateHead, truncateTail } from "./truncate.js";
|
|
3
|
+
// ── truncateHead ───────────────────────────────────────────
|
|
4
|
+
describe("truncateHead", () => {
|
|
5
|
+
it("returns content unchanged when within limits", () => {
|
|
6
|
+
const content = "line1\nline2\nline3";
|
|
7
|
+
const result = truncateHead(content);
|
|
8
|
+
expect(result.truncated).toBe(false);
|
|
9
|
+
expect(result.content).toBe(content);
|
|
10
|
+
expect(result.totalLines).toBe(3);
|
|
11
|
+
expect(result.keptLines).toBe(3);
|
|
12
|
+
});
|
|
13
|
+
it("truncates by line count", () => {
|
|
14
|
+
const lines = Array.from({ length: 10 }, (_, i) => `line${i}`);
|
|
15
|
+
const content = lines.join("\n");
|
|
16
|
+
const result = truncateHead(content, 5);
|
|
17
|
+
expect(result.truncated).toBe(true);
|
|
18
|
+
expect(result.keptLines).toBe(5);
|
|
19
|
+
expect(result.totalLines).toBe(10);
|
|
20
|
+
expect(result.content).toBe(lines.slice(0, 5).join("\n"));
|
|
21
|
+
});
|
|
22
|
+
it("truncates by character count", () => {
|
|
23
|
+
// 5 lines of 10 chars each + 4 newlines = 54 chars
|
|
24
|
+
const lines = Array.from({ length: 5 }, () => "abcdefghij");
|
|
25
|
+
const content = lines.join("\n");
|
|
26
|
+
// maxChars = 25 → should keep ~2 lines (10+1+10+1 = 22 < 25, next would be 33 > 25)
|
|
27
|
+
const result = truncateHead(content, 500, 25);
|
|
28
|
+
expect(result.truncated).toBe(true);
|
|
29
|
+
expect(result.keptLines).toBe(2);
|
|
30
|
+
});
|
|
31
|
+
it("handles empty content", () => {
|
|
32
|
+
const result = truncateHead("");
|
|
33
|
+
expect(result.truncated).toBe(false);
|
|
34
|
+
expect(result.content).toBe("");
|
|
35
|
+
expect(result.totalLines).toBe(1); // split("") gives [""]
|
|
36
|
+
expect(result.keptLines).toBe(1);
|
|
37
|
+
});
|
|
38
|
+
it("handles single line", () => {
|
|
39
|
+
const result = truncateHead("hello world", 500, 100_000);
|
|
40
|
+
expect(result.truncated).toBe(false);
|
|
41
|
+
expect(result.content).toBe("hello world");
|
|
42
|
+
});
|
|
43
|
+
it("line limit takes precedence when hit first", () => {
|
|
44
|
+
const lines = Array.from({ length: 100 }, (_, i) => `${i}`);
|
|
45
|
+
const content = lines.join("\n");
|
|
46
|
+
// Short lines, many of them — line limit (3) hit before char limit
|
|
47
|
+
const result = truncateHead(content, 3, 100_000);
|
|
48
|
+
expect(result.keptLines).toBe(3);
|
|
49
|
+
expect(result.truncated).toBe(true);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
// ── truncateTail ───────────────────────────────────────────
|
|
53
|
+
describe("truncateTail", () => {
|
|
54
|
+
it("returns content unchanged when within limits", () => {
|
|
55
|
+
const content = "line1\nline2\nline3";
|
|
56
|
+
const result = truncateTail(content);
|
|
57
|
+
expect(result.truncated).toBe(false);
|
|
58
|
+
expect(result.content).toBe(content);
|
|
59
|
+
expect(result.totalLines).toBe(3);
|
|
60
|
+
expect(result.keptLines).toBe(3);
|
|
61
|
+
});
|
|
62
|
+
it("keeps last N lines", () => {
|
|
63
|
+
const lines = Array.from({ length: 10 }, (_, i) => `line${i}`);
|
|
64
|
+
const content = lines.join("\n");
|
|
65
|
+
const result = truncateTail(content, 3);
|
|
66
|
+
expect(result.truncated).toBe(true);
|
|
67
|
+
expect(result.keptLines).toBe(3);
|
|
68
|
+
expect(result.totalLines).toBe(10);
|
|
69
|
+
expect(result.content).toBe(lines.slice(7).join("\n"));
|
|
70
|
+
});
|
|
71
|
+
it("truncates by character count keeping tail", () => {
|
|
72
|
+
const lines = Array.from({ length: 5 }, () => "abcdefghij");
|
|
73
|
+
const content = lines.join("\n");
|
|
74
|
+
// maxChars = 25 → keep last ~2 lines
|
|
75
|
+
const result = truncateTail(content, 500, 25);
|
|
76
|
+
expect(result.truncated).toBe(true);
|
|
77
|
+
expect(result.keptLines).toBe(2);
|
|
78
|
+
// Should contain the last 2 lines
|
|
79
|
+
expect(result.content).toBe(lines.slice(3).join("\n"));
|
|
80
|
+
});
|
|
81
|
+
it("handles empty content", () => {
|
|
82
|
+
const result = truncateTail("");
|
|
83
|
+
expect(result.truncated).toBe(false);
|
|
84
|
+
expect(result.content).toBe("");
|
|
85
|
+
});
|
|
86
|
+
it("handles single line", () => {
|
|
87
|
+
const result = truncateTail("hello world", 500, 100_000);
|
|
88
|
+
expect(result.truncated).toBe(false);
|
|
89
|
+
expect(result.content).toBe("hello world");
|
|
90
|
+
});
|
|
91
|
+
it("line limit takes precedence when hit first", () => {
|
|
92
|
+
const lines = Array.from({ length: 100 }, (_, i) => `${i}`);
|
|
93
|
+
const content = lines.join("\n");
|
|
94
|
+
const result = truncateTail(content, 3, 100_000);
|
|
95
|
+
expect(result.keptLines).toBe(3);
|
|
96
|
+
expect(result.truncated).toBe(true);
|
|
97
|
+
expect(result.content).toBe(lines.slice(97).join("\n"));
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
//# sourceMappingURL=truncate.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"truncate.test.js","sourceRoot":"","sources":["../../src/tools/truncate.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { AgentTool } from "@kenkaiiii/gg-agent";
|
|
3
|
+
export declare function createWebFetchTool(): AgentTool<typeof parameters>;
|
|
4
|
+
declare const parameters: z.ZodObject<{
|
|
5
|
+
url: z.ZodString;
|
|
6
|
+
max_length: z.ZodOptional<z.ZodNumber>;
|
|
7
|
+
}, z.core.$strip>;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=web-fetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-fetch.d.ts","sourceRoot":"","sources":["../../src/tools/web-fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,wBAAgB,kBAAkB,IAAI,SAAS,CAAC,OAAO,UAAU,CAAC,CAgDjE;AAED,QAAA,MAAM,UAAU;;;iBAGd,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export function createWebFetchTool() {
|
|
3
|
+
return {
|
|
4
|
+
name: "web_fetch",
|
|
5
|
+
description: "Fetch and read content from a URL. Returns the text content of the page with HTML tags stripped. Useful for reading articles, documentation, or any web page.",
|
|
6
|
+
parameters,
|
|
7
|
+
async execute(args) {
|
|
8
|
+
const maxLength = args.max_length ?? 10000;
|
|
9
|
+
try {
|
|
10
|
+
const response = await fetch(args.url, {
|
|
11
|
+
headers: {
|
|
12
|
+
"User-Agent": "Mozilla/5.0 (compatible; GGCoder/1.0)",
|
|
13
|
+
Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
|
|
14
|
+
},
|
|
15
|
+
signal: AbortSignal.timeout(30000),
|
|
16
|
+
});
|
|
17
|
+
if (!response.ok) {
|
|
18
|
+
return `Error: HTTP ${response.status} ${response.statusText}`;
|
|
19
|
+
}
|
|
20
|
+
const contentType = response.headers.get("content-type") ?? "";
|
|
21
|
+
const text = await response.text();
|
|
22
|
+
let content;
|
|
23
|
+
if (contentType.includes("html")) {
|
|
24
|
+
content = text
|
|
25
|
+
.replace(/<script[\s\S]*?<\/script>/gi, "")
|
|
26
|
+
.replace(/<style[\s\S]*?<\/style>/gi, "")
|
|
27
|
+
.replace(/<[^>]+>/g, " ")
|
|
28
|
+
.replace(/\s+/g, " ")
|
|
29
|
+
.trim();
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
content = text;
|
|
33
|
+
}
|
|
34
|
+
if (content.length > maxLength) {
|
|
35
|
+
content = content.slice(0, maxLength) + "\n\n[Content truncated]";
|
|
36
|
+
}
|
|
37
|
+
return content;
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
41
|
+
return `Error fetching ${args.url}: ${msg}`;
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
const parameters = z.object({
|
|
47
|
+
url: z.string().describe("The URL to fetch"),
|
|
48
|
+
max_length: z.number().optional().describe("Maximum characters to return (default: 10000)"),
|
|
49
|
+
});
|
|
50
|
+
//# sourceMappingURL=web-fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-fetch.js","sourceRoot":"","sources":["../../src/tools/web-fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,WAAW,EACT,+JAA+J;QACjK,UAAU;QACV,KAAK,CAAC,OAAO,CAAC,IAAI;YAChB,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC;YAE3C,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE;oBACrC,OAAO,EAAE;wBACP,YAAY,EAAE,uCAAuC;wBACrD,MAAM,EAAE,iEAAiE;qBAC1E;oBACD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;iBACnC,CAAC,CAAC;gBAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACjB,OAAO,eAAe,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;gBACjE,CAAC;gBAED,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;gBAC/D,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAEnC,IAAI,OAAe,CAAC;gBACpB,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBACjC,OAAO,GAAG,IAAI;yBACX,OAAO,CAAC,6BAA6B,EAAE,EAAE,CAAC;yBAC1C,OAAO,CAAC,2BAA2B,EAAE,EAAE,CAAC;yBACxC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;yBACxB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;yBACpB,IAAI,EAAE,CAAC;gBACZ,CAAC;qBAAM,CAAC;oBACN,OAAO,GAAG,IAAI,CAAC;gBACjB,CAAC;gBAED,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;oBAC/B,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,yBAAyB,CAAC;gBACpE,CAAC;gBAED,OAAO,OAAO,CAAC;YACjB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACnE,OAAO,kBAAkB,IAAI,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;YAC9C,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;IAC5C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;CAC5F,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write.test.d.ts","sourceRoot":"","sources":["../../src/tools/write.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import os from "node:os";
|
|
5
|
+
import { createWriteTool } from "./write.js";
|
|
6
|
+
function resultToString(result) {
|
|
7
|
+
return typeof result === "string" ? result : result.content;
|
|
8
|
+
}
|
|
9
|
+
describe("createWriteTool", () => {
|
|
10
|
+
let tmpDir;
|
|
11
|
+
beforeEach(async () => {
|
|
12
|
+
tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "write-test-"));
|
|
13
|
+
});
|
|
14
|
+
afterEach(async () => {
|
|
15
|
+
await fs.rm(tmpDir, { recursive: true, force: true });
|
|
16
|
+
});
|
|
17
|
+
it("returns line count and content for a short file", async () => {
|
|
18
|
+
const tool = createWriteTool(tmpDir);
|
|
19
|
+
const content = "line1\nline2\nline3\n";
|
|
20
|
+
const raw = await tool.execute({ file_path: "test.txt", content }, { signal: new AbortController().signal, toolCallId: "test-1" });
|
|
21
|
+
const lines = resultToString(raw).split("\n");
|
|
22
|
+
expect(lines[0]).toBe("Wrote 3 lines to test.txt");
|
|
23
|
+
// Rest should be the content itself
|
|
24
|
+
expect(lines.slice(1).join("\n")).toBe(content);
|
|
25
|
+
});
|
|
26
|
+
it("counts lines correctly without trailing newline", async () => {
|
|
27
|
+
const tool = createWriteTool(tmpDir);
|
|
28
|
+
const content = "a\nb\nc";
|
|
29
|
+
const raw = await tool.execute({ file_path: "no-newline.txt", content }, { signal: new AbortController().signal, toolCallId: "test-2" });
|
|
30
|
+
expect(resultToString(raw).split("\n")[0]).toBe("Wrote 3 lines to no-newline.txt");
|
|
31
|
+
});
|
|
32
|
+
it("counts single line correctly", async () => {
|
|
33
|
+
const tool = createWriteTool(tmpDir);
|
|
34
|
+
const content = "hello world\n";
|
|
35
|
+
const raw = await tool.execute({ file_path: "one.txt", content }, { signal: new AbortController().signal, toolCallId: "test-3" });
|
|
36
|
+
expect(resultToString(raw).split("\n")[0]).toBe("Wrote 1 lines to one.txt");
|
|
37
|
+
});
|
|
38
|
+
it("uses relative path from cwd", async () => {
|
|
39
|
+
const tool = createWriteTool(tmpDir);
|
|
40
|
+
const subDir = path.join("sub", "dir");
|
|
41
|
+
const raw = await tool.execute({ file_path: `${subDir}/file.txt`, content: "test\n" }, { signal: new AbortController().signal, toolCallId: "test-4" });
|
|
42
|
+
expect(resultToString(raw).split("\n")[0]).toBe(`Wrote 1 lines to ${subDir}/file.txt`);
|
|
43
|
+
});
|
|
44
|
+
it("content in result can be parsed by UI (trailing newline trimming)", async () => {
|
|
45
|
+
const tool = createWriteTool(tmpDir);
|
|
46
|
+
const content = "# Title\n\nSome content\nMore content\n";
|
|
47
|
+
const raw = await tool.execute({ file_path: "readme.md", content }, { signal: new AbortController().signal, toolCallId: "test-5" });
|
|
48
|
+
// Simulate the UI parsing logic from ToolExecution.tsx
|
|
49
|
+
const result = resultToString(raw);
|
|
50
|
+
const allLines = result.split("\n");
|
|
51
|
+
const summary = allLines[0];
|
|
52
|
+
let contentLines = allLines.slice(1);
|
|
53
|
+
if (contentLines.length > 0 && contentLines[contentLines.length - 1] === "") {
|
|
54
|
+
contentLines = contentLines.slice(0, -1);
|
|
55
|
+
}
|
|
56
|
+
expect(summary).toBe("Wrote 4 lines to readme.md");
|
|
57
|
+
expect(contentLines).toEqual(["# Title", "", "Some content", "More content"]);
|
|
58
|
+
expect(contentLines.length).toBe(4);
|
|
59
|
+
});
|
|
60
|
+
it("UI truncation logic works for long files", async () => {
|
|
61
|
+
const MAX_OUTPUT_LINES = 8;
|
|
62
|
+
const tool = createWriteTool(tmpDir);
|
|
63
|
+
const lines = Array.from({ length: 20 }, (_, i) => `line ${i + 1}`);
|
|
64
|
+
const content = lines.join("\n") + "\n";
|
|
65
|
+
const raw = await tool.execute({ file_path: "long.txt", content }, { signal: new AbortController().signal, toolCallId: "test-6" });
|
|
66
|
+
const result = resultToString(raw);
|
|
67
|
+
const allLines = result.split("\n");
|
|
68
|
+
const summary = allLines[0];
|
|
69
|
+
let contentLines = allLines.slice(1);
|
|
70
|
+
if (contentLines.length > 0 && contentLines[contentLines.length - 1] === "") {
|
|
71
|
+
contentLines = contentLines.slice(0, -1);
|
|
72
|
+
}
|
|
73
|
+
expect(summary).toBe("Wrote 20 lines to long.txt");
|
|
74
|
+
expect(contentLines.length).toBe(20);
|
|
75
|
+
// Simulate UI display
|
|
76
|
+
const displayLines = contentLines.slice(0, MAX_OUTPUT_LINES);
|
|
77
|
+
const totalLines = 1 + contentLines.length; // summary + content
|
|
78
|
+
const renderedCount = 1 + displayLines.length; // summary + displayed content
|
|
79
|
+
const hiddenCount = totalLines - renderedCount;
|
|
80
|
+
expect(displayLines.length).toBe(8);
|
|
81
|
+
expect(hiddenCount).toBe(12); // 21 - 9 = 12
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
//# sourceMappingURL=write.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write.test.js","sourceRoot":"","sources":["../../src/tools/write.test.ts"],"names":[],"mappings":"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"}
|
package/dist/ui/App.d.ts
CHANGED
|
@@ -1,9 +1,80 @@
|
|
|
1
|
-
import type { Message, Provider, ThinkingLevel } from "@kenkaiiii/gg-ai";
|
|
1
|
+
import type { Message, Provider, ServerToolDefinition, ThinkingLevel } from "@kenkaiiii/gg-ai";
|
|
2
2
|
import type { AgentTool } from "@kenkaiiii/gg-agent";
|
|
3
|
+
import { type SubAgentInfo } from "./components/SubAgentPanel.js";
|
|
4
|
+
interface UserItem {
|
|
5
|
+
kind: "user";
|
|
6
|
+
text: string;
|
|
7
|
+
id: string;
|
|
8
|
+
}
|
|
9
|
+
interface AssistantItem {
|
|
10
|
+
kind: "assistant";
|
|
11
|
+
text: string;
|
|
12
|
+
thinking?: string;
|
|
13
|
+
id: string;
|
|
14
|
+
}
|
|
15
|
+
interface ToolStartItem {
|
|
16
|
+
kind: "tool_start";
|
|
17
|
+
toolCallId: string;
|
|
18
|
+
name: string;
|
|
19
|
+
args: Record<string, unknown>;
|
|
20
|
+
id: string;
|
|
21
|
+
}
|
|
22
|
+
interface ToolDoneItem {
|
|
23
|
+
kind: "tool_done";
|
|
24
|
+
name: string;
|
|
25
|
+
args: Record<string, unknown>;
|
|
26
|
+
result: string;
|
|
27
|
+
isError: boolean;
|
|
28
|
+
durationMs: number;
|
|
29
|
+
id: string;
|
|
30
|
+
}
|
|
31
|
+
interface ErrorItem {
|
|
32
|
+
kind: "error";
|
|
33
|
+
message: string;
|
|
34
|
+
id: string;
|
|
35
|
+
}
|
|
36
|
+
interface InfoItem {
|
|
37
|
+
kind: "info";
|
|
38
|
+
text: string;
|
|
39
|
+
id: string;
|
|
40
|
+
}
|
|
41
|
+
interface DurationItem {
|
|
42
|
+
kind: "duration";
|
|
43
|
+
durationMs: number;
|
|
44
|
+
toolsUsed: string[];
|
|
45
|
+
id: string;
|
|
46
|
+
}
|
|
47
|
+
interface BannerItem {
|
|
48
|
+
kind: "banner";
|
|
49
|
+
id: string;
|
|
50
|
+
}
|
|
51
|
+
interface SubAgentGroupItem {
|
|
52
|
+
kind: "subagent_group";
|
|
53
|
+
agents: SubAgentInfo[];
|
|
54
|
+
aborted?: boolean;
|
|
55
|
+
id: string;
|
|
56
|
+
}
|
|
57
|
+
interface ServerToolStartItem {
|
|
58
|
+
kind: "server_tool_start";
|
|
59
|
+
serverToolCallId: string;
|
|
60
|
+
name: string;
|
|
61
|
+
input: unknown;
|
|
62
|
+
id: string;
|
|
63
|
+
}
|
|
64
|
+
interface ServerToolDoneItem {
|
|
65
|
+
kind: "server_tool_done";
|
|
66
|
+
name: string;
|
|
67
|
+
input: unknown;
|
|
68
|
+
resultType: string;
|
|
69
|
+
data: unknown;
|
|
70
|
+
id: string;
|
|
71
|
+
}
|
|
72
|
+
export type CompletedItem = UserItem | AssistantItem | ToolStartItem | ToolDoneItem | ServerToolStartItem | ServerToolDoneItem | ErrorItem | InfoItem | DurationItem | BannerItem | SubAgentGroupItem;
|
|
3
73
|
export interface AppProps {
|
|
4
74
|
provider: Provider;
|
|
5
75
|
model: string;
|
|
6
76
|
tools: AgentTool[];
|
|
77
|
+
serverTools?: ServerToolDefinition[];
|
|
7
78
|
messages: Message[];
|
|
8
79
|
maxTokens: number;
|
|
9
80
|
thinking?: ThinkingLevel;
|
|
@@ -11,9 +82,19 @@ export interface AppProps {
|
|
|
11
82
|
baseUrl?: string;
|
|
12
83
|
accountId?: string;
|
|
13
84
|
cwd: string;
|
|
85
|
+
version: string;
|
|
14
86
|
showThinking?: boolean;
|
|
15
87
|
showTokenUsage?: boolean;
|
|
16
88
|
onSlashCommand?: (input: string) => Promise<string | null>;
|
|
89
|
+
loggedInProviders?: Provider[];
|
|
90
|
+
credentialsByProvider?: Record<string, {
|
|
91
|
+
accessToken: string;
|
|
92
|
+
accountId?: string;
|
|
93
|
+
}>;
|
|
94
|
+
initialHistory?: CompletedItem[];
|
|
95
|
+
sessionsDir?: string;
|
|
96
|
+
sessionPath?: string;
|
|
17
97
|
}
|
|
18
98
|
export declare function App(props: AppProps): import("react/jsx-runtime").JSX.Element;
|
|
99
|
+
export {};
|
|
19
100
|
//# sourceMappingURL=App.d.ts.map
|
package/dist/ui/App.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/ui/App.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/ui/App.tsx"],"names":[],"mappings":"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"}
|