@researchcomputer/agents-sdk 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/README.md +60 -0
  2. package/dist/agents/messages.d.ts +29 -0
  3. package/dist/agents/messages.d.ts.map +1 -0
  4. package/dist/agents/messages.js +56 -0
  5. package/dist/agents/messages.js.map +1 -0
  6. package/dist/agents/messages.test.d.ts +2 -0
  7. package/dist/agents/messages.test.d.ts.map +1 -0
  8. package/dist/agents/messages.test.js +80 -0
  9. package/dist/agents/messages.test.js.map +1 -0
  10. package/dist/agents/subagent.d.ts +16 -0
  11. package/dist/agents/subagent.d.ts.map +1 -0
  12. package/dist/agents/subagent.js +46 -0
  13. package/dist/agents/subagent.js.map +1 -0
  14. package/dist/agents/swarm.d.ts +22 -0
  15. package/dist/agents/swarm.d.ts.map +1 -0
  16. package/dist/agents/swarm.js +140 -0
  17. package/dist/agents/swarm.js.map +1 -0
  18. package/dist/agents/tools.d.ts +6 -0
  19. package/dist/agents/tools.d.ts.map +1 -0
  20. package/dist/agents/tools.js +71 -0
  21. package/dist/agents/tools.js.map +1 -0
  22. package/dist/agents/tools.test.d.ts +2 -0
  23. package/dist/agents/tools.test.d.ts.map +1 -0
  24. package/dist/agents/tools.test.js +70 -0
  25. package/dist/agents/tools.test.js.map +1 -0
  26. package/dist/bridge/config.d.ts +21 -0
  27. package/dist/bridge/config.d.ts.map +1 -0
  28. package/dist/bridge/config.js +35 -0
  29. package/dist/bridge/config.js.map +1 -0
  30. package/dist/bridge/config.test.d.ts +2 -0
  31. package/dist/bridge/config.test.d.ts.map +1 -0
  32. package/dist/bridge/config.test.js +79 -0
  33. package/dist/bridge/config.test.js.map +1 -0
  34. package/dist/bridge/server.d.ts +3 -0
  35. package/dist/bridge/server.d.ts.map +1 -0
  36. package/dist/bridge/server.js +316 -0
  37. package/dist/bridge/server.js.map +1 -0
  38. package/dist/context/compression.d.ts +27 -0
  39. package/dist/context/compression.d.ts.map +1 -0
  40. package/dist/context/compression.js +117 -0
  41. package/dist/context/compression.js.map +1 -0
  42. package/dist/context/compression.test.d.ts +2 -0
  43. package/dist/context/compression.test.d.ts.map +1 -0
  44. package/dist/context/compression.test.js +170 -0
  45. package/dist/context/compression.test.js.map +1 -0
  46. package/dist/context/converter.d.ts +11 -0
  47. package/dist/context/converter.d.ts.map +1 -0
  48. package/dist/context/converter.js +40 -0
  49. package/dist/context/converter.js.map +1 -0
  50. package/dist/context/converter.test.d.ts +2 -0
  51. package/dist/context/converter.test.d.ts.map +1 -0
  52. package/dist/context/converter.test.js +110 -0
  53. package/dist/context/converter.test.js.map +1 -0
  54. package/dist/context/run-context.d.ts +9 -0
  55. package/dist/context/run-context.d.ts.map +1 -0
  56. package/dist/context/run-context.js +14 -0
  57. package/dist/context/run-context.js.map +1 -0
  58. package/dist/context/run-context.test.d.ts +2 -0
  59. package/dist/context/run-context.test.d.ts.map +1 -0
  60. package/dist/context/run-context.test.js +34 -0
  61. package/dist/context/run-context.test.js.map +1 -0
  62. package/dist/context/system-prompt.d.ts +24 -0
  63. package/dist/context/system-prompt.d.ts.map +1 -0
  64. package/dist/context/system-prompt.js +69 -0
  65. package/dist/context/system-prompt.js.map +1 -0
  66. package/dist/context/system-prompt.test.d.ts +2 -0
  67. package/dist/context/system-prompt.test.d.ts.map +1 -0
  68. package/dist/context/system-prompt.test.js +134 -0
  69. package/dist/context/system-prompt.test.js.map +1 -0
  70. package/dist/errors.d.ts +24 -0
  71. package/dist/errors.d.ts.map +1 -0
  72. package/dist/errors.js +47 -0
  73. package/dist/errors.js.map +1 -0
  74. package/dist/errors.test.d.ts +2 -0
  75. package/dist/errors.test.d.ts.map +1 -0
  76. package/dist/errors.test.js +68 -0
  77. package/dist/errors.test.js.map +1 -0
  78. package/dist/factory.d.ts +58 -0
  79. package/dist/factory.d.ts.map +1 -0
  80. package/dist/factory.js +282 -0
  81. package/dist/factory.js.map +1 -0
  82. package/dist/factory.test.d.ts +2 -0
  83. package/dist/factory.test.d.ts.map +1 -0
  84. package/dist/factory.test.js +63 -0
  85. package/dist/factory.test.js.map +1 -0
  86. package/dist/fork.test.d.ts +2 -0
  87. package/dist/fork.test.d.ts.map +1 -0
  88. package/dist/fork.test.js +456 -0
  89. package/dist/fork.test.js.map +1 -0
  90. package/dist/index.d.ts +29 -0
  91. package/dist/index.d.ts.map +1 -0
  92. package/dist/index.js +32 -0
  93. package/dist/index.js.map +1 -0
  94. package/dist/mcp/client.d.ts +3 -0
  95. package/dist/mcp/client.d.ts.map +1 -0
  96. package/dist/mcp/client.js +75 -0
  97. package/dist/mcp/client.js.map +1 -0
  98. package/dist/mcp/schema-convert.d.ts +3 -0
  99. package/dist/mcp/schema-convert.d.ts.map +1 -0
  100. package/dist/mcp/schema-convert.js +73 -0
  101. package/dist/mcp/schema-convert.js.map +1 -0
  102. package/dist/mcp/schema-convert.test.d.ts +2 -0
  103. package/dist/mcp/schema-convert.test.d.ts.map +1 -0
  104. package/dist/mcp/schema-convert.test.js +95 -0
  105. package/dist/mcp/schema-convert.test.js.map +1 -0
  106. package/dist/mcp/tools.d.ts +14 -0
  107. package/dist/mcp/tools.d.ts.map +1 -0
  108. package/dist/mcp/tools.js +23 -0
  109. package/dist/mcp/tools.js.map +1 -0
  110. package/dist/mcp/tools.test.d.ts +2 -0
  111. package/dist/mcp/tools.test.d.ts.map +1 -0
  112. package/dist/mcp/tools.test.js +45 -0
  113. package/dist/mcp/tools.test.js.map +1 -0
  114. package/dist/memory/memory.d.ts +3 -0
  115. package/dist/memory/memory.d.ts.map +1 -0
  116. package/dist/memory/memory.js +130 -0
  117. package/dist/memory/memory.js.map +1 -0
  118. package/dist/memory/memory.test.d.ts +2 -0
  119. package/dist/memory/memory.test.d.ts.map +1 -0
  120. package/dist/memory/memory.test.js +94 -0
  121. package/dist/memory/memory.test.js.map +1 -0
  122. package/dist/middleware/hooks.d.ts +18 -0
  123. package/dist/middleware/hooks.d.ts.map +1 -0
  124. package/dist/middleware/hooks.js +71 -0
  125. package/dist/middleware/hooks.js.map +1 -0
  126. package/dist/middleware/hooks.test.d.ts +2 -0
  127. package/dist/middleware/hooks.test.d.ts.map +1 -0
  128. package/dist/middleware/hooks.test.js +172 -0
  129. package/dist/middleware/hooks.test.js.map +1 -0
  130. package/dist/middleware/index.d.ts +7 -0
  131. package/dist/middleware/index.d.ts.map +1 -0
  132. package/dist/middleware/index.js +5 -0
  133. package/dist/middleware/index.js.map +1 -0
  134. package/dist/middleware/permission-middleware.d.ts +11 -0
  135. package/dist/middleware/permission-middleware.d.ts.map +1 -0
  136. package/dist/middleware/permission-middleware.js +56 -0
  137. package/dist/middleware/permission-middleware.js.map +1 -0
  138. package/dist/middleware/permission-middleware.test.d.ts +2 -0
  139. package/dist/middleware/permission-middleware.test.d.ts.map +1 -0
  140. package/dist/middleware/permission-middleware.test.js +170 -0
  141. package/dist/middleware/permission-middleware.test.js.map +1 -0
  142. package/dist/middleware/permissions.d.ts +14 -0
  143. package/dist/middleware/permissions.d.ts.map +1 -0
  144. package/dist/middleware/permissions.js +118 -0
  145. package/dist/middleware/permissions.js.map +1 -0
  146. package/dist/middleware/permissions.test.d.ts +2 -0
  147. package/dist/middleware/permissions.test.d.ts.map +1 -0
  148. package/dist/middleware/permissions.test.js +187 -0
  149. package/dist/middleware/permissions.test.js.map +1 -0
  150. package/dist/middleware/pipeline.d.ts +13 -0
  151. package/dist/middleware/pipeline.d.ts.map +1 -0
  152. package/dist/middleware/pipeline.js +28 -0
  153. package/dist/middleware/pipeline.js.map +1 -0
  154. package/dist/middleware/pipeline.test.d.ts +2 -0
  155. package/dist/middleware/pipeline.test.d.ts.map +1 -0
  156. package/dist/middleware/pipeline.test.js +189 -0
  157. package/dist/middleware/pipeline.test.js.map +1 -0
  158. package/dist/observability/cost-tracker.d.ts +3 -0
  159. package/dist/observability/cost-tracker.d.ts.map +1 -0
  160. package/dist/observability/cost-tracker.js +26 -0
  161. package/dist/observability/cost-tracker.js.map +1 -0
  162. package/dist/observability/cost-tracker.test.d.ts +2 -0
  163. package/dist/observability/cost-tracker.test.d.ts.map +1 -0
  164. package/dist/observability/cost-tracker.test.js +49 -0
  165. package/dist/observability/cost-tracker.test.js.map +1 -0
  166. package/dist/observability/trace.d.ts +2 -0
  167. package/dist/observability/trace.d.ts.map +1 -0
  168. package/dist/observability/trace.js +5 -0
  169. package/dist/observability/trace.js.map +1 -0
  170. package/dist/session/session.d.ts +3 -0
  171. package/dist/session/session.d.ts.map +1 -0
  172. package/dist/session/session.js +62 -0
  173. package/dist/session/session.js.map +1 -0
  174. package/dist/session/session.test.d.ts +2 -0
  175. package/dist/session/session.test.d.ts.map +1 -0
  176. package/dist/session/session.test.js +84 -0
  177. package/dist/session/session.test.js.map +1 -0
  178. package/dist/skills.d.ts +14 -0
  179. package/dist/skills.d.ts.map +1 -0
  180. package/dist/skills.js +31 -0
  181. package/dist/skills.js.map +1 -0
  182. package/dist/skills.test.d.ts +2 -0
  183. package/dist/skills.test.d.ts.map +1 -0
  184. package/dist/skills.test.js +61 -0
  185. package/dist/skills.test.js.map +1 -0
  186. package/dist/tools/ask-user.d.ts +10 -0
  187. package/dist/tools/ask-user.d.ts.map +1 -0
  188. package/dist/tools/ask-user.js +27 -0
  189. package/dist/tools/ask-user.js.map +1 -0
  190. package/dist/tools/bash.d.ts +11 -0
  191. package/dist/tools/bash.d.ts.map +1 -0
  192. package/dist/tools/bash.js +54 -0
  193. package/dist/tools/bash.js.map +1 -0
  194. package/dist/tools/bash.test.d.ts +2 -0
  195. package/dist/tools/bash.test.d.ts.map +1 -0
  196. package/dist/tools/bash.test.js +63 -0
  197. package/dist/tools/bash.test.js.map +1 -0
  198. package/dist/tools/edit.d.ts +10 -0
  199. package/dist/tools/edit.d.ts.map +1 -0
  200. package/dist/tools/edit.js +65 -0
  201. package/dist/tools/edit.js.map +1 -0
  202. package/dist/tools/edit.test.d.ts +2 -0
  203. package/dist/tools/edit.test.d.ts.map +1 -0
  204. package/dist/tools/edit.test.js +60 -0
  205. package/dist/tools/edit.test.js.map +1 -0
  206. package/dist/tools/glob.d.ts +8 -0
  207. package/dist/tools/glob.d.ts.map +1 -0
  208. package/dist/tools/glob.js +43 -0
  209. package/dist/tools/glob.js.map +1 -0
  210. package/dist/tools/glob.test.d.ts +2 -0
  211. package/dist/tools/glob.test.d.ts.map +1 -0
  212. package/dist/tools/glob.test.js +54 -0
  213. package/dist/tools/glob.test.js.map +1 -0
  214. package/dist/tools/grep.d.ts +9 -0
  215. package/dist/tools/grep.d.ts.map +1 -0
  216. package/dist/tools/grep.js +74 -0
  217. package/dist/tools/grep.js.map +1 -0
  218. package/dist/tools/grep.test.d.ts +2 -0
  219. package/dist/tools/grep.test.d.ts.map +1 -0
  220. package/dist/tools/grep.test.js +48 -0
  221. package/dist/tools/grep.test.js.map +1 -0
  222. package/dist/tools/index.d.ts +25 -0
  223. package/dist/tools/index.d.ts.map +1 -0
  224. package/dist/tools/index.js +40 -0
  225. package/dist/tools/index.js.map +1 -0
  226. package/dist/tools/index.test.d.ts +2 -0
  227. package/dist/tools/index.test.d.ts.map +1 -0
  228. package/dist/tools/index.test.js +102 -0
  229. package/dist/tools/index.test.js.map +1 -0
  230. package/dist/tools/notebook-edit.d.ts +9 -0
  231. package/dist/tools/notebook-edit.d.ts.map +1 -0
  232. package/dist/tools/notebook-edit.js +55 -0
  233. package/dist/tools/notebook-edit.js.map +1 -0
  234. package/dist/tools/read.d.ts +9 -0
  235. package/dist/tools/read.d.ts.map +1 -0
  236. package/dist/tools/read.js +48 -0
  237. package/dist/tools/read.js.map +1 -0
  238. package/dist/tools/read.test.d.ts +2 -0
  239. package/dist/tools/read.test.d.ts.map +1 -0
  240. package/dist/tools/read.test.js +68 -0
  241. package/dist/tools/read.test.js.map +1 -0
  242. package/dist/tools/util.d.ts +19 -0
  243. package/dist/tools/util.d.ts.map +1 -0
  244. package/dist/tools/util.js +44 -0
  245. package/dist/tools/util.js.map +1 -0
  246. package/dist/tools/util.test.d.ts +2 -0
  247. package/dist/tools/util.test.d.ts.map +1 -0
  248. package/dist/tools/util.test.js +75 -0
  249. package/dist/tools/util.test.js.map +1 -0
  250. package/dist/tools/web-fetch.d.ts +7 -0
  251. package/dist/tools/web-fetch.d.ts.map +1 -0
  252. package/dist/tools/web-fetch.js +35 -0
  253. package/dist/tools/web-fetch.js.map +1 -0
  254. package/dist/tools/web-search.d.ts +7 -0
  255. package/dist/tools/web-search.d.ts.map +1 -0
  256. package/dist/tools/web-search.js +20 -0
  257. package/dist/tools/web-search.js.map +1 -0
  258. package/dist/tools/write.d.ts +8 -0
  259. package/dist/tools/write.d.ts.map +1 -0
  260. package/dist/tools/write.js +33 -0
  261. package/dist/tools/write.js.map +1 -0
  262. package/dist/tools/write.test.d.ts +2 -0
  263. package/dist/tools/write.test.d.ts.map +1 -0
  264. package/dist/tools/write.test.js +49 -0
  265. package/dist/tools/write.test.js.map +1 -0
  266. package/dist/types.d.ts +257 -0
  267. package/dist/types.d.ts.map +1 -0
  268. package/dist/types.js +2 -0
  269. package/dist/types.js.map +1 -0
  270. package/dist/types.test.d.ts +2 -0
  271. package/dist/types.test.d.ts.map +1 -0
  272. package/dist/types.test.js +69 -0
  273. package/dist/types.test.js.map +1 -0
  274. package/package.json +51 -0
