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.
Files changed (267) hide show
  1. package/README.md +17 -7
  2. package/dist/cli/commands.d.ts +109 -0
  3. package/dist/cli/commands.js +2024 -0
  4. package/dist/cli/display.d.ts +124 -0
  5. package/dist/cli/display.js +381 -0
  6. package/dist/cli/hitl.d.ts +33 -0
  7. package/dist/cli/hitl.js +81 -0
  8. package/dist/cli/index.d.ts +2 -0
  9. package/dist/cli/stream.d.ts +41 -0
  10. package/dist/cli/stream.js +222 -0
  11. package/dist/core/activity-tracker.d.ts +16 -0
  12. package/dist/core/activity-tracker.d.ts.map +1 -0
  13. package/dist/core/activity-tracker.js +91 -0
  14. package/dist/core/activity-tracker.js.map +1 -0
  15. package/dist/core/ai-commands.d.ts +16 -0
  16. package/dist/core/ai-commands.d.ts.map +1 -0
  17. package/dist/core/ai-commands.js +24 -0
  18. package/dist/core/ai-commands.js.map +1 -0
  19. package/dist/core/ai-sdk-patch.d.ts +24 -0
  20. package/dist/core/ai-sdk-patch.d.ts.map +1 -0
  21. package/dist/core/ai-sdk-patch.js +169 -0
  22. package/dist/core/ai-sdk-patch.js.map +1 -0
  23. package/dist/core/anthropic-direct.d.ts +52 -0
  24. package/dist/core/anthropic-direct.d.ts.map +1 -0
  25. package/dist/core/anthropic-direct.js +301 -0
  26. package/dist/core/anthropic-direct.js.map +1 -0
  27. package/dist/core/approval-cache.d.ts +104 -0
  28. package/dist/core/approval-cache.d.ts.map +1 -0
  29. package/dist/core/approval-cache.js +150 -0
  30. package/dist/core/approval-cache.js.map +1 -0
  31. package/dist/core/chat-constants.d.ts +20 -0
  32. package/dist/core/chat-constants.d.ts.map +1 -0
  33. package/dist/core/chat-constants.js +22 -0
  34. package/dist/core/chat-constants.js.map +1 -0
  35. package/dist/core/create-agent-tool.d.ts +66 -0
  36. package/dist/core/create-agent-tool.d.ts.map +1 -0
  37. package/dist/core/create-agent-tool.js +212 -0
  38. package/dist/core/create-agent-tool.js.map +1 -0
  39. package/dist/core/events/approval-checker.d.ts +61 -0
  40. package/dist/core/events/approval-checker.d.ts.map +1 -0
  41. package/dist/core/events/approval-checker.js +226 -0
  42. package/dist/core/events/approval-checker.js.map +1 -0
  43. package/dist/core/events/index.d.ts +25 -0
  44. package/dist/core/events/index.d.ts.map +1 -0
  45. package/dist/core/events/index.js +30 -0
  46. package/dist/core/events/index.js.map +1 -0
  47. package/dist/core/events/memory-manager.d.ts +73 -0
  48. package/dist/core/events/memory-manager.d.ts.map +1 -0
  49. package/dist/core/events/memory-manager.js +1218 -0
  50. package/dist/core/events/memory-manager.js.map +1 -0
  51. package/dist/core/events/mention-logic.d.ts +39 -0
  52. package/dist/core/events/mention-logic.d.ts.map +1 -0
  53. package/dist/core/events/mention-logic.js +163 -0
  54. package/dist/core/events/mention-logic.js.map +1 -0
  55. package/dist/core/events/orchestrator.d.ts +69 -0
  56. package/dist/core/events/orchestrator.d.ts.map +1 -0
  57. package/dist/core/events/orchestrator.js +883 -0
  58. package/dist/core/events/orchestrator.js.map +1 -0
  59. package/dist/core/events/persistence.d.ts +41 -0
  60. package/dist/core/events/persistence.d.ts.map +1 -0
  61. package/dist/core/events/persistence.js +296 -0
  62. package/dist/core/events/persistence.js.map +1 -0
  63. package/dist/core/events/publishers.d.ts +81 -0
  64. package/dist/core/events/publishers.d.ts.map +1 -0
  65. package/dist/core/events/publishers.js +272 -0
  66. package/dist/core/events/publishers.js.map +1 -0
  67. package/dist/core/events/subscribers.d.ts +45 -0
  68. package/dist/core/events/subscribers.d.ts.map +1 -0
  69. package/dist/core/events/subscribers.js +288 -0
  70. package/dist/core/events/subscribers.js.map +1 -0
  71. package/dist/core/events/tool-bridge-logging.d.ts +28 -0
  72. package/dist/core/events/tool-bridge-logging.d.ts.map +1 -0
  73. package/dist/core/events/tool-bridge-logging.js +94 -0
  74. package/dist/core/events/tool-bridge-logging.js.map +1 -0
  75. package/dist/core/events-metadata.d.ts +72 -0
  76. package/dist/core/events-metadata.d.ts.map +1 -0
  77. package/dist/core/events-metadata.js +167 -0
  78. package/dist/core/events-metadata.js.map +1 -0
  79. package/dist/core/events.d.ts +186 -0
  80. package/dist/core/events.d.ts.map +1 -0
  81. package/dist/core/events.js +1248 -0
  82. package/dist/core/events.js.map +1 -0
  83. package/dist/core/export.d.ts +106 -0
  84. package/dist/core/export.d.ts.map +1 -0
  85. package/dist/core/export.js +705 -0
  86. package/dist/core/export.js.map +1 -0
  87. package/dist/core/file-tools.d.ts +114 -0
  88. package/dist/core/file-tools.d.ts.map +1 -0
  89. package/dist/core/file-tools.js +370 -0
  90. package/dist/core/file-tools.js.map +1 -0
  91. package/dist/core/google-direct.d.ts +58 -0
  92. package/dist/core/google-direct.d.ts.map +1 -0
  93. package/dist/core/google-direct.js +298 -0
  94. package/dist/core/google-direct.js.map +1 -0
  95. package/dist/core/hitl.d.ts +54 -0
  96. package/dist/core/hitl.d.ts.map +1 -0
  97. package/dist/core/hitl.js +153 -0
  98. package/dist/core/hitl.js.map +1 -0
  99. package/dist/core/index.d.ts +59 -0
  100. package/dist/core/index.d.ts.map +1 -0
  101. package/dist/core/index.js +70 -0
  102. package/dist/core/index.js.map +1 -0
  103. package/dist/core/llm-config.d.ts +128 -0
  104. package/dist/core/llm-config.d.ts.map +1 -0
  105. package/dist/core/llm-config.js +164 -0
  106. package/dist/core/llm-config.js.map +1 -0
  107. package/dist/core/llm-manager.d.ts +163 -0
  108. package/dist/core/llm-manager.d.ts.map +1 -0
  109. package/dist/core/llm-manager.js +669 -0
  110. package/dist/core/llm-manager.js.map +1 -0
  111. package/dist/core/load-skill-tool.d.ts +55 -0
  112. package/dist/core/load-skill-tool.d.ts.map +1 -0
  113. package/dist/core/load-skill-tool.js +468 -0
  114. package/dist/core/load-skill-tool.js.map +1 -0
  115. package/dist/core/logger.d.ts +88 -0
  116. package/dist/core/logger.d.ts.map +1 -0
  117. package/dist/core/logger.js +358 -0
  118. package/dist/core/logger.js.map +1 -0
  119. package/dist/core/managers.d.ts +131 -0
  120. package/dist/core/managers.d.ts.map +1 -0
  121. package/dist/core/managers.js +1223 -0
  122. package/dist/core/managers.js.map +1 -0
  123. package/dist/core/mcp-server-registry.d.ts +304 -0
  124. package/dist/core/mcp-server-registry.d.ts.map +1 -0
  125. package/dist/core/mcp-server-registry.js +1769 -0
  126. package/dist/core/mcp-server-registry.js.map +1 -0
  127. package/dist/core/mcp-tools.d.ts +56 -0
  128. package/dist/core/mcp-tools.d.ts.map +1 -0
  129. package/dist/core/mcp-tools.js +186 -0
  130. package/dist/core/mcp-tools.js.map +1 -0
  131. package/dist/core/message-prep.d.ts +81 -0
  132. package/dist/core/message-prep.d.ts.map +1 -0
  133. package/dist/core/message-prep.js +223 -0
  134. package/dist/core/message-prep.js.map +1 -0
  135. package/dist/core/message-processing-control.d.ts +54 -0
  136. package/dist/core/message-processing-control.d.ts.map +1 -0
  137. package/dist/core/message-processing-control.js +139 -0
  138. package/dist/core/message-processing-control.js.map +1 -0
  139. package/dist/core/openai-direct.d.ts +80 -0
  140. package/dist/core/openai-direct.d.ts.map +1 -0
  141. package/dist/core/openai-direct.js +374 -0
  142. package/dist/core/openai-direct.js.map +1 -0
  143. package/dist/core/shell-cmd-tool.d.ts +235 -0
  144. package/dist/core/shell-cmd-tool.d.ts.map +1 -0
  145. package/dist/core/shell-cmd-tool.js +1157 -0
  146. package/dist/core/shell-cmd-tool.js.map +1 -0
  147. package/dist/core/shell-process-registry.d.ts +88 -0
  148. package/dist/core/shell-process-registry.d.ts.map +1 -0
  149. package/dist/core/shell-process-registry.js +309 -0
  150. package/dist/core/shell-process-registry.js.map +1 -0
  151. package/dist/core/skill-registry.d.ts +75 -0
  152. package/dist/core/skill-registry.d.ts.map +1 -0
  153. package/dist/core/skill-registry.js +369 -0
  154. package/dist/core/skill-registry.js.map +1 -0
  155. package/dist/core/skill-script-runner.d.ts +89 -0
  156. package/dist/core/skill-script-runner.d.ts.map +1 -0
  157. package/dist/core/skill-script-runner.js +274 -0
  158. package/dist/core/skill-script-runner.js.map +1 -0
  159. package/dist/core/skill-selector.d.ts +65 -0
  160. package/dist/core/skill-selector.d.ts.map +1 -0
  161. package/dist/core/skill-selector.js +190 -0
  162. package/dist/core/skill-selector.js.map +1 -0
  163. package/dist/core/skill-settings.d.ts +20 -0
  164. package/dist/core/skill-settings.d.ts.map +1 -0
  165. package/dist/core/skill-settings.js +40 -0
  166. package/dist/core/skill-settings.js.map +1 -0
  167. package/dist/core/storage/agent-storage.d.ts +134 -0
  168. package/dist/core/storage/agent-storage.d.ts.map +1 -0
  169. package/dist/core/storage/agent-storage.js +498 -0
  170. package/dist/core/storage/agent-storage.js.map +1 -0
  171. package/dist/core/storage/eventStorage/fileEventStorage.d.ts +100 -0
  172. package/dist/core/storage/eventStorage/fileEventStorage.d.ts.map +1 -0
  173. package/dist/core/storage/eventStorage/fileEventStorage.js +494 -0
  174. package/dist/core/storage/eventStorage/fileEventStorage.js.map +1 -0
  175. package/dist/core/storage/eventStorage/index.d.ts +31 -0
  176. package/dist/core/storage/eventStorage/index.d.ts.map +1 -0
  177. package/dist/core/storage/eventStorage/index.js +31 -0
  178. package/dist/core/storage/eventStorage/index.js.map +1 -0
  179. package/dist/core/storage/eventStorage/memoryEventStorage.d.ts +87 -0
  180. package/dist/core/storage/eventStorage/memoryEventStorage.d.ts.map +1 -0
  181. package/dist/core/storage/eventStorage/memoryEventStorage.js +244 -0
  182. package/dist/core/storage/eventStorage/memoryEventStorage.js.map +1 -0
  183. package/dist/core/storage/eventStorage/sqliteEventStorage.d.ts +45 -0
  184. package/dist/core/storage/eventStorage/sqliteEventStorage.d.ts.map +1 -0
  185. package/dist/core/storage/eventStorage/sqliteEventStorage.js +301 -0
  186. package/dist/core/storage/eventStorage/sqliteEventStorage.js.map +1 -0
  187. package/dist/core/storage/eventStorage/types.d.ts +142 -0
  188. package/dist/core/storage/eventStorage/types.d.ts.map +1 -0
  189. package/dist/core/storage/eventStorage/types.js +43 -0
  190. package/dist/core/storage/eventStorage/types.js.map +1 -0
  191. package/dist/core/storage/eventStorage/validation.d.ts +30 -0
  192. package/dist/core/storage/eventStorage/validation.d.ts.map +1 -0
  193. package/dist/core/storage/eventStorage/validation.js +68 -0
  194. package/dist/core/storage/eventStorage/validation.js.map +1 -0
  195. package/dist/core/storage/legacy-migrations.d.ts +45 -0
  196. package/dist/core/storage/legacy-migrations.d.ts.map +1 -0
  197. package/dist/core/storage/legacy-migrations.js +295 -0
  198. package/dist/core/storage/legacy-migrations.js.map +1 -0
  199. package/dist/core/storage/memory-storage.d.ts +105 -0
  200. package/dist/core/storage/memory-storage.d.ts.map +1 -0
  201. package/dist/core/storage/memory-storage.js +415 -0
  202. package/dist/core/storage/memory-storage.js.map +1 -0
  203. package/dist/core/storage/migration-runner.d.ts +96 -0
  204. package/dist/core/storage/migration-runner.d.ts.map +1 -0
  205. package/dist/core/storage/migration-runner.js +306 -0
  206. package/dist/core/storage/migration-runner.js.map +1 -0
  207. package/dist/core/storage/queue-storage.d.ts +147 -0
  208. package/dist/core/storage/queue-storage.d.ts.map +1 -0
  209. package/dist/core/storage/queue-storage.js +290 -0
  210. package/dist/core/storage/queue-storage.js.map +1 -0
  211. package/dist/core/storage/skill-storage.d.ts +136 -0
  212. package/dist/core/storage/skill-storage.d.ts.map +1 -0
  213. package/dist/core/storage/skill-storage.js +474 -0
  214. package/dist/core/storage/skill-storage.js.map +1 -0
  215. package/dist/core/storage/sqlite-schema.d.ts +95 -0
  216. package/dist/core/storage/sqlite-schema.d.ts.map +1 -0
  217. package/dist/core/storage/sqlite-schema.js +156 -0
  218. package/dist/core/storage/sqlite-schema.js.map +1 -0
  219. package/dist/core/storage/sqlite-storage.d.ts +146 -0
  220. package/dist/core/storage/sqlite-storage.d.ts.map +1 -0
  221. package/dist/core/storage/sqlite-storage.js +709 -0
  222. package/dist/core/storage/sqlite-storage.js.map +1 -0
  223. package/dist/core/storage/storage-factory.d.ts +61 -0
  224. package/dist/core/storage/storage-factory.d.ts.map +1 -0
  225. package/dist/core/storage/storage-factory.js +794 -0
  226. package/dist/core/storage/storage-factory.js.map +1 -0
  227. package/dist/core/storage/validation.d.ts +36 -0
  228. package/dist/core/storage/validation.d.ts.map +1 -0
  229. package/dist/core/storage/validation.js +79 -0
  230. package/dist/core/storage/validation.js.map +1 -0
  231. package/dist/core/storage/world-storage.d.ts +114 -0
  232. package/dist/core/storage/world-storage.d.ts.map +1 -0
  233. package/dist/core/storage/world-storage.js +378 -0
  234. package/dist/core/storage/world-storage.js.map +1 -0
  235. package/dist/core/subscription.d.ts +43 -0
  236. package/dist/core/subscription.d.ts.map +1 -0
  237. package/dist/core/subscription.js +227 -0
  238. package/dist/core/subscription.js.map +1 -0
  239. package/dist/core/tool-utils.d.ts +80 -0
  240. package/dist/core/tool-utils.d.ts.map +1 -0
  241. package/dist/core/tool-utils.js +273 -0
  242. package/dist/core/tool-utils.js.map +1 -0
  243. package/dist/core/types.d.ts +595 -0
  244. package/dist/core/types.d.ts.map +1 -0
  245. package/dist/core/types.js +158 -0
  246. package/dist/core/types.js.map +1 -0
  247. package/dist/core/utils.d.ts +138 -0
  248. package/dist/core/utils.d.ts.map +1 -0
  249. package/dist/core/utils.js +478 -0
  250. package/dist/core/utils.js.map +1 -0
  251. package/dist/core/world-class.d.ts +43 -0
  252. package/dist/core/world-class.d.ts.map +1 -0
  253. package/dist/core/world-class.js +90 -0
  254. package/dist/core/world-class.js.map +1 -0
  255. package/dist/index.d.ts +18 -0
  256. package/dist/public/assets/agent-sprites-DJFgj-zP.png +0 -0
  257. package/dist/public/assets/border-KHK37r8y.svg +83 -0
  258. package/dist/public/assets/index-C9kPXL6G.css +1 -0
  259. package/dist/public/assets/index-DOQEHGWt.js +96 -0
  260. package/dist/public/index.html +21 -0
  261. package/dist/server/api.d.ts +2 -0
  262. package/dist/server/api.js +1124 -0
  263. package/dist/server/index.d.ts +29 -0
  264. package/dist/server/sse-handler.d.ts +62 -0
  265. package/dist/server/sse-handler.js +234 -0
  266. package/package.json +15 -3
  267. 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":"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"}
@@ -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"}