concevent-ai-agent-sdk 2.2.0 → 2.3.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/README.md +279 -0
- package/dist/core/orchestrator.d.ts.map +1 -1
- package/dist/core/orchestrator.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/tools/bash-output.d.ts +19 -0
- package/dist/tools/bash-output.d.ts.map +1 -0
- package/dist/tools/bash-output.js +47 -0
- package/dist/tools/bash-output.js.map +1 -0
- package/dist/tools/bash.d.ts +25 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +79 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/edit.d.ts +28 -0
- package/dist/tools/edit.d.ts.map +1 -0
- package/dist/tools/edit.js +97 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/glob.d.ts +25 -0
- package/dist/tools/glob.d.ts.map +1 -0
- package/dist/tools/glob.js +88 -0
- package/dist/tools/glob.js.map +1 -0
- package/dist/tools/grep.d.ts +31 -0
- package/dist/tools/grep.d.ts.map +1 -0
- package/dist/tools/grep.js +195 -0
- package/dist/tools/grep.js.map +1 -0
- package/dist/tools/index.d.ts +85 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +141 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/kill-bash.d.ts +19 -0
- package/dist/tools/kill-bash.d.ts.map +1 -0
- package/dist/tools/kill-bash.js +49 -0
- package/dist/tools/kill-bash.js.map +1 -0
- package/dist/tools/read.d.ts +25 -0
- package/dist/tools/read.d.ts.map +1 -0
- package/dist/tools/read.js +103 -0
- package/dist/tools/read.js.map +1 -0
- package/dist/tools/task.d.ts +25 -0
- package/dist/tools/task.d.ts.map +1 -0
- package/dist/tools/task.js +71 -0
- package/dist/tools/task.js.map +1 -0
- package/dist/tools/todo-write.d.ts +46 -0
- package/dist/tools/todo-write.d.ts.map +1 -0
- package/dist/tools/todo-write.js +151 -0
- package/dist/tools/todo-write.js.map +1 -0
- package/dist/tools/types.d.ts +147 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +16 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/utils/index.d.ts +3 -0
- package/dist/tools/utils/index.d.ts.map +1 -0
- package/dist/tools/utils/index.js +3 -0
- package/dist/tools/utils/index.js.map +1 -0
- package/dist/tools/utils/path.d.ts +40 -0
- package/dist/tools/utils/path.d.ts.map +1 -0
- package/dist/tools/utils/path.js +146 -0
- package/dist/tools/utils/path.js.map +1 -0
- package/dist/tools/utils/shell.d.ts +49 -0
- package/dist/tools/utils/shell.d.ts.map +1 -0
- package/dist/tools/utils/shell.js +232 -0
- package/dist/tools/utils/shell.js.map +1 -0
- package/dist/tools/write.d.ts +22 -0
- package/dist/tools/write.d.ts.map +1 -0
- package/dist/tools/write.js +70 -0
- package/dist/tools/write.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import { spawn } from 'child_process';
|
|
2
|
+
import * as os from 'os';
|
|
3
|
+
/**
|
|
4
|
+
* Default dangerous command patterns that should be blocked
|
|
5
|
+
*/
|
|
6
|
+
export const DEFAULT_BLOCKED_COMMANDS = [
|
|
7
|
+
/rm\s+(-rf?|--recursive)\s+[/\\]/i, // rm -rf /
|
|
8
|
+
/rm\s+(-rf?|--recursive)\s+\*/i, // rm -rf *
|
|
9
|
+
/mkfs\./i, // mkfs commands
|
|
10
|
+
/dd\s+if=/i, // dd commands
|
|
11
|
+
/:\s*\(\s*\)\s*\{/i, // Fork bombs
|
|
12
|
+
/>\s*\/dev\/sd[a-z]/i, // Writing to block devices
|
|
13
|
+
/chmod\s+(-R\s+)?777\s+\//i, // chmod 777 /
|
|
14
|
+
/chown\s+(-R\s+)?root/i, // chown root
|
|
15
|
+
];
|
|
16
|
+
/**
|
|
17
|
+
* Gets the appropriate shell command for the current platform
|
|
18
|
+
*/
|
|
19
|
+
export function getShellCommand() {
|
|
20
|
+
const platform = os.platform();
|
|
21
|
+
if (platform === 'win32') {
|
|
22
|
+
// Use cmd.exe on Windows
|
|
23
|
+
return {
|
|
24
|
+
shell: process.env.COMSPEC || 'cmd.exe',
|
|
25
|
+
args: ['/c'],
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
// Use bash on Unix-like systems, fallback to sh
|
|
29
|
+
const shell = process.env.SHELL || '/bin/bash';
|
|
30
|
+
// Check if the shell exists, fallback to sh
|
|
31
|
+
return {
|
|
32
|
+
shell: shell.includes('bash') ? shell : '/bin/sh',
|
|
33
|
+
args: ['-c'],
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Checks if a command matches any blocked patterns
|
|
38
|
+
*/
|
|
39
|
+
export function isCommandBlocked(command, blockedPatterns) {
|
|
40
|
+
const patterns = blockedPatterns || DEFAULT_BLOCKED_COMMANDS;
|
|
41
|
+
for (const pattern of patterns) {
|
|
42
|
+
if (pattern.test(command)) {
|
|
43
|
+
return `Command blocked by security policy: matches pattern ${pattern.toString()}`;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Executes a shell command and returns the result
|
|
50
|
+
*/
|
|
51
|
+
export async function executeCommand(command, options = {}) {
|
|
52
|
+
const { cwd, timeout = 30000, env, abortSignal } = options;
|
|
53
|
+
const { shell, args } = getShellCommand();
|
|
54
|
+
return new Promise((resolve, reject) => {
|
|
55
|
+
let stdout = '';
|
|
56
|
+
let stderr = '';
|
|
57
|
+
let timedOut = false;
|
|
58
|
+
let settled = false;
|
|
59
|
+
const child = spawn(shell, [...args, command], {
|
|
60
|
+
cwd,
|
|
61
|
+
env: { ...process.env, ...env },
|
|
62
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
63
|
+
});
|
|
64
|
+
// Set up timeout
|
|
65
|
+
const timeoutId = timeout > 0
|
|
66
|
+
? setTimeout(() => {
|
|
67
|
+
if (!settled) {
|
|
68
|
+
timedOut = true;
|
|
69
|
+
child.kill('SIGTERM');
|
|
70
|
+
// Give it a moment to terminate gracefully, then force kill
|
|
71
|
+
setTimeout(() => {
|
|
72
|
+
if (!settled) {
|
|
73
|
+
child.kill('SIGKILL');
|
|
74
|
+
}
|
|
75
|
+
}, 1000);
|
|
76
|
+
}
|
|
77
|
+
}, timeout)
|
|
78
|
+
: null;
|
|
79
|
+
// Handle abort signal
|
|
80
|
+
const abortHandler = () => {
|
|
81
|
+
if (!settled) {
|
|
82
|
+
child.kill('SIGTERM');
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
if (abortSignal) {
|
|
86
|
+
abortSignal.addEventListener('abort', abortHandler, { once: true });
|
|
87
|
+
}
|
|
88
|
+
child.stdout?.on('data', (data) => {
|
|
89
|
+
stdout += data.toString();
|
|
90
|
+
});
|
|
91
|
+
child.stderr?.on('data', (data) => {
|
|
92
|
+
stderr += data.toString();
|
|
93
|
+
});
|
|
94
|
+
child.on('close', (code) => {
|
|
95
|
+
settled = true;
|
|
96
|
+
if (timeoutId)
|
|
97
|
+
clearTimeout(timeoutId);
|
|
98
|
+
if (abortSignal) {
|
|
99
|
+
abortSignal.removeEventListener('abort', abortHandler);
|
|
100
|
+
}
|
|
101
|
+
resolve({
|
|
102
|
+
stdout: stdout.trim(),
|
|
103
|
+
stderr: stderr.trim(),
|
|
104
|
+
exitCode: code ?? (timedOut ? 124 : 1),
|
|
105
|
+
timedOut,
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
child.on('error', (error) => {
|
|
109
|
+
settled = true;
|
|
110
|
+
if (timeoutId)
|
|
111
|
+
clearTimeout(timeoutId);
|
|
112
|
+
if (abortSignal) {
|
|
113
|
+
abortSignal.removeEventListener('abort', abortHandler);
|
|
114
|
+
}
|
|
115
|
+
reject(error);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Creates a ProcessManager for managing background processes
|
|
121
|
+
*/
|
|
122
|
+
export function createProcessManager() {
|
|
123
|
+
const processes = new Map();
|
|
124
|
+
return {
|
|
125
|
+
get(id) {
|
|
126
|
+
const entry = processes.get(id);
|
|
127
|
+
return entry?.info;
|
|
128
|
+
},
|
|
129
|
+
getAll() {
|
|
130
|
+
return Array.from(processes.values()).map((entry) => entry.info);
|
|
131
|
+
},
|
|
132
|
+
async kill(id) {
|
|
133
|
+
const entry = processes.get(id);
|
|
134
|
+
if (!entry) {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
if (entry.info.running) {
|
|
138
|
+
entry.process.kill('SIGTERM');
|
|
139
|
+
// Wait a moment for graceful shutdown
|
|
140
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
141
|
+
if (entry.info.running) {
|
|
142
|
+
entry.process.kill('SIGKILL');
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
processes.delete(id);
|
|
146
|
+
return true;
|
|
147
|
+
},
|
|
148
|
+
async cleanup() {
|
|
149
|
+
const ids = Array.from(processes.keys());
|
|
150
|
+
await Promise.all(ids.map((id) => this.kill(id)));
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Spawns a background process and registers it with the ProcessManager
|
|
156
|
+
*/
|
|
157
|
+
export function spawnBackgroundProcess(command, processManager, options = {}) {
|
|
158
|
+
const { cwd, env } = options;
|
|
159
|
+
const { shell, args } = getShellCommand();
|
|
160
|
+
// Generate a unique ID
|
|
161
|
+
const id = `bg_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
|
|
162
|
+
const info = {
|
|
163
|
+
id,
|
|
164
|
+
command,
|
|
165
|
+
startTime: new Date(),
|
|
166
|
+
stdout: '',
|
|
167
|
+
stderr: '',
|
|
168
|
+
exitCode: null,
|
|
169
|
+
running: true,
|
|
170
|
+
};
|
|
171
|
+
const child = spawn(shell, [...args, command], {
|
|
172
|
+
cwd,
|
|
173
|
+
env: { ...process.env, ...env },
|
|
174
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
175
|
+
detached: false,
|
|
176
|
+
});
|
|
177
|
+
child.stdout?.on('data', (data) => {
|
|
178
|
+
info.stdout += data.toString();
|
|
179
|
+
});
|
|
180
|
+
child.stderr?.on('data', (data) => {
|
|
181
|
+
info.stderr += data.toString();
|
|
182
|
+
});
|
|
183
|
+
child.on('close', (code) => {
|
|
184
|
+
info.exitCode = code;
|
|
185
|
+
info.running = false;
|
|
186
|
+
});
|
|
187
|
+
child.on('error', () => {
|
|
188
|
+
info.running = false;
|
|
189
|
+
info.exitCode = 1;
|
|
190
|
+
});
|
|
191
|
+
// Register with the process manager (internal method)
|
|
192
|
+
// We need to access the internal map through a workaround
|
|
193
|
+
// The ProcessManager returned by createProcessManager has closure access
|
|
194
|
+
processManager._processes?.set(id, { process: child, info });
|
|
195
|
+
return info;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Creates a ProcessManager with internal registration capability
|
|
199
|
+
*/
|
|
200
|
+
export function createProcessManagerWithInternal() {
|
|
201
|
+
const processes = new Map();
|
|
202
|
+
return {
|
|
203
|
+
_processes: processes,
|
|
204
|
+
get(id) {
|
|
205
|
+
const entry = processes.get(id);
|
|
206
|
+
return entry?.info;
|
|
207
|
+
},
|
|
208
|
+
getAll() {
|
|
209
|
+
return Array.from(processes.values()).map((entry) => entry.info);
|
|
210
|
+
},
|
|
211
|
+
async kill(id) {
|
|
212
|
+
const entry = processes.get(id);
|
|
213
|
+
if (!entry) {
|
|
214
|
+
return false;
|
|
215
|
+
}
|
|
216
|
+
if (entry.info.running) {
|
|
217
|
+
entry.process.kill('SIGTERM');
|
|
218
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
219
|
+
if (entry.info.running) {
|
|
220
|
+
entry.process.kill('SIGKILL');
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
processes.delete(id);
|
|
224
|
+
return true;
|
|
225
|
+
},
|
|
226
|
+
async cleanup() {
|
|
227
|
+
const ids = Array.from(processes.keys());
|
|
228
|
+
await Promise.all(ids.map((id) => this.kill(id)));
|
|
229
|
+
},
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=shell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../../src/tools/utils/shell.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { ToolDefinition } from '../types/index.js';
|
|
3
|
+
import type { ToolConfig } from './types.js';
|
|
4
|
+
/**
|
|
5
|
+
* Schema for the Write tool parameters
|
|
6
|
+
*/
|
|
7
|
+
export declare const writeSchema: z.ZodObject<{
|
|
8
|
+
file_path: z.ZodString;
|
|
9
|
+
content: z.ZodString;
|
|
10
|
+
}, "strip", z.ZodTypeAny, {
|
|
11
|
+
content: string;
|
|
12
|
+
file_path: string;
|
|
13
|
+
}, {
|
|
14
|
+
content: string;
|
|
15
|
+
file_path: string;
|
|
16
|
+
}>;
|
|
17
|
+
export type WriteParams = z.infer<typeof writeSchema>;
|
|
18
|
+
/**
|
|
19
|
+
* Creates the Write tool for creating or overwriting files
|
|
20
|
+
*/
|
|
21
|
+
export declare function createWriteTool(config?: ToolConfig): ToolDefinition;
|
|
22
|
+
//# sourceMappingURL=write.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/tools/write.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C;;GAEG;AACH,eAAO,MAAM,WAAW;;;;;;;;;EAOtB,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEtD;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,GAAE,UAAe,GAAG,cAAc,CAwDvE"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import * as fs from 'fs/promises';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { zodToJsonSchema } from 'zod-to-json-schema';
|
|
5
|
+
import { resolvePath, isPathAllowed, isPathSafe, ensureDirectory } from './utils/path.js';
|
|
6
|
+
/**
|
|
7
|
+
* Schema for the Write tool parameters
|
|
8
|
+
*/
|
|
9
|
+
export const writeSchema = z.object({
|
|
10
|
+
file_path: z
|
|
11
|
+
.string()
|
|
12
|
+
.describe('The path to the file to write. Can be absolute or relative to working directory.'),
|
|
13
|
+
content: z
|
|
14
|
+
.string()
|
|
15
|
+
.describe('The content to write to the file. This will overwrite any existing content.'),
|
|
16
|
+
});
|
|
17
|
+
/**
|
|
18
|
+
* Creates the Write tool for creating or overwriting files
|
|
19
|
+
*/
|
|
20
|
+
export function createWriteTool(config = {}) {
|
|
21
|
+
const workingDirectory = config.workingDirectory || process.cwd();
|
|
22
|
+
return {
|
|
23
|
+
declaration: {
|
|
24
|
+
name: 'Write',
|
|
25
|
+
description: `Creates a new file or overwrites an existing file with the specified content.
|
|
26
|
+
Parent directories are created automatically if they don't exist.
|
|
27
|
+
WARNING: This will completely overwrite existing file contents.`,
|
|
28
|
+
parametersJsonSchema: zodToJsonSchema(writeSchema),
|
|
29
|
+
},
|
|
30
|
+
executor: async (args) => {
|
|
31
|
+
const params = writeSchema.parse(args);
|
|
32
|
+
const resolvedPath = resolvePath(params.file_path, workingDirectory);
|
|
33
|
+
// Security checks
|
|
34
|
+
if (!isPathSafe(params.file_path, workingDirectory)) {
|
|
35
|
+
throw new Error(`Path traversal detected: ${params.file_path}`);
|
|
36
|
+
}
|
|
37
|
+
if (!isPathAllowed(resolvedPath, config.allowedPaths)) {
|
|
38
|
+
throw new Error(`Access denied: ${params.file_path} is outside allowed paths`);
|
|
39
|
+
}
|
|
40
|
+
// Check if it's a directory
|
|
41
|
+
try {
|
|
42
|
+
const stat = await fs.stat(resolvedPath);
|
|
43
|
+
if (stat.isDirectory()) {
|
|
44
|
+
throw new Error(`Cannot write to a directory: ${params.file_path}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
// File doesn't exist yet, that's fine
|
|
49
|
+
if (error.code !== 'ENOENT') {
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Ensure parent directory exists
|
|
54
|
+
const parentDir = path.dirname(resolvedPath);
|
|
55
|
+
await ensureDirectory(parentDir);
|
|
56
|
+
// Write the file
|
|
57
|
+
await fs.writeFile(resolvedPath, params.content, 'utf-8');
|
|
58
|
+
// Get file stats for confirmation
|
|
59
|
+
const stat = await fs.stat(resolvedPath);
|
|
60
|
+
return {
|
|
61
|
+
success: true,
|
|
62
|
+
file_path: params.file_path,
|
|
63
|
+
bytes_written: stat.size,
|
|
64
|
+
message: `Successfully wrote ${stat.size} bytes to ${params.file_path}`,
|
|
65
|
+
};
|
|
66
|
+
},
|
|
67
|
+
parallel: false, // Writing should be sequential to avoid conflicts
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=write.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/tools/write.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE1F;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,QAAQ,CAAC,kFAAkF,CAAC;IAC/F,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,CAAC,6EAA6E,CAAC;CAC3F,CAAC,CAAC;AAIH;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,SAAqB,EAAE;IACrD,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAElE,OAAO;QACL,WAAW,EAAE;YACX,IAAI,EAAE,OAAO;YACb,WAAW,EAAE;;gEAE6C;YAC1D,oBAAoB,EAAE,eAAe,CAAC,WAAW,CAAC;SACnD;QACD,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACvB,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;YAErE,kBAAkB;YAClB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,EAAE,gBAAgB,CAAC,EAAE,CAAC;gBACpD,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;YAClE,CAAC;YAED,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;gBACtD,MAAM,IAAI,KAAK,CAAC,kBAAkB,MAAM,CAAC,SAAS,2BAA2B,CAAC,CAAC;YACjF,CAAC;YAED,4BAA4B;YAC5B,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACzC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;oBACvB,MAAM,IAAI,KAAK,CAAC,gCAAgC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;gBACtE,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,sCAAsC;gBACtC,IAAK,KAA2B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACnD,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;YAED,iCAAiC;YACjC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YAC7C,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;YAEjC,iBAAiB;YACjB,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAE1D,kCAAkC;YAClC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAEzC,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,aAAa,EAAE,IAAI,CAAC,IAAI;gBACxB,OAAO,EAAE,sBAAsB,IAAI,CAAC,IAAI,aAAa,MAAM,CAAC,SAAS,EAAE;aACxE,CAAC;QACJ,CAAC;QACD,QAAQ,EAAE,KAAK,EAAE,kDAAkD;KACpE,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "concevent-ai-agent-sdk",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.0",
|
|
4
4
|
"description": "Framework-agnostic AI Agent SDK with tool calling, conversation management, and automatic summarization",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"typecheck": "tsc --noEmit",
|
|
25
25
|
"format": "prettier --write .",
|
|
26
26
|
"format:check": "prettier --check .",
|
|
27
|
-
"prepublishOnly": "npm install && npm run build && npm run test"
|
|
27
|
+
"prepublishOnly": "npm install && npm run build && npm run test && npm run format:check"
|
|
28
28
|
},
|
|
29
29
|
"keywords": [
|
|
30
30
|
"ai",
|