@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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 oFlow Team
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,81 @@
1
+ # @oflow-ai/core
2
+
3
+ Core library for oFlow CLI. Provides AI providers, tools, and utilities.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @oflow-ai/core
9
+ ```
10
+
11
+ ## Features
12
+
13
+ - **Multi-provider AI support**: OpenAI, DeepSeek, Qwen, GLM, Baichuan, Yi, Moonshot, SiliconFlow
14
+ - **Tool system**: File operations, shell commands, web search, and more
15
+ - **Conversation management**: Message history and context handling
16
+ - **MCP integration**: Model Context Protocol server support
17
+ - **Skill system**: Extensible skill packages
18
+ - **Sub-agents**: Specialized agents for different tasks
19
+ - **Sandbox execution**: Docker/Podman isolation
20
+
21
+ ## Usage
22
+
23
+ ```typescript
24
+ import { createAIProvider, Conversation, getConfigManager } from '@oflow-ai/core';
25
+
26
+ // Configure authentication
27
+ const configManager = getConfigManager();
28
+ configManager.setAuth({
29
+ provider: 'deepseek',
30
+ apiKey: 'your-api-key',
31
+ model: 'deepseek-chat'
32
+ });
33
+
34
+ // Create AI provider
35
+ const provider = createAIProvider(configManager.getAuth()!);
36
+
37
+ // Start conversation
38
+ const conversation = new Conversation({
39
+ provider,
40
+ workingDirectory: process.cwd(),
41
+ onContent: (content) => console.log(content)
42
+ });
43
+
44
+ await conversation.sendMessage('Hello!');
45
+ ```
46
+
47
+ ## Supported Providers
48
+
49
+ | Provider | Auth Type | Models |
50
+ |----------|-----------|--------|
51
+ | openai | API Key | gpt-4o, gpt-4-turbo, o1-preview, etc. |
52
+ | deepseek | API Key | deepseek-chat, deepseek-reasoner |
53
+ | qwen | API Key | qwen-turbo, qwen-plus, qwen-max |
54
+ | zhipu | API Key | glm-4, glm-4-plus, glm-4-flash |
55
+ | baichuan | API Key | Baichuan4, Baichuan3-Turbo |
56
+ | yi | API Key | yi-lightning, yi-large |
57
+ | moonshot | API Key | moonshot-v1-8k, moonshot-v1-32k |
58
+ | siliconflow | API Key | Multiple open-source models |
59
+ | custom | API Key + Base URL | Any OpenAI-compatible API |
60
+
61
+ ## Tools
62
+
63
+ Available tools:
64
+ - `read_file` - Read file contents
65
+ - `write_file` - Write to files
66
+ - `list_directory` - List directory contents
67
+ - `glob` - Find files by pattern
68
+ - `search_file_content` - Search within files
69
+ - `run_shell_command` - Execute shell commands
70
+ - `web_search` - Search the web
71
+ - `web_fetch` - Fetch web content
72
+ - `replace` - Replace text in files
73
+ - `image_read` - Analyze images
74
+ - `pdf_extract` - Extract PDF content
75
+ - `ask_user_question` - Interactive user prompts
76
+ - `task` - Launch sub-agents
77
+ - `save_memory` - Store long-term memories
78
+
79
+ ## License
80
+
81
+ MIT
@@ -0,0 +1,35 @@
1
+ import { AIProvider } from '../types';
2
+ export type AgentType = 'general-purpose' | 'plan-agent' | 'explore-agent' | 'code-reviewer' | 'frontend-tester';
3
+ export interface AgentDefinition {
4
+ type: AgentType;
5
+ name: string;
6
+ description: string;
7
+ systemPrompt: string;
8
+ allowedTools: string[] | '*';
9
+ maxTokens?: number;
10
+ temperature?: number;
11
+ }
12
+ export declare const AGENT_DEFINITIONS: Record<AgentType, AgentDefinition>;
13
+ export interface AgentResult {
14
+ success: boolean;
15
+ output: string;
16
+ filesModified?: string[];
17
+ errors?: string[];
18
+ }
19
+ export declare class Agent {
20
+ private definition;
21
+ private provider;
22
+ private toolRegistry;
23
+ private messages;
24
+ private workingDirectory;
25
+ constructor(definition: AgentDefinition, provider: AIProvider, workingDirectory: string);
26
+ execute(task: string, onProgress?: (update: string) => void): Promise<AgentResult>;
27
+ private getAllowedTools;
28
+ }
29
+ export declare class AgentFactory {
30
+ private provider;
31
+ private workingDirectory;
32
+ constructor(provider: AIProvider, workingDirectory: string);
33
+ createAgent(type: AgentType): Agent;
34
+ getAvailableAgents(): AgentDefinition[];
35
+ }
@@ -0,0 +1,233 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AgentFactory = exports.Agent = exports.AGENT_DEFINITIONS = void 0;
4
+ const tools_1 = require("../tools");
5
+ // 预定义的代理
6
+ exports.AGENT_DEFINITIONS = {
7
+ 'general-purpose': {
8
+ type: 'general-purpose',
9
+ name: 'General Purpose Agent',
10
+ description: 'For complex research, code searching, and multi-step tasks',
11
+ systemPrompt: `You are a general-purpose AI agent that can handle complex, multi-step tasks autonomously.
12
+ You have access to tools for file operations, shell commands, and web searches.
13
+ Break down complex tasks into smaller steps and execute them systematically.
14
+ Always verify your work and report results clearly.`,
15
+ allowedTools: '*',
16
+ maxTokens: 8192,
17
+ temperature: 0.7
18
+ },
19
+ 'plan-agent': {
20
+ type: 'plan-agent',
21
+ name: 'Planning Agent',
22
+ description: 'For planning, analysis, and outlining implementation steps',
23
+ systemPrompt: `You are a planning agent specialized in analyzing tasks and creating detailed implementation plans.
24
+ Your role is to:
25
+ 1. Understand the user's requirements
26
+ 2. Analyze the existing codebase
27
+ 3. Create a structured implementation plan
28
+ 4. Identify potential issues and edge cases
29
+ 5. Suggest best practices
30
+
31
+ Do NOT make code changes. Focus on analysis and planning.`,
32
+ allowedTools: ['read_file', 'list_directory', 'glob', 'search_file_content'],
33
+ maxTokens: 4096,
34
+ temperature: 0.5
35
+ },
36
+ 'explore-agent': {
37
+ type: 'explore-agent',
38
+ name: 'Exploration Agent',
39
+ description: 'For exploring and understanding codebases without making changes',
40
+ systemPrompt: `You are an exploration agent specialized in understanding and analyzing codebases.
41
+ Your role is to:
42
+ 1. Explore the project structure
43
+ 2. Identify key files and patterns
44
+ 3. Understand the architecture
45
+ 4. Answer questions about the codebase
46
+
47
+ Do NOT make any changes to files. Only read and analyze.`,
48
+ allowedTools: ['read_file', 'list_directory', 'glob', 'search_file_content'],
49
+ maxTokens: 4096,
50
+ temperature: 0.5
51
+ },
52
+ 'code-reviewer': {
53
+ type: 'code-reviewer',
54
+ name: 'Code Review Agent',
55
+ description: 'For reviewing code changes and providing feedback',
56
+ systemPrompt: `You are a code review agent specialized in reviewing code changes.
57
+ Your role is to:
58
+ 1. Review code for bugs and issues
59
+ 2. Check for security vulnerabilities
60
+ 3. Suggest improvements
61
+ 4. Ensure code follows best practices
62
+ 5. Check for performance issues
63
+
64
+ Provide constructive feedback with specific suggestions.`,
65
+ allowedTools: ['read_file', 'list_directory', 'glob', 'search_file_content'],
66
+ maxTokens: 4096,
67
+ temperature: 0.3
68
+ },
69
+ 'frontend-tester': {
70
+ type: 'frontend-tester',
71
+ name: 'Frontend Tester Agent',
72
+ description: 'For testing frontend UI and components',
73
+ systemPrompt: `You are a frontend testing agent specialized in testing web UIs.
74
+ Your role is to:
75
+ 1. Test UI components for correctness
76
+ 2. Check responsive design
77
+ 3. Verify accessibility
78
+ 4. Test user interactions
79
+ 5. Report visual issues
80
+
81
+ Focus on user-facing functionality and visual correctness.`,
82
+ allowedTools: ['read_file', 'write_file', 'run_shell_command', 'glob'],
83
+ maxTokens: 4096,
84
+ temperature: 0.3
85
+ }
86
+ };
87
+ // Agent类
88
+ class Agent {
89
+ definition;
90
+ provider;
91
+ toolRegistry;
92
+ messages = [];
93
+ workingDirectory;
94
+ constructor(definition, provider, workingDirectory) {
95
+ this.definition = definition;
96
+ this.provider = provider;
97
+ this.toolRegistry = (0, tools_1.getToolRegistry)();
98
+ this.workingDirectory = workingDirectory;
99
+ // 初始化系统提示
100
+ this.messages.push({
101
+ role: 'system',
102
+ content: definition.systemPrompt
103
+ });
104
+ }
105
+ async execute(task, onProgress) {
106
+ this.messages.push({ role: 'user', content: task });
107
+ let iterations = 0;
108
+ const maxIterations = 30;
109
+ let finalOutput = '';
110
+ const filesModified = [];
111
+ const errors = [];
112
+ while (iterations < maxIterations) {
113
+ iterations++;
114
+ // 获取允许的工具
115
+ const tools = this.getAllowedTools();
116
+ const chatOptions = {
117
+ messages: this.messages,
118
+ tools: tools.length > 0 ? tools : undefined,
119
+ toolChoice: tools.length > 0 ? 'auto' : undefined,
120
+ maxTokens: this.definition.maxTokens || 4096,
121
+ temperature: this.definition.temperature || 0.7,
122
+ stream: true
123
+ };
124
+ let currentContent = '';
125
+ let toolCalls = [];
126
+ try {
127
+ await this.provider.chatStream(chatOptions, (chunk) => {
128
+ if (chunk.delta.content) {
129
+ currentContent += chunk.delta.content;
130
+ onProgress?.(chunk.delta.content);
131
+ }
132
+ if (chunk.delta.toolCalls) {
133
+ for (const tc of chunk.delta.toolCalls) {
134
+ if (tc.id && tc.function?.name) {
135
+ toolCalls.push({
136
+ id: tc.id,
137
+ type: 'function',
138
+ function: {
139
+ name: tc.function.name,
140
+ arguments: tc.function.arguments || ''
141
+ }
142
+ });
143
+ }
144
+ else {
145
+ const existing = toolCalls.find(t => t.id === tc.id);
146
+ if (existing && tc.function?.arguments) {
147
+ existing.function.arguments += tc.function.arguments;
148
+ }
149
+ }
150
+ }
151
+ }
152
+ });
153
+ // 添加助手消息
154
+ this.messages.push({
155
+ role: 'assistant',
156
+ content: currentContent || '',
157
+ toolCalls: toolCalls.length > 0 ? toolCalls : undefined
158
+ });
159
+ // 处理工具调用
160
+ if (toolCalls.length > 0) {
161
+ for (const toolCall of toolCalls) {
162
+ onProgress?.(`\n🔧 Using tool: ${toolCall.function.name}\n`);
163
+ const toolOptions = {
164
+ workingDirectory: this.workingDirectory
165
+ };
166
+ const result = await this.toolRegistry.execute(toolCall, toolOptions);
167
+ if (result.isError) {
168
+ errors.push(`${toolCall.function.name}: ${result.content}`);
169
+ }
170
+ // 跟踪修改的文件
171
+ if (['write_file', 'replace'].includes(toolCall.function.name)) {
172
+ try {
173
+ const params = JSON.parse(toolCall.function.arguments);
174
+ if (params.file_path) {
175
+ filesModified.push(params.file_path);
176
+ }
177
+ }
178
+ catch { }
179
+ }
180
+ this.messages.push({
181
+ role: 'tool',
182
+ toolCallId: toolCall.id,
183
+ content: result.content
184
+ });
185
+ }
186
+ continue;
187
+ }
188
+ // 没有工具调用,完成
189
+ finalOutput = currentContent;
190
+ break;
191
+ }
192
+ catch (error) {
193
+ errors.push(error instanceof Error ? error.message : String(error));
194
+ break;
195
+ }
196
+ }
197
+ return {
198
+ success: errors.length === 0,
199
+ output: finalOutput,
200
+ filesModified: filesModified.length > 0 ? filesModified : undefined,
201
+ errors: errors.length > 0 ? errors : undefined
202
+ };
203
+ }
204
+ getAllowedTools() {
205
+ const allTools = this.toolRegistry.getDefinitions();
206
+ if (this.definition.allowedTools === '*') {
207
+ return allTools;
208
+ }
209
+ return allTools.filter(tool => this.definition.allowedTools.includes(tool.function.name));
210
+ }
211
+ }
212
+ exports.Agent = Agent;
213
+ // Agent工厂
214
+ class AgentFactory {
215
+ provider;
216
+ workingDirectory;
217
+ constructor(provider, workingDirectory) {
218
+ this.provider = provider;
219
+ this.workingDirectory = workingDirectory;
220
+ }
221
+ createAgent(type) {
222
+ const definition = exports.AGENT_DEFINITIONS[type];
223
+ if (!definition) {
224
+ throw new Error(`Unknown agent type: ${type}`);
225
+ }
226
+ return new Agent(definition, this.provider, this.workingDirectory);
227
+ }
228
+ getAvailableAgents() {
229
+ return Object.values(exports.AGENT_DEFINITIONS);
230
+ }
231
+ }
232
+ exports.AgentFactory = AgentFactory;
233
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWdlbnRzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLG9DQUE2RTtBQWU3RSxTQUFTO0FBQ0ksUUFBQSxpQkFBaUIsR0FBdUM7SUFDbkUsaUJBQWlCLEVBQUU7UUFDakIsSUFBSSxFQUFFLGlCQUFpQjtRQUN2QixJQUFJLEVBQUUsdUJBQXVCO1FBQzdCLFdBQVcsRUFBRSw0REFBNEQ7UUFDekUsWUFBWSxFQUFFOzs7b0RBR2tDO1FBQ2hELFlBQVksRUFBRSxHQUFHO1FBQ2pCLFNBQVMsRUFBRSxJQUFJO1FBQ2YsV0FBVyxFQUFFLEdBQUc7S0FDakI7SUFDRCxZQUFZLEVBQUU7UUFDWixJQUFJLEVBQUUsWUFBWTtRQUNsQixJQUFJLEVBQUUsZ0JBQWdCO1FBQ3RCLFdBQVcsRUFBRSw0REFBNEQ7UUFDekUsWUFBWSxFQUFFOzs7Ozs7OzswREFRd0M7UUFDdEQsWUFBWSxFQUFFLENBQUMsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxxQkFBcUIsQ0FBQztRQUM1RSxTQUFTLEVBQUUsSUFBSTtRQUNmLFdBQVcsRUFBRSxHQUFHO0tBQ2pCO0lBQ0QsZUFBZSxFQUFFO1FBQ2YsSUFBSSxFQUFFLGVBQWU7UUFDckIsSUFBSSxFQUFFLG1CQUFtQjtRQUN6QixXQUFXLEVBQUUsa0VBQWtFO1FBQy9FLFlBQVksRUFBRTs7Ozs7Ozt5REFPdUM7UUFDckQsWUFBWSxFQUFFLENBQUMsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxxQkFBcUIsQ0FBQztRQUM1RSxTQUFTLEVBQUUsSUFBSTtRQUNmLFdBQVcsRUFBRSxHQUFHO0tBQ2pCO0lBQ0QsZUFBZSxFQUFFO1FBQ2YsSUFBSSxFQUFFLGVBQWU7UUFDckIsSUFBSSxFQUFFLG1CQUFtQjtRQUN6QixXQUFXLEVBQUUsbURBQW1EO1FBQ2hFLFlBQVksRUFBRTs7Ozs7Ozs7eURBUXVDO1FBQ3JE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QztJQUNKLENBQUM7Q0FDRjtBQXJKRCxzQkFxSkM7QUFFRCxVQUFVO0FBQ1YsTUFBYSxZQUFZO0lBQ2YsUUFBUSxDQUFhO0lBQ3JCLGdCQUFnQixDQUFTO0lBRWpDLFlBQVksUUFBb0IsRUFBRSxnQkFBd0I7UUFDeEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0lBQzNDLENBQUM7SUFFRCxXQUFXLENBQUMsSUFBZTtRQUN6QixNQUFNLFVBQVUsR0FBRyx5QkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBQ0QsT0FBTyxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyx5QkFBaUIsQ0FBQyxDQUFDO0lBQzFDLENBQUM7Q0FDRjtBQXBCRCxvQ0FvQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBSVByb3ZpZGVyLCBDaGF0Q29tcGxldGlvbk9wdGlvbnMsIE1lc3NhZ2UsIFRvb2xEZWZpbml0aW9uLCBUb29sQ2FsbCwgU3RyZWFtQ2h1bmsgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBUb29sUmVnaXN0cnksIGdldFRvb2xSZWdpc3RyeSwgVG9vbEV4ZWN1dGVPcHRpb25zIH0gZnJvbSAnLi4vdG9vbHMnO1xuXG4vLyBBZ2VudOexu+Wei+WumuS5iVxuZXhwb3J0IHR5cGUgQWdlbnRUeXBlID0gJ2dlbmVyYWwtcHVycG9zZScgfCAncGxhbi1hZ2VudCcgfCAnZXhwbG9yZS1hZ2VudCcgfCAnY29kZS1yZXZpZXdlcicgfCAnZnJvbnRlbmQtdGVzdGVyJztcblxuZXhwb3J0IGludGVyZmFjZSBBZ2VudERlZmluaXRpb24ge1xuICB0eXBlOiBBZ2VudFR5cGU7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgc3lzdGVtUHJvbXB0OiBzdHJpbmc7XG4gIGFsbG93ZWRUb29sczogc3RyaW5nW10gfCAnKic7XG4gIG1heFRva2Vucz86IG51bWJlcjtcbiAgdGVtcGVyYXR1cmU/OiBudW1iZXI7XG59XG5cbi8vIOmihOWumuS5ieeahOS7o+eQhlxuZXhwb3J0IGNvbnN0IEFHRU5UX0RFRklOSVRJT05TOiBSZWNvcmQ8QWdlbnRUeXBlLCBBZ2VudERlZmluaXRpb24+ID0ge1xuICAnZ2VuZXJhbC1wdXJwb3NlJzoge1xuICAgIHR5cGU6ICdnZW5lcmFsLXB1cnBvc2UnLFxuICAgIG5hbWU6ICdHZW5lcmFsIFB1cnBvc2UgQWdlbnQnLFxuICAgIGRlc2NyaXB0aW9uOiAnRm9yIGNvbXBsZXggcmVzZWFyY2gsIGNvZGUgc2VhcmNoaW5nLCBhbmQgbXVsdGktc3RlcCB0YXNrcycsXG4gICAgc3lzdGVtUHJvbXB0OiBgWW91IGFyZSBhIGdlbmVyYWwtcHVycG9zZSBBSSBhZ2VudCB0aGF0IGNhbiBoYW5kbGUgY29tcGxleCwgbXVsdGktc3RlcCB0YXNrcyBhdXRvbm9tb3VzbHkuXG5Zb3UgaGF2ZSBhY2Nlc3MgdG8gdG9vbHMgZm9yIGZpbGUgb3BlcmF0aW9ucywgc2hlbGwgY29tbWFuZHMsIGFuZCB3ZWIgc2VhcmNoZXMuXG5CcmVhayBkb3duIGNvbXBsZXggdGFza3MgaW50byBzbWFsbGVyIHN0ZXBzIGFuZCBleGVjdXRlIHRoZW0gc3lzdGVtYXRpY2FsbHkuXG5BbHdheXMgdmVyaWZ5IHlvdXIgd29yayBhbmQgcmVwb3J0IHJlc3VsdHMgY2xlYXJseS5gLFxuICAgIGFsbG93ZWRUb29sczogJyonLFxuICAgIG1heFRva2VuczogODE5MixcbiAgICB0ZW1wZXJhdHVyZTogMC43XG4gIH0sXG4gICdwbGFuLWFnZW50Jzoge1xuICAgIHR5cGU6ICdwbGFuLWFnZW50JyxcbiAgICBuYW1lOiAnUGxhbm5pbmcgQWdlbnQnLFxuICAgIGRlc2NyaXB0aW9uOiAnRm9yIHBsYW5uaW5nLCBhbmFseXNpcywgYW5kIG91dGxpbmluZyBpbXBsZW1lbnRhdGlvbiBzdGVwcycsXG4gICAgc3lzdGVtUHJvbXB0OiBgWW91IGFyZSBhIHBsYW5uaW5nIGFnZW50IHNwZWNpYWxpemVkIGluIGFuYWx5emluZyB0YXNrcyBhbmQgY3JlYXRpbmcgZGV0YWlsZWQgaW1wbGVtZW50YXRpb24gcGxhbnMuXG5Zb3VyIHJvbGUgaXMgdG86XG4xLiBVbmRlcnN0YW5kIHRoZSB1c2VyJ3MgcmVxdWlyZW1lbnRzXG4yLiBBbmFseXplIHRoZSBleGlzdGluZyBjb2RlYmFzZVxuMy4gQ3JlYXRlIGEgc3RydWN0dXJlZCBpbXBsZW1lbnRhdGlvbiBwbGFuXG40LiBJZGVudGlmeSBwb3RlbnRpYWwgaXNzdWVzIGFuZCBlZGdlIGNhc2VzXG41LiBTdWdnZXN0IGJlc3QgcHJhY3RpY2VzXG5cbkRvIE5PVCBtYWtlIGNvZGUgY2hhbmdlcy4gRm9jdXMgb24gYW5hbHlzaXMgYW5kIHBsYW5uaW5nLmAsXG4gICAgYWxsb3dlZFRvb2xzOiBbJ3JlYWRfZmlsZScsICdsaXN0X2RpcmVjdG9yeScsICdnbG9iJywgJ3NlYXJjaF9maWxlX2NvbnRlbnQnXSxcbiAgICBtYXhUb2tlbnM6IDQwOTYsXG4gICAgdGVtcGVyYXR1cmU6IDAuNVxuICB9LFxuICAnZXhwbG9yZS1hZ2VudCc6IHtcbiAgICB0eXBlOiAnZXhwbG9yZS1hZ2VudCcsXG4gICAgbmFtZTogJ0V4cGxvcmF0aW9uIEFnZW50JyxcbiAgICBkZXNjcmlwdGlvbjogJ0ZvciBleHBsb3JpbmcgYW5kIHVuZGVyc3RhbmRpbmcgY29kZWJhc2VzIHdpdGhvdXQgbWFraW5nIGNoYW5nZXMnLFxuICAgIHN5c3RlbVByb21wdDogYFlvdSBhcmUgYW4gZXhwbG9yYXRpb24gYWdlbnQgc3BlY2lhbGl6ZWQgaW4gdW5kZXJzdGFuZGluZyBhbmQgYW5hbHl6aW5nIGNvZGViYXNlcy5cbllvdXIgcm9sZSBpcyB0bzpcbjEuIEV4cGxvcmUgdGhlIHByb2plY3Qgc3RydWN0dXJlXG4yLiBJZGVudGlmeSBrZXkgZmlsZXMgYW5kIHBhdHRlcm5zXG4zLiBVbmRlcnN0YW5kIHRoZSBhcmNoaXRlY3R1cmVcbjQuIEFuc3dlciBxdWVzdGlvbnMgYWJvdXQgdGhlIGNvZGViYXNlXG5cbkRvIE5PVCBtYWtlIGFueSBjaGFuZ2VzIHRvIGZpbGVzLiBPbmx5IHJlYWQgYW5kIGFuYWx5emUuYCxcbiAgICBhbGxvd2VkVG9vbHM6IFsncmVhZF9maWxlJywgJ2xpc3RfZGlyZWN0b3J5JywgJ2dsb2InLCAnc2VhcmNoX2ZpbGVfY29udGVudCddLFxuICAgIG1heFRva2VuczogNDA5NixcbiAgICB0ZW1wZXJhdHVyZTogMC41XG4gIH0sXG4gICdjb2RlLXJldmlld2VyJzoge1xuICAgIHR5cGU6ICdjb2RlLXJldmlld2VyJyxcbiAgICBuYW1lOiAnQ29kZSBSZXZpZXcgQWdlbnQnLFxuICAgIGRlc2NyaXB0aW9uOiAnRm9yIHJldmlld2luZyBjb2RlIGNoYW5nZXMgYW5kIHByb3ZpZGluZyBmZWVkYmFjaycsXG4gICAgc3lzdGVtUHJvbXB0OiBgWW91IGFyZSBhIGNvZGUgcmV2aWV3IGFnZW50IHNwZWNpYWxpemVkIGluIHJldmlld2luZyBjb2RlIGNoYW5nZXMuXG5Zb3VyIHJvbGUgaXMgdG86XG4xLiBSZXZpZXcgY29kZSBmb3IgYnVncyBhbmQgaXNzdWVzXG4yLiBDaGVjayBmb3Igc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzXG4zLiBTdWdnZXN0IGltcHJvdmVtZW50c1xuNC4gRW5zdXJlIGNvZGUgZm9sbG93cyBiZXN0IHByYWN0aWNlc1xuNS4gQ2hlY2sgZm9yIHBlcmZvcm1hbmNlIGlzc3Vlc1xuXG5Qcm92aWRlIGNvbnN0cnVjdGl2ZSBmZWVkYmFjayB3aXRoIHNwZWNpZmljIHN1Z2dlc3Rpb25zLmAsXG4gICAgYWxsb3dlZFRvb2xzOiBbJ3JlYWRfZmlsZScsICdsaXN0X2RpcmVjdG9yeScsICdnbG9iJywgJ3NlYXJjaF9maWxlX2NvbnRlbnQnXSxcbiAgICBtYXhUb2tlbnM6IDQwOTYsXG4gICAgdGVtcGVyYXR1cmU6IDAuM1xuICB9LFxuICAnZnJvbnRlbmQtdGVzdGVyJzoge1xuICAgIHR5cGU6ICdmcm9udGVuZC10ZXN0ZXInLFxuICAgIG5hbWU6ICdGcm9udGVuZCBUZXN0ZXIgQWdlbnQnLFxuICAgIGRlc2NyaXB0aW9uOiAnRm9yIHRlc3RpbmcgZnJvbnRlbmQgVUkgYW5kIGNvbXBvbmVudHMnLFxuICAgIHN5c3RlbVByb21wdDogYFlvdSBhcmUgYSBmcm9udGVuZCB0ZXN0aW5nIGFnZW50IHNwZWNpYWxpemVkIGluIHRlc3Rpbmcgd2ViIFVJcy5cbllvdXIgcm9sZSBpcyB0bzpcbjEuIFRlc3QgVUkgY29tcG9uZW50cyBmb3IgY29ycmVjdG5lc3NcbjIuIENoZWNrIHJlc3BvbnNpdmUgZGVzaWduXG4zLiBWZXJpZnkgYWNjZXNzaWJpbGl0eVxuNC4gVGVzdCB1c2VyIGludGVyYWN0aW9uc1xuNS4gUmVwb3J0IHZpc3VhbCBpc3N1ZXNcblxuRm9jdXMgb24gdXNlci1mYWNpbmcgZnVuY3Rpb25hbGl0eSBhbmQgdmlzdWFsIGNvcnJlY3RuZXNzLmAsXG4gICAgYWxsb3dlZFRvb2xzOiBbJ3JlYWRfZmlsZScsICd3cml0ZV9maWxlJywgJ3J1bl9zaGVsbF9jb21tYW5kJywgJ2dsb2InXSxcbiAgICBtYXhUb2tlbnM6IDQwOTYsXG4gICAgdGVtcGVyYXR1cmU6IDAuM1xuICB9XG59O1xuXG4vLyBBZ2VudOaJp+ihjOe7k+aenFxuZXhwb3J0IGludGVyZmFjZSBBZ2VudFJlc3VsdCB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIG91dHB1dDogc3RyaW5nO1xuICBmaWxlc01vZGlmaWVkPzogc3RyaW5nW107XG4gIGVycm9ycz86IHN0cmluZ1tdO1xufVxuXG4vLyBBZ2VudOexu1xuZXhwb3J0IGNsYXNzIEFnZW50IHtcbiAgcHJpdmF0ZSBkZWZpbml0aW9uOiBBZ2VudERlZmluaXRpb247XG4gIHByaXZhdGUgcHJvdmlkZXI6IEFJUHJvdmlkZXI7XG4gIHByaXZhdGUgdG9vbFJlZ2lzdHJ5OiBUb29sUmVnaXN0cnk7XG4gIHByaXZhdGUgbWVzc2FnZXM6IE1lc3NhZ2VbXSA9IFtdO1xuICBwcml2YXRlIHdvcmtpbmdEaXJlY3Rvcnk6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBkZWZpbml0aW9uOiBBZ2VudERlZmluaXRpb24sXG4gICAgcHJvdmlkZXI6IEFJUHJvdmlkZXIsXG4gICAgd29ya2luZ0RpcmVjdG9yeTogc3RyaW5nXG4gICkge1xuICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247XG4gICAgdGhpcy5wcm92aWRlciA9IHByb3ZpZGVyO1xuICAgIHRoaXMudG9vbFJlZ2lzdHJ5ID0gZ2V0VG9vbFJlZ2lzdHJ5KCk7XG4gICAgdGhpcy53b3JraW5nRGlyZWN0b3J5ID0gd29ya2luZ0RpcmVjdG9yeTtcbiAgICBcbiAgICAvLyDliJ3lp4vljJbns7vnu5/mj5DnpLpcbiAgICB0aGlzLm1lc3NhZ2VzLnB1c2goe1xuICAgICAgcm9sZTogJ3N5c3RlbScsXG4gICAgICBjb250ZW50OiBkZWZpbml0aW9uLnN5c3RlbVByb21wdFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZSh0YXNrOiBzdHJpbmcsIG9uUHJvZ3Jlc3M/OiAodXBkYXRlOiBzdHJpbmcpID0+IHZvaWQpOiBQcm9taXNlPEFnZW50UmVzdWx0PiB7XG4gICAgdGhpcy5tZXNzYWdlcy5wdXNoKHsgcm9sZTogJ3VzZXInLCBjb250ZW50OiB0YXNrIH0pO1xuXG4gICAgbGV0IGl0ZXJhdGlvbnMgPSAwO1xuICAgIGNvbnN0IG1heEl0ZXJhdGlvbnMgPSAzMDtcbiAgICBsZXQgZmluYWxPdXRwdXQgPSAnJztcbiAgICBjb25zdCBmaWxlc01vZGlmaWVkOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgIHdoaWxlIChpdGVyYXRpb25zIDwgbWF4SXRlcmF0aW9ucykge1xuICAgICAgaXRlcmF0aW9ucysrO1xuXG4gICAgICAvLyDojrflj5blhYHorrjnmoTlt6XlhbdcbiAgICAgIGNvbnN0IHRvb2xzID0gdGhpcy5nZXRBbGxvd2VkVG9vbHMoKTtcbiAgICAgIFxuICAgICAgY29uc3QgY2hhdE9wdGlvbnM6IENoYXRDb21wbGV0aW9uT3B0aW9ucyA9IHtcbiAgICAgICAgbWVzc2FnZXM6IHRoaXMubWVzc2FnZXMsXG4gICAgICAgIHRvb2xzOiB0b29scy5sZW5ndGggPiAwID8gdG9vbHMgOiB1bmRlZmluZWQsXG4gICAgICAgIHRvb2xDaG9pY2U6IHRvb2xzLmxlbmd0aCA+IDAgPyAnYXV0bycgOiB1bmRlZmluZWQsXG4gICAgICAgIG1heFRva2VuczogdGhpcy5kZWZpbml0aW9uLm1heFRva2VucyB8fCA0MDk2LFxuICAgICAgICB0ZW1wZXJhdHVyZTogdGhpcy5kZWZpbml0aW9uLnRlbXBlcmF0dXJlIHx8IDAuNyxcbiAgICAgICAgc3RyZWFtOiB0cnVlXG4gICAgICB9O1xuXG4gICAgICBsZXQgY3VycmVudENvbnRlbnQgPSAnJztcbiAgICAgIGxldCB0b29sQ2FsbHM6IFRvb2xDYWxsW10gPSBbXTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5wcm92aWRlci5jaGF0U3RyZWFtKGNoYXRPcHRpb25zLCAoY2h1bms6IFN0cmVhbUNodW5rKSA9PiB7XG4gICAgICAgICAgaWYgKGNodW5rLmRlbHRhLmNvbnRlbnQpIHtcbiAgICAgICAgICAgIGN1cnJlbnRDb250ZW50ICs9IGNodW5rLmRlbHRhLmNvbnRlbnQ7XG4gICAgICAgICAgICBvblByb2dyZXNzPy4oY2h1bmsuZGVsdGEuY29udGVudCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGNodW5rLmRlbHRhLnRvb2xDYWxscykge1xuICAgICAgICAgICAgZm9yIChjb25zdCB0YyBvZiBjaHVuay5kZWx0YS50b29sQ2FsbHMpIHtcbiAgICAgICAgICAgICAgaWYgKHRjLmlkICYmIHRjLmZ1bmN0aW9uPy5uYW1lKSB7XG4gICAgICAgICAgICAgICAgdG9vbENhbGxzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgaWQ6IHRjLmlkLFxuICAgICAgICAgICAgICAgICAgdHlwZTogJ2Z1bmN0aW9uJyxcbiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHRjLmZ1bmN0aW9uLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50czogdGMuZnVuY3Rpb24uYXJndW1lbnRzIHx8ICcnXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSB0b29sQ2FsbHMuZmluZCh0ID0+IHQuaWQgPT09IHRjLmlkKTtcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmcgJiYgdGMuZnVuY3Rpb24/LmFyZ3VtZW50cykge1xuICAgICAgICAgICAgICAgICAgZXhpc3RpbmcuZnVuY3Rpb24uYXJndW1lbnRzICs9IHRjLmZ1bmN0aW9uLmFyZ3VtZW50cztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIOa3u+WKoOWKqeaJi+a2iOaBr1xuICAgICAgICB0aGlzLm1lc3NhZ2VzLnB1c2goe1xuICAgICAgICAgIHJvbGU6ICdhc3Npc3RhbnQnLFxuICAgICAgICAgIGNvbnRlbnQ6IGN1cnJlbnRDb250ZW50IHx8ICcnLFxuICAgICAgICAgIHRvb2xDYWxsczogdG9vbENhbGxzLmxlbmd0aCA+IDAgPyB0b29sQ2FsbHMgOiB1bmRlZmluZWRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8g5aSE55CG5bel5YW36LCD55SoXG4gICAgICAgIGlmICh0b29sQ2FsbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZvciAoY29uc3QgdG9vbENhbGwgb2YgdG9vbENhbGxzKSB7XG4gICAgICAgICAgICBvblByb2dyZXNzPy4oYFxcbvCflKcgVXNpbmcgdG9vbDogJHt0b29sQ2FsbC5mdW5jdGlvbi5uYW1lfVxcbmApO1xuXG4gICAgICAgICAgICBjb25zdCB0b29sT3B0aW9uczogVG9vbEV4ZWN1dGVPcHRpb25zID0ge1xuICAgICAgICAgICAgICB3b3JraW5nRGlyZWN0b3J5OiB0aGlzLndvcmtpbmdEaXJlY3RvcnlcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMudG9vbFJlZ2lzdHJ5LmV4ZWN1dGUodG9vbENhbGwsIHRvb2xPcHRpb25zKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0Vycm9yKSB7XG4gICAgICAgICAgICAgIGVycm9ycy5wdXNoKGAke3Rvb2xDYWxsLmZ1bmN0aW9uLm5hbWV9OiAke3Jlc3VsdC5jb250ZW50fWApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyDot5/ouKrkv67mlLnnmoTmlofku7ZcbiAgICAgICAgICAgIGlmIChbJ3dyaXRlX2ZpbGUnLCAncmVwbGFjZSddLmluY2x1ZGVzKHRvb2xDYWxsLmZ1bmN0aW9uLm5hbWUpKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gSlNPTi5wYXJzZSh0b29sQ2FsbC5mdW5jdGlvbi5hcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgIGlmIChwYXJhbXMuZmlsZV9wYXRoKSB7XG4gICAgICAgICAgICAgICAgICBmaWxlc01vZGlmaWVkLnB1c2gocGFyYW1zLmZpbGVfcGF0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGNhdGNoIHt9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubWVzc2FnZXMucHVzaCh7XG4gICAgICAgICAgICAgIHJvbGU6ICd0b29sJyxcbiAgICAgICAgICAgICAgdG9vbENhbGxJZDogdG9vbENhbGwuaWQsXG4gICAgICAgICAgICAgIGNvbnRlbnQ6IHJlc3VsdC5jb250ZW50XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDmsqHmnInlt6XlhbfosIPnlKjvvIzlrozmiJBcbiAgICAgICAgZmluYWxPdXRwdXQgPSBjdXJyZW50Q29udGVudDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiBlcnJvcnMubGVuZ3RoID09PSAwLFxuICAgICAgb3V0cHV0OiBmaW5hbE91dHB1dCxcbiAgICAgIGZpbGVzTW9kaWZpZWQ6IGZpbGVzTW9kaWZpZWQubGVuZ3RoID4gMCA/IGZpbGVzTW9kaWZpZWQgOiB1bmRlZmluZWQsXG4gICAgICBlcnJvcnM6IGVycm9ycy5sZW5ndGggPiAwID8gZXJyb3JzIDogdW5kZWZpbmVkXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QWxsb3dlZFRvb2xzKCk6IFRvb2xEZWZpbml0aW9uW10ge1xuICAgIGNvbnN0IGFsbFRvb2xzID0gdGhpcy50b29sUmVnaXN0cnkuZ2V0RGVmaW5pdGlvbnMoKTtcbiAgICBcbiAgICBpZiAodGhpcy5kZWZpbml0aW9uLmFsbG93ZWRUb29scyA9PT0gJyonKSB7XG4gICAgICByZXR1cm4gYWxsVG9vbHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFsbFRvb2xzLmZpbHRlcih0b29sID0+IFxuICAgICAgdGhpcy5kZWZpbml0aW9uLmFsbG93ZWRUb29scy5pbmNsdWRlcyh0b29sLmZ1bmN0aW9uLm5hbWUpXG4gICAgKTtcbiAgfVxufVxuXG4vLyBBZ2VudOW3peWOglxuZXhwb3J0IGNsYXNzIEFnZW50RmFjdG9yeSB7XG4gIHByaXZhdGUgcHJvdmlkZXI6IEFJUHJvdmlkZXI7XG4gIHByaXZhdGUgd29ya2luZ0RpcmVjdG9yeTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHByb3ZpZGVyOiBBSVByb3ZpZGVyLCB3b3JraW5nRGlyZWN0b3J5OiBzdHJpbmcpIHtcbiAgICB0aGlzLnByb3ZpZGVyID0gcHJvdmlkZXI7XG4gICAgdGhpcy53b3JraW5nRGlyZWN0b3J5ID0gd29ya2luZ0RpcmVjdG9yeTtcbiAgfVxuXG4gIGNyZWF0ZUFnZW50KHR5cGU6IEFnZW50VHlwZSk6IEFnZW50IHtcbiAgICBjb25zdCBkZWZpbml0aW9uID0gQUdFTlRfREVGSU5JVElPTlNbdHlwZV07XG4gICAgaWYgKCFkZWZpbml0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYWdlbnQgdHlwZTogJHt0eXBlfWApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEFnZW50KGRlZmluaXRpb24sIHRoaXMucHJvdmlkZXIsIHRoaXMud29ya2luZ0RpcmVjdG9yeSk7XG4gIH1cblxuICBnZXRBdmFpbGFibGVBZ2VudHMoKTogQWdlbnREZWZpbml0aW9uW10ge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKEFHRU5UX0RFRklOSVRJT05TKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,146 @@
1
+ import { AIProvider, ChatCompletionOptions, ChatCompletionResponse, StreamChunk } from '../types';
2
+ export declare const CHINESE_MODELS: {
3
+ readonly deepseek: {
4
+ readonly name: "DeepSeek (深度求索)";
5
+ readonly baseUrl: "https://api.deepseek.com/v1";
6
+ readonly models: readonly [{
7
+ readonly id: "deepseek-chat";
8
+ readonly name: "DeepSeek Chat";
9
+ readonly desc: "通用对话模型";
10
+ }, {
11
+ readonly id: "deepseek-reasoner";
12
+ readonly name: "DeepSeek Reasoner";
13
+ readonly desc: "推理增强模型 (显示思考过程)";
14
+ }];
15
+ };
16
+ readonly qwen: {
17
+ readonly name: "通义千问 (Qwen)";
18
+ readonly baseUrl: "https://dashscope.aliyuncs.com/compatible-mode/v1";
19
+ readonly models: readonly [{
20
+ readonly id: "qwen-turbo";
21
+ readonly name: "Qwen Turbo";
22
+ readonly desc: "快速响应";
23
+ }, {
24
+ readonly id: "qwen-plus";
25
+ readonly name: "Qwen Plus";
26
+ readonly desc: "均衡性能";
27
+ }, {
28
+ readonly id: "qwen-max";
29
+ readonly name: "Qwen Max";
30
+ readonly desc: "最强能力";
31
+ }, {
32
+ readonly id: "qwen-long";
33
+ readonly name: "Qwen Long";
34
+ readonly desc: "长文本处理";
35
+ }];
36
+ };
37
+ readonly zhipu: {
38
+ readonly name: "智谱 GLM";
39
+ readonly baseUrl: "https://open.bigmodel.cn/api/paas/v4";
40
+ readonly models: readonly [{
41
+ readonly id: "glm-4-plus";
42
+ readonly name: "GLM-4 Plus";
43
+ readonly desc: "最新旗舰模型";
44
+ }, {
45
+ readonly id: "glm-4";
46
+ readonly name: "GLM-4";
47
+ readonly desc: "主力模型";
48
+ }, {
49
+ readonly id: "glm-4-flash";
50
+ readonly name: "GLM-4 Flash";
51
+ readonly desc: "快速响应";
52
+ }, {
53
+ readonly id: "glm-4-long";
54
+ readonly name: "GLM-4 Long";
55
+ readonly desc: "长文本处理";
56
+ }];
57
+ };
58
+ readonly baichuan: {
59
+ readonly name: "百川 (Baichuan)";
60
+ readonly baseUrl: "https://api.baichuan-ai.com/v1";
61
+ readonly models: readonly [{
62
+ readonly id: "Baichuan4";
63
+ readonly name: "Baichuan4";
64
+ readonly desc: "旗舰模型";
65
+ }, {
66
+ readonly id: "Baichuan3-Turbo";
67
+ readonly name: "Baichuan3 Turbo";
68
+ readonly desc: "快速响应";
69
+ }];
70
+ };
71
+ readonly yi: {
72
+ readonly name: "零一万物 (Yi)";
73
+ readonly baseUrl: "https://api.lingyiwanwu.com/v1";
74
+ readonly models: readonly [{
75
+ readonly id: "yi-lightning";
76
+ readonly name: "Yi Lightning";
77
+ readonly desc: "快速响应";
78
+ }, {
79
+ readonly id: "yi-large";
80
+ readonly name: "Yi Large";
81
+ readonly desc: "主力模型";
82
+ }, {
83
+ readonly id: "yi-medium";
84
+ readonly name: "Yi Medium";
85
+ readonly desc: "均衡性价比";
86
+ }];
87
+ };
88
+ readonly moonshot: {
89
+ readonly name: "月之暗面 (Moonshot)";
90
+ readonly baseUrl: "https://api.moonshot.cn/v1";
91
+ readonly models: readonly [{
92
+ readonly id: "moonshot-v1-8k";
93
+ readonly name: "Moonshot V1 8K";
94
+ readonly desc: "标准版";
95
+ }, {
96
+ readonly id: "moonshot-v1-32k";
97
+ readonly name: "Moonshot V1 32K";
98
+ readonly desc: "长文本版";
99
+ }, {
100
+ readonly id: "moonshot-v1-128k";
101
+ readonly name: "Moonshot V1 128K";
102
+ readonly desc: "超长文本版";
103
+ }];
104
+ };
105
+ readonly siliconflow: {
106
+ readonly name: "SiliconFlow (一站式API)";
107
+ readonly baseUrl: "https://api.siliconflow.cn/v1";
108
+ readonly models: readonly [{
109
+ readonly id: "Qwen/Qwen2.5-72B-Instruct";
110
+ readonly name: "Qwen2.5 72B";
111
+ readonly desc: "通义千问开源版";
112
+ }, {
113
+ readonly id: "deepseek-ai/DeepSeek-V2.5";
114
+ readonly name: "DeepSeek V2.5";
115
+ readonly desc: "DeepSeek开源版";
116
+ }, {
117
+ readonly id: "THUDM/glm-4-9b-chat";
118
+ readonly name: "GLM-4 9B";
119
+ readonly desc: "智谱开源版";
120
+ }];
121
+ };
122
+ };
123
+ export declare const DEFAULT_CHINESE_MODELS: readonly [{
124
+ readonly provider: "deepseek";
125
+ readonly model: "deepseek-chat";
126
+ readonly reason: "高性价比, 支持工具调用";
127
+ }, {
128
+ readonly provider: "qwen";
129
+ readonly model: "qwen-plus";
130
+ readonly reason: "综合能力强, 中文优化";
131
+ }, {
132
+ readonly provider: "zhipu";
133
+ readonly model: "glm-4-flash";
134
+ readonly reason: "免费额度, 快速响应";
135
+ }];
136
+ export declare class ChineseProvider implements AIProvider {
137
+ name: string;
138
+ private client;
139
+ private apiKey;
140
+ private defaultModel;
141
+ private providerName;
142
+ constructor(apiKey: string, baseUrl: string, defaultModel?: string, providerName?: string);
143
+ chat(options: ChatCompletionOptions): Promise<ChatCompletionResponse>;
144
+ chatStream(options: ChatCompletionOptions, onChunk: (chunk: StreamChunk) => void): Promise<void>;
145
+ getModels(): Promise<string[]>;
146
+ }