agent-world 0.13.0 → 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.
Files changed (263) hide show
  1. package/README.md +90 -17
  2. package/dist/cli/commands.d.ts +7 -1
  3. package/dist/cli/commands.js +27 -10
  4. package/dist/cli/hitl.d.ts +4 -1
  5. package/dist/cli/hitl.js +55 -20
  6. package/dist/cli/index.js +249 -97
  7. package/dist/cli/system-events.d.ts +27 -0
  8. package/dist/cli/system-events.js +63 -0
  9. package/dist/core/activity-tracker.d.ts +26 -0
  10. package/dist/core/activity-tracker.d.ts.map +1 -1
  11. package/dist/core/activity-tracker.js +21 -4
  12. package/dist/core/activity-tracker.js.map +1 -1
  13. package/dist/core/anthropic-direct.d.ts +2 -0
  14. package/dist/core/anthropic-direct.d.ts.map +1 -1
  15. package/dist/core/anthropic-direct.js +43 -1
  16. package/dist/core/anthropic-direct.js.map +1 -1
  17. package/dist/core/chat-constants.d.ts +12 -0
  18. package/dist/core/chat-constants.d.ts.map +1 -1
  19. package/dist/core/chat-constants.js +5 -0
  20. package/dist/core/chat-constants.js.map +1 -1
  21. package/dist/core/create-agent-tool.d.ts +5 -0
  22. package/dist/core/create-agent-tool.d.ts.map +1 -1
  23. package/dist/core/create-agent-tool.js +57 -34
  24. package/dist/core/create-agent-tool.js.map +1 -1
  25. package/dist/core/events/index.d.ts +5 -2
  26. package/dist/core/events/index.d.ts.map +1 -1
  27. package/dist/core/events/index.js +5 -2
  28. package/dist/core/events/index.js.map +1 -1
  29. package/dist/core/events/memory-manager.d.ts +26 -1
  30. package/dist/core/events/memory-manager.d.ts.map +1 -1
  31. package/dist/core/events/memory-manager.js +877 -72
  32. package/dist/core/events/memory-manager.js.map +1 -1
  33. package/dist/core/events/orchestrator.d.ts +8 -0
  34. package/dist/core/events/orchestrator.d.ts.map +1 -1
  35. package/dist/core/events/orchestrator.js +203 -36
  36. package/dist/core/events/orchestrator.js.map +1 -1
  37. package/dist/core/events/persistence.d.ts +21 -14
  38. package/dist/core/events/persistence.d.ts.map +1 -1
  39. package/dist/core/events/persistence.js +100 -35
  40. package/dist/core/events/persistence.js.map +1 -1
  41. package/dist/core/events/publishers.d.ts +13 -7
  42. package/dist/core/events/publishers.d.ts.map +1 -1
  43. package/dist/core/events/publishers.js +53 -37
  44. package/dist/core/events/publishers.js.map +1 -1
  45. package/dist/core/events/subscribers.d.ts +17 -14
  46. package/dist/core/events/subscribers.d.ts.map +1 -1
  47. package/dist/core/events/subscribers.js +61 -148
  48. package/dist/core/events/subscribers.js.map +1 -1
  49. package/dist/core/events/title-scheduler.d.ts +27 -0
  50. package/dist/core/events/title-scheduler.d.ts.map +1 -0
  51. package/dist/core/events/title-scheduler.js +135 -0
  52. package/dist/core/events/title-scheduler.js.map +1 -0
  53. package/dist/core/events/tool-bridge-logging.d.ts +4 -1
  54. package/dist/core/events/tool-bridge-logging.d.ts.map +1 -1
  55. package/dist/core/events/tool-bridge-logging.js +112 -13
  56. package/dist/core/events/tool-bridge-logging.js.map +1 -1
  57. package/dist/core/events-metadata.d.ts.map +1 -1
  58. package/dist/core/events-metadata.js +8 -4
  59. package/dist/core/events-metadata.js.map +1 -1
  60. package/dist/core/export.d.ts +1 -1
  61. package/dist/core/export.d.ts.map +1 -1
  62. package/dist/core/export.js +2 -15
  63. package/dist/core/export.js.map +1 -1
  64. package/dist/core/feature-path-logging.d.ts +50 -0
  65. package/dist/core/feature-path-logging.d.ts.map +1 -0
  66. package/dist/core/feature-path-logging.js +130 -0
  67. package/dist/core/feature-path-logging.js.map +1 -0
  68. package/dist/core/file-tools.d.ts +57 -1
  69. package/dist/core/file-tools.d.ts.map +1 -1
  70. package/dist/core/file-tools.js +329 -29
  71. package/dist/core/file-tools.js.map +1 -1
  72. package/dist/core/google-direct.d.ts +6 -1
  73. package/dist/core/google-direct.d.ts.map +1 -1
  74. package/dist/core/google-direct.js +76 -7
  75. package/dist/core/google-direct.js.map +1 -1
  76. package/dist/core/heartbeat.d.ts +34 -0
  77. package/dist/core/heartbeat.d.ts.map +1 -0
  78. package/dist/core/heartbeat.js +153 -0
  79. package/dist/core/heartbeat.js.map +1 -0
  80. package/dist/core/hitl-tool.d.ts +6 -12
  81. package/dist/core/hitl-tool.d.ts.map +1 -1
  82. package/dist/core/hitl-tool.js +66 -88
  83. package/dist/core/hitl-tool.js.map +1 -1
  84. package/dist/core/hitl.d.ts +61 -4
  85. package/dist/core/hitl.d.ts.map +1 -1
  86. package/dist/core/hitl.js +324 -60
  87. package/dist/core/hitl.js.map +1 -1
  88. package/dist/core/index.d.ts +11 -7
  89. package/dist/core/index.d.ts.map +1 -1
  90. package/dist/core/index.js +10 -6
  91. package/dist/core/index.js.map +1 -1
  92. package/dist/core/llm-manager.d.ts +15 -0
  93. package/dist/core/llm-manager.d.ts.map +1 -1
  94. package/dist/core/llm-manager.js +325 -40
  95. package/dist/core/llm-manager.js.map +1 -1
  96. package/dist/core/load-skill-tool.d.ts +36 -3
  97. package/dist/core/load-skill-tool.d.ts.map +1 -1
  98. package/dist/core/load-skill-tool.js +807 -93
  99. package/dist/core/load-skill-tool.js.map +1 -1
  100. package/dist/core/logger.d.ts +14 -0
  101. package/dist/core/logger.d.ts.map +1 -1
  102. package/dist/core/logger.js +15 -0
  103. package/dist/core/logger.js.map +1 -1
  104. package/dist/core/managers.d.ts +18 -50
  105. package/dist/core/managers.d.ts.map +1 -1
  106. package/dist/core/managers.js +340 -502
  107. package/dist/core/managers.js.map +1 -1
  108. package/dist/core/mcp-server-registry.d.ts +16 -1
  109. package/dist/core/mcp-server-registry.d.ts.map +1 -1
  110. package/dist/core/mcp-server-registry.js +162 -12
  111. package/dist/core/mcp-server-registry.js.map +1 -1
  112. package/dist/core/message-cutoff.d.ts +29 -0
  113. package/dist/core/message-cutoff.d.ts.map +1 -0
  114. package/dist/core/message-cutoff.js +63 -0
  115. package/dist/core/message-cutoff.js.map +1 -0
  116. package/dist/core/message-edit-manager.d.ts +54 -0
  117. package/dist/core/message-edit-manager.d.ts.map +1 -0
  118. package/dist/core/message-edit-manager.js +602 -0
  119. package/dist/core/message-edit-manager.js.map +1 -0
  120. package/dist/core/message-prep.d.ts +2 -0
  121. package/dist/core/message-prep.d.ts.map +1 -1
  122. package/dist/core/message-prep.js +39 -12
  123. package/dist/core/message-prep.js.map +1 -1
  124. package/dist/core/message-processing-control.d.ts +1 -0
  125. package/dist/core/message-processing-control.d.ts.map +1 -1
  126. package/dist/core/message-processing-control.js +23 -6
  127. package/dist/core/message-processing-control.js.map +1 -1
  128. package/dist/core/openai-direct.d.ts +9 -3
  129. package/dist/core/openai-direct.d.ts.map +1 -1
  130. package/dist/core/openai-direct.js +267 -33
  131. package/dist/core/openai-direct.js.map +1 -1
  132. package/dist/core/optional-tracers/opik-runtime.d.ts +32 -0
  133. package/dist/core/optional-tracers/opik-runtime.d.ts.map +1 -0
  134. package/dist/core/optional-tracers/opik-runtime.js +141 -0
  135. package/dist/core/optional-tracers/opik-runtime.js.map +1 -0
  136. package/dist/core/queue-manager.d.ts +84 -0
  137. package/dist/core/queue-manager.d.ts.map +1 -0
  138. package/dist/core/queue-manager.js +814 -0
  139. package/dist/core/queue-manager.js.map +1 -0
  140. package/dist/core/reasoning-controls.d.ts +30 -0
  141. package/dist/core/reasoning-controls.d.ts.map +1 -0
  142. package/dist/core/reasoning-controls.js +118 -0
  143. package/dist/core/reasoning-controls.js.map +1 -0
  144. package/dist/core/reliability-config.d.ts +82 -0
  145. package/dist/core/reliability-config.d.ts.map +1 -0
  146. package/dist/core/reliability-config.js +106 -0
  147. package/dist/core/reliability-config.js.map +1 -0
  148. package/dist/core/reliability-runtime.d.ts +53 -0
  149. package/dist/core/reliability-runtime.d.ts.map +1 -0
  150. package/dist/core/reliability-runtime.js +92 -0
  151. package/dist/core/reliability-runtime.js.map +1 -0
  152. package/dist/core/security/guardrails.d.ts +21 -0
  153. package/dist/core/security/guardrails.d.ts.map +1 -0
  154. package/dist/core/security/guardrails.js +111 -0
  155. package/dist/core/security/guardrails.js.map +1 -0
  156. package/dist/core/send-message-tool.d.ts +79 -0
  157. package/dist/core/send-message-tool.d.ts.map +1 -0
  158. package/dist/core/send-message-tool.js +222 -0
  159. package/dist/core/send-message-tool.js.map +1 -0
  160. package/dist/core/shell-cmd-tool.d.ts +82 -1
  161. package/dist/core/shell-cmd-tool.d.ts.map +1 -1
  162. package/dist/core/shell-cmd-tool.js +854 -42
  163. package/dist/core/shell-cmd-tool.js.map +1 -1
  164. package/dist/core/skill-registry.d.ts +2 -0
  165. package/dist/core/skill-registry.d.ts.map +1 -1
  166. package/dist/core/skill-registry.js +52 -2
  167. package/dist/core/skill-registry.js.map +1 -1
  168. package/dist/core/storage/eventStorage/fileEventStorage.d.ts +5 -0
  169. package/dist/core/storage/eventStorage/fileEventStorage.d.ts.map +1 -1
  170. package/dist/core/storage/eventStorage/fileEventStorage.js +61 -0
  171. package/dist/core/storage/eventStorage/fileEventStorage.js.map +1 -1
  172. package/dist/core/storage/eventStorage/memoryEventStorage.d.ts +5 -0
  173. package/dist/core/storage/eventStorage/memoryEventStorage.d.ts.map +1 -1
  174. package/dist/core/storage/eventStorage/memoryEventStorage.js +34 -0
  175. package/dist/core/storage/eventStorage/memoryEventStorage.js.map +1 -1
  176. package/dist/core/storage/eventStorage/sqliteEventStorage.d.ts +1 -0
  177. package/dist/core/storage/eventStorage/sqliteEventStorage.d.ts.map +1 -1
  178. package/dist/core/storage/eventStorage/sqliteEventStorage.js +19 -2
  179. package/dist/core/storage/eventStorage/sqliteEventStorage.js.map +1 -1
  180. package/dist/core/storage/eventStorage/types.d.ts +6 -0
  181. package/dist/core/storage/eventStorage/types.d.ts.map +1 -1
  182. package/dist/core/storage/eventStorage/types.js +1 -0
  183. package/dist/core/storage/eventStorage/types.js.map +1 -1
  184. package/dist/core/storage/eventStorage/validation.d.ts.map +1 -1
  185. package/dist/core/storage/eventStorage/validation.js +2 -1
  186. package/dist/core/storage/eventStorage/validation.js.map +1 -1
  187. package/dist/core/storage/github-world-import.d.ts +84 -0
  188. package/dist/core/storage/github-world-import.d.ts.map +1 -0
  189. package/dist/core/storage/github-world-import.js +365 -0
  190. package/dist/core/storage/github-world-import.js.map +1 -0
  191. package/dist/core/storage/memory-storage.d.ts +19 -8
  192. package/dist/core/storage/memory-storage.d.ts.map +1 -1
  193. package/dist/core/storage/memory-storage.js +147 -49
  194. package/dist/core/storage/memory-storage.js.map +1 -1
  195. package/dist/core/storage/queue-storage.d.ts +1 -0
  196. package/dist/core/storage/queue-storage.d.ts.map +1 -1
  197. package/dist/core/storage/queue-storage.js +3 -2
  198. package/dist/core/storage/queue-storage.js.map +1 -1
  199. package/dist/core/storage/sqlite-storage.d.ts +14 -9
  200. package/dist/core/storage/sqlite-storage.d.ts.map +1 -1
  201. package/dist/core/storage/sqlite-storage.js +131 -154
  202. package/dist/core/storage/sqlite-storage.js.map +1 -1
  203. package/dist/core/storage/storage-factory.d.ts +3 -0
  204. package/dist/core/storage/storage-factory.d.ts.map +1 -1
  205. package/dist/core/storage/storage-factory.js +175 -89
  206. package/dist/core/storage/storage-factory.js.map +1 -1
  207. package/dist/core/storage/world-storage.d.ts +1 -1
  208. package/dist/core/storage/world-storage.d.ts.map +1 -1
  209. package/dist/core/storage/world-storage.js +5 -1
  210. package/dist/core/storage/world-storage.js.map +1 -1
  211. package/dist/core/storage-init.d.ts +11 -0
  212. package/dist/core/storage-init.d.ts.map +1 -0
  213. package/dist/core/storage-init.js +122 -0
  214. package/dist/core/storage-init.js.map +1 -0
  215. package/dist/core/subscription.d.ts +8 -1
  216. package/dist/core/subscription.d.ts.map +1 -1
  217. package/dist/core/subscription.js +130 -23
  218. package/dist/core/subscription.js.map +1 -1
  219. package/dist/core/tool-approval.d.ts +45 -0
  220. package/dist/core/tool-approval.d.ts.map +1 -0
  221. package/dist/core/tool-approval.js +223 -0
  222. package/dist/core/tool-approval.js.map +1 -0
  223. package/dist/core/tool-execution-envelope.d.ts +87 -0
  224. package/dist/core/tool-execution-envelope.d.ts.map +1 -0
  225. package/dist/core/tool-execution-envelope.js +168 -0
  226. package/dist/core/tool-execution-envelope.js.map +1 -0
  227. package/dist/core/tool-utils.d.ts +7 -2
  228. package/dist/core/tool-utils.d.ts.map +1 -1
  229. package/dist/core/tool-utils.js +81 -17
  230. package/dist/core/tool-utils.js.map +1 -1
  231. package/dist/core/types.d.ts +67 -19
  232. package/dist/core/types.d.ts.map +1 -1
  233. package/dist/core/types.js +3 -0
  234. package/dist/core/types.js.map +1 -1
  235. package/dist/core/utils.d.ts +7 -0
  236. package/dist/core/utils.d.ts.map +1 -1
  237. package/dist/core/utils.js +71 -21
  238. package/dist/core/utils.js.map +1 -1
  239. package/dist/core/web-fetch-tool.d.ts +72 -0
  240. package/dist/core/web-fetch-tool.d.ts.map +1 -0
  241. package/dist/core/web-fetch-tool.js +491 -0
  242. package/dist/core/web-fetch-tool.js.map +1 -0
  243. package/dist/core/world-registry.d.ts +84 -0
  244. package/dist/core/world-registry.d.ts.map +1 -0
  245. package/dist/core/world-registry.js +247 -0
  246. package/dist/core/world-registry.js.map +1 -0
  247. package/dist/public/assets/index-Be-1xtV-.js +104 -0
  248. package/dist/public/assets/index-tsDdiXDU.css +1 -0
  249. package/dist/public/index.html +2 -2
  250. package/dist/public/mcp-sandbox-proxy.html +148 -0
  251. package/dist/server/api.js +260 -18
  252. package/dist/server/error-response.d.ts +27 -0
  253. package/dist/server/error-response.js +77 -0
  254. package/dist/server/index.d.ts +2 -1
  255. package/dist/server/index.js +6 -2
  256. package/dist/server/sse-handler.d.ts +11 -1
  257. package/dist/server/sse-handler.js +194 -34
  258. package/migrations/0015_add_message_queue.sql +36 -0
  259. package/migrations/0016_add_world_heartbeat.sql +13 -0
  260. package/migrations/0017_add_title_provenance.sql +7 -0
  261. package/package.json +31 -10
  262. package/dist/public/assets/index-BW41BxMy.css +0 -1
  263. package/dist/public/assets/index-kO6UJFwK.js +0 -96
