agent-world 0.12.3 → 0.15.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 +105 -17
- package/dist/cli/commands.d.ts +7 -1
- package/dist/cli/commands.js +27 -10
- package/dist/cli/hitl.d.ts +9 -2
- package/dist/cli/hitl.js +61 -20
- package/dist/cli/index.js +250 -96
- package/dist/cli/system-events.d.ts +27 -0
- package/dist/cli/system-events.js +63 -0
- package/dist/core/activity-tracker.d.ts +38 -2
- package/dist/core/activity-tracker.d.ts.map +1 -1
- package/dist/core/activity-tracker.js +62 -9
- package/dist/core/activity-tracker.js.map +1 -1
- package/dist/core/anthropic-direct.d.ts +2 -0
- package/dist/core/anthropic-direct.d.ts.map +1 -1
- package/dist/core/anthropic-direct.js +43 -1
- package/dist/core/anthropic-direct.js.map +1 -1
- package/dist/core/chat-constants.d.ts +12 -0
- package/dist/core/chat-constants.d.ts.map +1 -1
- package/dist/core/chat-constants.js +5 -0
- package/dist/core/chat-constants.js.map +1 -1
- package/dist/core/create-agent-tool.d.ts +28 -25
- package/dist/core/create-agent-tool.d.ts.map +1 -1
- package/dist/core/create-agent-tool.js +264 -141
- package/dist/core/create-agent-tool.js.map +1 -1
- package/dist/core/events/index.d.ts +5 -2
- package/dist/core/events/index.d.ts.map +1 -1
- package/dist/core/events/index.js +5 -2
- package/dist/core/events/index.js.map +1 -1
- package/dist/core/events/memory-manager.d.ts +26 -1
- package/dist/core/events/memory-manager.d.ts.map +1 -1
- package/dist/core/events/memory-manager.js +877 -72
- package/dist/core/events/memory-manager.js.map +1 -1
- package/dist/core/events/orchestrator.d.ts +8 -0
- package/dist/core/events/orchestrator.d.ts.map +1 -1
- package/dist/core/events/orchestrator.js +214 -38
- package/dist/core/events/orchestrator.js.map +1 -1
- package/dist/core/events/persistence.d.ts +21 -14
- package/dist/core/events/persistence.d.ts.map +1 -1
- package/dist/core/events/persistence.js +100 -61
- package/dist/core/events/persistence.js.map +1 -1
- package/dist/core/events/publishers.d.ts +13 -16
- package/dist/core/events/publishers.d.ts.map +1 -1
- package/dist/core/events/publishers.js +54 -55
- package/dist/core/events/publishers.js.map +1 -1
- package/dist/core/events/subscribers.d.ts +17 -14
- package/dist/core/events/subscribers.d.ts.map +1 -1
- package/dist/core/events/subscribers.js +68 -147
- package/dist/core/events/subscribers.js.map +1 -1
- package/dist/core/events/title-scheduler.d.ts +27 -0
- package/dist/core/events/title-scheduler.d.ts.map +1 -0
- package/dist/core/events/title-scheduler.js +135 -0
- package/dist/core/events/title-scheduler.js.map +1 -0
- package/dist/core/events/tool-bridge-logging.d.ts +4 -1
- package/dist/core/events/tool-bridge-logging.d.ts.map +1 -1
- package/dist/core/events/tool-bridge-logging.js +112 -13
- package/dist/core/events/tool-bridge-logging.js.map +1 -1
- package/dist/core/events-metadata.d.ts.map +1 -1
- package/dist/core/events-metadata.js +8 -4
- package/dist/core/events-metadata.js.map +1 -1
- package/dist/core/export.d.ts +1 -1
- package/dist/core/export.d.ts.map +1 -1
- package/dist/core/export.js +2 -15
- package/dist/core/export.js.map +1 -1
- package/dist/core/feature-path-logging.d.ts +50 -0
- package/dist/core/feature-path-logging.d.ts.map +1 -0
- package/dist/core/feature-path-logging.js +130 -0
- package/dist/core/feature-path-logging.js.map +1 -0
- package/dist/core/file-tools.d.ts +57 -1
- package/dist/core/file-tools.d.ts.map +1 -1
- package/dist/core/file-tools.js +329 -29
- package/dist/core/file-tools.js.map +1 -1
- package/dist/core/google-direct.d.ts +6 -1
- package/dist/core/google-direct.d.ts.map +1 -1
- package/dist/core/google-direct.js +76 -7
- package/dist/core/google-direct.js.map +1 -1
- package/dist/core/heartbeat.d.ts +34 -0
- package/dist/core/heartbeat.d.ts.map +1 -0
- package/dist/core/heartbeat.js +153 -0
- package/dist/core/heartbeat.js.map +1 -0
- package/dist/core/hitl-tool.d.ts +73 -0
- package/dist/core/hitl-tool.d.ts.map +1 -0
- package/dist/core/hitl-tool.js +284 -0
- package/dist/core/hitl-tool.js.map +1 -0
- package/dist/core/hitl.d.ts +85 -8
- package/dist/core/hitl.d.ts.map +1 -1
- package/dist/core/hitl.js +375 -61
- package/dist/core/hitl.js.map +1 -1
- package/dist/core/index.d.ts +12 -7
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +11 -6
- package/dist/core/index.js.map +1 -1
- package/dist/core/llm-manager.d.ts +17 -0
- package/dist/core/llm-manager.d.ts.map +1 -1
- package/dist/core/llm-manager.js +335 -43
- package/dist/core/llm-manager.js.map +1 -1
- package/dist/core/load-skill-tool.d.ts +36 -3
- package/dist/core/load-skill-tool.d.ts.map +1 -1
- package/dist/core/load-skill-tool.js +807 -93
- package/dist/core/load-skill-tool.js.map +1 -1
- package/dist/core/logger.d.ts +14 -0
- package/dist/core/logger.d.ts.map +1 -1
- package/dist/core/logger.js +15 -0
- package/dist/core/logger.js.map +1 -1
- package/dist/core/managers.d.ts +41 -52
- package/dist/core/managers.d.ts.map +1 -1
- package/dist/core/managers.js +422 -533
- package/dist/core/managers.js.map +1 -1
- package/dist/core/mcp-server-registry.d.ts +19 -2
- package/dist/core/mcp-server-registry.d.ts.map +1 -1
- package/dist/core/mcp-server-registry.js +168 -12
- package/dist/core/mcp-server-registry.js.map +1 -1
- package/dist/core/message-cutoff.d.ts +29 -0
- package/dist/core/message-cutoff.d.ts.map +1 -0
- package/dist/core/message-cutoff.js +63 -0
- package/dist/core/message-cutoff.js.map +1 -0
- package/dist/core/message-edit-manager.d.ts +54 -0
- package/dist/core/message-edit-manager.d.ts.map +1 -0
- package/dist/core/message-edit-manager.js +602 -0
- package/dist/core/message-edit-manager.js.map +1 -0
- package/dist/core/message-prep.d.ts +2 -0
- package/dist/core/message-prep.d.ts.map +1 -1
- package/dist/core/message-prep.js +39 -12
- package/dist/core/message-prep.js.map +1 -1
- package/dist/core/message-processing-control.d.ts +1 -0
- package/dist/core/message-processing-control.d.ts.map +1 -1
- package/dist/core/message-processing-control.js +23 -6
- package/dist/core/message-processing-control.js.map +1 -1
- package/dist/core/openai-direct.d.ts +9 -3
- package/dist/core/openai-direct.d.ts.map +1 -1
- package/dist/core/openai-direct.js +267 -33
- package/dist/core/openai-direct.js.map +1 -1
- package/dist/core/optional-tracers/opik-runtime.d.ts +32 -0
- package/dist/core/optional-tracers/opik-runtime.d.ts.map +1 -0
- package/dist/core/optional-tracers/opik-runtime.js +141 -0
- package/dist/core/optional-tracers/opik-runtime.js.map +1 -0
- package/dist/core/queue-manager.d.ts +84 -0
- package/dist/core/queue-manager.d.ts.map +1 -0
- package/dist/core/queue-manager.js +814 -0
- package/dist/core/queue-manager.js.map +1 -0
- package/dist/core/reasoning-controls.d.ts +30 -0
- package/dist/core/reasoning-controls.d.ts.map +1 -0
- package/dist/core/reasoning-controls.js +118 -0
- package/dist/core/reasoning-controls.js.map +1 -0
- package/dist/core/reliability-config.d.ts +82 -0
- package/dist/core/reliability-config.d.ts.map +1 -0
- package/dist/core/reliability-config.js +106 -0
- package/dist/core/reliability-config.js.map +1 -0
- package/dist/core/reliability-runtime.d.ts +53 -0
- package/dist/core/reliability-runtime.d.ts.map +1 -0
- package/dist/core/reliability-runtime.js +92 -0
- package/dist/core/reliability-runtime.js.map +1 -0
- package/dist/core/security/guardrails.d.ts +21 -0
- package/dist/core/security/guardrails.d.ts.map +1 -0
- package/dist/core/security/guardrails.js +111 -0
- package/dist/core/security/guardrails.js.map +1 -0
- package/dist/core/send-message-tool.d.ts +79 -0
- package/dist/core/send-message-tool.d.ts.map +1 -0
- package/dist/core/send-message-tool.js +222 -0
- package/dist/core/send-message-tool.js.map +1 -0
- package/dist/core/shell-cmd-tool.d.ts +82 -1
- package/dist/core/shell-cmd-tool.d.ts.map +1 -1
- package/dist/core/shell-cmd-tool.js +854 -42
- package/dist/core/shell-cmd-tool.js.map +1 -1
- package/dist/core/skill-registry.d.ts +2 -0
- package/dist/core/skill-registry.d.ts.map +1 -1
- package/dist/core/skill-registry.js +52 -2
- package/dist/core/skill-registry.js.map +1 -1
- package/dist/core/storage/eventStorage/fileEventStorage.d.ts +5 -0
- package/dist/core/storage/eventStorage/fileEventStorage.d.ts.map +1 -1
- package/dist/core/storage/eventStorage/fileEventStorage.js +61 -0
- package/dist/core/storage/eventStorage/fileEventStorage.js.map +1 -1
- package/dist/core/storage/eventStorage/memoryEventStorage.d.ts +5 -0
- package/dist/core/storage/eventStorage/memoryEventStorage.d.ts.map +1 -1
- package/dist/core/storage/eventStorage/memoryEventStorage.js +34 -0
- package/dist/core/storage/eventStorage/memoryEventStorage.js.map +1 -1
- package/dist/core/storage/eventStorage/sqliteEventStorage.d.ts +1 -0
- package/dist/core/storage/eventStorage/sqliteEventStorage.d.ts.map +1 -1
- package/dist/core/storage/eventStorage/sqliteEventStorage.js +19 -2
- package/dist/core/storage/eventStorage/sqliteEventStorage.js.map +1 -1
- package/dist/core/storage/eventStorage/types.d.ts +6 -0
- package/dist/core/storage/eventStorage/types.d.ts.map +1 -1
- package/dist/core/storage/eventStorage/types.js +1 -0
- package/dist/core/storage/eventStorage/types.js.map +1 -1
- package/dist/core/storage/eventStorage/validation.d.ts.map +1 -1
- package/dist/core/storage/eventStorage/validation.js +2 -1
- package/dist/core/storage/eventStorage/validation.js.map +1 -1
- package/dist/core/storage/github-world-import.d.ts +84 -0
- package/dist/core/storage/github-world-import.d.ts.map +1 -0
- package/dist/core/storage/github-world-import.js +365 -0
- package/dist/core/storage/github-world-import.js.map +1 -0
- package/dist/core/storage/memory-storage.d.ts +19 -8
- package/dist/core/storage/memory-storage.d.ts.map +1 -1
- package/dist/core/storage/memory-storage.js +147 -49
- package/dist/core/storage/memory-storage.js.map +1 -1
- package/dist/core/storage/queue-storage.d.ts +1 -0
- package/dist/core/storage/queue-storage.d.ts.map +1 -1
- package/dist/core/storage/queue-storage.js +3 -2
- package/dist/core/storage/queue-storage.js.map +1 -1
- package/dist/core/storage/sqlite-storage.d.ts +14 -9
- package/dist/core/storage/sqlite-storage.d.ts.map +1 -1
- package/dist/core/storage/sqlite-storage.js +131 -154
- package/dist/core/storage/sqlite-storage.js.map +1 -1
- package/dist/core/storage/storage-factory.d.ts +3 -0
- package/dist/core/storage/storage-factory.d.ts.map +1 -1
- package/dist/core/storage/storage-factory.js +175 -89
- package/dist/core/storage/storage-factory.js.map +1 -1
- package/dist/core/storage/world-storage.d.ts +1 -1
- package/dist/core/storage/world-storage.d.ts.map +1 -1
- package/dist/core/storage/world-storage.js +5 -1
- package/dist/core/storage/world-storage.js.map +1 -1
- package/dist/core/storage-init.d.ts +11 -0
- package/dist/core/storage-init.d.ts.map +1 -0
- package/dist/core/storage-init.js +122 -0
- package/dist/core/storage-init.js.map +1 -0
- package/dist/core/subscription.d.ts +8 -1
- package/dist/core/subscription.d.ts.map +1 -1
- package/dist/core/subscription.js +130 -23
- package/dist/core/subscription.js.map +1 -1
- package/dist/core/tool-approval.d.ts +45 -0
- package/dist/core/tool-approval.d.ts.map +1 -0
- package/dist/core/tool-approval.js +223 -0
- package/dist/core/tool-approval.js.map +1 -0
- package/dist/core/tool-execution-envelope.d.ts +87 -0
- package/dist/core/tool-execution-envelope.d.ts.map +1 -0
- package/dist/core/tool-execution-envelope.js +168 -0
- package/dist/core/tool-execution-envelope.js.map +1 -0
- package/dist/core/tool-utils.d.ts +9 -2
- package/dist/core/tool-utils.d.ts.map +1 -1
- package/dist/core/tool-utils.js +122 -28
- package/dist/core/tool-utils.js.map +1 -1
- package/dist/core/types.d.ts +69 -36
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +3 -2
- package/dist/core/types.js.map +1 -1
- package/dist/core/utils.d.ts +16 -0
- package/dist/core/utils.d.ts.map +1 -1
- package/dist/core/utils.js +99 -24
- package/dist/core/utils.js.map +1 -1
- package/dist/core/web-fetch-tool.d.ts +72 -0
- package/dist/core/web-fetch-tool.d.ts.map +1 -0
- package/dist/core/web-fetch-tool.js +491 -0
- package/dist/core/web-fetch-tool.js.map +1 -0
- package/dist/core/world-registry.d.ts +84 -0
- package/dist/core/world-registry.d.ts.map +1 -0
- package/dist/core/world-registry.js +247 -0
- package/dist/core/world-registry.js.map +1 -0
- package/dist/public/assets/index-Be-1xtV-.js +104 -0
- package/dist/public/assets/index-tsDdiXDU.css +1 -0
- package/dist/public/index.html +2 -2
- package/dist/public/mcp-sandbox-proxy.html +148 -0
- package/dist/server/api.js +288 -58
- package/dist/server/error-response.d.ts +27 -0
- package/dist/server/error-response.js +77 -0
- package/dist/server/index.d.ts +2 -1
- package/dist/server/index.js +6 -2
- package/dist/server/sse-handler.d.ts +13 -2
- package/dist/server/sse-handler.js +194 -26
- package/migrations/0015_add_message_queue.sql +36 -0
- package/migrations/0016_add_world_heartbeat.sql +13 -0
- package/migrations/0017_add_title_provenance.sql +7 -0
- package/package.json +31 -10
- package/dist/public/assets/index-BO20H4xt.js +0 -96
- package/dist/public/assets/index-ETY7W5_S.css +0 -1
|
@@ -6,13 +6,14 @@
|
|
|
6
6
|
* - Message publishing with chat session management
|
|
7
7
|
* - SSE event publishing for streaming
|
|
8
8
|
* - Tool event publishing for agent behaviors
|
|
9
|
-
* - CRUD event publishing for configuration changes
|
|
10
9
|
*
|
|
11
10
|
* Implementation Notes:
|
|
12
11
|
* - Uses parseMessageContent to preserve enhanced tool-result protocol support
|
|
13
12
|
* - Emits events synchronously through world-scoped EventEmitter channels
|
|
14
13
|
*
|
|
15
14
|
* Recent Changes:
|
|
15
|
+
* - 2026-03-13: Preserved optional SSE `reasoningContent` so reasoning tokens survive world-scoped event publication.
|
|
16
|
+
* - 2026-03-06: Required explicit `chatId` for message/system/SSE/tool publication; removed `world.currentChatId` fallback from event emitters.
|
|
16
17
|
* - 2026-02-13: Added optional explicit `chatId` override for `publishEvent` to preserve session context across async flows.
|
|
17
18
|
* - 2026-02-13: Added chat-scoped tool-event propagation (`chatId`) so realtime tool updates remain session-isolated.
|
|
18
19
|
* - 2026-02-11: Fixed publishSSE to include toolName and stream fields for tool-stream events
|
|
@@ -21,7 +22,6 @@
|
|
|
21
22
|
*
|
|
22
23
|
* All functions emit events synchronously and return immediately
|
|
23
24
|
*/
|
|
24
|
-
import { EventType } from '../types.js';
|
|
25
25
|
import { generateId } from '../utils.js';
|
|
26
26
|
import { parseMessageContent } from '../message-prep.js';
|
|
27
27
|
import { createCategoryLogger } from '../logger.js';
|
|
@@ -52,35 +52,47 @@ export function normalizeSender(sender) {
|
|
|
52
52
|
return 'world';
|
|
53
53
|
return trimmed;
|
|
54
54
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
55
|
+
function resolveRequiredChatId(chatId, callsite) {
|
|
56
|
+
const explicitChatId = typeof chatId === 'string' ? chatId.trim() : '';
|
|
57
|
+
if (explicitChatId)
|
|
58
|
+
return explicitChatId;
|
|
59
|
+
throw new Error(`${callsite}: explicit chatId is required.`);
|
|
60
|
+
}
|
|
61
|
+
function buildWorldMessageEvent(params) {
|
|
62
|
+
const normalizedSender = normalizeSender(params.sender);
|
|
63
|
+
const { message: parsedMsg } = parseMessageContent(params.content, 'user');
|
|
64
|
+
let role;
|
|
65
|
+
if (parsedMsg.role === 'tool') {
|
|
66
|
+
role = 'tool';
|
|
67
|
+
}
|
|
68
|
+
else if (normalizedSender === 'human' || normalizedSender.startsWith('user')) {
|
|
69
|
+
role = 'user';
|
|
70
|
+
}
|
|
71
|
+
else if (normalizedSender === 'system' || normalizedSender === 'world') {
|
|
72
|
+
role = normalizedSender;
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
role = parsedMsg.role === 'assistant' ? 'assistant' : 'assistant';
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
content: params.content,
|
|
79
|
+
sender: normalizedSender,
|
|
68
80
|
timestamp: new Date(),
|
|
69
|
-
|
|
81
|
+
messageId: params.messageId,
|
|
82
|
+
chatId: params.chatId,
|
|
83
|
+
replyToMessageId: params.replyToMessageId,
|
|
84
|
+
...(role ? { role } : {}),
|
|
85
|
+
...(Array.isArray(parsedMsg.tool_calls) ? { tool_calls: parsedMsg.tool_calls } : {}),
|
|
86
|
+
...(typeof parsedMsg.tool_call_id === 'string' && parsedMsg.tool_call_id.trim()
|
|
87
|
+
? { tool_call_id: parsedMsg.tool_call_id.trim() }
|
|
88
|
+
: {}),
|
|
70
89
|
};
|
|
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
90
|
}
|
|
79
91
|
/**
|
|
80
92
|
* Publish event to a specific channel using World.eventEmitter
|
|
81
93
|
*/
|
|
82
94
|
export function publishEvent(world, type, content, chatId) {
|
|
83
|
-
const targetChatId = chatId
|
|
95
|
+
const targetChatId = resolveRequiredChatId(chatId, 'publishEvent');
|
|
84
96
|
const event = {
|
|
85
97
|
content,
|
|
86
98
|
timestamp: new Date(),
|
|
@@ -94,12 +106,12 @@ export function publishEvent(world, type, content, chatId) {
|
|
|
94
106
|
* Parses enhanced string protocol and automatically prepends @mention if agentId detected
|
|
95
107
|
* Returns the messageEvent so callers can access the generated messageId
|
|
96
108
|
*
|
|
97
|
-
* @param chatId -
|
|
109
|
+
* @param chatId - Explicit chat ID for concurrency-safe routing
|
|
98
110
|
* @param replyToMessageId - Optional parent message ID for threading
|
|
99
111
|
*/
|
|
100
112
|
export function publishMessage(world, content, sender, chatId, replyToMessageId) {
|
|
101
113
|
const messageId = generateId();
|
|
102
|
-
const targetChatId = chatId
|
|
114
|
+
const targetChatId = resolveRequiredChatId(chatId, 'publishMessage');
|
|
103
115
|
const normalizedSender = normalizeSender(sender);
|
|
104
116
|
loggerMemory.debug('[publishMessage] ENTRY', {
|
|
105
117
|
sender,
|
|
@@ -134,31 +146,17 @@ export function publishMessage(world, content, sender, chatId, replyToMessageId)
|
|
|
134
146
|
messageId
|
|
135
147
|
});
|
|
136
148
|
}
|
|
137
|
-
|
|
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 = {
|
|
149
|
+
const messageEvent = buildWorldMessageEvent({
|
|
150
150
|
content: finalContent,
|
|
151
151
|
sender: normalizedSender,
|
|
152
|
-
role,
|
|
153
|
-
timestamp: new Date(),
|
|
154
152
|
messageId,
|
|
155
153
|
chatId: targetChatId,
|
|
156
|
-
replyToMessageId
|
|
157
|
-
};
|
|
154
|
+
replyToMessageId,
|
|
155
|
+
});
|
|
158
156
|
loggerMemory.debug('[publishMessage] Generated messageId', {
|
|
159
157
|
messageId,
|
|
160
158
|
sender: normalizedSender,
|
|
161
|
-
role,
|
|
159
|
+
role: messageEvent.role,
|
|
162
160
|
worldId: world.id,
|
|
163
161
|
chatId: targetChatId,
|
|
164
162
|
hasAgentId: !!targetAgentId,
|
|
@@ -167,7 +165,7 @@ export function publishMessage(world, content, sender, chatId, replyToMessageId)
|
|
|
167
165
|
loggerMemory.debug('[publishMessage] Emitting message event', {
|
|
168
166
|
messageId,
|
|
169
167
|
sender: normalizedSender,
|
|
170
|
-
role,
|
|
168
|
+
role: messageEvent.role,
|
|
171
169
|
chatId: targetChatId,
|
|
172
170
|
contentPreview: finalContent.substring(0, 100)
|
|
173
171
|
});
|
|
@@ -179,20 +177,18 @@ export function publishMessage(world, content, sender, chatId, replyToMessageId)
|
|
|
179
177
|
* Message publishing with pre-generated messageId
|
|
180
178
|
* Used when messageId needs to be known before publishing (e.g., for agent responses)
|
|
181
179
|
*
|
|
182
|
-
* @param chatId -
|
|
180
|
+
* @param chatId - Explicit chat ID for concurrency-safe routing
|
|
183
181
|
* @param replyToMessageId - Optional parent message ID for threading
|
|
184
182
|
*/
|
|
185
183
|
export function publishMessageWithId(world, content, sender, messageId, chatId, replyToMessageId) {
|
|
186
|
-
const targetChatId = chatId
|
|
187
|
-
const
|
|
188
|
-
const messageEvent = {
|
|
184
|
+
const targetChatId = resolveRequiredChatId(chatId, 'publishMessageWithId');
|
|
185
|
+
const messageEvent = buildWorldMessageEvent({
|
|
189
186
|
content,
|
|
190
|
-
sender
|
|
191
|
-
timestamp: new Date(),
|
|
187
|
+
sender,
|
|
192
188
|
messageId,
|
|
193
189
|
chatId: targetChatId,
|
|
194
|
-
replyToMessageId
|
|
195
|
-
};
|
|
190
|
+
replyToMessageId,
|
|
191
|
+
});
|
|
196
192
|
world.eventEmitter.emit('message', messageEvent);
|
|
197
193
|
return messageEvent;
|
|
198
194
|
}
|
|
@@ -234,13 +230,15 @@ export function subscribeToMessages(world, handler) {
|
|
|
234
230
|
* SSE events using World.eventEmitter (for LLM streaming)
|
|
235
231
|
*/
|
|
236
232
|
export function publishSSE(world, data) {
|
|
233
|
+
const targetChatId = resolveRequiredChatId(data.chatId, 'publishSSE');
|
|
237
234
|
const sseEvent = {
|
|
238
235
|
agentName: data.agentName,
|
|
239
236
|
type: data.type,
|
|
240
237
|
content: data.content,
|
|
238
|
+
reasoningContent: data.reasoningContent,
|
|
241
239
|
error: data.error,
|
|
242
240
|
messageId: data.messageId || generateId(),
|
|
243
|
-
chatId:
|
|
241
|
+
chatId: targetChatId,
|
|
244
242
|
usage: data.usage,
|
|
245
243
|
logEvent: data.logEvent,
|
|
246
244
|
tool_calls: data.tool_calls,
|
|
@@ -253,11 +251,12 @@ export function publishSSE(world, data) {
|
|
|
253
251
|
* Tool events using World.eventEmitter (for agent behavioral events)
|
|
254
252
|
*/
|
|
255
253
|
export function publishToolEvent(world, data) {
|
|
254
|
+
const targetChatId = resolveRequiredChatId(data.chatId, 'publishToolEvent');
|
|
256
255
|
const toolEvent = {
|
|
257
256
|
agentName: data.agentName,
|
|
258
257
|
type: data.type,
|
|
259
258
|
messageId: data.messageId || generateId(),
|
|
260
|
-
chatId:
|
|
259
|
+
chatId: targetChatId,
|
|
261
260
|
toolExecution: data.toolExecution
|
|
262
261
|
};
|
|
263
262
|
world.eventEmitter.emit('world', toolEvent);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publishers.js","sourceRoot":"","sources":["../../../core/events/publishers.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"publishers.js","sourceRoot":"","sources":["../../../core/events/publishers.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,26 +7,28 @@
|
|
|
7
7
|
* Features:
|
|
8
8
|
* - Agent message subscription with automatic response processing
|
|
9
9
|
* - Tool message subscription with security checks
|
|
10
|
-
* - World message subscription
|
|
11
|
-
* - World activity listener
|
|
12
|
-
*
|
|
10
|
+
* - World message subscription: idempotent wrapper for world-level message listeners.
|
|
11
|
+
* - World activity listener: idempotent wrapper — no-op when setupEventPersistence has run;
|
|
12
|
+
* standalone fallback path delegates idle-title logic to title-scheduler.ts.
|
|
13
13
|
*
|
|
14
14
|
* Dependencies (Layer 6):
|
|
15
15
|
* - types.ts (Layer 1)
|
|
16
16
|
* - publishers.ts (Layer 3)
|
|
17
|
-
* - persistence.ts, memory-manager.ts (Layer 4)
|
|
17
|
+
* - persistence.ts, memory-manager.ts, title-scheduler.ts (Layer 4)
|
|
18
18
|
* - orchestrator.ts (Layer 5)
|
|
19
19
|
* - utils.ts, logger.ts
|
|
20
|
-
* - storage (runtime)
|
|
21
20
|
*
|
|
22
21
|
* Changes:
|
|
23
|
-
* - 2026-
|
|
24
|
-
* -
|
|
25
|
-
* - 2026-
|
|
26
|
-
* - 2026-
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* -
|
|
22
|
+
* - 2026-03-10: Removed standalone world-message title scheduling so idle activity is the sole
|
|
23
|
+
* automatic chat-title trigger.
|
|
24
|
+
* - 2026-03-06: Removed `world.currentChatId` fallback from world-message title scheduling; chat-scoped handlers now require explicit `event.chatId`.
|
|
25
|
+
* - 2026-03-03: Removed private title-scheduling logic (moved to title-scheduler.ts Layer 4).
|
|
26
|
+
* subscribeWorldToMessages and setupWorldActivityListener are now idempotent wrappers that
|
|
27
|
+
* short-circuit when setupEventPersistence has already registered a combined handler.
|
|
28
|
+
* - 2026-02-28: Made world message subscription idempotent.
|
|
29
|
+
* - 2026-02-22: Persist incoming human messages to agent memory even when agents do not respond.
|
|
30
|
+
* - 2026-02-20: Publish chat-title update notifications as structured `system` events.
|
|
31
|
+
* - 2025-11-09: Extracted from events.ts for modular architecture.
|
|
30
32
|
*/
|
|
31
33
|
import type { World, Agent } from '../types.js';
|
|
32
34
|
/**
|
|
@@ -38,7 +40,8 @@ export declare function subscribeAgentToMessages(world: World, agent: Agent): ()
|
|
|
38
40
|
*/
|
|
39
41
|
export declare function subscribeWorldToMessages(world: World): () => void;
|
|
40
42
|
/**
|
|
41
|
-
* Setup world activity listener for chat title updates
|
|
42
|
-
*
|
|
43
|
+
* Setup world activity listener for idle-triggered chat title updates.
|
|
44
|
+
* Idempotent — returns existing cleanup handle if setupEventPersistence already registered
|
|
45
|
+
* a combined 'world' handler for this world.
|
|
43
46
|
*/
|
|
44
47
|
export declare function setupWorldActivityListener(world: World): () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscribers.d.ts","sourceRoot":"","sources":["../../../core/events/subscribers.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"subscribers.d.ts","sourceRoot":"","sources":["../../../core/events/subscribers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EACV,KAAK,EACL,KAAK,EAEN,MAAM,aAAa,CAAC;AAkErB;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,IAAI,CA4F/E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,IAAI,CAmBjE;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,IAAI,CAsBnE"}
|
|
@@ -7,54 +7,37 @@
|
|
|
7
7
|
* Features:
|
|
8
8
|
* - Agent message subscription with automatic response processing
|
|
9
9
|
* - Tool message subscription with security checks
|
|
10
|
-
* - World message subscription
|
|
11
|
-
* - World activity listener
|
|
12
|
-
*
|
|
10
|
+
* - World message subscription: idempotent wrapper for world-level message listeners.
|
|
11
|
+
* - World activity listener: idempotent wrapper — no-op when setupEventPersistence has run;
|
|
12
|
+
* standalone fallback path delegates idle-title logic to title-scheduler.ts.
|
|
13
13
|
*
|
|
14
14
|
* Dependencies (Layer 6):
|
|
15
15
|
* - types.ts (Layer 1)
|
|
16
16
|
* - publishers.ts (Layer 3)
|
|
17
|
-
* - persistence.ts, memory-manager.ts (Layer 4)
|
|
17
|
+
* - persistence.ts, memory-manager.ts, title-scheduler.ts (Layer 4)
|
|
18
18
|
* - orchestrator.ts (Layer 5)
|
|
19
19
|
* - utils.ts, logger.ts
|
|
20
|
-
* - storage (runtime)
|
|
21
20
|
*
|
|
22
21
|
* Changes:
|
|
23
|
-
* - 2026-
|
|
24
|
-
* -
|
|
25
|
-
* - 2026-
|
|
26
|
-
* - 2026-
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* -
|
|
22
|
+
* - 2026-03-10: Removed standalone world-message title scheduling so idle activity is the sole
|
|
23
|
+
* automatic chat-title trigger.
|
|
24
|
+
* - 2026-03-06: Removed `world.currentChatId` fallback from world-message title scheduling; chat-scoped handlers now require explicit `event.chatId`.
|
|
25
|
+
* - 2026-03-03: Removed private title-scheduling logic (moved to title-scheduler.ts Layer 4).
|
|
26
|
+
* subscribeWorldToMessages and setupWorldActivityListener are now idempotent wrappers that
|
|
27
|
+
* short-circuit when setupEventPersistence has already registered a combined handler.
|
|
28
|
+
* - 2026-02-28: Made world message subscription idempotent.
|
|
29
|
+
* - 2026-02-22: Persist incoming human messages to agent memory even when agents do not respond.
|
|
30
|
+
* - 2026-02-20: Publish chat-title update notifications as structured `system` events.
|
|
31
|
+
* - 2025-11-09: Extracted from events.ts for modular architecture.
|
|
30
32
|
*/
|
|
31
33
|
import { parseMessageContent } from '../message-prep.js';
|
|
32
34
|
import { extractParagraphBeginningMentions } from '../utils.js';
|
|
33
35
|
import { createCategoryLogger } from '../logger.js';
|
|
34
|
-
import {
|
|
35
|
-
import {
|
|
36
|
-
import { saveIncomingMessageToMemory, resetLLMCallCountIfNeeded, generateChatTitleFromMessages } from './memory-manager.js';
|
|
36
|
+
import { subscribeToMessages } from './publishers.js';
|
|
37
|
+
import { saveIncomingMessageToMemory, resetLLMCallCountIfNeeded } from './memory-manager.js';
|
|
37
38
|
import { processAgentMessage, shouldAgentRespond } from './orchestrator.js';
|
|
38
|
-
import {
|
|
39
|
+
import { isHumanSender, runIdleTitleUpdate, clearWorldTitleTimers } from './title-scheduler.js';
|
|
39
40
|
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
41
|
function toMentionToken(value) {
|
|
59
42
|
return String(value || '')
|
|
60
43
|
.trim()
|
|
@@ -96,89 +79,19 @@ function applyMainAgentMentionRouting(world, messageEvent) {
|
|
|
96
79
|
content: `@${mainAgent} ${messageEvent.content || ''}`.trim()
|
|
97
80
|
};
|
|
98
81
|
}
|
|
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
82
|
/**
|
|
179
83
|
* Agent subscription with automatic message processing
|
|
180
84
|
*/
|
|
181
85
|
export function subscribeAgentToMessages(world, agent) {
|
|
86
|
+
const existingUnsubscribe = world._agentUnsubscribers?.get(agent.id);
|
|
87
|
+
if (typeof existingUnsubscribe === 'function') {
|
|
88
|
+
try {
|
|
89
|
+
existingUnsubscribe();
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// Best-effort cleanup before rebinding the same agent listener.
|
|
93
|
+
}
|
|
94
|
+
}
|
|
182
95
|
const handler = async (messageEvent) => {
|
|
183
96
|
const routedMessageEvent = applyMainAgentMentionRouting(world, messageEvent);
|
|
184
97
|
loggerAgent.debug('[subscribeAgentToMessages] ENTRY - Agent received message', {
|
|
@@ -220,12 +133,17 @@ export function subscribeAgentToMessages(world, agent) {
|
|
|
220
133
|
}
|
|
221
134
|
// Reset LLM call count if needed (for human/system messages)
|
|
222
135
|
await resetLLMCallCountIfNeeded(world, agent, routedMessageEvent);
|
|
136
|
+
const isIncomingHumanMessage = isHumanSender(routedMessageEvent.sender);
|
|
137
|
+
if (isIncomingHumanMessage) {
|
|
138
|
+
await saveIncomingMessageToMemory(world, agent, routedMessageEvent);
|
|
139
|
+
}
|
|
223
140
|
// Process message if agent should respond
|
|
224
141
|
loggerAgent.debug('Checking if agent should respond', { agentId: agent.id, sender: routedMessageEvent.sender });
|
|
225
142
|
const shouldRespond = await shouldAgentRespond(world, agent, routedMessageEvent);
|
|
226
143
|
if (shouldRespond) {
|
|
227
|
-
|
|
228
|
-
|
|
144
|
+
if (!isIncomingHumanMessage) {
|
|
145
|
+
await saveIncomingMessageToMemory(world, agent, routedMessageEvent);
|
|
146
|
+
}
|
|
229
147
|
loggerAgent.debug('Agent will respond - processing message', { agentId: agent.id, sender: routedMessageEvent.sender });
|
|
230
148
|
await processAgentMessage(world, agent, routedMessageEvent);
|
|
231
149
|
}
|
|
@@ -236,52 +154,55 @@ export function subscribeAgentToMessages(world, agent) {
|
|
|
236
154
|
});
|
|
237
155
|
}
|
|
238
156
|
};
|
|
239
|
-
|
|
157
|
+
const unsubscribe = subscribeToMessages(world, handler);
|
|
158
|
+
// Track the unsubscribe function so deleteAgent can remove this listener.
|
|
159
|
+
if (!world._agentUnsubscribers) {
|
|
160
|
+
world._agentUnsubscribers = new Map();
|
|
161
|
+
}
|
|
162
|
+
world._agentUnsubscribers.set(agent.id, unsubscribe);
|
|
163
|
+
return unsubscribe;
|
|
240
164
|
}
|
|
241
165
|
/**
|
|
242
166
|
* Subscribe world to messages with cleanup function
|
|
243
167
|
*/
|
|
244
168
|
export function subscribeWorldToMessages(world) {
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
return;
|
|
251
|
-
const chat = world.chats.get(targetChatId);
|
|
252
|
-
if (!chat || !isDefaultChatTitle(chat.name))
|
|
253
|
-
return;
|
|
254
|
-
scheduleNoActivityTitleUpdate(world, targetChatId, event.content || '');
|
|
169
|
+
if (typeof world._worldMessagesUnsubscriber === 'function') {
|
|
170
|
+
return world._worldMessagesUnsubscriber;
|
|
171
|
+
}
|
|
172
|
+
const unsubscribe = subscribeToMessages(world, (_event) => {
|
|
173
|
+
return;
|
|
255
174
|
});
|
|
175
|
+
const trackedUnsubscribe = () => {
|
|
176
|
+
unsubscribe();
|
|
177
|
+
clearWorldTitleTimers(world.id);
|
|
178
|
+
if (world._worldMessagesUnsubscriber === trackedUnsubscribe) {
|
|
179
|
+
world._worldMessagesUnsubscriber = undefined;
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
world._worldMessagesUnsubscriber = trackedUnsubscribe;
|
|
183
|
+
return trackedUnsubscribe;
|
|
256
184
|
}
|
|
257
185
|
/**
|
|
258
|
-
* Setup world activity listener for chat title updates
|
|
259
|
-
*
|
|
186
|
+
* Setup world activity listener for idle-triggered chat title updates.
|
|
187
|
+
* Idempotent — returns existing cleanup handle if setupEventPersistence already registered
|
|
188
|
+
* a combined 'world' handler for this world.
|
|
260
189
|
*/
|
|
261
190
|
export function setupWorldActivityListener(world) {
|
|
191
|
+
if (typeof world._activityListenerCleanup === 'function') {
|
|
192
|
+
return world._activityListenerCleanup;
|
|
193
|
+
}
|
|
194
|
+
// Standalone fallback: persistence is disabled, attach a lightweight idle handler.
|
|
262
195
|
const handler = async (event) => {
|
|
263
|
-
|
|
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
|
-
}
|
|
196
|
+
await runIdleTitleUpdate(world, event);
|
|
275
197
|
};
|
|
276
198
|
world.eventEmitter.on('world', handler);
|
|
277
|
-
|
|
199
|
+
const cleanup = () => {
|
|
278
200
|
world.eventEmitter.off('world', handler);
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
}
|
|
283
|
-
clearTimeout(timer);
|
|
284
|
-
titleGenerationTimers.delete(key);
|
|
201
|
+
clearWorldTitleTimers(world.id);
|
|
202
|
+
if (world._activityListenerCleanup === cleanup) {
|
|
203
|
+
world._activityListenerCleanup = undefined;
|
|
285
204
|
}
|
|
286
205
|
};
|
|
206
|
+
world._activityListenerCleanup = cleanup;
|
|
207
|
+
return cleanup;
|
|
287
208
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscribers.js","sourceRoot":"","sources":["../../../core/events/subscribers.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"subscribers.js","sourceRoot":"","sources":["../../../core/events/subscribers.ts"],"names":[],"mappings":"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"}
|