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,415 @@
1
+ import { validateAgentMessageIds } from './validation.js';
2
+ import { createCategoryLogger } from '../logger.js';
3
+ import { EventEmitter } from 'events';
4
+ const logger = createCategoryLogger('storage.memory');
5
+ /**
6
+ * Deep clone utility for data isolation
7
+ */
8
+ function deepClone(obj) {
9
+ if (obj === null || typeof obj !== 'object') {
10
+ return obj;
11
+ }
12
+ if (obj instanceof Date) {
13
+ return new Date(obj.getTime());
14
+ }
15
+ if (obj instanceof EventEmitter) {
16
+ // For EventEmitter, create a new instance to preserve functionality
17
+ const newEmitter = new EventEmitter();
18
+ // Copy listeners if any exist
19
+ const events = obj._events;
20
+ if (events) {
21
+ newEmitter._events = Object.assign({}, events);
22
+ newEmitter._eventsCount = obj._eventsCount;
23
+ }
24
+ return newEmitter;
25
+ }
26
+ if (obj instanceof Map) {
27
+ const clonedMap = new Map();
28
+ for (const [key, value] of obj.entries()) {
29
+ clonedMap.set(key, deepClone(value));
30
+ }
31
+ return clonedMap;
32
+ }
33
+ if (Array.isArray(obj)) {
34
+ return obj.map(item => deepClone(item));
35
+ }
36
+ const clonedObj = {};
37
+ for (const key in obj) {
38
+ if (obj.hasOwnProperty(key)) {
39
+ clonedObj[key] = deepClone(obj[key]);
40
+ }
41
+ }
42
+ return clonedObj;
43
+ }
44
+ /**
45
+ * Generate a simple unique ID for testing purposes
46
+ */
47
+ function generateId() {
48
+ return Math.random().toString(36).substr(2, 9);
49
+ }
50
+ /**
51
+ * Memory-based storage implementation
52
+ */
53
+ export class MemoryStorage {
54
+ worlds = new Map();
55
+ agents = new Map(); // worldId -> agentId -> Agent
56
+ chats = new Map(); // worldId -> chatId -> Chat
57
+ worldChats = new Map(); // worldId -> chatId -> WorldChat
58
+ archivedMemory = new Map(); // worldId -> agentId -> archived messages
59
+ // World operations
60
+ async saveWorld(worldData) {
61
+ if (!worldData.id) {
62
+ throw new Error('World ID is required');
63
+ }
64
+ // Exclude runtime properties before cloning and storing
65
+ const { eventEmitter, agents, chats, eventStorage, _eventPersistenceCleanup, ...persistableWorld } = worldData;
66
+ // Deep clone to prevent external mutations
67
+ const clonedWorld = deepClone(persistableWorld);
68
+ this.worlds.set(worldData.id, clonedWorld);
69
+ }
70
+ async loadWorld(worldId) {
71
+ const world = this.worlds.get(worldId);
72
+ return world ? deepClone(world) : null;
73
+ }
74
+ async deleteWorld(worldId) {
75
+ const deleted = this.worlds.delete(worldId);
76
+ if (deleted) {
77
+ // Clean up related data
78
+ this.agents.delete(worldId);
79
+ this.chats.delete(worldId);
80
+ this.worldChats.delete(worldId);
81
+ this.archivedMemory.delete(worldId);
82
+ }
83
+ return deleted;
84
+ }
85
+ async listWorlds() {
86
+ return Array.from(this.worlds.values()).map(world => deepClone(world));
87
+ }
88
+ async worldExists(worldId) {
89
+ return this.worlds.has(worldId);
90
+ }
91
+ async getMemory(worldId, chatId) {
92
+ const messages = [];
93
+ const worldAgents = this.agents.get(worldId);
94
+ if (!worldAgents)
95
+ return [];
96
+ for (const agent of worldAgents.values()) {
97
+ const mem = Array.isArray(agent.memory) ? agent.memory : [];
98
+ for (const msg of mem) {
99
+ if (!chatId || msg.chatId === chatId) {
100
+ const messageWithAgentId = deepClone(msg);
101
+ // Ensure agentId is included in the message
102
+ messageWithAgentId.agentId = agent.id;
103
+ messages.push(messageWithAgentId);
104
+ }
105
+ }
106
+ }
107
+ // Sort by createdAt ascending
108
+ messages.sort((a, b) => {
109
+ const at = a.createdAt ? new Date(a.createdAt).getTime() : 0;
110
+ const bt = b.createdAt ? new Date(b.createdAt).getTime() : 0;
111
+ return at - bt;
112
+ });
113
+ return messages;
114
+ }
115
+ // Agent operations
116
+ async saveAgent(worldId, agent) {
117
+ if (!agent.id) {
118
+ throw new Error('Agent ID is required');
119
+ }
120
+ // CRITICAL: Filter out system messages - they should NEVER be saved to memory
121
+ // System messages are generated dynamically during LLM preparation
122
+ const originalMemoryLength = agent.memory.length;
123
+ agent.memory = agent.memory.filter(msg => msg.role !== 'system');
124
+ if (agent.memory.length < originalMemoryLength) {
125
+ logger.warn('Filtered out system messages from agent memory before saving', {
126
+ agentId: agent.id,
127
+ worldId,
128
+ removedCount: originalMemoryLength - agent.memory.length,
129
+ remainingCount: agent.memory.length
130
+ });
131
+ }
132
+ // Auto-migrate legacy messages without messageId
133
+ const migrated = validateAgentMessageIds(agent);
134
+ if (migrated) {
135
+ logger.info('Auto-migrated agent messages with missing messageIds', {
136
+ agentId: agent.id,
137
+ worldId,
138
+ messageCount: agent.memory.length
139
+ });
140
+ }
141
+ if (!this.agents.has(worldId)) {
142
+ this.agents.set(worldId, new Map());
143
+ }
144
+ const worldAgents = this.agents.get(worldId);
145
+ worldAgents.set(agent.id, deepClone(agent));
146
+ }
147
+ async loadAgent(worldId, agentId) {
148
+ const worldAgents = this.agents.get(worldId);
149
+ if (!worldAgents)
150
+ return null;
151
+ const agent = worldAgents.get(agentId);
152
+ if (!agent)
153
+ return null;
154
+ const clonedAgent = deepClone(agent);
155
+ // Auto-migrate on load if needed
156
+ const migrated = validateAgentMessageIds(clonedAgent);
157
+ if (migrated) {
158
+ logger.info('Auto-migrated agent messages on load', {
159
+ agentId,
160
+ worldId,
161
+ messageCount: clonedAgent.memory.length
162
+ });
163
+ // Update the stored agent directly (avoid recursive saveAgent call)
164
+ worldAgents.set(agentId, deepClone(clonedAgent));
165
+ }
166
+ return clonedAgent;
167
+ }
168
+ async loadAgentWithRetry(worldId, agentId, options) {
169
+ // For memory storage, no retry is needed as there are no I/O failures
170
+ return this.loadAgent(worldId, agentId);
171
+ }
172
+ async deleteAgent(worldId, agentId) {
173
+ const worldAgents = this.agents.get(worldId);
174
+ if (!worldAgents)
175
+ return false;
176
+ const deleted = worldAgents.delete(agentId);
177
+ if (deleted) {
178
+ // Clean up archived memory for this agent
179
+ const worldMemory = this.archivedMemory.get(worldId);
180
+ if (worldMemory) {
181
+ worldMemory.delete(agentId);
182
+ }
183
+ }
184
+ return deleted;
185
+ }
186
+ async listAgents(worldId) {
187
+ const worldAgents = this.agents.get(worldId);
188
+ if (!worldAgents)
189
+ return [];
190
+ return Array.from(worldAgents.values()).map(agent => deepClone(agent));
191
+ }
192
+ async agentExists(worldId, agentId) {
193
+ const worldAgents = this.agents.get(worldId);
194
+ return worldAgents ? worldAgents.has(agentId) : false;
195
+ }
196
+ async saveAgentMemory(worldId, agentId, memory) {
197
+ const agent = await this.loadAgent(worldId, agentId);
198
+ if (agent) {
199
+ agent.memory = deepClone(memory);
200
+ await this.saveAgent(worldId, agent);
201
+ }
202
+ }
203
+ async archiveMemory(worldId, agentId, memory) {
204
+ if (!this.archivedMemory.has(worldId)) {
205
+ this.archivedMemory.set(worldId, new Map());
206
+ }
207
+ const worldMemory = this.archivedMemory.get(worldId);
208
+ const existingArchive = worldMemory.get(agentId) || [];
209
+ worldMemory.set(agentId, [...existingArchive, ...deepClone(memory)]);
210
+ }
211
+ async deleteMemoryByChatId(worldId, chatId) {
212
+ let deletedCount = 0;
213
+ const worldAgents = this.agents.get(worldId);
214
+ if (worldAgents) {
215
+ for (const [agentId, agent] of worldAgents.entries()) {
216
+ const originalLength = agent.memory.length;
217
+ agent.memory = agent.memory.filter(msg => msg.chatId !== chatId);
218
+ const deleted = originalLength - agent.memory.length;
219
+ deletedCount += deleted;
220
+ if (deleted > 0) {
221
+ await this.saveAgent(worldId, agent);
222
+ }
223
+ }
224
+ }
225
+ return deletedCount;
226
+ }
227
+ // Batch operations
228
+ async saveAgentsBatch(worldId, agents) {
229
+ for (const agent of agents) {
230
+ await this.saveAgent(worldId, agent);
231
+ }
232
+ }
233
+ async loadAgentsBatch(worldId, agentIds) {
234
+ const agents = [];
235
+ for (const agentId of agentIds) {
236
+ const agent = await this.loadAgent(worldId, agentId);
237
+ if (agent) {
238
+ agents.push(agent);
239
+ }
240
+ }
241
+ return agents;
242
+ }
243
+ // Chat operations
244
+ async saveChatData(worldId, chat) {
245
+ if (!chat.id) {
246
+ throw new Error('Chat ID is required');
247
+ }
248
+ if (!this.chats.has(worldId)) {
249
+ this.chats.set(worldId, new Map());
250
+ }
251
+ const worldChats = this.chats.get(worldId);
252
+ worldChats.set(chat.id, deepClone(chat));
253
+ }
254
+ async loadChatData(worldId, chatId) {
255
+ const worldChats = this.chats.get(worldId);
256
+ if (!worldChats)
257
+ return null;
258
+ const chat = worldChats.get(chatId);
259
+ return chat ? deepClone(chat) : null;
260
+ }
261
+ async deleteChatData(worldId, chatId) {
262
+ const worldChats = this.chats.get(worldId);
263
+ if (!worldChats)
264
+ return false;
265
+ const deleted = worldChats.delete(chatId);
266
+ if (deleted) {
267
+ // Also clean up world chat snapshots
268
+ const worldChatSnapshots = this.worldChats.get(worldId);
269
+ if (worldChatSnapshots) {
270
+ worldChatSnapshots.delete(chatId);
271
+ }
272
+ // Clean up memory associated with this chat
273
+ await this.deleteMemoryByChatId(worldId, chatId);
274
+ }
275
+ return deleted;
276
+ }
277
+ async listChats(worldId) {
278
+ const worldChats = this.chats.get(worldId);
279
+ if (!worldChats)
280
+ return [];
281
+ return Array.from(worldChats.values()).map(chat => deepClone(chat));
282
+ }
283
+ async updateChatData(worldId, chatId, updates) {
284
+ const chat = await this.loadChatData(worldId, chatId);
285
+ if (!chat)
286
+ return null;
287
+ // Apply updates
288
+ if (updates.name !== undefined)
289
+ chat.name = updates.name;
290
+ if (updates.description !== undefined)
291
+ chat.description = updates.description;
292
+ if (updates.messageCount !== undefined)
293
+ chat.messageCount = updates.messageCount;
294
+ chat.updatedAt = new Date();
295
+ await this.saveChatData(worldId, chat);
296
+ return deepClone(chat);
297
+ }
298
+ async updateChatNameIfCurrent(worldId, chatId, expectedName, nextName) {
299
+ const worldChats = this.chats.get(worldId);
300
+ if (!worldChats)
301
+ return false;
302
+ const chat = worldChats.get(chatId);
303
+ if (!chat)
304
+ return false;
305
+ if (chat.name !== expectedName)
306
+ return false;
307
+ chat.name = nextName;
308
+ chat.updatedAt = new Date();
309
+ worldChats.set(chatId, deepClone(chat));
310
+ return true;
311
+ }
312
+ // World chat operations
313
+ async saveWorldChat(worldId, chatId, chat) {
314
+ if (!this.worldChats.has(worldId)) {
315
+ this.worldChats.set(worldId, new Map());
316
+ }
317
+ const worldChatSnapshots = this.worldChats.get(worldId);
318
+ worldChatSnapshots.set(chatId, deepClone(chat));
319
+ }
320
+ async loadWorldChat(worldId, chatId) {
321
+ const worldChatSnapshots = this.worldChats.get(worldId);
322
+ if (!worldChatSnapshots)
323
+ return null;
324
+ const worldChat = worldChatSnapshots.get(chatId);
325
+ return worldChat ? deepClone(worldChat) : null;
326
+ }
327
+ async loadWorldChatFull(worldId, chatId) {
328
+ // For memory storage, full and regular load are the same
329
+ return this.loadWorldChat(worldId, chatId);
330
+ }
331
+ async restoreFromWorldChat(worldId, chat) {
332
+ try {
333
+ // Restore world state
334
+ await this.saveWorld(chat.world);
335
+ // Restore agents
336
+ for (const agent of chat.agents) {
337
+ await this.saveAgent(worldId, agent);
338
+ }
339
+ return true;
340
+ }
341
+ catch (error) {
342
+ console.error('[memory-storage] Failed to restore from world chat:', error);
343
+ return false;
344
+ }
345
+ }
346
+ // Integrity operations
347
+ async validateIntegrity(worldId, agentId) {
348
+ try {
349
+ if (agentId) {
350
+ // Validate specific agent
351
+ const agent = await this.loadAgent(worldId, agentId);
352
+ return !!agent && typeof agent.id === 'string' && agent.id === agentId;
353
+ }
354
+ else {
355
+ // Validate world
356
+ const world = await this.loadWorld(worldId);
357
+ return !!world && typeof world.id === 'string' && world.id === worldId;
358
+ }
359
+ }
360
+ catch {
361
+ return false;
362
+ }
363
+ }
364
+ async repairData(worldId, agentId) {
365
+ // For memory storage, repair is mostly about validation
366
+ // since data corruption is unlikely in memory
367
+ return this.validateIntegrity(worldId, agentId);
368
+ }
369
+ // Utility methods for testing and debugging
370
+ /**
371
+ * Clear all stored data - useful for test cleanup
372
+ */
373
+ async clear() {
374
+ this.worlds.clear();
375
+ this.agents.clear();
376
+ this.chats.clear();
377
+ this.worldChats.clear();
378
+ this.archivedMemory.clear();
379
+ }
380
+ /**
381
+ * Get storage statistics - useful for debugging
382
+ */
383
+ getStats() {
384
+ let totalAgents = 0;
385
+ let totalChats = 0;
386
+ let totalWorldChats = 0;
387
+ let totalArchivedMemory = 0;
388
+ for (const worldAgents of this.agents.values()) {
389
+ totalAgents += worldAgents.size;
390
+ }
391
+ for (const worldChats of this.chats.values()) {
392
+ totalChats += worldChats.size;
393
+ }
394
+ for (const worldChatSnapshots of this.worldChats.values()) {
395
+ totalWorldChats += worldChatSnapshots.size;
396
+ }
397
+ for (const worldMemory of this.archivedMemory.values()) {
398
+ totalArchivedMemory += worldMemory.size;
399
+ }
400
+ return {
401
+ worlds: this.worlds.size,
402
+ totalAgents,
403
+ totalChats,
404
+ totalWorldChats,
405
+ totalArchivedMemory
406
+ };
407
+ }
408
+ }
409
+ /**
410
+ * Create a new memory storage instance
411
+ */
412
+ export function createMemoryStorage() {
413
+ return new MemoryStorage();
414
+ }
415
+ //# sourceMappingURL=memory-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-storage.js","sourceRoot":"","sources":["../../../core/storage/memory-storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * SQL File-Based Migration Runner
3
+ *
4
+ * Purpose: Manages database schema migrations using SQL files
5
+ *
6
+ * Features:
7
+ * - Executes SQL migration files in order
8
+ * - Tracks migration versions in database
9
+ * - Supports both TypeScript and SQL file migrations
10
+ * - Prevents concurrent migrations with locks
11
+ * - Provides rollback support (future enhancement)
12
+ * - Better error handling and logging
13
+ *
14
+ * Migration File Naming Convention:
15
+ * - {version}_{description}.sql (e.g., 0001_create_events_table.sql)
16
+ * - Version numbers must be sequential
17
+ * - Files are executed in numeric order
18
+ *
19
+ * Implementation:
20
+ * - 2025-11-02: Initial implementation replacing inline TypeScript migrations
21
+ */
22
+ import type { Database } from 'sqlite3';
23
+ export interface MigrationContext {
24
+ db: Database;
25
+ migrationsDir: string;
26
+ }
27
+ export interface MigrationFile {
28
+ version: number;
29
+ name: string;
30
+ filePath: string;
31
+ }
32
+ interface MigrationRecord {
33
+ version: number;
34
+ name: string;
35
+ applied_at: string;
36
+ }
37
+ /**
38
+ * Get current schema version from database
39
+ */
40
+ export declare function getCurrentVersion(db: Database): Promise<number>;
41
+ /**
42
+ * Set schema version in database
43
+ */
44
+ export declare function setVersion(db: Database, version: number): Promise<void>;
45
+ /**
46
+ * Create migration tracking table if it doesn't exist
47
+ * This provides better migration history than just PRAGMA user_version
48
+ */
49
+ export declare function ensureMigrationTable(db: Database): Promise<void>;
50
+ /**
51
+ * Get list of applied migrations from tracking table
52
+ */
53
+ export declare function getAppliedMigrations(db: Database): Promise<MigrationRecord[]>;
54
+ /**
55
+ * Record a migration in the tracking table
56
+ */
57
+ export declare function recordMigration(db: Database, version: number, name: string): Promise<void>;
58
+ /**
59
+ * Discover all SQL migration files in the migrations directory
60
+ */
61
+ export declare function discoverMigrations(migrationsDir: string): MigrationFile[];
62
+ /**
63
+ * Read and parse SQL migration file
64
+ */
65
+ export declare function readMigrationFile(filePath: string): string;
66
+ /**
67
+ * Execute a single migration file
68
+ */
69
+ export declare function executeMigration(db: Database, migration: MigrationFile): Promise<void>;
70
+ /**
71
+ * Check if migrations are needed
72
+ */
73
+ export declare function needsMigration(db: Database, migrationsDir: string): Promise<boolean>;
74
+ /**
75
+ * Run all pending migrations
76
+ */
77
+ export declare function runMigrations(ctx: MigrationContext): Promise<void>;
78
+ /**
79
+ * Get migration status and history
80
+ */
81
+ export declare function getMigrationStatus(ctx: MigrationContext): Promise<{
82
+ currentVersion: number;
83
+ availableMigrations: MigrationFile[];
84
+ appliedMigrations: MigrationRecord[];
85
+ pendingMigrations: MigrationFile[];
86
+ }>;
87
+ /**
88
+ * Validate migration file sequence
89
+ * Ensures no gaps or duplicates in version numbers
90
+ */
91
+ export declare function validateMigrationSequence(migrations: MigrationFile[]): {
92
+ isValid: boolean;
93
+ errors: string[];
94
+ };
95
+ export {};
96
+ //# sourceMappingURL=migration-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-runner.d.ts","sourceRoot":"","sources":["../../../core/storage/migration-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAQxC,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,QAAQ,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAQrE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAe7E;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAatE;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAUnF;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBhG;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,aAAa,EAAE,CAwBzE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAK1D;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAqC5F;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAU1F;AAKD;;GAEG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBxE;AAgDD;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC;IACvE,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,aAAa,EAAE,CAAC;IACrC,iBAAiB,EAAE,eAAe,EAAE,CAAC;IACrC,iBAAiB,EAAE,aAAa,EAAE,CAAC;CACpC,CAAC,CAuBD;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG;IACtE,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CA6BA"}