@@ -0,0 +1,282 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { Agent } from '@mariozechner/pi-agent-core';
3
+ import { createRunContext } from './context/run-context.js';
4
+ import { convertToLlm } from './context/converter.js';
5
+ import { buildSystemPrompt } from './context/system-prompt.js';
6
+ import { createCompressionMiddleware } from './context/compression.js';
7
+ import { createPermissionMiddleware } from './middleware/permission-middleware.js';
8
+ import { composePipeline } from './middleware/pipeline.js';
9
+ import { runLifecycleHooks } from './middleware/hooks.js';
10
+ import { createCostTracker } from './observability/cost-tracker.js';
11
+ import { createMemoryManager } from './memory/memory.js';
12
+ import { createSessionManager } from './session/session.js';
13
+ import { createMcpManager } from './mcp/client.js';
14
+ import { getAllTools } from './tools/index.js';
15
+ import { createSwarmManager } from './agents/swarm.js';
16
+ import { createSwarmTools } from './agents/tools.js';
17
+ import { composeCodingAgentConfig } from './skills.js';
18
+ /**
19
+ * Main factory function. Creates a fully wired CodingAgent.
20
+ */
21
+ export async function createCodingAgent(config) {
22
+ const cwd = config.cwd ?? process.cwd();
23
+ const permissionMode = config.permissionMode ?? 'default';
24
+ const enableMemory = config.enableMemory ?? true;
25
+ // 1. Create RunContext
26
+ const runContext = createRunContext({
27
+ cwd,
28
+ sessionId: config.sessionId,
29
+ });
30
+ // 2. Load memories
31
+ const memoryManager = createMemoryManager();
32
+ const memoryDir = config.memoryDir ?? `${process.env.HOME ?? '~'}/.rc-agents/memory`;
33
+ let memories = [];
34
+ let memorySelections = [];
35
+ if (enableMemory) {
36
+ try {
37
+ memories = await memoryManager.load(memoryDir);
38
+ memorySelections = memoryManager.retrieve(memories, { query: '' });
39
+ }
40
+ catch {
41
+ // Memory loading is non-critical
42
+ }
43
+ }
44
+ // 3. Create tools
45
+ const defaultTools = getAllTools({
46
+ cwd,
47
+ onQuestion: config.onQuestion,
48
+ });
49
+ const composedConfig = composeCodingAgentConfig(config, { defaultTools });
50
+ const tools = composedConfig.tools;
51
+ const hooks = composedConfig.hooks;
52
+ const permissionRules = composedConfig.permissionRules;
53
+ // 4. Connect MCP servers
54
+ const mcp = createMcpManager();
55
+ if (composedConfig.mcpServers.length > 0) {
56
+ for (const serverConfig of composedConfig.mcpServers) {
57
+ try {
58
+ await mcp.connect(serverConfig);
59
+ }
60
+ catch {
61
+ // Log error per server but continue
62
+ }
63
+ }
64
+ }
65
+ // Merge MCP tools with built-in tools
66
+ const allTools = [...tools, ...mcp.getTools()];
67
+ // 5. Build system prompt
68
+ const basePrompt = composedConfig.systemPrompt ?? 'You are a coding agent that helps users with software development tasks.';
69
+ const systemPrompt = buildSystemPrompt({
70
+ basePrompt,
71
+ skills: composedConfig.skills,
72
+ tools: allTools,
73
+ memories: memorySelections,
74
+ permissionMode,
75
+ });
76
+ // 6. Create permission middleware
77
+ const permissionGate = createPermissionMiddleware({
78
+ mode: permissionMode,
79
+ rules: permissionRules,
80
+ tools: allTools,
81
+ runContext,
82
+ onAsk: config.onPermissionAsk,
83
+ });
84
+ // 7. Compose pipeline
85
+ const pipeline = composePipeline({
86
+ hooks,
87
+ permissionGate,
88
+ runContext,
89
+ });
90
+ // 8. Create compression middleware
91
+ const maxContextTokens = config.maxContextTokens ??
92
+ Math.max(4000, Math.floor((config.model.contextWindow || 128000) * 0.8));
93
+ const transformContext = createCompressionMiddleware({
94
+ maxTokens: maxContextTokens,
95
+ strategy: config.compressionStrategy ?? 'truncate',
96
+ model: config.model,
97
+ });
98
+ // 9. Create cost tracker
99
+ const costTracker = createCostTracker();
100
+ // 10. Create Agent
101
+ const agent = new Agent({
102
+ initialState: {
103
+ systemPrompt,
104
+ model: config.model,
105
+ tools: allTools,
106
+ thinkingLevel: config.thinkingLevel ?? 'off',
107
+ },
108
+ convertToLlm,
109
+ transformContext,
110
+ beforeToolCall: pipeline.beforeToolCall,
111
+ afterToolCall: pipeline.afterToolCall,
112
+ getApiKey: config.getApiKey,
113
+ toolExecution: config.toolExecution ?? 'parallel',
114
+ streamFn: config.streamFn,
115
+ });
116
+ // Wire cost tracker to agent events
117
+ agent.subscribe((event) => {
118
+ if (event.type === 'message_end') {
119
+ const msg = event.message;
120
+ if (msg.role === 'assistant' && msg.usage) {
121
+ costTracker.record(msg.usage, config.model.id);
122
+ }
123
+ }
124
+ });
125
+ // 11. Create session/memory managers
126
+ const sessionDir = config.sessionDir ?? `${process.env.HOME ?? '~'}/.rc-agents/sessions`;
127
+ const sessions = createSessionManager(sessionDir);
128
+ // 12. Optionally create swarm
129
+ let swarm;
130
+ if (config.enableSwarm) {
131
+ swarm = createSwarmManager({
132
+ model: config.model,
133
+ tools: allTools,
134
+ convertToLlm,
135
+ getApiKey: config.getApiKey,
136
+ beforeToolCall: pipeline.beforeToolCall,
137
+ afterToolCall: pipeline.afterToolCall,
138
+ transformContext,
139
+ });
140
+ // Create default team and swarm tools
141
+ swarm.createTeam({ name: 'default', model: config.model });
142
+ const swarmTools = createSwarmTools('default', swarm);
143
+ const currentTools = [...allTools, ...swarmTools];
144
+ agent.state.tools = currentTools;
145
+ }
146
+ // 13. Resume session if sessionId provided
147
+ if (config.sessionId) {
148
+ try {
149
+ const snapshot = await sessions.load(config.sessionId);
150
+ if (snapshot) {
151
+ agent.state.messages = snapshot.messages;
152
+ }
153
+ }
154
+ catch {
155
+ // Session loading is non-critical
156
+ }
157
+ }
158
+ // 14. Run SessionStart hooks
159
+ await runLifecycleHooks(hooks, 'SessionStart', runContext);
160
+ // Compute system prompt hash for session snapshots
161
+ const systemPromptHash = createHash('sha256')
162
+ .update(systemPrompt)
163
+ .digest('hex')
164
+ .slice(0, 16);
165
+ async function _spawnChildren(baseMessages, message, n) {
166
+ if (n < 0)
167
+ throw new RangeError(`fork: n must be >= 0, got ${n}`);
168
+ if (n === 0)
169
+ return [];
170
+ const childConfig = {
171
+ ...config,
172
+ sessionId: undefined,
173
+ autoFork: undefined,
174
+ };
175
+ const children = await Promise.all(Array.from({ length: n }, () => createCodingAgent(childConfig)));
176
+ await Promise.all(children.map((child) => {
177
+ child.agent.replaceMessages(structuredClone(baseMessages));
178
+ return child.prompt(message);
179
+ }));
180
+ return children;
181
+ }
182
+ const codingAgent = {
183
+ agent,
184
+ mcp,
185
+ sessions,
186
+ memory: memoryManager,
187
+ swarm,
188
+ costTracker,
189
+ async prompt(message, images) {
190
+ await agent.prompt(message, images);
191
+ },
192
+ async dispose() {
193
+ // Run SessionEnd hooks
194
+ await runLifecycleHooks(hooks, 'SessionEnd', runContext);
195
+ // Save session snapshot
196
+ try {
197
+ await sessions.save({
198
+ version: 1,
199
+ id: runContext.sessionId,
200
+ messages: agent.state.messages,
201
+ modelId: config.model.id,
202
+ providerName: config.model.provider ?? 'unknown',
203
+ systemPromptHash,
204
+ memoryRefs: memories.map(m => m.name),
205
+ createdAt: Date.now(),
206
+ updatedAt: Date.now(),
207
+ });
208
+ }
209
+ catch {
210
+ // Session save is non-critical
211
+ }
212
+ // Disconnect MCP servers
213
+ for (const conn of mcp.getConnections()) {
214
+ try {
215
+ await mcp.disconnect(conn.name);
216
+ }
217
+ catch {
218
+ // MCP disconnect is non-critical
219
+ }
220
+ }
221
+ // Destroy swarm if present
222
+ if (swarm) {
223
+ try {
224
+ await swarm.destroyTeam('default');
225
+ }
226
+ catch {
227
+ // Swarm cleanup is non-critical
228
+ }
229
+ }
230
+ },
231
+ snapshot() {
232
+ if (agent.state.isStreaming) {
233
+ throw new Error('snapshot: cannot snapshot while agent is streaming');
234
+ }
235
+ return {
236
+ id: randomUUID(),
237
+ messages: structuredClone(agent.state.messages),
238
+ createdAt: Date.now(),
239
+ };
240
+ },
241
+ restore(snapshot) {
242
+ if (agent.state.isStreaming) {
243
+ throw new Error('restore: cannot restore while agent is streaming');
244
+ }
245
+ agent.replaceMessages(structuredClone(snapshot.messages));
246
+ },
247
+ async fork(message, n) {
248
+ return _spawnChildren(structuredClone(agent.state.messages), message, n);
249
+ },
250
+ async promptFork(message, n) {
251
+ return _spawnChildren(structuredClone(agent.state.messages), message, n);
252
+ },
253
+ async forkFrom(snapshot, message, n) {
254
+ return _spawnChildren(structuredClone(snapshot.messages), message, n);
255
+ },
256
+ };
257
+ // Wire auto-fork if configured
258
+ if (config.autoFork) {
259
+ const autoFork = config.autoFork;
260
+ let lastUserMessage;
261
+ agent.subscribe((event) => {
262
+ if (event.type === 'message_start') {
263
+ const msg = event.message;
264
+ if (msg.role === 'user') {
265
+ const textPart = msg.content.find((p) => p.type === 'text');
266
+ if (textPart)
267
+ lastUserMessage = textPart.text;
268
+ }
269
+ }
270
+ if (event.type === 'turn_end' && lastUserMessage) {
271
+ const message = lastUserMessage;
272
+ lastUserMessage = undefined;
273
+ codingAgent
274
+ .fork(message, autoFork.branches)
275
+ .then(children => autoFork.onBranches(children))
276
+ .catch(() => { });
277
+ }
278
+ });
279
+ }
280
+ return codingAgent;
281
+ }
282
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=factory.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.test.d.ts","sourceRoot":"","sources":["../src/factory.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,63 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { getModel } from '@mariozechner/pi-ai';
3
+ import { createCodingAgent } from './factory.js';
4
+ describe('createCodingAgent', () => {
5
+ it('returns an object with all expected properties', async () => {
6
+ const model = getModel('openai', 'gpt-4o-mini');
7
+ const agent = await createCodingAgent({
8
+ model,
9
+ permissionMode: 'allowAll',
10
+ });
11
+ // Verify all expected properties exist
12
+ expect(agent).toHaveProperty('agent');
13
+ expect(agent).toHaveProperty('mcp');
14
+ expect(agent).toHaveProperty('sessions');
15
+ expect(agent).toHaveProperty('memory');
16
+ expect(agent).toHaveProperty('costTracker');
17
+ expect(agent).toHaveProperty('prompt');
18
+ expect(agent).toHaveProperty('dispose');
19
+ // Verify types
20
+ expect(typeof agent.prompt).toBe('function');
21
+ expect(typeof agent.dispose).toBe('function');
22
+ // No swarm by default
23
+ expect(agent.swarm).toBeUndefined();
24
+ // Cost tracker works
25
+ expect(agent.costTracker.total()).toEqual({ tokens: 0, cost: 0 });
26
+ // Clean up (don't actually call LLM)
27
+ await agent.dispose();
28
+ });
29
+ it('creates swarm when enableSwarm is true', async () => {
30
+ const model = getModel('openai', 'gpt-4o-mini');
31
+ const agent = await createCodingAgent({
32
+ model,
33
+ permissionMode: 'allowAll',
34
+ enableSwarm: true,
35
+ });
36
+ expect(agent.swarm).toBeDefined();
37
+ await agent.dispose();
38
+ });
39
+ it('uses custom tools when provided', async () => {
40
+ const model = getModel('openai', 'gpt-4o-mini');
41
+ const { Type } = await import('@sinclair/typebox');
42
+ const customTool = {
43
+ name: 'custom',
44
+ label: 'Custom Tool',
45
+ description: 'A custom tool',
46
+ parameters: Type.Object({}),
47
+ capabilities: [],
48
+ async execute() {
49
+ return { content: [{ type: 'text', text: 'done' }], details: {} };
50
+ },
51
+ };
52
+ const agent = await createCodingAgent({
53
+ model,
54
+ permissionMode: 'allowAll',
55
+ tools: [customTool],
56
+ });
57
+ // Agent should have the custom tool
58
+ const toolNames = agent.agent.state.tools.map(t => t.name);
59
+ expect(toolNames).toContain('custom');
60
+ await agent.dispose();
61
+ });
62
+ });
63
+ //# sourceMappingURL=factory.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.test.js","sourceRoot":"","sources":["../src/factory.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=fork.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fork.test.d.ts","sourceRoot":"","sources":["../src/fork.test.ts"],"names":[],"mappings":""}