koneck 1.0.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 (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +109 -0
  3. package/dist/astValidator.d.ts +6 -0
  4. package/dist/astValidator.d.ts.map +1 -0
  5. package/dist/astValidator.js +57 -0
  6. package/dist/astValidator.js.map +1 -0
  7. package/dist/chat.d.ts +3 -0
  8. package/dist/chat.d.ts.map +1 -0
  9. package/dist/chat.js +205 -0
  10. package/dist/chat.js.map +1 -0
  11. package/dist/completion.d.ts +2 -0
  12. package/dist/completion.d.ts.map +1 -0
  13. package/dist/completion.js +137 -0
  14. package/dist/completion.js.map +1 -0
  15. package/dist/compressor.d.ts +9 -0
  16. package/dist/compressor.d.ts.map +1 -0
  17. package/dist/compressor.js +71 -0
  18. package/dist/compressor.js.map +1 -0
  19. package/dist/config.d.ts +14 -0
  20. package/dist/config.d.ts.map +1 -0
  21. package/dist/config.js +40 -0
  22. package/dist/config.js.map +1 -0
  23. package/dist/doctor.d.ts +2 -0
  24. package/dist/doctor.d.ts.map +1 -0
  25. package/dist/doctor.js +99 -0
  26. package/dist/doctor.js.map +1 -0
  27. package/dist/engine.d.ts +11 -0
  28. package/dist/engine.d.ts.map +1 -0
  29. package/dist/engine.js +510 -0
  30. package/dist/engine.js.map +1 -0
  31. package/dist/generate-koneck-md.d.ts +3 -0
  32. package/dist/generate-koneck-md.d.ts.map +1 -0
  33. package/dist/generate-koneck-md.js +69 -0
  34. package/dist/generate-koneck-md.js.map +1 -0
  35. package/dist/git-tools.d.ts +4 -0
  36. package/dist/git-tools.d.ts.map +1 -0
  37. package/dist/git-tools.js +206 -0
  38. package/dist/git-tools.js.map +1 -0
  39. package/dist/highlight.d.ts +3 -0
  40. package/dist/highlight.d.ts.map +1 -0
  41. package/dist/highlight.js +139 -0
  42. package/dist/highlight.js.map +1 -0
  43. package/dist/index.d.ts +3 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +448 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/init.d.ts +9 -0
  48. package/dist/init.d.ts.map +1 -0
  49. package/dist/init.js +93 -0
  50. package/dist/init.js.map +1 -0
  51. package/dist/mcp.d.ts +24 -0
  52. package/dist/mcp.d.ts.map +1 -0
  53. package/dist/mcp.js +75 -0
  54. package/dist/mcp.js.map +1 -0
  55. package/dist/memory.d.ts +3 -0
  56. package/dist/memory.d.ts.map +1 -0
  57. package/dist/memory.js +18 -0
  58. package/dist/memory.js.map +1 -0
  59. package/dist/plugins.d.ts +9 -0
  60. package/dist/plugins.d.ts.map +1 -0
  61. package/dist/plugins.js +60 -0
  62. package/dist/plugins.js.map +1 -0
  63. package/dist/pricing.d.ts +9 -0
  64. package/dist/pricing.d.ts.map +1 -0
  65. package/dist/pricing.js +84 -0
  66. package/dist/pricing.js.map +1 -0
  67. package/dist/project.d.ts +14 -0
  68. package/dist/project.d.ts.map +1 -0
  69. package/dist/project.js +151 -0
  70. package/dist/project.js.map +1 -0
  71. package/dist/providers.d.ts +13 -0
  72. package/dist/providers.d.ts.map +1 -0
  73. package/dist/providers.js +130 -0
  74. package/dist/providers.js.map +1 -0
  75. package/dist/session.d.ts +19 -0
  76. package/dist/session.d.ts.map +1 -0
  77. package/dist/session.js +71 -0
  78. package/dist/session.js.map +1 -0
  79. package/dist/setup.d.ts +4 -0
  80. package/dist/setup.d.ts.map +1 -0
  81. package/dist/setup.js +63 -0
  82. package/dist/setup.js.map +1 -0
  83. package/dist/stats.d.ts +2 -0
  84. package/dist/stats.d.ts.map +1 -0
  85. package/dist/stats.js +81 -0
  86. package/dist/stats.js.map +1 -0
  87. package/dist/tools.d.ts +17 -0
  88. package/dist/tools.d.ts.map +1 -0
  89. package/dist/tools.js +713 -0
  90. package/dist/tools.js.map +1 -0
  91. package/dist/tui.d.ts +38 -0
  92. package/dist/tui.d.ts.map +1 -0
  93. package/dist/tui.js +364 -0
  94. package/dist/tui.js.map +1 -0
  95. package/dist/types.d.ts +158 -0
  96. package/dist/types.d.ts.map +1 -0
  97. package/dist/types.js +2 -0
  98. package/dist/types.js.map +1 -0
  99. package/dist/watch.d.ts +3 -0
  100. package/dist/watch.d.ts.map +1 -0
  101. package/dist/watch.js +68 -0
  102. package/dist/watch.js.map +1 -0
  103. package/dist/worktree.d.ts +8 -0
  104. package/dist/worktree.d.ts.map +1 -0
  105. package/dist/worktree.js +94 -0
  106. package/dist/worktree.js.map +1 -0
  107. package/package.json +67 -0
package/dist/engine.js ADDED
@@ -0,0 +1,510 @@
1
+ import OpenAI from 'openai';
2
+ import os from 'os';
3
+ import { execa } from 'execa';
4
+ import { TOOL_DEFINITIONS, dispatchTool } from './tools.js';
5
+ import { tui } from './tui.js';
6
+ import { isGitRepo, createWorktree, mergeWorktree } from './worktree.js';
7
+ import { resolveProvider, getApiKey } from './providers.js';
8
+ import { compressIfNeeded } from './compressor.js';
9
+ import { generateSessionId, saveSession } from './session.js';
10
+ import { loadMemory } from './memory.js';
11
+ import { detectProject, loadAgentInstructions, projectSummary } from './project.js';
12
+ import { estimateCost, formatCost } from './pricing.js';
13
+ import { loadPlugins, callPlugin } from './plugins.js';
14
+ import { loadMCPConfig, connectMCPServers, callMCPTool, } from './mcp.js';
15
+ // ─── Client ──────────────────────────────────────────────────────────────────
16
+ function buildClient(config) {
17
+ const provider = resolveProvider(config.provider, config.baseURL);
18
+ const apiKey = getApiKey(provider, config.apiKey);
19
+ return new OpenAI({
20
+ baseURL: provider.baseURL,
21
+ apiKey,
22
+ defaultHeaders: provider.extraHeaders,
23
+ });
24
+ }
25
+ // ─── Environment discovery ────────────────────────────────────────────────────
26
+ async function discoverEnvironment(cwd) {
27
+ let gitStatus = null;
28
+ let gitBranch = null;
29
+ try {
30
+ const { stdout: s } = await execa('git', ['status', '--short'], { cwd, stdio: 'pipe' });
31
+ gitStatus = s.trim() || 'clean';
32
+ }
33
+ catch { /* not a git repo */ }
34
+ try {
35
+ const { stdout: b } = await execa('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd, stdio: 'pipe' });
36
+ gitBranch = b.trim();
37
+ }
38
+ catch { /* not a git repo */ }
39
+ return {
40
+ os: `${os.type()} ${os.release()} (${os.arch()})`,
41
+ cwd,
42
+ shell: process.env.SHELL ?? '/bin/sh',
43
+ gitStatus,
44
+ gitBranch,
45
+ nodeVersion: process.version,
46
+ env: {
47
+ HOME: process.env.HOME ?? '',
48
+ USER: process.env.USER ?? '',
49
+ PATH: process.env.PATH ?? '',
50
+ },
51
+ };
52
+ }
53
+ function buildSystemPrompt(ctx, memory = null, project = null, agentInstructions = null) {
54
+ // ── Core identity & non-negotiable rules ────────────────────────────────────
55
+ const rules = `You are KONECK — a production-grade autonomous coding agent. You operate with the focus and precision of a senior engineer pair-programmer.
56
+
57
+ ## Non-negotiable rules
58
+ 1. **Surgical edits only.** NEVER use write_file on an existing file when search_replace will work. Use write_file ONLY for new files or files under 80 lines that need a complete rewrite. NEVER use apply_diff — it is fragile. Always use search_replace for changes to existing files.
59
+ 2. **Read before edit.** Always read_files (or grep_search to find the exact lines) before modifying anything.
60
+ 3. **Minimum turns.** Plan what you will change, then execute. Do not round-trip for confirmation. Complete the task in as few turns as possible.
61
+ 4. **Run tests after code changes.** If a test command exists, run it after every code modification to confirm nothing broke.${project?.testCommand ? ' Test command: `' + project.testCommand + '`.' : ''}
62
+ 5. **Verify writes.** After any write_file or search_replace, read the changed section to confirm correctness.
63
+ 6. **No duplicate calls.** Never call the same tool with identical arguments twice in a session.
64
+ 7. **Grep before read.** Use grep_search to locate the exact symbol/function before loading a whole file.
65
+ 8. **Short final summary.** After the task is done, write ONE short paragraph: what changed, what was tested, any caveats.`;
66
+ // ── Project context ──────────────────────────────────────────────────────────
67
+ const projectSection = project
68
+ ? '\n## Project\n' + projectSummary(project)
69
+ : '';
70
+ // ── Runtime environment ──────────────────────────────────────────────────────
71
+ const env = '\n## Runtime\n' +
72
+ '- OS: ' + ctx.os + '\n' +
73
+ '- CWD: ' + ctx.cwd + '\n' +
74
+ '- Shell: ' + ctx.shell + '\n' +
75
+ '- Node: ' + ctx.nodeVersion + '\n' +
76
+ '- Git branch: ' + (ctx.gitBranch ?? 'none') + '\n' +
77
+ '- Git status: ' + (ctx.gitStatus ?? 'not a git repo');
78
+ // ── Optional sections ────────────────────────────────────────────────────────
79
+ const memorySection = memory
80
+ ? '\n## Project Memory (from previous sessions)\n' + memory
81
+ : '';
82
+ const instructionsSection = agentInstructions
83
+ ? '\n## ' + agentInstructions
84
+ : '';
85
+ return rules + projectSection + env + memorySection + instructionsSection;
86
+ }
87
+ // ─── Tool list ────────────────────────────────────────────────────────────────
88
+ function buildToolList(mcpClients, plugins, config) {
89
+ // Sub-agents (spawnDepth > 0) cannot themselves spawn further agents
90
+ const defs = (config.spawnDepth ?? 0) > 0
91
+ ? TOOL_DEFINITIONS.filter(d => d.name !== 'spawn_agents')
92
+ : TOOL_DEFINITIONS;
93
+ const tools = defs.map(def => ({
94
+ type: 'function',
95
+ function: { name: def.name, description: def.description, parameters: def.parameters },
96
+ }));
97
+ for (const { serverName, tools: mcpTools } of mcpClients) {
98
+ for (const t of mcpTools) {
99
+ tools.push({
100
+ type: 'function',
101
+ function: {
102
+ name: 'mcp__' + serverName + '__' + t.name,
103
+ description: '[MCP:' + serverName + '] ' + (t.description ?? t.name),
104
+ parameters: t.inputSchema ?? { type: 'object', properties: {} },
105
+ },
106
+ });
107
+ }
108
+ }
109
+ for (const plugin of plugins) {
110
+ tools.push({
111
+ type: 'function',
112
+ function: {
113
+ name: plugin.definition.name,
114
+ description: '[plugin] ' + plugin.definition.description,
115
+ parameters: plugin.definition.parameters,
116
+ },
117
+ });
118
+ }
119
+ return tools;
120
+ }
121
+ const BUILTIN_NAMES = new Set(TOOL_DEFINITIONS.map(d => d.name));
122
+ // ─── Parallel sub-agents ──────────────────────────────────────────────────────
123
+ async function handleSpawnAgents(args, config, cwd) {
124
+ const tasks = args.tasks.slice(0, 8);
125
+ if (tasks.length === 0)
126
+ return 'ERROR: tasks array is empty.';
127
+ if ((config.spawnDepth ?? 0) >= 1) {
128
+ return 'ERROR: spawn_agents cannot be called from within a sub-agent.';
129
+ }
130
+ const isGit = await isGitRepo(cwd);
131
+ let completed = 0;
132
+ const spinner = config.silent ? null : tui.startSpinner('0/' + tasks.length + ' agents complete');
133
+ const results = await Promise.all(tasks.map(async (task, i) => {
134
+ let taskCwd = cwd;
135
+ let branch;
136
+ if (isGit && args.use_worktrees !== false) {
137
+ try {
138
+ const wt = await createWorktree(cwd, 'agent' + i + '-' + task.slice(0, 12));
139
+ taskCwd = wt.path;
140
+ branch = wt.branch;
141
+ }
142
+ catch { /* fall back to shared cwd */ }
143
+ }
144
+ const subConfig = {
145
+ ...config,
146
+ cwd: taskCwd,
147
+ useWorktree: false,
148
+ silent: true,
149
+ spawnDepth: (config.spawnDepth ?? 0) + 1,
150
+ maxTurns: args.max_turns ?? config.maxTurns,
151
+ };
152
+ try {
153
+ const session = await createAgentSession(subConfig);
154
+ await session.send(task);
155
+ const last = [...session.messages].reverse().find(m => m.role === 'assistant');
156
+ const output = typeof last?.content === 'string' ? last.content.slice(0, 300) : '(completed)';
157
+ completed++;
158
+ if (spinner)
159
+ spinner.text = completed + '/' + tasks.length + ' agents complete';
160
+ return { task, output, success: true, branch };
161
+ }
162
+ catch (err) {
163
+ completed++;
164
+ if (spinner)
165
+ spinner.text = completed + '/' + tasks.length + ' agents complete';
166
+ return {
167
+ task,
168
+ output: err instanceof Error ? err.message : String(err),
169
+ success: false,
170
+ branch,
171
+ };
172
+ }
173
+ }));
174
+ if (spinner)
175
+ spinner.stop();
176
+ return results
177
+ .map((r, i) => {
178
+ const icon = r.success ? '✔' : '✗';
179
+ const branchNote = r.branch ? '\n Branch: ' + r.branch : '';
180
+ return icon + ' Agent ' + (i + 1) + ': ' + r.task.slice(0, 60) + '\n ' + r.output + branchNote;
181
+ })
182
+ .join('\n\n');
183
+ }
184
+ // ─── ReAct loop ───────────────────────────────────────────────────────────────
185
+ async function runReActLoop(messages, client, config, effectiveCwd, stats, mcpClients, plugins, openaiTools, turnOffset = 0, abortSignal) {
186
+ const silent = Boolean(config.silent);
187
+ const seenSignatures = new Set();
188
+ let budgetWarned = false;
189
+ let budgetModelWarnedUnknown = false;
190
+ const loopStart = Date.now();
191
+ for (let turn = 0; turn < config.maxTurns; turn++) {
192
+ if (abortSignal?.aborted)
193
+ return false;
194
+ stats.turns = turnOffset + turn + 1;
195
+ const compressed = await compressIfNeeded(messages, client, config.model);
196
+ if (compressed.compressed) {
197
+ messages.length = 0;
198
+ messages.push(...compressed.messages);
199
+ if (!silent)
200
+ tui.printThinking('Context compressed to ' + messages.length + ' messages.');
201
+ }
202
+ let assistantContent = '';
203
+ const toolCallMap = new Map();
204
+ // Per-turn 5-minute timeout — prevents the 17-minute hang
205
+ const turnAbort = AbortSignal.timeout(5 * 60 * 1000);
206
+ const combinedSignal = abortSignal
207
+ ? AbortSignal.any([abortSignal, turnAbort])
208
+ : turnAbort;
209
+ const spinner = silent ? null : tui.startSpinner('Turn ' + stats.turns);
210
+ try {
211
+ tui.streamStart();
212
+ // Adaptive max_tokens: larger for models with big context windows
213
+ const maxTok = config.model.includes('claude') ? 32768 :
214
+ config.model.includes('gemini') ? 32768 :
215
+ config.model.startsWith('auto/') ? 32768 : 16384;
216
+ const stream = await client.chat.completions.create({
217
+ model: config.model,
218
+ messages,
219
+ tools: openaiTools,
220
+ tool_choice: 'auto',
221
+ stream: true,
222
+ max_tokens: maxTok,
223
+ temperature: 0.1,
224
+ }, { signal: combinedSignal });
225
+ for await (const chunk of stream) {
226
+ if (combinedSignal.aborted)
227
+ break;
228
+ const choice = chunk.choices[0];
229
+ if (!choice)
230
+ continue;
231
+ const delta = choice.delta;
232
+ // Thinking / reasoning tokens (extended thinking models)
233
+ const deltaAny = delta;
234
+ if (deltaAny['thinking'] || deltaAny['reasoning']) {
235
+ const thinkText = String(deltaAny['thinking'] ?? deltaAny['reasoning'] ?? '');
236
+ if (!silent && thinkText)
237
+ tui.streamThinking(thinkText);
238
+ }
239
+ if (delta.content) {
240
+ assistantContent += delta.content;
241
+ if (!silent) {
242
+ if (spinner)
243
+ spinner.stop();
244
+ tui.streamChunk(delta.content);
245
+ }
246
+ }
247
+ if (delta.tool_calls) {
248
+ for (const tc of delta.tool_calls) {
249
+ const idx = tc.index ?? 0;
250
+ if (!toolCallMap.has(idx))
251
+ toolCallMap.set(idx, { id: '', name: '', arguments: '' });
252
+ const acc = toolCallMap.get(idx);
253
+ if (tc.id)
254
+ acc.id = tc.id;
255
+ if (tc.function?.name)
256
+ acc.name += tc.function.name;
257
+ if (tc.function?.arguments)
258
+ acc.arguments += tc.function.arguments;
259
+ }
260
+ }
261
+ if (chunk.usage) {
262
+ stats.promptTokens = chunk.usage.prompt_tokens ?? stats.promptTokens;
263
+ stats.completionTokens = chunk.usage.completion_tokens ?? stats.completionTokens;
264
+ stats.totalTokens = chunk.usage.total_tokens ?? stats.totalTokens;
265
+ }
266
+ }
267
+ tui.streamEnd();
268
+ }
269
+ catch (err) {
270
+ tui.streamEnd();
271
+ if (spinner)
272
+ spinner.fail('API error on turn ' + stats.turns);
273
+ if (err?.name === 'AbortError' || combinedSignal.aborted) {
274
+ if (!silent)
275
+ tui.printWarning('Turn interrupted.');
276
+ return false;
277
+ }
278
+ throw err;
279
+ }
280
+ if (spinner)
281
+ spinner.stop();
282
+ // ── Budget check ─────────────────────────────────────────────────────────
283
+ if (config.budget != null) {
284
+ const cost = estimateCost(config.model, stats.promptTokens, stats.completionTokens);
285
+ if (cost.known) {
286
+ const ratio = cost.total / config.budget;
287
+ if (ratio >= 1.0) {
288
+ if (!silent)
289
+ tui.printError('Budget exceeded: ' + formatCost(cost.total) +
290
+ ' spent of ' + formatCost(config.budget) + ' limit. Stopping.');
291
+ if (!silent && assistantContent.trim())
292
+ tui.printAssistant(assistantContent);
293
+ return false;
294
+ }
295
+ if (ratio >= 0.8 && !budgetWarned) {
296
+ if (!silent)
297
+ tui.printWarning('Budget at ' + Math.round(ratio * 100) + '%: ' +
298
+ formatCost(cost.total) + ' of ' + formatCost(config.budget) + ' used.');
299
+ budgetWarned = true;
300
+ }
301
+ }
302
+ else if (!budgetModelWarnedUnknown) {
303
+ if (!silent)
304
+ tui.printWarning(`Budget tracking unavailable: model "${config.model}" has no pricing data. --budget will not be enforced.`);
305
+ budgetModelWarnedUnknown = true;
306
+ }
307
+ }
308
+ // Only print buffered content if it wasn't already live-streamed
309
+ if (!silent && assistantContent.trim() && !tui.hadStreamOutput())
310
+ tui.printAssistant(assistantContent);
311
+ const toolCalls = Array.from(toolCallMap.entries())
312
+ .sort(([a], [b]) => a - b)
313
+ .map(([, acc]) => acc)
314
+ .filter(acc => acc.id && acc.name);
315
+ if (toolCalls.length === 0) {
316
+ // If the model gave us reasoning/thinking but no prose, request a summary
317
+ if (!assistantContent.trim() && !silent && turn > 0) {
318
+ messages.push({ role: 'assistant', content: '(completed)' });
319
+ messages.push({ role: 'user', content: 'Provide a concise summary of what you just did.' });
320
+ const summaryAbort = AbortSignal.timeout(60_000);
321
+ try {
322
+ const summaryStream = await client.chat.completions.create({
323
+ model: config.model, messages, stream: true,
324
+ max_tokens: 1024, temperature: 0.1,
325
+ tool_choice: 'none', tools: openaiTools,
326
+ }, { signal: summaryAbort });
327
+ tui.streamStart();
328
+ for await (const chunk of summaryStream) {
329
+ const c = chunk.choices[0]?.delta.content;
330
+ if (c) {
331
+ assistantContent += c;
332
+ tui.streamChunk(c);
333
+ }
334
+ }
335
+ tui.streamEnd();
336
+ }
337
+ catch { /* best-effort */ }
338
+ }
339
+ return true;
340
+ }
341
+ messages.push({
342
+ role: 'assistant',
343
+ content: assistantContent || null,
344
+ tool_calls: toolCalls.map(tc => ({
345
+ id: tc.id,
346
+ type: 'function',
347
+ function: { name: tc.name, arguments: tc.arguments },
348
+ })),
349
+ });
350
+ for (const tc of toolCalls) {
351
+ const sig = tc.name + '::' + tc.arguments;
352
+ if (seenSignatures.has(sig)) {
353
+ if (!silent)
354
+ tui.printWarning('Infinite loop — tool "' + tc.name + '" called with identical args twice. Halting.');
355
+ return false;
356
+ }
357
+ seenSignatures.add(sig);
358
+ if (!silent)
359
+ tui.printToolCall(tc.name, tc.arguments);
360
+ const toolSpinner = silent ? null : tui.startSpinner(tc.name + '…');
361
+ const toolStart = Date.now();
362
+ let result;
363
+ try {
364
+ if (tc.name.startsWith('mcp__')) {
365
+ const parts = tc.name.split('__');
366
+ const serverName = parts[1];
367
+ const toolName = parts.slice(2).join('__');
368
+ let parsed = {};
369
+ try {
370
+ parsed = JSON.parse(tc.arguments);
371
+ }
372
+ catch { /* use empty */ }
373
+ result = await callMCPTool(serverName, toolName, parsed, mcpClients);
374
+ }
375
+ else if (tc.name === 'spawn_agents') {
376
+ let parsed = { tasks: [] };
377
+ try {
378
+ parsed = JSON.parse(tc.arguments);
379
+ }
380
+ catch { /* use empty */ }
381
+ result = await handleSpawnAgents(parsed, config, effectiveCwd);
382
+ }
383
+ else if (BUILTIN_NAMES.has(tc.name)) {
384
+ result = await dispatchTool(tc.name, tc.arguments, effectiveCwd, config.requireApproval);
385
+ }
386
+ else {
387
+ result = await callPlugin(tc.name, tc.arguments, effectiveCwd, plugins);
388
+ }
389
+ }
390
+ catch (toolErr) {
391
+ result = 'ERROR: ' + (toolErr instanceof Error ? toolErr.message : String(toolErr));
392
+ if (!silent)
393
+ tui.printWarning(tc.name + ' failed: ' + result);
394
+ }
395
+ const toolElapsed = Date.now() - toolStart;
396
+ if (toolSpinner)
397
+ toolSpinner.stop();
398
+ if (!silent)
399
+ tui.printToolResult(tc.name, result, toolElapsed);
400
+ messages.push({ role: 'tool', tool_call_id: tc.id, content: result });
401
+ }
402
+ }
403
+ return false; // max turns reached
404
+ }
405
+ export async function createAgentSession(config, initialMessages) {
406
+ const client = buildClient(config);
407
+ const id = generateSessionId();
408
+ const stats = { promptTokens: 0, completionTokens: 0, totalTokens: 0, turns: 0 };
409
+ const messages = initialMessages ? [...initialMessages] : [];
410
+ if (!initialMessages) {
411
+ const [ctx, memory, project, agentInstructions] = await Promise.all([
412
+ discoverEnvironment(config.cwd),
413
+ loadMemory(config.cwd),
414
+ detectProject(config.cwd),
415
+ loadAgentInstructions(config.cwd),
416
+ ]);
417
+ messages.push({ role: 'system', content: buildSystemPrompt(ctx, memory, project, agentInstructions) });
418
+ }
419
+ // Load MCP and plugins only at top level (spawnDepth === 0)
420
+ const isTopLevel = (config.spawnDepth ?? 0) === 0;
421
+ const mcpConfig = isTopLevel ? await loadMCPConfig(config.cwd) : null;
422
+ const mcpClients = mcpConfig ? await connectMCPServers(mcpConfig) : [];
423
+ const plugins = isTopLevel ? await loadPlugins(config.cwd) : [];
424
+ const openaiTools = buildToolList(mcpClients, plugins, config);
425
+ let _completed = true;
426
+ async function send(userText, signal) {
427
+ messages.push({ role: 'user', content: userText });
428
+ const turnOffset = stats.turns;
429
+ _completed = await runReActLoop(messages, client, config, config.cwd, stats, mcpClients, plugins, openaiTools, turnOffset, signal);
430
+ return _completed;
431
+ }
432
+ return {
433
+ id,
434
+ messages,
435
+ stats,
436
+ get completed() { return _completed; },
437
+ send,
438
+ };
439
+ }
440
+ // ─── Single-task entry point ──────────────────────────────────────────────────
441
+ export async function runAgent(task, config, initialMessages) {
442
+ let effectiveCwd = config.cwd;
443
+ let worktreeInfo;
444
+ if (config.useWorktree) {
445
+ const isGit = await isGitRepo(config.cwd);
446
+ if (isGit) {
447
+ if (!config.silent)
448
+ tui.printThinking('Creating isolated git worktree...');
449
+ try {
450
+ worktreeInfo = await createWorktree(config.cwd, task.slice(0, 24));
451
+ effectiveCwd = worktreeInfo.path;
452
+ if (!config.silent)
453
+ tui.printSuccess('Worktree ready: ' + worktreeInfo.path + ' (' + worktreeInfo.branch + ')');
454
+ }
455
+ catch (err) {
456
+ if (!config.silent)
457
+ tui.printWarning('Worktree failed: ' + (err instanceof Error ? err.message : String(err)) + '. Running in place.');
458
+ }
459
+ }
460
+ else {
461
+ if (!config.silent)
462
+ tui.printWarning('--worktree requires a git repository. Running without isolation.');
463
+ }
464
+ }
465
+ const effectiveConfig = { ...config, cwd: effectiveCwd };
466
+ const session = await createAgentSession(effectiveConfig, initialMessages);
467
+ if (!config.silent) {
468
+ tui.printThinking('Starting...');
469
+ tui.printThinking('');
470
+ }
471
+ const agentStart = Date.now();
472
+ await session.send(task);
473
+ const agentElapsed = Date.now() - agentStart;
474
+ if (!config.silent) {
475
+ if (session.completed) {
476
+ tui.printSuccess('Task complete.');
477
+ }
478
+ else {
479
+ tui.printWarning('Max turns (' + config.maxTurns + ') reached — task may be incomplete.');
480
+ }
481
+ tui.printStats(session.stats, config.provider, config.model, agentElapsed);
482
+ }
483
+ await saveSession(config.cwd, session.id, {
484
+ id: session.id,
485
+ task: task.slice(0, 120),
486
+ provider: config.provider,
487
+ model: config.model,
488
+ cwd: config.cwd,
489
+ startedAt: new Date().toISOString(),
490
+ turns: session.stats.turns,
491
+ totalTokens: session.stats.totalTokens,
492
+ }, session.messages);
493
+ if (!config.silent)
494
+ tui.printThinking('Session saved: .koneck/sessions/' + session.id + '.jsonl');
495
+ await handleWorktreeCleanup(worktreeInfo, task);
496
+ return session;
497
+ }
498
+ async function handleWorktreeCleanup(info, task) {
499
+ if (!info)
500
+ return;
501
+ const shouldMerge = await tui.confirmMerge(info);
502
+ if (shouldMerge) {
503
+ tui.printSuccess(await mergeWorktree(info, 'koneck: ' + task.slice(0, 72)));
504
+ }
505
+ else {
506
+ tui.printWarning('Worktree preserved: ' + info.path);
507
+ tui.printWarning('Merge later with: git merge ' + info.branch);
508
+ }
509
+ }
510
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { AgentConfig } from './types.js';
2
+ export declare function runGenerateKoneckMd(config: AgentConfig): Promise<void>;
3
+ //# sourceMappingURL=generate-koneck-md.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-koneck-md.d.ts","sourceRoot":"","sources":["../src/generate-koneck-md.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAmE5E"}
@@ -0,0 +1,69 @@
1
+ import fs from 'fs/promises';
2
+ import path from 'path';
3
+ import chalk from 'chalk';
4
+ import readline from 'readline';
5
+ import { runAgent } from './engine.js';
6
+ import { detectProject, projectSummary } from './project.js';
7
+ export async function runGenerateKoneckMd(config) {
8
+ const outputPath = path.join(config.cwd, 'KONECK.md');
9
+ try {
10
+ await fs.access(outputPath);
11
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
12
+ const answer = await new Promise((resolve) => {
13
+ rl.question('KONECK.md already exists. Overwrite? [y/N]: ', resolve);
14
+ });
15
+ rl.close();
16
+ if (!['y', 'yes'].includes(answer.trim().toLowerCase())) {
17
+ console.log('Aborted.');
18
+ return;
19
+ }
20
+ }
21
+ catch {
22
+ }
23
+ console.log(chalk.dim(' Analyzing project structure...'));
24
+ const project = await detectProject(config.cwd);
25
+ const entries = await fs.readdir(config.cwd);
26
+ const dirListing = entries
27
+ .filter((e) => !['node_modules', '.git', 'dist'].includes(e))
28
+ .join(', ');
29
+ let readme = '';
30
+ try {
31
+ readme = await fs.readFile(path.join(config.cwd, 'README.md'), 'utf8');
32
+ }
33
+ catch {
34
+ }
35
+ const task = `Analyze this project and write a comprehensive KONECK.md file to help an AI coding agent work on it.
36
+
37
+ Write the file to KONECK.md in the project root.
38
+
39
+ The KONECK.md should include these sections:
40
+ ## Project Overview
41
+ (1-2 sentence description)
42
+
43
+ ## Tech Stack
44
+ (key technologies and versions)
45
+
46
+ ## Directory Structure
47
+ (explain key directories and files)
48
+
49
+ ## Development Commands
50
+ (how to build, test, lint, run)
51
+
52
+ ## Coding Conventions
53
+ (naming patterns, style, patterns used in this codebase)
54
+
55
+ ## Key Files
56
+ (most important files and what they do)
57
+
58
+ ## Gotchas
59
+ (non-obvious things to know — imports, build quirks, etc.)
60
+
61
+ Project info:
62
+ ${projectSummary(project)}
63
+
64
+ Top-level files/dirs: ${dirListing}
65
+ ${readme ? '\nREADME content:\n' + readme.slice(0, 2000) : ''}`;
66
+ await runAgent(task, { ...config, maxTurns: 5 });
67
+ console.log(chalk.green(' ✔ KONECK.md generated. Review and edit it to add project-specific knowledge.'));
68
+ }
69
+ //# sourceMappingURL=generate-koneck-md.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-koneck-md.js","sourceRoot":"","sources":["../src/generate-koneck-md.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG7D,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,MAAmB;IAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAEtD,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC5B,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACtF,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;YACnD,EAAE,CAAC,QAAQ,CAAC,8CAA8C,EAAE,OAAO,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACxB,OAAO;QACT,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC,CAAC;IAE3D,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAEhD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,OAAO;SACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;SAC5D,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;IACT,CAAC;IAED,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2Bb,cAAc,CAAC,OAAO,CAAC;;wBAED,UAAU;EAChC,MAAM,CAAC,CAAC,CAAC,qBAAqB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAE9D,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;IAEjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gFAAgF,CAAC,CAAC,CAAC;AAC7G,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ToolDefinition } from './types.js';
2
+ export declare const GIT_TOOL_DEFINITIONS: ToolDefinition[];
3
+ export declare function dispatchGitTool(name: string, argsJson: string, cwd: string): Promise<string>;
4
+ //# sourceMappingURL=git-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-tools.d.ts","sourceRoot":"","sources":["../src/git-tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,eAAO,MAAM,oBAAoB,EAAE,cAAc,EA0GhD,CAAC;AAEF,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA8FlG"}