@runflow-ai/sdk 1.0.0 → 1.0.1
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 +656 -0
- package/dist/agents/runflow-agent.d.ts +53 -0
- package/dist/agents/runflow-agent.d.ts.map +1 -0
- package/dist/agents/runflow-agent.js +263 -0
- package/dist/agents/runflow-agent.js.map +1 -0
- package/dist/agents/server.d.ts +45 -0
- package/dist/agents/server.d.ts.map +1 -0
- package/dist/agents/server.js +315 -0
- package/dist/agents/server.js.map +1 -0
- package/dist/config.d.ts +17 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +131 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +44 -3
- package/dist/index.js.map +1 -1
- package/dist/runflow-sdk.d.ts +28 -3
- package/dist/runflow-sdk.d.ts.map +1 -1
- package/dist/runflow-sdk.js +403 -52
- package/dist/runflow-sdk.js.map +1 -1
- package/dist/singleton.d.ts +37 -0
- package/dist/singleton.d.ts.map +1 -0
- package/dist/singleton.js +86 -0
- package/dist/singleton.js.map +1 -0
- package/dist/types.d.ts +64 -20
- package/dist/types.d.ts.map +1 -1
- package/package.json +50 -38
|
@@ -0,0 +1,263 @@
|
|
|
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.RunflowAgent = void 0;
|
|
37
|
+
const runflow_sdk_1 = require("../runflow-sdk");
|
|
38
|
+
const anthropic_1 = require("@langchain/anthropic");
|
|
39
|
+
const openai_1 = require("@langchain/openai");
|
|
40
|
+
const messages_1 = require("@langchain/core/messages");
|
|
41
|
+
const agents_1 = require("langchain/agents");
|
|
42
|
+
const prompts_1 = require("@langchain/core/prompts");
|
|
43
|
+
const tools_1 = require("@langchain/core/tools");
|
|
44
|
+
const fs = __importStar(require("fs"));
|
|
45
|
+
const path = __importStar(require("path"));
|
|
46
|
+
class RunflowAgent {
|
|
47
|
+
constructor(config) {
|
|
48
|
+
this.tools = [];
|
|
49
|
+
this.systemPromptContent = '';
|
|
50
|
+
this.currentCompanyId = '';
|
|
51
|
+
this.config = config;
|
|
52
|
+
this.sdk = new runflow_sdk_1.RunflowSDK();
|
|
53
|
+
}
|
|
54
|
+
async initialize() {
|
|
55
|
+
if (this.llm)
|
|
56
|
+
return; // Já inicializado
|
|
57
|
+
// Buscar credencial
|
|
58
|
+
const credential = await this.sdk.getCredential(this.config.llm.credential);
|
|
59
|
+
const apiKey = credential.apiKey;
|
|
60
|
+
// Inicializar LLM
|
|
61
|
+
if (this.config.llm.provider === 'anthropic') {
|
|
62
|
+
this.llm = new anthropic_1.ChatAnthropic({
|
|
63
|
+
anthropicApiKey: apiKey,
|
|
64
|
+
modelName: this.config.llm.model,
|
|
65
|
+
temperature: this.config.llm.temperature || 0.7,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
else if (this.config.llm.provider === 'openai') {
|
|
69
|
+
this.llm = new openai_1.ChatOpenAI({
|
|
70
|
+
openAIApiKey: apiKey,
|
|
71
|
+
modelName: this.config.llm.model,
|
|
72
|
+
temperature: this.config.llm.temperature || 0.7,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
// Buscar system prompt
|
|
76
|
+
this.systemPromptContent = await this.sdk.getPrompt(this.config.systemPrompt);
|
|
77
|
+
// Carregar tools
|
|
78
|
+
await this.loadTools();
|
|
79
|
+
}
|
|
80
|
+
async loadTools() {
|
|
81
|
+
// Tool built-in para busca na base de conhecimento
|
|
82
|
+
if (this.config.tools?.includes('search-knowledge')) {
|
|
83
|
+
this.tools.push(new tools_1.DynamicTool({
|
|
84
|
+
name: 'search_knowledge',
|
|
85
|
+
description: 'Busca informações na base de conhecimento da empresa',
|
|
86
|
+
func: async (query) => {
|
|
87
|
+
try {
|
|
88
|
+
const vectorStores = await this.sdk.getAvailableVectorStores();
|
|
89
|
+
if (vectorStores.length > 0) {
|
|
90
|
+
const results = await this.sdk.searchVectorStore(vectorStores[0].name, query);
|
|
91
|
+
return JSON.stringify(results);
|
|
92
|
+
}
|
|
93
|
+
return 'Nenhuma base de conhecimento disponível';
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
return `Erro na busca: ${error.message}`;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}));
|
|
100
|
+
}
|
|
101
|
+
// Carregar tools customizadas por auto-discovery
|
|
102
|
+
if (this.config.toolsPath) {
|
|
103
|
+
await this.loadCustomToolsFromPath(this.config.toolsPath);
|
|
104
|
+
}
|
|
105
|
+
// Carregar tools customizadas diretas
|
|
106
|
+
if (this.config.customTools) {
|
|
107
|
+
for (const [name, tool] of Object.entries(this.config.customTools)) {
|
|
108
|
+
this.tools.push(this.createDynamicTool(tool));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
async loadCustomToolsFromPath(toolsPath) {
|
|
113
|
+
try {
|
|
114
|
+
const fullPath = path.resolve(toolsPath);
|
|
115
|
+
if (!fs.existsSync(fullPath))
|
|
116
|
+
return;
|
|
117
|
+
const files = fs.readdirSync(fullPath)
|
|
118
|
+
.filter(file => file.endsWith('.ts') || file.endsWith('.js'))
|
|
119
|
+
.filter(file => !file.endsWith('.d.ts'));
|
|
120
|
+
for (const file of files) {
|
|
121
|
+
try {
|
|
122
|
+
const toolModule = await Promise.resolve(`${path.join(fullPath, file)}`).then(s => __importStar(require(s)));
|
|
123
|
+
// Procurar exports que seguem o padrão RunflowTool
|
|
124
|
+
for (const [exportName, exportValue] of Object.entries(toolModule)) {
|
|
125
|
+
if (this.isRunflowTool(exportValue)) {
|
|
126
|
+
this.tools.push(this.createDynamicTool(exportValue));
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
console.warn(`Erro ao carregar tool ${file}:`, error.message);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
console.warn(`Erro ao carregar tools de ${toolsPath}:`, error.message);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
isRunflowTool(obj) {
|
|
140
|
+
return obj &&
|
|
141
|
+
typeof obj.name === 'string' &&
|
|
142
|
+
typeof obj.description === 'string' &&
|
|
143
|
+
typeof obj.execute === 'function' &&
|
|
144
|
+
obj.parameters;
|
|
145
|
+
}
|
|
146
|
+
createDynamicTool(tool) {
|
|
147
|
+
return new tools_1.DynamicTool({
|
|
148
|
+
name: tool.name,
|
|
149
|
+
description: tool.description,
|
|
150
|
+
func: async (input) => {
|
|
151
|
+
try {
|
|
152
|
+
// Parse input (assumindo JSON string ou string simples)
|
|
153
|
+
let params;
|
|
154
|
+
try {
|
|
155
|
+
params = JSON.parse(input);
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
// Se não for JSON, usar como string simples para primeiro parâmetro
|
|
159
|
+
const firstParam = Object.keys(tool.parameters)[0];
|
|
160
|
+
params = { [firstParam]: input };
|
|
161
|
+
}
|
|
162
|
+
const context = {
|
|
163
|
+
sdk: this.sdk,
|
|
164
|
+
companyId: this.currentCompanyId || '',
|
|
165
|
+
userId: this.currentUserId,
|
|
166
|
+
sessionId: this.currentSessionId
|
|
167
|
+
};
|
|
168
|
+
const result = await tool.execute(params, context);
|
|
169
|
+
return JSON.stringify(result);
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
return `Erro na execução da tool ${tool.name}: ${error.message}`;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
async process(input) {
|
|
178
|
+
await this.initialize();
|
|
179
|
+
// Armazenar context atual
|
|
180
|
+
this.currentCompanyId = input.companyId;
|
|
181
|
+
this.currentUserId = input.userId;
|
|
182
|
+
this.currentSessionId = input.sessionId;
|
|
183
|
+
try {
|
|
184
|
+
// Se não tem tools, usar LLM diretamente
|
|
185
|
+
if (this.tools.length === 0) {
|
|
186
|
+
const messages = [
|
|
187
|
+
new messages_1.SystemMessage(this.systemPromptContent),
|
|
188
|
+
new messages_1.HumanMessage(input.message)
|
|
189
|
+
];
|
|
190
|
+
const response = await this.llm.invoke(messages);
|
|
191
|
+
// Log da interação
|
|
192
|
+
await this.sdk.log('agent-response', {
|
|
193
|
+
input: input.message,
|
|
194
|
+
output: response.content,
|
|
195
|
+
llmProvider: this.config.llm.provider,
|
|
196
|
+
model: this.config.llm.model,
|
|
197
|
+
companyId: input.companyId
|
|
198
|
+
});
|
|
199
|
+
return {
|
|
200
|
+
message: response.content,
|
|
201
|
+
metadata: {
|
|
202
|
+
llmProvider: this.config.llm.provider,
|
|
203
|
+
model: this.config.llm.model,
|
|
204
|
+
toolsUsed: []
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
// Usar agent executor com tools
|
|
209
|
+
const prompt = prompts_1.ChatPromptTemplate.fromMessages([
|
|
210
|
+
['system', this.systemPromptContent],
|
|
211
|
+
['human', '{input}'],
|
|
212
|
+
['placeholder', '{agent_scratchpad}']
|
|
213
|
+
]);
|
|
214
|
+
const agent = await (0, agents_1.createToolCallingAgent)({
|
|
215
|
+
llm: this.llm,
|
|
216
|
+
tools: this.tools,
|
|
217
|
+
prompt
|
|
218
|
+
});
|
|
219
|
+
const agentExecutor = new agents_1.AgentExecutor({
|
|
220
|
+
agent,
|
|
221
|
+
tools: this.tools,
|
|
222
|
+
verbose: false
|
|
223
|
+
});
|
|
224
|
+
const result = await agentExecutor.invoke({
|
|
225
|
+
input: input.message
|
|
226
|
+
});
|
|
227
|
+
// Log da interação
|
|
228
|
+
await this.sdk.log('agent-response', {
|
|
229
|
+
input: input.message,
|
|
230
|
+
output: result.output,
|
|
231
|
+
llmProvider: this.config.llm.provider,
|
|
232
|
+
model: this.config.llm.model,
|
|
233
|
+
toolsUsed: this.tools.map(t => t.name),
|
|
234
|
+
companyId: input.companyId
|
|
235
|
+
});
|
|
236
|
+
return {
|
|
237
|
+
message: result.output,
|
|
238
|
+
metadata: {
|
|
239
|
+
llmProvider: this.config.llm.provider,
|
|
240
|
+
model: this.config.llm.model,
|
|
241
|
+
toolsUsed: this.tools.map(t => t.name),
|
|
242
|
+
steps: result.intermediateSteps?.length || 0
|
|
243
|
+
}
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
catch (error) {
|
|
247
|
+
// Log do erro
|
|
248
|
+
await this.sdk.log('agent-error', {
|
|
249
|
+
input: input.message,
|
|
250
|
+
error: error.message,
|
|
251
|
+
companyId: input.companyId
|
|
252
|
+
});
|
|
253
|
+
throw new Error(`Erro no processamento do agente: ${error.message}`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
createHandler() {
|
|
257
|
+
return async (input) => {
|
|
258
|
+
return this.process(input);
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
exports.RunflowAgent = RunflowAgent;
|
|
263
|
+
//# sourceMappingURL=runflow-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runflow-agent.js","sourceRoot":"","sources":["../../src/agents/runflow-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import express from 'express';
|
|
2
|
+
import { RunflowAgentConfig } from './runflow-agent';
|
|
3
|
+
import { AgentInput } from '../types';
|
|
4
|
+
export interface AgentServerConfig extends RunflowAgentConfig {
|
|
5
|
+
port?: number;
|
|
6
|
+
cors?: boolean;
|
|
7
|
+
rateLimiting?: boolean;
|
|
8
|
+
middleware?: express.RequestHandler[];
|
|
9
|
+
}
|
|
10
|
+
export interface AgentServerOptions {
|
|
11
|
+
port?: number;
|
|
12
|
+
cors?: boolean;
|
|
13
|
+
rateLimiting?: boolean;
|
|
14
|
+
healthEndpoint?: boolean;
|
|
15
|
+
middleware?: express.RequestHandler[];
|
|
16
|
+
hooks?: {
|
|
17
|
+
beforeChat?: (req: express.Request, res: express.Response) => Promise<void> | void;
|
|
18
|
+
transformInput?: (raw: any) => AgentInput;
|
|
19
|
+
afterChat?: (input: AgentInput, output: any, ctx: {
|
|
20
|
+
req: express.Request;
|
|
21
|
+
res: express.Response;
|
|
22
|
+
startedAt: number;
|
|
23
|
+
durationMs: number;
|
|
24
|
+
}) => Promise<void> | void;
|
|
25
|
+
onChatError?: (input: AgentInput | null, error: any, ctx: {
|
|
26
|
+
req: express.Request;
|
|
27
|
+
res: express.Response;
|
|
28
|
+
startedAt: number;
|
|
29
|
+
durationMs: number;
|
|
30
|
+
}) => Promise<void> | void;
|
|
31
|
+
};
|
|
32
|
+
tracing?: boolean | 'verbose';
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Cria um servidor Express simples para um agente Runflow
|
|
36
|
+
*/
|
|
37
|
+
export declare function createAgentServer(config: RunflowAgentConfig, options?: AgentServerOptions): {
|
|
38
|
+
app: import("express-serve-static-core").Express;
|
|
39
|
+
start(port?: number): void;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Função ultra-simples que auto-descobre configuração e inicia servidor
|
|
43
|
+
*/
|
|
44
|
+
export declare function startAgent(configPath?: string): void;
|
|
45
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/agents/server.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAgB,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAItC,MAAM,WAAW,iBAAkB,SAAQ,kBAAkB;IAC3D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC;IAEtC,KAAK,CAAC,EAAE;QACN,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QACnF,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,UAAU,CAAC;QAC1C,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE;YAAE,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC;YAAC,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC;YAAC,SAAS,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAA;SAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QAClK,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE;YAAE,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC;YAAC,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC;YAAC,SAAS,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAA;SAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;KAC3K,CAAC;IAGF,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,kBAAkB,EAC1B,OAAO,GAAE,kBAAuB;;iBA4MjB,MAAM;EAWtB;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,QAsE7C"}
|
|
@@ -0,0 +1,315 @@
|
|
|
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.createAgentServer = createAgentServer;
|
|
40
|
+
exports.startAgent = startAgent;
|
|
41
|
+
const express_1 = __importDefault(require("express"));
|
|
42
|
+
const runflow_agent_1 = require("./runflow-agent");
|
|
43
|
+
const fs = __importStar(require("fs"));
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
/**
|
|
46
|
+
* Cria um servidor Express simples para um agente Runflow
|
|
47
|
+
*/
|
|
48
|
+
function createAgentServer(config, options = {}) {
|
|
49
|
+
const agent = new runflow_agent_1.RunflowAgent(config);
|
|
50
|
+
const app = (0, express_1.default)();
|
|
51
|
+
// Middleware básico
|
|
52
|
+
app.use(express_1.default.json({ limit: '10mb' }));
|
|
53
|
+
// CORS se habilitado
|
|
54
|
+
if (options.cors !== false) {
|
|
55
|
+
app.use((req, res, next) => {
|
|
56
|
+
res.header('Access-Control-Allow-Origin', '*');
|
|
57
|
+
res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
|
|
58
|
+
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Authorization');
|
|
59
|
+
if (req.method === 'OPTIONS') {
|
|
60
|
+
res.sendStatus(200);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
next();
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
// Rate limiting básico se habilitado
|
|
68
|
+
if (options.rateLimiting) {
|
|
69
|
+
const requests = new Map();
|
|
70
|
+
app.use((req, res, next) => {
|
|
71
|
+
const ip = req.ip || req.connection.remoteAddress || 'unknown';
|
|
72
|
+
const now = Date.now();
|
|
73
|
+
const windowMs = 60000; // 1 minuto
|
|
74
|
+
const maxRequests = 30; // 30 requests por minuto
|
|
75
|
+
if (!requests.has(ip)) {
|
|
76
|
+
requests.set(ip, []);
|
|
77
|
+
}
|
|
78
|
+
const userRequests = requests.get(ip);
|
|
79
|
+
// Limpar requests antigas
|
|
80
|
+
const validRequests = userRequests.filter((time) => now - time < windowMs);
|
|
81
|
+
requests.set(ip, validRequests);
|
|
82
|
+
if (validRequests.length >= maxRequests) {
|
|
83
|
+
return res.status(429).json({
|
|
84
|
+
success: false,
|
|
85
|
+
error: 'Rate limit exceeded. Try again later.'
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
validRequests.push(now);
|
|
89
|
+
next();
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
// Middleware customizado
|
|
93
|
+
if (options.middleware) {
|
|
94
|
+
options.middleware.forEach(middleware => app.use(middleware));
|
|
95
|
+
}
|
|
96
|
+
// Endpoint principal do chat
|
|
97
|
+
app.post('/chat', async (req, res) => {
|
|
98
|
+
const startedAt = Date.now();
|
|
99
|
+
let input = null;
|
|
100
|
+
try {
|
|
101
|
+
// Hook opcional antes de processar
|
|
102
|
+
if (options.hooks?.beforeChat) {
|
|
103
|
+
await options.hooks.beforeChat(req, res);
|
|
104
|
+
if (res.headersSent)
|
|
105
|
+
return; // caso o hook finalize a resposta
|
|
106
|
+
}
|
|
107
|
+
const body = req.body || {};
|
|
108
|
+
const context = body.context || {};
|
|
109
|
+
// Normalização: aceitar top-level ou context
|
|
110
|
+
const normalized = {
|
|
111
|
+
message: body.message,
|
|
112
|
+
companyId: body.companyId ?? context.companyId,
|
|
113
|
+
userId: body.userId ?? context.userId,
|
|
114
|
+
sessionId: body.sessionId ?? context.sessionId,
|
|
115
|
+
channel: body.channel,
|
|
116
|
+
metadata: body.metadata,
|
|
117
|
+
tab: body.tab,
|
|
118
|
+
preChatInfo: body.preChatInfo,
|
|
119
|
+
};
|
|
120
|
+
// Validações mínimas padrão
|
|
121
|
+
if (!normalized.message || typeof normalized.message !== 'string') {
|
|
122
|
+
return res.status(400).json({ success: false, error: 'Campo "message" é obrigatório' });
|
|
123
|
+
}
|
|
124
|
+
if (!normalized.companyId) {
|
|
125
|
+
return res.status(400).json({ success: false, error: 'Campo "companyId" é obrigatório' });
|
|
126
|
+
}
|
|
127
|
+
// Transformação customizada opcional
|
|
128
|
+
input = options.hooks?.transformInput ? options.hooks.transformInput(req.body) : normalized;
|
|
129
|
+
const response = await agent.process(input);
|
|
130
|
+
const durationMs = Date.now() - startedAt;
|
|
131
|
+
res.json({
|
|
132
|
+
success: true,
|
|
133
|
+
data: response
|
|
134
|
+
});
|
|
135
|
+
// Pós-processamento customizado
|
|
136
|
+
if (options.hooks?.afterChat) {
|
|
137
|
+
await options.hooks.afterChat(input, response, { req, res, startedAt, durationMs });
|
|
138
|
+
}
|
|
139
|
+
// Tracing best-effort (DTO: { input: {type,content}[]; output: string; status: string })
|
|
140
|
+
if (options.tracing) {
|
|
141
|
+
try {
|
|
142
|
+
const sdkModule = await Promise.resolve().then(() => __importStar(require('../runflow-sdk')));
|
|
143
|
+
const sdk = new sdkModule.RunflowSDK();
|
|
144
|
+
const outputText = typeof response === 'string' ? response : (response?.message ?? '');
|
|
145
|
+
const tracePayload = {
|
|
146
|
+
input: [
|
|
147
|
+
{ type: 'human', content: input.message }
|
|
148
|
+
],
|
|
149
|
+
output: outputText,
|
|
150
|
+
status: 'success'
|
|
151
|
+
};
|
|
152
|
+
if (options.tracing === 'verbose') {
|
|
153
|
+
// eslint-disable-next-line no-console
|
|
154
|
+
console.log('[trace] sending', tracePayload);
|
|
155
|
+
}
|
|
156
|
+
const traceResp = await sdk.trace(tracePayload).catch(() => null);
|
|
157
|
+
if (options.tracing === 'verbose') {
|
|
158
|
+
// eslint-disable-next-line no-console
|
|
159
|
+
console.log('[trace] done', traceResp ? { traceId: traceResp.traceId } : { skipped: true });
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
catch { }
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
console.error('Erro no processamento do agente:', error);
|
|
167
|
+
const durationMs = Date.now() - startedAt;
|
|
168
|
+
// Hook de erro customizado
|
|
169
|
+
if (options.hooks?.onChatError) {
|
|
170
|
+
try {
|
|
171
|
+
await options.hooks.onChatError(input, error, { req, res, startedAt, durationMs });
|
|
172
|
+
}
|
|
173
|
+
catch { }
|
|
174
|
+
}
|
|
175
|
+
// Tracing best-effort de erro (DTO)
|
|
176
|
+
if (options.tracing) {
|
|
177
|
+
try {
|
|
178
|
+
const sdkModule = await Promise.resolve().then(() => __importStar(require('../runflow-sdk')));
|
|
179
|
+
const sdk = new sdkModule.RunflowSDK();
|
|
180
|
+
const tracePayload = {
|
|
181
|
+
input: [
|
|
182
|
+
{ type: 'user', message: input?.message || '' }
|
|
183
|
+
],
|
|
184
|
+
output: error?.message || String(error),
|
|
185
|
+
status: 'error'
|
|
186
|
+
};
|
|
187
|
+
if (options.tracing === 'verbose') {
|
|
188
|
+
// eslint-disable-next-line no-console
|
|
189
|
+
console.log('[trace] sending', tracePayload);
|
|
190
|
+
}
|
|
191
|
+
const traceResp = await sdk.trace(tracePayload).catch(() => null);
|
|
192
|
+
if (options.tracing === 'verbose') {
|
|
193
|
+
// eslint-disable-next-line no-console
|
|
194
|
+
console.log('[trace] done', traceResp ? { traceId: traceResp.traceId } : { skipped: true });
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
catch { }
|
|
198
|
+
}
|
|
199
|
+
res.status(500).json({
|
|
200
|
+
success: false,
|
|
201
|
+
error: 'Erro interno do servidor',
|
|
202
|
+
details: process.env.NODE_ENV === 'development' ? error.message : undefined
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
// Health check
|
|
207
|
+
if (options.healthEndpoint !== false) {
|
|
208
|
+
app.get('/health', (req, res) => {
|
|
209
|
+
res.json({
|
|
210
|
+
status: 'ok',
|
|
211
|
+
timestamp: new Date().toISOString(),
|
|
212
|
+
agent: {
|
|
213
|
+
systemPrompt: config.systemPrompt,
|
|
214
|
+
llmProvider: config.llm.provider,
|
|
215
|
+
model: config.llm.model
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
// Endpoint de informações do agente
|
|
221
|
+
app.get('/agent-info', (req, res) => {
|
|
222
|
+
res.json({
|
|
223
|
+
systemPrompt: config.systemPrompt,
|
|
224
|
+
llm: {
|
|
225
|
+
provider: config.llm.provider,
|
|
226
|
+
model: config.llm.model
|
|
227
|
+
},
|
|
228
|
+
toolsEnabled: !!config.toolsPath || !!config.customTools,
|
|
229
|
+
sessionEnabled: config.session?.enabled || false
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
return {
|
|
233
|
+
app,
|
|
234
|
+
start(port) {
|
|
235
|
+
const serverPort = port || options.port || process.env.PORT || 3000;
|
|
236
|
+
app.listen(serverPort, () => {
|
|
237
|
+
console.log(`🤖 Runflow Agent Server running on port ${serverPort}`);
|
|
238
|
+
console.log(`📡 Chat endpoint: http://localhost:${serverPort}/chat`);
|
|
239
|
+
console.log(`❤️ Health check: http://localhost:${serverPort}/health`);
|
|
240
|
+
console.log(`ℹ️ Agent info: http://localhost:${serverPort}/agent-info`);
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Função ultra-simples que auto-descobre configuração e inicia servidor
|
|
247
|
+
*/
|
|
248
|
+
function startAgent(configPath) {
|
|
249
|
+
try {
|
|
250
|
+
// 1. Tentar carregar config de arquivo
|
|
251
|
+
let config;
|
|
252
|
+
if (configPath) {
|
|
253
|
+
config = require(path.resolve(configPath)).default || require(path.resolve(configPath));
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
// Auto-discovery de config
|
|
257
|
+
const possibleConfigs = [
|
|
258
|
+
'agent.config.ts',
|
|
259
|
+
'agent.config.js',
|
|
260
|
+
'runflow.config.ts',
|
|
261
|
+
'runflow.config.js'
|
|
262
|
+
];
|
|
263
|
+
let configFound = false;
|
|
264
|
+
for (const configFile of possibleConfigs) {
|
|
265
|
+
if (fs.existsSync(configFile)) {
|
|
266
|
+
try {
|
|
267
|
+
config = require(path.resolve(configFile)).default || require(path.resolve(configFile));
|
|
268
|
+
console.log(`📁 Config carregado: ${configFile}`);
|
|
269
|
+
configFound = true;
|
|
270
|
+
break;
|
|
271
|
+
}
|
|
272
|
+
catch (error) {
|
|
273
|
+
console.warn(`⚠️ Erro ao carregar ${configFile}:`, error.message);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
if (!configFound) {
|
|
278
|
+
throw new Error(`
|
|
279
|
+
Nenhum arquivo de configuração encontrado.
|
|
280
|
+
Crie um dos seguintes arquivos:
|
|
281
|
+
- agent.config.ts
|
|
282
|
+
- agent.config.js
|
|
283
|
+
- runflow.config.ts
|
|
284
|
+
- runflow.config.js
|
|
285
|
+
|
|
286
|
+
Exemplo:
|
|
287
|
+
export default {
|
|
288
|
+
llm: {
|
|
289
|
+
provider: 'anthropic',
|
|
290
|
+
model: 'claude-3-sonnet',
|
|
291
|
+
credential: 'claude-api'
|
|
292
|
+
},
|
|
293
|
+
systemPrompt: 'customer-support',
|
|
294
|
+
toolsPath: './tools'
|
|
295
|
+
};
|
|
296
|
+
`);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
if (!config) {
|
|
300
|
+
throw new Error('Configuração não pôde ser carregada');
|
|
301
|
+
}
|
|
302
|
+
// 2. Criar e iniciar servidor
|
|
303
|
+
const server = createAgentServer(config, {
|
|
304
|
+
cors: true,
|
|
305
|
+
rateLimiting: true,
|
|
306
|
+
healthEndpoint: true
|
|
307
|
+
});
|
|
308
|
+
server.start();
|
|
309
|
+
}
|
|
310
|
+
catch (error) {
|
|
311
|
+
console.error('❌ Erro ao iniciar agente:', error.message);
|
|
312
|
+
process.exit(1);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/agents/server.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,8CAyNC;AAKD,gCAsEC;AAtUD,sDAA8B;AAC9B,mDAAmE;AAEnE,uCAAyB;AACzB,2CAA6B;AA2B7B;;GAEG;AACH,SAAgB,iBAAiB,CAC/B,MAA0B,EAC1B,UAA8B,EAAE;IAEhC,MAAM,KAAK,GAAG,IAAI,4BAAY,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAC;IAEtB,oBAAoB;IACpB,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAEzC,qBAAqB;IACrB,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC3B,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YACzB,GAAG,CAAC,MAAM,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;YAC/C,GAAG,CAAC,MAAM,CAAC,8BAA8B,EAAE,oBAAoB,CAAC,CAAC;YACjE,GAAG,CAAC,MAAM,CAAC,8BAA8B,EAAE,+DAA+D,CAAC,CAAC;YAE5G,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC7B,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACN,IAAI,EAAE,CAAC;YACT,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,qCAAqC;IACrC,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC;QAC3B,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YACzB,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,UAAU,CAAC,aAAa,IAAI,SAAS,CAAC;YAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,WAAW;YACnC,MAAM,WAAW,GAAG,EAAE,CAAC,CAAC,yBAAyB;YAEjD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACvB,CAAC;YAED,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACtC,0BAA0B;YAC1B,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC;YACnF,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;YAEhC,IAAI,aAAa,CAAC,MAAM,IAAI,WAAW,EAAE,CAAC;gBACxC,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBAC1B,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,uCAAuC;iBAC/C,CAAC,CAAC;YACL,CAAC;YAED,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACxB,IAAI,EAAE,CAAC;QACT,CAAC,CAAC,CAAC;IACL,CAAC;IAED,yBAAyB;IACzB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,6BAA6B;IAC7B,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACnC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,KAAK,GAAsB,IAAI,CAAC;QACpC,IAAI,CAAC;YACH,mCAAmC;YACnC,IAAI,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC;gBAC9B,MAAM,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBACzC,IAAI,GAAG,CAAC,WAAW;oBAAE,OAAO,CAAC,kCAAkC;YACjE,CAAC;YAED,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;YAEnC,6CAA6C;YAC7C,MAAM,UAAU,GAAe;gBAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS;gBAC9C,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM;gBACrC,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS;gBAC9C,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,WAAW,EAAE,IAAI,CAAC,WAAW;aAC9B,CAAC;YAEF,4BAA4B;YAC5B,IAAI,CAAC,UAAU,CAAC,OAAO,IAAI,OAAO,UAAU,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAClE,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAC,CAAC;YAC1F,CAAC;YACD,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;gBAC1B,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,iCAAiC,EAAE,CAAC,CAAC;YAC5F,CAAC;YAED,qCAAqC;YACrC,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;YAE5F,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAE1C,GAAG,CAAC,IAAI,CAAC;gBACP,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;YAEH,gCAAgC;YAChC,IAAI,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC;gBAC7B,MAAM,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;YACtF,CAAC;YAED,yFAAyF;YACzF,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,IAAI,CAAC;oBACH,MAAM,SAAS,GAAG,wDAAa,gBAAgB,GAAC,CAAC;oBACjD,MAAM,GAAG,GAAG,IAAK,SAAiB,CAAC,UAAU,EAAE,CAAC;oBAChD,MAAM,UAAU,GAAG,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;oBACvF,MAAM,YAAY,GAAG;wBACnB,KAAK,EAAE;4BACL,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE;yBAC1C;wBACD,MAAM,EAAE,UAAU;wBAClB,MAAM,EAAE,SAAS;qBAClB,CAAC;oBACF,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;wBAClC,sCAAsC;wBACtC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;oBAC/C,CAAC;oBACD,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;oBAClE,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;wBAClC,sCAAsC;wBACtC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC9F,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;YACZ,CAAC;QAEH,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;YACzD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAE1C,2BAA2B;YAC3B,IAAI,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC;gBAC/B,IAAI,CAAC;oBAAC,MAAM,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;YACtG,CAAC;YAED,oCAAoC;YACpC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,IAAI,CAAC;oBACH,MAAM,SAAS,GAAG,wDAAa,gBAAgB,GAAC,CAAC;oBACjD,MAAM,GAAG,GAAG,IAAK,SAAiB,CAAC,UAAU,EAAE,CAAC;oBAChD,MAAM,YAAY,GAAG;wBACnB,KAAK,EAAE;4BACL,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,IAAI,EAAE,EAAE;yBAChD;wBACD,MAAM,EAAE,KAAK,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC;wBACvC,MAAM,EAAE,OAAO;qBAChB,CAAC;oBACF,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;wBAClC,sCAAsC;wBACtC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;oBAC/C,CAAC;oBACD,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;oBAClE,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;wBAClC,sCAAsC;wBACtC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC9F,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;YACZ,CAAC;YAED,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,0BAA0B;gBACjC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;aAC5E,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,eAAe;IACf,IAAI,OAAO,CAAC,cAAc,KAAK,KAAK,EAAE,CAAC;QACrC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC9B,GAAG,CAAC,IAAI,CAAC;gBACP,MAAM,EAAE,IAAI;gBACZ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,KAAK,EAAE;oBACL,YAAY,EAAE,MAAM,CAAC,YAAY;oBACjC,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ;oBAChC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK;iBACxB;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,oCAAoC;IACpC,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAClC,GAAG,CAAC,IAAI,CAAC;YACP,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,GAAG,EAAE;gBACH,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ;gBAC7B,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK;aACxB;YACD,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,WAAW;YACxD,cAAc,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,IAAI,KAAK;SACjD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,GAAG;QACH,KAAK,CAAC,IAAa;YACjB,MAAM,UAAU,GAAG,IAAI,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;YAEpE,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE;gBAC1B,OAAO,CAAC,GAAG,CAAC,2CAA2C,UAAU,EAAE,CAAC,CAAC;gBACrE,OAAO,CAAC,GAAG,CAAC,sCAAsC,UAAU,OAAO,CAAC,CAAC;gBACrE,OAAO,CAAC,GAAG,CAAC,sCAAsC,UAAU,SAAS,CAAC,CAAC;gBACvE,OAAO,CAAC,GAAG,CAAC,oCAAoC,UAAU,aAAa,CAAC,CAAC;YAC3E,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,UAAU,CAAC,UAAmB;IAC5C,IAAI,CAAC;QACH,uCAAuC;QACvC,IAAI,MAAsC,CAAC;QAE3C,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QAC1F,CAAC;aAAM,CAAC;YACN,2BAA2B;YAC3B,MAAM,eAAe,GAAG;gBACtB,iBAAiB;gBACjB,iBAAiB;gBACjB,mBAAmB;gBACnB,mBAAmB;aACpB,CAAC;YAEF,IAAI,WAAW,GAAG,KAAK,CAAC;YACxB,KAAK,MAAM,UAAU,IAAI,eAAe,EAAE,CAAC;gBACzC,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC9B,IAAI,CAAC;wBACH,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;wBACxF,OAAO,CAAC,GAAG,CAAC,wBAAwB,UAAU,EAAE,CAAC,CAAC;wBAClD,WAAW,GAAG,IAAI,CAAC;wBACnB,MAAM;oBACR,CAAC;oBAAC,OAAO,KAAU,EAAE,CAAC;wBACpB,OAAO,CAAC,IAAI,CAAC,uBAAuB,UAAU,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;oBACpE,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC;;;;;;;;;;;;;;;;;;SAkBf,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzD,CAAC;QAED,8BAA8B;QAC9B,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,EAAE;YACvC,IAAI,EAAE,IAAI;YACV,YAAY,EAAE,IAAI;YAClB,cAAc,EAAE,IAAI;SACrB,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,EAAE,CAAC;IAEjB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|