@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.
Files changed (124) hide show
  1. package/dist/cli.js +153 -31
  2. package/dist/cli.js.map +1 -1
  3. package/dist/config.d.ts +1 -0
  4. package/dist/config.d.ts.map +1 -1
  5. package/dist/config.js +1 -0
  6. package/dist/config.js.map +1 -1
  7. package/dist/core/agent-session.d.ts.map +1 -1
  8. package/dist/core/agent-session.js +5 -0
  9. package/dist/core/agent-session.js.map +1 -1
  10. package/dist/core/agents.d.ts +32 -0
  11. package/dist/core/agents.d.ts.map +1 -0
  12. package/dist/core/agents.js +95 -0
  13. package/dist/core/agents.js.map +1 -0
  14. package/dist/core/compaction/compactor.d.ts +7 -0
  15. package/dist/core/compaction/compactor.d.ts.map +1 -1
  16. package/dist/core/compaction/compactor.js +32 -1
  17. package/dist/core/compaction/compactor.js.map +1 -1
  18. package/dist/core/compaction/compactor.test.d.ts +2 -0
  19. package/dist/core/compaction/compactor.test.d.ts.map +1 -0
  20. package/dist/core/compaction/compactor.test.js +116 -0
  21. package/dist/core/compaction/compactor.test.js.map +1 -0
  22. package/dist/core/compaction/token-estimator.test.d.ts +2 -0
  23. package/dist/core/compaction/token-estimator.test.d.ts.map +1 -0
  24. package/dist/core/compaction/token-estimator.test.js +115 -0
  25. package/dist/core/compaction/token-estimator.test.js.map +1 -0
  26. package/dist/core/event-bus.d.ts +14 -0
  27. package/dist/core/event-bus.d.ts.map +1 -1
  28. package/dist/core/event-bus.js +20 -0
  29. package/dist/core/event-bus.js.map +1 -1
  30. package/dist/modes/json-mode.d.ts +13 -0
  31. package/dist/modes/json-mode.d.ts.map +1 -0
  32. package/dist/modes/json-mode.js +70 -0
  33. package/dist/modes/json-mode.js.map +1 -0
  34. package/dist/tools/index.d.ts +8 -1
  35. package/dist/tools/index.d.ts.map +1 -1
  36. package/dist/tools/index.js +10 -2
  37. package/dist/tools/index.js.map +1 -1
  38. package/dist/tools/subagent.d.ts +26 -0
  39. package/dist/tools/subagent.d.ts.map +1 -0
  40. package/dist/tools/subagent.js +163 -0
  41. package/dist/tools/subagent.js.map +1 -0
  42. package/dist/tools/truncate.test.d.ts +2 -0
  43. package/dist/tools/truncate.test.d.ts.map +1 -0
  44. package/dist/tools/truncate.test.js +100 -0
  45. package/dist/tools/truncate.test.js.map +1 -0
  46. package/dist/tools/web-fetch.d.ts +9 -0
  47. package/dist/tools/web-fetch.d.ts.map +1 -0
  48. package/dist/tools/web-fetch.js +50 -0
  49. package/dist/tools/web-fetch.js.map +1 -0
  50. package/dist/tools/write.test.d.ts +2 -0
  51. package/dist/tools/write.test.d.ts.map +1 -0
  52. package/dist/tools/write.test.js +84 -0
  53. package/dist/tools/write.test.js.map +1 -0
  54. package/dist/ui/App.d.ts +82 -1
  55. package/dist/ui/App.d.ts.map +1 -1
  56. package/dist/ui/App.js +209 -28
  57. package/dist/ui/App.js.map +1 -1
  58. package/dist/ui/components/ActivityIndicator.d.ts +12 -0
  59. package/dist/ui/components/ActivityIndicator.d.ts.map +1 -0
  60. package/dist/ui/components/ActivityIndicator.js +243 -0
  61. package/dist/ui/components/ActivityIndicator.js.map +1 -0
  62. package/dist/ui/components/AssistantMessage.js +1 -1
  63. package/dist/ui/components/AssistantMessage.js.map +1 -1
  64. package/dist/ui/components/Banner.d.ts +10 -0
  65. package/dist/ui/components/Banner.d.ts.map +1 -0
  66. package/dist/ui/components/Banner.js +34 -0
  67. package/dist/ui/components/Banner.js.map +1 -0
  68. package/dist/ui/components/Markdown.d.ts.map +1 -1
  69. package/dist/ui/components/Markdown.js +14 -9
  70. package/dist/ui/components/Markdown.js.map +1 -1
  71. package/dist/ui/components/ModelSelector.d.ts +5 -1
  72. package/dist/ui/components/ModelSelector.d.ts.map +1 -1
  73. package/dist/ui/components/ModelSelector.js +14 -8
  74. package/dist/ui/components/ModelSelector.js.map +1 -1
  75. package/dist/ui/components/ScrollableContent.d.ts +22 -0
  76. package/dist/ui/components/ScrollableContent.d.ts.map +1 -0
  77. package/dist/ui/components/ScrollableContent.js +44 -0
  78. package/dist/ui/components/ScrollableContent.js.map +1 -0
  79. package/dist/ui/components/SelectList.d.ts +2 -1
  80. package/dist/ui/components/SelectList.d.ts.map +1 -1
  81. package/dist/ui/components/SelectList.js +2 -2
  82. package/dist/ui/components/SelectList.js.map +1 -1
  83. package/dist/ui/components/ServerToolExecution.d.ts +16 -0
  84. package/dist/ui/components/ServerToolExecution.d.ts.map +1 -0
  85. package/dist/ui/components/ServerToolExecution.js +51 -0
  86. package/dist/ui/components/ServerToolExecution.js.map +1 -0
  87. package/dist/ui/components/StreamingArea.d.ts +1 -4
  88. package/dist/ui/components/StreamingArea.d.ts.map +1 -1
  89. package/dist/ui/components/StreamingArea.js +2 -42
  90. package/dist/ui/components/StreamingArea.js.map +1 -1
  91. package/dist/ui/components/SubAgentPanel.d.ts +22 -0
  92. package/dist/ui/components/SubAgentPanel.d.ts.map +1 -0
  93. package/dist/ui/components/SubAgentPanel.js +47 -0
  94. package/dist/ui/components/SubAgentPanel.js.map +1 -0
  95. package/dist/ui/components/ToolExecution.d.ts.map +1 -1
  96. package/dist/ui/components/ToolExecution.js +88 -11
  97. package/dist/ui/components/ToolExecution.js.map +1 -1
  98. package/dist/ui/hooks/useAgentLoop.d.ts +17 -2
  99. package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
  100. package/dist/ui/hooks/useAgentLoop.js +133 -7
  101. package/dist/ui/hooks/useAgentLoop.js.map +1 -1
  102. package/dist/ui/hooks/useMouseScroll.d.ts.map +1 -0
  103. package/dist/ui/hooks/useMouseScroll.js.map +1 -0
  104. package/dist/ui/hooks/useScrollViewport.d.ts +25 -0
  105. package/dist/ui/hooks/useScrollViewport.d.ts.map +1 -0
  106. package/dist/ui/hooks/useScrollViewport.js +32 -0
  107. package/dist/ui/hooks/useScrollViewport.js.map +1 -0
  108. package/dist/ui/login.d.ts +3 -0
  109. package/dist/ui/login.d.ts.map +1 -0
  110. package/dist/ui/login.js +90 -0
  111. package/dist/ui/login.js.map +1 -0
  112. package/dist/ui/render.d.ts +12 -1
  113. package/dist/ui/render.d.ts.map +1 -1
  114. package/dist/ui/render.js +7 -0
  115. package/dist/ui/render.js.map +1 -1
  116. package/dist/ui/utils/highlight.d.ts +8 -0
  117. package/dist/ui/utils/highlight.d.ts.map +1 -0
  118. package/dist/ui/utils/highlight.js +49 -0
  119. package/dist/ui/utils/highlight.js.map +1 -0
  120. package/dist/ui/utils/item-heights.d.ts +17 -0
  121. package/dist/ui/utils/item-heights.d.ts.map +1 -0
  122. package/dist/ui/utils/item-heights.js +73 -0
  123. package/dist/ui/utils/item-heights.js.map +1 -0
  124. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=truncate.test.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=write.test.d.ts.map
@@ -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
@@ -1 +1 @@
1
- {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/ui/App.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAoHrD,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC5D;AAID,wBAAgB,GAAG,CAAC,KAAK,EAAE,QAAQ,2CAkPlC"}
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/ui/App.tsx"],"names":[],"mappings":"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"}