agent-world 0.11.1 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -7
- package/dist/cli/commands.d.ts +109 -0
- package/dist/cli/commands.js +2024 -0
- package/dist/cli/display.d.ts +124 -0
- package/dist/cli/display.js +381 -0
- package/dist/cli/hitl.d.ts +33 -0
- package/dist/cli/hitl.js +81 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/stream.d.ts +41 -0
- package/dist/cli/stream.js +222 -0
- package/dist/core/activity-tracker.d.ts +16 -0
- package/dist/core/activity-tracker.d.ts.map +1 -0
- package/dist/core/activity-tracker.js +91 -0
- package/dist/core/activity-tracker.js.map +1 -0
- package/dist/core/ai-commands.d.ts +16 -0
- package/dist/core/ai-commands.d.ts.map +1 -0
- package/dist/core/ai-commands.js +24 -0
- package/dist/core/ai-commands.js.map +1 -0
- package/dist/core/ai-sdk-patch.d.ts +24 -0
- package/dist/core/ai-sdk-patch.d.ts.map +1 -0
- package/dist/core/ai-sdk-patch.js +169 -0
- package/dist/core/ai-sdk-patch.js.map +1 -0
- package/dist/core/anthropic-direct.d.ts +52 -0
- package/dist/core/anthropic-direct.d.ts.map +1 -0
- package/dist/core/anthropic-direct.js +301 -0
- package/dist/core/anthropic-direct.js.map +1 -0
- package/dist/core/approval-cache.d.ts +104 -0
- package/dist/core/approval-cache.d.ts.map +1 -0
- package/dist/core/approval-cache.js +150 -0
- package/dist/core/approval-cache.js.map +1 -0
- package/dist/core/chat-constants.d.ts +20 -0
- package/dist/core/chat-constants.d.ts.map +1 -0
- package/dist/core/chat-constants.js +22 -0
- package/dist/core/chat-constants.js.map +1 -0
- package/dist/core/create-agent-tool.d.ts +66 -0
- package/dist/core/create-agent-tool.d.ts.map +1 -0
- package/dist/core/create-agent-tool.js +212 -0
- package/dist/core/create-agent-tool.js.map +1 -0
- package/dist/core/events/approval-checker.d.ts +61 -0
- package/dist/core/events/approval-checker.d.ts.map +1 -0
- package/dist/core/events/approval-checker.js +226 -0
- package/dist/core/events/approval-checker.js.map +1 -0
- package/dist/core/events/index.d.ts +25 -0
- package/dist/core/events/index.d.ts.map +1 -0
- package/dist/core/events/index.js +30 -0
- package/dist/core/events/index.js.map +1 -0
- package/dist/core/events/memory-manager.d.ts +73 -0
- package/dist/core/events/memory-manager.d.ts.map +1 -0
- package/dist/core/events/memory-manager.js +1218 -0
- package/dist/core/events/memory-manager.js.map +1 -0
- package/dist/core/events/mention-logic.d.ts +39 -0
- package/dist/core/events/mention-logic.d.ts.map +1 -0
- package/dist/core/events/mention-logic.js +163 -0
- package/dist/core/events/mention-logic.js.map +1 -0
- package/dist/core/events/orchestrator.d.ts +69 -0
- package/dist/core/events/orchestrator.d.ts.map +1 -0
- package/dist/core/events/orchestrator.js +883 -0
- package/dist/core/events/orchestrator.js.map +1 -0
- package/dist/core/events/persistence.d.ts +41 -0
- package/dist/core/events/persistence.d.ts.map +1 -0
- package/dist/core/events/persistence.js +296 -0
- package/dist/core/events/persistence.js.map +1 -0
- package/dist/core/events/publishers.d.ts +81 -0
- package/dist/core/events/publishers.d.ts.map +1 -0
- package/dist/core/events/publishers.js +272 -0
- package/dist/core/events/publishers.js.map +1 -0
- package/dist/core/events/subscribers.d.ts +45 -0
- package/dist/core/events/subscribers.d.ts.map +1 -0
- package/dist/core/events/subscribers.js +288 -0
- package/dist/core/events/subscribers.js.map +1 -0
- package/dist/core/events/tool-bridge-logging.d.ts +28 -0
- package/dist/core/events/tool-bridge-logging.d.ts.map +1 -0
- package/dist/core/events/tool-bridge-logging.js +94 -0
- package/dist/core/events/tool-bridge-logging.js.map +1 -0
- package/dist/core/events-metadata.d.ts +72 -0
- package/dist/core/events-metadata.d.ts.map +1 -0
- package/dist/core/events-metadata.js +167 -0
- package/dist/core/events-metadata.js.map +1 -0
- package/dist/core/events.d.ts +186 -0
- package/dist/core/events.d.ts.map +1 -0
- package/dist/core/events.js +1248 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/export.d.ts +106 -0
- package/dist/core/export.d.ts.map +1 -0
- package/dist/core/export.js +705 -0
- package/dist/core/export.js.map +1 -0
- package/dist/core/file-tools.d.ts +114 -0
- package/dist/core/file-tools.d.ts.map +1 -0
- package/dist/core/file-tools.js +370 -0
- package/dist/core/file-tools.js.map +1 -0
- package/dist/core/google-direct.d.ts +58 -0
- package/dist/core/google-direct.d.ts.map +1 -0
- package/dist/core/google-direct.js +298 -0
- package/dist/core/google-direct.js.map +1 -0
- package/dist/core/hitl.d.ts +54 -0
- package/dist/core/hitl.d.ts.map +1 -0
- package/dist/core/hitl.js +153 -0
- package/dist/core/hitl.js.map +1 -0
- package/dist/core/index.d.ts +59 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +70 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/llm-config.d.ts +128 -0
- package/dist/core/llm-config.d.ts.map +1 -0
- package/dist/core/llm-config.js +164 -0
- package/dist/core/llm-config.js.map +1 -0
- package/dist/core/llm-manager.d.ts +163 -0
- package/dist/core/llm-manager.d.ts.map +1 -0
- package/dist/core/llm-manager.js +669 -0
- package/dist/core/llm-manager.js.map +1 -0
- package/dist/core/load-skill-tool.d.ts +55 -0
- package/dist/core/load-skill-tool.d.ts.map +1 -0
- package/dist/core/load-skill-tool.js +468 -0
- package/dist/core/load-skill-tool.js.map +1 -0
- package/dist/core/logger.d.ts +88 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +358 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/managers.d.ts +131 -0
- package/dist/core/managers.d.ts.map +1 -0
- package/dist/core/managers.js +1223 -0
- package/dist/core/managers.js.map +1 -0
- package/dist/core/mcp-server-registry.d.ts +304 -0
- package/dist/core/mcp-server-registry.d.ts.map +1 -0
- package/dist/core/mcp-server-registry.js +1769 -0
- package/dist/core/mcp-server-registry.js.map +1 -0
- package/dist/core/mcp-tools.d.ts +56 -0
- package/dist/core/mcp-tools.d.ts.map +1 -0
- package/dist/core/mcp-tools.js +186 -0
- package/dist/core/mcp-tools.js.map +1 -0
- package/dist/core/message-prep.d.ts +81 -0
- package/dist/core/message-prep.d.ts.map +1 -0
- package/dist/core/message-prep.js +223 -0
- package/dist/core/message-prep.js.map +1 -0
- package/dist/core/message-processing-control.d.ts +54 -0
- package/dist/core/message-processing-control.d.ts.map +1 -0
- package/dist/core/message-processing-control.js +139 -0
- package/dist/core/message-processing-control.js.map +1 -0
- package/dist/core/openai-direct.d.ts +80 -0
- package/dist/core/openai-direct.d.ts.map +1 -0
- package/dist/core/openai-direct.js +374 -0
- package/dist/core/openai-direct.js.map +1 -0
- package/dist/core/shell-cmd-tool.d.ts +235 -0
- package/dist/core/shell-cmd-tool.d.ts.map +1 -0
- package/dist/core/shell-cmd-tool.js +1157 -0
- package/dist/core/shell-cmd-tool.js.map +1 -0
- package/dist/core/shell-process-registry.d.ts +88 -0
- package/dist/core/shell-process-registry.d.ts.map +1 -0
- package/dist/core/shell-process-registry.js +309 -0
- package/dist/core/shell-process-registry.js.map +1 -0
- package/dist/core/skill-registry.d.ts +75 -0
- package/dist/core/skill-registry.d.ts.map +1 -0
- package/dist/core/skill-registry.js +369 -0
- package/dist/core/skill-registry.js.map +1 -0
- package/dist/core/skill-script-runner.d.ts +89 -0
- package/dist/core/skill-script-runner.d.ts.map +1 -0
- package/dist/core/skill-script-runner.js +274 -0
- package/dist/core/skill-script-runner.js.map +1 -0
- package/dist/core/skill-selector.d.ts +65 -0
- package/dist/core/skill-selector.d.ts.map +1 -0
- package/dist/core/skill-selector.js +190 -0
- package/dist/core/skill-selector.js.map +1 -0
- package/dist/core/skill-settings.d.ts +20 -0
- package/dist/core/skill-settings.d.ts.map +1 -0
- package/dist/core/skill-settings.js +40 -0
- package/dist/core/skill-settings.js.map +1 -0
- package/dist/core/storage/agent-storage.d.ts +134 -0
- package/dist/core/storage/agent-storage.d.ts.map +1 -0
- package/dist/core/storage/agent-storage.js +498 -0
- package/dist/core/storage/agent-storage.js.map +1 -0
- package/dist/core/storage/eventStorage/fileEventStorage.d.ts +100 -0
- package/dist/core/storage/eventStorage/fileEventStorage.d.ts.map +1 -0
- package/dist/core/storage/eventStorage/fileEventStorage.js +494 -0
- package/dist/core/storage/eventStorage/fileEventStorage.js.map +1 -0
- package/dist/core/storage/eventStorage/index.d.ts +31 -0
- package/dist/core/storage/eventStorage/index.d.ts.map +1 -0
- package/dist/core/storage/eventStorage/index.js +31 -0
- package/dist/core/storage/eventStorage/index.js.map +1 -0
- package/dist/core/storage/eventStorage/memoryEventStorage.d.ts +87 -0
- package/dist/core/storage/eventStorage/memoryEventStorage.d.ts.map +1 -0
- package/dist/core/storage/eventStorage/memoryEventStorage.js +244 -0
- package/dist/core/storage/eventStorage/memoryEventStorage.js.map +1 -0
- package/dist/core/storage/eventStorage/sqliteEventStorage.d.ts +45 -0
- package/dist/core/storage/eventStorage/sqliteEventStorage.d.ts.map +1 -0
- package/dist/core/storage/eventStorage/sqliteEventStorage.js +301 -0
- package/dist/core/storage/eventStorage/sqliteEventStorage.js.map +1 -0
- package/dist/core/storage/eventStorage/types.d.ts +142 -0
- package/dist/core/storage/eventStorage/types.d.ts.map +1 -0
- package/dist/core/storage/eventStorage/types.js +43 -0
- package/dist/core/storage/eventStorage/types.js.map +1 -0
- package/dist/core/storage/eventStorage/validation.d.ts +30 -0
- package/dist/core/storage/eventStorage/validation.d.ts.map +1 -0
- package/dist/core/storage/eventStorage/validation.js +68 -0
- package/dist/core/storage/eventStorage/validation.js.map +1 -0
- package/dist/core/storage/legacy-migrations.d.ts +45 -0
- package/dist/core/storage/legacy-migrations.d.ts.map +1 -0
- package/dist/core/storage/legacy-migrations.js +295 -0
- package/dist/core/storage/legacy-migrations.js.map +1 -0
- package/dist/core/storage/memory-storage.d.ts +105 -0
- package/dist/core/storage/memory-storage.d.ts.map +1 -0
- package/dist/core/storage/memory-storage.js +415 -0
- package/dist/core/storage/memory-storage.js.map +1 -0
- package/dist/core/storage/migration-runner.d.ts +96 -0
- package/dist/core/storage/migration-runner.d.ts.map +1 -0
- package/dist/core/storage/migration-runner.js +306 -0
- package/dist/core/storage/migration-runner.js.map +1 -0
- package/dist/core/storage/queue-storage.d.ts +147 -0
- package/dist/core/storage/queue-storage.d.ts.map +1 -0
- package/dist/core/storage/queue-storage.js +290 -0
- package/dist/core/storage/queue-storage.js.map +1 -0
- package/dist/core/storage/skill-storage.d.ts +136 -0
- package/dist/core/storage/skill-storage.d.ts.map +1 -0
- package/dist/core/storage/skill-storage.js +474 -0
- package/dist/core/storage/skill-storage.js.map +1 -0
- package/dist/core/storage/sqlite-schema.d.ts +95 -0
- package/dist/core/storage/sqlite-schema.d.ts.map +1 -0
- package/dist/core/storage/sqlite-schema.js +156 -0
- package/dist/core/storage/sqlite-schema.js.map +1 -0
- package/dist/core/storage/sqlite-storage.d.ts +146 -0
- package/dist/core/storage/sqlite-storage.d.ts.map +1 -0
- package/dist/core/storage/sqlite-storage.js +709 -0
- package/dist/core/storage/sqlite-storage.js.map +1 -0
- package/dist/core/storage/storage-factory.d.ts +61 -0
- package/dist/core/storage/storage-factory.d.ts.map +1 -0
- package/dist/core/storage/storage-factory.js +794 -0
- package/dist/core/storage/storage-factory.js.map +1 -0
- package/dist/core/storage/validation.d.ts +36 -0
- package/dist/core/storage/validation.d.ts.map +1 -0
- package/dist/core/storage/validation.js +79 -0
- package/dist/core/storage/validation.js.map +1 -0
- package/dist/core/storage/world-storage.d.ts +114 -0
- package/dist/core/storage/world-storage.d.ts.map +1 -0
- package/dist/core/storage/world-storage.js +378 -0
- package/dist/core/storage/world-storage.js.map +1 -0
- package/dist/core/subscription.d.ts +43 -0
- package/dist/core/subscription.d.ts.map +1 -0
- package/dist/core/subscription.js +227 -0
- package/dist/core/subscription.js.map +1 -0
- package/dist/core/tool-utils.d.ts +80 -0
- package/dist/core/tool-utils.d.ts.map +1 -0
- package/dist/core/tool-utils.js +273 -0
- package/dist/core/tool-utils.js.map +1 -0
- package/dist/core/types.d.ts +595 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +158 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/utils.d.ts +138 -0
- package/dist/core/utils.d.ts.map +1 -0
- package/dist/core/utils.js +478 -0
- package/dist/core/utils.js.map +1 -0
- package/dist/core/world-class.d.ts +43 -0
- package/dist/core/world-class.d.ts.map +1 -0
- package/dist/core/world-class.js +90 -0
- package/dist/core/world-class.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/public/assets/agent-sprites-DJFgj-zP.png +0 -0
- package/dist/public/assets/border-KHK37r8y.svg +83 -0
- package/dist/public/assets/index-C9kPXL6G.css +1 -0
- package/dist/public/assets/index-DOQEHGWt.js +96 -0
- package/dist/public/index.html +21 -0
- package/dist/server/api.d.ts +2 -0
- package/dist/server/api.js +1124 -0
- package/dist/server/index.d.ts +29 -0
- package/dist/server/sse-handler.d.ts +62 -0
- package/dist/server/sse-handler.js +234 -0
- package/package.json +15 -3
- package/scripts/launch-electron.js +0 -58
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event Publishers - Event Emission Functions
|
|
3
|
+
*
|
|
4
|
+
* Purpose: Functions that emit events to World.eventEmitter
|
|
5
|
+
* Features:
|
|
6
|
+
* - Message publishing with chat session management
|
|
7
|
+
* - SSE event publishing for streaming
|
|
8
|
+
* - Tool event publishing for agent behaviors
|
|
9
|
+
* - CRUD event publishing for configuration changes
|
|
10
|
+
*
|
|
11
|
+
* Implementation Notes:
|
|
12
|
+
* - Uses parseMessageContent to preserve enhanced tool-result protocol support
|
|
13
|
+
* - Emits events synchronously through world-scoped EventEmitter channels
|
|
14
|
+
*
|
|
15
|
+
* Recent Changes:
|
|
16
|
+
* - 2026-02-13: Added optional explicit `chatId` override for `publishEvent` to preserve session context across async flows.
|
|
17
|
+
* - 2026-02-13: Added chat-scoped tool-event propagation (`chatId`) so realtime tool updates remain session-isolated.
|
|
18
|
+
* - 2026-02-11: Fixed publishSSE to include toolName and stream fields for tool-stream events
|
|
19
|
+
* - 2026-02-08: Added core-level sender normalization for consistent user-role detection
|
|
20
|
+
* - 2026-02-08: Removed legacy manual tool-result publishing helper from event API
|
|
21
|
+
*
|
|
22
|
+
* All functions emit events synchronously and return immediately
|
|
23
|
+
*/
|
|
24
|
+
import { EventType } from '../types.js';
|
|
25
|
+
import { generateId } from '../utils.js';
|
|
26
|
+
import { parseMessageContent } from '../message-prep.js';
|
|
27
|
+
import { createCategoryLogger } from '../logger.js';
|
|
28
|
+
const loggerPublish = createCategoryLogger('events.publish');
|
|
29
|
+
const loggerMemory = createCategoryLogger('events.memory');
|
|
30
|
+
// Global streaming control
|
|
31
|
+
let globalStreamingEnabled = true;
|
|
32
|
+
export function enableStreaming() { globalStreamingEnabled = true; }
|
|
33
|
+
export function disableStreaming() { globalStreamingEnabled = false; }
|
|
34
|
+
export function isStreamingEnabled() { return globalStreamingEnabled; }
|
|
35
|
+
/**
|
|
36
|
+
* Normalize sender values so role/persistence logic remains consistent across clients.
|
|
37
|
+
* Examples:
|
|
38
|
+
* - "HUMAN", "user", "User42" => "human"
|
|
39
|
+
* - "SYSTEM" => "system"
|
|
40
|
+
* - Agent IDs remain unchanged.
|
|
41
|
+
*/
|
|
42
|
+
export function normalizeSender(sender) {
|
|
43
|
+
const trimmed = String(sender ?? '').trim();
|
|
44
|
+
if (!trimmed)
|
|
45
|
+
return 'human';
|
|
46
|
+
const lower = trimmed.toLowerCase();
|
|
47
|
+
if (lower === 'human' || lower.startsWith('user'))
|
|
48
|
+
return 'human';
|
|
49
|
+
if (lower === 'system')
|
|
50
|
+
return 'system';
|
|
51
|
+
if (lower === 'world')
|
|
52
|
+
return 'world';
|
|
53
|
+
return trimmed;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Publish CRUD event for agent, chat, or world configuration changes
|
|
57
|
+
* Allows subscribed clients to receive real-time updates for all CRUD operations
|
|
58
|
+
*
|
|
59
|
+
* Note: CRUD events are entity-level by default (`chatId: null`), but chat-scoped
|
|
60
|
+
* CRUD updates can pass an explicit `chatId` when downstream consumers need context.
|
|
61
|
+
*/
|
|
62
|
+
export function publishCRUDEvent(world, operation, entityType, entityId, entityData, chatId) {
|
|
63
|
+
const event = {
|
|
64
|
+
operation,
|
|
65
|
+
entityType,
|
|
66
|
+
entityId,
|
|
67
|
+
entityData: operation === 'delete' ? null : entityData,
|
|
68
|
+
timestamp: new Date(),
|
|
69
|
+
chatId: chatId ?? null
|
|
70
|
+
};
|
|
71
|
+
world.eventEmitter.emit(EventType.CRUD, event);
|
|
72
|
+
loggerPublish.debug('CRUD event published', {
|
|
73
|
+
worldId: world.id,
|
|
74
|
+
operation,
|
|
75
|
+
entityType,
|
|
76
|
+
entityId
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Publish event to a specific channel using World.eventEmitter
|
|
81
|
+
*/
|
|
82
|
+
export function publishEvent(world, type, content, chatId) {
|
|
83
|
+
const targetChatId = chatId !== undefined ? chatId : (world.currentChatId || null);
|
|
84
|
+
const event = {
|
|
85
|
+
content,
|
|
86
|
+
timestamp: new Date(),
|
|
87
|
+
messageId: generateId(),
|
|
88
|
+
chatId: targetChatId
|
|
89
|
+
};
|
|
90
|
+
world.eventEmitter.emit(type, event);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Message publishing using World.eventEmitter with chat session management
|
|
94
|
+
* Parses enhanced string protocol and automatically prepends @mention if agentId detected
|
|
95
|
+
* Returns the messageEvent so callers can access the generated messageId
|
|
96
|
+
*
|
|
97
|
+
* @param chatId - Optional chat ID. If not provided, uses world.currentChatId
|
|
98
|
+
* @param replyToMessageId - Optional parent message ID for threading
|
|
99
|
+
*/
|
|
100
|
+
export function publishMessage(world, content, sender, chatId, replyToMessageId) {
|
|
101
|
+
const messageId = generateId();
|
|
102
|
+
const targetChatId = chatId !== undefined ? chatId : world.currentChatId;
|
|
103
|
+
const normalizedSender = normalizeSender(sender);
|
|
104
|
+
loggerMemory.debug('[publishMessage] ENTRY', {
|
|
105
|
+
sender,
|
|
106
|
+
normalizedSender,
|
|
107
|
+
chatId,
|
|
108
|
+
contentPreview: content.substring(0, 200),
|
|
109
|
+
messageId
|
|
110
|
+
});
|
|
111
|
+
// Parse enhanced string protocol to extract targetAgentId
|
|
112
|
+
const { message: parsedMsg, targetAgentId } = parseMessageContent(content, 'user');
|
|
113
|
+
loggerMemory.debug('[publishMessage] After parseMessageContent', {
|
|
114
|
+
parsedRole: parsedMsg.role,
|
|
115
|
+
targetAgentId,
|
|
116
|
+
toolCallId: parsedMsg.role === 'tool' ? parsedMsg.tool_call_id : undefined
|
|
117
|
+
});
|
|
118
|
+
// For tool messages, don't prepend @mention - send the parsed content directly
|
|
119
|
+
let finalContent = content;
|
|
120
|
+
if (targetAgentId && parsedMsg.role === 'tool') {
|
|
121
|
+
// Tool messages: Use the tool_call_id to route, not @mentions
|
|
122
|
+
// Keep the enhanced protocol format for agent handler to parse
|
|
123
|
+
loggerMemory.debug('[publishMessage] Tool result message detected', {
|
|
124
|
+
agentId: targetAgentId,
|
|
125
|
+
toolCallId: parsedMsg.tool_call_id,
|
|
126
|
+
messageId
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
else if (targetAgentId) {
|
|
130
|
+
// Regular messages: Prepend @mention
|
|
131
|
+
finalContent = `@${targetAgentId}, ${content}`;
|
|
132
|
+
loggerMemory.debug('[publishMessage] Prepended @mention from enhanced protocol', {
|
|
133
|
+
agentId: targetAgentId,
|
|
134
|
+
messageId
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
// Determine role based on sender and message type
|
|
138
|
+
let role;
|
|
139
|
+
if (parsedMsg.role === 'tool') {
|
|
140
|
+
role = 'tool';
|
|
141
|
+
}
|
|
142
|
+
else if (normalizedSender === 'human' || normalizedSender.startsWith('user')) {
|
|
143
|
+
role = 'user';
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
// Agent senders get role 'assistant'
|
|
147
|
+
role = 'assistant';
|
|
148
|
+
}
|
|
149
|
+
const messageEvent = {
|
|
150
|
+
content: finalContent,
|
|
151
|
+
sender: normalizedSender,
|
|
152
|
+
role,
|
|
153
|
+
timestamp: new Date(),
|
|
154
|
+
messageId,
|
|
155
|
+
chatId: targetChatId,
|
|
156
|
+
replyToMessageId
|
|
157
|
+
};
|
|
158
|
+
loggerMemory.debug('[publishMessage] Generated messageId', {
|
|
159
|
+
messageId,
|
|
160
|
+
sender: normalizedSender,
|
|
161
|
+
role,
|
|
162
|
+
worldId: world.id,
|
|
163
|
+
chatId: targetChatId,
|
|
164
|
+
hasAgentId: !!targetAgentId,
|
|
165
|
+
contentPreview: finalContent.substring(0, 50)
|
|
166
|
+
});
|
|
167
|
+
loggerMemory.debug('[publishMessage] Emitting message event', {
|
|
168
|
+
messageId,
|
|
169
|
+
sender: normalizedSender,
|
|
170
|
+
role,
|
|
171
|
+
chatId: targetChatId,
|
|
172
|
+
contentPreview: finalContent.substring(0, 100)
|
|
173
|
+
});
|
|
174
|
+
world.eventEmitter.emit('message', messageEvent);
|
|
175
|
+
loggerMemory.debug('[publishMessage] Message event emitted', { messageId });
|
|
176
|
+
return messageEvent;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Message publishing with pre-generated messageId
|
|
180
|
+
* Used when messageId needs to be known before publishing (e.g., for agent responses)
|
|
181
|
+
*
|
|
182
|
+
* @param chatId - Optional chat ID. If not provided, uses world.currentChatId
|
|
183
|
+
* @param replyToMessageId - Optional parent message ID for threading
|
|
184
|
+
*/
|
|
185
|
+
export function publishMessageWithId(world, content, sender, messageId, chatId, replyToMessageId) {
|
|
186
|
+
const targetChatId = chatId !== undefined ? chatId : world.currentChatId;
|
|
187
|
+
const normalizedSender = normalizeSender(sender);
|
|
188
|
+
const messageEvent = {
|
|
189
|
+
content,
|
|
190
|
+
sender: normalizedSender,
|
|
191
|
+
timestamp: new Date(),
|
|
192
|
+
messageId,
|
|
193
|
+
chatId: targetChatId,
|
|
194
|
+
replyToMessageId
|
|
195
|
+
};
|
|
196
|
+
world.eventEmitter.emit('message', messageEvent);
|
|
197
|
+
return messageEvent;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Subscribe to message events
|
|
201
|
+
*/
|
|
202
|
+
export function subscribeToMessages(world, handler) {
|
|
203
|
+
// Wrap async handlers to catch and log errors
|
|
204
|
+
// This ensures async operations complete even if errors occur
|
|
205
|
+
const wrappedHandler = (event) => {
|
|
206
|
+
try {
|
|
207
|
+
const result = handler(event);
|
|
208
|
+
if (result instanceof Promise) {
|
|
209
|
+
result.catch(error => {
|
|
210
|
+
loggerPublish.error('Async message handler error', {
|
|
211
|
+
worldId: world.id,
|
|
212
|
+
messageId: event.messageId,
|
|
213
|
+
sender: event.sender,
|
|
214
|
+
error: error instanceof Error ? error.message : error,
|
|
215
|
+
stack: error instanceof Error ? error.stack : undefined
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
loggerPublish.error('Sync message handler error', {
|
|
222
|
+
worldId: world.id,
|
|
223
|
+
messageId: event.messageId,
|
|
224
|
+
sender: event.sender,
|
|
225
|
+
error: error instanceof Error ? error.message : error,
|
|
226
|
+
stack: error instanceof Error ? error.stack : undefined
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
world.eventEmitter.on('message', wrappedHandler);
|
|
231
|
+
return () => world.eventEmitter.off('message', wrappedHandler);
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* SSE events using World.eventEmitter (for LLM streaming)
|
|
235
|
+
*/
|
|
236
|
+
export function publishSSE(world, data) {
|
|
237
|
+
const sseEvent = {
|
|
238
|
+
agentName: data.agentName,
|
|
239
|
+
type: data.type,
|
|
240
|
+
content: data.content,
|
|
241
|
+
error: data.error,
|
|
242
|
+
messageId: data.messageId || generateId(),
|
|
243
|
+
chatId: data.chatId !== undefined ? data.chatId : (world.currentChatId ?? null),
|
|
244
|
+
usage: data.usage,
|
|
245
|
+
logEvent: data.logEvent,
|
|
246
|
+
tool_calls: data.tool_calls,
|
|
247
|
+
toolName: data.toolName,
|
|
248
|
+
stream: data.stream
|
|
249
|
+
};
|
|
250
|
+
world.eventEmitter.emit('sse', sseEvent);
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Tool events using World.eventEmitter (for agent behavioral events)
|
|
254
|
+
*/
|
|
255
|
+
export function publishToolEvent(world, data) {
|
|
256
|
+
const toolEvent = {
|
|
257
|
+
agentName: data.agentName,
|
|
258
|
+
type: data.type,
|
|
259
|
+
messageId: data.messageId || generateId(),
|
|
260
|
+
chatId: data.chatId !== undefined ? data.chatId : (world.currentChatId ?? null),
|
|
261
|
+
toolExecution: data.toolExecution
|
|
262
|
+
};
|
|
263
|
+
world.eventEmitter.emit('world', toolEvent);
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* SSE subscription using World.eventEmitter
|
|
267
|
+
*/
|
|
268
|
+
export function subscribeToSSE(world, handler) {
|
|
269
|
+
world.eventEmitter.on('sse', handler);
|
|
270
|
+
return () => world.eventEmitter.off('sse', handler);
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=publishers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publishers.js","sourceRoot":"","sources":["../../../core/events/publishers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAEL,SAAS,EACV,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD,MAAM,aAAa,GAAG,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;AAC7D,MAAM,YAAY,GAAG,oBAAoB,CAAC,eAAe,CAAC,CAAC;AAE3D,2BAA2B;AAC3B,IAAI,sBAAsB,GAAG,IAAI,CAAC;AAClC,MAAM,UAAU,eAAe,KAAW,sBAAsB,GAAG,IAAI,CAAC,CAAC,CAAC;AAC1E,MAAM,UAAU,gBAAgB,KAAW,sBAAsB,GAAG,KAAK,CAAC,CAAC,CAAC;AAC5E,MAAM,UAAU,kBAAkB,KAAc,OAAO,sBAAsB,CAAC,CAAC,CAAC;AAEhF;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5C,IAAI,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC;IAE7B,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACpC,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,OAAO,CAAC;IAClE,IAAI,KAAK,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACxC,IAAI,KAAK,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IACtC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAY,EACZ,SAAyC,EACzC,UAAsC,EACtC,QAAgB,EAChB,UAAgB,EAChB,MAAsB;IAEtB,MAAM,KAAK,GAAmB;QAC5B,SAAS;QACT,UAAU;QACV,QAAQ;QACR,UAAU,EAAE,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU;QACtD,SAAS,EAAE,IAAI,IAAI,EAAE;QACrB,MAAM,EAAE,MAAM,IAAI,IAAI;KACvB,CAAC;IAEF,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAE/C,aAAa,CAAC,KAAK,CAAC,sBAAsB,EAAE;QAC1C,OAAO,EAAE,KAAK,CAAC,EAAE;QACjB,SAAS;QACT,UAAU;QACV,QAAQ;KACT,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,KAAY,EAAE,IAAY,EAAE,OAAY,EAAE,MAAsB;IAC3F,MAAM,YAAY,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC;IACnF,MAAM,KAAK,GAAqB;QAC9B,OAAO;QACP,SAAS,EAAE,IAAI,IAAI,EAAE;QACrB,SAAS,EAAE,UAAU,EAAE;QACvB,MAAM,EAAE,YAAY;KACrB,CAAC;IACF,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACvC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,KAAY,EAAE,OAAe,EAAE,MAAc,EAAE,MAAsB,EAAE,gBAAyB;IAC7H,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC;IAC/B,MAAM,YAAY,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC;IACzE,MAAM,gBAAgB,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAEjD,YAAY,CAAC,KAAK,CAAC,wBAAwB,EAAE;QAC3C,MAAM;QACN,gBAAgB;QAChB,MAAM;QACN,cAAc,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;QACzC,SAAS;KACV,CAAC,CAAC;IAEH,0DAA0D;IAC1D,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAEnF,YAAY,CAAC,KAAK,CAAC,4CAA4C,EAAE;QAC/D,UAAU,EAAE,SAAS,CAAC,IAAI;QAC1B,aAAa;QACb,UAAU,EAAE,SAAS,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAE,SAAiB,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;KACpF,CAAC,CAAC;IAEH,+EAA+E;IAC/E,IAAI,YAAY,GAAG,OAAO,CAAC;IAC3B,IAAI,aAAa,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC/C,8DAA8D;QAC9D,+DAA+D;QAC/D,YAAY,CAAC,KAAK,CAAC,+CAA+C,EAAE;YAClE,OAAO,EAAE,aAAa;YACtB,UAAU,EAAE,SAAS,CAAC,YAAY;YAClC,SAAS;SACV,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,aAAa,EAAE,CAAC;QACzB,qCAAqC;QACrC,YAAY,GAAG,IAAI,aAAa,KAAK,OAAO,EAAE,CAAC;QAC/C,YAAY,CAAC,KAAK,CAAC,4DAA4D,EAAE;YAC/E,OAAO,EAAE,aAAa;YACtB,SAAS;SACV,CAAC,CAAC;IACL,CAAC;IAED,kDAAkD;IAClD,IAAI,IAAY,CAAC;IACjB,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC9B,IAAI,GAAG,MAAM,CAAC;IAChB,CAAC;SAAM,IAAI,gBAAgB,KAAK,OAAO,IAAI,gBAAgB,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/E,IAAI,GAAG,MAAM,CAAC;IAChB,CAAC;SAAM,CAAC;QACN,qCAAqC;QACrC,IAAI,GAAG,WAAW,CAAC;IACrB,CAAC;IAED,MAAM,YAAY,GAA4D;QAC5E,OAAO,EAAE,YAAY;QACrB,MAAM,EAAE,gBAAgB;QACxB,IAAI;QACJ,SAAS,EAAE,IAAI,IAAI,EAAE;QACrB,SAAS;QACT,MAAM,EAAE,YAAY;QACpB,gBAAgB;KACjB,CAAC;IAEF,YAAY,CAAC,KAAK,CAAC,sCAAsC,EAAE;QACzD,SAAS;QACT,MAAM,EAAE,gBAAgB;QACxB,IAAI;QACJ,OAAO,EAAE,KAAK,CAAC,EAAE;QACjB,MAAM,EAAE,YAAY;QACpB,UAAU,EAAE,CAAC,CAAC,aAAa;QAC3B,cAAc,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;KAC9C,CAAC,CAAC;IAEH,YAAY,CAAC,KAAK,CAAC,yCAAyC,EAAE;QAC5D,SAAS;QACT,MAAM,EAAE,gBAAgB;QACxB,IAAI;QACJ,MAAM,EAAE,YAAY;QACpB,cAAc,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;KAC/C,CAAC,CAAC;IAEH,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAEjD,YAAY,CAAC,KAAK,CAAC,wCAAwC,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IAE5E,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAY,EAAE,OAAe,EAAE,MAAc,EAAE,SAAiB,EAAE,MAAsB,EAAE,gBAAyB;IACtJ,MAAM,YAAY,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC;IACzE,MAAM,gBAAgB,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,YAAY,GAAsB;QACtC,OAAO;QACP,MAAM,EAAE,gBAAgB;QACxB,SAAS,EAAE,IAAI,IAAI,EAAE;QACrB,SAAS;QACT,MAAM,EAAE,YAAY;QACpB,gBAAgB;KACjB,CAAC;IACF,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACjD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAAY,EACZ,OAA2D;IAE3D,8CAA8C;IAC9C,8DAA8D;IAC9D,MAAM,cAAc,GAAG,CAAC,KAAwB,EAAE,EAAE;QAClD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9B,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;gBAC9B,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;oBACnB,aAAa,CAAC,KAAK,CAAC,6BAA6B,EAAE;wBACjD,OAAO,EAAE,KAAK,CAAC,EAAE;wBACjB,SAAS,EAAE,KAAK,CAAC,SAAS;wBAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;wBACpB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK;wBACrD,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;qBACxD,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,aAAa,CAAC,KAAK,CAAC,4BAA4B,EAAE;gBAChD,OAAO,EAAE,KAAK,CAAC,EAAE;gBACjB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK;gBACrD,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;aACxD,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;IACF,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACjD,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;AACjE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,KAAY,EAAE,IAA4B;IACnE,MAAM,QAAQ,GAAkB;QAC9B,SAAS,EAAE,IAAI,CAAC,SAAU;QAC1B,IAAI,EAAE,IAAI,CAAC,IAAK;QAChB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,UAAU,EAAE;QACzC,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,IAAI,IAAI,CAAC;QAC/E,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC;IACF,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAY,EAAE,IAA6B;IAC1E,MAAM,SAAS,GAAmB;QAChC,SAAS,EAAE,IAAI,CAAC,SAAU;QAC1B,IAAI,EAAE,IAAI,CAAC,IAAK;QAChB,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,UAAU,EAAE;QACzC,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,IAAI,IAAI,CAAC;QAC/E,aAAa,EAAE,IAAI,CAAC,aAAc;KACnC,CAAC;IACF,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAY,EACZ,OAAuC;IAEvC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACtC,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subscribers Module
|
|
3
|
+
*
|
|
4
|
+
* Provides event subscription handlers for agents and world.
|
|
5
|
+
* Handles message routing, tool result processing, and world activity tracking.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Agent message subscription with automatic response processing
|
|
9
|
+
* - Tool message subscription with security checks
|
|
10
|
+
* - World message subscription for title generation (idle and no-activity user-message fallback)
|
|
11
|
+
* - World activity listener for chat title updates on idle
|
|
12
|
+
* - In-flight title generation guard to avoid duplicate concurrent updates per chat
|
|
13
|
+
*
|
|
14
|
+
* Dependencies (Layer 6):
|
|
15
|
+
* - types.ts (Layer 1)
|
|
16
|
+
* - publishers.ts (Layer 3)
|
|
17
|
+
* - persistence.ts, memory-manager.ts (Layer 4)
|
|
18
|
+
* - orchestrator.ts (Layer 5)
|
|
19
|
+
* - utils.ts, logger.ts
|
|
20
|
+
* - storage (runtime)
|
|
21
|
+
*
|
|
22
|
+
* Changes:
|
|
23
|
+
* - 2026-02-19: Moved chat-title update notifications from `system` to chat `crud` update events.
|
|
24
|
+
* - 2026-02-13: Added no-activity user-message fallback title scheduling to cover edited chats with no agent response.
|
|
25
|
+
* - 2026-02-13: Switched title commit path to compare-and-set storage update to avoid concurrent overwrite races.
|
|
26
|
+
* - 2026-02-13: Added conditional commit checks and in-flight dedupe for idle title updates.
|
|
27
|
+
* - 2026-02-13: Made idle title updates chat-scoped with captured `targetChatId` to prevent cross-session renames.
|
|
28
|
+
* - 2026-02-08: Removed legacy manual tool-intervention request handling from message subscription
|
|
29
|
+
* - 2025-11-09: Extracted from events.ts for modular architecture
|
|
30
|
+
*/
|
|
31
|
+
import type { World, Agent } from '../types.js';
|
|
32
|
+
/**
|
|
33
|
+
* Agent subscription with automatic message processing
|
|
34
|
+
*/
|
|
35
|
+
export declare function subscribeAgentToMessages(world: World, agent: Agent): () => void;
|
|
36
|
+
/**
|
|
37
|
+
* Subscribe world to messages with cleanup function
|
|
38
|
+
*/
|
|
39
|
+
export declare function subscribeWorldToMessages(world: World): () => void;
|
|
40
|
+
/**
|
|
41
|
+
* Setup world activity listener for chat title updates
|
|
42
|
+
* Triggers title generation when world becomes idle (pendingOperations === 0)
|
|
43
|
+
*/
|
|
44
|
+
export declare function setupWorldActivityListener(world: World): () => void;
|
|
45
|
+
//# sourceMappingURL=subscribers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscribers.d.ts","sourceRoot":"","sources":["../../../core/events/subscribers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EACV,KAAK,EACL,KAAK,EAGN,MAAM,aAAa,CAAC;AA6LrB;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,IAAI,CAqE/E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,IAAI,CAWjE;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,IAAI,CAyBnE"}
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subscribers Module
|
|
3
|
+
*
|
|
4
|
+
* Provides event subscription handlers for agents and world.
|
|
5
|
+
* Handles message routing, tool result processing, and world activity tracking.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Agent message subscription with automatic response processing
|
|
9
|
+
* - Tool message subscription with security checks
|
|
10
|
+
* - World message subscription for title generation (idle and no-activity user-message fallback)
|
|
11
|
+
* - World activity listener for chat title updates on idle
|
|
12
|
+
* - In-flight title generation guard to avoid duplicate concurrent updates per chat
|
|
13
|
+
*
|
|
14
|
+
* Dependencies (Layer 6):
|
|
15
|
+
* - types.ts (Layer 1)
|
|
16
|
+
* - publishers.ts (Layer 3)
|
|
17
|
+
* - persistence.ts, memory-manager.ts (Layer 4)
|
|
18
|
+
* - orchestrator.ts (Layer 5)
|
|
19
|
+
* - utils.ts, logger.ts
|
|
20
|
+
* - storage (runtime)
|
|
21
|
+
*
|
|
22
|
+
* Changes:
|
|
23
|
+
* - 2026-02-19: Moved chat-title update notifications from `system` to chat `crud` update events.
|
|
24
|
+
* - 2026-02-13: Added no-activity user-message fallback title scheduling to cover edited chats with no agent response.
|
|
25
|
+
* - 2026-02-13: Switched title commit path to compare-and-set storage update to avoid concurrent overwrite races.
|
|
26
|
+
* - 2026-02-13: Added conditional commit checks and in-flight dedupe for idle title updates.
|
|
27
|
+
* - 2026-02-13: Made idle title updates chat-scoped with captured `targetChatId` to prevent cross-session renames.
|
|
28
|
+
* - 2026-02-08: Removed legacy manual tool-intervention request handling from message subscription
|
|
29
|
+
* - 2025-11-09: Extracted from events.ts for modular architecture
|
|
30
|
+
*/
|
|
31
|
+
import { parseMessageContent } from '../message-prep.js';
|
|
32
|
+
import { extractParagraphBeginningMentions } from '../utils.js';
|
|
33
|
+
import { createCategoryLogger } from '../logger.js';
|
|
34
|
+
import { createStorageWithWrappers } from '../storage/storage-factory.js';
|
|
35
|
+
import { publishCRUDEvent, subscribeToMessages } from './publishers.js';
|
|
36
|
+
import { saveIncomingMessageToMemory, resetLLMCallCountIfNeeded, generateChatTitleFromMessages } from './memory-manager.js';
|
|
37
|
+
import { processAgentMessage, shouldAgentRespond } from './orchestrator.js';
|
|
38
|
+
import { isDefaultChatTitle, NEW_CHAT_TITLE } from '../chat-constants.js';
|
|
39
|
+
const loggerAgent = createCategoryLogger('agent');
|
|
40
|
+
const loggerChatTitle = createCategoryLogger('chattitle');
|
|
41
|
+
const titleGenerationInFlight = new Set();
|
|
42
|
+
const titleGenerationTimers = new Map();
|
|
43
|
+
// Storage wrapper instance - initialized lazily
|
|
44
|
+
let storageWrappers = null;
|
|
45
|
+
async function getStorageWrappers() {
|
|
46
|
+
if (!storageWrappers) {
|
|
47
|
+
storageWrappers = await createStorageWithWrappers();
|
|
48
|
+
}
|
|
49
|
+
return storageWrappers;
|
|
50
|
+
}
|
|
51
|
+
function getTitleGenerationKey(worldId, chatId) {
|
|
52
|
+
return `${worldId}:${chatId}`;
|
|
53
|
+
}
|
|
54
|
+
function isHumanSender(sender) {
|
|
55
|
+
const normalized = String(sender ?? '').trim().toLowerCase();
|
|
56
|
+
return normalized === 'human' || normalized.startsWith('user');
|
|
57
|
+
}
|
|
58
|
+
function toMentionToken(value) {
|
|
59
|
+
return String(value || '')
|
|
60
|
+
.trim()
|
|
61
|
+
.toLowerCase()
|
|
62
|
+
.replace(/[^a-z0-9-_]/g, '-')
|
|
63
|
+
.replace(/-+/g, '-')
|
|
64
|
+
.replace(/^-|-$/g, '');
|
|
65
|
+
}
|
|
66
|
+
function resolveWorldMainAgentMention(world) {
|
|
67
|
+
const raw = String(world.mainAgent || '').trim();
|
|
68
|
+
if (!raw)
|
|
69
|
+
return null;
|
|
70
|
+
const normalized = toMentionToken(raw);
|
|
71
|
+
if (!normalized)
|
|
72
|
+
return null;
|
|
73
|
+
if (world.agents.has(normalized))
|
|
74
|
+
return normalized;
|
|
75
|
+
for (const agent of world.agents.values()) {
|
|
76
|
+
if (toMentionToken(agent.id) === normalized || toMentionToken(agent.name) === normalized) {
|
|
77
|
+
return agent.id;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
function applyMainAgentMentionRouting(world, messageEvent) {
|
|
83
|
+
if (!isHumanSender(messageEvent.sender)) {
|
|
84
|
+
return messageEvent;
|
|
85
|
+
}
|
|
86
|
+
const mainAgent = resolveWorldMainAgentMention(world);
|
|
87
|
+
if (!mainAgent) {
|
|
88
|
+
return messageEvent;
|
|
89
|
+
}
|
|
90
|
+
const mentions = extractParagraphBeginningMentions(messageEvent.content || '');
|
|
91
|
+
if (mentions.length > 0) {
|
|
92
|
+
return messageEvent;
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
...messageEvent,
|
|
96
|
+
content: `@${mainAgent} ${messageEvent.content || ''}`.trim()
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
function scheduleNoActivityTitleUpdate(world, chatId, content) {
|
|
100
|
+
const key = getTitleGenerationKey(world.id, chatId);
|
|
101
|
+
const existingTimer = titleGenerationTimers.get(key);
|
|
102
|
+
if (existingTimer) {
|
|
103
|
+
clearTimeout(existingTimer);
|
|
104
|
+
}
|
|
105
|
+
const timer = setTimeout(async () => {
|
|
106
|
+
titleGenerationTimers.delete(key);
|
|
107
|
+
if (world.isProcessing) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
await tryGenerateAndApplyTitle(world, chatId, content, 'message-no-activity');
|
|
111
|
+
}, 120);
|
|
112
|
+
titleGenerationTimers.set(key, timer);
|
|
113
|
+
}
|
|
114
|
+
async function commitChatTitleIfDefault(world, chatId, nextTitle) {
|
|
115
|
+
const storage = await getStorageWrappers();
|
|
116
|
+
if (typeof storage.updateChatNameIfCurrent === 'function') {
|
|
117
|
+
return storage.updateChatNameIfCurrent(world.id, chatId, NEW_CHAT_TITLE, nextTitle);
|
|
118
|
+
}
|
|
119
|
+
// Legacy fallback when storage backend does not provide compare-and-set helper.
|
|
120
|
+
const persistedChat = await storage.loadChatData(world.id, chatId);
|
|
121
|
+
if (!persistedChat || !isDefaultChatTitle(persistedChat.name)) {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
const updated = await storage.updateChatData(world.id, chatId, { name: nextTitle });
|
|
125
|
+
return !!updated;
|
|
126
|
+
}
|
|
127
|
+
async function tryGenerateAndApplyTitle(world, targetChatId, content, source) {
|
|
128
|
+
const inFlightKey = getTitleGenerationKey(world.id, targetChatId);
|
|
129
|
+
if (titleGenerationInFlight.has(inFlightKey)) {
|
|
130
|
+
loggerChatTitle.debug('Skipping title update because generation is already in flight', {
|
|
131
|
+
worldId: world.id,
|
|
132
|
+
chatId: targetChatId,
|
|
133
|
+
source
|
|
134
|
+
});
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const chat = world.chats.get(targetChatId);
|
|
138
|
+
if (!chat || !isDefaultChatTitle(chat.name)) {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
titleGenerationInFlight.add(inFlightKey);
|
|
142
|
+
try {
|
|
143
|
+
const title = await generateChatTitleFromMessages(world, content, targetChatId);
|
|
144
|
+
if (!title) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
// Re-check in-memory state before commit.
|
|
148
|
+
const currentChat = world.chats.get(targetChatId);
|
|
149
|
+
if (!currentChat || !isDefaultChatTitle(currentChat.name)) {
|
|
150
|
+
loggerChatTitle.debug('Skipping title commit because in-memory chat title is no longer default', {
|
|
151
|
+
worldId: world.id,
|
|
152
|
+
chatId: targetChatId,
|
|
153
|
+
source,
|
|
154
|
+
currentName: currentChat?.name
|
|
155
|
+
});
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
const committed = await commitChatTitleIfDefault(world, targetChatId, title);
|
|
159
|
+
if (!committed) {
|
|
160
|
+
loggerChatTitle.debug('Skipping title commit because persisted chat title no longer matches default', {
|
|
161
|
+
worldId: world.id,
|
|
162
|
+
chatId: targetChatId,
|
|
163
|
+
source
|
|
164
|
+
});
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
currentChat.name = title;
|
|
168
|
+
publishCRUDEvent(world, 'update', 'chat', targetChatId, {
|
|
169
|
+
id: targetChatId,
|
|
170
|
+
name: title,
|
|
171
|
+
source
|
|
172
|
+
}, targetChatId);
|
|
173
|
+
}
|
|
174
|
+
finally {
|
|
175
|
+
titleGenerationInFlight.delete(inFlightKey);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Agent subscription with automatic message processing
|
|
180
|
+
*/
|
|
181
|
+
export function subscribeAgentToMessages(world, agent) {
|
|
182
|
+
const handler = async (messageEvent) => {
|
|
183
|
+
const routedMessageEvent = applyMainAgentMentionRouting(world, messageEvent);
|
|
184
|
+
loggerAgent.debug('[subscribeAgentToMessages] ENTRY - Agent received message', {
|
|
185
|
+
agentId: agent.id,
|
|
186
|
+
sender: routedMessageEvent.sender,
|
|
187
|
+
messageId: routedMessageEvent.messageId,
|
|
188
|
+
contentPreview: routedMessageEvent.content?.substring(0, 200)
|
|
189
|
+
});
|
|
190
|
+
if (!routedMessageEvent.messageId) {
|
|
191
|
+
loggerAgent.error('Received message WITHOUT messageId', {
|
|
192
|
+
agentId: agent.id,
|
|
193
|
+
sender: routedMessageEvent.sender,
|
|
194
|
+
worldId: world.id
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
// Check if this is a tool result message
|
|
198
|
+
// Parse enhanced format first to detect tool messages
|
|
199
|
+
const { message: parsedMessage, targetAgentId } = parseMessageContent(routedMessageEvent.content, 'user');
|
|
200
|
+
loggerAgent.debug('[subscribeAgentToMessages] After parseMessageContent', {
|
|
201
|
+
agentId: agent.id,
|
|
202
|
+
parsedRole: parsedMessage.role,
|
|
203
|
+
targetAgentId,
|
|
204
|
+
toolCallId: parsedMessage.role === 'tool' ? parsedMessage.tool_call_id : undefined,
|
|
205
|
+
isToolMessage: parsedMessage.role === 'tool' && !!parsedMessage.tool_call_id
|
|
206
|
+
});
|
|
207
|
+
// Tool messages are now handled by subscribeAgentToToolMessages (separate handler)
|
|
208
|
+
// This keeps the message handler focused on user/assistant/system messages only
|
|
209
|
+
if (parsedMessage.role === 'tool') {
|
|
210
|
+
loggerAgent.debug('[subscribeAgentToMessages] Skipping tool message - handled by tool handler', {
|
|
211
|
+
agentId: agent.id,
|
|
212
|
+
toolCallId: parsedMessage.tool_call_id
|
|
213
|
+
});
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
// Skip messages from this agent itself
|
|
217
|
+
if (routedMessageEvent.sender === agent.id) {
|
|
218
|
+
loggerAgent.debug('Skipping own message in handler', { agentId: agent.id, sender: routedMessageEvent.sender });
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
// Reset LLM call count if needed (for human/system messages)
|
|
222
|
+
await resetLLMCallCountIfNeeded(world, agent, routedMessageEvent);
|
|
223
|
+
// Process message if agent should respond
|
|
224
|
+
loggerAgent.debug('Checking if agent should respond', { agentId: agent.id, sender: routedMessageEvent.sender });
|
|
225
|
+
const shouldRespond = await shouldAgentRespond(world, agent, routedMessageEvent);
|
|
226
|
+
if (shouldRespond) {
|
|
227
|
+
// Save incoming messages to agent memory only when they plan to respond
|
|
228
|
+
await saveIncomingMessageToMemory(world, agent, routedMessageEvent);
|
|
229
|
+
loggerAgent.debug('Agent will respond - processing message', { agentId: agent.id, sender: routedMessageEvent.sender });
|
|
230
|
+
await processAgentMessage(world, agent, routedMessageEvent);
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
loggerAgent.debug('Agent will NOT respond - skipping memory save and SSE publishing', {
|
|
234
|
+
agentId: agent.id,
|
|
235
|
+
sender: routedMessageEvent.sender
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
};
|
|
239
|
+
return subscribeToMessages(world, handler);
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Subscribe world to messages with cleanup function
|
|
243
|
+
*/
|
|
244
|
+
export function subscribeWorldToMessages(world) {
|
|
245
|
+
return subscribeToMessages(world, async (event) => {
|
|
246
|
+
const targetChatId = event.chatId ?? world.currentChatId ?? null;
|
|
247
|
+
if (!targetChatId)
|
|
248
|
+
return;
|
|
249
|
+
if (!isHumanSender(event.sender))
|
|
250
|
+
return;
|
|
251
|
+
const chat = world.chats.get(targetChatId);
|
|
252
|
+
if (!chat || !isDefaultChatTitle(chat.name))
|
|
253
|
+
return;
|
|
254
|
+
scheduleNoActivityTitleUpdate(world, targetChatId, event.content || '');
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Setup world activity listener for chat title updates
|
|
259
|
+
* Triggers title generation when world becomes idle (pendingOperations === 0)
|
|
260
|
+
*/
|
|
261
|
+
export function setupWorldActivityListener(world) {
|
|
262
|
+
const handler = async (event) => {
|
|
263
|
+
// Only update title when world becomes idle (all agents done)
|
|
264
|
+
if (event.type === 'idle' && event.pendingOperations === 0) {
|
|
265
|
+
const targetChatId = world.currentChatId;
|
|
266
|
+
if (!targetChatId)
|
|
267
|
+
return;
|
|
268
|
+
try {
|
|
269
|
+
await tryGenerateAndApplyTitle(world, targetChatId, '', 'idle');
|
|
270
|
+
}
|
|
271
|
+
catch (err) {
|
|
272
|
+
loggerChatTitle.warn('Activity-based title update failed', { error: err instanceof Error ? err.message : err });
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
world.eventEmitter.on('world', handler);
|
|
277
|
+
return () => {
|
|
278
|
+
world.eventEmitter.off('world', handler);
|
|
279
|
+
for (const [key, timer] of titleGenerationTimers.entries()) {
|
|
280
|
+
if (!key.startsWith(`${world.id}:`)) {
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
clearTimeout(timer);
|
|
284
|
+
titleGenerationTimers.delete(key);
|
|
285
|
+
}
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
//# sourceMappingURL=subscribers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscribers.js","sourceRoot":"","sources":["../../../core/events/subscribers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Bridge Logging Utilities
|
|
3
|
+
*
|
|
4
|
+
* Purpose:
|
|
5
|
+
* Shared LLM↔tool debug logging helpers used by both orchestrator and
|
|
6
|
+
* memory-manager to trace request/result/error handoff payloads.
|
|
7
|
+
*
|
|
8
|
+
* Key Features:
|
|
9
|
+
* - Console-level bridge logs gated by `LOG_LLM_TOOL_BRIDGE` env var
|
|
10
|
+
* - Simplified output showing only type, tool name, and truncated content (100-200 chars)
|
|
11
|
+
* - Safe JSON serialization with fallback to `String()`
|
|
12
|
+
*
|
|
13
|
+
* Implementation Notes:
|
|
14
|
+
* - Extracted from orchestrator.ts and memory-manager.ts to eliminate duplication
|
|
15
|
+
* - Filters verbose metadata, keeps only essential debugging fields
|
|
16
|
+
*
|
|
17
|
+
* Changes:
|
|
18
|
+
* - 2026-02-16: Extracted shared tool-bridge logging utilities from orchestrator
|
|
19
|
+
* and memory-manager into a dedicated module.
|
|
20
|
+
* - 2026-02-17: Simplified logToolBridge to show only type, tool name, and truncated
|
|
21
|
+
* content/args/result (100-300 chars max) for better debugging ergonomics. Removed
|
|
22
|
+
* worldId, agentId, chatId, hopCount, retryCount and other verbose metadata.
|
|
23
|
+
*/
|
|
24
|
+
export declare function safeSerializeForConsole(value: unknown): string;
|
|
25
|
+
export declare function isToolBridgeLoggingEnabled(): boolean;
|
|
26
|
+
export declare function logToolBridge(direction: string, payload: unknown): void;
|
|
27
|
+
export declare function getToolResultPreview(value: unknown): string;
|
|
28
|
+
//# sourceMappingURL=tool-bridge-logging.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-bridge-logging.d.ts","sourceRoot":"","sources":["../../../core/events/tool-bridge-logging.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAM9D;AAED,wBAAgB,0BAA0B,IAAI,OAAO,CAQpD;AAcD,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CA6BvE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAU3D"}
|