@kenkaiiii/gg-agent 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/agent-loop.d.ts +4 -0
- package/dist/agent-loop.d.ts.map +1 -0
- package/dist/agent-loop.js +131 -0
- package/dist/agent-loop.js.map +1 -0
- package/dist/agent.d.ts +33 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +87 -0
- package/dist/agent.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +67 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +36 -0
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type Message } from "@kenkaiiii/gg-ai";
|
|
2
|
+
import type { AgentEvent, AgentOptions, AgentResult } from "./types.js";
|
|
3
|
+
export declare function agentLoop(messages: Message[], options: AgentOptions): AsyncGenerator<AgentEvent, AgentResult>;
|
|
4
|
+
//# sourceMappingURL=agent-loop.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { stream, } from "@kenkaiiii/gg-ai";
|
|
2
|
+
const DEFAULT_MAX_TURNS = 40;
|
|
3
|
+
export async function* agentLoop(messages, options) {
|
|
4
|
+
const maxTurns = options.maxTurns ?? DEFAULT_MAX_TURNS;
|
|
5
|
+
const toolMap = new Map((options.tools ?? []).map((t) => [t.name, t]));
|
|
6
|
+
const totalUsage = { inputTokens: 0, outputTokens: 0 };
|
|
7
|
+
let turn = 0;
|
|
8
|
+
while (turn < maxTurns) {
|
|
9
|
+
options.signal?.throwIfAborted();
|
|
10
|
+
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 };
|
|
30
|
+
}
|
|
31
|
+
else if (event.type === "thinking_delta") {
|
|
32
|
+
yield { type: "thinking_delta", text: event.text };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const response = await result.response;
|
|
36
|
+
// Accumulate usage
|
|
37
|
+
totalUsage.inputTokens += response.usage.inputTokens;
|
|
38
|
+
totalUsage.outputTokens += response.usage.outputTokens;
|
|
39
|
+
// Append assistant message to conversation
|
|
40
|
+
messages.push(response.message);
|
|
41
|
+
yield {
|
|
42
|
+
type: "turn_end",
|
|
43
|
+
turn,
|
|
44
|
+
stopReason: response.stopReason,
|
|
45
|
+
usage: response.usage,
|
|
46
|
+
};
|
|
47
|
+
// If not tool_use, we're done
|
|
48
|
+
if (response.stopReason !== "tool_use") {
|
|
49
|
+
yield {
|
|
50
|
+
type: "agent_done",
|
|
51
|
+
totalTurns: turn,
|
|
52
|
+
totalUsage: { ...totalUsage },
|
|
53
|
+
};
|
|
54
|
+
return {
|
|
55
|
+
message: response.message,
|
|
56
|
+
totalTurns: turn,
|
|
57
|
+
totalUsage: { ...totalUsage },
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
// Extract and execute tool calls
|
|
61
|
+
const toolCalls = extractToolCalls(response.message.content);
|
|
62
|
+
const toolResults = [];
|
|
63
|
+
for (const toolCall of toolCalls) {
|
|
64
|
+
options.signal?.throwIfAborted();
|
|
65
|
+
yield {
|
|
66
|
+
type: "tool_call_start",
|
|
67
|
+
toolCallId: toolCall.id,
|
|
68
|
+
name: toolCall.name,
|
|
69
|
+
args: toolCall.args,
|
|
70
|
+
};
|
|
71
|
+
const startTime = Date.now();
|
|
72
|
+
let resultContent;
|
|
73
|
+
let isError = false;
|
|
74
|
+
const tool = toolMap.get(toolCall.name);
|
|
75
|
+
if (!tool) {
|
|
76
|
+
resultContent = `Unknown tool: ${toolCall.name}`;
|
|
77
|
+
isError = true;
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
try {
|
|
81
|
+
const parsed = tool.parameters.parse(toolCall.args);
|
|
82
|
+
const ctx = {
|
|
83
|
+
signal: options.signal ?? AbortSignal.timeout(300_000),
|
|
84
|
+
toolCallId: toolCall.id,
|
|
85
|
+
};
|
|
86
|
+
resultContent = await tool.execute(parsed, ctx);
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
isError = true;
|
|
90
|
+
resultContent = err instanceof Error ? err.message : String(err);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const durationMs = Date.now() - startTime;
|
|
94
|
+
yield {
|
|
95
|
+
type: "tool_call_end",
|
|
96
|
+
toolCallId: toolCall.id,
|
|
97
|
+
result: resultContent,
|
|
98
|
+
isError,
|
|
99
|
+
durationMs,
|
|
100
|
+
};
|
|
101
|
+
toolResults.push({
|
|
102
|
+
type: "tool_result",
|
|
103
|
+
toolCallId: toolCall.id,
|
|
104
|
+
content: resultContent,
|
|
105
|
+
isError: isError || undefined,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
// Push tool results back into conversation
|
|
109
|
+
messages.push({ role: "tool", content: toolResults });
|
|
110
|
+
}
|
|
111
|
+
// Exceeded max turns — return last assistant message
|
|
112
|
+
const lastAssistant = [...messages]
|
|
113
|
+
.reverse()
|
|
114
|
+
.find((m) => m.role === "assistant");
|
|
115
|
+
yield {
|
|
116
|
+
type: "agent_done",
|
|
117
|
+
totalTurns: turn,
|
|
118
|
+
totalUsage: { ...totalUsage },
|
|
119
|
+
};
|
|
120
|
+
return {
|
|
121
|
+
message: lastAssistant,
|
|
122
|
+
totalTurns: turn,
|
|
123
|
+
totalUsage: { ...totalUsage },
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
function extractToolCalls(content) {
|
|
127
|
+
if (typeof content === "string")
|
|
128
|
+
return [];
|
|
129
|
+
return content.filter((part) => part.type === "tool_call");
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=agent-loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-loop.js","sourceRoot":"","sources":["../src/agent-loop.ts"],"names":[],"mappings":"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"}
|
package/dist/agent.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { AgentEvent, AgentOptions, AgentResult } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Dual-nature result: async iterable for streaming events,
|
|
4
|
+
* thenable for awaiting the final AgentResult.
|
|
5
|
+
*
|
|
6
|
+
* ```ts
|
|
7
|
+
* // Stream events
|
|
8
|
+
* for await (const event of agent.prompt("hello")) { ... }
|
|
9
|
+
*
|
|
10
|
+
* // Or just await the result
|
|
11
|
+
* const result = await agent.prompt("hello");
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
export declare class AgentStream implements AsyncIterable<AgentEvent> {
|
|
15
|
+
private events;
|
|
16
|
+
private resultPromise;
|
|
17
|
+
private resolveResult;
|
|
18
|
+
private rejectResult;
|
|
19
|
+
constructor(generator: AsyncGenerator<AgentEvent, AgentResult>, onDone: () => void);
|
|
20
|
+
private pump;
|
|
21
|
+
[Symbol.asyncIterator](): AsyncIterator<AgentEvent>;
|
|
22
|
+
then<TResult1 = AgentResult, TResult2 = never>(onfulfilled?: ((value: AgentResult) => TResult1 | PromiseLike<TResult1>) | null, onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null): Promise<TResult1 | TResult2>;
|
|
23
|
+
private drainEvents;
|
|
24
|
+
}
|
|
25
|
+
export declare class Agent {
|
|
26
|
+
private messages;
|
|
27
|
+
private _running;
|
|
28
|
+
private options;
|
|
29
|
+
constructor(options: AgentOptions);
|
|
30
|
+
get running(): boolean;
|
|
31
|
+
prompt(content: string): AgentStream;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAIxE;;;;;;;;;;;GAWG;AACH,qBAAa,WAAY,YAAW,aAAa,CAAC,UAAU,CAAC;IAC3D,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,YAAY,CAAsB;gBAE9B,SAAS,EAAE,cAAc,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,IAAI;YASpE,IAAI;IAqBlB,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,UAAU,CAAC;IAInD,IAAI,CAAC,QAAQ,GAAG,WAAW,EAAE,QAAQ,GAAG,KAAK,EAC3C,WAAW,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,WAAW,KAAK,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,EAC/E,UAAU,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,KAAK,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,GAC1E,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAKjB,WAAW;CAK1B;AAID,qBAAa,KAAK;IAChB,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAe;gBAElB,OAAO,EAAE,YAAY;IAOjC,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW;CAarC"}
|
package/dist/agent.js
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { EventStream } from "@kenkaiiii/gg-ai";
|
|
2
|
+
import { agentLoop } from "./agent-loop.js";
|
|
3
|
+
// ── AgentStream ─────────────────────────────────────────────
|
|
4
|
+
/**
|
|
5
|
+
* Dual-nature result: async iterable for streaming events,
|
|
6
|
+
* thenable for awaiting the final AgentResult.
|
|
7
|
+
*
|
|
8
|
+
* ```ts
|
|
9
|
+
* // Stream events
|
|
10
|
+
* for await (const event of agent.prompt("hello")) { ... }
|
|
11
|
+
*
|
|
12
|
+
* // Or just await the result
|
|
13
|
+
* const result = await agent.prompt("hello");
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export class AgentStream {
|
|
17
|
+
events;
|
|
18
|
+
resultPromise;
|
|
19
|
+
resolveResult;
|
|
20
|
+
rejectResult;
|
|
21
|
+
constructor(generator, onDone) {
|
|
22
|
+
this.events = new EventStream();
|
|
23
|
+
this.resultPromise = new Promise((resolve, reject) => {
|
|
24
|
+
this.resolveResult = resolve;
|
|
25
|
+
this.rejectResult = reject;
|
|
26
|
+
});
|
|
27
|
+
this.pump(generator, onDone);
|
|
28
|
+
}
|
|
29
|
+
async pump(generator, onDone) {
|
|
30
|
+
try {
|
|
31
|
+
let next = await generator.next();
|
|
32
|
+
while (!next.done) {
|
|
33
|
+
this.events.push(next.value);
|
|
34
|
+
next = await generator.next();
|
|
35
|
+
}
|
|
36
|
+
this.events.close();
|
|
37
|
+
this.resolveResult(next.value);
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
41
|
+
this.events.abort(error);
|
|
42
|
+
this.rejectResult(error);
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
onDone();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
[Symbol.asyncIterator]() {
|
|
49
|
+
return this.events[Symbol.asyncIterator]();
|
|
50
|
+
}
|
|
51
|
+
then(onfulfilled, onrejected) {
|
|
52
|
+
this.drainEvents();
|
|
53
|
+
return this.resultPromise.then(onfulfilled, onrejected);
|
|
54
|
+
}
|
|
55
|
+
async drainEvents() {
|
|
56
|
+
for await (const _ of this.events) {
|
|
57
|
+
// consume silently
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// ── Agent ───────────────────────────────────────────────────
|
|
62
|
+
export class Agent {
|
|
63
|
+
messages = [];
|
|
64
|
+
_running = false;
|
|
65
|
+
options;
|
|
66
|
+
constructor(options) {
|
|
67
|
+
this.options = options;
|
|
68
|
+
if (options.system) {
|
|
69
|
+
this.messages.push({ role: "system", content: options.system });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
get running() {
|
|
73
|
+
return this._running;
|
|
74
|
+
}
|
|
75
|
+
prompt(content) {
|
|
76
|
+
if (this._running) {
|
|
77
|
+
throw new Error("Agent is already running");
|
|
78
|
+
}
|
|
79
|
+
this._running = true;
|
|
80
|
+
this.messages.push({ role: "user", content });
|
|
81
|
+
const generator = agentLoop(this.messages, this.options);
|
|
82
|
+
return new AgentStream(generator, () => {
|
|
83
|
+
this._running = false;
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
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";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
import type { Tool, AssistantMessage, StopReason, Usage, StreamOptions } from "@kenkaiiii/gg-ai";
|
|
3
|
+
export interface ToolContext {
|
|
4
|
+
signal: AbortSignal;
|
|
5
|
+
toolCallId: string;
|
|
6
|
+
}
|
|
7
|
+
export interface AgentTool<T extends z.ZodType = z.ZodType> extends Tool {
|
|
8
|
+
parameters: T;
|
|
9
|
+
execute: (args: z.infer<T>, context: ToolContext) => string | Promise<string>;
|
|
10
|
+
}
|
|
11
|
+
export interface AgentTextDeltaEvent {
|
|
12
|
+
type: "text_delta";
|
|
13
|
+
text: string;
|
|
14
|
+
}
|
|
15
|
+
export interface AgentThinkingDeltaEvent {
|
|
16
|
+
type: "thinking_delta";
|
|
17
|
+
text: string;
|
|
18
|
+
}
|
|
19
|
+
export interface AgentToolCallStartEvent {
|
|
20
|
+
type: "tool_call_start";
|
|
21
|
+
toolCallId: string;
|
|
22
|
+
name: string;
|
|
23
|
+
args: Record<string, unknown>;
|
|
24
|
+
}
|
|
25
|
+
export interface AgentToolCallEndEvent {
|
|
26
|
+
type: "tool_call_end";
|
|
27
|
+
toolCallId: string;
|
|
28
|
+
result: string;
|
|
29
|
+
isError: boolean;
|
|
30
|
+
durationMs: number;
|
|
31
|
+
}
|
|
32
|
+
export interface AgentTurnEndEvent {
|
|
33
|
+
type: "turn_end";
|
|
34
|
+
turn: number;
|
|
35
|
+
stopReason: StopReason;
|
|
36
|
+
usage: Usage;
|
|
37
|
+
}
|
|
38
|
+
export interface AgentDoneEvent {
|
|
39
|
+
type: "agent_done";
|
|
40
|
+
totalTurns: number;
|
|
41
|
+
totalUsage: Usage;
|
|
42
|
+
}
|
|
43
|
+
export interface AgentErrorEvent {
|
|
44
|
+
type: "error";
|
|
45
|
+
error: Error;
|
|
46
|
+
}
|
|
47
|
+
export type AgentEvent = AgentTextDeltaEvent | AgentThinkingDeltaEvent | AgentToolCallStartEvent | AgentToolCallEndEvent | AgentTurnEndEvent | AgentDoneEvent | AgentErrorEvent;
|
|
48
|
+
export interface AgentOptions {
|
|
49
|
+
provider: StreamOptions["provider"];
|
|
50
|
+
model: string;
|
|
51
|
+
system?: string;
|
|
52
|
+
tools?: AgentTool[];
|
|
53
|
+
maxTurns?: number;
|
|
54
|
+
maxTokens?: number;
|
|
55
|
+
temperature?: number;
|
|
56
|
+
thinking?: StreamOptions["thinking"];
|
|
57
|
+
apiKey?: string;
|
|
58
|
+
baseUrl?: string;
|
|
59
|
+
signal?: AbortSignal;
|
|
60
|
+
accountId?: string;
|
|
61
|
+
}
|
|
62
|
+
export interface AgentResult {
|
|
63
|
+
message: AssistantMessage;
|
|
64
|
+
totalTurns: number;
|
|
65
|
+
totalUsage: Usage;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kenkaiiii/gg-agent",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Agentic loop system with tool execution for LLMs",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/kenkaiiii/gg-coder",
|
|
10
|
+
"directory": "packages/gg-agent"
|
|
11
|
+
},
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"import": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist"
|
|
20
|
+
],
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"zod": "^4.3.6",
|
|
23
|
+
"@kenkaiiii/gg-ai": "0.0.1"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"typescript": "^5.9.3",
|
|
27
|
+
"vitest": "^4.0.18"
|
|
28
|
+
},
|
|
29
|
+
"publishConfig": {
|
|
30
|
+
"access": "public"
|
|
31
|
+
},
|
|
32
|
+
"scripts": {
|
|
33
|
+
"build": "tsc",
|
|
34
|
+
"check": "tsc --noEmit"
|
|
35
|
+
}
|
|
36
|
+
}
|