@@ -0,0 +1,602 @@
1
+ /**
2
+ * Message Edit Manager Module
3
+ *
4
+ * Purpose: Message editing, removal, timestamp-based cutoff, migration, and error
5
+ * logging for the user message edit feature.
6
+ *
7
+ * Key features:
8
+ * - migrateMessageIds: Idempotent migration that assigns stable nanoid values to
9
+ * messages that pre-date the per-message ID feature.
10
+ * - removeMessagesFrom: Multi-pass cutoff deletion — discovers the earliest timestamp
11
+ * of the target message across all agents, then removes that message and all later
12
+ * messages from every agent's memory in the target chat.
13
+ * - editUserMessage: Combined remove + resubmit operation with title-reset / rollback
14
+ * semantics and active subscription preference.
15
+ * - logEditError / getEditErrors: Persist/load a bounded (100-entry) error log using
16
+ * StorageAPI optional saveEditErrors/loadEditErrors methods.
17
+ * - syncRuntimeAgentMemoryFromStorage: Re-hydrate in-memory agent.memory from storage
18
+ * after edit; exported for use in managers.ts activateChatResources.
19
+ *
20
+ * Notes:
21
+ * - migrateMessageIds and removeMessagesFrom avoid calling getWorld() entirely; they
22
+ * use storageWrappers!.worldExists() + storageWrappers!.listAgents() to prevent a
23
+ * static cycle with managers.ts.
24
+ * - editUserMessage needs the full runtime World object for subscription + event wiring,
25
+ * so it uses a dynamic import of getWorld from managers.js.
26
+ * - subscription.js imports managers.ts, so all getActiveSubscribedWorld calls remain
27
+ * dynamic imports.
28
+ * - logEditError / getEditErrors no longer use raw fs.* or path.*; they route through
29
+ * StorageAPI optional methods with a [] fallback when unavailable.
30
+ *
31
+ * Recent Changes:
32
+ * - 2026-03-10: Narrowed edit/delete cleanup to the removed tail only; no longer clears unrelated queued turns, and now drops persisted post-cutoff chat events so stale system errors do not reappear after refresh.
33
+ * - 2026-03-10: Routed edit resubmission through the canonical queue-backed `enqueueAndProcessUserTurn` path.
34
+ * - 2026-03-09: Extracted from managers.ts as part of god-module decomposition.
35
+ * - logEditError/getEditErrors switched from raw fs I/O to StorageAPI optional methods.
36
+ * - migrateMessageIds/removeMessagesFrom: replaced getWorld()+listAgents() with
37
+ * storageWrappers!.worldExists() + storageWrappers!.listAgents() to break the cycle.
38
+ * - syncRuntimeAgentMemoryFromStorage promoted to export.
39
+ */
40
+ import { storageWrappers, ensureInitialization, getResolvedWorldId } from './storage-init.js';
41
+ import { NEW_CHAT_TITLE, isDefaultChatTitle, TITLE_PROVENANCE_AUTO, TITLE_PROVENANCE_DEFAULT } from './chat-constants.js';
42
+ import { clearPendingHitlRequestsForChat } from './hitl.js';
43
+ import { clearChatSkillApprovals } from './load-skill-tool.js';
44
+ import { stopMessageProcessing } from './message-processing-control.js';
45
+ import { createCategoryLogger } from './logger.js';
46
+ import { subscribeAgentToMessages, subscribeWorldToMessages, setupWorldActivityListener, } from './events/index.js';
47
+ import { nanoid } from 'nanoid';
48
+ const logger = createCategoryLogger('core.managers');
49
+ // ─── Runtime agent memory sync ────────────────────────────────────────────────
50
+ /**
51
+ * Re-hydrate in-memory agent.memory from storage for every agent in a world.
52
+ * Called after removeMessagesFrom to ensure the runtime view is consistent.
53
+ */
54
+ export async function syncRuntimeAgentMemoryFromStorage(world, worldId) {
55
+ if (!world?.agents || world.agents.size === 0)
56
+ return;
57
+ if (typeof storageWrappers?.loadAgent !== 'function')
58
+ return;
59
+ for (const runtimeAgent of world.agents.values()) {
60
+ const persistedAgent = await storageWrappers.loadAgent(worldId, runtimeAgent.id);
61
+ runtimeAgent.memory = Array.isArray(persistedAgent?.memory)
62
+ ? [...persistedAgent.memory]
63
+ : [];
64
+ }
65
+ }
66
+ function isHumanMessageIdOwner(message) {
67
+ const sender = String(message?.sender || '').trim().toLowerCase();
68
+ const role = String(message?.role || '').trim().toLowerCase();
69
+ return sender === 'human'
70
+ || sender === 'user'
71
+ || sender.startsWith('user')
72
+ || role === 'user';
73
+ }
74
+ function isHumanMessageEventPayload(payload) {
75
+ if (!payload || typeof payload !== 'object') {
76
+ return false;
77
+ }
78
+ const record = payload;
79
+ const sender = String(record.sender || '').trim().toLowerCase();
80
+ const role = String(record.role || '').trim().toLowerCase();
81
+ return sender === 'human'
82
+ || sender === 'user'
83
+ || sender.startsWith('user')
84
+ || role === 'user';
85
+ }
86
+ function isSystemErrorEventPayload(payload) {
87
+ if (!payload || typeof payload !== 'object') {
88
+ return false;
89
+ }
90
+ const record = payload;
91
+ const eventType = String(record.eventType || record.type || '').trim().toLowerCase();
92
+ return eventType === 'error';
93
+ }
94
+ async function removeOrphanedSystemErrorEvents(worldId, chatId, eventStorage) {
95
+ if (!eventStorage.getEventsByWorldAndChat || !eventStorage.deleteEventsByIds) {
96
+ return;
97
+ }
98
+ const [chatEvents, currentMemory] = await Promise.all([
99
+ eventStorage.getEventsByWorldAndChat(worldId, chatId, { order: 'asc' }),
100
+ storageWrappers.getMemory(worldId, chatId),
101
+ ]);
102
+ const survivingUserMessageIds = new Set((Array.isArray(currentMemory) ? currentMemory : [])
103
+ .filter((message) => isHumanMessageIdOwner(message))
104
+ .map((message) => String(message?.messageId || '').trim())
105
+ .filter(Boolean));
106
+ let latestUserMessageId = null;
107
+ const orphanedSystemErrorIds = new Set();
108
+ for (const event of Array.isArray(chatEvents) ? chatEvents : []) {
109
+ if (String(event?.type || '').trim().toLowerCase() === 'message') {
110
+ if (!isHumanMessageEventPayload(event?.payload)) {
111
+ continue;
112
+ }
113
+ latestUserMessageId = String(event?.id || '').trim() || null;
114
+ continue;
115
+ }
116
+ if (String(event?.type || '').trim().toLowerCase() !== 'system') {
117
+ continue;
118
+ }
119
+ if (!isSystemErrorEventPayload(event?.payload)) {
120
+ continue;
121
+ }
122
+ const eventId = String(event?.id || '').trim();
123
+ if (!eventId) {
124
+ continue;
125
+ }
126
+ if (!latestUserMessageId || !survivingUserMessageIds.has(latestUserMessageId)) {
127
+ orphanedSystemErrorIds.add(eventId);
128
+ }
129
+ }
130
+ if (orphanedSystemErrorIds.size > 0) {
131
+ await eventStorage.deleteEventsByIds(Array.from(orphanedSystemErrorIds));
132
+ }
133
+ }
134
+ async function removeTrimmedQueueRowsAndEvents(worldId, chatId, cutoffTimestamp, removedMessageIds) {
135
+ const normalizedRemovedIds = new Set(Array.from(removedMessageIds).map((id) => String(id || '').trim()).filter(Boolean));
136
+ if (typeof storageWrappers.getQueuedMessages === 'function' && typeof storageWrappers.removeQueuedMessage === 'function') {
137
+ const queuedMessages = await storageWrappers.getQueuedMessages(worldId, chatId);
138
+ for (const queuedMessage of queuedMessages) {
139
+ const queuedMessageId = String(queuedMessage?.messageId || '').trim();
140
+ if (!queuedMessageId) {
141
+ continue;
142
+ }
143
+ if (normalizedRemovedIds.has(queuedMessageId)) {
144
+ await storageWrappers.removeQueuedMessage(queuedMessageId);
145
+ }
146
+ }
147
+ }
148
+ const eventStorage = storageWrappers?.eventStorage;
149
+ if (!eventStorage?.getEventsByWorldAndChat || !eventStorage?.deleteEventsByIds) {
150
+ return;
151
+ }
152
+ const chatEvents = await eventStorage.getEventsByWorldAndChat(worldId, chatId);
153
+ const staleEventIds = chatEvents
154
+ .filter((event) => {
155
+ const eventCreatedAt = event?.createdAt ? new Date(event.createdAt).getTime() : Number.NaN;
156
+ return Number.isFinite(eventCreatedAt) && eventCreatedAt >= cutoffTimestamp;
157
+ })
158
+ .map((event) => String(event?.id || '').trim())
159
+ .filter(Boolean);
160
+ if (staleEventIds.length > 0) {
161
+ await eventStorage.deleteEventsByIds(staleEventIds);
162
+ }
163
+ await removeOrphanedSystemErrorEvents(worldId, chatId, eventStorage);
164
+ }
165
+ async function getAutoGeneratedChatTitleResetCandidate(world, chatId) {
166
+ const chat = world.chats.get(chatId) ?? await storageWrappers.loadChatData(world.id, chatId);
167
+ if (!chat)
168
+ return null;
169
+ const currentTitle = String(chat.name || '').trim();
170
+ if (!currentTitle || isDefaultChatTitle(currentTitle)) {
171
+ return null;
172
+ }
173
+ // Only reset titles that were auto-generated; manually-set titles must never
174
+ // be cleared on edit resubmission.
175
+ if (chat.titleProvenance !== 'auto') {
176
+ return null;
177
+ }
178
+ return { currentTitle };
179
+ }
180
+ async function resetAutoGeneratedChatTitleForEditResubmission(world, chatId, candidate) {
181
+ if (!candidate) {
182
+ return { resetApplied: false, previousTitle: null };
183
+ }
184
+ const currentTitle = candidate.currentTitle;
185
+ let resetSucceeded = false;
186
+ if (typeof storageWrappers.updateChatNameIfCurrent === 'function') {
187
+ resetSucceeded = await storageWrappers.updateChatNameIfCurrent(world.id, chatId, currentTitle, NEW_CHAT_TITLE, TITLE_PROVENANCE_DEFAULT);
188
+ }
189
+ else {
190
+ const updated = await storageWrappers.updateChatData(world.id, chatId, { name: NEW_CHAT_TITLE, titleProvenance: TITLE_PROVENANCE_DEFAULT });
191
+ resetSucceeded = !!updated;
192
+ }
193
+ if (!resetSucceeded) {
194
+ return { resetApplied: false, previousTitle: null };
195
+ }
196
+ const runtimeChat = world.chats.get(chatId);
197
+ if (runtimeChat) {
198
+ runtimeChat.name = NEW_CHAT_TITLE;
199
+ runtimeChat.titleProvenance = TITLE_PROVENANCE_DEFAULT;
200
+ }
201
+ return { resetApplied: true, previousTitle: currentTitle };
202
+ }
203
+ async function rollbackAutoGeneratedChatTitleResetAfterFailedResubmission(world, chatId, previousTitle) {
204
+ const normalizedPreviousTitle = String(previousTitle || '').trim();
205
+ if (!normalizedPreviousTitle || isDefaultChatTitle(normalizedPreviousTitle)) {
206
+ return;
207
+ }
208
+ let restored = false;
209
+ if (typeof storageWrappers.updateChatNameIfCurrent === 'function') {
210
+ restored = await storageWrappers.updateChatNameIfCurrent(world.id, chatId, NEW_CHAT_TITLE, normalizedPreviousTitle, TITLE_PROVENANCE_AUTO);
211
+ }
212
+ else {
213
+ const persistedChat = await storageWrappers.loadChatData(world.id, chatId);
214
+ if (persistedChat && isDefaultChatTitle(persistedChat.name)) {
215
+ const updated = await storageWrappers.updateChatData(world.id, chatId, { name: normalizedPreviousTitle, titleProvenance: TITLE_PROVENANCE_AUTO });
216
+ restored = !!updated;
217
+ }
218
+ }
219
+ if (!restored) {
220
+ return;
221
+ }
222
+ const runtimeChat = world.chats.get(chatId);
223
+ if (runtimeChat && isDefaultChatTitle(runtimeChat.name)) {
224
+ runtimeChat.name = normalizedPreviousTitle;
225
+ runtimeChat.titleProvenance = TITLE_PROVENANCE_AUTO;
226
+ }
227
+ }
228
+ // ─── Public API ───────────────────────────────────────────────────────────────
229
+ /**
230
+ * Migrate messages to include messageId for user message edit feature.
231
+ * Automatically detects storage type and handles both file and SQL storage.
232
+ * Idempotent — safe to run multiple times.
233
+ *
234
+ * @param worldId - World ID to migrate messages for
235
+ * @returns Number of messages migrated
236
+ */
237
+ export async function migrateMessageIds(worldId) {
238
+ await ensureInitialization();
239
+ const resolvedWorldId = await getResolvedWorldId(worldId);
240
+ // Avoid calling getWorld to prevent a static cycle; existence check is enough.
241
+ const worldExists = await storageWrappers.worldExists(resolvedWorldId);
242
+ if (!worldExists) {
243
+ throw new Error(`World '${worldId}' not found`);
244
+ }
245
+ let totalMigrated = 0;
246
+ // Get all agents in the world
247
+ const agents = await storageWrappers.listAgents(resolvedWorldId);
248
+ // Get all chats for the world
249
+ const chats = await storageWrappers.listChats(resolvedWorldId);
250
+ // Migrate messages for each chat
251
+ for (const chat of chats) {
252
+ const chatId = chat.id;
253
+ // Get all memory for this chat
254
+ const memory = await storageWrappers.getMemory(resolvedWorldId, chatId);
255
+ if (!memory || memory.length === 0) {
256
+ continue;
257
+ }
258
+ // Check which messages need messageId
259
+ let needsMigration = false;
260
+ const updatedMemory = [];
261
+ for (const message of memory) {
262
+ if (!message.messageId) {
263
+ needsMigration = true;
264
+ updatedMemory.push({
265
+ ...message,
266
+ messageId: nanoid(10),
267
+ });
268
+ totalMigrated++;
269
+ }
270
+ else {
271
+ updatedMemory.push(message);
272
+ }
273
+ }
274
+ // If any messages were updated, save the entire memory back
275
+ if (needsMigration) {
276
+ // For each agent, update their memory with the migrated messages
277
+ for (const agent of agents) {
278
+ const agentMessages = updatedMemory.filter(m => m.agentId === agent.id);
279
+ if (agentMessages.length > 0) {
280
+ await storageWrappers.saveAgentMemory(resolvedWorldId, agent.id, agentMessages);
281
+ }
282
+ }
283
+ }
284
+ }
285
+ logger.info(`Migrated ${totalMigrated} messages with messageId for world '${resolvedWorldId}'`);
286
+ return totalMigrated;
287
+ }
288
+ /**
289
+ * Remove a message and all subsequent messages from all agents in a world.
290
+ * Used for user message editing feature.
291
+ *
292
+ * @param worldId - World ID
293
+ * @param messageId - ID of the message to remove (and all after it)
294
+ * @param chatId - Chat ID to filter messages
295
+ * @returns RemovalResult with per-agent removal details
296
+ */
297
+ export async function removeMessagesFrom(worldId, messageId, chatId) {
298
+ await ensureInitialization();
299
+ const resolvedWorldId = await getResolvedWorldId(worldId);
300
+ // Avoid calling getWorld to prevent a static cycle; existence check is enough.
301
+ const worldExists = await storageWrappers.worldExists(resolvedWorldId);
302
+ if (!worldExists) {
303
+ throw new Error(`World '${worldId}' not found`);
304
+ }
305
+ // Get all agents
306
+ const agents = await storageWrappers.listAgents(resolvedWorldId);
307
+ // When no agents exist (e.g. all deleted), there is no agent memory to clean
308
+ // up. Treat this as a successful no-op so edit resubmission can proceed and
309
+ // surface a queue error instead of a confusing "Failed to edit message".
310
+ if (agents.length === 0) {
311
+ await removeTrimmedQueueRowsAndEvents(resolvedWorldId, chatId, 0, new Set());
312
+ return {
313
+ success: true,
314
+ messageId,
315
+ totalAgents: 0,
316
+ processedAgents: [],
317
+ failedAgents: [],
318
+ messagesRemovedTotal: 0,
319
+ requiresRetry: false,
320
+ resubmissionStatus: 'skipped',
321
+ newMessageId: undefined,
322
+ };
323
+ }
324
+ // Track results per agent
325
+ const processedAgents = [];
326
+ const failedAgents = [];
327
+ let messagesRemovedTotal = 0;
328
+ let foundTargetInAnyAgent = false;
329
+ let targetTimestampValue = null;
330
+ const loadedAgentsById = new Map();
331
+ const removedMessageIds = new Set();
332
+ const toTimestamp = (value) => {
333
+ if (value instanceof Date) {
334
+ return value.getTime();
335
+ }
336
+ if (value) {
337
+ const parsed = new Date(value).getTime();
338
+ if (Number.isFinite(parsed)) {
339
+ return parsed;
340
+ }
341
+ }
342
+ return Date.now();
343
+ };
344
+ // First pass: load each agent and discover the deletion cutoff timestamp
345
+ for (const agent of agents) {
346
+ try {
347
+ const fullAgent = await storageWrappers.loadAgent(resolvedWorldId, agent.id);
348
+ if (!fullAgent || !fullAgent.memory || fullAgent.memory.length === 0) {
349
+ continue;
350
+ }
351
+ loadedAgentsById.set(agent.id, fullAgent);
352
+ // Find the target message in this chat for global cutoff derivation
353
+ const targetMsg = fullAgent.memory.find(m => m.messageId === messageId && m.chatId === chatId);
354
+ if (targetMsg) {
355
+ foundTargetInAnyAgent = true;
356
+ const candidateTimestamp = toTimestamp(targetMsg.createdAt);
357
+ if (targetTimestampValue === null || candidateTimestamp < targetTimestampValue) {
358
+ targetTimestampValue = candidateTimestamp;
359
+ }
360
+ }
361
+ }
362
+ catch (error) {
363
+ const errorMsg = error instanceof Error ? error.message : String(error);
364
+ failedAgents.push({
365
+ agentId: agent.id,
366
+ error: errorMsg,
367
+ });
368
+ }
369
+ }
370
+ if (!foundTargetInAnyAgent || targetTimestampValue === null) {
371
+ const notFoundFailures = agents.length > 0
372
+ ? [
373
+ ...failedAgents,
374
+ { agentId: 'all', error: `Message with ID '${messageId}' not found in chat '${chatId}'` },
375
+ ]
376
+ : failedAgents;
377
+ return {
378
+ success: false,
379
+ messageId,
380
+ totalAgents: agents.length,
381
+ processedAgents,
382
+ failedAgents: notFoundFailures,
383
+ messagesRemovedTotal,
384
+ requiresRetry: false,
385
+ resubmissionStatus: 'skipped',
386
+ newMessageId: undefined,
387
+ };
388
+ }
389
+ // Second pass: apply cutoff to all agents in the target chat
390
+ for (const agent of agents) {
391
+ if (failedAgents.some(entry => entry.agentId === agent.id)) {
392
+ continue;
393
+ }
394
+ const fullAgent = loadedAgentsById.get(agent.id);
395
+ if (!fullAgent || !Array.isArray(fullAgent.memory) || fullAgent.memory.length === 0) {
396
+ processedAgents.push(agent.id);
397
+ continue;
398
+ }
399
+ try {
400
+ const messagesToKeep = fullAgent.memory.filter(m => {
401
+ if (m.chatId !== chatId) {
402
+ return true;
403
+ }
404
+ const msgTimestamp = toTimestamp(m.createdAt);
405
+ return msgTimestamp < targetTimestampValue;
406
+ });
407
+ const removedCount = fullAgent.memory.length - messagesToKeep.length;
408
+ if (removedCount === 0) {
409
+ processedAgents.push(agent.id);
410
+ continue;
411
+ }
412
+ for (const removedMessage of fullAgent.memory) {
413
+ if (removedMessage.chatId !== chatId) {
414
+ continue;
415
+ }
416
+ const removedTimestamp = toTimestamp(removedMessage.createdAt);
417
+ if (removedTimestamp < targetTimestampValue) {
418
+ continue;
419
+ }
420
+ const removedMessageId = String(removedMessage.messageId || '').trim();
421
+ if (removedMessageId) {
422
+ removedMessageIds.add(removedMessageId);
423
+ }
424
+ }
425
+ await storageWrappers.saveAgentMemory(resolvedWorldId, agent.id, messagesToKeep);
426
+ messagesRemovedTotal += removedCount;
427
+ processedAgents.push(agent.id);
428
+ }
429
+ catch (error) {
430
+ const errorMsg = error instanceof Error ? error.message : String(error);
431
+ failedAgents.push({
432
+ agentId: agent.id,
433
+ error: errorMsg,
434
+ });
435
+ }
436
+ }
437
+ logger.info('Message removal completed', {
438
+ messageId,
439
+ success: failedAgents.length === 0,
440
+ totalAgents: agents.length,
441
+ processedAgents: processedAgents.length,
442
+ failedAgents: failedAgents.length,
443
+ messagesRemovedTotal,
444
+ });
445
+ if (failedAgents.length === 0) {
446
+ await removeTrimmedQueueRowsAndEvents(resolvedWorldId, chatId, targetTimestampValue, removedMessageIds);
447
+ const { getActiveSubscribedWorld } = await import('./subscription.js');
448
+ const activeWorld = getActiveSubscribedWorld(resolvedWorldId, chatId);
449
+ const remainingQueueRows = await storageWrappers.getQueuedMessages?.(resolvedWorldId, chatId);
450
+ if (remainingQueueRows?.some((row) => row.status === 'queued')) {
451
+ if (activeWorld && !activeWorld._queuedChatIds) {
452
+ activeWorld._queuedChatIds = new Set();
453
+ }
454
+ activeWorld?._queuedChatIds?.add(chatId);
455
+ }
456
+ else {
457
+ activeWorld?._queuedChatIds?.delete(chatId);
458
+ }
459
+ }
460
+ return {
461
+ success: failedAgents.length === 0,
462
+ messageId,
463
+ totalAgents: agents.length,
464
+ processedAgents,
465
+ failedAgents,
466
+ messagesRemovedTotal,
467
+ requiresRetry: failedAgents.length > 0,
468
+ resubmissionStatus: 'skipped', // Updated by editUserMessage
469
+ newMessageId: undefined,
470
+ };
471
+ }
472
+ /**
473
+ * Edit a user message by removing it and all subsequent messages, then resubmitting
474
+ * with new content. Combines removal and resubmission in a single operation with
475
+ * comprehensive error tracking.
476
+ *
477
+ * @param worldId - World ID
478
+ * @param messageId - ID of the message to edit
479
+ * @param newContent - New message content
480
+ * @param chatId - Chat ID for the message
481
+ * @param targetWorld - Optional pre-resolved world (avoids extra lookup)
482
+ * @returns RemovalResult with removal and resubmission details
483
+ */
484
+ export async function editUserMessage(worldId, messageId, newContent, chatId, targetWorld) {
485
+ await ensureInitialization();
486
+ const resolvedWorldId = await getResolvedWorldId(worldId);
487
+ const { getActiveSubscribedWorld } = await import('./subscription.js');
488
+ const activeSubscribedWorld = getActiveSubscribedWorld(resolvedWorldId, chatId) || targetWorld || null;
489
+ const world = activeSubscribedWorld || await (async () => {
490
+ const { getWorld } = await import('./managers.js');
491
+ return getWorld(resolvedWorldId);
492
+ })();
493
+ if (!world) {
494
+ throw new Error(`World '${worldId}' not found`);
495
+ }
496
+ // Always cancel any in-flight or queued LLM work for this chat before
497
+ // resubmitting an edited message. This covers both registered agent
498
+ // processing handles (stopMessageProcessing aborts those) AND title
499
+ // generation calls that go through the global llmQueue without
500
+ // registering in activeProcessingByChat (so hasActiveChatMessageProcessing
501
+ // returns false even when title gen is the active queue item). Leaving the
502
+ // guard would cause the agent's resubmission LLM call to queue behind an
503
+ // active title gen call, producing "no response" until title gen finishes.
504
+ stopMessageProcessing(resolvedWorldId, chatId);
505
+ // Clear cached skill approvals and orphaned HITL requests so the
506
+ // resubmitted message triggers fresh HITL prompts instead of silently
507
+ // reusing stale session-level approvals from the previous processing run.
508
+ clearChatSkillApprovals(resolvedWorldId, chatId);
509
+ clearPendingHitlRequestsForChat(resolvedWorldId, chatId);
510
+ const titleResetCandidate = await getAutoGeneratedChatTitleResetCandidate(world, chatId);
511
+ // Step 1: Remove the message and all subsequent messages
512
+ const removalResult = await removeMessagesFrom(resolvedWorldId, messageId, chatId);
513
+ if (!removalResult.success) {
514
+ return removalResult;
515
+ }
516
+ await syncRuntimeAgentMemoryFromStorage(activeSubscribedWorld || world, resolvedWorldId);
517
+ // Step 2: Reset auto-generated chat title so post-resubmission title generation can run again.
518
+ const titleResetResult = await resetAutoGeneratedChatTitleForEditResubmission(world, chatId, titleResetCandidate);
519
+ const worldForResubmission = activeSubscribedWorld || world;
520
+ if (!activeSubscribedWorld) {
521
+ for (const agent of worldForResubmission.agents.values()) {
522
+ subscribeAgentToMessages(worldForResubmission, agent);
523
+ }
524
+ subscribeWorldToMessages(worldForResubmission);
525
+ setupWorldActivityListener(worldForResubmission);
526
+ }
527
+ // Step 3: Attempt resubmission using the canonical queue-backed send path
528
+ try {
529
+ const { enqueueAndProcessUserTurn } = await import('./managers.js');
530
+ const queuedMessage = await enqueueAndProcessUserTurn(resolvedWorldId, chatId, newContent, 'human', worldForResubmission, { source: 'retry' });
531
+ const newMessageId = String(queuedMessage?.messageId || '').trim();
532
+ if (!newMessageId) {
533
+ throw new Error('Queue-backed edit resubmission did not return a queued messageId.');
534
+ }
535
+ logger.info(`Resubmitted edited message to world '${resolvedWorldId}' with new messageId '${newMessageId}'`);
536
+ return {
537
+ ...removalResult,
538
+ resubmissionStatus: 'success',
539
+ newMessageId,
540
+ };
541
+ }
542
+ catch (error) {
543
+ const errorMsg = error instanceof Error ? error.message : String(error);
544
+ if (titleResetResult.resetApplied) {
545
+ try {
546
+ await rollbackAutoGeneratedChatTitleResetAfterFailedResubmission(worldForResubmission, chatId, titleResetResult.previousTitle);
547
+ }
548
+ catch (rollbackError) {
549
+ logger.warn('Failed to rollback auto-generated title reset after edit resubmission failure', {
550
+ worldId: resolvedWorldId,
551
+ chatId,
552
+ rollbackError: rollbackError instanceof Error ? rollbackError.message : String(rollbackError),
553
+ });
554
+ }
555
+ }
556
+ logger.error(`Failed to resubmit message to world '${resolvedWorldId}': ${errorMsg}`);
557
+ return {
558
+ ...removalResult,
559
+ resubmissionStatus: 'failed',
560
+ resubmissionError: errorMsg,
561
+ };
562
+ }
563
+ }
564
+ /**
565
+ * Log an error from a message edit operation for troubleshooting and retry.
566
+ * Stores errors via StorageAPI optional saveEditErrors method. Keeps only the
567
+ * last 100 errors. Falls back silently when storage method is unavailable.
568
+ *
569
+ * @param worldId - World ID
570
+ * @param errorLog - EditErrorLog to persist
571
+ */
572
+ export async function logEditError(worldId, errorLog) {
573
+ await ensureInitialization();
574
+ const resolvedWorldId = await getResolvedWorldId(worldId);
575
+ try {
576
+ const errors = await storageWrappers.loadEditErrors?.(resolvedWorldId) ?? [];
577
+ errors.push(errorLog);
578
+ const trimmed = errors.length > 100 ? errors.slice(-100) : errors;
579
+ await storageWrappers.saveEditErrors?.(resolvedWorldId, trimmed);
580
+ logger.debug(`Logged edit error for world '${resolvedWorldId}'`);
581
+ }
582
+ catch (error) {
583
+ logger.error(`Failed to log edit error for world '${resolvedWorldId}': ${error instanceof Error ? error.message : error}`);
584
+ }
585
+ }
586
+ /**
587
+ * Get edit error logs for a world.
588
+ *
589
+ * @param worldId - World ID
590
+ * @returns Array of EditErrorLog entries
591
+ */
592
+ export async function getEditErrors(worldId) {
593
+ await ensureInitialization();
594
+ const resolvedWorldId = await getResolvedWorldId(worldId);
595
+ try {
596
+ return await storageWrappers.loadEditErrors?.(resolvedWorldId) ?? [];
597
+ }
598
+ catch (error) {
599
+ logger.error(`Failed to read edit errors for world '${resolvedWorldId}': ${error instanceof Error ? error.message : error}`);
600
+ return [];
601
+ }
602
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-edit-manager.js","sourceRoot":"","sources":["../../core/message-edit-manager.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,8 @@
15
15
  * - NOT used directly by llm-manager.ts (receives pre-filtered messages from utils.ts)
16
16
  *
17
17
  * Changes:
18
+ * - 2026-03-06: Unwrap persisted tool execution envelopes so only canonical `result` content flows back into LLM continuation.
19
+ * - 2026-02-28: Added canonical `llm.prep` category emission while preserving legacy `llm.message-prep` logs for migration compatibility.
18
20
  * - 2026-02-11: Added unresolved-tool-call cleanup.
19
21
  * - Assistant `tool_calls` are pruned to only IDs that have matching tool-result messages.
20
22
  * - Prevents OpenAI 400 errors from legacy/incomplete tool-call history.
@@ -1 +1 @@
1
- {"version":3,"file":"message-prep.d.ts","sourceRoot":"","sources":["../../core/message-prep.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,WAAW,GAAE,MAAM,GAAG,WAAoB,GACzC;IAAE,OAAO,EAAE,WAAW,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,CAmDlD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CAyH/E"}
1
+ {"version":3,"file":"message-prep.d.ts","sourceRoot":"","sources":["../../core/message-prep.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAyB9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,WAAW,GAAE,MAAM,GAAG,WAAoB,GACzC;IAAE,OAAO,EAAE,WAAW,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,CAmDlD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CA8H/E"}