@kenkaiiii/gg-agent 0.0.2 → 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.
@@ -1,4 +1,10 @@
1
1
  import { type Message } from "@kenkaiiii/gg-ai";
2
2
  import type { AgentEvent, AgentOptions, AgentResult } from "./types.js";
3
+ /**
4
+ * Detect context window overflow errors from LLM providers.
5
+ * Anthropic: "prompt is too long: N tokens > M maximum"
6
+ * OpenAI: "context_length_exceeded" / "maximum context length"
7
+ */
8
+ export declare function isContextOverflow(err: unknown): boolean;
3
9
  export declare function agentLoop(messages: Message[], options: AgentOptions): AsyncGenerator<AgentEvent, AgentResult>;
4
10
  //# sourceMappingURL=agent-loop.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-loop.d.ts","sourceRoot":"","sources":["../src/agent-loop.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,OAAO,EAMb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAA0B,MAAM,YAAY,CAAC;AAIhG,wBAAuB,SAAS,CAC9B,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,EAAE,YAAY,GACpB,cAAc,CAAC,UAAU,EAAE,WAAW,CAAC,CA6IzC"}
1
+ {"version":3,"file":"agent-loop.d.ts","sourceRoot":"","sources":["../src/agent-loop.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,OAAO,EAMb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EACZ,WAAW,EAKZ,MAAM,YAAY,CAAC;AAIpB;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CASvD;AAED,wBAAuB,SAAS,CAC9B,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,EAAE,YAAY,GACpB,cAAc,CAAC,UAAU,EAAE,WAAW,CAAC,CAuNzC"}
@@ -1,38 +1,98 @@
1
- import { stream, } from "@kenkaiiii/gg-ai";
1
+ import { stream, EventStream, } from "@kenkaiiii/gg-ai";
2
2
  const DEFAULT_MAX_TURNS = 40;
3
+ /**
4
+ * Detect context window overflow errors from LLM providers.
5
+ * Anthropic: "prompt is too long: N tokens > M maximum"
6
+ * OpenAI: "context_length_exceeded" / "maximum context length"
7
+ */
8
+ export function isContextOverflow(err) {
9
+ if (!(err instanceof Error))
10
+ return false;
11
+ const msg = err.message.toLowerCase();
12
+ return (msg.includes("prompt is too long") ||
13
+ msg.includes("context_length_exceeded") ||
14
+ msg.includes("maximum context length") ||
15
+ (msg.includes("token") && msg.includes("exceed")));
16
+ }
3
17
  export async function* agentLoop(messages, options) {
4
18
  const maxTurns = options.maxTurns ?? DEFAULT_MAX_TURNS;
5
19
  const toolMap = new Map((options.tools ?? []).map((t) => [t.name, t]));
6
20
  const totalUsage = { inputTokens: 0, outputTokens: 0 };
7
21
  let turn = 0;
22
+ let overflowRetried = false;
8
23
  while (turn < maxTurns) {
9
24
  options.signal?.throwIfAborted();
10
25
  turn++;
11
- const result = stream({
12
- provider: options.provider,
13
- model: options.model,
14
- messages,
15
- tools: options.tools,
16
- maxTokens: options.maxTokens,
17
- temperature: options.temperature,
18
- thinking: options.thinking,
19
- apiKey: options.apiKey,
20
- baseUrl: options.baseUrl,
21
- signal: options.signal,
22
- accountId: options.accountId,
23
- });
24
- // Suppress unhandled rejection if the iterator path throws first
25
- result.response.catch(() => { });
26
- // Forward streaming deltas
27
- for await (const event of result) {
28
- if (event.type === "text_delta") {
29
- yield { type: "text_delta", text: event.text };
26
+ // ── Mid-loop context transform (compaction / truncation) ──
27
+ if (options.transformContext) {
28
+ const transformed = await options.transformContext(messages);
29
+ if (transformed !== messages) {
30
+ messages.length = 0;
31
+ messages.push(...transformed);
32
+ }
33
+ }
34
+ // ── Call LLM with overflow recovery ──
35
+ let response;
36
+ try {
37
+ const result = stream({
38
+ provider: options.provider,
39
+ model: options.model,
40
+ messages,
41
+ tools: options.tools,
42
+ serverTools: options.serverTools,
43
+ maxTokens: options.maxTokens,
44
+ temperature: options.temperature,
45
+ thinking: options.thinking,
46
+ apiKey: options.apiKey,
47
+ baseUrl: options.baseUrl,
48
+ signal: options.signal,
49
+ accountId: options.accountId,
50
+ });
51
+ // Suppress unhandled rejection if the iterator path throws first
52
+ result.response.catch(() => { });
53
+ // Forward streaming deltas
54
+ for await (const event of result) {
55
+ if (event.type === "text_delta") {
56
+ yield { type: "text_delta", text: event.text };
57
+ }
58
+ else if (event.type === "thinking_delta") {
59
+ yield { type: "thinking_delta", text: event.text };
60
+ }
61
+ else if (event.type === "server_toolcall") {
62
+ yield {
63
+ type: "server_tool_call",
64
+ id: event.id,
65
+ name: event.name,
66
+ input: event.input,
67
+ };
68
+ }
69
+ else if (event.type === "server_toolresult") {
70
+ yield {
71
+ type: "server_tool_result",
72
+ toolUseId: event.toolUseId,
73
+ resultType: event.resultType,
74
+ data: event.data,
75
+ };
76
+ }
30
77
  }
31
- else if (event.type === "thinking_delta") {
32
- yield { type: "thinking_delta", text: event.text };
78
+ response = await result.response;
79
+ }
80
+ catch (err) {
81
+ // Context overflow: compact via transformContext and retry once
82
+ if (!overflowRetried && isContextOverflow(err) && options.transformContext) {
83
+ overflowRetried = true;
84
+ const transformed = await options.transformContext(messages);
85
+ if (transformed !== messages) {
86
+ messages.length = 0;
87
+ messages.push(...transformed);
88
+ }
89
+ turn--; // Don't count the failed turn
90
+ continue;
33
91
  }
92
+ throw err;
34
93
  }
35
- const response = await result.response;
94
+ // Reset overflow flag after successful call
95
+ overflowRetried = false;
36
96
  // Accumulate usage
37
97
  totalUsage.inputTokens += response.usage.inputTokens;
38
98
  totalUsage.outputTokens += response.usage.outputTokens;
@@ -57,19 +117,21 @@ export async function* agentLoop(messages, options) {
57
117
  totalUsage: { ...totalUsage },
58
118
  };
59
119
  }
60
- // Extract and execute tool calls
120
+ // Extract and execute tool calls in parallel
61
121
  const toolCalls = extractToolCalls(response.message.content);
62
122
  const toolResults = [];
63
- for (const toolCall of toolCalls) {
64
- options.signal?.throwIfAborted();
65
- yield {
123
+ const eventStream = new EventStream();
124
+ // Launch all tool calls in parallel
125
+ const executions = toolCalls.map(async (toolCall) => {
126
+ const startTime = Date.now();
127
+ eventStream.push({
66
128
  type: "tool_call_start",
67
129
  toolCallId: toolCall.id,
68
130
  name: toolCall.name,
69
131
  args: toolCall.args,
70
- };
71
- const startTime = Date.now();
132
+ });
72
133
  let resultContent;
134
+ let details;
73
135
  let isError = false;
74
136
  const tool = toolMap.get(toolCall.name);
75
137
  if (!tool) {
@@ -82,8 +144,18 @@ export async function* agentLoop(messages, options) {
82
144
  const ctx = {
83
145
  signal: options.signal ?? AbortSignal.timeout(300_000),
84
146
  toolCallId: toolCall.id,
147
+ onUpdate: (update) => {
148
+ eventStream.push({
149
+ type: "tool_call_update",
150
+ toolCallId: toolCall.id,
151
+ update,
152
+ });
153
+ },
85
154
  };
86
- resultContent = await tool.execute(parsed, ctx);
155
+ const raw = await tool.execute(parsed, ctx);
156
+ const normalized = normalizeToolResult(raw);
157
+ resultContent = normalized.content;
158
+ details = normalized.details;
87
159
  }
88
160
  catch (err) {
89
161
  isError = true;
@@ -91,19 +163,34 @@ export async function* agentLoop(messages, options) {
91
163
  }
92
164
  }
93
165
  const durationMs = Date.now() - startTime;
94
- yield {
166
+ eventStream.push({
95
167
  type: "tool_call_end",
96
168
  toolCallId: toolCall.id,
97
169
  result: resultContent,
170
+ details,
98
171
  isError,
99
172
  durationMs,
100
- };
101
- toolResults.push({
102
- type: "tool_result",
103
- toolCallId: toolCall.id,
104
- content: resultContent,
105
- isError: isError || undefined,
106
173
  });
174
+ return { toolCallId: toolCall.id, content: resultContent, isError };
175
+ });
176
+ // Close event stream when all tools complete
177
+ Promise.all(executions)
178
+ .then((results) => {
179
+ for (const tc of toolCalls) {
180
+ const r = results.find((x) => x.toolCallId === tc.id);
181
+ toolResults.push({
182
+ type: "tool_result",
183
+ toolCallId: tc.id,
184
+ content: r.content,
185
+ isError: r.isError || undefined,
186
+ });
187
+ }
188
+ eventStream.close();
189
+ })
190
+ .catch((err) => eventStream.abort(err instanceof Error ? err : new Error(String(err))));
191
+ // Yield events as they arrive from parallel tools
192
+ for await (const event of eventStream) {
193
+ yield event;
107
194
  }
108
195
  // Push tool results back into conversation
109
196
  messages.push({ role: "tool", content: toolResults });
@@ -123,6 +210,9 @@ export async function* agentLoop(messages, options) {
123
210
  totalUsage: { ...totalUsage },
124
211
  };
125
212
  }
213
+ function normalizeToolResult(raw) {
214
+ return typeof raw === "string" ? { content: raw } : raw;
215
+ }
126
216
  function extractToolCalls(content) {
127
217
  if (typeof content === "string")
128
218
  return [];
@@ -1 +1 @@
1
- {"version":3,"file":"agent-loop.js","sourceRoot":"","sources":["../src/agent-loop.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-loop.js","sourceRoot":"","sources":["../src/agent-loop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agent-loop.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-loop.test.d.ts","sourceRoot":"","sources":["../src/agent-loop.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,229 @@
1
+ import { describe, it, expect, vi, beforeEach } from "vitest";
2
+ import { isContextOverflow, agentLoop } from "./agent-loop.js";
3
+ // ── Mock stream ────────────────────────────────────────────
4
+ vi.mock("@kenkaiiii/gg-ai", async (importOriginal) => {
5
+ // eslint-disable-next-line @typescript-eslint/consistent-type-imports
6
+ const mod = await importOriginal();
7
+ return { ...mod, stream: vi.fn() };
8
+ });
9
+ import { stream } from "@kenkaiiii/gg-ai";
10
+ const mockStream = vi.mocked(stream);
11
+ function makeResponse(text, stopReason = "end_turn") {
12
+ return {
13
+ message: {
14
+ role: "assistant",
15
+ content: text ? [{ type: "text", text }] : "",
16
+ },
17
+ stopReason,
18
+ usage: { inputTokens: 100, outputTokens: 50 },
19
+ };
20
+ }
21
+ function mockOkResult(text) {
22
+ const resp = makeResponse(text);
23
+ const events = text ? [{ type: "text_delta", text }] : [];
24
+ return {
25
+ [Symbol.asyncIterator]: async function* () {
26
+ for (const e of events)
27
+ yield e;
28
+ },
29
+ response: Promise.resolve(resp),
30
+ };
31
+ }
32
+ function mockErrorResult(error) {
33
+ const p = Promise.reject(error);
34
+ p.catch(() => { }); // prevent unhandled rejection
35
+ return {
36
+ [Symbol.asyncIterator]: async function* () {
37
+ yield* []; // satisfy require-yield
38
+ throw error;
39
+ },
40
+ response: p,
41
+ };
42
+ }
43
+ async function collectLoop(messages, opts) {
44
+ const gen = agentLoop(messages, opts);
45
+ const events = [];
46
+ let result;
47
+ while (true) {
48
+ const next = await gen.next();
49
+ if (next.done) {
50
+ result = next.value;
51
+ break;
52
+ }
53
+ events.push(next.value);
54
+ }
55
+ return { events, result: result };
56
+ }
57
+ // ── Tests ──────────────────────────────────────────────────
58
+ describe("isContextOverflow", () => {
59
+ it("detects Anthropic overflow error", () => {
60
+ const err = new Error("[anthropic] prompt is too long: 203456 tokens > 200000 maximum");
61
+ expect(isContextOverflow(err)).toBe(true);
62
+ });
63
+ it("detects OpenAI overflow error", () => {
64
+ const err = new Error("[openai] This model's maximum context length is 128000 tokens. " +
65
+ "However, your messages resulted in 130000 tokens.");
66
+ expect(isContextOverflow(err)).toBe(true);
67
+ });
68
+ it("detects context_length_exceeded code", () => {
69
+ const err = new Error("context_length_exceeded");
70
+ expect(isContextOverflow(err)).toBe(true);
71
+ });
72
+ it("detects token exceed pattern", () => {
73
+ const err = new Error("Request token count exceeds the limit");
74
+ expect(isContextOverflow(err)).toBe(true);
75
+ });
76
+ it("returns false for unrelated errors", () => {
77
+ expect(isContextOverflow(new Error("network timeout"))).toBe(false);
78
+ expect(isContextOverflow(new Error("authentication failed"))).toBe(false);
79
+ expect(isContextOverflow(new Error("rate limit exceeded"))).toBe(false);
80
+ });
81
+ it("returns false for non-Error values", () => {
82
+ expect(isContextOverflow("some string")).toBe(false);
83
+ expect(isContextOverflow(null)).toBe(false);
84
+ expect(isContextOverflow(undefined)).toBe(false);
85
+ });
86
+ });
87
+ describe("agentLoop", () => {
88
+ beforeEach(() => {
89
+ vi.resetAllMocks();
90
+ });
91
+ it("yields text_delta, turn_end, and agent_done for a simple response", async () => {
92
+ mockStream.mockReturnValueOnce(mockOkResult("Hello!"));
93
+ const messages = [
94
+ { role: "system", content: "You are helpful." },
95
+ { role: "user", content: "Hi" },
96
+ ];
97
+ const { events, result } = await collectLoop(messages, {
98
+ provider: "anthropic",
99
+ model: "test",
100
+ });
101
+ const types = events.map((e) => e.type);
102
+ expect(types).toContain("text_delta");
103
+ expect(types).toContain("turn_end");
104
+ expect(types).toContain("agent_done");
105
+ expect(result.totalTurns).toBe(1);
106
+ expect(result.totalUsage.inputTokens).toBe(100);
107
+ expect(result.totalUsage.outputTokens).toBe(50);
108
+ });
109
+ it("calls transformContext before each LLM call", async () => {
110
+ mockStream.mockReturnValueOnce(mockOkResult("Done"));
111
+ const messages = [
112
+ { role: "system", content: "sys" },
113
+ { role: "user", content: "test" },
114
+ ];
115
+ const transformContext = vi.fn().mockImplementation((msgs) => msgs);
116
+ await collectLoop(messages, {
117
+ provider: "anthropic",
118
+ model: "test",
119
+ transformContext,
120
+ });
121
+ expect(transformContext).toHaveBeenCalledTimes(1);
122
+ expect(transformContext).toHaveBeenCalledWith(messages);
123
+ });
124
+ it("replaces messages when transformContext returns a new array", async () => {
125
+ mockStream.mockReturnValueOnce(mockOkResult("Ok"));
126
+ const original = [
127
+ { role: "system", content: "sys" },
128
+ { role: "user", content: "lots of old context" },
129
+ { role: "assistant", content: "old reply" },
130
+ { role: "user", content: "new question" },
131
+ ];
132
+ const compacted = [
133
+ { role: "system", content: "sys" },
134
+ { role: "user", content: "new question" },
135
+ ];
136
+ const transformContext = vi.fn().mockReturnValueOnce(compacted);
137
+ await collectLoop(original, {
138
+ provider: "anthropic",
139
+ model: "test",
140
+ transformContext,
141
+ });
142
+ // Original array should have been replaced in-place
143
+ expect(original.length).toBe(compacted.length + 1); // +1 for pushed assistant message
144
+ expect(original[0]).toEqual(compacted[0]);
145
+ expect(original[1]).toEqual(compacted[1]);
146
+ });
147
+ it("retries once on context overflow when transformContext is provided", async () => {
148
+ const overflowErr = new Error("prompt is too long: 250000 tokens > 200000 maximum");
149
+ mockStream
150
+ .mockReturnValueOnce(mockErrorResult(overflowErr))
151
+ .mockReturnValueOnce(mockOkResult("Recovered"));
152
+ const messages = [
153
+ { role: "system", content: "sys" },
154
+ { role: "user", content: "test" },
155
+ ];
156
+ const compacted = [
157
+ { role: "system", content: "sys" },
158
+ { role: "user", content: "test" },
159
+ ];
160
+ const transformContext = vi.fn().mockImplementation(() => compacted);
161
+ const { events, result } = await collectLoop(messages, {
162
+ provider: "anthropic",
163
+ model: "test",
164
+ transformContext,
165
+ });
166
+ // transformContext called 3 times: pre-call, on overflow, pre-retry
167
+ expect(transformContext).toHaveBeenCalledTimes(3);
168
+ expect(mockStream).toHaveBeenCalledTimes(2);
169
+ expect(result.totalTurns).toBe(1);
170
+ const textEvents = events.filter((e) => e.type === "text_delta");
171
+ expect(textEvents).toHaveLength(1);
172
+ });
173
+ it("throws on context overflow when no transformContext is provided", async () => {
174
+ const overflowErr = new Error("prompt is too long: 250000 tokens > 200000 maximum");
175
+ mockStream.mockReturnValueOnce(mockErrorResult(overflowErr));
176
+ const messages = [
177
+ { role: "system", content: "sys" },
178
+ { role: "user", content: "test" },
179
+ ];
180
+ await expect(collectLoop(messages, { provider: "anthropic", model: "test" })).rejects.toThrow("prompt is too long");
181
+ });
182
+ it("throws on non-overflow errors even with transformContext", async () => {
183
+ const otherErr = new Error("authentication failed");
184
+ mockStream.mockReturnValueOnce(mockErrorResult(otherErr));
185
+ const messages = [
186
+ { role: "system", content: "sys" },
187
+ { role: "user", content: "test" },
188
+ ];
189
+ const transformContext = vi.fn().mockImplementation((msgs) => msgs);
190
+ await expect(collectLoop(messages, { provider: "anthropic", model: "test", transformContext })).rejects.toThrow("authentication failed");
191
+ });
192
+ it("respects maxTurns", async () => {
193
+ // Return tool_use to force looping, but cap at 2 turns
194
+ const toolResponse = {
195
+ message: {
196
+ role: "assistant",
197
+ content: [{ type: "tool_call", id: "t1", name: "test_tool", args: {} }],
198
+ },
199
+ stopReason: "tool_use",
200
+ usage: { inputTokens: 50, outputTokens: 25 },
201
+ };
202
+ // Keep returning tool_use — loop should stop at maxTurns
203
+ mockStream.mockReturnValue({
204
+ [Symbol.asyncIterator]: async function* () {
205
+ // no text events
206
+ },
207
+ response: Promise.resolve(toolResponse),
208
+ });
209
+ const messages = [
210
+ { role: "system", content: "sys" },
211
+ { role: "user", content: "test" },
212
+ ];
213
+ const { result } = await collectLoop(messages, {
214
+ provider: "anthropic",
215
+ model: "test",
216
+ maxTurns: 2,
217
+ tools: [
218
+ {
219
+ name: "test_tool",
220
+ description: "test",
221
+ parameters: { parse: () => ({}) },
222
+ execute: () => "result",
223
+ },
224
+ ],
225
+ });
226
+ expect(result.totalTurns).toBe(2);
227
+ });
228
+ });
229
+ //# sourceMappingURL=agent-loop.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-loop.test.js","sourceRoot":"","sources":["../src/agent-loop.test.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  export { Agent, AgentStream } from "./agent.js";
2
- export { agentLoop } from "./agent-loop.js";
3
- export type { ToolContext, AgentTool, AgentTextDeltaEvent, AgentThinkingDeltaEvent, AgentToolCallStartEvent, AgentToolCallEndEvent, AgentTurnEndEvent, AgentDoneEvent, AgentErrorEvent, AgentEvent, AgentOptions, AgentResult, } from "./types.js";
2
+ export { agentLoop, isContextOverflow } from "./agent-loop.js";
3
+ export type { StructuredToolResult, ToolExecuteResult, ToolContext, AgentTool, AgentTextDeltaEvent, AgentThinkingDeltaEvent, AgentToolCallStartEvent, AgentToolCallUpdateEvent, AgentToolCallEndEvent, AgentServerToolCallEvent, AgentServerToolResultEvent, AgentTurnEndEvent, AgentDoneEvent, AgentErrorEvent, AgentEvent, AgentOptions, AgentResult, } from "./types.js";
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,YAAY,EACV,WAAW,EACX,SAAS,EACT,mBAAmB,EACnB,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,EACrB,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,UAAU,EACV,YAAY,EACZ,WAAW,GACZ,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAG/D,YAAY,EACV,oBAAoB,EACpB,iBAAiB,EACjB,WAAW,EACX,SAAS,EACT,mBAAmB,EACnB,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,qBAAqB,EACrB,wBAAwB,EACxB,0BAA0B,EAC1B,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,UAAU,EACV,YAAY,EACZ,WAAW,GACZ,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
1
  // Core
2
2
  export { Agent, AgentStream } from "./agent.js";
3
- export { agentLoop } from "./agent-loop.js";
3
+ export { agentLoop, isContextOverflow } from "./agent-loop.js";
4
4
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO;AACP,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO;AACP,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/types.d.ts CHANGED
@@ -1,12 +1,18 @@
1
1
  import type { z } from "zod";
2
- import type { Tool, AssistantMessage, StopReason, Usage, StreamOptions } from "@kenkaiiii/gg-ai";
2
+ import type { Tool, AssistantMessage, Message, ServerToolDefinition, StopReason, Usage, StreamOptions } from "@kenkaiiii/gg-ai";
3
+ export interface StructuredToolResult {
4
+ content: string;
5
+ details?: unknown;
6
+ }
7
+ export type ToolExecuteResult = string | StructuredToolResult;
3
8
  export interface ToolContext {
4
9
  signal: AbortSignal;
5
10
  toolCallId: string;
11
+ onUpdate?: (update: unknown) => void;
6
12
  }
7
13
  export interface AgentTool<T extends z.ZodType = z.ZodType> extends Tool {
8
14
  parameters: T;
9
- execute: (args: z.infer<T>, context: ToolContext) => string | Promise<string>;
15
+ execute: (args: z.infer<T>, context: ToolContext) => ToolExecuteResult | Promise<ToolExecuteResult>;
10
16
  }
11
17
  export interface AgentTextDeltaEvent {
12
18
  type: "text_delta";
@@ -22,10 +28,16 @@ export interface AgentToolCallStartEvent {
22
28
  name: string;
23
29
  args: Record<string, unknown>;
24
30
  }
31
+ export interface AgentToolCallUpdateEvent {
32
+ type: "tool_call_update";
33
+ toolCallId: string;
34
+ update: unknown;
35
+ }
25
36
  export interface AgentToolCallEndEvent {
26
37
  type: "tool_call_end";
27
38
  toolCallId: string;
28
39
  result: string;
40
+ details?: unknown;
29
41
  isError: boolean;
30
42
  durationMs: number;
31
43
  }
@@ -44,12 +56,25 @@ export interface AgentErrorEvent {
44
56
  type: "error";
45
57
  error: Error;
46
58
  }
47
- export type AgentEvent = AgentTextDeltaEvent | AgentThinkingDeltaEvent | AgentToolCallStartEvent | AgentToolCallEndEvent | AgentTurnEndEvent | AgentDoneEvent | AgentErrorEvent;
59
+ export interface AgentServerToolCallEvent {
60
+ type: "server_tool_call";
61
+ id: string;
62
+ name: string;
63
+ input: unknown;
64
+ }
65
+ export interface AgentServerToolResultEvent {
66
+ type: "server_tool_result";
67
+ toolUseId: string;
68
+ resultType: string;
69
+ data: unknown;
70
+ }
71
+ export type AgentEvent = AgentTextDeltaEvent | AgentThinkingDeltaEvent | AgentToolCallStartEvent | AgentToolCallUpdateEvent | AgentToolCallEndEvent | AgentServerToolCallEvent | AgentServerToolResultEvent | AgentTurnEndEvent | AgentDoneEvent | AgentErrorEvent;
48
72
  export interface AgentOptions {
49
73
  provider: StreamOptions["provider"];
50
74
  model: string;
51
75
  system?: string;
52
76
  tools?: AgentTool[];
77
+ serverTools?: ServerToolDefinition[];
53
78
  maxTurns?: number;
54
79
  maxTokens?: number;
55
80
  temperature?: number;
@@ -58,6 +83,12 @@ export interface AgentOptions {
58
83
  baseUrl?: string;
59
84
  signal?: AbortSignal;
60
85
  accountId?: string;
86
+ /**
87
+ * Called before each LLM call. Allows the caller to inspect and transform
88
+ * the messages array (e.g. compaction, truncation). Return the same array
89
+ * for no-op, or a new array to replace the conversation context.
90
+ */
91
+ transformContext?: (messages: Message[]) => Message[] | Promise<Message[]>;
61
92
  }
62
93
  export interface AgentResult {
63
94
  message: AssistantMessage;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAIjG,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAID,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAE,SAAQ,IAAI;IACtE,UAAU,EAAE,CAAC,CAAC;IACd,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC/E;AAID,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,gBAAgB,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,iBAAiB,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,eAAe,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,EAAE,KAAK,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,KAAK,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;CACd;AAED,MAAM,MAAM,UAAU,GAClB,mBAAmB,GACnB,uBAAuB,GACvB,uBAAuB,GACvB,qBAAqB,GACrB,iBAAiB,GACjB,cAAc,GACd,eAAe,CAAC;AAIpB,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,KAAK,CAAC;CACnB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@kenkaiiii/gg-agent",
3
- "version": "0.0.2",
3
+ "version": "1.0.4",
4
4
  "type": "module",
5
5
  "description": "Agentic loop system with tool execution for LLMs",
6
6
  "license": "MIT",
7
7
  "repository": {
8
8
  "type": "git",
9
- "url": "https://github.com/kenkaiiii/gg-coder",
9
+ "url": "git+https://github.com/kenkaiiii/gg-coder.git",
10
10
  "directory": "packages/gg-agent"
11
11
  },
12
12
  "exports": {
@@ -15,14 +15,12 @@
15
15
  "types": "./dist/index.d.ts"
16
16
  }
17
17
  },
18
- "files": ["dist"],
19
- "scripts": {
20
- "build": "tsc",
21
- "check": "tsc --noEmit"
22
- },
18
+ "files": [
19
+ "dist"
20
+ ],
23
21
  "dependencies": {
24
- "@kenkaiiii/gg-ai": "workspace:*",
25
- "zod": "^4.3.6"
22
+ "zod": "^4.3.6",
23
+ "@kenkaiiii/gg-ai": "1.0.4"
26
24
  },
27
25
  "devDependencies": {
28
26
  "typescript": "^5.9.3",
@@ -30,5 +28,9 @@
30
28
  },
31
29
  "publishConfig": {
32
30
  "access": "public"
31
+ },
32
+ "scripts": {
33
+ "build": "tsc",
34
+ "check": "tsc --noEmit"
33
35
  }
34
- }
36
+ }