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.
Files changed (274) hide show
  1. package/.env.example +11 -0
  2. package/CLAUDE.md +70 -0
  3. package/LICENSE +21 -0
  4. package/README.md +117 -0
  5. package/dist/agent/agent.d.ts +84 -0
  6. package/dist/agent/agent.d.ts.map +1 -0
  7. package/dist/agent/agent.js +233 -0
  8. package/dist/agent/agent.js.map +1 -0
  9. package/dist/agent/index.d.ts +6 -0
  10. package/dist/agent/index.d.ts.map +1 -0
  11. package/dist/agent/index.js +6 -0
  12. package/dist/agent/index.js.map +1 -0
  13. package/dist/agent/types.d.ts +47 -0
  14. package/dist/agent/types.d.ts.map +1 -0
  15. package/dist/agent/types.js +5 -0
  16. package/dist/agent/types.js.map +1 -0
  17. package/dist/cli/components/App.d.ts +14 -0
  18. package/dist/cli/components/App.d.ts.map +1 -0
  19. package/dist/cli/components/App.js +395 -0
  20. package/dist/cli/components/App.js.map +1 -0
  21. package/dist/cli/components/CommandSuggestions.d.ts +13 -0
  22. package/dist/cli/components/CommandSuggestions.d.ts.map +1 -0
  23. package/dist/cli/components/CommandSuggestions.js +32 -0
  24. package/dist/cli/components/CommandSuggestions.js.map +1 -0
  25. package/dist/cli/components/Header.d.ts +9 -0
  26. package/dist/cli/components/Header.d.ts.map +1 -0
  27. package/dist/cli/components/Header.js +13 -0
  28. package/dist/cli/components/Header.js.map +1 -0
  29. package/dist/cli/components/Input.d.ts +13 -0
  30. package/dist/cli/components/Input.d.ts.map +1 -0
  31. package/dist/cli/components/Input.js +27 -0
  32. package/dist/cli/components/Input.js.map +1 -0
  33. package/dist/cli/components/Logo.d.ts +2 -0
  34. package/dist/cli/components/Logo.d.ts.map +1 -0
  35. package/dist/cli/components/Logo.js +8 -0
  36. package/dist/cli/components/Logo.js.map +1 -0
  37. package/dist/cli/components/Messages.d.ts +37 -0
  38. package/dist/cli/components/Messages.d.ts.map +1 -0
  39. package/dist/cli/components/Messages.js +106 -0
  40. package/dist/cli/components/Messages.js.map +1 -0
  41. package/dist/cli/components/ModelSelector.d.ts +13 -0
  42. package/dist/cli/components/ModelSelector.d.ts.map +1 -0
  43. package/dist/cli/components/ModelSelector.js +72 -0
  44. package/dist/cli/components/ModelSelector.js.map +1 -0
  45. package/dist/cli/components/Spinner.d.ts +12 -0
  46. package/dist/cli/components/Spinner.d.ts.map +1 -0
  47. package/dist/cli/components/Spinner.js +45 -0
  48. package/dist/cli/components/Spinner.js.map +1 -0
  49. package/dist/cli/components/index.d.ts +12 -0
  50. package/dist/cli/components/index.d.ts.map +1 -0
  51. package/dist/cli/components/index.js +12 -0
  52. package/dist/cli/components/index.js.map +1 -0
  53. package/dist/cli/components/theme.d.ts +31 -0
  54. package/dist/cli/components/theme.d.ts.map +1 -0
  55. package/dist/cli/components/theme.js +36 -0
  56. package/dist/cli/components/theme.js.map +1 -0
  57. package/dist/cli/index-legacy.d.ts +7 -0
  58. package/dist/cli/index-legacy.d.ts.map +1 -0
  59. package/dist/cli/index-legacy.js +431 -0
  60. package/dist/cli/index-legacy.js.map +1 -0
  61. package/dist/cli/index.d.ts +7 -0
  62. package/dist/cli/index.d.ts.map +1 -0
  63. package/dist/cli/index.js +116 -0
  64. package/dist/cli/index.js.map +1 -0
  65. package/dist/cli/ink-cli.d.ts +7 -0
  66. package/dist/cli/ink-cli.d.ts.map +1 -0
  67. package/dist/cli/ink-cli.js +105 -0
  68. package/dist/cli/ink-cli.js.map +1 -0
  69. package/dist/cli/session-picker.d.ts +16 -0
  70. package/dist/cli/session-picker.d.ts.map +1 -0
  71. package/dist/cli/session-picker.js +280 -0
  72. package/dist/cli/session-picker.js.map +1 -0
  73. package/dist/cli/ui.d.ts +61 -0
  74. package/dist/cli/ui.d.ts.map +1 -0
  75. package/dist/cli/ui.js +364 -0
  76. package/dist/cli/ui.js.map +1 -0
  77. package/dist/config/index.d.ts +7 -0
  78. package/dist/config/index.d.ts.map +1 -0
  79. package/dist/config/index.js +6 -0
  80. package/dist/config/index.js.map +1 -0
  81. package/dist/config/manager.d.ts +31 -0
  82. package/dist/config/manager.d.ts.map +1 -0
  83. package/dist/config/manager.js +65 -0
  84. package/dist/config/manager.js.map +1 -0
  85. package/dist/config/types.d.ts +22 -0
  86. package/dist/config/types.d.ts.map +1 -0
  87. package/dist/config/types.js +6 -0
  88. package/dist/config/types.js.map +1 -0
  89. package/dist/index.d.ts +12 -0
  90. package/dist/index.d.ts.map +1 -0
  91. package/dist/index.js +21 -0
  92. package/dist/index.js.map +1 -0
  93. package/dist/memory/index.d.ts +10 -0
  94. package/dist/memory/index.d.ts.map +1 -0
  95. package/dist/memory/index.js +9 -0
  96. package/dist/memory/index.js.map +1 -0
  97. package/dist/memory/init.d.ts +20 -0
  98. package/dist/memory/init.d.ts.map +1 -0
  99. package/dist/memory/init.js +332 -0
  100. package/dist/memory/init.js.map +1 -0
  101. package/dist/memory/manager.d.ts +85 -0
  102. package/dist/memory/manager.d.ts.map +1 -0
  103. package/dist/memory/manager.js +234 -0
  104. package/dist/memory/manager.js.map +1 -0
  105. package/dist/memory/types.d.ts +74 -0
  106. package/dist/memory/types.d.ts.map +1 -0
  107. package/dist/memory/types.js +6 -0
  108. package/dist/memory/types.js.map +1 -0
  109. package/dist/permissions/index.d.ts +7 -0
  110. package/dist/permissions/index.d.ts.map +1 -0
  111. package/dist/permissions/index.js +6 -0
  112. package/dist/permissions/index.js.map +1 -0
  113. package/dist/permissions/manager.d.ts +32 -0
  114. package/dist/permissions/manager.d.ts.map +1 -0
  115. package/dist/permissions/manager.js +79 -0
  116. package/dist/permissions/manager.js.map +1 -0
  117. package/dist/permissions/types.d.ts +14 -0
  118. package/dist/permissions/types.d.ts.map +1 -0
  119. package/dist/permissions/types.js +17 -0
  120. package/dist/permissions/types.js.map +1 -0
  121. package/dist/providers/anthropic.d.ts +20 -0
  122. package/dist/providers/anthropic.d.ts.map +1 -0
  123. package/dist/providers/anthropic.js +185 -0
  124. package/dist/providers/anthropic.js.map +1 -0
  125. package/dist/providers/gemini.d.ts +21 -0
  126. package/dist/providers/gemini.d.ts.map +1 -0
  127. package/dist/providers/gemini.js +241 -0
  128. package/dist/providers/gemini.js.map +1 -0
  129. package/dist/providers/index.d.ts +34 -0
  130. package/dist/providers/index.d.ts.map +1 -0
  131. package/dist/providers/index.js +72 -0
  132. package/dist/providers/index.js.map +1 -0
  133. package/dist/providers/openai.d.ts +19 -0
  134. package/dist/providers/openai.d.ts.map +1 -0
  135. package/dist/providers/openai.js +221 -0
  136. package/dist/providers/openai.js.map +1 -0
  137. package/dist/providers/types.d.ts +125 -0
  138. package/dist/providers/types.d.ts.map +1 -0
  139. package/dist/providers/types.js +6 -0
  140. package/dist/providers/types.js.map +1 -0
  141. package/dist/session/index.d.ts +6 -0
  142. package/dist/session/index.d.ts.map +1 -0
  143. package/dist/session/index.js +6 -0
  144. package/dist/session/index.js.map +1 -0
  145. package/dist/session/manager.d.ts +101 -0
  146. package/dist/session/manager.d.ts.map +1 -0
  147. package/dist/session/manager.js +295 -0
  148. package/dist/session/manager.js.map +1 -0
  149. package/dist/session/types.d.ts +39 -0
  150. package/dist/session/types.d.ts.map +1 -0
  151. package/dist/session/types.js +10 -0
  152. package/dist/session/types.js.map +1 -0
  153. package/dist/tools/builtin/bash.d.ts +7 -0
  154. package/dist/tools/builtin/bash.d.ts.map +1 -0
  155. package/dist/tools/builtin/bash.js +80 -0
  156. package/dist/tools/builtin/bash.js.map +1 -0
  157. package/dist/tools/builtin/edit.d.ts +7 -0
  158. package/dist/tools/builtin/edit.d.ts.map +1 -0
  159. package/dist/tools/builtin/edit.js +32 -0
  160. package/dist/tools/builtin/edit.js.map +1 -0
  161. package/dist/tools/builtin/glob.d.ts +7 -0
  162. package/dist/tools/builtin/glob.d.ts.map +1 -0
  163. package/dist/tools/builtin/glob.js +36 -0
  164. package/dist/tools/builtin/glob.js.map +1 -0
  165. package/dist/tools/builtin/grep.d.ts +7 -0
  166. package/dist/tools/builtin/grep.d.ts.map +1 -0
  167. package/dist/tools/builtin/grep.js +59 -0
  168. package/dist/tools/builtin/grep.js.map +1 -0
  169. package/dist/tools/builtin/read.d.ts +7 -0
  170. package/dist/tools/builtin/read.d.ts.map +1 -0
  171. package/dist/tools/builtin/read.js +29 -0
  172. package/dist/tools/builtin/read.js.map +1 -0
  173. package/dist/tools/builtin/write.d.ts +7 -0
  174. package/dist/tools/builtin/write.d.ts.map +1 -0
  175. package/dist/tools/builtin/write.js +24 -0
  176. package/dist/tools/builtin/write.js.map +1 -0
  177. package/dist/tools/index.d.ts +38 -0
  178. package/dist/tools/index.d.ts.map +1 -0
  179. package/dist/tools/index.js +32 -0
  180. package/dist/tools/index.js.map +1 -0
  181. package/dist/tools/registry.d.ts +22 -0
  182. package/dist/tools/registry.d.ts.map +1 -0
  183. package/dist/tools/registry.js +71 -0
  184. package/dist/tools/registry.js.map +1 -0
  185. package/dist/tools/types.d.ts +62 -0
  186. package/dist/tools/types.d.ts.map +1 -0
  187. package/dist/tools/types.js +126 -0
  188. package/dist/tools/types.js.map +1 -0
  189. package/docs/README.md +16 -0
  190. package/docs/proposals/0001-web-fetch-tool.md +293 -0
  191. package/docs/proposals/0002-web-search-tool.md +306 -0
  192. package/docs/proposals/0003-task-subagents.md +333 -0
  193. package/docs/proposals/0004-plan-mode.md +338 -0
  194. package/docs/proposals/0005-todo-system.md +299 -0
  195. package/docs/proposals/0006-memory-system.md +539 -0
  196. package/docs/proposals/0007-context-management.md +429 -0
  197. package/docs/proposals/0008-checkpointing.md +327 -0
  198. package/docs/proposals/0009-hooks-system.md +343 -0
  199. package/docs/proposals/0010-mcp-integration.md +382 -0
  200. package/docs/proposals/0011-custom-commands.md +374 -0
  201. package/docs/proposals/0012-ask-user-question.md +317 -0
  202. package/docs/proposals/0013-multi-edit-tool.md +345 -0
  203. package/docs/proposals/0014-lsp-tool.md +478 -0
  204. package/docs/proposals/0015-ls-tool.md +407 -0
  205. package/docs/proposals/0016-kill-shell-tool.md +455 -0
  206. package/docs/proposals/0017-background-tasks.md +489 -0
  207. package/docs/proposals/0018-parallel-tool-execution.md +415 -0
  208. package/docs/proposals/0019-session-enhancements.md +462 -0
  209. package/docs/proposals/0020-session-summarization.md +447 -0
  210. package/docs/proposals/0021-skills-system.md +409 -0
  211. package/docs/proposals/0022-plugin-system.md +467 -0
  212. package/docs/proposals/0023-permission-enhancements.md +470 -0
  213. package/docs/proposals/0024-keyboard-shortcuts.md +443 -0
  214. package/docs/proposals/0025-cost-tracking.md +447 -0
  215. package/docs/proposals/0026-git-integration.md +475 -0
  216. package/docs/proposals/0027-enhanced-read-tool.md +514 -0
  217. package/docs/proposals/0028-enhanced-bash-tool.md +511 -0
  218. package/docs/proposals/0029-notebook-edit-tool.md +413 -0
  219. package/docs/proposals/0030-plugin-marketplace.md +360 -0
  220. package/docs/proposals/0031-command-suggestions.md +295 -0
  221. package/docs/proposals/0032-ide-integrations.md +328 -0
  222. package/docs/proposals/0033-enterprise-deployment.md +221 -0
  223. package/docs/proposals/0034-sandboxing.md +273 -0
  224. package/docs/proposals/0035-auto-updater.md +311 -0
  225. package/docs/proposals/0036-enhanced-glob-tool.md +267 -0
  226. package/docs/proposals/0037-enhanced-grep-tool.md +360 -0
  227. package/docs/proposals/0038-interactive-cli-ui.md +373 -0
  228. package/docs/proposals/0039-streaming-enhancements.md +359 -0
  229. package/docs/proposals/0040-multi-provider-enhancements.md +369 -0
  230. package/docs/proposals/README.md +84 -0
  231. package/docs/proposals/TEMPLATE.md +57 -0
  232. package/docs/proposals/research/claude-code-research.md +307 -0
  233. package/examples/agent-demo.ts +115 -0
  234. package/examples/basic.ts +166 -0
  235. package/package.json +50 -0
  236. package/src/agent/agent.ts +276 -0
  237. package/src/agent/index.ts +6 -0
  238. package/src/agent/types.ts +62 -0
  239. package/src/cli/components/App.tsx +565 -0
  240. package/src/cli/components/CommandSuggestions.tsx +58 -0
  241. package/src/cli/components/Header.tsx +36 -0
  242. package/src/cli/components/Input.tsx +60 -0
  243. package/src/cli/components/Logo.tsx +16 -0
  244. package/src/cli/components/Messages.tsx +210 -0
  245. package/src/cli/components/ModelSelector.tsx +135 -0
  246. package/src/cli/components/Spinner.tsx +72 -0
  247. package/src/cli/components/index.ts +21 -0
  248. package/src/cli/components/theme.ts +36 -0
  249. package/src/cli/index.tsx +136 -0
  250. package/src/config/index.ts +7 -0
  251. package/src/config/manager.ts +77 -0
  252. package/src/config/types.ts +25 -0
  253. package/src/index.ts +86 -0
  254. package/src/permissions/index.ts +7 -0
  255. package/src/permissions/manager.ts +97 -0
  256. package/src/permissions/types.ts +29 -0
  257. package/src/providers/anthropic.ts +224 -0
  258. package/src/providers/gemini.ts +295 -0
  259. package/src/providers/index.ts +97 -0
  260. package/src/providers/openai.ts +261 -0
  261. package/src/providers/types.ts +181 -0
  262. package/src/session/index.ts +6 -0
  263. package/src/session/manager.ts +354 -0
  264. package/src/session/types.ts +49 -0
  265. package/src/tools/builtin/bash.ts +92 -0
  266. package/src/tools/builtin/edit.ts +37 -0
  267. package/src/tools/builtin/glob.ts +42 -0
  268. package/src/tools/builtin/grep.ts +67 -0
  269. package/src/tools/builtin/read.ts +34 -0
  270. package/src/tools/builtin/write.ts +27 -0
  271. package/src/tools/index.ts +36 -0
  272. package/src/tools/registry.ts +83 -0
  273. package/src/tools/types.ts +172 -0
  274. 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,6 @@
1
+ /**
2
+ * Agent System
3
+ */
4
+
5
+ export * from './types.js';
6
+ export { Agent } from './agent.js';
@@ -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;