gencode-ai 0.1.0
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/.env.example +11 -0
- package/CLAUDE.md +70 -0
- package/LICENSE +21 -0
- package/README.md +117 -0
- package/dist/agent/agent.d.ts +84 -0
- package/dist/agent/agent.d.ts.map +1 -0
- package/dist/agent/agent.js +233 -0
- package/dist/agent/agent.js.map +1 -0
- package/dist/agent/index.d.ts +6 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +6 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/types.d.ts +47 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +5 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/cli/components/App.d.ts +14 -0
- package/dist/cli/components/App.d.ts.map +1 -0
- package/dist/cli/components/App.js +395 -0
- package/dist/cli/components/App.js.map +1 -0
- package/dist/cli/components/CommandSuggestions.d.ts +13 -0
- package/dist/cli/components/CommandSuggestions.d.ts.map +1 -0
- package/dist/cli/components/CommandSuggestions.js +32 -0
- package/dist/cli/components/CommandSuggestions.js.map +1 -0
- package/dist/cli/components/Header.d.ts +9 -0
- package/dist/cli/components/Header.d.ts.map +1 -0
- package/dist/cli/components/Header.js +13 -0
- package/dist/cli/components/Header.js.map +1 -0
- package/dist/cli/components/Input.d.ts +13 -0
- package/dist/cli/components/Input.d.ts.map +1 -0
- package/dist/cli/components/Input.js +27 -0
- package/dist/cli/components/Input.js.map +1 -0
- package/dist/cli/components/Logo.d.ts +2 -0
- package/dist/cli/components/Logo.d.ts.map +1 -0
- package/dist/cli/components/Logo.js +8 -0
- package/dist/cli/components/Logo.js.map +1 -0
- package/dist/cli/components/Messages.d.ts +37 -0
- package/dist/cli/components/Messages.d.ts.map +1 -0
- package/dist/cli/components/Messages.js +106 -0
- package/dist/cli/components/Messages.js.map +1 -0
- package/dist/cli/components/ModelSelector.d.ts +13 -0
- package/dist/cli/components/ModelSelector.d.ts.map +1 -0
- package/dist/cli/components/ModelSelector.js +72 -0
- package/dist/cli/components/ModelSelector.js.map +1 -0
- package/dist/cli/components/Spinner.d.ts +12 -0
- package/dist/cli/components/Spinner.d.ts.map +1 -0
- package/dist/cli/components/Spinner.js +45 -0
- package/dist/cli/components/Spinner.js.map +1 -0
- package/dist/cli/components/index.d.ts +12 -0
- package/dist/cli/components/index.d.ts.map +1 -0
- package/dist/cli/components/index.js +12 -0
- package/dist/cli/components/index.js.map +1 -0
- package/dist/cli/components/theme.d.ts +31 -0
- package/dist/cli/components/theme.d.ts.map +1 -0
- package/dist/cli/components/theme.js +36 -0
- package/dist/cli/components/theme.js.map +1 -0
- package/dist/cli/index-legacy.d.ts +7 -0
- package/dist/cli/index-legacy.d.ts.map +1 -0
- package/dist/cli/index-legacy.js +431 -0
- package/dist/cli/index-legacy.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +116 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/ink-cli.d.ts +7 -0
- package/dist/cli/ink-cli.d.ts.map +1 -0
- package/dist/cli/ink-cli.js +105 -0
- package/dist/cli/ink-cli.js.map +1 -0
- package/dist/cli/session-picker.d.ts +16 -0
- package/dist/cli/session-picker.d.ts.map +1 -0
- package/dist/cli/session-picker.js +280 -0
- package/dist/cli/session-picker.js.map +1 -0
- package/dist/cli/ui.d.ts +61 -0
- package/dist/cli/ui.d.ts.map +1 -0
- package/dist/cli/ui.js +364 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/config/index.d.ts +7 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +6 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/manager.d.ts +31 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/config/manager.js +65 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/config/types.d.ts +22 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +6 -0
- package/dist/config/types.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/index.d.ts +10 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +9 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/init.d.ts +20 -0
- package/dist/memory/init.d.ts.map +1 -0
- package/dist/memory/init.js +332 -0
- package/dist/memory/init.js.map +1 -0
- package/dist/memory/manager.d.ts +85 -0
- package/dist/memory/manager.d.ts.map +1 -0
- package/dist/memory/manager.js +234 -0
- package/dist/memory/manager.js.map +1 -0
- package/dist/memory/types.d.ts +74 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +6 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/permissions/index.d.ts +7 -0
- package/dist/permissions/index.d.ts.map +1 -0
- package/dist/permissions/index.js +6 -0
- package/dist/permissions/index.js.map +1 -0
- package/dist/permissions/manager.d.ts +32 -0
- package/dist/permissions/manager.d.ts.map +1 -0
- package/dist/permissions/manager.js +79 -0
- package/dist/permissions/manager.js.map +1 -0
- package/dist/permissions/types.d.ts +14 -0
- package/dist/permissions/types.d.ts.map +1 -0
- package/dist/permissions/types.js +17 -0
- package/dist/permissions/types.js.map +1 -0
- package/dist/providers/anthropic.d.ts +20 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +185 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/gemini.d.ts +21 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +241 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/index.d.ts +34 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +72 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai.d.ts +19 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +221 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/types.d.ts +125 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +6 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/session/index.d.ts +6 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +6 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/manager.d.ts +101 -0
- package/dist/session/manager.d.ts.map +1 -0
- package/dist/session/manager.js +295 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/session/types.d.ts +39 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/types.js +10 -0
- package/dist/session/types.js.map +1 -0
- package/dist/tools/builtin/bash.d.ts +7 -0
- package/dist/tools/builtin/bash.d.ts.map +1 -0
- package/dist/tools/builtin/bash.js +80 -0
- package/dist/tools/builtin/bash.js.map +1 -0
- package/dist/tools/builtin/edit.d.ts +7 -0
- package/dist/tools/builtin/edit.d.ts.map +1 -0
- package/dist/tools/builtin/edit.js +32 -0
- package/dist/tools/builtin/edit.js.map +1 -0
- package/dist/tools/builtin/glob.d.ts +7 -0
- package/dist/tools/builtin/glob.d.ts.map +1 -0
- package/dist/tools/builtin/glob.js +36 -0
- package/dist/tools/builtin/glob.js.map +1 -0
- package/dist/tools/builtin/grep.d.ts +7 -0
- package/dist/tools/builtin/grep.d.ts.map +1 -0
- package/dist/tools/builtin/grep.js +59 -0
- package/dist/tools/builtin/grep.js.map +1 -0
- package/dist/tools/builtin/read.d.ts +7 -0
- package/dist/tools/builtin/read.d.ts.map +1 -0
- package/dist/tools/builtin/read.js +29 -0
- package/dist/tools/builtin/read.js.map +1 -0
- package/dist/tools/builtin/write.d.ts +7 -0
- package/dist/tools/builtin/write.d.ts.map +1 -0
- package/dist/tools/builtin/write.js +24 -0
- package/dist/tools/builtin/write.js.map +1 -0
- package/dist/tools/index.d.ts +38 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +32 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/registry.d.ts +22 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +71 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/types.d.ts +62 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +126 -0
- package/dist/tools/types.js.map +1 -0
- package/docs/README.md +16 -0
- package/docs/proposals/0001-web-fetch-tool.md +293 -0
- package/docs/proposals/0002-web-search-tool.md +306 -0
- package/docs/proposals/0003-task-subagents.md +333 -0
- package/docs/proposals/0004-plan-mode.md +338 -0
- package/docs/proposals/0005-todo-system.md +299 -0
- package/docs/proposals/0006-memory-system.md +539 -0
- package/docs/proposals/0007-context-management.md +429 -0
- package/docs/proposals/0008-checkpointing.md +327 -0
- package/docs/proposals/0009-hooks-system.md +343 -0
- package/docs/proposals/0010-mcp-integration.md +382 -0
- package/docs/proposals/0011-custom-commands.md +374 -0
- package/docs/proposals/0012-ask-user-question.md +317 -0
- package/docs/proposals/0013-multi-edit-tool.md +345 -0
- package/docs/proposals/0014-lsp-tool.md +478 -0
- package/docs/proposals/0015-ls-tool.md +407 -0
- package/docs/proposals/0016-kill-shell-tool.md +455 -0
- package/docs/proposals/0017-background-tasks.md +489 -0
- package/docs/proposals/0018-parallel-tool-execution.md +415 -0
- package/docs/proposals/0019-session-enhancements.md +462 -0
- package/docs/proposals/0020-session-summarization.md +447 -0
- package/docs/proposals/0021-skills-system.md +409 -0
- package/docs/proposals/0022-plugin-system.md +467 -0
- package/docs/proposals/0023-permission-enhancements.md +470 -0
- package/docs/proposals/0024-keyboard-shortcuts.md +443 -0
- package/docs/proposals/0025-cost-tracking.md +447 -0
- package/docs/proposals/0026-git-integration.md +475 -0
- package/docs/proposals/0027-enhanced-read-tool.md +514 -0
- package/docs/proposals/0028-enhanced-bash-tool.md +511 -0
- package/docs/proposals/0029-notebook-edit-tool.md +413 -0
- package/docs/proposals/0030-plugin-marketplace.md +360 -0
- package/docs/proposals/0031-command-suggestions.md +295 -0
- package/docs/proposals/0032-ide-integrations.md +328 -0
- package/docs/proposals/0033-enterprise-deployment.md +221 -0
- package/docs/proposals/0034-sandboxing.md +273 -0
- package/docs/proposals/0035-auto-updater.md +311 -0
- package/docs/proposals/0036-enhanced-glob-tool.md +267 -0
- package/docs/proposals/0037-enhanced-grep-tool.md +360 -0
- package/docs/proposals/0038-interactive-cli-ui.md +373 -0
- package/docs/proposals/0039-streaming-enhancements.md +359 -0
- package/docs/proposals/0040-multi-provider-enhancements.md +369 -0
- package/docs/proposals/README.md +84 -0
- package/docs/proposals/TEMPLATE.md +57 -0
- package/docs/proposals/research/claude-code-research.md +307 -0
- package/examples/agent-demo.ts +115 -0
- package/examples/basic.ts +166 -0
- package/package.json +50 -0
- package/src/agent/agent.ts +276 -0
- package/src/agent/index.ts +6 -0
- package/src/agent/types.ts +62 -0
- package/src/cli/components/App.tsx +565 -0
- package/src/cli/components/CommandSuggestions.tsx +58 -0
- package/src/cli/components/Header.tsx +36 -0
- package/src/cli/components/Input.tsx +60 -0
- package/src/cli/components/Logo.tsx +16 -0
- package/src/cli/components/Messages.tsx +210 -0
- package/src/cli/components/ModelSelector.tsx +135 -0
- package/src/cli/components/Spinner.tsx +72 -0
- package/src/cli/components/index.ts +21 -0
- package/src/cli/components/theme.ts +36 -0
- package/src/cli/index.tsx +136 -0
- package/src/config/index.ts +7 -0
- package/src/config/manager.ts +77 -0
- package/src/config/types.ts +25 -0
- package/src/index.ts +86 -0
- package/src/permissions/index.ts +7 -0
- package/src/permissions/manager.ts +97 -0
- package/src/permissions/types.ts +29 -0
- package/src/providers/anthropic.ts +224 -0
- package/src/providers/gemini.ts +295 -0
- package/src/providers/index.ts +97 -0
- package/src/providers/openai.ts +261 -0
- package/src/providers/types.ts +181 -0
- package/src/session/index.ts +6 -0
- package/src/session/manager.ts +354 -0
- package/src/session/types.ts +49 -0
- package/src/tools/builtin/bash.ts +92 -0
- package/src/tools/builtin/edit.ts +37 -0
- package/src/tools/builtin/glob.ts +42 -0
- package/src/tools/builtin/grep.ts +67 -0
- package/src/tools/builtin/read.ts +34 -0
- package/src/tools/builtin/write.ts +27 -0
- package/src/tools/index.ts +36 -0
- package/src/tools/registry.ts +83 -0
- package/src/tools/types.ts +172 -0
- package/tsconfig.json +21 -0
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent - Core agent implementation with tool loop and session support
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { LLMProvider, Message, ToolResultContent } from '../providers/types.js';
|
|
6
|
+
import { createProvider } from '../providers/index.js';
|
|
7
|
+
import { ToolRegistry, createDefaultRegistry } from '../tools/index.js';
|
|
8
|
+
import { PermissionManager } from '../permissions/index.js';
|
|
9
|
+
import { SessionManager } from '../session/index.js';
|
|
10
|
+
import type { AgentConfig, AgentEvent } from './types.js';
|
|
11
|
+
|
|
12
|
+
const DEFAULT_SYSTEM_PROMPT = `You are a helpful AI assistant with access to tools for reading, writing, and executing code.
|
|
13
|
+
|
|
14
|
+
When using tools:
|
|
15
|
+
- Use Read to view file contents before editing
|
|
16
|
+
- Use Glob/Grep to find files
|
|
17
|
+
- Use Edit for precise changes (old_string must be unique)
|
|
18
|
+
- Use Write for new files or full rewrites
|
|
19
|
+
- Use Bash for commands, git operations, etc.
|
|
20
|
+
|
|
21
|
+
Be concise and focus on completing the user's task.`;
|
|
22
|
+
|
|
23
|
+
export class Agent {
|
|
24
|
+
private provider: LLMProvider;
|
|
25
|
+
private registry: ToolRegistry;
|
|
26
|
+
private permissions: PermissionManager;
|
|
27
|
+
private sessionManager: SessionManager;
|
|
28
|
+
private config: AgentConfig;
|
|
29
|
+
private messages: Message[] = [];
|
|
30
|
+
private sessionId: string | null = null;
|
|
31
|
+
|
|
32
|
+
constructor(config: AgentConfig) {
|
|
33
|
+
this.config = {
|
|
34
|
+
maxTurns: 10,
|
|
35
|
+
cwd: process.cwd(),
|
|
36
|
+
...config,
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
this.provider = createProvider({ provider: config.provider });
|
|
40
|
+
this.registry = createDefaultRegistry();
|
|
41
|
+
this.permissions = new PermissionManager(config.permissions);
|
|
42
|
+
this.sessionManager = new SessionManager();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Set permission confirmation callback
|
|
47
|
+
*/
|
|
48
|
+
setConfirmCallback(callback: (tool: string, input: unknown) => Promise<boolean>): void {
|
|
49
|
+
this.permissions.setConfirmCallback(callback);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Get current session ID
|
|
54
|
+
*/
|
|
55
|
+
getSessionId(): string | null {
|
|
56
|
+
return this.sessionId;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Get session manager for external access
|
|
61
|
+
*/
|
|
62
|
+
getSessionManager(): SessionManager {
|
|
63
|
+
return this.sessionManager;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Set the model to use
|
|
68
|
+
*/
|
|
69
|
+
setModel(model: string): void {
|
|
70
|
+
this.config.model = model;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Get current model
|
|
75
|
+
*/
|
|
76
|
+
getModel(): string {
|
|
77
|
+
return this.config.model;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* List available models from the provider API
|
|
82
|
+
*/
|
|
83
|
+
async listModels(): Promise<{ id: string; name: string }[]> {
|
|
84
|
+
return this.provider.listModels();
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Start a new session
|
|
89
|
+
*/
|
|
90
|
+
async startSession(title?: string): Promise<string> {
|
|
91
|
+
const session = await this.sessionManager.create({
|
|
92
|
+
provider: this.config.provider,
|
|
93
|
+
model: this.config.model,
|
|
94
|
+
cwd: this.config.cwd,
|
|
95
|
+
title,
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
this.sessionId = session.metadata.id;
|
|
99
|
+
this.messages = [];
|
|
100
|
+
|
|
101
|
+
return this.sessionId;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Resume an existing session
|
|
106
|
+
*/
|
|
107
|
+
async resumeSession(sessionId: string): Promise<boolean> {
|
|
108
|
+
const session = await this.sessionManager.load(sessionId);
|
|
109
|
+
if (!session) {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
this.sessionId = session.metadata.id;
|
|
114
|
+
this.messages = session.messages;
|
|
115
|
+
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Resume the most recent session
|
|
121
|
+
*/
|
|
122
|
+
async resumeLatest(): Promise<boolean> {
|
|
123
|
+
const session = await this.sessionManager.resumeLatest();
|
|
124
|
+
if (!session) {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
this.sessionId = session.metadata.id;
|
|
129
|
+
this.messages = session.messages;
|
|
130
|
+
|
|
131
|
+
return true;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Fork current session
|
|
136
|
+
*/
|
|
137
|
+
async forkSession(title?: string): Promise<string | null> {
|
|
138
|
+
if (!this.sessionId) {
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const forked = await this.sessionManager.fork(this.sessionId, title);
|
|
143
|
+
this.sessionId = forked.metadata.id;
|
|
144
|
+
|
|
145
|
+
return this.sessionId;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* List all sessions
|
|
150
|
+
*/
|
|
151
|
+
async listSessions() {
|
|
152
|
+
return this.sessionManager.list();
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Delete a session
|
|
157
|
+
*/
|
|
158
|
+
async deleteSession(sessionId: string): Promise<boolean> {
|
|
159
|
+
return this.sessionManager.delete(sessionId);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Save current session
|
|
164
|
+
*/
|
|
165
|
+
async saveSession(): Promise<void> {
|
|
166
|
+
const current = this.sessionManager.getCurrent();
|
|
167
|
+
if (current) {
|
|
168
|
+
current.messages = this.messages;
|
|
169
|
+
await this.sessionManager.save(current);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Run a single query through the agent
|
|
175
|
+
*/
|
|
176
|
+
async *run(prompt: string): AsyncGenerator<AgentEvent, void, unknown> {
|
|
177
|
+
// Auto-create session if none exists
|
|
178
|
+
if (!this.sessionId) {
|
|
179
|
+
await this.startSession();
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Add user message
|
|
183
|
+
const userMessage: Message = { role: 'user', content: prompt };
|
|
184
|
+
this.messages.push(userMessage);
|
|
185
|
+
await this.sessionManager.addMessage(userMessage);
|
|
186
|
+
|
|
187
|
+
let turns = 0;
|
|
188
|
+
const maxTurns = this.config.maxTurns ?? 10;
|
|
189
|
+
|
|
190
|
+
while (turns < maxTurns) {
|
|
191
|
+
turns++;
|
|
192
|
+
|
|
193
|
+
// Get tool definitions
|
|
194
|
+
const toolDefs = this.registry.getDefinitions(this.config.tools);
|
|
195
|
+
|
|
196
|
+
// Call LLM
|
|
197
|
+
let response;
|
|
198
|
+
try {
|
|
199
|
+
response = await this.provider.complete({
|
|
200
|
+
model: this.config.model,
|
|
201
|
+
messages: this.messages,
|
|
202
|
+
tools: toolDefs,
|
|
203
|
+
systemPrompt: this.config.systemPrompt ?? DEFAULT_SYSTEM_PROMPT,
|
|
204
|
+
maxTokens: 4096,
|
|
205
|
+
});
|
|
206
|
+
} catch (error) {
|
|
207
|
+
yield { type: 'error', error: error as Error };
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// Process response content
|
|
212
|
+
const toolCalls: Array<{ id: string; name: string; input: Record<string, unknown> }> = [];
|
|
213
|
+
let textContent = '';
|
|
214
|
+
|
|
215
|
+
for (const content of response.content) {
|
|
216
|
+
if (content.type === 'text') {
|
|
217
|
+
textContent += content.text;
|
|
218
|
+
yield { type: 'text', text: content.text };
|
|
219
|
+
} else if (content.type === 'tool_use') {
|
|
220
|
+
toolCalls.push({ id: content.id, name: content.name, input: content.input });
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// Add assistant message and check if done
|
|
225
|
+
this.messages.push({ role: 'assistant', content: response.content });
|
|
226
|
+
await this.sessionManager.addMessage({ role: 'assistant', content: response.content });
|
|
227
|
+
|
|
228
|
+
if (response.stopReason !== 'tool_use' || toolCalls.length === 0) {
|
|
229
|
+
yield { type: 'done', text: textContent };
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Execute tool calls
|
|
234
|
+
const toolResults: ToolResultContent[] = [];
|
|
235
|
+
const cwd = this.config.cwd ?? process.cwd();
|
|
236
|
+
|
|
237
|
+
for (const call of toolCalls) {
|
|
238
|
+
yield { type: 'tool_start', id: call.id, name: call.name, input: call.input };
|
|
239
|
+
|
|
240
|
+
const allowed = await this.permissions.checkPermission(call.name, call.input);
|
|
241
|
+
const result = allowed
|
|
242
|
+
? await this.registry.execute(call.name, call.input, { cwd })
|
|
243
|
+
: { success: false, output: '', error: 'Permission denied by user' };
|
|
244
|
+
|
|
245
|
+
yield { type: 'tool_result', id: call.id, name: call.name, result };
|
|
246
|
+
toolResults.push({
|
|
247
|
+
type: 'tool_result',
|
|
248
|
+
toolUseId: call.id,
|
|
249
|
+
content: result.success ? result.output : (result.error ?? 'Unknown error'),
|
|
250
|
+
isError: !result.success,
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// Add tool results as user message
|
|
255
|
+
this.messages.push({ role: 'user', content: toolResults });
|
|
256
|
+
await this.sessionManager.addMessage({ role: 'user', content: toolResults });
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
yield { type: 'error', error: new Error(`Max turns (${maxTurns}) exceeded`) };
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Clear conversation history
|
|
264
|
+
*/
|
|
265
|
+
clearHistory(): void {
|
|
266
|
+
this.messages = [];
|
|
267
|
+
this.sessionManager.clearMessages();
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Get conversation history
|
|
272
|
+
*/
|
|
273
|
+
getHistory(): Message[] {
|
|
274
|
+
return [...this.messages];
|
|
275
|
+
}
|
|
276
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Types
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { PermissionConfig } from '../permissions/types.js';
|
|
6
|
+
|
|
7
|
+
export interface AgentConfig {
|
|
8
|
+
provider: 'openai' | 'anthropic' | 'gemini';
|
|
9
|
+
model: string;
|
|
10
|
+
systemPrompt?: string;
|
|
11
|
+
tools?: string[];
|
|
12
|
+
cwd?: string;
|
|
13
|
+
maxTurns?: number;
|
|
14
|
+
permissions?: Partial<PermissionConfig>;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// Agent Events
|
|
18
|
+
export interface AgentEventText {
|
|
19
|
+
type: 'text';
|
|
20
|
+
text: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface AgentEventToolStart {
|
|
24
|
+
type: 'tool_start';
|
|
25
|
+
id: string;
|
|
26
|
+
name: string;
|
|
27
|
+
input: unknown;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface AgentEventToolResult {
|
|
31
|
+
type: 'tool_result';
|
|
32
|
+
id: string;
|
|
33
|
+
name: string;
|
|
34
|
+
result: {
|
|
35
|
+
success: boolean;
|
|
36
|
+
output: string;
|
|
37
|
+
error?: string;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface AgentEventThinking {
|
|
42
|
+
type: 'thinking';
|
|
43
|
+
text: string;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface AgentEventError {
|
|
47
|
+
type: 'error';
|
|
48
|
+
error: Error;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface AgentEventDone {
|
|
52
|
+
type: 'done';
|
|
53
|
+
text: string;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export type AgentEvent =
|
|
57
|
+
| AgentEventText
|
|
58
|
+
| AgentEventToolStart
|
|
59
|
+
| AgentEventToolResult
|
|
60
|
+
| AgentEventThinking
|
|
61
|
+
| AgentEventError
|
|
62
|
+
| AgentEventDone;
|