jiva-core 0.2.2 → 0.3.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/.dockerignore +53 -0
- package/.gcloudignore +49 -0
- package/CONTRIBUTING.md +92 -0
- package/Dockerfile +63 -0
- package/LICENSE +21 -0
- package/README.md +248 -102
- package/cloud-run-deploy.yaml +135 -0
- package/cloud-run.yaml +135 -0
- package/cloud-run.yaml.template +143 -0
- package/deploy.sh +107 -0
- package/dist/core/agent-spawner.d.ts +89 -0
- package/dist/core/agent-spawner.d.ts.map +1 -0
- package/dist/core/agent-spawner.js +195 -0
- package/dist/core/agent-spawner.js.map +1 -0
- package/dist/core/client-agent.d.ts +82 -0
- package/dist/core/client-agent.d.ts.map +1 -0
- package/dist/core/client-agent.js +406 -0
- package/dist/core/client-agent.js.map +1 -0
- package/dist/core/config.d.ts +59 -10
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +19 -2
- package/dist/core/config.js.map +1 -1
- package/dist/core/conversation-manager.d.ts +10 -18
- package/dist/core/conversation-manager.d.ts.map +1 -1
- package/dist/core/conversation-manager.js +28 -60
- package/dist/core/conversation-manager.js.map +1 -1
- package/dist/core/dual-agent.d.ts +24 -3
- package/dist/core/dual-agent.d.ts.map +1 -1
- package/dist/core/dual-agent.js +112 -19
- package/dist/core/dual-agent.js.map +1 -1
- package/dist/core/manager-agent.d.ts +3 -1
- package/dist/core/manager-agent.d.ts.map +1 -1
- package/dist/core/manager-agent.js +66 -14
- package/dist/core/manager-agent.js.map +1 -1
- package/dist/core/worker-agent.d.ts +15 -1
- package/dist/core/worker-agent.d.ts.map +1 -1
- package/dist/core/worker-agent.js +244 -11
- package/dist/core/worker-agent.js.map +1 -1
- package/dist/core/workspace.d.ts +5 -0
- package/dist/core/workspace.d.ts.map +1 -1
- package/dist/core/workspace.js +47 -7
- package/dist/core/workspace.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/interfaces/cli/index.js +376 -44
- package/dist/interfaces/cli/index.js.map +1 -1
- package/dist/interfaces/cli/repl.d.ts.map +1 -1
- package/dist/interfaces/cli/repl.js +6 -0
- package/dist/interfaces/cli/repl.js.map +1 -1
- package/dist/interfaces/http/index.d.ts +22 -0
- package/dist/interfaces/http/index.d.ts.map +1 -0
- package/dist/interfaces/http/index.js +135 -0
- package/dist/interfaces/http/index.js.map +1 -0
- package/dist/interfaces/http/middleware/auth.d.ts +32 -0
- package/dist/interfaces/http/middleware/auth.d.ts.map +1 -0
- package/dist/interfaces/http/middleware/auth.js +176 -0
- package/dist/interfaces/http/middleware/auth.js.map +1 -0
- package/dist/interfaces/http/routes/chat.d.ts +7 -0
- package/dist/interfaces/http/routes/chat.d.ts.map +1 -0
- package/dist/interfaces/http/routes/chat.js +144 -0
- package/dist/interfaces/http/routes/chat.js.map +1 -0
- package/dist/interfaces/http/routes/health.d.ts +6 -0
- package/dist/interfaces/http/routes/health.d.ts.map +1 -0
- package/dist/interfaces/http/routes/health.js +25 -0
- package/dist/interfaces/http/routes/health.js.map +1 -0
- package/dist/interfaces/http/routes/session.d.ts +7 -0
- package/dist/interfaces/http/routes/session.d.ts.map +1 -0
- package/dist/interfaces/http/routes/session.js +114 -0
- package/dist/interfaces/http/routes/session.js.map +1 -0
- package/dist/interfaces/http/session-manager.d.ts +76 -0
- package/dist/interfaces/http/session-manager.d.ts.map +1 -0
- package/dist/interfaces/http/session-manager.js +339 -0
- package/dist/interfaces/http/session-manager.js.map +1 -0
- package/dist/interfaces/http/websocket-handler.d.ts +18 -0
- package/dist/interfaces/http/websocket-handler.d.ts.map +1 -0
- package/dist/interfaces/http/websocket-handler.js +146 -0
- package/dist/interfaces/http/websocket-handler.js.map +1 -0
- package/dist/mcp/client.d.ts +11 -2
- package/dist/mcp/client.d.ts.map +1 -1
- package/dist/mcp/client.js +44 -19
- package/dist/mcp/client.js.map +1 -1
- package/dist/mcp/server-manager.d.ts +1 -1
- package/dist/mcp/server-manager.d.ts.map +1 -1
- package/dist/mcp/server-manager.js +12 -2
- package/dist/mcp/server-manager.js.map +1 -1
- package/dist/personas/index.d.ts +13 -0
- package/dist/personas/index.d.ts.map +1 -0
- package/dist/personas/index.js +13 -0
- package/dist/personas/index.js.map +1 -0
- package/dist/personas/persona-loader.d.ts +30 -0
- package/dist/personas/persona-loader.d.ts.map +1 -0
- package/dist/personas/persona-loader.js +246 -0
- package/dist/personas/persona-loader.js.map +1 -0
- package/dist/personas/persona-manager.d.ts +82 -0
- package/dist/personas/persona-manager.d.ts.map +1 -0
- package/dist/personas/persona-manager.js +211 -0
- package/dist/personas/persona-manager.js.map +1 -0
- package/dist/personas/skill-loader.d.ts +35 -0
- package/dist/personas/skill-loader.d.ts.map +1 -0
- package/dist/personas/skill-loader.js +144 -0
- package/dist/personas/skill-loader.js.map +1 -0
- package/dist/personas/skill-packager.d.ts +25 -0
- package/dist/personas/skill-packager.d.ts.map +1 -0
- package/dist/personas/skill-packager.js +233 -0
- package/dist/personas/skill-packager.js.map +1 -0
- package/dist/personas/types.d.ts +134 -0
- package/dist/personas/types.d.ts.map +1 -0
- package/dist/personas/types.js +7 -0
- package/dist/personas/types.js.map +1 -0
- package/dist/personas/validator.d.ts +22 -0
- package/dist/personas/validator.d.ts.map +1 -0
- package/dist/personas/validator.js +144 -0
- package/dist/personas/validator.js.map +1 -0
- package/dist/storage/factory.d.ts +51 -0
- package/dist/storage/factory.d.ts.map +1 -0
- package/dist/storage/factory.js +154 -0
- package/dist/storage/factory.js.map +1 -0
- package/dist/storage/gcp-bucket-provider.d.ts +59 -0
- package/dist/storage/gcp-bucket-provider.d.ts.map +1 -0
- package/dist/storage/gcp-bucket-provider.js +275 -0
- package/dist/storage/gcp-bucket-provider.js.map +1 -0
- package/dist/storage/index.d.ts +33 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +37 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/local-provider.d.ts +36 -0
- package/dist/storage/local-provider.d.ts.map +1 -0
- package/dist/storage/local-provider.js +219 -0
- package/dist/storage/local-provider.js.map +1 -0
- package/dist/storage/provider.d.ts +137 -0
- package/dist/storage/provider.d.ts.map +1 -0
- package/dist/storage/provider.js +136 -0
- package/dist/storage/provider.js.map +1 -0
- package/dist/storage/types.d.ts +78 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +14 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/utils/orchestration-logger.d.ts +36 -0
- package/dist/utils/orchestration-logger.d.ts.map +1 -0
- package/dist/utils/orchestration-logger.js +224 -0
- package/dist/utils/orchestration-logger.js.map +1 -0
- package/jiva-new-demo.gif +0 -0
- package/package.json +30 -2
- package/.fluen/cache/state.json +0 -7
- package/actions/action_registry.py +0 -75
- package/actions/python_coder.py +0 -470
- package/api/main.py +0 -269
- package/downloaded_image.avif +0 -0
- package/downloads/snipping_tool.avif +0 -0
- package/image.avif +0 -0
- package/ms_image.avif +0 -0
- package/screenshot.png +0 -0
- package/snipping_tool.avif +0 -0
- package/tmp_image.avif +0 -0
package/dist/core/config.js
CHANGED
|
@@ -2,12 +2,17 @@ import Conf from 'conf';
|
|
|
2
2
|
import { z } from 'zod';
|
|
3
3
|
import { ConfigurationError } from '../utils/errors.js';
|
|
4
4
|
// Zod schemas for validation
|
|
5
|
+
// Support both stdio-based and HTTP/SSE-based MCP servers
|
|
5
6
|
const MCPServerConfigSchema = z.object({
|
|
6
|
-
|
|
7
|
+
// Stdio transport (command-based)
|
|
8
|
+
command: z.string().optional(),
|
|
7
9
|
args: z.array(z.string()).optional(),
|
|
8
10
|
env: z.record(z.string()).optional(),
|
|
11
|
+
// HTTP/SSE transport (URL-based)
|
|
12
|
+
url: z.string().url().optional(),
|
|
13
|
+
headers: z.record(z.string()).optional(),
|
|
9
14
|
enabled: z.boolean().default(true),
|
|
10
|
-
});
|
|
15
|
+
}).refine((data) => (data.command !== undefined) || (data.url !== undefined), { message: "Must specify either 'command' (for stdio) or 'url' (for HTTP/SSE)" });
|
|
11
16
|
const ModelConfigSchema = z.object({
|
|
12
17
|
name: z.string(),
|
|
13
18
|
endpoint: z.string().url(),
|
|
@@ -25,6 +30,7 @@ const JivaConfigSchema = z.object({
|
|
|
25
30
|
workspace: z.object({
|
|
26
31
|
defaultDirectivePath: z.string().optional(),
|
|
27
32
|
}).optional(),
|
|
33
|
+
activePersona: z.string().optional(),
|
|
28
34
|
debug: z.boolean().default(false),
|
|
29
35
|
});
|
|
30
36
|
export class ConfigManager {
|
|
@@ -87,6 +93,17 @@ export class ConfigManager {
|
|
|
87
93
|
getDefaultDirectivePath() {
|
|
88
94
|
return this.store.get('workspace.defaultDirectivePath');
|
|
89
95
|
}
|
|
96
|
+
setActivePersona(name) {
|
|
97
|
+
if (name === null) {
|
|
98
|
+
this.store.delete('activePersona');
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
this.store.set('activePersona', name);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
getActivePersona() {
|
|
105
|
+
return this.store.get('activePersona');
|
|
106
|
+
}
|
|
90
107
|
reset() {
|
|
91
108
|
this.store.clear();
|
|
92
109
|
}
|
package/dist/core/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,6BAA6B;AAC7B,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,9 +2,12 @@
|
|
|
2
2
|
* Conversation Manager
|
|
3
3
|
*
|
|
4
4
|
* Handles conversation persistence, condensing, and restoration.
|
|
5
|
+
* Now uses StorageProvider abstraction for cloud-native support.
|
|
5
6
|
*/
|
|
6
7
|
import { Message } from '../models/base.js';
|
|
7
8
|
import { ModelOrchestrator } from '../models/orchestrator.js';
|
|
9
|
+
import { StorageProvider } from '../storage/provider.js';
|
|
10
|
+
import { SavedConversation } from '../storage/types.js';
|
|
8
11
|
export interface ConversationMetadata {
|
|
9
12
|
id: string;
|
|
10
13
|
title?: string;
|
|
@@ -14,40 +17,29 @@ export interface ConversationMetadata {
|
|
|
14
17
|
workspace?: string;
|
|
15
18
|
summary?: string;
|
|
16
19
|
}
|
|
17
|
-
export interface SavedConversation {
|
|
18
|
-
metadata: ConversationMetadata;
|
|
19
|
-
messages: Message[];
|
|
20
|
-
}
|
|
21
20
|
export declare class ConversationManager {
|
|
22
|
-
private
|
|
21
|
+
private storageProvider;
|
|
23
22
|
private currentConversationId;
|
|
24
|
-
constructor();
|
|
25
|
-
|
|
26
|
-
* Initialize conversations directory
|
|
27
|
-
*/
|
|
28
|
-
initialize(): Promise<void>;
|
|
23
|
+
constructor(storageProvider: StorageProvider, orchestrator?: ModelOrchestrator);
|
|
24
|
+
private orchestrator?;
|
|
29
25
|
/**
|
|
30
26
|
* Generate a unique conversation ID
|
|
31
27
|
*/
|
|
32
28
|
private generateConversationId;
|
|
33
29
|
/**
|
|
34
|
-
*
|
|
35
|
-
*/
|
|
36
|
-
private getConversationPath;
|
|
37
|
-
/**
|
|
38
|
-
* Save conversation to disk
|
|
30
|
+
* Save conversation using StorageProvider
|
|
39
31
|
*/
|
|
40
32
|
saveConversation(messages: Message[], workspace?: string, conversationId?: string, orchestrator?: ModelOrchestrator): Promise<string>;
|
|
41
33
|
/**
|
|
42
|
-
* Load conversation
|
|
34
|
+
* Load conversation using StorageProvider
|
|
43
35
|
*/
|
|
44
36
|
loadConversation(id: string): Promise<SavedConversation>;
|
|
45
37
|
/**
|
|
46
|
-
* List all saved conversations
|
|
38
|
+
* List all saved conversations using StorageProvider
|
|
47
39
|
*/
|
|
48
40
|
listConversations(): Promise<ConversationMetadata[]>;
|
|
49
41
|
/**
|
|
50
|
-
* Delete a conversation
|
|
42
|
+
* Delete a conversation using StorageProvider
|
|
51
43
|
*/
|
|
52
44
|
deleteConversation(id: string): Promise<void>;
|
|
53
45
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-manager.d.ts","sourceRoot":"","sources":["../../src/core/conversation-manager.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"conversation-manager.d.ts","sourceRoot":"","sources":["../../src/core/conversation-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,qBAAqB,CAAuB;gBAExC,eAAe,EAAE,eAAe,EAAE,YAAY,CAAC,EAAE,iBAAiB;IAK9E,OAAO,CAAC,YAAY,CAAC,CAAoB;IAEzC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAM9B;;OAEG;IACG,gBAAgB,CACpB,QAAQ,EAAE,OAAO,EAAE,EACnB,SAAS,CAAC,EAAE,MAAM,EAClB,cAAc,CAAC,EAAE,MAAM,EACvB,YAAY,CAAC,EAAE,iBAAiB,GAC/B,OAAO,CAAC,MAAM,CAAC;IAyDlB;;OAEG;IACG,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAkB9D;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAgB1D;;OAEG;IACG,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcnD;;;;;;;;;OASG;IACG,oBAAoB,CACxB,QAAQ,EAAE,OAAO,EAAE,EACnB,YAAY,EAAE,iBAAiB,EAC/B,kBAAkB,GAAE,MAAW,GAC9B,OAAO,CAAC,OAAO,EAAE,CAAC;IAgFrB;;OAEG;IACG,aAAa,CACjB,QAAQ,EAAE,OAAO,EAAE,EACnB,YAAY,EAAE,iBAAiB,GAC9B,OAAO,CAAC,MAAM,CAAC;IAuDlB;;OAEG;IACH,OAAO,CAAC,eAAe;IAKvB;;OAEG;IACG,eAAe,CACnB,QAAQ,EAAE,OAAO,EAAE,EACnB,YAAY,EAAE,iBAAiB,GAC9B,OAAO,CAAC,MAAM,CAAC;IA4BlB;;OAEG;IACG,QAAQ,CACZ,QAAQ,EAAE,OAAO,EAAE,EACnB,SAAS,CAAC,EAAE,MAAM,EAClB,YAAY,CAAC,EAAE,iBAAiB,GAC/B,OAAO,CAAC,IAAI,CAAC;IAQhB;;OAEG;IACH,wBAAwB,IAAI,MAAM,GAAG,IAAI;IAIzC;;OAEG;IACH,wBAAwB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI;CAG9D"}
|
|
@@ -2,30 +2,17 @@
|
|
|
2
2
|
* Conversation Manager
|
|
3
3
|
*
|
|
4
4
|
* Handles conversation persistence, condensing, and restoration.
|
|
5
|
+
* Now uses StorageProvider abstraction for cloud-native support.
|
|
5
6
|
*/
|
|
6
7
|
import { logger } from '../utils/logger.js';
|
|
7
|
-
import { promises as fs } from 'fs';
|
|
8
|
-
import { join } from 'path';
|
|
9
|
-
import { homedir } from 'os';
|
|
10
8
|
export class ConversationManager {
|
|
11
|
-
|
|
9
|
+
storageProvider;
|
|
12
10
|
currentConversationId = null;
|
|
13
|
-
constructor() {
|
|
14
|
-
this.
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Initialize conversations directory
|
|
18
|
-
*/
|
|
19
|
-
async initialize() {
|
|
20
|
-
try {
|
|
21
|
-
await fs.mkdir(this.conversationsDir, { recursive: true });
|
|
22
|
-
logger.debug(`Conversations directory: ${this.conversationsDir}`);
|
|
23
|
-
}
|
|
24
|
-
catch (error) {
|
|
25
|
-
logger.error('Failed to create conversations directory', error);
|
|
26
|
-
throw error;
|
|
27
|
-
}
|
|
11
|
+
constructor(storageProvider, orchestrator) {
|
|
12
|
+
this.storageProvider = storageProvider;
|
|
13
|
+
this.orchestrator = orchestrator;
|
|
28
14
|
}
|
|
15
|
+
orchestrator;
|
|
29
16
|
/**
|
|
30
17
|
* Generate a unique conversation ID
|
|
31
18
|
*/
|
|
@@ -35,33 +22,28 @@ export class ConversationManager {
|
|
|
35
22
|
return `conv-${timestamp}-${random}`;
|
|
36
23
|
}
|
|
37
24
|
/**
|
|
38
|
-
*
|
|
39
|
-
*/
|
|
40
|
-
getConversationPath(id) {
|
|
41
|
-
return join(this.conversationsDir, `${id}.json`);
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Save conversation to disk
|
|
25
|
+
* Save conversation using StorageProvider
|
|
45
26
|
*/
|
|
46
27
|
async saveConversation(messages, workspace, conversationId, orchestrator) {
|
|
47
28
|
const finalId = conversationId || this.currentConversationId || this.generateConversationId();
|
|
48
|
-
//
|
|
49
|
-
|
|
29
|
+
// Use provided orchestrator or fallback to constructor orchestrator
|
|
30
|
+
const modelOrchestrator = orchestrator || this.orchestrator;
|
|
31
|
+
// Load existing conversation if updating
|
|
32
|
+
let existingData = null;
|
|
50
33
|
if (this.currentConversationId && finalId === this.currentConversationId) {
|
|
51
34
|
try {
|
|
52
|
-
|
|
53
|
-
existingMetadata = existing.metadata;
|
|
35
|
+
existingData = await this.storageProvider.loadConversation(finalId);
|
|
54
36
|
}
|
|
55
37
|
catch (error) {
|
|
56
|
-
// Ignore, will create new
|
|
38
|
+
// Ignore, will create new
|
|
57
39
|
}
|
|
58
40
|
}
|
|
59
41
|
// Generate title if this is a new conversation and we have at least one user message
|
|
60
|
-
let title =
|
|
42
|
+
let title = existingData?.metadata?.title;
|
|
61
43
|
const hasUserMessage = messages.some(msg => msg.role === 'user');
|
|
62
|
-
if (!title && hasUserMessage &&
|
|
44
|
+
if (!title && hasUserMessage && modelOrchestrator) {
|
|
63
45
|
logger.info('Generating conversation title...');
|
|
64
|
-
title = await this.generateTitle(messages,
|
|
46
|
+
title = await this.generateTitle(messages, modelOrchestrator);
|
|
65
47
|
logger.info(`Title generated: ${title}`);
|
|
66
48
|
}
|
|
67
49
|
else if (!title && hasUserMessage) {
|
|
@@ -77,30 +59,30 @@ export class ConversationManager {
|
|
|
77
59
|
const metadata = {
|
|
78
60
|
id: finalId,
|
|
79
61
|
title,
|
|
80
|
-
created:
|
|
62
|
+
created: existingData?.metadata?.created || new Date().toISOString(),
|
|
81
63
|
updated: new Date().toISOString(),
|
|
82
64
|
messageCount: messages.length,
|
|
83
65
|
workspace,
|
|
84
|
-
summary:
|
|
66
|
+
summary: existingData?.metadata?.summary,
|
|
85
67
|
};
|
|
86
68
|
const conversation = {
|
|
87
69
|
metadata,
|
|
88
70
|
messages,
|
|
89
71
|
};
|
|
90
|
-
|
|
91
|
-
await fs.writeFile(path, JSON.stringify(conversation, null, 2), 'utf-8');
|
|
72
|
+
await this.storageProvider.saveConversation(conversation);
|
|
92
73
|
this.currentConversationId = finalId;
|
|
93
74
|
logger.debug(`Conversation saved: ${finalId}`);
|
|
94
75
|
return finalId;
|
|
95
76
|
}
|
|
96
77
|
/**
|
|
97
|
-
* Load conversation
|
|
78
|
+
* Load conversation using StorageProvider
|
|
98
79
|
*/
|
|
99
80
|
async loadConversation(id) {
|
|
100
|
-
const path = this.getConversationPath(id);
|
|
101
81
|
try {
|
|
102
|
-
const
|
|
103
|
-
|
|
82
|
+
const conversation = await this.storageProvider.loadConversation(id);
|
|
83
|
+
if (!conversation) {
|
|
84
|
+
throw new Error(`Conversation not found: ${id}`);
|
|
85
|
+
}
|
|
104
86
|
this.currentConversationId = id;
|
|
105
87
|
logger.debug(`Conversation loaded: ${id}`);
|
|
106
88
|
return conversation;
|
|
@@ -111,24 +93,11 @@ export class ConversationManager {
|
|
|
111
93
|
}
|
|
112
94
|
}
|
|
113
95
|
/**
|
|
114
|
-
* List all saved conversations
|
|
96
|
+
* List all saved conversations using StorageProvider
|
|
115
97
|
*/
|
|
116
98
|
async listConversations() {
|
|
117
99
|
try {
|
|
118
|
-
const
|
|
119
|
-
const conversations = [];
|
|
120
|
-
for (const file of files) {
|
|
121
|
-
if (file.endsWith('.json')) {
|
|
122
|
-
try {
|
|
123
|
-
const data = await fs.readFile(join(this.conversationsDir, file), 'utf-8');
|
|
124
|
-
const conversation = JSON.parse(data);
|
|
125
|
-
conversations.push(conversation.metadata);
|
|
126
|
-
}
|
|
127
|
-
catch (error) {
|
|
128
|
-
logger.warn(`Failed to read conversation file: ${file}`);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
}
|
|
100
|
+
const conversations = await this.storageProvider.listConversations();
|
|
132
101
|
// Sort by updated date (most recent first)
|
|
133
102
|
conversations.sort((a, b) => new Date(b.updated).getTime() - new Date(a.updated).getTime());
|
|
134
103
|
return conversations;
|
|
@@ -139,12 +108,11 @@ export class ConversationManager {
|
|
|
139
108
|
}
|
|
140
109
|
}
|
|
141
110
|
/**
|
|
142
|
-
* Delete a conversation
|
|
111
|
+
* Delete a conversation using StorageProvider
|
|
143
112
|
*/
|
|
144
113
|
async deleteConversation(id) {
|
|
145
|
-
const path = this.getConversationPath(id);
|
|
146
114
|
try {
|
|
147
|
-
await
|
|
115
|
+
await this.storageProvider.deleteConversation(id);
|
|
148
116
|
logger.debug(`Conversation deleted: ${id}`);
|
|
149
117
|
if (this.currentConversationId === id) {
|
|
150
118
|
this.currentConversationId = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-manager.js","sourceRoot":"","sources":["../../src/core/conversation-manager.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"conversation-manager.js","sourceRoot":"","sources":["../../src/core/conversation-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +1,27 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Dual Agent System - Coordinates Manager and
|
|
2
|
+
* Dual Agent System - Coordinates Manager, Worker, and Client agents
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Three-agent architecture:
|
|
5
|
+
* - Manager: High-level planning and coordination
|
|
6
|
+
* - Worker: Task execution with tools
|
|
7
|
+
* - Client: Adaptive validation and quality control
|
|
6
8
|
*/
|
|
7
9
|
import { ModelOrchestrator } from '../models/orchestrator.js';
|
|
8
10
|
import { MCPServerManager } from '../mcp/server-manager.js';
|
|
9
11
|
import { WorkspaceManager } from './workspace.js';
|
|
10
12
|
import { ConversationManager } from './conversation-manager.js';
|
|
13
|
+
import { PersonaManager } from '../personas/persona-manager.js';
|
|
14
|
+
import { AgentSpawner } from './agent-spawner.js';
|
|
11
15
|
import { Message } from '../models/base.js';
|
|
12
16
|
export interface DualAgentConfig {
|
|
13
17
|
orchestrator: ModelOrchestrator;
|
|
14
18
|
mcpManager: MCPServerManager;
|
|
15
19
|
workspace: WorkspaceManager;
|
|
16
20
|
conversationManager?: ConversationManager;
|
|
21
|
+
personaManager?: PersonaManager;
|
|
17
22
|
maxSubtasks?: number;
|
|
23
|
+
maxIterations?: number;
|
|
24
|
+
maxAgentDepth?: number;
|
|
18
25
|
autoSave?: boolean;
|
|
19
26
|
condensingThreshold?: number;
|
|
20
27
|
}
|
|
@@ -32,9 +39,14 @@ export declare class DualAgent {
|
|
|
32
39
|
private mcpManager;
|
|
33
40
|
private workspace;
|
|
34
41
|
private conversationManager;
|
|
42
|
+
private personaManager;
|
|
43
|
+
private agentSpawner;
|
|
35
44
|
private manager;
|
|
36
45
|
private worker;
|
|
46
|
+
private client;
|
|
37
47
|
private maxSubtasks;
|
|
48
|
+
private maxIterations;
|
|
49
|
+
private maxAgentDepth;
|
|
38
50
|
private autoSave;
|
|
39
51
|
private condensingThreshold;
|
|
40
52
|
private userConversationHistory;
|
|
@@ -51,6 +63,15 @@ export declare class DualAgent {
|
|
|
51
63
|
getWorkspace(): WorkspaceManager;
|
|
52
64
|
getMCPManager(): MCPServerManager;
|
|
53
65
|
getConversationManager(): ConversationManager | null;
|
|
66
|
+
getPersonaManager(): PersonaManager | null;
|
|
67
|
+
/**
|
|
68
|
+
* Set agent spawner (used by parent agents to enable spawning in sub-agents)
|
|
69
|
+
*/
|
|
70
|
+
setAgentSpawner(spawner: AgentSpawner): void;
|
|
71
|
+
/**
|
|
72
|
+
* Get agent spawner
|
|
73
|
+
*/
|
|
74
|
+
getAgentSpawner(): AgentSpawner | null;
|
|
54
75
|
saveConversation(): Promise<string | null>;
|
|
55
76
|
loadConversation(id: string): Promise<void>;
|
|
56
77
|
listConversations(): Promise<import("./conversation-manager.js").ConversationMetadata[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dual-agent.d.ts","sourceRoot":"","sources":["../../src/core/dual-agent.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"dual-agent.d.ts","sourceRoot":"","sources":["../../src/core/dual-agent.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAMlD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,iBAAiB,CAAC;IAChC,UAAU,EAAE,gBAAgB,CAAC;IAC7B,SAAS,EAAE,gBAAgB,CAAC;IAC5B,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,IAAI,CAAC,EAAE;QACL,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,mBAAmB,CAA6B;IACxD,OAAO,CAAC,cAAc,CAAwB;IAC9C,OAAO,CAAC,YAAY,CAA6B;IAEjD,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,MAAM,CAAc;IAE5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,mBAAmB,CAAS;IAEpC,OAAO,CAAC,uBAAuB,CAAiB;gBAEpC,MAAM,EAAE,eAAe;IAmDnC;;OAEG;IACG,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;YAoJ7C,kBAAkB;IA6BhC,OAAO,CAAC,gBAAgB;IAWlB,OAAO;IAYb,iBAAiB;IAMjB,sBAAsB,IAAI,OAAO,EAAE;IAInC,YAAY,IAAI,gBAAgB;IAIhC,aAAa,IAAI,gBAAgB;IAIjC,sBAAsB,IAAI,mBAAmB,GAAG,IAAI;IAIpD,iBAAiB,IAAI,cAAc,GAAG,IAAI;IAI1C;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAO5C;;OAEG;IACH,eAAe,IAAI,YAAY,GAAG,IAAI;IAIhC,gBAAgB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAiB1C,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY3C,iBAAiB;CAOxB"}
|
package/dist/core/dual-agent.js
CHANGED
|
@@ -1,20 +1,30 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Dual Agent System - Coordinates Manager and
|
|
2
|
+
* Dual Agent System - Coordinates Manager, Worker, and Client agents
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Three-agent architecture:
|
|
5
|
+
* - Manager: High-level planning and coordination
|
|
6
|
+
* - Worker: Task execution with tools
|
|
7
|
+
* - Client: Adaptive validation and quality control
|
|
6
8
|
*/
|
|
9
|
+
import { AgentSpawner } from './agent-spawner.js';
|
|
7
10
|
import { ManagerAgent } from './manager-agent.js';
|
|
8
11
|
import { WorkerAgent } from './worker-agent.js';
|
|
12
|
+
import { ClientAgent } from './client-agent.js';
|
|
9
13
|
import { logger } from '../utils/logger.js';
|
|
14
|
+
import { orchestrationLogger } from '../utils/orchestration-logger.js';
|
|
10
15
|
export class DualAgent {
|
|
11
16
|
orchestrator;
|
|
12
17
|
mcpManager;
|
|
13
18
|
workspace;
|
|
14
19
|
conversationManager;
|
|
20
|
+
personaManager;
|
|
21
|
+
agentSpawner = null;
|
|
15
22
|
manager;
|
|
16
23
|
worker;
|
|
24
|
+
client;
|
|
17
25
|
maxSubtasks;
|
|
26
|
+
maxIterations;
|
|
27
|
+
maxAgentDepth;
|
|
18
28
|
autoSave;
|
|
19
29
|
condensingThreshold;
|
|
20
30
|
userConversationHistory = [];
|
|
@@ -23,13 +33,37 @@ export class DualAgent {
|
|
|
23
33
|
this.mcpManager = config.mcpManager;
|
|
24
34
|
this.workspace = config.workspace;
|
|
25
35
|
this.conversationManager = config.conversationManager || null;
|
|
36
|
+
this.personaManager = config.personaManager || null;
|
|
26
37
|
this.maxSubtasks = config.maxSubtasks || 10;
|
|
38
|
+
this.maxIterations = config.maxIterations || 10;
|
|
39
|
+
this.maxAgentDepth = config.maxAgentDepth ?? 1; // Default: only Manager can spawn
|
|
27
40
|
this.autoSave = config.autoSave !== false;
|
|
28
41
|
this.condensingThreshold = config.condensingThreshold || 30;
|
|
29
|
-
// Initialize agents
|
|
30
|
-
this.manager = new ManagerAgent(this.orchestrator, this.workspace);
|
|
31
|
-
this.worker = new WorkerAgent(this.orchestrator, this.mcpManager, this.workspace);
|
|
32
|
-
|
|
42
|
+
// Initialize agents (three-agent architecture)
|
|
43
|
+
this.manager = new ManagerAgent(this.orchestrator, this.workspace, this.personaManager || undefined);
|
|
44
|
+
this.worker = new WorkerAgent(this.orchestrator, this.mcpManager, this.workspace, this.maxIterations, this.personaManager || undefined);
|
|
45
|
+
this.client = new ClientAgent(this.orchestrator, this.mcpManager);
|
|
46
|
+
// Initialize AgentSpawner - always available as a baseline tool
|
|
47
|
+
// Create a PersonaManager if one wasn't provided
|
|
48
|
+
let spawnerPersonaManager = this.personaManager;
|
|
49
|
+
if (!this.personaManager) {
|
|
50
|
+
const { PersonaManager } = require('../personas/persona-manager.js');
|
|
51
|
+
spawnerPersonaManager = new PersonaManager();
|
|
52
|
+
// Note: Not awaiting initialize() here - will be lazy loaded if needed
|
|
53
|
+
}
|
|
54
|
+
this.agentSpawner = new AgentSpawner(this.orchestrator, this.mcpManager, this.workspace, this.conversationManager, spawnerPersonaManager, {
|
|
55
|
+
maxDepth: this.maxAgentDepth,
|
|
56
|
+
currentDepth: 0,
|
|
57
|
+
});
|
|
58
|
+
this.worker.setAgentSpawner(this.agentSpawner);
|
|
59
|
+
logger.info('[*] Three-agent system initialized (Manager + Worker + Client)');
|
|
60
|
+
logger.info(`[*] Agent spawn depth limit: ${this.maxAgentDepth} (${this.maxAgentDepth === 1 ? 'only Manager can spawn' : `${this.maxAgentDepth} levels deep`})`);
|
|
61
|
+
if (this.personaManager) {
|
|
62
|
+
const activePersona = this.personaManager.getActivePersona();
|
|
63
|
+
if (activePersona) {
|
|
64
|
+
logger.info(`[*] Active persona: ${activePersona.manifest.name} (${activePersona.skills.length} skills)`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
33
67
|
}
|
|
34
68
|
/**
|
|
35
69
|
* Process user message using dual-agent architecture
|
|
@@ -38,6 +72,7 @@ export class DualAgent {
|
|
|
38
72
|
logger.info('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
39
73
|
logger.info(`>> User: ${userMessage}`);
|
|
40
74
|
logger.info('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
75
|
+
orchestrationLogger.logUserMessage(userMessage);
|
|
41
76
|
// Check if conversation needs condensing BEFORE adding new message
|
|
42
77
|
if (this.userConversationHistory.length > this.condensingThreshold && this.conversationManager) {
|
|
43
78
|
logger.info('[*] Condensing conversation history...');
|
|
@@ -53,13 +88,18 @@ export class DualAgent {
|
|
|
53
88
|
// PHASE 1: Manager creates plan
|
|
54
89
|
logger.info('\n[PHASE 1: Planning]');
|
|
55
90
|
logger.info('─────────────────────────────────────────');
|
|
91
|
+
const phaseStartTime = Date.now();
|
|
92
|
+
orchestrationLogger.logPhaseStart('PLANNING');
|
|
56
93
|
const plan = await this.manager.createPlan({
|
|
57
94
|
userRequest: userMessage,
|
|
58
95
|
context: this.getRecentContext(),
|
|
59
96
|
});
|
|
97
|
+
orchestrationLogger.logPhaseEnd('PLANNING', Date.now() - phaseStartTime);
|
|
60
98
|
// PHASE 2: Execute subtasks
|
|
61
99
|
logger.info('\n[PHASE 2: Execution]');
|
|
62
100
|
logger.info('─────────────────────────────────────────');
|
|
101
|
+
const executionStartTime = Date.now();
|
|
102
|
+
orchestrationLogger.logPhaseStart('EXECUTION');
|
|
63
103
|
const results = [];
|
|
64
104
|
const subtasksToExecute = plan.subtasks.slice(0, this.maxSubtasks);
|
|
65
105
|
for (let i = 0; i < subtasksToExecute.length; i++) {
|
|
@@ -76,23 +116,39 @@ export class DualAgent {
|
|
|
76
116
|
subtask,
|
|
77
117
|
result: workerResult.result,
|
|
78
118
|
});
|
|
79
|
-
//
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
119
|
+
// Client validates Worker's result (adaptive involvement)
|
|
120
|
+
const validation = await this.client.validate(userMessage, plan.subtasks, workerResult);
|
|
121
|
+
if (!validation.approved && validation.nextAction) {
|
|
122
|
+
logger.info(`[Client] Validation failed: ${validation.issues.join(', ')}`);
|
|
123
|
+
logger.info(`[Client] Requesting correction: ${validation.nextAction}`);
|
|
124
|
+
// Deduplicate correction subtasks - don't add the same correction twice
|
|
125
|
+
const normalizedCorrection = validation.nextAction.toLowerCase().trim();
|
|
126
|
+
const isDuplicate = subtasksToExecute.some(existing => existing.toLowerCase().trim() === normalizedCorrection) || results.some(r => r.subtask.toLowerCase().trim() === normalizedCorrection);
|
|
127
|
+
// Add correction subtask (but don't exceed maxSubtasks and avoid duplicates)
|
|
128
|
+
if (isDuplicate) {
|
|
129
|
+
logger.warn(`[Client] Skipping duplicate correction subtask`);
|
|
130
|
+
}
|
|
131
|
+
else if (subtasksToExecute.length < this.maxSubtasks) {
|
|
132
|
+
subtasksToExecute.push(validation.nextAction);
|
|
133
|
+
logger.info(`[Client] Added correction subtask (${subtasksToExecute.length} total)`);
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
logger.warn(`[Client] Cannot add correction - maxSubtasks (${this.maxSubtasks}) reached`);
|
|
88
137
|
}
|
|
89
138
|
}
|
|
139
|
+
else if (validation.approved) {
|
|
140
|
+
logger.info(`[Client] Validation passed (${validation.involvementLevel} level)`);
|
|
141
|
+
}
|
|
90
142
|
}
|
|
143
|
+
orchestrationLogger.logPhaseEnd('EXECUTION', Date.now() - executionStartTime);
|
|
91
144
|
// PHASE 3: Synthesize final response
|
|
92
145
|
logger.info('\n[PHASE 3: Synthesis]');
|
|
93
146
|
logger.info('─────────────────────────────────────────');
|
|
147
|
+
const synthesisStartTime = Date.now();
|
|
148
|
+
orchestrationLogger.logPhaseStart('SYNTHESIS');
|
|
94
149
|
const finalResponse = await this.synthesizeResponse(plan, results);
|
|
95
150
|
totalIterations += 1;
|
|
151
|
+
orchestrationLogger.logPhaseEnd('SYNTHESIS', Date.now() - synthesisStartTime);
|
|
96
152
|
// Add assistant response to user conversation history
|
|
97
153
|
this.userConversationHistory.push({
|
|
98
154
|
role: 'assistant',
|
|
@@ -105,6 +161,7 @@ export class DualAgent {
|
|
|
105
161
|
logger.info('\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
106
162
|
logger.info(`[+] Complete: ${totalIterations} iterations, ${allToolsUsed.length} tools used`);
|
|
107
163
|
logger.info('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');
|
|
164
|
+
orchestrationLogger.logFinalResponse(finalResponse, totalIterations, allToolsUsed);
|
|
108
165
|
return {
|
|
109
166
|
content: finalResponse,
|
|
110
167
|
iterations: totalIterations,
|
|
@@ -116,11 +173,24 @@ export class DualAgent {
|
|
|
116
173
|
};
|
|
117
174
|
}
|
|
118
175
|
async synthesizeResponse(plan, results) {
|
|
119
|
-
// If only one subtask and
|
|
176
|
+
// If only one subtask and it's a short success message, return directly
|
|
177
|
+
// But ALWAYS synthesize if result indicates failure or incomplete work
|
|
120
178
|
if (results.length === 1 && results[0].result.length < 500) {
|
|
121
|
-
|
|
179
|
+
const result = results[0].result;
|
|
180
|
+
// Check if this is a failure/incomplete message
|
|
181
|
+
const isFailure = result.includes('could not be completed') ||
|
|
182
|
+
result.includes('failed') ||
|
|
183
|
+
result.includes('error') ||
|
|
184
|
+
result.toLowerCase().includes('unable to');
|
|
185
|
+
// If it's a failure, always let Manager synthesize to provide proper context
|
|
186
|
+
if (isFailure) {
|
|
187
|
+
logger.info('[DualAgent] Result indicates failure, invoking Manager synthesis');
|
|
188
|
+
return await this.manager.synthesizeResponse(results);
|
|
189
|
+
}
|
|
190
|
+
// Otherwise, short successful result can be returned directly
|
|
191
|
+
return result;
|
|
122
192
|
}
|
|
123
|
-
//
|
|
193
|
+
// Multiple subtasks or long result - ask Manager to synthesize
|
|
124
194
|
return await this.manager.synthesizeResponse(results);
|
|
125
195
|
}
|
|
126
196
|
getRecentContext() {
|
|
@@ -133,6 +203,11 @@ export class DualAgent {
|
|
|
133
203
|
return recent || '';
|
|
134
204
|
}
|
|
135
205
|
async cleanup() {
|
|
206
|
+
logger.info('[DualAgent] Cleaning up...');
|
|
207
|
+
// Cleanup spawned agents
|
|
208
|
+
if (this.agentSpawner) {
|
|
209
|
+
await this.agentSpawner.cleanup();
|
|
210
|
+
}
|
|
136
211
|
await this.mcpManager.cleanup();
|
|
137
212
|
logger.info('[*] Dual-agent system cleaned up');
|
|
138
213
|
}
|
|
@@ -153,6 +228,24 @@ export class DualAgent {
|
|
|
153
228
|
getConversationManager() {
|
|
154
229
|
return this.conversationManager;
|
|
155
230
|
}
|
|
231
|
+
getPersonaManager() {
|
|
232
|
+
return this.personaManager;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Set agent spawner (used by parent agents to enable spawning in sub-agents)
|
|
236
|
+
*/
|
|
237
|
+
setAgentSpawner(spawner) {
|
|
238
|
+
this.agentSpawner = spawner;
|
|
239
|
+
if (this.worker) {
|
|
240
|
+
this.worker.setAgentSpawner(spawner);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Get agent spawner
|
|
245
|
+
*/
|
|
246
|
+
getAgentSpawner() {
|
|
247
|
+
return this.agentSpawner;
|
|
248
|
+
}
|
|
156
249
|
async saveConversation() {
|
|
157
250
|
if (!this.conversationManager) {
|
|
158
251
|
logger.warn('Conversation manager not initialized');
|