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.
- package/LICENSE +21 -0
- package/README.md +109 -0
- package/dist/astValidator.d.ts +6 -0
- package/dist/astValidator.d.ts.map +1 -0
- package/dist/astValidator.js +57 -0
- package/dist/astValidator.js.map +1 -0
- package/dist/chat.d.ts +3 -0
- package/dist/chat.d.ts.map +1 -0
- package/dist/chat.js +205 -0
- package/dist/chat.js.map +1 -0
- package/dist/completion.d.ts +2 -0
- package/dist/completion.d.ts.map +1 -0
- package/dist/completion.js +137 -0
- package/dist/completion.js.map +1 -0
- package/dist/compressor.d.ts +9 -0
- package/dist/compressor.d.ts.map +1 -0
- package/dist/compressor.js +71 -0
- package/dist/compressor.js.map +1 -0
- package/dist/config.d.ts +14 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +40 -0
- package/dist/config.js.map +1 -0
- package/dist/doctor.d.ts +2 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +99 -0
- package/dist/doctor.js.map +1 -0
- package/dist/engine.d.ts +11 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +510 -0
- package/dist/engine.js.map +1 -0
- package/dist/generate-koneck-md.d.ts +3 -0
- package/dist/generate-koneck-md.d.ts.map +1 -0
- package/dist/generate-koneck-md.js +69 -0
- package/dist/generate-koneck-md.js.map +1 -0
- package/dist/git-tools.d.ts +4 -0
- package/dist/git-tools.d.ts.map +1 -0
- package/dist/git-tools.js +206 -0
- package/dist/git-tools.js.map +1 -0
- package/dist/highlight.d.ts +3 -0
- package/dist/highlight.d.ts.map +1 -0
- package/dist/highlight.js +139 -0
- package/dist/highlight.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +448 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +9 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +93 -0
- package/dist/init.js.map +1 -0
- package/dist/mcp.d.ts +24 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +75 -0
- package/dist/mcp.js.map +1 -0
- package/dist/memory.d.ts +3 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +18 -0
- package/dist/memory.js.map +1 -0
- package/dist/plugins.d.ts +9 -0
- package/dist/plugins.d.ts.map +1 -0
- package/dist/plugins.js +60 -0
- package/dist/plugins.js.map +1 -0
- package/dist/pricing.d.ts +9 -0
- package/dist/pricing.d.ts.map +1 -0
- package/dist/pricing.js +84 -0
- package/dist/pricing.js.map +1 -0
- package/dist/project.d.ts +14 -0
- package/dist/project.d.ts.map +1 -0
- package/dist/project.js +151 -0
- package/dist/project.js.map +1 -0
- package/dist/providers.d.ts +13 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/providers.js +130 -0
- package/dist/providers.js.map +1 -0
- package/dist/session.d.ts +19 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +71 -0
- package/dist/session.js.map +1 -0
- package/dist/setup.d.ts +4 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +63 -0
- package/dist/setup.js.map +1 -0
- package/dist/stats.d.ts +2 -0
- package/dist/stats.d.ts.map +1 -0
- package/dist/stats.js +81 -0
- package/dist/stats.js.map +1 -0
- package/dist/tools.d.ts +17 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +713 -0
- package/dist/tools.js.map +1 -0
- package/dist/tui.d.ts +38 -0
- package/dist/tui.d.ts.map +1 -0
- package/dist/tui.js +364 -0
- package/dist/tui.js.map +1 -0
- package/dist/types.d.ts +158 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/watch.d.ts +3 -0
- package/dist/watch.d.ts.map +1 -0
- package/dist/watch.js +68 -0
- package/dist/watch.js.map +1 -0
- package/dist/worktree.d.ts +8 -0
- package/dist/worktree.d.ts.map +1 -0
- package/dist/worktree.js +94 -0
- package/dist/worktree.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
const CHARS_PER_TOKEN = 4;
|
|
2
|
+
const COMPRESSION_THRESHOLD = 80_000;
|
|
3
|
+
const KEEP_RECENT_MESSAGES = 12;
|
|
4
|
+
function estimateTokens(messages) {
|
|
5
|
+
return messages.reduce((total, msg) => {
|
|
6
|
+
let text = '';
|
|
7
|
+
if (typeof msg.content === 'string') {
|
|
8
|
+
text = msg.content;
|
|
9
|
+
}
|
|
10
|
+
else if (Array.isArray(msg.content)) {
|
|
11
|
+
text = msg.content
|
|
12
|
+
.map(c => (typeof c === 'object' && 'text' in c ? c.text : ''))
|
|
13
|
+
.join('');
|
|
14
|
+
}
|
|
15
|
+
if ('tool_calls' in msg && Array.isArray(msg.tool_calls)) {
|
|
16
|
+
text += msg.tool_calls.map(tc => tc.function.arguments).join('');
|
|
17
|
+
}
|
|
18
|
+
return total + Math.ceil(text.length / CHARS_PER_TOKEN);
|
|
19
|
+
}, 0);
|
|
20
|
+
}
|
|
21
|
+
function renderForSummary(messages) {
|
|
22
|
+
return messages
|
|
23
|
+
.map(m => {
|
|
24
|
+
const role = m.role.toUpperCase();
|
|
25
|
+
const content = typeof m.content === 'string'
|
|
26
|
+
? m.content.slice(0, 600)
|
|
27
|
+
: JSON.stringify(m.content).slice(0, 600);
|
|
28
|
+
return `[${role}]: ${content}`;
|
|
29
|
+
})
|
|
30
|
+
.join('\n---\n');
|
|
31
|
+
}
|
|
32
|
+
export async function compressIfNeeded(messages, client, model) {
|
|
33
|
+
if (estimateTokens(messages) < COMPRESSION_THRESHOLD) {
|
|
34
|
+
return { messages, compressed: false };
|
|
35
|
+
}
|
|
36
|
+
// Always keep: system prompt + first user message + last N messages
|
|
37
|
+
const head = messages.slice(0, 2);
|
|
38
|
+
const tail = messages.slice(-KEEP_RECENT_MESSAGES);
|
|
39
|
+
const middle = messages.slice(2, -KEEP_RECENT_MESSAGES);
|
|
40
|
+
if (middle.length === 0) {
|
|
41
|
+
return { messages, compressed: false };
|
|
42
|
+
}
|
|
43
|
+
const historyText = renderForSummary(middle);
|
|
44
|
+
try {
|
|
45
|
+
const response = await client.chat.completions.create({
|
|
46
|
+
model,
|
|
47
|
+
messages: [
|
|
48
|
+
{
|
|
49
|
+
role: 'user',
|
|
50
|
+
content: `Summarize this agent conversation history. Preserve: files modified, ` +
|
|
51
|
+
`commands run, key findings, errors, decisions. Omit verbose file dumps.\n\n` +
|
|
52
|
+
historyText,
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
max_tokens: 1024,
|
|
56
|
+
temperature: 0,
|
|
57
|
+
});
|
|
58
|
+
const summary = response.choices[0]?.message?.content ?? '(unavailable)';
|
|
59
|
+
const summaryMsg = {
|
|
60
|
+
role: 'assistant',
|
|
61
|
+
content: `[COMPRESSED HISTORY — ${middle.length} messages]\n${summary}`,
|
|
62
|
+
};
|
|
63
|
+
return { messages: [...head, summaryMsg, ...tail], compressed: true };
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// If summarisation fails, just drop the middle — tail + head is still coherent
|
|
67
|
+
return { messages: [...head, ...tail], compressed: true };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
export { estimateTokens };
|
|
71
|
+
//# sourceMappingURL=compressor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compressor.js","sourceRoot":"","sources":["../src/compressor.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface KoneckFileConfig {
|
|
2
|
+
provider?: string;
|
|
3
|
+
model?: string;
|
|
4
|
+
maxTurns?: number;
|
|
5
|
+
requireApproval?: boolean;
|
|
6
|
+
useWorktree?: boolean;
|
|
7
|
+
baseURL?: string;
|
|
8
|
+
apiKey?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function globalConfigPath(): string;
|
|
11
|
+
export declare function loadGlobalConfig(): Promise<KoneckFileConfig>;
|
|
12
|
+
export declare function saveGlobalConfig(cfg: KoneckFileConfig): Promise<void>;
|
|
13
|
+
export declare function loadConfig(startDir: string): Promise<KoneckFileConfig>;
|
|
14
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAID,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAOlE;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3E;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAmB5E"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import fs from 'fs/promises';
|
|
2
|
+
import os from 'os';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
const CONFIG_FILENAMES = ['.koneckrc', '.koneckrc.json', 'koneck.config.json'];
|
|
5
|
+
export function globalConfigPath() {
|
|
6
|
+
return path.join(os.homedir(), '.koneckrc');
|
|
7
|
+
}
|
|
8
|
+
export async function loadGlobalConfig() {
|
|
9
|
+
try {
|
|
10
|
+
const raw = await fs.readFile(globalConfigPath(), 'utf-8');
|
|
11
|
+
return JSON.parse(raw);
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return {};
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export async function saveGlobalConfig(cfg) {
|
|
18
|
+
await fs.writeFile(globalConfigPath(), JSON.stringify(cfg, null, 2) + '\n', 'utf-8');
|
|
19
|
+
}
|
|
20
|
+
export async function loadConfig(startDir) {
|
|
21
|
+
let dir = path.resolve(startDir);
|
|
22
|
+
const root = path.parse(dir).root;
|
|
23
|
+
while (true) {
|
|
24
|
+
for (const filename of CONFIG_FILENAMES) {
|
|
25
|
+
try {
|
|
26
|
+
const raw = await fs.readFile(path.join(dir, filename), 'utf-8');
|
|
27
|
+
return JSON.parse(raw);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// file missing or malformed — keep walking up
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (dir === root)
|
|
34
|
+
break;
|
|
35
|
+
dir = path.dirname(dir);
|
|
36
|
+
}
|
|
37
|
+
// Fall back to global ~/.koneckrc
|
|
38
|
+
return loadGlobalConfig();
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAYxB,MAAM,gBAAgB,GAAG,CAAC,WAAW,EAAE,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;AAE/E,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,OAAO,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAqB,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAqB;IAC1D,MAAM,EAAE,CAAC,SAAS,CAAC,gBAAgB,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;IAElC,OAAO,IAAI,EAAE,CAAC;QACZ,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE,CAAC;YACxC,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;gBACjE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAqB,CAAC;YAC7C,CAAC;YAAC,MAAM,CAAC;gBACP,8CAA8C;YAChD,CAAC;QACH,CAAC;QACD,IAAI,GAAG,KAAK,IAAI;YAAE,MAAM;QACxB,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,kCAAkC;IAClC,OAAO,gBAAgB,EAAE,CAAC;AAC5B,CAAC"}
|
package/dist/doctor.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AA0BA,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6F1D"}
|
package/dist/doctor.js
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { execa } from 'execa';
|
|
3
|
+
import fs from 'fs/promises';
|
|
4
|
+
import os from 'os';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import { PROVIDERS } from './providers.js';
|
|
7
|
+
import { loadGlobalConfig } from './config.js';
|
|
8
|
+
function printResult(r) {
|
|
9
|
+
if (r.status === 'pass') {
|
|
10
|
+
console.log(chalk.green(` ✔ ${r.name}`));
|
|
11
|
+
}
|
|
12
|
+
else if (r.status === 'warn') {
|
|
13
|
+
console.log(chalk.yellow(` ⚠ ${r.name}: ${r.reason}`));
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
console.log(chalk.red(` ✗ ${r.name}: ${r.reason}`));
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export async function runDoctor(cwd) {
|
|
20
|
+
console.log(chalk.bold(`\nKONECK Doctor\n${'─'.repeat(40)}\n`));
|
|
21
|
+
const results = [];
|
|
22
|
+
const nodeVersion = parseInt(process.version.slice(1), 10);
|
|
23
|
+
results.push(nodeVersion >= 20
|
|
24
|
+
? { status: 'pass', name: 'Node.js version' }
|
|
25
|
+
: { status: 'fail', name: 'Node.js version', reason: `${process.version} — need >= 20` });
|
|
26
|
+
try {
|
|
27
|
+
await fs.readFile(path.join(os.homedir(), '.koneckrc'), 'utf-8');
|
|
28
|
+
results.push({ status: 'pass', name: 'Global config (~/.koneckrc)' });
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
results.push({ status: 'warn', name: 'Global config (~/.koneckrc)', reason: 'first-run setup not done' });
|
|
32
|
+
}
|
|
33
|
+
const globalConfig = await loadGlobalConfig();
|
|
34
|
+
results.push(globalConfig.provider
|
|
35
|
+
? { status: 'pass', name: 'Provider configured' }
|
|
36
|
+
: { status: 'warn', name: 'Provider configured', reason: 'no provider set in config' });
|
|
37
|
+
const provider = globalConfig.provider?.toLowerCase() ?? '';
|
|
38
|
+
const providerDef = PROVIDERS[provider];
|
|
39
|
+
let apiKeyFound = false;
|
|
40
|
+
if (provider === 'omni') {
|
|
41
|
+
apiKeyFound = !!(process.env['OMNI_ROUTE_API_KEY'] ?? process.env['KONECK_API_KEY']);
|
|
42
|
+
}
|
|
43
|
+
else if (providerDef) {
|
|
44
|
+
apiKeyFound = !!(process.env[providerDef.apiKeyEnv] ?? process.env['KONECK_API_KEY']);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
apiKeyFound = !!process.env['KONECK_API_KEY'];
|
|
48
|
+
}
|
|
49
|
+
results.push(apiKeyFound
|
|
50
|
+
? { status: 'pass', name: 'API key' }
|
|
51
|
+
: { status: 'warn', name: 'API key', reason: 'no API key found in environment' });
|
|
52
|
+
try {
|
|
53
|
+
await execa('git', ['--version']);
|
|
54
|
+
results.push({ status: 'pass', name: 'git available' });
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
results.push({ status: 'fail', name: 'git available', reason: 'git not found' });
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
await execa('gh', ['--version']);
|
|
61
|
+
results.push({ status: 'pass', name: 'gh CLI available' });
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
results.push({ status: 'warn', name: 'gh CLI available', reason: 'gh CLI not found — needed for --pr flag' });
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
await fs.access(path.join(cwd, '.koneck'));
|
|
68
|
+
results.push({ status: 'pass', name: '.koneck/ directory' });
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
results.push({ status: 'warn', name: '.koneck/ directory', reason: 'directory not found' });
|
|
72
|
+
}
|
|
73
|
+
const instructionFiles = ['KONECK.md', 'AGENTS.md', 'CLAUDE.md'];
|
|
74
|
+
let foundInstructions = false;
|
|
75
|
+
for (const file of instructionFiles) {
|
|
76
|
+
try {
|
|
77
|
+
await fs.access(path.join(cwd, file));
|
|
78
|
+
foundInstructions = true;
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// continue
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
results.push(foundInstructions
|
|
86
|
+
? { status: 'pass', name: 'Agent instructions' }
|
|
87
|
+
: { status: 'warn', name: 'Agent instructions', reason: 'No KONECK.md found — run `koneck setup` to generate one' });
|
|
88
|
+
for (const r of results) {
|
|
89
|
+
printResult(r);
|
|
90
|
+
}
|
|
91
|
+
const passed = results.filter(r => r.status === 'pass').length;
|
|
92
|
+
const warnings = results.filter(r => r.status === 'warn').length;
|
|
93
|
+
const failed = results.filter(r => r.status === 'fail').length;
|
|
94
|
+
console.log(`\n ${passed} passed, ${warnings} warnings, ${failed} failed\n`);
|
|
95
|
+
if (failed > 0) {
|
|
96
|
+
process.exitCode = 1;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
|
package/dist/engine.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Message, AgentConfig, TokenStats } from './types.js';
|
|
2
|
+
export interface AgentSession {
|
|
3
|
+
readonly id: string;
|
|
4
|
+
readonly messages: Message[];
|
|
5
|
+
readonly stats: TokenStats;
|
|
6
|
+
readonly completed: boolean;
|
|
7
|
+
send(userText: string, signal?: AbortSignal): Promise<boolean>;
|
|
8
|
+
}
|
|
9
|
+
export declare function createAgentSession(config: AgentConfig, initialMessages?: Message[]): Promise<AgentSession>;
|
|
10
|
+
export declare function runAgent(task: string, config: AgentConfig, initialMessages?: Message[]): Promise<AgentSession>;
|
|
11
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EACV,OAAO,EACP,WAAW,EAEX,UAAU,EAIX,MAAM,YAAY,CAAC;AAubpB,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAChE;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,WAAW,EACnB,eAAe,CAAC,EAAE,OAAO,EAAE,GAC1B,OAAO,CAAC,YAAY,CAAC,CA2CvB;AAID,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,WAAW,EACnB,eAAe,CAAC,EAAE,OAAO,EAAE,GAC1B,OAAO,CAAC,YAAY,CAAC,CAwDvB"}
|