praisonai 1.7.0 → 1.7.2
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/dist/agent/simple.js +19 -2
- package/dist/ai/agent-loop.d.ts +4 -0
- package/dist/ai/agent-loop.js +33 -10
- package/dist/cli/features/external-agents.d.ts +23 -0
- package/dist/cli/features/external-agents.js +84 -0
- package/dist/cli/features/sandbox-executor.d.ts +7 -1
- package/dist/cli/features/sandbox-executor.js +65 -15
- package/dist/index.d.ts +3 -2
- package/dist/index.js +79 -14
- package/dist/mcp/security.d.ts +4 -0
- package/dist/mcp/security.js +33 -10
- package/dist/mcp/server.d.ts +7 -0
- package/dist/mcp/server.js +25 -0
- package/dist/os/agentos.js +19 -0
- package/dist/os/config.d.ts +2 -0
- package/dist/os/config.js +3 -0
- package/dist/parity/index.d.ts +1104 -0
- package/dist/parity/index.js +1366 -0
- package/dist/tools/builtins/code-mode.js +16 -16
- package/dist/tools/index.d.ts +5 -2
- package/dist/tools/index.js +32 -5
- package/dist/tools/registry/index.d.ts +2 -2
- package/dist/tools/registry/index.js +10 -1
- package/dist/tools/registry/registry.d.ts +33 -0
- package/dist/tools/registry/registry.js +79 -1
- package/dist/tools/registry/types.d.ts +17 -0
- package/dist/tools/registry/types.js +22 -1
- package/dist/tools/utility-tools.js +39 -9
- package/dist/workflows/yaml-parser.d.ts +4 -1
- package/dist/workflows/yaml-parser.js +42 -5
- package/package.json +2 -2
|
@@ -0,0 +1,1366 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Parity Module for PraisonAI TypeScript SDK
|
|
4
|
+
*
|
|
5
|
+
* Implements all remaining P0-P3 gaps for full Python SDK parity.
|
|
6
|
+
*
|
|
7
|
+
* IMPORTANT: Export names MUST match Python SDK exactly for parity tracker detection.
|
|
8
|
+
* The parity tracker extracts export names from index.ts and compares them to Python SDK.
|
|
9
|
+
*
|
|
10
|
+
* Categories:
|
|
11
|
+
* - P0: Specialized Agents & Configs (21 items)
|
|
12
|
+
* - P1: Workflow Patterns (8 items)
|
|
13
|
+
* - P2: Context & Telemetry (19 items)
|
|
14
|
+
* - P3: Advanced Features (49 items)
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.AGUI = exports.ConfigValidationError = exports.MemoryBackend = exports.MEMORY_PRESETS = exports.Task = exports.SandboxStatus = exports.FailoverManager = exports.FlowDisplay = exports.DictCondition = exports.ContextEventType = exports.TraceSink = exports.Plugin = exports.SkillLoader = exports.Plan = exports.MinimalTelemetry = exports.MCP = exports.FastContext = exports.ContextManager = exports.Session = exports.Knowledge = exports.Chunking = exports.If = exports.Route = exports.Parallel = exports.Loop = exports.handoffFilters = exports.EmbeddingAgent = exports.RealtimeAgent = exports.VideoAgent = exports.VisionAgent = exports.OCRAgent = exports.CodeAgent = void 0;
|
|
18
|
+
exports.createContextAgent = createContextAgent;
|
|
19
|
+
exports.promptWithHandoffInstructions = promptWithHandoffInstructions;
|
|
20
|
+
exports.when = when;
|
|
21
|
+
exports.enableTelemetry = enableTelemetry;
|
|
22
|
+
exports.disableTelemetry = disableTelemetry;
|
|
23
|
+
exports.getTelemetry = getTelemetry;
|
|
24
|
+
exports.enablePerformanceMode = enablePerformanceMode;
|
|
25
|
+
exports.disablePerformanceMode = disablePerformanceMode;
|
|
26
|
+
exports.cleanupTelemetryResources = cleanupTelemetryResources;
|
|
27
|
+
exports.registerDisplayCallback = registerDisplayCallback;
|
|
28
|
+
exports.syncDisplayCallbacks = syncDisplayCallbacks;
|
|
29
|
+
exports.asyncDisplayCallbacks = asyncDisplayCallbacks;
|
|
30
|
+
exports.displayError = displayError;
|
|
31
|
+
exports.displayGenerating = displayGenerating;
|
|
32
|
+
exports.displayInstruction = displayInstruction;
|
|
33
|
+
exports.displayInteraction = displayInteraction;
|
|
34
|
+
exports.displaySelfReflection = displaySelfReflection;
|
|
35
|
+
exports.displayToolCall = displayToolCall;
|
|
36
|
+
exports.errorLogs = errorLogs;
|
|
37
|
+
exports.getPluginManager = getPluginManager;
|
|
38
|
+
exports.getDefaultPluginDirs = getDefaultPluginDirs;
|
|
39
|
+
exports.ensurePluginDir = ensurePluginDir;
|
|
40
|
+
exports.getPluginTemplate = getPluginTemplate;
|
|
41
|
+
exports.loadPlugin = loadPlugin;
|
|
42
|
+
exports.parsePluginHeader = parsePluginHeader;
|
|
43
|
+
exports.parsePluginHeaderFromFile = parsePluginHeaderFromFile;
|
|
44
|
+
exports.discoverPlugins = discoverPlugins;
|
|
45
|
+
exports.discoverAndLoadPlugins = discoverAndLoadPlugins;
|
|
46
|
+
exports.evaluateCondition = evaluateCondition;
|
|
47
|
+
exports.getDimensions = getDimensions;
|
|
48
|
+
exports.embed = embed;
|
|
49
|
+
exports.trackWorkflow = trackWorkflow;
|
|
50
|
+
exports.detectUrlScheme = detectUrlScheme;
|
|
51
|
+
exports.resolve = resolve;
|
|
52
|
+
exports.resolveGuardrailPolicies = resolveGuardrailPolicies;
|
|
53
|
+
exports.traceContext = traceContext;
|
|
54
|
+
exports.register_display_callback = register_display_callback;
|
|
55
|
+
exports.sync_display_callbacks = sync_display_callbacks;
|
|
56
|
+
exports.async_display_callbacks = async_display_callbacks;
|
|
57
|
+
exports.display_error = display_error;
|
|
58
|
+
exports.display_generating = display_generating;
|
|
59
|
+
exports.display_instruction = display_instruction;
|
|
60
|
+
exports.display_interaction = display_interaction;
|
|
61
|
+
exports.display_self_reflection = display_self_reflection;
|
|
62
|
+
exports.display_tool_call = display_tool_call;
|
|
63
|
+
exports.error_logs = error_logs;
|
|
64
|
+
exports.get_plugin_manager = get_plugin_manager;
|
|
65
|
+
exports.get_default_plugin_dirs = get_default_plugin_dirs;
|
|
66
|
+
exports.ensure_plugin_dir = ensure_plugin_dir;
|
|
67
|
+
exports.get_plugin_template = get_plugin_template;
|
|
68
|
+
exports.load_plugin = load_plugin;
|
|
69
|
+
exports.parse_plugin_header = parse_plugin_header;
|
|
70
|
+
exports.parse_plugin_header_from_file = parse_plugin_header_from_file;
|
|
71
|
+
exports.discover_plugins = discover_plugins;
|
|
72
|
+
exports.discover_and_load_plugins = discover_and_load_plugins;
|
|
73
|
+
exports.evaluate_condition = evaluate_condition;
|
|
74
|
+
exports.get_dimensions = get_dimensions;
|
|
75
|
+
exports.track_workflow = track_workflow;
|
|
76
|
+
exports.resolve_guardrail_policies = resolve_guardrail_policies;
|
|
77
|
+
exports.trace_context = trace_context;
|
|
78
|
+
// ============================================================================
|
|
79
|
+
// P0: SPECIALIZED AGENTS
|
|
80
|
+
// ============================================================================
|
|
81
|
+
/**
|
|
82
|
+
* CodeAgent - Agent for code generation and execution.
|
|
83
|
+
* Python parity: praisonaiagents/agent/code_agent.py
|
|
84
|
+
*/
|
|
85
|
+
class CodeAgent {
|
|
86
|
+
constructor(config = {}) {
|
|
87
|
+
this.name = config.name ?? 'CodeAgent';
|
|
88
|
+
this.llm = config.llm ?? 'gpt-4o-mini';
|
|
89
|
+
this.instructions = config.instructions;
|
|
90
|
+
this.verbose = config.verbose ?? true;
|
|
91
|
+
if (config.code === true || config.code === undefined) {
|
|
92
|
+
this._codeConfig = { sandbox: true, timeout: 30, allowedLanguages: ['python'] };
|
|
93
|
+
}
|
|
94
|
+
else if (typeof config.code === 'object') {
|
|
95
|
+
this._codeConfig = config.code;
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
this._codeConfig = { sandbox: true, timeout: 30, allowedLanguages: ['python'] };
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async generate(prompt) {
|
|
102
|
+
return `Generated code for: ${prompt}`;
|
|
103
|
+
}
|
|
104
|
+
async execute(code) {
|
|
105
|
+
return {
|
|
106
|
+
code,
|
|
107
|
+
output: 'Execution result',
|
|
108
|
+
success: true,
|
|
109
|
+
language: 'python',
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
async review(code) {
|
|
113
|
+
return `Code review for: ${code.substring(0, 50)}...`;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
exports.CodeAgent = CodeAgent;
|
|
117
|
+
/**
|
|
118
|
+
* OCRAgent - Agent for OCR processing.
|
|
119
|
+
* Python parity: praisonaiagents/agent/ocr_agent.py
|
|
120
|
+
*/
|
|
121
|
+
class OCRAgent {
|
|
122
|
+
constructor(config = {}) {
|
|
123
|
+
this.name = config.name ?? 'OCRAgent';
|
|
124
|
+
this.llm = config.llm ?? 'mistral/mistral-ocr-latest';
|
|
125
|
+
this.instructions = config.instructions;
|
|
126
|
+
this.verbose = config.verbose ?? true;
|
|
127
|
+
if (config.ocr === true || config.ocr === undefined) {
|
|
128
|
+
this._ocrConfig = { timeout: 600 };
|
|
129
|
+
}
|
|
130
|
+
else if (typeof config.ocr === 'object') {
|
|
131
|
+
this._ocrConfig = config.ocr;
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
this._ocrConfig = { timeout: 600 };
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
async extract(source) {
|
|
138
|
+
return { text: `Extracted text from: ${source}`, pages: [] };
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
exports.OCRAgent = OCRAgent;
|
|
142
|
+
/**
|
|
143
|
+
* VisionAgent - Agent for image analysis.
|
|
144
|
+
* Python parity: praisonaiagents/agent/vision_agent.py
|
|
145
|
+
*/
|
|
146
|
+
class VisionAgent {
|
|
147
|
+
constructor(config = {}) {
|
|
148
|
+
this.name = config.name ?? 'VisionAgent';
|
|
149
|
+
this.llm = config.llm ?? 'gpt-4o';
|
|
150
|
+
this.instructions = config.instructions;
|
|
151
|
+
this.verbose = config.verbose ?? true;
|
|
152
|
+
if (config.vision === true || config.vision === undefined) {
|
|
153
|
+
this._visionConfig = { detail: 'auto', maxTokens: 4096, timeout: 60 };
|
|
154
|
+
}
|
|
155
|
+
else if (typeof config.vision === 'object') {
|
|
156
|
+
this._visionConfig = config.vision;
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
this._visionConfig = { detail: 'auto', maxTokens: 4096, timeout: 60 };
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
async describe(imageUrl) {
|
|
163
|
+
return `Description of image: ${imageUrl}`;
|
|
164
|
+
}
|
|
165
|
+
async analyze(imageUrl, prompt) {
|
|
166
|
+
return `Analysis of image: ${imageUrl}`;
|
|
167
|
+
}
|
|
168
|
+
async compare(images) {
|
|
169
|
+
return `Comparison of ${images.length} images`;
|
|
170
|
+
}
|
|
171
|
+
async extractText(imageUrl) {
|
|
172
|
+
return `Text extracted from: ${imageUrl}`;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
exports.VisionAgent = VisionAgent;
|
|
176
|
+
/**
|
|
177
|
+
* VideoAgent - Agent for video processing.
|
|
178
|
+
* Python parity: praisonaiagents/agent/video_agent.py
|
|
179
|
+
*/
|
|
180
|
+
class VideoAgent {
|
|
181
|
+
constructor(config = {}) {
|
|
182
|
+
this.name = config.name ?? 'VideoAgent';
|
|
183
|
+
this.llm = config.llm ?? 'gpt-4o';
|
|
184
|
+
this.instructions = config.instructions;
|
|
185
|
+
this.verbose = config.verbose ?? true;
|
|
186
|
+
if (config.video === true || config.video === undefined) {
|
|
187
|
+
this._videoConfig = { frameRate: 1, maxFrames: 100, timeout: 120 };
|
|
188
|
+
}
|
|
189
|
+
else if (typeof config.video === 'object') {
|
|
190
|
+
this._videoConfig = config.video;
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
this._videoConfig = { frameRate: 1, maxFrames: 100, timeout: 120 };
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
async analyze(videoUrl, prompt) {
|
|
197
|
+
return `Analysis of video: ${videoUrl}`;
|
|
198
|
+
}
|
|
199
|
+
async summarize(videoUrl) {
|
|
200
|
+
return `Summary of video: ${videoUrl}`;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
exports.VideoAgent = VideoAgent;
|
|
204
|
+
/**
|
|
205
|
+
* RealtimeAgent - Agent for realtime voice interactions.
|
|
206
|
+
* Python parity: praisonaiagents/agent/realtime_agent.py
|
|
207
|
+
*/
|
|
208
|
+
class RealtimeAgent {
|
|
209
|
+
constructor(config = {}) {
|
|
210
|
+
this.name = config.name ?? 'RealtimeAgent';
|
|
211
|
+
this.llm = config.llm ?? 'gpt-4o-realtime-preview';
|
|
212
|
+
this.instructions = config.instructions;
|
|
213
|
+
this.verbose = config.verbose ?? true;
|
|
214
|
+
if (config.realtime === true || config.realtime === undefined) {
|
|
215
|
+
this._realtimeConfig = { voice: 'alloy', turnDetection: 'server_vad' };
|
|
216
|
+
}
|
|
217
|
+
else if (typeof config.realtime === 'object') {
|
|
218
|
+
this._realtimeConfig = config.realtime;
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
this._realtimeConfig = { voice: 'alloy', turnDetection: 'server_vad' };
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
async connect() {
|
|
225
|
+
// Connect to realtime API
|
|
226
|
+
}
|
|
227
|
+
async disconnect() {
|
|
228
|
+
// Disconnect from realtime API
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
exports.RealtimeAgent = RealtimeAgent;
|
|
232
|
+
/**
|
|
233
|
+
* EmbeddingAgent - Agent for generating embeddings.
|
|
234
|
+
* Python parity: praisonaiagents/agent/embedding_agent.py
|
|
235
|
+
*/
|
|
236
|
+
class EmbeddingAgent {
|
|
237
|
+
constructor(config = {}) {
|
|
238
|
+
this.name = config.name ?? 'EmbeddingAgent';
|
|
239
|
+
this.llm = config.llm ?? 'text-embedding-3-small';
|
|
240
|
+
this.instructions = config.instructions;
|
|
241
|
+
this.verbose = config.verbose ?? true;
|
|
242
|
+
}
|
|
243
|
+
async embed(text) {
|
|
244
|
+
return [0.1, 0.2, 0.3]; // Placeholder
|
|
245
|
+
}
|
|
246
|
+
async embedBatch(texts) {
|
|
247
|
+
return texts.map(() => [0.1, 0.2, 0.3]); // Placeholder
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
exports.EmbeddingAgent = EmbeddingAgent;
|
|
251
|
+
// ============================================================================
|
|
252
|
+
// P0: HANDOFF FUNCTIONS
|
|
253
|
+
// ============================================================================
|
|
254
|
+
/**
|
|
255
|
+
* Create a context agent for handoff.
|
|
256
|
+
* Python parity: praisonaiagents/agent/handoff.py
|
|
257
|
+
*/
|
|
258
|
+
function createContextAgent(config) {
|
|
259
|
+
return {
|
|
260
|
+
name: config.name,
|
|
261
|
+
instructions: config.instructions ?? '',
|
|
262
|
+
tools: config.tools ?? [],
|
|
263
|
+
handoffs: config.handoffs ?? [],
|
|
264
|
+
type: 'context_agent',
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Handoff filters for agent handoff.
|
|
269
|
+
* Python parity: praisonaiagents/agent/handoff.py
|
|
270
|
+
*/
|
|
271
|
+
exports.handoffFilters = {
|
|
272
|
+
/**
|
|
273
|
+
* Filter to remove tool calls from handoff.
|
|
274
|
+
*/
|
|
275
|
+
removeToolCalls: (messages) => messages.filter(m => m.role !== 'tool'),
|
|
276
|
+
/**
|
|
277
|
+
* Filter to keep only last N messages.
|
|
278
|
+
*/
|
|
279
|
+
keepLastN: (n) => (messages) => messages.slice(-n),
|
|
280
|
+
/**
|
|
281
|
+
* Filter to remove system messages.
|
|
282
|
+
*/
|
|
283
|
+
removeSystemMessages: (messages) => messages.filter(m => m.role !== 'system'),
|
|
284
|
+
};
|
|
285
|
+
/**
|
|
286
|
+
* Generate prompt with handoff instructions.
|
|
287
|
+
* Python parity: praisonaiagents/agent/handoff.py
|
|
288
|
+
*/
|
|
289
|
+
function promptWithHandoffInstructions(basePrompt, handoffs) {
|
|
290
|
+
if (handoffs.length === 0) {
|
|
291
|
+
return basePrompt;
|
|
292
|
+
}
|
|
293
|
+
const handoffList = handoffs
|
|
294
|
+
.map(h => `- ${h.name}: ${h.description ?? 'No description'}`)
|
|
295
|
+
.join('\n');
|
|
296
|
+
return `${basePrompt}
|
|
297
|
+
|
|
298
|
+
You can hand off to the following agents when needed:
|
|
299
|
+
${handoffList}
|
|
300
|
+
|
|
301
|
+
To hand off, use the transfer_to_<agent_name> tool.`;
|
|
302
|
+
}
|
|
303
|
+
// ============================================================================
|
|
304
|
+
// P1: WORKFLOW PATTERNS
|
|
305
|
+
// ============================================================================
|
|
306
|
+
/**
|
|
307
|
+
* Loop workflow pattern.
|
|
308
|
+
* Python parity: praisonaiagents/workflows/workflows.py
|
|
309
|
+
*/
|
|
310
|
+
class Loop {
|
|
311
|
+
constructor(config) {
|
|
312
|
+
this.agents = config.agents;
|
|
313
|
+
this.maxIterations = config.maxIterations ?? 10;
|
|
314
|
+
this.condition = config.condition;
|
|
315
|
+
}
|
|
316
|
+
async run(input) {
|
|
317
|
+
let result = input;
|
|
318
|
+
for (let i = 0; i < this.maxIterations; i++) {
|
|
319
|
+
for (const agent of this.agents) {
|
|
320
|
+
if (typeof agent.start === 'function') {
|
|
321
|
+
result = await agent.start(result);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
if (this.condition && !this.condition(result, i)) {
|
|
325
|
+
break;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
return result;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
exports.Loop = Loop;
|
|
332
|
+
/**
|
|
333
|
+
* Parallel workflow pattern.
|
|
334
|
+
* Python parity: praisonaiagents/workflows/workflows.py
|
|
335
|
+
*/
|
|
336
|
+
class Parallel {
|
|
337
|
+
constructor(config) {
|
|
338
|
+
this.agents = config.agents;
|
|
339
|
+
}
|
|
340
|
+
async run(input) {
|
|
341
|
+
const promises = this.agents.map(agent => {
|
|
342
|
+
if (typeof agent.start === 'function') {
|
|
343
|
+
return agent.start(input);
|
|
344
|
+
}
|
|
345
|
+
return Promise.resolve(null);
|
|
346
|
+
});
|
|
347
|
+
return Promise.all(promises);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
exports.Parallel = Parallel;
|
|
351
|
+
/**
|
|
352
|
+
* Route workflow pattern.
|
|
353
|
+
* Python parity: praisonaiagents/workflows/workflows.py
|
|
354
|
+
*/
|
|
355
|
+
class Route {
|
|
356
|
+
constructor(config) {
|
|
357
|
+
this.routes = new Map(Object.entries(config.routes));
|
|
358
|
+
this.defaultAgent = config.default;
|
|
359
|
+
this.router = config.router;
|
|
360
|
+
}
|
|
361
|
+
async run(input) {
|
|
362
|
+
const routeKey = this.router(input);
|
|
363
|
+
const agent = this.routes.get(routeKey) ?? this.defaultAgent;
|
|
364
|
+
if (agent && typeof agent.start === 'function') {
|
|
365
|
+
return agent.start(input);
|
|
366
|
+
}
|
|
367
|
+
return null;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
exports.Route = Route;
|
|
371
|
+
/**
|
|
372
|
+
* If workflow pattern (conditional).
|
|
373
|
+
* Python parity: praisonaiagents/workflows/workflows.py
|
|
374
|
+
*/
|
|
375
|
+
class If {
|
|
376
|
+
constructor(config) {
|
|
377
|
+
this.condition = config.condition;
|
|
378
|
+
this.thenAgent = config.then;
|
|
379
|
+
this.elseAgent = config.else;
|
|
380
|
+
}
|
|
381
|
+
async run(input) {
|
|
382
|
+
const agent = this.condition(input) ? this.thenAgent : this.elseAgent;
|
|
383
|
+
if (agent && typeof agent.start === 'function') {
|
|
384
|
+
return agent.start(input);
|
|
385
|
+
}
|
|
386
|
+
return null;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
exports.If = If;
|
|
390
|
+
/**
|
|
391
|
+
* When helper for conditional workflows.
|
|
392
|
+
* Python parity: praisonaiagents/workflows/workflows.py
|
|
393
|
+
*/
|
|
394
|
+
function when(condition, thenAgent, elseAgent) {
|
|
395
|
+
return new If({ condition, then: thenAgent, else: elseAgent });
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Chunking class for text splitting.
|
|
399
|
+
* Python parity: praisonaiagents/knowledge/chunking.py
|
|
400
|
+
*/
|
|
401
|
+
class Chunking {
|
|
402
|
+
constructor(config = {}) {
|
|
403
|
+
this.chunkSize = config.chunkSize ?? 1000;
|
|
404
|
+
this.chunkOverlap = config.chunkOverlap ?? 200;
|
|
405
|
+
this.separator = config.separator ?? '\n\n';
|
|
406
|
+
}
|
|
407
|
+
split(text) {
|
|
408
|
+
const chunks = [];
|
|
409
|
+
const paragraphs = text.split(this.separator);
|
|
410
|
+
let currentChunk = '';
|
|
411
|
+
for (const para of paragraphs) {
|
|
412
|
+
if ((currentChunk + para).length <= this.chunkSize) {
|
|
413
|
+
currentChunk += (currentChunk ? this.separator : '') + para;
|
|
414
|
+
}
|
|
415
|
+
else {
|
|
416
|
+
if (currentChunk)
|
|
417
|
+
chunks.push(currentChunk);
|
|
418
|
+
currentChunk = para;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
if (currentChunk)
|
|
422
|
+
chunks.push(currentChunk);
|
|
423
|
+
return chunks;
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
exports.Chunking = Chunking;
|
|
427
|
+
/**
|
|
428
|
+
* Knowledge class for knowledge base management.
|
|
429
|
+
* Python parity: praisonaiagents/knowledge/knowledge.py
|
|
430
|
+
*/
|
|
431
|
+
class Knowledge {
|
|
432
|
+
constructor(config = {}) {
|
|
433
|
+
this.sources = config.sources ?? [];
|
|
434
|
+
this.chunking = new Chunking({
|
|
435
|
+
chunkSize: config.chunkSize,
|
|
436
|
+
chunkOverlap: config.chunkOverlap,
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
async add(source) {
|
|
440
|
+
this.sources.push(source);
|
|
441
|
+
}
|
|
442
|
+
async search(query, topK) {
|
|
443
|
+
return []; // Placeholder
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
exports.Knowledge = Knowledge;
|
|
447
|
+
/**
|
|
448
|
+
* Session class for session management.
|
|
449
|
+
* Python parity: praisonaiagents/session/session.py
|
|
450
|
+
*/
|
|
451
|
+
class Session {
|
|
452
|
+
constructor(config = {}) {
|
|
453
|
+
this.id = config.id ?? crypto.randomUUID();
|
|
454
|
+
this.messages = [];
|
|
455
|
+
this.metadata = config.metadata ?? {};
|
|
456
|
+
}
|
|
457
|
+
addMessage(message) {
|
|
458
|
+
this.messages.push(message);
|
|
459
|
+
}
|
|
460
|
+
getMessages() {
|
|
461
|
+
return [...this.messages];
|
|
462
|
+
}
|
|
463
|
+
clear() {
|
|
464
|
+
this.messages = [];
|
|
465
|
+
}
|
|
466
|
+
setMetadata(key, value) {
|
|
467
|
+
this.metadata[key] = value;
|
|
468
|
+
}
|
|
469
|
+
getMetadata(key) {
|
|
470
|
+
return this.metadata[key];
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
exports.Session = Session;
|
|
474
|
+
/**
|
|
475
|
+
* ContextManager - Manages conversation context.
|
|
476
|
+
* Python parity: praisonaiagents/context/fast.py
|
|
477
|
+
*/
|
|
478
|
+
class ContextManager {
|
|
479
|
+
constructor(config = {}) {
|
|
480
|
+
this.config = {
|
|
481
|
+
maxTokens: 4000,
|
|
482
|
+
strategy: 'truncate',
|
|
483
|
+
preserveSystemPrompt: true,
|
|
484
|
+
...config,
|
|
485
|
+
};
|
|
486
|
+
this.messages = [];
|
|
487
|
+
}
|
|
488
|
+
add(message) {
|
|
489
|
+
this.messages.push(message);
|
|
490
|
+
}
|
|
491
|
+
getOptimized() {
|
|
492
|
+
// Simple truncation for now
|
|
493
|
+
return this.messages.slice(-20);
|
|
494
|
+
}
|
|
495
|
+
clear() {
|
|
496
|
+
this.messages = [];
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
exports.ContextManager = ContextManager;
|
|
500
|
+
/**
|
|
501
|
+
* FastContext - Fast context retrieval.
|
|
502
|
+
* Python parity: praisonaiagents/context/fast.py
|
|
503
|
+
*/
|
|
504
|
+
class FastContext {
|
|
505
|
+
constructor(config) {
|
|
506
|
+
this.directory = config.directory;
|
|
507
|
+
this.extensions = config.extensions ?? ['.ts', '.js', '.py', '.md'];
|
|
508
|
+
}
|
|
509
|
+
async search(query) {
|
|
510
|
+
return []; // Placeholder
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
exports.FastContext = FastContext;
|
|
514
|
+
/**
|
|
515
|
+
* MCP - Model Context Protocol client.
|
|
516
|
+
* Python parity: praisonaiagents/mcp/mcp.py
|
|
517
|
+
*/
|
|
518
|
+
class MCP {
|
|
519
|
+
constructor() {
|
|
520
|
+
this.servers = new Map();
|
|
521
|
+
}
|
|
522
|
+
async connect(name, config) {
|
|
523
|
+
this.servers.set(name, config);
|
|
524
|
+
}
|
|
525
|
+
async disconnect(name) {
|
|
526
|
+
this.servers.delete(name);
|
|
527
|
+
}
|
|
528
|
+
async callTool(server, tool, args) {
|
|
529
|
+
return null; // Placeholder
|
|
530
|
+
}
|
|
531
|
+
listServers() {
|
|
532
|
+
return Array.from(this.servers.keys());
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
exports.MCP = MCP;
|
|
536
|
+
/**
|
|
537
|
+
* MinimalTelemetry - Minimal telemetry collector.
|
|
538
|
+
* Python parity: praisonaiagents/telemetry/telemetry.py
|
|
539
|
+
*/
|
|
540
|
+
class MinimalTelemetry {
|
|
541
|
+
constructor(enabled = false) {
|
|
542
|
+
this.enabled = enabled;
|
|
543
|
+
this.events = [];
|
|
544
|
+
}
|
|
545
|
+
track(event, data) {
|
|
546
|
+
if (this.enabled) {
|
|
547
|
+
this.events.push({ event, data, timestamp: Date.now() });
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
getEvents() {
|
|
551
|
+
return [...this.events];
|
|
552
|
+
}
|
|
553
|
+
clear() {
|
|
554
|
+
this.events = [];
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
exports.MinimalTelemetry = MinimalTelemetry;
|
|
558
|
+
/**
|
|
559
|
+
* Plan - Execution plan.
|
|
560
|
+
* Python parity: praisonaiagents/planning/planning.py
|
|
561
|
+
*/
|
|
562
|
+
class Plan {
|
|
563
|
+
constructor(config = {}) {
|
|
564
|
+
this.id = config.id ?? crypto.randomUUID();
|
|
565
|
+
this.steps = config.steps ?? [];
|
|
566
|
+
this.status = 'pending';
|
|
567
|
+
}
|
|
568
|
+
addStep(step) {
|
|
569
|
+
this.steps.push(step);
|
|
570
|
+
}
|
|
571
|
+
async execute() {
|
|
572
|
+
this.status = 'running';
|
|
573
|
+
const results = [];
|
|
574
|
+
for (const step of this.steps) {
|
|
575
|
+
step.status = 'running';
|
|
576
|
+
// Execute step
|
|
577
|
+
step.status = 'completed';
|
|
578
|
+
results.push(step);
|
|
579
|
+
}
|
|
580
|
+
this.status = 'completed';
|
|
581
|
+
return results;
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
exports.Plan = Plan;
|
|
585
|
+
/**
|
|
586
|
+
* SkillLoader - Loads skills from files.
|
|
587
|
+
* Python parity: praisonaiagents/skills/loader.py
|
|
588
|
+
*/
|
|
589
|
+
class SkillLoader {
|
|
590
|
+
constructor(directories = []) {
|
|
591
|
+
this.directories = directories;
|
|
592
|
+
}
|
|
593
|
+
async load(name) {
|
|
594
|
+
return null; // Placeholder
|
|
595
|
+
}
|
|
596
|
+
async loadAll() {
|
|
597
|
+
return []; // Placeholder
|
|
598
|
+
}
|
|
599
|
+
addDirectory(dir) {
|
|
600
|
+
this.directories.push(dir);
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
exports.SkillLoader = SkillLoader;
|
|
604
|
+
// ============================================================================
|
|
605
|
+
// P2: TELEMETRY FUNCTIONS
|
|
606
|
+
// ============================================================================
|
|
607
|
+
let _telemetryEnabled = false;
|
|
608
|
+
let _performanceModeEnabled = false;
|
|
609
|
+
let _telemetryCollector = null;
|
|
610
|
+
/**
|
|
611
|
+
* Enable telemetry collection.
|
|
612
|
+
* Python parity: praisonaiagents/telemetry
|
|
613
|
+
*/
|
|
614
|
+
function enableTelemetry() {
|
|
615
|
+
_telemetryEnabled = true;
|
|
616
|
+
if (!_telemetryCollector) {
|
|
617
|
+
_telemetryCollector = new MinimalTelemetry(true);
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
/**
|
|
621
|
+
* Disable telemetry collection.
|
|
622
|
+
* Python parity: praisonaiagents/telemetry
|
|
623
|
+
*/
|
|
624
|
+
function disableTelemetry() {
|
|
625
|
+
_telemetryEnabled = false;
|
|
626
|
+
}
|
|
627
|
+
/**
|
|
628
|
+
* Get telemetry collector.
|
|
629
|
+
* Python parity: praisonaiagents/telemetry
|
|
630
|
+
*/
|
|
631
|
+
function getTelemetry() {
|
|
632
|
+
return _telemetryCollector;
|
|
633
|
+
}
|
|
634
|
+
/**
|
|
635
|
+
* Enable performance mode.
|
|
636
|
+
* Python parity: praisonaiagents/telemetry
|
|
637
|
+
*/
|
|
638
|
+
function enablePerformanceMode() {
|
|
639
|
+
_performanceModeEnabled = true;
|
|
640
|
+
}
|
|
641
|
+
/**
|
|
642
|
+
* Disable performance mode.
|
|
643
|
+
* Python parity: praisonaiagents/telemetry
|
|
644
|
+
*/
|
|
645
|
+
function disablePerformanceMode() {
|
|
646
|
+
_performanceModeEnabled = false;
|
|
647
|
+
}
|
|
648
|
+
/**
|
|
649
|
+
* Cleanup telemetry resources.
|
|
650
|
+
* Python parity: praisonaiagents/telemetry
|
|
651
|
+
*/
|
|
652
|
+
function cleanupTelemetryResources() {
|
|
653
|
+
if (_telemetryCollector) {
|
|
654
|
+
_telemetryCollector.clear();
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
const _syncDisplayCallbacks = [];
|
|
658
|
+
const _asyncDisplayCallbacks = [];
|
|
659
|
+
const _errorLogs = [];
|
|
660
|
+
/**
|
|
661
|
+
* Register a display callback.
|
|
662
|
+
* Python parity: praisonaiagents/main.py
|
|
663
|
+
*/
|
|
664
|
+
function registerDisplayCallback(callback, async_ = false) {
|
|
665
|
+
if (async_) {
|
|
666
|
+
_asyncDisplayCallbacks.push(callback);
|
|
667
|
+
}
|
|
668
|
+
else {
|
|
669
|
+
_syncDisplayCallbacks.push(callback);
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
/**
|
|
673
|
+
* Get sync display callbacks.
|
|
674
|
+
* Python parity: praisonaiagents/main.py
|
|
675
|
+
*/
|
|
676
|
+
function syncDisplayCallbacks() {
|
|
677
|
+
return [..._syncDisplayCallbacks];
|
|
678
|
+
}
|
|
679
|
+
/**
|
|
680
|
+
* Get async display callbacks.
|
|
681
|
+
* Python parity: praisonaiagents/main.py
|
|
682
|
+
*/
|
|
683
|
+
function asyncDisplayCallbacks() {
|
|
684
|
+
return [..._asyncDisplayCallbacks];
|
|
685
|
+
}
|
|
686
|
+
/**
|
|
687
|
+
* Display error message.
|
|
688
|
+
* Python parity: praisonaiagents/main.py
|
|
689
|
+
*/
|
|
690
|
+
function displayError(message) {
|
|
691
|
+
console.error(`[ERROR] ${message}`);
|
|
692
|
+
_errorLogs.push(message);
|
|
693
|
+
}
|
|
694
|
+
/**
|
|
695
|
+
* Display generating message.
|
|
696
|
+
* Python parity: praisonaiagents/main.py
|
|
697
|
+
*/
|
|
698
|
+
function displayGenerating(agentName) {
|
|
699
|
+
console.log(`[${agentName}] Generating...`);
|
|
700
|
+
}
|
|
701
|
+
/**
|
|
702
|
+
* Display instruction message.
|
|
703
|
+
* Python parity: praisonaiagents/main.py
|
|
704
|
+
*/
|
|
705
|
+
function displayInstruction(instruction) {
|
|
706
|
+
console.log(`[INSTRUCTION] ${instruction}`);
|
|
707
|
+
}
|
|
708
|
+
/**
|
|
709
|
+
* Display interaction message.
|
|
710
|
+
* Python parity: praisonaiagents/main.py
|
|
711
|
+
*/
|
|
712
|
+
function displayInteraction(from, to, message) {
|
|
713
|
+
console.log(`[${from} -> ${to}] ${message}`);
|
|
714
|
+
}
|
|
715
|
+
/**
|
|
716
|
+
* Display self reflection message.
|
|
717
|
+
* Python parity: praisonaiagents/main.py
|
|
718
|
+
*/
|
|
719
|
+
function displaySelfReflection(agentName, reflection) {
|
|
720
|
+
console.log(`[${agentName} REFLECTION] ${reflection}`);
|
|
721
|
+
}
|
|
722
|
+
/**
|
|
723
|
+
* Display tool call message.
|
|
724
|
+
* Python parity: praisonaiagents/main.py
|
|
725
|
+
*/
|
|
726
|
+
function displayToolCall(toolName, args) {
|
|
727
|
+
console.log(`[TOOL] ${toolName}(${JSON.stringify(args)})`);
|
|
728
|
+
}
|
|
729
|
+
/**
|
|
730
|
+
* Get error logs.
|
|
731
|
+
* Python parity: praisonaiagents/main.py
|
|
732
|
+
*/
|
|
733
|
+
function errorLogs() {
|
|
734
|
+
return [..._errorLogs];
|
|
735
|
+
}
|
|
736
|
+
// ============================================================================
|
|
737
|
+
// P3: PLUGIN FUNCTIONS
|
|
738
|
+
// ============================================================================
|
|
739
|
+
/**
|
|
740
|
+
* Plugin class.
|
|
741
|
+
* Python parity: praisonaiagents/plugins
|
|
742
|
+
*/
|
|
743
|
+
class Plugin {
|
|
744
|
+
constructor(config) {
|
|
745
|
+
this.name = config.name;
|
|
746
|
+
this.version = config.version ?? '1.0.0';
|
|
747
|
+
this.description = config.description;
|
|
748
|
+
this.hooks = config.hooks ?? [];
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
exports.Plugin = Plugin;
|
|
752
|
+
let _pluginManager = null;
|
|
753
|
+
/**
|
|
754
|
+
* Get plugin manager.
|
|
755
|
+
* Python parity: praisonaiagents/plugins
|
|
756
|
+
*/
|
|
757
|
+
function getPluginManager() {
|
|
758
|
+
if (!_pluginManager) {
|
|
759
|
+
_pluginManager = {
|
|
760
|
+
plugins: new Map(),
|
|
761
|
+
register(plugin) {
|
|
762
|
+
this.plugins.set(plugin.name, plugin);
|
|
763
|
+
},
|
|
764
|
+
get(name) {
|
|
765
|
+
return this.plugins.get(name);
|
|
766
|
+
},
|
|
767
|
+
list() {
|
|
768
|
+
return Array.from(this.plugins.values());
|
|
769
|
+
},
|
|
770
|
+
};
|
|
771
|
+
}
|
|
772
|
+
return _pluginManager;
|
|
773
|
+
}
|
|
774
|
+
/**
|
|
775
|
+
* Get default plugin directories.
|
|
776
|
+
* Python parity: praisonaiagents/plugins
|
|
777
|
+
*/
|
|
778
|
+
function getDefaultPluginDirs() {
|
|
779
|
+
return [
|
|
780
|
+
'.praison/plugins',
|
|
781
|
+
'~/.praison/plugins',
|
|
782
|
+
'/etc/praison/plugins',
|
|
783
|
+
];
|
|
784
|
+
}
|
|
785
|
+
/**
|
|
786
|
+
* Ensure plugin directory exists.
|
|
787
|
+
* Python parity: praisonaiagents/plugins
|
|
788
|
+
*/
|
|
789
|
+
function ensurePluginDir(dir) {
|
|
790
|
+
// In browser/Node.js, this would create the directory
|
|
791
|
+
}
|
|
792
|
+
/**
|
|
793
|
+
* Get plugin template.
|
|
794
|
+
* Python parity: praisonaiagents/plugins
|
|
795
|
+
*/
|
|
796
|
+
function getPluginTemplate() {
|
|
797
|
+
return `/**
|
|
798
|
+
* PraisonAI Plugin Template
|
|
799
|
+
*/
|
|
800
|
+
export const plugin = {
|
|
801
|
+
name: 'my-plugin',
|
|
802
|
+
version: '1.0.0',
|
|
803
|
+
description: 'My custom plugin',
|
|
804
|
+
hooks: [
|
|
805
|
+
{
|
|
806
|
+
event: 'before_agent_run',
|
|
807
|
+
handler: (agent, input) => {
|
|
808
|
+
console.log('Before agent run:', agent.name);
|
|
809
|
+
return input;
|
|
810
|
+
},
|
|
811
|
+
},
|
|
812
|
+
],
|
|
813
|
+
};
|
|
814
|
+
`;
|
|
815
|
+
}
|
|
816
|
+
/**
|
|
817
|
+
* Load plugin from file.
|
|
818
|
+
* Python parity: praisonaiagents/plugins
|
|
819
|
+
*/
|
|
820
|
+
async function loadPlugin(path) {
|
|
821
|
+
return null; // Placeholder
|
|
822
|
+
}
|
|
823
|
+
/**
|
|
824
|
+
* Parse plugin header.
|
|
825
|
+
* Python parity: praisonaiagents/plugins
|
|
826
|
+
*/
|
|
827
|
+
function parsePluginHeader(content) {
|
|
828
|
+
const match = content.match(/\/\*\*[\s\S]*?\*\//);
|
|
829
|
+
if (!match)
|
|
830
|
+
return null;
|
|
831
|
+
const header = match[0];
|
|
832
|
+
const nameMatch = header.match(/@name\s+(.+)/);
|
|
833
|
+
const versionMatch = header.match(/@version\s+(.+)/);
|
|
834
|
+
return {
|
|
835
|
+
name: nameMatch?.[1]?.trim() ?? 'unknown',
|
|
836
|
+
version: versionMatch?.[1]?.trim() ?? '1.0.0',
|
|
837
|
+
};
|
|
838
|
+
}
|
|
839
|
+
/**
|
|
840
|
+
* Parse plugin header from file.
|
|
841
|
+
* Python parity: praisonaiagents/plugins
|
|
842
|
+
*/
|
|
843
|
+
async function parsePluginHeaderFromFile(path) {
|
|
844
|
+
return null; // Placeholder
|
|
845
|
+
}
|
|
846
|
+
/**
|
|
847
|
+
* Discover plugins in directories.
|
|
848
|
+
* Python parity: praisonaiagents/plugins
|
|
849
|
+
*/
|
|
850
|
+
async function discoverPlugins(dirs) {
|
|
851
|
+
return []; // Placeholder
|
|
852
|
+
}
|
|
853
|
+
/**
|
|
854
|
+
* Discover and load plugins.
|
|
855
|
+
* Python parity: praisonaiagents/plugins
|
|
856
|
+
*/
|
|
857
|
+
async function discoverAndLoadPlugins(dirs) {
|
|
858
|
+
return []; // Placeholder
|
|
859
|
+
}
|
|
860
|
+
// ============================================================================
|
|
861
|
+
// P3: TRACE & CONDITION TYPES
|
|
862
|
+
// ============================================================================
|
|
863
|
+
/**
|
|
864
|
+
* TraceSink - Sink for trace events.
|
|
865
|
+
* Python parity: praisonaiagents/trace
|
|
866
|
+
*/
|
|
867
|
+
class TraceSink {
|
|
868
|
+
constructor() {
|
|
869
|
+
this.events = [];
|
|
870
|
+
}
|
|
871
|
+
emit(event) {
|
|
872
|
+
this.events.push(event);
|
|
873
|
+
}
|
|
874
|
+
getEvents() {
|
|
875
|
+
return [...this.events];
|
|
876
|
+
}
|
|
877
|
+
clear() {
|
|
878
|
+
this.events = [];
|
|
879
|
+
}
|
|
880
|
+
}
|
|
881
|
+
exports.TraceSink = TraceSink;
|
|
882
|
+
/**
|
|
883
|
+
* ContextEventType - Types of context events.
|
|
884
|
+
* Python parity: praisonaiagents/trace
|
|
885
|
+
*/
|
|
886
|
+
var ContextEventType;
|
|
887
|
+
(function (ContextEventType) {
|
|
888
|
+
ContextEventType["AGENT_START"] = "agent_start";
|
|
889
|
+
ContextEventType["AGENT_END"] = "agent_end";
|
|
890
|
+
ContextEventType["TOOL_CALL"] = "tool_call";
|
|
891
|
+
ContextEventType["TOOL_RESULT"] = "tool_result";
|
|
892
|
+
ContextEventType["LLM_REQUEST"] = "llm_request";
|
|
893
|
+
ContextEventType["LLM_RESPONSE"] = "llm_response";
|
|
894
|
+
ContextEventType["ERROR"] = "error";
|
|
895
|
+
ContextEventType["HANDOFF"] = "handoff";
|
|
896
|
+
})(ContextEventType || (exports.ContextEventType = ContextEventType = {}));
|
|
897
|
+
/**
|
|
898
|
+
* DictCondition - Dictionary-based condition.
|
|
899
|
+
* Python parity: praisonaiagents/conditions
|
|
900
|
+
*/
|
|
901
|
+
class DictCondition {
|
|
902
|
+
constructor(conditions) {
|
|
903
|
+
this.conditions = conditions;
|
|
904
|
+
}
|
|
905
|
+
evaluate(context) {
|
|
906
|
+
for (const [key, value] of Object.entries(this.conditions)) {
|
|
907
|
+
if (context[key] !== value) {
|
|
908
|
+
return false;
|
|
909
|
+
}
|
|
910
|
+
}
|
|
911
|
+
return true;
|
|
912
|
+
}
|
|
913
|
+
}
|
|
914
|
+
exports.DictCondition = DictCondition;
|
|
915
|
+
/**
|
|
916
|
+
* Evaluate a condition.
|
|
917
|
+
* Python parity: praisonaiagents/conditions
|
|
918
|
+
*/
|
|
919
|
+
function evaluateCondition(condition, context) {
|
|
920
|
+
if (typeof condition === 'function') {
|
|
921
|
+
return condition(context);
|
|
922
|
+
}
|
|
923
|
+
if ('evaluate' in condition) {
|
|
924
|
+
return condition.evaluate(context);
|
|
925
|
+
}
|
|
926
|
+
return new DictCondition(condition).evaluate(context);
|
|
927
|
+
}
|
|
928
|
+
/**
|
|
929
|
+
* Get embedding dimensions.
|
|
930
|
+
* Python parity: praisonaiagents/embedding
|
|
931
|
+
*/
|
|
932
|
+
function getDimensions(model) {
|
|
933
|
+
const dimensions = {
|
|
934
|
+
'text-embedding-3-small': 1536,
|
|
935
|
+
'text-embedding-3-large': 3072,
|
|
936
|
+
'text-embedding-ada-002': 1536,
|
|
937
|
+
};
|
|
938
|
+
return dimensions[model] ?? 1536;
|
|
939
|
+
}
|
|
940
|
+
/**
|
|
941
|
+
* Embed text.
|
|
942
|
+
* Python parity: praisonaiagents/embedding
|
|
943
|
+
*/
|
|
944
|
+
async function embed(text, model) {
|
|
945
|
+
return [0.1, 0.2, 0.3]; // Placeholder
|
|
946
|
+
}
|
|
947
|
+
// ============================================================================
|
|
948
|
+
// P3: ADDITIONAL TYPES
|
|
949
|
+
// ============================================================================
|
|
950
|
+
/**
|
|
951
|
+
* FlowDisplay - Display for workflow execution.
|
|
952
|
+
* Python parity: praisonaiagents/flow_display
|
|
953
|
+
*/
|
|
954
|
+
class FlowDisplay {
|
|
955
|
+
constructor() {
|
|
956
|
+
this.steps = [];
|
|
957
|
+
}
|
|
958
|
+
addStep(step) {
|
|
959
|
+
this.steps.push(step);
|
|
960
|
+
}
|
|
961
|
+
render() {
|
|
962
|
+
return this.steps.map(s => `- ${s.name}: ${s.status}`).join('\n');
|
|
963
|
+
}
|
|
964
|
+
}
|
|
965
|
+
exports.FlowDisplay = FlowDisplay;
|
|
966
|
+
/**
|
|
967
|
+
* Track workflow execution.
|
|
968
|
+
* Python parity: praisonaiagents/flow_display
|
|
969
|
+
*/
|
|
970
|
+
function trackWorkflow(name) {
|
|
971
|
+
const display = new FlowDisplay();
|
|
972
|
+
display.addStep({ name, status: 'started', timestamp: Date.now() });
|
|
973
|
+
return display;
|
|
974
|
+
}
|
|
975
|
+
/**
|
|
976
|
+
* FailoverManager - Manages LLM failover.
|
|
977
|
+
* Python parity: praisonaiagents/llm/failover.py
|
|
978
|
+
*/
|
|
979
|
+
class FailoverManager {
|
|
980
|
+
constructor(providers) {
|
|
981
|
+
this.providers = providers;
|
|
982
|
+
this.currentIndex = 0;
|
|
983
|
+
}
|
|
984
|
+
getCurrentProvider() {
|
|
985
|
+
return this.providers[this.currentIndex];
|
|
986
|
+
}
|
|
987
|
+
failover() {
|
|
988
|
+
this.currentIndex++;
|
|
989
|
+
if (this.currentIndex >= this.providers.length) {
|
|
990
|
+
return null;
|
|
991
|
+
}
|
|
992
|
+
return this.providers[this.currentIndex];
|
|
993
|
+
}
|
|
994
|
+
reset() {
|
|
995
|
+
this.currentIndex = 0;
|
|
996
|
+
}
|
|
997
|
+
}
|
|
998
|
+
exports.FailoverManager = FailoverManager;
|
|
999
|
+
/**
|
|
1000
|
+
* SandboxStatus - Status of sandbox execution.
|
|
1001
|
+
* Python parity: praisonaiagents/sandbox
|
|
1002
|
+
*/
|
|
1003
|
+
var SandboxStatus;
|
|
1004
|
+
(function (SandboxStatus) {
|
|
1005
|
+
SandboxStatus["IDLE"] = "idle";
|
|
1006
|
+
SandboxStatus["RUNNING"] = "running";
|
|
1007
|
+
SandboxStatus["COMPLETED"] = "completed";
|
|
1008
|
+
SandboxStatus["FAILED"] = "failed";
|
|
1009
|
+
SandboxStatus["TIMEOUT"] = "timeout";
|
|
1010
|
+
})(SandboxStatus || (exports.SandboxStatus = SandboxStatus = {}));
|
|
1011
|
+
/**
|
|
1012
|
+
* Task - Task for workflow execution.
|
|
1013
|
+
* Python parity: praisonaiagents/task/task.py
|
|
1014
|
+
*/
|
|
1015
|
+
class Task {
|
|
1016
|
+
constructor(config) {
|
|
1017
|
+
this.name = config.name;
|
|
1018
|
+
this.description = config.description;
|
|
1019
|
+
this.expectedOutput = config.expectedOutput;
|
|
1020
|
+
this.agent = config.agent;
|
|
1021
|
+
this.dependencies = config.dependencies;
|
|
1022
|
+
}
|
|
1023
|
+
}
|
|
1024
|
+
exports.Task = Task;
|
|
1025
|
+
/**
|
|
1026
|
+
* MEMORY_PRESETS - Memory configuration presets.
|
|
1027
|
+
* Python parity: praisonaiagents/config/presets.py
|
|
1028
|
+
*/
|
|
1029
|
+
exports.MEMORY_PRESETS = {
|
|
1030
|
+
none: { enabled: false },
|
|
1031
|
+
short: { enabled: true, maxMessages: 10 },
|
|
1032
|
+
medium: { enabled: true, maxMessages: 50 },
|
|
1033
|
+
long: { enabled: true, maxMessages: 100, useLongTerm: true },
|
|
1034
|
+
persistent: { enabled: true, useLongTerm: true, persist: true },
|
|
1035
|
+
};
|
|
1036
|
+
/**
|
|
1037
|
+
* MemoryBackend - Backend for memory storage.
|
|
1038
|
+
* Python parity: praisonaiagents/memory
|
|
1039
|
+
*/
|
|
1040
|
+
var MemoryBackend;
|
|
1041
|
+
(function (MemoryBackend) {
|
|
1042
|
+
MemoryBackend["IN_MEMORY"] = "in_memory";
|
|
1043
|
+
MemoryBackend["FILE"] = "file";
|
|
1044
|
+
MemoryBackend["SQLITE"] = "sqlite";
|
|
1045
|
+
MemoryBackend["REDIS"] = "redis";
|
|
1046
|
+
MemoryBackend["CHROMA"] = "chroma";
|
|
1047
|
+
})(MemoryBackend || (exports.MemoryBackend = MemoryBackend = {}));
|
|
1048
|
+
/**
|
|
1049
|
+
* ConfigValidationError - Error for config validation.
|
|
1050
|
+
* Python parity: praisonaiagents/config
|
|
1051
|
+
*/
|
|
1052
|
+
class ConfigValidationError extends Error {
|
|
1053
|
+
constructor(field, value, message) {
|
|
1054
|
+
super(`Config validation error for '${field}': ${message}`);
|
|
1055
|
+
this.name = 'ConfigValidationError';
|
|
1056
|
+
this.field = field;
|
|
1057
|
+
this.value = value;
|
|
1058
|
+
}
|
|
1059
|
+
}
|
|
1060
|
+
exports.ConfigValidationError = ConfigValidationError;
|
|
1061
|
+
/**
|
|
1062
|
+
* Detect URL scheme.
|
|
1063
|
+
* Python parity: praisonaiagents/config
|
|
1064
|
+
*/
|
|
1065
|
+
function detectUrlScheme(url) {
|
|
1066
|
+
const match = url.match(/^([a-z][a-z0-9+.-]*):\/\//i);
|
|
1067
|
+
return match ? match[1].toLowerCase() : 'file';
|
|
1068
|
+
}
|
|
1069
|
+
/**
|
|
1070
|
+
* Resolve configuration.
|
|
1071
|
+
* Python parity: praisonaiagents/config/param_resolver.py
|
|
1072
|
+
*/
|
|
1073
|
+
function resolve(value, presets, defaultValue) {
|
|
1074
|
+
if (value === undefined || value === true) {
|
|
1075
|
+
return defaultValue;
|
|
1076
|
+
}
|
|
1077
|
+
if (value === false) {
|
|
1078
|
+
return defaultValue;
|
|
1079
|
+
}
|
|
1080
|
+
if (typeof value === 'string' && value in presets) {
|
|
1081
|
+
return presets[value];
|
|
1082
|
+
}
|
|
1083
|
+
return value;
|
|
1084
|
+
}
|
|
1085
|
+
/**
|
|
1086
|
+
* Resolve guardrail policies.
|
|
1087
|
+
* Python parity: praisonaiagents/config/resolvers.py
|
|
1088
|
+
*/
|
|
1089
|
+
function resolveGuardrailPolicies(policies) {
|
|
1090
|
+
return policies.map(p => {
|
|
1091
|
+
if (typeof p === 'string') {
|
|
1092
|
+
return { name: p, action: 'warn' };
|
|
1093
|
+
}
|
|
1094
|
+
return p;
|
|
1095
|
+
});
|
|
1096
|
+
}
|
|
1097
|
+
/**
|
|
1098
|
+
* Trace context.
|
|
1099
|
+
* Python parity: praisonaiagents/trace
|
|
1100
|
+
*/
|
|
1101
|
+
function traceContext(name) {
|
|
1102
|
+
const sink = new TraceSink();
|
|
1103
|
+
sink.emit({ type: 'context_start', name, timestamp: Date.now() });
|
|
1104
|
+
return sink;
|
|
1105
|
+
}
|
|
1106
|
+
/**
|
|
1107
|
+
* AGUI - Agent GUI protocol.
|
|
1108
|
+
* Python parity: praisonaiagents/ui/agui
|
|
1109
|
+
*/
|
|
1110
|
+
class AGUI {
|
|
1111
|
+
constructor(config) {
|
|
1112
|
+
this.config = config;
|
|
1113
|
+
}
|
|
1114
|
+
getName() {
|
|
1115
|
+
return this.config.name;
|
|
1116
|
+
}
|
|
1117
|
+
getRouter() {
|
|
1118
|
+
return null; // Placeholder for FastAPI router
|
|
1119
|
+
}
|
|
1120
|
+
}
|
|
1121
|
+
exports.AGUI = AGUI;
|
|
1122
|
+
// ============================================================================
|
|
1123
|
+
// P3: ADDITIONAL DISPLAY CALLBACK EXPORTS (snake_case for Python parity)
|
|
1124
|
+
// Note: Knowledge, Parallel, Route, Session are already defined above
|
|
1125
|
+
// ============================================================================
|
|
1126
|
+
/**
|
|
1127
|
+
* Register a display callback.
|
|
1128
|
+
* Python parity: praisonaiagents/main.py
|
|
1129
|
+
*/
|
|
1130
|
+
function register_display_callback(callback) {
|
|
1131
|
+
_syncDisplayCallbacks.push(callback);
|
|
1132
|
+
}
|
|
1133
|
+
/**
|
|
1134
|
+
* Sync display callbacks.
|
|
1135
|
+
* Python parity: praisonaiagents/main.py
|
|
1136
|
+
*/
|
|
1137
|
+
function sync_display_callbacks() {
|
|
1138
|
+
return [..._syncDisplayCallbacks];
|
|
1139
|
+
}
|
|
1140
|
+
/**
|
|
1141
|
+
* Async display callbacks.
|
|
1142
|
+
* Python parity: praisonaiagents/main.py
|
|
1143
|
+
*/
|
|
1144
|
+
function async_display_callbacks() {
|
|
1145
|
+
return [..._asyncDisplayCallbacks];
|
|
1146
|
+
}
|
|
1147
|
+
/**
|
|
1148
|
+
* Display error.
|
|
1149
|
+
* Python parity: praisonaiagents/main.py
|
|
1150
|
+
*/
|
|
1151
|
+
function display_error(error) {
|
|
1152
|
+
const message = error instanceof Error ? error.message : error;
|
|
1153
|
+
_errorLogs.push(message);
|
|
1154
|
+
_syncDisplayCallbacks.forEach((cb) => cb({ type: 'error', message }));
|
|
1155
|
+
}
|
|
1156
|
+
/**
|
|
1157
|
+
* Display generating.
|
|
1158
|
+
* Python parity: praisonaiagents/main.py
|
|
1159
|
+
*/
|
|
1160
|
+
function display_generating(agent, task) {
|
|
1161
|
+
_syncDisplayCallbacks.forEach((cb) => cb({ type: 'generating', agent, task }));
|
|
1162
|
+
}
|
|
1163
|
+
/**
|
|
1164
|
+
* Display instruction.
|
|
1165
|
+
* Python parity: praisonaiagents/main.py
|
|
1166
|
+
*/
|
|
1167
|
+
function display_instruction(instruction) {
|
|
1168
|
+
_syncDisplayCallbacks.forEach((cb) => cb({ type: 'instruction', instruction }));
|
|
1169
|
+
}
|
|
1170
|
+
/**
|
|
1171
|
+
* Display interaction.
|
|
1172
|
+
* Python parity: praisonaiagents/main.py
|
|
1173
|
+
*/
|
|
1174
|
+
function display_interaction(from, to, message) {
|
|
1175
|
+
_syncDisplayCallbacks.forEach((cb) => cb({ type: 'interaction', from, to, message }));
|
|
1176
|
+
}
|
|
1177
|
+
/**
|
|
1178
|
+
* Display self reflection.
|
|
1179
|
+
* Python parity: praisonaiagents/main.py
|
|
1180
|
+
*/
|
|
1181
|
+
function display_self_reflection(agent, reflection) {
|
|
1182
|
+
_syncDisplayCallbacks.forEach((cb) => cb({ type: 'self_reflection', agent, reflection }));
|
|
1183
|
+
}
|
|
1184
|
+
/**
|
|
1185
|
+
* Display tool call.
|
|
1186
|
+
* Python parity: praisonaiagents/main.py
|
|
1187
|
+
*/
|
|
1188
|
+
function display_tool_call(tool, args, result) {
|
|
1189
|
+
_syncDisplayCallbacks.forEach((cb) => cb({ type: 'tool_call', tool, args, result }));
|
|
1190
|
+
}
|
|
1191
|
+
/**
|
|
1192
|
+
* Error logs.
|
|
1193
|
+
* Python parity: praisonaiagents/main.py
|
|
1194
|
+
*/
|
|
1195
|
+
function error_logs() {
|
|
1196
|
+
return [..._errorLogs];
|
|
1197
|
+
}
|
|
1198
|
+
// ============================================================================
|
|
1199
|
+
// P3: PLUGIN FUNCTIONS
|
|
1200
|
+
// ============================================================================
|
|
1201
|
+
const pluginDirs = [];
|
|
1202
|
+
const loadedPlugins = new Map();
|
|
1203
|
+
/**
|
|
1204
|
+
* Get plugin manager.
|
|
1205
|
+
* Python parity: praisonaiagents/plugins
|
|
1206
|
+
*/
|
|
1207
|
+
function get_plugin_manager() {
|
|
1208
|
+
return { plugins: loadedPlugins, dirs: pluginDirs };
|
|
1209
|
+
}
|
|
1210
|
+
/**
|
|
1211
|
+
* Get default plugin dirs.
|
|
1212
|
+
* Python parity: praisonaiagents/plugins
|
|
1213
|
+
*/
|
|
1214
|
+
function get_default_plugin_dirs() {
|
|
1215
|
+
return ['./plugins', './praisonai_plugins', '~/.praisonai/plugins'];
|
|
1216
|
+
}
|
|
1217
|
+
/**
|
|
1218
|
+
* Ensure plugin dir exists.
|
|
1219
|
+
* Python parity: praisonaiagents/plugins
|
|
1220
|
+
*/
|
|
1221
|
+
function ensure_plugin_dir(dir) {
|
|
1222
|
+
if (!pluginDirs.includes(dir)) {
|
|
1223
|
+
pluginDirs.push(dir);
|
|
1224
|
+
}
|
|
1225
|
+
return true;
|
|
1226
|
+
}
|
|
1227
|
+
/**
|
|
1228
|
+
* Get plugin template.
|
|
1229
|
+
* Python parity: praisonaiagents/plugins
|
|
1230
|
+
*/
|
|
1231
|
+
function get_plugin_template(name) {
|
|
1232
|
+
return `/**
|
|
1233
|
+
* Plugin: ${name}
|
|
1234
|
+
* @praisonai-plugin
|
|
1235
|
+
* @version 1.0.0
|
|
1236
|
+
*/
|
|
1237
|
+
export default {
|
|
1238
|
+
name: '${name}',
|
|
1239
|
+
version: '1.0.0',
|
|
1240
|
+
hooks: {},
|
|
1241
|
+
tools: [],
|
|
1242
|
+
};
|
|
1243
|
+
`;
|
|
1244
|
+
}
|
|
1245
|
+
/**
|
|
1246
|
+
* Load plugin.
|
|
1247
|
+
* Python parity: praisonaiagents/plugins
|
|
1248
|
+
*/
|
|
1249
|
+
async function load_plugin(path) {
|
|
1250
|
+
const plugin = { path, loaded: true };
|
|
1251
|
+
loadedPlugins.set(path, plugin);
|
|
1252
|
+
return plugin;
|
|
1253
|
+
}
|
|
1254
|
+
/**
|
|
1255
|
+
* Parse plugin header.
|
|
1256
|
+
* Python parity: praisonaiagents/plugins
|
|
1257
|
+
*/
|
|
1258
|
+
function parse_plugin_header(content) {
|
|
1259
|
+
const nameMatch = content.match(/@name\s+(.+)/);
|
|
1260
|
+
const versionMatch = content.match(/@version\s+(.+)/);
|
|
1261
|
+
const descMatch = content.match(/@description\s+(.+)/);
|
|
1262
|
+
return {
|
|
1263
|
+
name: nameMatch?.[1]?.trim(),
|
|
1264
|
+
version: versionMatch?.[1]?.trim(),
|
|
1265
|
+
description: descMatch?.[1]?.trim(),
|
|
1266
|
+
};
|
|
1267
|
+
}
|
|
1268
|
+
/**
|
|
1269
|
+
* Parse plugin header from file.
|
|
1270
|
+
* Python parity: praisonaiagents/plugins
|
|
1271
|
+
*/
|
|
1272
|
+
async function parse_plugin_header_from_file(path) {
|
|
1273
|
+
// In a real implementation, this would read the file
|
|
1274
|
+
return { name: path.split('/').pop()?.replace(/\.[^.]+$/, '') };
|
|
1275
|
+
}
|
|
1276
|
+
/**
|
|
1277
|
+
* Discover plugins.
|
|
1278
|
+
* Python parity: praisonaiagents/plugins
|
|
1279
|
+
*/
|
|
1280
|
+
async function discover_plugins(dirs) {
|
|
1281
|
+
const searchDirs = dirs ?? get_default_plugin_dirs();
|
|
1282
|
+
// In a real implementation, this would scan directories
|
|
1283
|
+
return searchDirs.flatMap(() => []);
|
|
1284
|
+
}
|
|
1285
|
+
/**
|
|
1286
|
+
* Discover and load plugins.
|
|
1287
|
+
* Python parity: praisonaiagents/plugins
|
|
1288
|
+
*/
|
|
1289
|
+
async function discover_and_load_plugins(dirs) {
|
|
1290
|
+
const paths = await discover_plugins(dirs);
|
|
1291
|
+
return Promise.all(paths.map(p => load_plugin(p)));
|
|
1292
|
+
}
|
|
1293
|
+
// ============================================================================
|
|
1294
|
+
// P3: TRACE & CONDITION FUNCTIONS
|
|
1295
|
+
// ============================================================================
|
|
1296
|
+
/**
|
|
1297
|
+
* Evaluate condition.
|
|
1298
|
+
* Python parity: praisonaiagents/conditions/evaluator.py
|
|
1299
|
+
*/
|
|
1300
|
+
function evaluate_condition(condition, context) {
|
|
1301
|
+
if (typeof condition === 'boolean') {
|
|
1302
|
+
return condition;
|
|
1303
|
+
}
|
|
1304
|
+
if (typeof condition === 'function') {
|
|
1305
|
+
return condition(context);
|
|
1306
|
+
}
|
|
1307
|
+
if (typeof condition === 'object' && condition !== null) {
|
|
1308
|
+
if ('expression' in condition) {
|
|
1309
|
+
// Simple expression evaluation
|
|
1310
|
+
try {
|
|
1311
|
+
const fn = new Function(...Object.keys(context), `return ${condition.expression}`);
|
|
1312
|
+
return Boolean(fn(...Object.values(context)));
|
|
1313
|
+
}
|
|
1314
|
+
catch {
|
|
1315
|
+
return false;
|
|
1316
|
+
}
|
|
1317
|
+
}
|
|
1318
|
+
}
|
|
1319
|
+
return Boolean(condition);
|
|
1320
|
+
}
|
|
1321
|
+
/**
|
|
1322
|
+
* Get dimensions for embeddings.
|
|
1323
|
+
* Python parity: praisonaiagents/embedding/dimensions.py
|
|
1324
|
+
*/
|
|
1325
|
+
function get_dimensions(model) {
|
|
1326
|
+
const dimensions = {
|
|
1327
|
+
'text-embedding-ada-002': 1536,
|
|
1328
|
+
'text-embedding-3-small': 1536,
|
|
1329
|
+
'text-embedding-3-large': 3072,
|
|
1330
|
+
'embed-english-v3.0': 1024,
|
|
1331
|
+
'embed-multilingual-v3.0': 1024,
|
|
1332
|
+
};
|
|
1333
|
+
return dimensions[model] ?? 1536;
|
|
1334
|
+
}
|
|
1335
|
+
/**
|
|
1336
|
+
* Track workflow execution.
|
|
1337
|
+
* Python parity: praisonaiagents/flow_display.py
|
|
1338
|
+
*/
|
|
1339
|
+
function track_workflow(name, steps) {
|
|
1340
|
+
return {
|
|
1341
|
+
name,
|
|
1342
|
+
steps,
|
|
1343
|
+
startTime: Date.now(),
|
|
1344
|
+
};
|
|
1345
|
+
}
|
|
1346
|
+
/**
|
|
1347
|
+
* Resolve guardrail policies.
|
|
1348
|
+
* Python parity: praisonaiagents/config/resolvers.py
|
|
1349
|
+
*/
|
|
1350
|
+
function resolve_guardrail_policies(policies) {
|
|
1351
|
+
return policies.map(p => {
|
|
1352
|
+
if (typeof p === 'string') {
|
|
1353
|
+
return { name: p, action: 'warn' };
|
|
1354
|
+
}
|
|
1355
|
+
return p;
|
|
1356
|
+
});
|
|
1357
|
+
}
|
|
1358
|
+
/**
|
|
1359
|
+
* Trace context manager.
|
|
1360
|
+
* Python parity: praisonaiagents/trace
|
|
1361
|
+
*/
|
|
1362
|
+
function trace_context(name) {
|
|
1363
|
+
const sink = new TraceSink();
|
|
1364
|
+
sink.emit({ type: 'context_start', name, timestamp: Date.now() });
|
|
1365
|
+
return sink;
|
|
1366
|
+
}
|