@oflow-ai/core 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 (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +81 -0
  3. package/dist/agents/index.d.ts +35 -0
  4. package/dist/agents/index.js +233 -0
  5. package/dist/ai/chinese-provider.d.ts +146 -0
  6. package/dist/ai/chinese-provider.js +193 -0
  7. package/dist/ai/custom-provider.d.ts +11 -0
  8. package/dist/ai/custom-provider.js +113 -0
  9. package/dist/ai/index.d.ts +7 -0
  10. package/dist/ai/index.js +42 -0
  11. package/dist/ai/openai-provider.d.ts +18 -0
  12. package/dist/ai/openai-provider.js +161 -0
  13. package/dist/config/index.d.ts +20 -0
  14. package/dist/config/index.js +83 -0
  15. package/dist/conversation.d.ts +26 -0
  16. package/dist/conversation.js +126 -0
  17. package/dist/index.d.ts +10 -0
  18. package/dist/index.js +72 -0
  19. package/dist/mcp/index.d.ts +48 -0
  20. package/dist/mcp/index.js +175 -0
  21. package/dist/sandbox/index.d.ts +31 -0
  22. package/dist/sandbox/index.js +197 -0
  23. package/dist/skills/index.d.ts +16 -0
  24. package/dist/skills/index.js +169 -0
  25. package/dist/tools/ask-user-question.d.ts +62 -0
  26. package/dist/tools/ask-user-question.js +71 -0
  27. package/dist/tools/base.d.ts +16 -0
  28. package/dist/tools/base.js +39 -0
  29. package/dist/tools/glob.d.ts +27 -0
  30. package/dist/tools/glob.js +125 -0
  31. package/dist/tools/image-read.d.ts +42 -0
  32. package/dist/tools/image-read.js +125 -0
  33. package/dist/tools/index.d.ts +27 -0
  34. package/dist/tools/index.js +127 -0
  35. package/dist/tools/list-directory.d.ts +28 -0
  36. package/dist/tools/list-directory.js +94 -0
  37. package/dist/tools/pdf-extract.d.ts +32 -0
  38. package/dist/tools/pdf-extract.js +130 -0
  39. package/dist/tools/read-file.d.ts +31 -0
  40. package/dist/tools/read-file.js +116 -0
  41. package/dist/tools/replace.d.ts +35 -0
  42. package/dist/tools/replace.js +93 -0
  43. package/dist/tools/run-shell-command.d.ts +35 -0
  44. package/dist/tools/run-shell-command.js +81 -0
  45. package/dist/tools/save-memory.d.ts +22 -0
  46. package/dist/tools/save-memory.js +91 -0
  47. package/dist/tools/search-file-content.d.ts +42 -0
  48. package/dist/tools/search-file-content.js +153 -0
  49. package/dist/tools/task.d.ts +46 -0
  50. package/dist/tools/task.js +54 -0
  51. package/dist/tools/web-fetch.d.ts +26 -0
  52. package/dist/tools/web-fetch.js +81 -0
  53. package/dist/tools/web-search.d.ts +35 -0
  54. package/dist/tools/web-search.js +86 -0
  55. package/dist/tools/write-file.d.ts +25 -0
  56. package/dist/tools/write-file.js +76 -0
  57. package/dist/types/index.d.ts +166 -0
  58. package/dist/types/index.js +43 -0
  59. package/package.json +54 -0
@@ -0,0 +1,20 @@
1
+ import { Config, AuthConfig } from '../types';
2
+ export declare class ConfigManager {
3
+ private config;
4
+ constructor();
5
+ get<K extends keyof Config>(key: K): Config[K];
6
+ set<K extends keyof Config>(key: K, value: Config[K]): void;
7
+ getAll(): Config;
8
+ setAll(config: Partial<Config>): void;
9
+ clear(): void;
10
+ getAuth(): AuthConfig | undefined;
11
+ setAuth(auth: AuthConfig): void;
12
+ isAuthenticated(): boolean;
13
+ getDefaultModel(): string;
14
+ setDefaultModel(model: string): void;
15
+ getShowThinking(): boolean;
16
+ setShowThinking(show: boolean): void;
17
+ toggleShowThinking(): boolean;
18
+ getConfigPath(): string;
19
+ }
20
+ export declare function getConfigManager(): ConfigManager;
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ConfigManager = void 0;
7
+ exports.getConfigManager = getConfigManager;
8
+ const conf_1 = __importDefault(require("conf"));
9
+ const DEFAULT_CONFIG = {
10
+ defaultModel: 'gpt-4o',
11
+ maxTokens: 4096,
12
+ temperature: 0.7,
13
+ sandbox: false,
14
+ showThinking: false, // 默认不显示思考过程
15
+ mcpServers: {}
16
+ };
17
+ class ConfigManager {
18
+ config;
19
+ constructor() {
20
+ this.config = new conf_1.default({
21
+ projectName: 'oflow',
22
+ defaults: DEFAULT_CONFIG
23
+ });
24
+ }
25
+ get(key) {
26
+ return this.config.get(key);
27
+ }
28
+ set(key, value) {
29
+ this.config.set(key, value);
30
+ }
31
+ getAll() {
32
+ return this.config.store;
33
+ }
34
+ setAll(config) {
35
+ for (const [key, value] of Object.entries(config)) {
36
+ this.config.set(key, value);
37
+ }
38
+ }
39
+ clear() {
40
+ this.config.clear();
41
+ }
42
+ getAuth() {
43
+ return this.config.get('auth');
44
+ }
45
+ setAuth(auth) {
46
+ this.config.set('auth', auth);
47
+ }
48
+ isAuthenticated() {
49
+ const auth = this.getAuth();
50
+ return !!(auth?.apiKey);
51
+ }
52
+ getDefaultModel() {
53
+ return this.config.get('defaultModel') || 'gpt-4o';
54
+ }
55
+ setDefaultModel(model) {
56
+ this.config.set('defaultModel', model);
57
+ }
58
+ // 思考过程显示控制
59
+ getShowThinking() {
60
+ return this.config.get('showThinking') ?? false;
61
+ }
62
+ setShowThinking(show) {
63
+ this.config.set('showThinking', show);
64
+ }
65
+ toggleShowThinking() {
66
+ const current = this.getShowThinking();
67
+ this.setShowThinking(!current);
68
+ return !current;
69
+ }
70
+ getConfigPath() {
71
+ return this.config.path;
72
+ }
73
+ }
74
+ exports.ConfigManager = ConfigManager;
75
+ // Singleton instance
76
+ let configManager = null;
77
+ function getConfigManager() {
78
+ if (!configManager) {
79
+ configManager = new ConfigManager();
80
+ }
81
+ return configManager;
82
+ }
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQXdGQSw0Q0FLQztBQTdGRCxnREFBd0I7QUFHeEIsTUFBTSxjQUFjLEdBQW9CO0lBQ3RDLFlBQVksRUFBRSxRQUFRO0lBQ3RCLFNBQVMsRUFBRSxJQUFJO0lBQ2YsV0FBVyxFQUFFLEdBQUc7SUFDaEIsT0FBTyxFQUFFLEtBQUs7SUFDZCxZQUFZLEVBQUUsS0FBSyxFQUFFLFlBQVk7SUFDakMsVUFBVSxFQUFFLEVBQUU7Q0FDZixDQUFDO0FBRUYsTUFBYSxhQUFhO0lBQ2hCLE1BQU0sQ0FBZTtJQUU3QjtRQUNFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxjQUFJLENBQVM7WUFDN0IsV0FBVyxFQUFFLE9BQU87WUFDcEIsUUFBUSxFQUFFLGNBQXdCO1NBQ25DLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxHQUFHLENBQXlCLEdBQU07UUFDaEMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsR0FBRyxDQUF5QixHQUFNLEVBQUUsS0FBZ0I7UUFDbEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxNQUFNO1FBQ0osT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztJQUMzQixDQUFDO0lBRUQsTUFBTSxDQUFDLE1BQXVCO1FBQzVCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDbEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBbUIsRUFBRSxLQUE2QixDQUFDLENBQUM7UUFDdEUsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsT0FBTztRQUNMLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELE9BQU8sQ0FBQyxJQUFnQjtRQUN0QixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELGVBQWU7UUFDYixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDNUIsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELGVBQWU7UUFDYixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFJLFFBQVEsQ0FBQztJQUNyRCxDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQWE7UUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxXQUFXO0lBQ1gsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLElBQUksS0FBSyxDQUFDO0lBQ2xELENBQUM7SUFFRCxlQUFlLENBQUMsSUFBYTtRQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9CLE9BQU8sQ0FBQyxPQUFPLENBQUM7SUFDbEIsQ0FBQztJQUVELGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQzFCLENBQUM7Q0FDRjtBQXZFRCxzQ0F1RUM7QUFFRCxxQkFBcUI7QUFDckIsSUFBSSxhQUFhLEdBQXlCLElBQUksQ0FBQztBQUUvQyxTQUFnQixnQkFBZ0I7SUFDOUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ25CLGFBQWEsR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFDRCxPQUFPLGFBQWEsQ0FBQztBQUN2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IENvbmYgZnJvbSAnY29uZic7XG5pbXBvcnQgeyBDb25maWcsIEF1dGhDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5cbmNvbnN0IERFRkFVTFRfQ09ORklHOiBQYXJ0aWFsPENvbmZpZz4gPSB7XG4gIGRlZmF1bHRNb2RlbDogJ2dwdC00bycsXG4gIG1heFRva2VuczogNDA5NixcbiAgdGVtcGVyYXR1cmU6IDAuNyxcbiAgc2FuZGJveDogZmFsc2UsXG4gIHNob3dUaGlua2luZzogZmFsc2UsIC8vIOm7mOiupOS4jeaYvuekuuaAneiAg+i/h+eoi1xuICBtY3BTZXJ2ZXJzOiB7fVxufTtcblxuZXhwb3J0IGNsYXNzIENvbmZpZ01hbmFnZXIge1xuICBwcml2YXRlIGNvbmZpZzogQ29uZjxDb25maWc+O1xuICBcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jb25maWcgPSBuZXcgQ29uZjxDb25maWc+KHtcbiAgICAgIHByb2plY3ROYW1lOiAnb2Zsb3cnLFxuICAgICAgZGVmYXVsdHM6IERFRkFVTFRfQ09ORklHIGFzIENvbmZpZ1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0PEsgZXh0ZW5kcyBrZXlvZiBDb25maWc+KGtleTogSyk6IENvbmZpZ1tLXSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmdldChrZXkpO1xuICB9XG5cbiAgc2V0PEsgZXh0ZW5kcyBrZXlvZiBDb25maWc+KGtleTogSywgdmFsdWU6IENvbmZpZ1tLXSk6IHZvaWQge1xuICAgIHRoaXMuY29uZmlnLnNldChrZXksIHZhbHVlKTtcbiAgfVxuXG4gIGdldEFsbCgpOiBDb25maWcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5zdG9yZTtcbiAgfVxuXG4gIHNldEFsbChjb25maWc6IFBhcnRpYWw8Q29uZmlnPik6IHZvaWQge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZykpIHtcbiAgICAgIHRoaXMuY29uZmlnLnNldChrZXkgYXMga2V5b2YgQ29uZmlnLCB2YWx1ZSBhcyBDb25maWdba2V5b2YgQ29uZmlnXSk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWcuY2xlYXIoKTtcbiAgfVxuXG4gIGdldEF1dGgoKTogQXV0aENvbmZpZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmdldCgnYXV0aCcpO1xuICB9XG5cbiAgc2V0QXV0aChhdXRoOiBBdXRoQ29uZmlnKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWcuc2V0KCdhdXRoJywgYXV0aCk7XG4gIH1cblxuICBpc0F1dGhlbnRpY2F0ZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYXV0aCA9IHRoaXMuZ2V0QXV0aCgpO1xuICAgIHJldHVybiAhIShhdXRoPy5hcGlLZXkpO1xuICB9XG5cbiAgZ2V0RGVmYXVsdE1vZGVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmdldCgnZGVmYXVsdE1vZGVsJykgfHwgJ2dwdC00byc7XG4gIH1cblxuICBzZXREZWZhdWx0TW9kZWwobW9kZWw6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY29uZmlnLnNldCgnZGVmYXVsdE1vZGVsJywgbW9kZWwpO1xuICB9XG5cbiAgLy8g5oCd6ICD6L+H56iL5pi+56S65o6n5Yi2XG4gIGdldFNob3dUaGlua2luZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZ2V0KCdzaG93VGhpbmtpbmcnKSA/PyBmYWxzZTtcbiAgfVxuXG4gIHNldFNob3dUaGlua2luZyhzaG93OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWcuc2V0KCdzaG93VGhpbmtpbmcnLCBzaG93KTtcbiAgfVxuXG4gIHRvZ2dsZVNob3dUaGlua2luZygpOiBib29sZWFuIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5nZXRTaG93VGhpbmtpbmcoKTtcbiAgICB0aGlzLnNldFNob3dUaGlua2luZyghY3VycmVudCk7XG4gICAgcmV0dXJuICFjdXJyZW50O1xuICB9XG5cbiAgZ2V0Q29uZmlnUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5wYXRoO1xuICB9XG59XG5cbi8vIFNpbmdsZXRvbiBpbnN0YW5jZVxubGV0IGNvbmZpZ01hbmFnZXI6IENvbmZpZ01hbmFnZXIgfCBudWxsID0gbnVsbDtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbmZpZ01hbmFnZXIoKTogQ29uZmlnTWFuYWdlciB7XG4gIGlmICghY29uZmlnTWFuYWdlcikge1xuICAgIGNvbmZpZ01hbmFnZXIgPSBuZXcgQ29uZmlnTWFuYWdlcigpO1xuICB9XG4gIHJldHVybiBjb25maWdNYW5hZ2VyO1xufVxuIl19
@@ -0,0 +1,26 @@
1
+ import { Message, ToolCall } from './types';
2
+ import { AIProvider } from './ai/openai-provider';
3
+ export interface ConversationOptions {
4
+ provider: AIProvider;
5
+ workingDirectory?: string;
6
+ maxTokens?: number;
7
+ temperature?: number;
8
+ showThinking?: boolean;
9
+ onContent?: (content: string) => void;
10
+ onThinking?: (thinking: string) => void;
11
+ onToolCall?: (toolCall: ToolCall) => void;
12
+ onToolResult?: (result: string) => void;
13
+ }
14
+ export declare class Conversation {
15
+ private messages;
16
+ private provider;
17
+ private toolRegistry;
18
+ private options;
19
+ constructor(options: ConversationOptions);
20
+ addMessage(message: Message): void;
21
+ setSystemPrompt(prompt: string): void;
22
+ getMessages(): Message[];
23
+ clear(): void;
24
+ sendMessage(userMessage: string): Promise<string>;
25
+ private processConversation;
26
+ }
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Conversation = void 0;
4
+ const tools_1 = require("./tools");
5
+ class Conversation {
6
+ messages = [];
7
+ provider;
8
+ toolRegistry;
9
+ options;
10
+ constructor(options) {
11
+ this.provider = options.provider;
12
+ this.toolRegistry = (0, tools_1.getToolRegistry)();
13
+ this.options = options;
14
+ }
15
+ addMessage(message) {
16
+ this.messages.push(message);
17
+ }
18
+ setSystemPrompt(prompt) {
19
+ // Remove existing system prompt if any
20
+ this.messages = this.messages.filter(m => m.role !== 'system');
21
+ // Add new system prompt at the beginning
22
+ this.messages.unshift({ role: 'system', content: prompt });
23
+ }
24
+ getMessages() {
25
+ return this.messages;
26
+ }
27
+ clear() {
28
+ this.messages = [];
29
+ }
30
+ async sendMessage(userMessage) {
31
+ this.addMessage({ role: 'user', content: userMessage });
32
+ return this.processConversation();
33
+ }
34
+ async processConversation() {
35
+ let finalResponse = '';
36
+ let iterations = 0;
37
+ const maxIterations = 20; // Prevent infinite loops
38
+ while (iterations < maxIterations) {
39
+ iterations++;
40
+ const chatOptions = {
41
+ messages: this.messages,
42
+ tools: this.toolRegistry.getDefinitions(),
43
+ toolChoice: 'auto',
44
+ maxTokens: this.options.maxTokens || 4096,
45
+ temperature: this.options.temperature || 0.7,
46
+ stream: true
47
+ };
48
+ let currentContent = '';
49
+ let currentThinking = '';
50
+ let toolCalls = [];
51
+ let currentId = '';
52
+ try {
53
+ await this.provider.chatStream(chatOptions, (chunk) => {
54
+ currentId = chunk.id;
55
+ // 处理思考过程
56
+ if (chunk.delta.reasoning && this.options.showThinking) {
57
+ currentThinking += chunk.delta.reasoning;
58
+ this.options.onThinking?.(chunk.delta.reasoning);
59
+ }
60
+ if (chunk.delta.content) {
61
+ currentContent += chunk.delta.content;
62
+ this.options.onContent?.(chunk.delta.content);
63
+ }
64
+ if (chunk.delta.toolCalls) {
65
+ for (const tc of chunk.delta.toolCalls) {
66
+ if (tc.id && tc.function?.name) {
67
+ toolCalls.push({
68
+ id: tc.id,
69
+ type: 'function',
70
+ function: {
71
+ name: tc.function.name,
72
+ arguments: tc.function.arguments || ''
73
+ }
74
+ });
75
+ }
76
+ else {
77
+ // Update existing tool call
78
+ const existing = toolCalls.find(t => t.id === tc.id);
79
+ if (existing && tc.function?.arguments) {
80
+ existing.function.arguments += tc.function.arguments;
81
+ }
82
+ }
83
+ }
84
+ }
85
+ });
86
+ // Add assistant message
87
+ const assistantMessage = {
88
+ role: 'assistant',
89
+ content: currentContent || ''
90
+ };
91
+ if (toolCalls.length > 0) {
92
+ assistantMessage.toolCalls = toolCalls;
93
+ }
94
+ this.messages.push(assistantMessage);
95
+ // Process tool calls
96
+ if (toolCalls.length > 0) {
97
+ for (const toolCall of toolCalls) {
98
+ this.options.onToolCall?.(toolCall);
99
+ const toolOptions = {
100
+ workingDirectory: this.options.workingDirectory
101
+ };
102
+ const result = await this.toolRegistry.execute(toolCall, toolOptions);
103
+ this.options.onToolResult?.(result.content);
104
+ // Add tool result message
105
+ this.messages.push({
106
+ role: 'tool',
107
+ toolCallId: toolCall.id,
108
+ content: result.content
109
+ });
110
+ }
111
+ // Continue conversation to get final response
112
+ continue;
113
+ }
114
+ // No tool calls, we have the final response
115
+ finalResponse = currentContent;
116
+ break;
117
+ }
118
+ catch (error) {
119
+ throw new Error(`Conversation error: ${error instanceof Error ? error.message : String(error)}`);
120
+ }
121
+ }
122
+ return finalResponse;
123
+ }
124
+ }
125
+ exports.Conversation = Conversation;
126
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVyc2F0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnZlcnNhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSxtQ0FBNEU7QUFjNUUsTUFBYSxZQUFZO0lBQ2YsUUFBUSxHQUFjLEVBQUUsQ0FBQztJQUN6QixRQUFRLENBQWE7SUFDckIsWUFBWSxDQUFlO0lBQzNCLE9BQU8sQ0FBc0I7SUFFckMsWUFBWSxPQUE0QjtRQUN0QyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFDakMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFBLHVCQUFlLEdBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUN6QixDQUFDO0lBRUQsVUFBVSxDQUFDLE9BQWdCO1FBQ3pCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxlQUFlLENBQUMsTUFBYztRQUM1Qix1Q0FBdUM7UUFDdkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUM7UUFDL0QseUNBQXlDO1FBQ3pDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsS0FBSztRQUNILElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLFdBQW1CO1FBQ25DLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFB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TCxDQUFDO29CQUVELDhDQUE4QztvQkFDOUMsU0FBUztnQkFDWCxDQUFDO2dCQUVELDRDQUE0QztnQkFDNUMsYUFBYSxHQUFHLGNBQWMsQ0FBQztnQkFDL0IsTUFBTTtZQUVSLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbkcsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLGFBQWEsQ0FBQztJQUN2QixDQUFDO0NBQ0Y7QUEvSUQsb0NBK0lDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWVzc2FnZSwgQ2hhdENvbXBsZXRpb25PcHRpb25zLCBUb29sQ2FsbCwgU3RyZWFtQ2h1bmsgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IEFJUHJvdmlkZXIgfSBmcm9tICcuL2FpL29wZW5haS1wcm92aWRlcic7XG5pbXBvcnQgeyBUb29sUmVnaXN0cnksIGdldFRvb2xSZWdpc3RyeSwgVG9vbEV4ZWN1dGVPcHRpb25zIH0gZnJvbSAnLi90b29scyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udmVyc2F0aW9uT3B0aW9ucyB7XG4gIHByb3ZpZGVyOiBBSVByb3ZpZGVyO1xuICB3b3JraW5nRGlyZWN0b3J5Pzogc3RyaW5nO1xuICBtYXhUb2tlbnM/OiBudW1iZXI7XG4gIHRlbXBlcmF0dXJlPzogbnVtYmVyO1xuICBzaG93VGhpbmtpbmc/OiBib29sZWFuOyAvLyDmmK/lkKbmmL7npLrmgJ3ogIPov4fnqItcbiAgb25Db250ZW50PzogKGNvbnRlbnQ6IHN0cmluZykgPT4gdm9pZDtcbiAgb25UaGlua2luZz86ICh0aGlua2luZzogc3RyaW5nKSA9PiB2b2lkOyAvLyDmgJ3ogIPov4fnqIvlm57osINcbiAgb25Ub29sQ2FsbD86ICh0b29sQ2FsbDogVG9vbENhbGwpID0+IHZvaWQ7XG4gIG9uVG9vbFJlc3VsdD86IChyZXN1bHQ6IHN0cmluZykgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGNsYXNzIENvbnZlcnNhdGlvbiB7XG4gIHByaXZhdGUgbWVzc2FnZXM6IE1lc3NhZ2VbXSA9IFtdO1xuICBwcml2YXRlIHByb3ZpZGVyOiBBSVByb3ZpZGVyO1xuICBwcml2YXRlIHRvb2xSZWdpc3RyeTogVG9vbFJlZ2lzdHJ5O1xuICBwcml2YXRlIG9wdGlvbnM6IENvbnZlcnNhdGlvbk9wdGlvbnM7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogQ29udmVyc2F0aW9uT3B0aW9ucykge1xuICAgIHRoaXMucHJvdmlkZXIgPSBvcHRpb25zLnByb3ZpZGVyO1xuICAgIHRoaXMudG9vbFJlZ2lzdHJ5ID0gZ2V0VG9vbFJlZ2lzdHJ5KCk7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgfVxuXG4gIGFkZE1lc3NhZ2UobWVzc2FnZTogTWVzc2FnZSk6IHZvaWQge1xuICAgIHRoaXMubWVzc2FnZXMucHVzaChtZXNzYWdlKTtcbiAgfVxuXG4gIHNldFN5c3RlbVByb21wdChwcm9tcHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIFJlbW92ZSBleGlzdGluZyBzeXN0ZW0gcHJvbXB0IGlmIGFueVxuICAgIHRoaXMubWVzc2FnZXMgPSB0aGlzLm1lc3NhZ2VzLmZpbHRlcihtID0+IG0ucm9sZSAhPT0gJ3N5c3RlbScpO1xuICAgIC8vIEFkZCBuZXcgc3lzdGVtIHByb21wdCBhdCB0aGUgYmVnaW5uaW5nXG4gICAgdGhpcy5tZXNzYWdlcy51bnNoaWZ0KHsgcm9sZTogJ3N5c3RlbScsIGNvbnRlbnQ6IHByb21wdCB9KTtcbiAgfVxuXG4gIGdldE1lc3NhZ2VzKCk6IE1lc3NhZ2VbXSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZXM7XG4gIH1cblxuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLm1lc3NhZ2VzID0gW107XG4gIH1cblxuICBhc3luYyBzZW5kTWVzc2FnZSh1c2VyTWVzc2FnZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0aGlzLmFkZE1lc3NhZ2UoeyByb2xlOiAndXNlcicsIGNvbnRlbnQ6IHVzZXJNZXNzYWdlIH0pO1xuICAgIHJldHVybiB0aGlzLnByb2Nlc3NDb252ZXJzYXRpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc0NvbnZlcnNhdGlvbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGxldCBmaW5hbFJlc3BvbnNlID0gJyc7XG4gICAgbGV0IGl0ZXJhdGlvbnMgPSAwO1xuICAgIGNvbnN0IG1heEl0ZXJhdGlvbnMgPSAyMDsgLy8gUHJldmVudCBpbmZpbml0ZSBsb29wc1xuXG4gICAgd2hpbGUgKGl0ZXJhdGlvbnMgPCBtYXhJdGVyYXRpb25zKSB7XG4gICAgICBpdGVyYXRpb25zKys7XG5cbiAgICAgIGNvbnN0IGNoYXRPcHRpb25zOiBDaGF0Q29tcGxldGlvbk9wdGlvbnMgPSB7XG4gICAgICAgIG1lc3NhZ2VzOiB0aGlzLm1lc3NhZ2VzLFxuICAgICAgICB0b29sczogdGhpcy50b29sUmVnaXN0cnkuZ2V0RGVmaW5pdGlvbnMoKSxcbiAgICAgICAgdG9vbENob2ljZTogJ2F1dG8nLFxuICAgICAgICBtYXhUb2tlbnM6IHRoaXMub3B0aW9ucy5tYXhUb2tlbnMgfHwgNDA5NixcbiAgICAgICAgdGVtcGVyYXR1cmU6IHRoaXMub3B0aW9ucy50ZW1wZXJhdHVyZSB8fCAwLjcsXG4gICAgICAgIHN0cmVhbTogdHJ1ZVxuICAgICAgfTtcblxuICAgICAgbGV0IGN1cnJlbnRDb250ZW50ID0gJyc7XG4gICAgICBsZXQgY3VycmVudFRoaW5raW5nID0gJyc7XG4gICAgICBsZXQgdG9vbENhbGxzOiBUb29sQ2FsbFtdID0gW107XG4gICAgICBsZXQgY3VycmVudElkID0gJyc7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMucHJvdmlkZXIuY2hhdFN0cmVhbShjaGF0T3B0aW9ucywgKGNodW5rOiBTdHJlYW1DaHVuaykgPT4ge1xuICAgICAgICAgIGN1cnJlbnRJZCA9IGNodW5rLmlkO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIOWkhOeQhuaAneiAg+i/h+eoi1xuICAgICAgICAgIGlmIChjaHVuay5kZWx0YS5yZWFzb25pbmcgJiYgdGhpcy5vcHRpb25zLnNob3dUaGlua2luZykge1xuICAgICAgICAgICAgY3VycmVudFRoaW5raW5nICs9IGNodW5rLmRlbHRhLnJlYXNvbmluZztcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vblRoaW5raW5nPy4oY2h1bmsuZGVsdGEucmVhc29uaW5nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY2h1bmsuZGVsdGEuY29udGVudCkge1xuICAgICAgICAgICAgY3VycmVudENvbnRlbnQgKz0gY2h1bmsuZGVsdGEuY29udGVudDtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vbkNvbnRlbnQ/LihjaHVuay5kZWx0YS5jb250ZW50KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY2h1bmsuZGVsdGEudG9vbENhbGxzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRjIG9mIGNodW5rLmRlbHRhLnRvb2xDYWxscykge1xuICAgICAgICAgICAgICBpZiAodGMuaWQgJiYgdGMuZnVuY3Rpb24/Lm5hbWUpIHtcbiAgICAgICAgICAgICAgICB0b29sQ2FsbHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICBpZDogdGMuaWQsXG4gICAgICAgICAgICAgICAgICB0eXBlOiAnZnVuY3Rpb24nLFxuICAgICAgICAgICAgICAgICAgZnVuY3Rpb246IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogdGMuZnVuY3Rpb24ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzOiB0Yy5mdW5jdGlvbi5hcmd1bWVudHMgfHwgJydcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXhpc3RpbmcgdG9vbCBjYWxsXG4gICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSB0b29sQ2FsbHMuZmluZCh0ID0+IHQuaWQgPT09IHRjLmlkKTtcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmcgJiYgdGMuZnVuY3Rpb24/LmFyZ3VtZW50cykge1xuICAgICAgICAgICAgICAgICAgZXhpc3RpbmcuZnVuY3Rpb24uYXJndW1lbnRzICs9IHRjLmZ1bmN0aW9uLmFyZ3VtZW50cztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEFkZCBhc3Npc3RhbnQgbWVzc2FnZVxuICAgICAgICBjb25zdCBhc3Npc3RhbnRNZXNzYWdlOiBNZXNzYWdlID0ge1xuICAgICAgICAgIHJvbGU6ICdhc3Npc3RhbnQnLFxuICAgICAgICAgIGNvbnRlbnQ6IGN1cnJlbnRDb250ZW50IHx8ICcnXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRvb2xDYWxscy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXNzaXN0YW50TWVzc2FnZS50b29sQ2FsbHMgPSB0b29sQ2FsbHM7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1lc3NhZ2VzLnB1c2goYXNzaXN0YW50TWVzc2FnZSk7XG5cbiAgICAgICAgLy8gUHJvY2VzcyB0b29sIGNhbGxzXG4gICAgICAgIGlmICh0b29sQ2FsbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZvciAoY29uc3QgdG9vbENhbGwgb2YgdG9vbENhbGxzKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMub25Ub29sQ2FsbD8uKHRvb2xDYWxsKTtcblxuICAgICAgICAgICAgY29uc3QgdG9vbE9wdGlvbnM6IFRvb2xFeGVjdXRlT3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgd29ya2luZ0RpcmVjdG9yeTogdGhpcy5vcHRpb25zLndvcmtpbmdEaXJlY3RvcnlcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMudG9vbFJlZ2lzdHJ5LmV4ZWN1dGUodG9vbENhbGwsIHRvb2xPcHRpb25zKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9uVG9vbFJlc3VsdD8uKHJlc3VsdC5jb250ZW50KTtcblxuICAgICAgICAgICAgLy8gQWRkIHRvb2wgcmVzdWx0IG1lc3NhZ2VcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZXMucHVzaCh7XG4gICAgICAgICAgICAgIHJvbGU6ICd0b29sJyxcbiAgICAgICAgICAgICAgdG9vbENhbGxJZDogdG9vbENhbGwuaWQsXG4gICAgICAgICAgICAgIGNvbnRlbnQ6IHJlc3VsdC5jb250ZW50XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDb250aW51ZSBjb252ZXJzYXRpb24gdG8gZ2V0IGZpbmFsIHJlc3BvbnNlXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyB0b29sIGNhbGxzLCB3ZSBoYXZlIHRoZSBmaW5hbCByZXNwb25zZVxuICAgICAgICBmaW5hbFJlc3BvbnNlID0gY3VycmVudENvbnRlbnQ7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbnZlcnNhdGlvbiBlcnJvcjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpbmFsUmVzcG9uc2U7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,10 @@
1
+ export * from './types';
2
+ export { ConfigManager, getConfigManager } from './config';
3
+ export { createAIProvider, OpenAIProvider, CustomProvider, ChineseProvider } from './ai';
4
+ export { ToolRegistry, getToolRegistry, BaseTool, ReadFileTool, WriteFileTool, ListDirectoryTool, GlobTool, SearchFileContentTool, RunShellCommandTool, WebSearchTool, WebFetchTool, ReplaceTool, ImageReadTool, PDFExtractTool, AskUserQuestionTool, TaskTool, SaveMemoryTool } from './tools';
5
+ export { Conversation } from './conversation';
6
+ export { MCPClient, MCPManager } from './mcp';
7
+ export { SkillManager } from './skills';
8
+ export { Agent, AgentFactory, AgentDefinition, AgentResult, AgentType, AGENT_DEFINITIONS } from './agents';
9
+ export { SandboxExecutor, SandboxBackend, SandboxConfig, SandboxResult, createSandboxExecutor } from './sandbox';
10
+ export { CHINESE_MODELS, DEFAULT_CHINESE_MODELS } from './ai/chinese-provider';
package/dist/index.js ADDED
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.DEFAULT_CHINESE_MODELS = exports.CHINESE_MODELS = exports.createSandboxExecutor = exports.SandboxExecutor = exports.AGENT_DEFINITIONS = exports.AgentFactory = exports.Agent = exports.SkillManager = exports.MCPManager = exports.MCPClient = exports.Conversation = exports.SaveMemoryTool = exports.TaskTool = exports.AskUserQuestionTool = exports.PDFExtractTool = exports.ImageReadTool = exports.ReplaceTool = exports.WebFetchTool = exports.WebSearchTool = exports.RunShellCommandTool = exports.SearchFileContentTool = exports.GlobTool = exports.ListDirectoryTool = exports.WriteFileTool = exports.ReadFileTool = exports.BaseTool = exports.getToolRegistry = exports.ToolRegistry = exports.ChineseProvider = exports.CustomProvider = exports.OpenAIProvider = exports.createAIProvider = exports.getConfigManager = exports.ConfigManager = void 0;
18
+ // Types
19
+ __exportStar(require("./types"), exports);
20
+ // Configuration
21
+ var config_1 = require("./config");
22
+ Object.defineProperty(exports, "ConfigManager", { enumerable: true, get: function () { return config_1.ConfigManager; } });
23
+ Object.defineProperty(exports, "getConfigManager", { enumerable: true, get: function () { return config_1.getConfigManager; } });
24
+ // AI Providers
25
+ var ai_1 = require("./ai");
26
+ Object.defineProperty(exports, "createAIProvider", { enumerable: true, get: function () { return ai_1.createAIProvider; } });
27
+ Object.defineProperty(exports, "OpenAIProvider", { enumerable: true, get: function () { return ai_1.OpenAIProvider; } });
28
+ Object.defineProperty(exports, "CustomProvider", { enumerable: true, get: function () { return ai_1.CustomProvider; } });
29
+ Object.defineProperty(exports, "ChineseProvider", { enumerable: true, get: function () { return ai_1.ChineseProvider; } });
30
+ // Tools
31
+ var tools_1 = require("./tools");
32
+ Object.defineProperty(exports, "ToolRegistry", { enumerable: true, get: function () { return tools_1.ToolRegistry; } });
33
+ Object.defineProperty(exports, "getToolRegistry", { enumerable: true, get: function () { return tools_1.getToolRegistry; } });
34
+ Object.defineProperty(exports, "BaseTool", { enumerable: true, get: function () { return tools_1.BaseTool; } });
35
+ Object.defineProperty(exports, "ReadFileTool", { enumerable: true, get: function () { return tools_1.ReadFileTool; } });
36
+ Object.defineProperty(exports, "WriteFileTool", { enumerable: true, get: function () { return tools_1.WriteFileTool; } });
37
+ Object.defineProperty(exports, "ListDirectoryTool", { enumerable: true, get: function () { return tools_1.ListDirectoryTool; } });
38
+ Object.defineProperty(exports, "GlobTool", { enumerable: true, get: function () { return tools_1.GlobTool; } });
39
+ Object.defineProperty(exports, "SearchFileContentTool", { enumerable: true, get: function () { return tools_1.SearchFileContentTool; } });
40
+ Object.defineProperty(exports, "RunShellCommandTool", { enumerable: true, get: function () { return tools_1.RunShellCommandTool; } });
41
+ Object.defineProperty(exports, "WebSearchTool", { enumerable: true, get: function () { return tools_1.WebSearchTool; } });
42
+ Object.defineProperty(exports, "WebFetchTool", { enumerable: true, get: function () { return tools_1.WebFetchTool; } });
43
+ Object.defineProperty(exports, "ReplaceTool", { enumerable: true, get: function () { return tools_1.ReplaceTool; } });
44
+ Object.defineProperty(exports, "ImageReadTool", { enumerable: true, get: function () { return tools_1.ImageReadTool; } });
45
+ Object.defineProperty(exports, "PDFExtractTool", { enumerable: true, get: function () { return tools_1.PDFExtractTool; } });
46
+ Object.defineProperty(exports, "AskUserQuestionTool", { enumerable: true, get: function () { return tools_1.AskUserQuestionTool; } });
47
+ Object.defineProperty(exports, "TaskTool", { enumerable: true, get: function () { return tools_1.TaskTool; } });
48
+ Object.defineProperty(exports, "SaveMemoryTool", { enumerable: true, get: function () { return tools_1.SaveMemoryTool; } });
49
+ // Conversation
50
+ var conversation_1 = require("./conversation");
51
+ Object.defineProperty(exports, "Conversation", { enumerable: true, get: function () { return conversation_1.Conversation; } });
52
+ // MCP
53
+ var mcp_1 = require("./mcp");
54
+ Object.defineProperty(exports, "MCPClient", { enumerable: true, get: function () { return mcp_1.MCPClient; } });
55
+ Object.defineProperty(exports, "MCPManager", { enumerable: true, get: function () { return mcp_1.MCPManager; } });
56
+ // Skills
57
+ var skills_1 = require("./skills");
58
+ Object.defineProperty(exports, "SkillManager", { enumerable: true, get: function () { return skills_1.SkillManager; } });
59
+ // Agents
60
+ var agents_1 = require("./agents");
61
+ Object.defineProperty(exports, "Agent", { enumerable: true, get: function () { return agents_1.Agent; } });
62
+ Object.defineProperty(exports, "AgentFactory", { enumerable: true, get: function () { return agents_1.AgentFactory; } });
63
+ Object.defineProperty(exports, "AGENT_DEFINITIONS", { enumerable: true, get: function () { return agents_1.AGENT_DEFINITIONS; } });
64
+ // Sandbox
65
+ var sandbox_1 = require("./sandbox");
66
+ Object.defineProperty(exports, "SandboxExecutor", { enumerable: true, get: function () { return sandbox_1.SandboxExecutor; } });
67
+ Object.defineProperty(exports, "createSandboxExecutor", { enumerable: true, get: function () { return sandbox_1.createSandboxExecutor; } });
68
+ // 国内模型常量
69
+ var chinese_provider_1 = require("./ai/chinese-provider");
70
+ Object.defineProperty(exports, "CHINESE_MODELS", { enumerable: true, get: function () { return chinese_provider_1.CHINESE_MODELS; } });
71
+ Object.defineProperty(exports, "DEFAULT_CHINESE_MODELS", { enumerable: true, get: function () { return chinese_provider_1.DEFAULT_CHINESE_MODELS; } });
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxRQUFRO0FBQ1IsMENBQXdCO0FBRXhCLGdCQUFnQjtBQUNoQixtQ0FBMkQ7QUFBbEQsdUdBQUEsYUFBYSxPQUFBO0FBQUUsMEdBQUEsZ0JBQWdCLE9BQUE7QUFFeEMsZUFBZTtBQUNmLDJCQUF5RjtBQUFoRixzR0FBQSxnQkFBZ0IsT0FBQTtBQUFFLG9HQUFBLGNBQWMsT0FBQTtBQUFFLG9HQUFBLGNBQWMsT0FBQTtBQUFFLHFHQUFBLGVBQWUsT0FBQTtBQUUxRSxRQUFRO0FBQ1IsaUNBa0JpQjtBQWpCZixxR0FBQSxZQUFZLE9BQUE7QUFDWix3R0FBQSxlQUFlLE9BQUE7QUFDZixpR0FBQSxRQUFRLE9BQUE7QUFDUixxR0FBQSxZQUFZLE9BQUE7QUFDWixzR0FBQSxhQUFhLE9BQUE7QUFDYiwwR0FBQSxpQkFBaUIsT0FBQTtBQUNqQixpR0FBQSxRQUFRLE9BQUE7QUFDUiw4R0FBQSxxQkFBcUIsT0FBQTtBQUNyQiw0R0FBQSxtQkFBbUIsT0FBQTtBQUNuQixzR0FBQSxhQUFhLE9BQUE7QUFDYixxR0FBQSxZQUFZLE9BQUE7QUFDWixvR0FBQSxXQUFXLE9BQUE7QUFDWCxzR0FBQSxhQUFhLE9BQUE7QUFDYix1R0FBQSxjQUFjLE9BQUE7QUFDZCw0R0FBQSxtQkFBbUIsT0FBQTtBQUNuQixpR0FBQSxRQUFRLE9BQUE7QUFDUix1R0FBQSxjQUFjLE9BQUE7QUFHaEIsZUFBZTtBQUNmLCtDQUE4QztBQUFyQyw0R0FBQSxZQUFZLE9BQUE7QUFFckIsTUFBTTtBQUNOLDZCQUE4QztBQUFyQyxnR0FBQSxTQUFTLE9BQUE7QUFBRSxpR0FBQSxVQUFVLE9BQUE7QUFFOUIsU0FBUztBQUNULG1DQUF3QztBQUEvQixzR0FBQSxZQUFZLE9BQUE7QUFFckIsU0FBUztBQUNULG1DQU9rQjtBQU5oQiwrRkFBQSxLQUFLLE9BQUE7QUFDTCxzR0FBQSxZQUFZLE9BQUE7QUFJWiwyR0FBQSxpQkFBaUIsT0FBQTtBQUduQixVQUFVO0FBQ1YscUNBTW1CO0FBTGpCLDBHQUFBLGVBQWUsT0FBQTtBQUlmLGdIQUFBLHFCQUFxQixPQUFBO0FBR3ZCLFNBQVM7QUFDVCwwREFBK0U7QUFBdEUsa0hBQUEsY0FBYyxPQUFBO0FBQUUsMEhBQUEsc0JBQXNCLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUeXBlc1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcyc7XG5cbi8vIENvbmZpZ3VyYXRpb25cbmV4cG9ydCB7IENvbmZpZ01hbmFnZXIsIGdldENvbmZpZ01hbmFnZXIgfSBmcm9tICcuL2NvbmZpZyc7XG5cbi8vIEFJIFByb3ZpZGVyc1xuZXhwb3J0IHsgY3JlYXRlQUlQcm92aWRlciwgT3BlbkFJUHJvdmlkZXIsIEN1c3RvbVByb3ZpZGVyLCBDaGluZXNlUHJvdmlkZXIgfSBmcm9tICcuL2FpJztcblxuLy8gVG9vbHNcbmV4cG9ydCB7IFxuICBUb29sUmVnaXN0cnksIFxuICBnZXRUb29sUmVnaXN0cnksXG4gIEJhc2VUb29sLFxuICBSZWFkRmlsZVRvb2wsXG4gIFdyaXRlRmlsZVRvb2wsXG4gIExpc3REaXJlY3RvcnlUb29sLFxuICBHbG9iVG9vbCxcbiAgU2VhcmNoRmlsZUNvbnRlbnRUb29sLFxuICBSdW5TaGVsbENvbW1hbmRUb29sLFxuICBXZWJTZWFyY2hUb29sLFxuICBXZWJGZXRjaFRvb2wsXG4gIFJlcGxhY2VUb29sLFxuICBJbWFnZVJlYWRUb29sLFxuICBQREZFeHRyYWN0VG9vbCxcbiAgQXNrVXNlclF1ZXN0aW9uVG9vbCxcbiAgVGFza1Rvb2wsXG4gIFNhdmVNZW1vcnlUb29sXG59IGZyb20gJy4vdG9vbHMnO1xuXG4vLyBDb252ZXJzYXRpb25cbmV4cG9ydCB7IENvbnZlcnNhdGlvbiB9IGZyb20gJy4vY29udmVyc2F0aW9uJztcblxuLy8gTUNQXG5leHBvcnQgeyBNQ1BDbGllbnQsIE1DUE1hbmFnZXIgfSBmcm9tICcuL21jcCc7XG5cbi8vIFNraWxsc1xuZXhwb3J0IHsgU2tpbGxNYW5hZ2VyIH0gZnJvbSAnLi9za2lsbHMnO1xuXG4vLyBBZ2VudHNcbmV4cG9ydCB7IFxuICBBZ2VudCwgXG4gIEFnZW50RmFjdG9yeSwgXG4gIEFnZW50RGVmaW5pdGlvbixcbiAgQWdlbnRSZXN1bHQsXG4gIEFnZW50VHlwZSxcbiAgQUdFTlRfREVGSU5JVElPTlMgXG59IGZyb20gJy4vYWdlbnRzJztcblxuLy8gU2FuZGJveFxuZXhwb3J0IHsgXG4gIFNhbmRib3hFeGVjdXRvciwgXG4gIFNhbmRib3hCYWNrZW5kLFxuICBTYW5kYm94Q29uZmlnLFxuICBTYW5kYm94UmVzdWx0LFxuICBjcmVhdGVTYW5kYm94RXhlY3V0b3IgXG59IGZyb20gJy4vc2FuZGJveCc7XG5cbi8vIOWbveWGheaooeWei+W4uOmHj1xuZXhwb3J0IHsgQ0hJTkVTRV9NT0RFTFMsIERFRkFVTFRfQ0hJTkVTRV9NT0RFTFMgfSBmcm9tICcuL2FpL2NoaW5lc2UtcHJvdmlkZXInOyJdfQ==
@@ -0,0 +1,48 @@
1
+ import { EventEmitter } from 'events';
2
+ import { ToolDefinition } from '../types';
3
+ export interface MCPServerConfig {
4
+ command: string;
5
+ args?: string[];
6
+ env?: Record<string, string>;
7
+ }
8
+ export interface MCPTool {
9
+ name: string;
10
+ description: string;
11
+ inputSchema: Record<string, unknown>;
12
+ }
13
+ export interface MCPClientEvents {
14
+ 'tool-list': (tools: MCPTool[]) => void;
15
+ 'tool-result': (result: unknown) => void;
16
+ 'error': (error: Error) => void;
17
+ 'close': () => void;
18
+ }
19
+ export declare class MCPClient extends EventEmitter {
20
+ private process;
21
+ private serverName;
22
+ private config;
23
+ private requestId;
24
+ private pendingRequests;
25
+ private buffer;
26
+ private tools;
27
+ constructor(serverName: string, config: MCPServerConfig);
28
+ connect(): Promise<void>;
29
+ disconnect(): Promise<void>;
30
+ private handleData;
31
+ private handleResponse;
32
+ private sendRequest;
33
+ private loadTools;
34
+ getTools(): MCPTool[];
35
+ getToolDefinitions(): ToolDefinition[];
36
+ callTool(name: string, args: Record<string, unknown>): Promise<unknown>;
37
+ isConnected(): boolean;
38
+ }
39
+ export declare class MCPManager {
40
+ private clients;
41
+ addServer(name: string, config: MCPServerConfig): Promise<MCPClient>;
42
+ removeServer(name: string): Promise<void>;
43
+ getClient(name: string): MCPClient | undefined;
44
+ getAllClients(): MCPClient[];
45
+ getAllTools(): MCPTool[];
46
+ getAllToolDefinitions(): ToolDefinition[];
47
+ disconnectAll(): Promise<void>;
48
+ }
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MCPManager = exports.MCPClient = void 0;
4
+ const child_process_1 = require("child_process");
5
+ const events_1 = require("events");
6
+ class MCPClient extends events_1.EventEmitter {
7
+ process = null;
8
+ serverName;
9
+ config;
10
+ requestId = 0;
11
+ pendingRequests = new Map();
12
+ buffer = '';
13
+ tools = [];
14
+ constructor(serverName, config) {
15
+ super();
16
+ this.serverName = serverName;
17
+ this.config = config;
18
+ }
19
+ async connect() {
20
+ return new Promise((resolve, reject) => {
21
+ const env = { ...process.env, ...this.config.env };
22
+ this.process = (0, child_process_1.spawn)(this.config.command, this.config.args || [], {
23
+ env,
24
+ stdio: ['pipe', 'pipe', 'pipe']
25
+ });
26
+ this.process.stdout?.on('data', (data) => {
27
+ this.handleData(data.toString());
28
+ });
29
+ this.process.stderr?.on('data', (data) => {
30
+ console.error(`[MCP ${this.serverName}] ${data.toString()}`);
31
+ });
32
+ this.process.on('error', (error) => {
33
+ this.emit('error', error);
34
+ reject(error);
35
+ });
36
+ this.process.on('close', () => {
37
+ this.emit('close');
38
+ });
39
+ // Initialize connection
40
+ this.sendRequest('initialize', {
41
+ protocolVersion: '2024-11-05',
42
+ capabilities: {},
43
+ clientInfo: {
44
+ name: 'oflow-cli',
45
+ version: '0.1.0'
46
+ }
47
+ }).then(() => {
48
+ return this.loadTools();
49
+ }).then(() => {
50
+ resolve();
51
+ }).catch(reject);
52
+ });
53
+ }
54
+ async disconnect() {
55
+ if (this.process) {
56
+ this.process.kill();
57
+ this.process = null;
58
+ }
59
+ }
60
+ handleData(data) {
61
+ this.buffer += data;
62
+ const lines = this.buffer.split('\n');
63
+ this.buffer = lines.pop() || '';
64
+ for (const line of lines) {
65
+ if (line.trim()) {
66
+ try {
67
+ const response = JSON.parse(line);
68
+ this.handleResponse(response);
69
+ }
70
+ catch {
71
+ // Ignore parse errors
72
+ }
73
+ }
74
+ }
75
+ }
76
+ handleResponse(response) {
77
+ if (response.id !== undefined && this.pendingRequests.has(response.id)) {
78
+ const pending = this.pendingRequests.get(response.id);
79
+ this.pendingRequests.delete(response.id);
80
+ if (response.error) {
81
+ pending.reject(new Error(response.error.message));
82
+ }
83
+ else {
84
+ pending.resolve(response.result);
85
+ }
86
+ }
87
+ }
88
+ sendRequest(method, params = {}) {
89
+ return new Promise((resolve, reject) => {
90
+ const id = this.requestId++;
91
+ this.pendingRequests.set(id, { resolve, reject });
92
+ const request = JSON.stringify({
93
+ jsonrpc: '2.0',
94
+ id,
95
+ method,
96
+ params
97
+ }) + '\n';
98
+ this.process?.stdin?.write(request);
99
+ });
100
+ }
101
+ async loadTools() {
102
+ try {
103
+ const result = await this.sendRequest('tools/list');
104
+ this.tools = result.tools || [];
105
+ this.emit('tool-list', this.tools);
106
+ }
107
+ catch {
108
+ // Server might not support tools
109
+ this.tools = [];
110
+ }
111
+ }
112
+ getTools() {
113
+ return this.tools;
114
+ }
115
+ getToolDefinitions() {
116
+ return this.tools.map(tool => ({
117
+ type: 'function',
118
+ function: {
119
+ name: `${this.serverName}__${tool.name}`,
120
+ description: tool.description,
121
+ parameters: tool.inputSchema
122
+ }
123
+ }));
124
+ }
125
+ async callTool(name, args) {
126
+ const result = await this.sendRequest('tools/call', {
127
+ name,
128
+ arguments: args
129
+ });
130
+ return result;
131
+ }
132
+ isConnected() {
133
+ return this.process !== null && !this.process.killed;
134
+ }
135
+ }
136
+ exports.MCPClient = MCPClient;
137
+ class MCPManager {
138
+ clients = new Map();
139
+ async addServer(name, config) {
140
+ if (this.clients.has(name)) {
141
+ await this.removeServer(name);
142
+ }
143
+ const client = new MCPClient(name, config);
144
+ await client.connect();
145
+ this.clients.set(name, client);
146
+ return client;
147
+ }
148
+ async removeServer(name) {
149
+ const client = this.clients.get(name);
150
+ if (client) {
151
+ await client.disconnect();
152
+ this.clients.delete(name);
153
+ }
154
+ }
155
+ getClient(name) {
156
+ return this.clients.get(name);
157
+ }
158
+ getAllClients() {
159
+ return Array.from(this.clients.values());
160
+ }
161
+ getAllTools() {
162
+ return this.getAllClients().flatMap(client => client.getTools());
163
+ }
164
+ getAllToolDefinitions() {
165
+ return this.getAllClients().flatMap(client => client.getToolDefinitions());
166
+ }
167
+ async disconnectAll() {
168
+ for (const client of this.clients.values()) {
169
+ await client.disconnect();
170
+ }
171
+ this.clients.clear();
172
+ }
173
+ }
174
+ exports.MCPManager = MCPManager;
175
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWNwL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlEQUFvRDtBQUNwRCxtQ0FBc0M7QUFzQnRDLE1BQWEsU0FBVSxTQUFRLHFCQUFZO0lBQ2pDLE9BQU8sR0FBd0IsSUFBSSxDQUFDO0lBQ3BDLFVBQVUsQ0FBUztJQUNuQixNQUFNLENBQWtCO0lBQ3hCLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDZCxlQUFlLEdBR2xCLElBQUksR0FBRyxFQUFFLENBQUM7SUFDUCxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ1osS0FBSyxHQUFjLEVBQUUsQ0FBQztJQUU5QixZQUFZLFVBQWtCLEVBQUUsTUFBdUI7UUFDckQsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQsS0FBSyxDQUFDLE9BQU87UUFDWCxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUVuRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUEscUJBQUssRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLEVBQUU7Z0JBQ2hFLEdBQUc7Z0JBQ0gsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUM7YUFDaEMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQVksRUFBRSxFQUFFO2dC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QzNDLE1BQU0sTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzVCLENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3ZCLENBQUM7Q0FDRjtBQTdDRCxnQ0E2Q0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzcGF3biwgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudHMnO1xuaW1wb3J0IHsgVG9vbERlZmluaXRpb24gfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTUNQU2VydmVyQ29uZmlnIHtcbiAgY29tbWFuZDogc3RyaW5nO1xuICBhcmdzPzogc3RyaW5nW107XG4gIGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTUNQVG9vbCB7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgaW5wdXRTY2hlbWE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1DUENsaWVudEV2ZW50cyB7XG4gICd0b29sLWxpc3QnOiAodG9vbHM6IE1DUFRvb2xbXSkgPT4gdm9pZDtcbiAgJ3Rvb2wtcmVzdWx0JzogKHJlc3VsdDogdW5rbm93bikgPT4gdm9pZDtcbiAgJ2Vycm9yJzogKGVycm9yOiBFcnJvcikgPT4gdm9pZDtcbiAgJ2Nsb3NlJzogKCkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGNsYXNzIE1DUENsaWVudCBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHByaXZhdGUgcHJvY2VzczogQ2hpbGRQcm9jZXNzIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc2VydmVyTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIGNvbmZpZzogTUNQU2VydmVyQ29uZmlnO1xuICBwcml2YXRlIHJlcXVlc3RJZCA9IDA7XG4gIHByaXZhdGUgcGVuZGluZ1JlcXVlc3RzOiBNYXA8bnVtYmVyLCB7XG4gICAgcmVzb2x2ZTogKHZhbHVlOiB1bmtub3duKSA9PiB2b2lkO1xuICAgIHJlamVjdDogKGVycm9yOiBFcnJvcikgPT4gdm9pZDtcbiAgfT4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgYnVmZmVyID0gJyc7XG4gIHByaXZhdGUgdG9vbHM6IE1DUFRvb2xbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHNlcnZlck5hbWU6IHN0cmluZywgY29uZmlnOiBNQ1BTZXJ2ZXJDb25maWcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc2VydmVyTmFtZSA9IHNlcnZlck5hbWU7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gIH1cblxuICBhc3luYyBjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBlbnYgPSB7IC4uLnByb2Nlc3MuZW52LCAuLi50aGlzLmNvbmZpZy5lbnYgfTtcbiAgICAgIFxuICAgICAgdGhpcy5wcm9jZXNzID0gc3Bhd24odGhpcy5jb25maWcuY29tbWFuZCwgdGhpcy5jb25maWcuYXJncyB8fCBbXSwge1xuICAgICAgICBlbnYsXG4gICAgICAgIHN0ZGlvOiBbJ3BpcGUnLCAncGlwZScsICdwaXBlJ11cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnByb2Nlc3Muc3Rkb3V0Py5vbignZGF0YScsIChkYXRhOiBCdWZmZXIpID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVEYXRhKGRhdGEudG9TdHJpbmcoKSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5wcm9jZXNzLnN0ZGVycj8ub24oJ2RhdGEnLCAoZGF0YTogQnVmZmVyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFtNQ1AgJHt0aGlzLnNlcnZlck5hbWV9XSAke2RhdGEudG9TdHJpbmcoKX1gKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnByb2Nlc3Mub24oJ2Vycm9yJywgKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IpO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucHJvY2Vzcy5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuZW1pdCgnY2xvc2UnKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBJbml0aWFsaXplIGNvbm5lY3Rpb25cbiAgICAgIHRoaXMuc2VuZFJlcXVlc3QoJ2luaXRpYWxpemUnLCB7XG4gICAgICAgIHByb3RvY29sVmVyc2lvbjogJzIwMjQtMTEtMDUnLFxuICAgICAgICBjYXBhYmlsaXRpZXM6IHt9LFxuICAgICAgICBjbGllbnRJbmZvOiB7XG4gICAgICAgICAgbmFtZTogJ29mbG93LWNsaScsXG4gICAgICAgICAgdmVyc2lvbjogJzAuMS4wJ1xuICAgICAgICB9XG4gICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZFRvb2xzKCk7XG4gICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSkuY2F0Y2gocmVqZWN0KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGRpc2Nvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMucHJvY2Vzcykge1xuICAgICAgdGhpcy5wcm9jZXNzLmtpbGwoKTtcbiAgICAgIHRoaXMucHJvY2VzcyA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVEYXRhKGRhdGE6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuYnVmZmVyICs9IGRhdGE7XG4gICAgXG4gICAgY29uc3QgbGluZXMgPSB0aGlzLmJ1ZmZlci5zcGxpdCgnXFxuJyk7XG4gICAgdGhpcy5idWZmZXIgPSBsaW5lcy5wb3AoKSB8fCAnJztcblxuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgaWYgKGxpbmUudHJpbSgpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBKU09OLnBhcnNlKGxpbmUpO1xuICAgICAgICAgIHRoaXMuaGFuZGxlUmVzcG9uc2UocmVzcG9uc2UpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBJZ25vcmUgcGFyc2UgZXJyb3JzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVJlc3BvbnNlKHJlc3BvbnNlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAocmVzcG9uc2UuaWQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnBlbmRpbmdSZXF1ZXN0cy5oYXMocmVzcG9uc2UuaWQpKSB7XG4gICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nUmVxdWVzdHMuZ2V0KHJlc3BvbnNlLmlkKSE7XG4gICAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0cy5kZWxldGUocmVzcG9uc2UuaWQpO1xuXG4gICAgICBpZiAocmVzcG9uc2UuZXJyb3IpIHtcbiAgICAgICAgcGVuZGluZy5yZWplY3QobmV3IEVycm9yKHJlc3BvbnNlLmVycm9yLm1lc3NhZ2UpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlbmRpbmcucmVzb2x2ZShyZXNwb25zZS5yZXN1bHQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2VuZFJlcXVlc3QobWV0aG9kOiBzdHJpbmcsIHBhcmFtczogdW5rbm93biA9IHt9KTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGlkID0gdGhpcy5yZXF1ZXN0SWQrKztcbiAgICAgIFxuICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMuc2V0KGlkLCB7IHJlc29sdmUsIHJlamVjdCB9KTtcblxuICAgICAgY29uc3QgcmVxdWVzdCA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgIGlkLFxuICAgICAgICBtZXRob2QsXG4gICAgICAgIHBhcmFtc1xuICAgICAgfSkgKyAnXFxuJztcblxuICAgICAgdGhpcy5wcm9jZXNzPy5zdGRpbj8ud3JpdGUocmVxdWVzdCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRUb29scygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZW5kUmVxdWVzdCgndG9vbHMvbGlzdCcpIGFzIHsgdG9vbHM6IE1DUFRvb2xbXSB9O1xuICAgICAgdGhpcy50b29scyA9IHJlc3VsdC50b29scyB8fCBbXTtcbiAgICAgIHRoaXMuZW1pdCgndG9vbC1saXN0JywgdGhpcy50b29scyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBTZXJ2ZXIgbWlnaHQgbm90IHN1cHBvcnQgdG9vbHNcbiAgICAgIHRoaXMudG9vbHMgPSBbXTtcbiAgICB9XG4gIH1cblxuICBnZXRUb29scygpOiBNQ1BUb29sW10ge1xuICAgIHJldHVybiB0aGlzLnRvb2xzO1xuICB9XG5cbiAgZ2V0VG9vbERlZmluaXRpb25zKCk6IFRvb2xEZWZpbml0aW9uW10ge1xuICAgIHJldHVybiB0aGlzLnRvb2xzLm1hcCh0b29sID0+ICh7XG4gICAgICB0eXBlOiAnZnVuY3Rpb24nIGFzIGNvbnN0LFxuICAgICAgZnVuY3Rpb246IHtcbiAgICAgICAgbmFtZTogYCR7dGhpcy5zZXJ2ZXJOYW1lfV9fJHt0b29sLm5hbWV9YCxcbiAgICAgICAgZGVzY3JpcHRpb246IHRvb2wuZGVzY3JpcHRpb24sXG4gICAgICAgIHBhcmFtZXRlcnM6IHRvb2wuaW5wdXRTY2hlbWFcbiAgICAgIH1cbiAgICB9KSk7XG4gIH1cblxuICBhc3luYyBjYWxsVG9vbChuYW1lOiBzdHJpbmcsIGFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZW5kUmVxdWVzdCgndG9vbHMvY2FsbCcsIHtcbiAgICAgIG5hbWUsXG4gICAgICBhcmd1bWVudHM6IGFyZ3NcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgaXNDb25uZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucHJvY2VzcyAhPT0gbnVsbCAmJiAhdGhpcy5wcm9jZXNzLmtpbGxlZDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTUNQTWFuYWdlciB7XG4gIHByaXZhdGUgY2xpZW50czogTWFwPHN0cmluZywgTUNQQ2xpZW50PiA9IG5ldyBNYXAoKTtcblxuICBhc3luYyBhZGRTZXJ2ZXIobmFtZTogc3RyaW5nLCBjb25maWc6IE1DUFNlcnZlckNvbmZpZyk6IFByb21pc2U8TUNQQ2xpZW50PiB7XG4gICAgaWYgKHRoaXMuY2xpZW50cy5oYXMobmFtZSkpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVtb3ZlU2VydmVyKG5hbWUpO1xuICAgIH1cblxuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBNQ1BDbGllbnQobmFtZSwgY29uZmlnKTtcbiAgICBhd2FpdCBjbGllbnQuY29ubmVjdCgpO1xuICAgIHRoaXMuY2xpZW50cy5zZXQobmFtZSwgY2xpZW50KTtcbiAgICBcbiAgICByZXR1cm4gY2xpZW50O1xuICB9XG5cbiAgYXN5bmMgcmVtb3ZlU2VydmVyKG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuY2xpZW50cy5nZXQobmFtZSk7XG4gICAgaWYgKGNsaWVudCkge1xuICAgICAgYXdhaXQgY2xpZW50LmRpc2Nvbm5lY3QoKTtcbiAgICAgIHRoaXMuY2xpZW50cy5kZWxldGUobmFtZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q2xpZW50KG5hbWU6IHN0cmluZyk6IE1DUENsaWVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50cy5nZXQobmFtZSk7XG4gIH1cblxuICBnZXRBbGxDbGllbnRzKCk6IE1DUENsaWVudFtdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmNsaWVudHMudmFsdWVzKCkpO1xuICB9XG5cbiAgZ2V0QWxsVG9vbHMoKTogTUNQVG9vbFtdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBbGxDbGllbnRzKCkuZmxhdE1hcChjbGllbnQgPT4gY2xpZW50LmdldFRvb2xzKCkpO1xuICB9XG5cbiAgZ2V0QWxsVG9vbERlZmluaXRpb25zKCk6IFRvb2xEZWZpbml0aW9uW10ge1xuICAgIHJldHVybiB0aGlzLmdldEFsbENsaWVudHMoKS5mbGF0TWFwKGNsaWVudCA9PiBjbGllbnQuZ2V0VG9vbERlZmluaXRpb25zKCkpO1xuICB9XG5cbiAgYXN5bmMgZGlzY29ubmVjdEFsbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IGNsaWVudCBvZiB0aGlzLmNsaWVudHMudmFsdWVzKCkpIHtcbiAgICAgIGF3YWl0IGNsaWVudC5kaXNjb25uZWN0KCk7XG4gICAgfVxuICAgIHRoaXMuY2xpZW50cy5jbGVhcigpO1xuICB9XG59XG4iXX0=