@gotza02/seq-thinking 1.1.2 → 1.1.3
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 +42 -4
- package/data/agents/1770106504306-dljh9ef.json +68 -0
- package/data/agents/1770106504310-4oarrst.json +58 -0
- package/data/agents/1770106540588-pvitt55.json +68 -0
- package/data/agents/1770106540595-z2ya871.json +58 -0
- package/data/agents/1770106710890-0e2naq1.json +68 -0
- package/data/agents/1770106710893-r076yxx.json +58 -0
- package/data/agents/1770109212161-4ybd0i7.json +68 -0
- package/data/agents/1770109212166-gkhya8h.json +58 -0
- package/data/sessions/1770100622009-5afiuyv.json +499 -0
- package/data/sessions/1770106504312-75zk750.json +107 -0
- package/data/sessions/1770106540597-z8e8soo.json +150 -0
- package/data/sessions/1770106710894-0kxgy5x.json +150 -0
- package/data/sessions/1770109212169-zpddeb9.json +150 -0
- package/dist/__tests__/sequential-thinking.test.js +21 -21
- package/dist/__tests__/sequential-thinking.test.js.map +1 -1
- package/dist/agents/base-agent.d.ts +1 -0
- package/dist/agents/base-agent.d.ts.map +1 -1
- package/dist/agents/base-agent.js +5 -3
- package/dist/agents/base-agent.js.map +1 -1
- package/dist/agents/meta-reasoning-agent.d.ts +3 -54
- package/dist/agents/meta-reasoning-agent.d.ts.map +1 -1
- package/dist/agents/meta-reasoning-agent.js +35 -328
- package/dist/agents/meta-reasoning-agent.js.map +1 -1
- package/dist/agents/synthesizer-agent.d.ts +3 -17
- package/dist/agents/synthesizer-agent.d.ts.map +1 -1
- package/dist/agents/synthesizer-agent.js +41 -139
- package/dist/agents/synthesizer-agent.js.map +1 -1
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +9 -6
- package/dist/mcp-server.js.map +1 -1
- package/dist/real_world_test.d.ts +2 -0
- package/dist/real_world_test.d.ts.map +1 -0
- package/dist/real_world_test.js +78 -0
- package/dist/real_world_test.js.map +1 -0
- package/dist/sequential-thinking.d.ts +5 -5
- package/dist/sequential-thinking.d.ts.map +1 -1
- package/dist/sequential-thinking.js +68 -32
- package/dist/sequential-thinking.js.map +1 -1
- package/dist/swarm-coordinator.d.ts +1 -1
- package/dist/swarm-coordinator.d.ts.map +1 -1
- package/dist/swarm-coordinator.js +39 -13
- package/dist/swarm-coordinator.js.map +1 -1
- package/dist/utils/llm-adapter.d.ts +2 -2
- package/dist/utils/llm-adapter.d.ts.map +1 -1
- package/dist/utils/llm-adapter.js +57 -33
- package/dist/utils/llm-adapter.js.map +1 -1
- package/dist/utils/logger.d.ts +20 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +49 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/persistence.d.ts.map +1 -1
- package/dist/utils/persistence.js +4 -3
- package/dist/utils/persistence.js.map +1 -1
- package/package.json +1 -1
- package/real_world_test.log +200 -0
- package/real_world_test_dynamic.log +184 -0
- package/real_world_test_real.log +184 -0
- package/src/__tests__/sequential-thinking.test.ts +21 -21
- package/src/agents/base-agent.ts +6 -3
- package/src/agents/meta-reasoning-agent.ts +38 -397
- package/src/agents/synthesizer-agent.ts +48 -165
- package/src/mcp-server.ts +9 -6
- package/src/real_world_test.ts +89 -0
- package/src/sequential-thinking.ts +87 -33
- package/src/swarm-coordinator.ts +41 -13
- package/src/utils/llm-adapter.ts +66 -32
- package/src/utils/logger.ts +56 -0
- package/src/utils/persistence.ts +4 -3
|
@@ -2,58 +2,82 @@
|
|
|
2
2
|
* LLM Adapter to call external CLI tools via child_process
|
|
3
3
|
* @module utils/llm-adapter
|
|
4
4
|
*/
|
|
5
|
-
import {
|
|
5
|
+
import { exec } from 'child_process';
|
|
6
|
+
import { promisify } from 'util';
|
|
7
|
+
import { Logger } from './logger.js';
|
|
8
|
+
const execAsync = promisify(exec);
|
|
6
9
|
export class LLMAdapter {
|
|
7
10
|
/**
|
|
8
|
-
* Main entry point to call an LLM based on provider
|
|
11
|
+
* Main entry point to call an LLM based on provider pool
|
|
9
12
|
*/
|
|
10
|
-
static async call(prompt, systemPrompt) {
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
13
|
+
static async call(prompt, systemPrompt, providerOverride) {
|
|
14
|
+
const providerEnv = process.env.provider || 'gemini';
|
|
15
|
+
const providers = providerOverride ? [providerOverride] : providerEnv.split(',').map(p => p.trim());
|
|
16
|
+
let lastError = '';
|
|
17
|
+
for (const provider of providers) {
|
|
18
|
+
const combinedPrompt = systemPrompt ? `${systemPrompt}\n\nUser: ${prompt}` : prompt;
|
|
19
|
+
// For testing/development: If MOCK_LLM is set, return mock data
|
|
20
|
+
if (process.env.MOCK_LLM === 'true') {
|
|
21
|
+
Logger.debug('LLM Mock Call', { provider, promptLength: prompt.length });
|
|
22
|
+
return { content: `[MOCK RESPONSE from ${provider}] I have analyzed your request: ${prompt.substring(0, 50)}...` };
|
|
23
|
+
}
|
|
24
|
+
Logger.info('LLM Call initiated', { provider });
|
|
25
|
+
try {
|
|
26
|
+
let response;
|
|
27
|
+
switch (provider.toLowerCase()) {
|
|
28
|
+
case 'gemini':
|
|
29
|
+
response = await this.safeExec(`gemini ask ${this.escapeShell(combinedPrompt)}`);
|
|
30
|
+
break;
|
|
31
|
+
case 'claude':
|
|
32
|
+
response = await this.safeExec(`claude ${this.escapeShell(combinedPrompt)} --non-interactive`);
|
|
33
|
+
break;
|
|
34
|
+
case 'kimi':
|
|
35
|
+
response = await this.safeExec(`kimi chat ${this.escapeShell(combinedPrompt)}`);
|
|
36
|
+
break;
|
|
37
|
+
case 'opencode':
|
|
38
|
+
response = await this.safeExec(`opencode ask ${this.escapeShell(combinedPrompt)}`);
|
|
39
|
+
break;
|
|
40
|
+
default:
|
|
41
|
+
response = { content: '', error: `Unsupported provider: ${provider}` };
|
|
42
|
+
}
|
|
43
|
+
if (response.content && !response.error) {
|
|
44
|
+
return response; // Success!
|
|
45
|
+
}
|
|
46
|
+
lastError = response.error || 'Unknown error';
|
|
47
|
+
Logger.warn(`Provider ${provider} failed, trying next...`, { error: lastError });
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
lastError = error.message;
|
|
51
|
+
Logger.error(`LLM Adapter Error with ${provider}`, { error: lastError });
|
|
29
52
|
}
|
|
30
53
|
}
|
|
31
|
-
|
|
32
|
-
console.error(`LLM Call Error (${provider}):`, error.message);
|
|
33
|
-
return { content: '', error: error.message };
|
|
34
|
-
}
|
|
54
|
+
return { content: '', error: `All providers failed. Last error: ${lastError}` };
|
|
35
55
|
}
|
|
36
56
|
/**
|
|
37
57
|
* Safely execute CLI command with timeout and existence check
|
|
38
58
|
*/
|
|
39
|
-
static safeExec(cmd) {
|
|
59
|
+
static async safeExec(cmd) {
|
|
40
60
|
try {
|
|
41
61
|
// Check if command base exists (first word)
|
|
42
62
|
const baseCmd = cmd.split(' ')[0];
|
|
43
63
|
try {
|
|
44
|
-
|
|
64
|
+
await execAsync(`command -v ${baseCmd}`);
|
|
45
65
|
}
|
|
46
66
|
catch {
|
|
47
|
-
|
|
67
|
+
const error = `CLI tool '${baseCmd}' not found or not in PATH. Please install and login.`;
|
|
68
|
+
Logger.warn('CLI tool missing', { baseCmd });
|
|
69
|
+
return { content: '', error };
|
|
48
70
|
}
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
52
|
-
timeout: 30000 // 30 second timeout
|
|
71
|
+
const { stdout, stderr } = await execAsync(cmd, {
|
|
72
|
+
timeout: 60000 // 60 second timeout
|
|
53
73
|
});
|
|
54
|
-
|
|
74
|
+
if (stderr && stderr.trim()) {
|
|
75
|
+
Logger.debug('CLI Stderr output', { baseCmd, stderr: stderr.substring(0, 100) });
|
|
76
|
+
}
|
|
77
|
+
return { content: stdout.trim() };
|
|
55
78
|
}
|
|
56
79
|
catch (error) {
|
|
80
|
+
Logger.error('Execution failed', { command: cmd.substring(0, 50), error: error.message });
|
|
57
81
|
return { content: '', error: error.message };
|
|
58
82
|
}
|
|
59
83
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llm-adapter.js","sourceRoot":"","sources":["../../src/utils/llm-adapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"llm-adapter.js","sourceRoot":"","sources":["../../src/utils/llm-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple Structured Logging Utility
|
|
3
|
+
* @module utils/logger
|
|
4
|
+
*/
|
|
5
|
+
export declare enum LogLevel {
|
|
6
|
+
DEBUG = 0,
|
|
7
|
+
INFO = 1,
|
|
8
|
+
WARN = 2,
|
|
9
|
+
ERROR = 3
|
|
10
|
+
}
|
|
11
|
+
export declare class Logger {
|
|
12
|
+
private static level;
|
|
13
|
+
static setLevel(level: LogLevel): void;
|
|
14
|
+
static debug(message: string, context?: any): void;
|
|
15
|
+
static info(message: string, context?: any): void;
|
|
16
|
+
static warn(message: string, context?: any): void;
|
|
17
|
+
static error(message: string, context?: any): void;
|
|
18
|
+
private static log;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,oBAAY,QAAQ;IAClB,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;CACV;AAED,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAA2B;IAE/C,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ;IAI/B,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,GAAQ;IAM/C,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,GAAQ;IAM9C,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,GAAQ;IAM9C,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,GAAQ;IAM/C,OAAO,CAAC,MAAM,CAAC,GAAG;CAYnB"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple Structured Logging Utility
|
|
3
|
+
* @module utils/logger
|
|
4
|
+
*/
|
|
5
|
+
export var LogLevel;
|
|
6
|
+
(function (LogLevel) {
|
|
7
|
+
LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
|
|
8
|
+
LogLevel[LogLevel["INFO"] = 1] = "INFO";
|
|
9
|
+
LogLevel[LogLevel["WARN"] = 2] = "WARN";
|
|
10
|
+
LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
|
|
11
|
+
})(LogLevel || (LogLevel = {}));
|
|
12
|
+
export class Logger {
|
|
13
|
+
static level = LogLevel.INFO;
|
|
14
|
+
static setLevel(level) {
|
|
15
|
+
this.level = level;
|
|
16
|
+
}
|
|
17
|
+
static debug(message, context = {}) {
|
|
18
|
+
if (this.level <= LogLevel.DEBUG) {
|
|
19
|
+
this.log('DEBUG', message, context);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
static info(message, context = {}) {
|
|
23
|
+
if (this.level <= LogLevel.INFO) {
|
|
24
|
+
this.log('INFO', message, context);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
static warn(message, context = {}) {
|
|
28
|
+
if (this.level <= LogLevel.WARN) {
|
|
29
|
+
this.log('WARN', message, context);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
static error(message, context = {}) {
|
|
33
|
+
if (this.level <= LogLevel.ERROR) {
|
|
34
|
+
this.log('ERROR', message, context);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
static log(level, message, context) {
|
|
38
|
+
const timestamp = new Date().toISOString();
|
|
39
|
+
const logEntry = {
|
|
40
|
+
timestamp,
|
|
41
|
+
level,
|
|
42
|
+
message,
|
|
43
|
+
...context
|
|
44
|
+
};
|
|
45
|
+
// Write to stderr to avoid interfering with MCP stdio protocol
|
|
46
|
+
process.stderr.write(JSON.stringify(logEntry) + '\n');
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAN,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,yCAAS,CAAA;IACT,uCAAQ,CAAA;IACR,uCAAQ,CAAA;IACR,yCAAS,CAAA;AACX,CAAC,EALW,QAAQ,KAAR,QAAQ,QAKnB;AAED,MAAM,OAAO,MAAM;IACT,MAAM,CAAC,KAAK,GAAa,QAAQ,CAAC,IAAI,CAAC;IAE/C,MAAM,CAAC,QAAQ,CAAC,KAAe;QAC7B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,OAAe,EAAE,UAAe,EAAE;QAC7C,IAAI,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACjC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,OAAe,EAAE,UAAe,EAAE;QAC5C,IAAI,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAChC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,OAAe,EAAE,UAAe,EAAE;QAC5C,IAAI,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAChC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,OAAe,EAAE,UAAe,EAAE;QAC7C,IAAI,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACjC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAEO,MAAM,CAAC,GAAG,CAAC,KAAa,EAAE,OAAe,EAAE,OAAY;QAC7D,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG;YACf,SAAS;YACT,KAAK;YACL,OAAO;YACP,GAAG,OAAO;SACX,CAAC;QAEF,+DAA+D;QAC/D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;IACxD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../src/utils/persistence.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../src/utils/persistence.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,GAAE,MAAiB;IAItC;;OAEG;IACG,UAAU,CAAC,OAAO,GAAE,MAAM,EAAoC;IAYpE;;OAEG;IACG,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG;IAYpD;;OAEG;IACG,IAAI,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAYhE;;OAEG;IACG,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAajD;;OAEG;IACG,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;IAS3C;;OAEG;IACH,OAAO,CAAC,SAAS;CAgBlB"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import * as fs from 'fs/promises';
|
|
6
6
|
import * as path from 'path';
|
|
7
|
+
import { Logger } from './logger.js';
|
|
7
8
|
export class PersistenceManager {
|
|
8
9
|
baseDir;
|
|
9
10
|
constructor(baseDir = './data') {
|
|
@@ -20,7 +21,7 @@ export class PersistenceManager {
|
|
|
20
21
|
}
|
|
21
22
|
}
|
|
22
23
|
catch (error) {
|
|
23
|
-
|
|
24
|
+
Logger.error('Failed to initialize persistence directory', { error });
|
|
24
25
|
throw error;
|
|
25
26
|
}
|
|
26
27
|
}
|
|
@@ -35,7 +36,7 @@ export class PersistenceManager {
|
|
|
35
36
|
await fs.writeFile(filePath, JSON.stringify(serializedData, null, 2), 'utf8');
|
|
36
37
|
}
|
|
37
38
|
catch (error) {
|
|
38
|
-
|
|
39
|
+
Logger.error(`Failed to save ${collection}/${id}`, { error });
|
|
39
40
|
throw error;
|
|
40
41
|
}
|
|
41
42
|
}
|
|
@@ -51,7 +52,7 @@ export class PersistenceManager {
|
|
|
51
52
|
catch (error) {
|
|
52
53
|
if (error.code === 'ENOENT')
|
|
53
54
|
return null;
|
|
54
|
-
|
|
55
|
+
Logger.error(`Failed to load ${collection}/${id}`, { error });
|
|
55
56
|
throw error;
|
|
56
57
|
}
|
|
57
58
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../src/utils/persistence.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../src/utils/persistence.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,OAAO,kBAAkB;IACrB,OAAO,CAAS;IAExB,YAAY,UAAkB,QAAQ;QACpC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,UAAoB,CAAC,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC;QAClE,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAClD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;gBAC1B,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,4CAA4C,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YACtE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,UAAkB,EAAE,EAAU,EAAE,IAAS;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QACnE,IAAI,CAAC;YACH,0EAA0E;YAC1E,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAChF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,kBAAkB,UAAU,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YAC9D,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAI,UAAkB,EAAE,EAAU;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QACnE,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACpD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM,CAAC;QAClC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAC;YACzC,MAAM,CAAC,KAAK,CAAC,kBAAkB,UAAU,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YAC9D,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,UAAkB;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACxC,OAAO,KAAK;iBACT,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;iBAChC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,EAAE,CAAC;YACvC,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,UAAkB,EAAE,EAAU;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QACnE,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,KAAK,CAAC;QAC3C,CAAC;IACH,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,GAAQ;QACxB,IAAI,GAAG,YAAY,GAAG,EAAE,CAAC;YACvB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QAC3D,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,YAAY,IAAI,CAAC,EAAE,CAAC;YACtE,MAAM,MAAM,GAAQ,EAAE,CAAC;YACvB,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;gBACtB,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YACzC,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
--- Starting Real World Scenario Test ---
|
|
2
|
+
[System] Server Initialized
|
|
3
|
+
|
|
4
|
+
[Step 1] Registering Agents...
|
|
5
|
+
Registered Reasoner: {
|
|
6
|
+
"success": true,
|
|
7
|
+
"agentId": "1770106540588-pvitt55",
|
|
8
|
+
"name": "LogicMaster",
|
|
9
|
+
"type": "reasoner",
|
|
10
|
+
"capabilities": [
|
|
11
|
+
"chain_of_thought",
|
|
12
|
+
"tree_of_thought",
|
|
13
|
+
"analogical_reasoning",
|
|
14
|
+
"abductive_reasoning",
|
|
15
|
+
"problem_solving"
|
|
16
|
+
]
|
|
17
|
+
}
|
|
18
|
+
Registered Critic: {
|
|
19
|
+
"success": true,
|
|
20
|
+
"agentId": "1770106540595-z2ya871",
|
|
21
|
+
"name": "SafetyCheck",
|
|
22
|
+
"type": "critic",
|
|
23
|
+
"capabilities": [
|
|
24
|
+
"evaluation",
|
|
25
|
+
"validation",
|
|
26
|
+
"feedback",
|
|
27
|
+
"logical_analysis"
|
|
28
|
+
]
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
[Step 2] Initializing Thinking Session...
|
|
32
|
+
Session Created: {
|
|
33
|
+
"success": true,
|
|
34
|
+
"sessionId": "1770106540597-z8e8soo",
|
|
35
|
+
"topic": "Architecting a scalable microservices system",
|
|
36
|
+
"status": "initializing",
|
|
37
|
+
"settings": {
|
|
38
|
+
"maxBranches": 5,
|
|
39
|
+
"maxDepth": 20,
|
|
40
|
+
"confidenceThreshold": 0.6,
|
|
41
|
+
"enableSelfCorrection": true,
|
|
42
|
+
"enableMetaReasoning": true,
|
|
43
|
+
"enableParallelHypotheses": true,
|
|
44
|
+
"adaptiveGranularity": true,
|
|
45
|
+
"granularitySettings": {
|
|
46
|
+
"minStepDetail": 0.1,
|
|
47
|
+
"maxStepDetail": 1,
|
|
48
|
+
"complexityThreshold": 0.7
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
[Step 3] Adding Initial Thought...
|
|
54
|
+
Thought Added: {
|
|
55
|
+
"success": true,
|
|
56
|
+
"thought": {
|
|
57
|
+
"id": "1770106540598-485j13o",
|
|
58
|
+
"stepNumber": 1,
|
|
59
|
+
"thoughtType": "analysis",
|
|
60
|
+
"confidence": {
|
|
61
|
+
"overall": 0.8,
|
|
62
|
+
"components": {
|
|
63
|
+
"logicalConsistency": 0.5,
|
|
64
|
+
"factualAccuracy": 0.5,
|
|
65
|
+
"reasoningQuality": 0.5,
|
|
66
|
+
"evidenceStrength": 0.5
|
|
67
|
+
},
|
|
68
|
+
"uncertaintyBounds": [
|
|
69
|
+
0.3,
|
|
70
|
+
0.7
|
|
71
|
+
],
|
|
72
|
+
"calibrationHistory": []
|
|
73
|
+
},
|
|
74
|
+
"branchId": "main"
|
|
75
|
+
},
|
|
76
|
+
"issuesDetected": [
|
|
77
|
+
{
|
|
78
|
+
"type": "assumption",
|
|
79
|
+
"severity": "low",
|
|
80
|
+
"description": "No explicit assumptions",
|
|
81
|
+
"suggestion": "Document assumptions"
|
|
82
|
+
}
|
|
83
|
+
]
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
[Step 4] Delegating to Swarm (Reasoner)...
|
|
87
|
+
Swarm Delegation Result: {
|
|
88
|
+
"success": true,
|
|
89
|
+
"swarmResult": {
|
|
90
|
+
"taskId": "1770106540600-1dmtjbj",
|
|
91
|
+
"agentId": "1770106540588-pvitt55",
|
|
92
|
+
"success": true,
|
|
93
|
+
"output": {
|
|
94
|
+
"conclusion": "[MOCK RESPONSE from gemini] I have analyzed your request: Based on these reasoning steps, provide a final co...",
|
|
95
|
+
"reasoningChain": [
|
|
96
|
+
{
|
|
97
|
+
"step": 1,
|
|
98
|
+
"content": "[MOCK RESPONSE from gemini] I have analyzed your request: Based on the current context, generate the next re...",
|
|
99
|
+
"confidence": 0.63,
|
|
100
|
+
"isFinal": false
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"step": 2,
|
|
104
|
+
"content": "[MOCK RESPONSE from gemini] I have analyzed your request: Based on the current context, generate the next re...",
|
|
105
|
+
"confidence": 0.66,
|
|
106
|
+
"isFinal": false
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"step": 3,
|
|
110
|
+
"content": "[MOCK RESPONSE from gemini] I have analyzed your request: Based on the current context, generate the next re...",
|
|
111
|
+
"confidence": 0.69,
|
|
112
|
+
"isFinal": false
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
"step": 4,
|
|
116
|
+
"content": "[MOCK RESPONSE from gemini] I have analyzed your request: Based on the current context, generate the next re...",
|
|
117
|
+
"confidence": 0.72,
|
|
118
|
+
"isFinal": true
|
|
119
|
+
}
|
|
120
|
+
],
|
|
121
|
+
"iterations": 4,
|
|
122
|
+
"strategy": "chain_of_thought",
|
|
123
|
+
"problem": "[object Object]"
|
|
124
|
+
},
|
|
125
|
+
"confidence": 0.675,
|
|
126
|
+
"processingTimeMs": 0,
|
|
127
|
+
"metadata": {
|
|
128
|
+
"tokensUsed": 0,
|
|
129
|
+
"reasoningSteps": 4,
|
|
130
|
+
"intermediateResults": [
|
|
131
|
+
"[MOCK RESPONSE from gemini] I have analyzed your request: Based on the current context, generate the next re...",
|
|
132
|
+
"[MOCK RESPONSE from gemini] I have analyzed your request: Based on the current context, generate the next re...",
|
|
133
|
+
"[MOCK RESPONSE from gemini] I have analyzed your request: Based on the current context, generate the next re...",
|
|
134
|
+
"[MOCK RESPONSE from gemini] I have analyzed your request: Based on the current context, generate the next re..."
|
|
135
|
+
]
|
|
136
|
+
}
|
|
137
|
+
},
|
|
138
|
+
"newThought": {
|
|
139
|
+
"id": "1770106540602-tb7es3b",
|
|
140
|
+
"sessionId": "1770106540597-z8e8soo",
|
|
141
|
+
"content": "{\n \"conclusion\": \"[MOCK RESPONSE from gemini] I have analyzed your request: Based on these reasoning steps, provide a final co...\",\n \"reasoningChain\": [\n {\n \"step\": 1,\n \"content\": \"[MOCK RESPONSE from gemini] I have analyzed your request: Based on the current context, generate the next re...\",\n \"confidence\": 0.63,\n \"isFinal\": false\n },\n {\n \"step\": 2,\n \"content\": \"[MOCK RESPONSE from gemini] I have analyzed your request: Based on the current context, generate the next re...\",\n \"confidence\": 0.66,\n \"isFinal\": false\n },\n {\n \"step\": 3,\n \"content\": \"[MOCK RESPONSE from gemini] I have analyzed your request: Based on the current context, generate the next re...\",\n \"confidence\": 0.69,\n \"isFinal\": false\n },\n {\n \"step\": 4,\n \"content\": \"[MOCK RESPONSE from gemini] I have analyzed your request: Based on the current context, generate the next re...\",\n \"confidence\": 0.72,\n \"isFinal\": true\n }\n ],\n \"iterations\": 4,\n \"strategy\": \"chain_of_thought\",\n \"problem\": \"[object Object]\"\n}",
|
|
142
|
+
"stepNumber": 2,
|
|
143
|
+
"thoughtType": "synthesis",
|
|
144
|
+
"confidence": {
|
|
145
|
+
"overall": 0.675,
|
|
146
|
+
"components": {
|
|
147
|
+
"logicalConsistency": 0.5,
|
|
148
|
+
"factualAccuracy": 0.5,
|
|
149
|
+
"reasoningQuality": 0.5,
|
|
150
|
+
"evidenceStrength": 0.5
|
|
151
|
+
},
|
|
152
|
+
"uncertaintyBounds": [
|
|
153
|
+
0.3,
|
|
154
|
+
0.7
|
|
155
|
+
],
|
|
156
|
+
"calibrationHistory": []
|
|
157
|
+
},
|
|
158
|
+
"parentThoughtId": "1770106540598-485j13o",
|
|
159
|
+
"childThoughtIds": [],
|
|
160
|
+
"branchId": "main",
|
|
161
|
+
"revisionOf": null,
|
|
162
|
+
"revisionHistory": [],
|
|
163
|
+
"metadata": {
|
|
164
|
+
"createdAt": "2026-02-03T08:15:40.602Z",
|
|
165
|
+
"modifiedAt": "2026-02-03T08:15:40.602Z",
|
|
166
|
+
"processingTimeMs": 0,
|
|
167
|
+
"tokensUsed": 0
|
|
168
|
+
},
|
|
169
|
+
"tags": [
|
|
170
|
+
"swarm-result",
|
|
171
|
+
"LogicMaster"
|
|
172
|
+
],
|
|
173
|
+
"assumptions": [],
|
|
174
|
+
"dependencies": []
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
[Step 5] Triggering Self-Correction...
|
|
179
|
+
Self Correction Result: {
|
|
180
|
+
"success": true,
|
|
181
|
+
"issuesDetected": [
|
|
182
|
+
{
|
|
183
|
+
"type": "assumption",
|
|
184
|
+
"severity": "low",
|
|
185
|
+
"description": "No explicit assumptions",
|
|
186
|
+
"suggestion": "Document assumptions"
|
|
187
|
+
}
|
|
188
|
+
],
|
|
189
|
+
"recommendations": [
|
|
190
|
+
"Document assumptions"
|
|
191
|
+
]
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
[Step 6] Completing Session...
|
|
195
|
+
Completion Result: {
|
|
196
|
+
"success": true,
|
|
197
|
+
"message": "Session 1770106540597-z8e8soo completed"
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
--- Test Finished Successfully ---
|