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,31 @@
1
+ /**
2
+ * Event Storage Factory
3
+ *
4
+ * Exports factory functions and types for creating event storage backends.
5
+ * Provides a simple API to create the appropriate storage backend based on configuration.
6
+ *
7
+ * Supported Backends:
8
+ * - SQLite: Production-ready persistent storage with transactions and foreign keys
9
+ * - Memory: Fast in-memory storage for tests and development
10
+ * - File: File-backed JSONL storage for simple persistence needs
11
+ *
12
+ * Usage:
13
+ * ```typescript
14
+ * import { createMemoryEventStorage } from './storage/eventStorage';
15
+ * const storage = createMemoryEventStorage();
16
+ *
17
+ * import { createSQLiteEventStorage } from './storage/eventStorage';
18
+ * const storage = await createSQLiteEventStorage(db);
19
+ *
20
+ * import { createFileEventStorage } from './storage/eventStorage';
21
+ * const storage = createFileEventStorage({ baseDir: './data/events' });
22
+ * ```
23
+ */
24
+ // Export factory functions
25
+ export { createSQLiteEventStorage } from './sqliteEventStorage.js';
26
+ export { createMemoryEventStorage } from './memoryEventStorage.js';
27
+ export { createFileEventStorage } from './fileEventStorage.js';
28
+ // Export classes for direct instantiation if needed
29
+ export { MemoryEventStorage } from './memoryEventStorage.js';
30
+ export { FileEventStorage } from './fileEventStorage.js';
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../core/storage/eventStorage/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AASH,2BAA2B;AAC3B,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAG/D,oDAAoD;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * In-Memory Event Storage Implementation
3
+ *
4
+ * Map-based event storage for tests and development environments.
5
+ * Provides fast, in-memory event storage with support for sequence ordering and efficient queries.
6
+ *
7
+ * Features:
8
+ * - Fast Map-based storage organized by worldId and chatId
9
+ * - Automatic sequence number generation per world/chat
10
+ * - Support for time-based and sequence-based pagination
11
+ * - Event type filtering
12
+ * - Duplicate event ID handling (silently ignores duplicates)
13
+ * - No external dependencies
14
+ * - Suitable for unit tests and browser environments
15
+ *
16
+ * Implementation:
17
+ * - Uses nested Maps for hierarchical organization: worldId -> chatId -> events[]
18
+ * - Maintains sequence counters per world/chat combination
19
+ * - Deep cloning for data isolation
20
+ * - Efficient queries with Array methods
21
+ * - Checks for duplicate IDs before insertion (matches SQLite INSERT OR IGNORE behavior)
22
+ *
23
+ * Changes:
24
+ * - 2025-11-03: Added duplicate event ID detection to prevent constraint violations
25
+ */
26
+ import type { EventStorage, StoredEvent, GetEventsOptions } from './types.js';
27
+ /**
28
+ * In-memory event storage implementation
29
+ */
30
+ export declare class MemoryEventStorage implements EventStorage {
31
+ private events;
32
+ private seqCounters;
33
+ /**
34
+ * Get the next sequence number for a world/chat context
35
+ */
36
+ private getNextSeq;
37
+ /**
38
+ * Get or create events array for a world/chat context
39
+ */
40
+ private getEventsArray;
41
+ /**
42
+ * Save a single event
43
+ */
44
+ saveEvent(event: StoredEvent): Promise<void>;
45
+ /**
46
+ * Save multiple events in batch
47
+ */
48
+ saveEvents(events: StoredEvent[]): Promise<void>;
49
+ /**
50
+ * Get events for a specific world and chat with filtering
51
+ */
52
+ getEventsByWorldAndChat(worldId: string, chatId: string | null, options?: GetEventsOptions): Promise<StoredEvent[]>;
53
+ /**
54
+ * Delete all events for a specific world and chat
55
+ */
56
+ deleteEventsByWorldAndChat(worldId: string, chatId: string | null): Promise<number>;
57
+ /**
58
+ * Delete all events for a specific world (all chats)
59
+ */
60
+ deleteEventsByWorld(worldId: string): Promise<number>;
61
+ /**
62
+ * Get the latest sequence number for a world/chat context
63
+ * Returns 0 if no events exist
64
+ */
65
+ getLatestSeq(worldId: string, chatId: string | null): Promise<number>;
66
+ /**
67
+ * Get events within a specific sequence range (inclusive)
68
+ */
69
+ getEventRange(worldId: string, chatId: string | null, fromSeq: number, toSeq: number): Promise<StoredEvent[]>;
70
+ /**
71
+ * Clear all events (useful for testing)
72
+ */
73
+ clear(): Promise<void>;
74
+ /**
75
+ * Get storage statistics (useful for debugging)
76
+ */
77
+ getStats(): {
78
+ totalContexts: number;
79
+ totalEvents: number;
80
+ eventsByContext: Map<string, number>;
81
+ };
82
+ }
83
+ /**
84
+ * Create a new in-memory event storage instance
85
+ */
86
+ export declare function createMemoryEventStorage(): EventStorage;
87
+ //# sourceMappingURL=memoryEventStorage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoryEventStorage.d.ts","sourceRoot":"","sources":["../../../../core/storage/eventStorage/memoryEventStorage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAkC9E;;GAEG;AACH,qBAAa,kBAAmB,YAAW,YAAY;IAErD,OAAO,CAAC,MAAM,CAAoC;IAGlD,OAAO,CAAC,WAAW,CAA6B;IAEhD;;OAEG;IACH,OAAO,CAAC,UAAU;IAQlB;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;OAEG;IACG,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBlD;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAMtD;;OAEG;IACG,uBAAuB,CAC3B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,WAAW,EAAE,CAAC;IA4CzB;;OAEG;IACG,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IAezF;;OAEG;IACG,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAwB3D;;;OAGG;IACG,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IAK3E;;OAEG;IACG,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,WAAW,EAAE,CAAC;IAuBzB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B;;OAEG;IACH,QAAQ,IAAI;QACV,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACtC;CAgBF;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,YAAY,CAEvD"}
@@ -0,0 +1,244 @@
1
+ /**
2
+ * In-Memory Event Storage Implementation
3
+ *
4
+ * Map-based event storage for tests and development environments.
5
+ * Provides fast, in-memory event storage with support for sequence ordering and efficient queries.
6
+ *
7
+ * Features:
8
+ * - Fast Map-based storage organized by worldId and chatId
9
+ * - Automatic sequence number generation per world/chat
10
+ * - Support for time-based and sequence-based pagination
11
+ * - Event type filtering
12
+ * - Duplicate event ID handling (silently ignores duplicates)
13
+ * - No external dependencies
14
+ * - Suitable for unit tests and browser environments
15
+ *
16
+ * Implementation:
17
+ * - Uses nested Maps for hierarchical organization: worldId -> chatId -> events[]
18
+ * - Maintains sequence counters per world/chat combination
19
+ * - Deep cloning for data isolation
20
+ * - Efficient queries with Array methods
21
+ * - Checks for duplicate IDs before insertion (matches SQLite INSERT OR IGNORE behavior)
22
+ *
23
+ * Changes:
24
+ * - 2025-11-03: Added duplicate event ID detection to prevent constraint violations
25
+ */
26
+ /**
27
+ * Generate a composite key for world/chat combination
28
+ */
29
+ function getContextKey(worldId, chatId) {
30
+ return `${worldId}:${chatId ?? 'null'}`;
31
+ }
32
+ /**
33
+ * Deep clone utility for data isolation
34
+ */
35
+ function deepClone(obj) {
36
+ if (obj === null || typeof obj !== 'object') {
37
+ return obj;
38
+ }
39
+ if (obj instanceof Date) {
40
+ return new Date(obj.getTime());
41
+ }
42
+ if (Array.isArray(obj)) {
43
+ return obj.map(item => deepClone(item));
44
+ }
45
+ const clonedObj = {};
46
+ for (const key in obj) {
47
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
48
+ clonedObj[key] = deepClone(obj[key]);
49
+ }
50
+ }
51
+ return clonedObj;
52
+ }
53
+ /**
54
+ * In-memory event storage implementation
55
+ */
56
+ export class MemoryEventStorage {
57
+ // Map of contextKey -> events array
58
+ events = new Map();
59
+ // Map of contextKey -> next sequence number
60
+ seqCounters = new Map();
61
+ /**
62
+ * Get the next sequence number for a world/chat context
63
+ */
64
+ getNextSeq(worldId, chatId) {
65
+ const key = getContextKey(worldId, chatId);
66
+ const current = this.seqCounters.get(key) || 0;
67
+ const next = current + 1;
68
+ this.seqCounters.set(key, next);
69
+ return next;
70
+ }
71
+ /**
72
+ * Get or create events array for a world/chat context
73
+ */
74
+ getEventsArray(worldId, chatId) {
75
+ const key = getContextKey(worldId, chatId);
76
+ if (!this.events.has(key)) {
77
+ this.events.set(key, []);
78
+ }
79
+ return this.events.get(key);
80
+ }
81
+ /**
82
+ * Save a single event
83
+ */
84
+ async saveEvent(event) {
85
+ const eventsArray = this.getEventsArray(event.worldId, event.chatId);
86
+ // Check for duplicate ID - skip if already exists
87
+ const existingEvent = eventsArray.find(e => e.id === event.id);
88
+ if (existingEvent) {
89
+ // Silently ignore duplicate event ID (matches SQLite INSERT OR IGNORE behavior)
90
+ return;
91
+ }
92
+ // Auto-generate sequence number if not provided
93
+ const seq = event.seq ?? this.getNextSeq(event.worldId, event.chatId);
94
+ const storedEvent = {
95
+ ...deepClone(event),
96
+ seq
97
+ };
98
+ eventsArray.push(storedEvent);
99
+ }
100
+ /**
101
+ * Save multiple events in batch
102
+ */
103
+ async saveEvents(events) {
104
+ for (const event of events) {
105
+ await this.saveEvent(event);
106
+ }
107
+ }
108
+ /**
109
+ * Get events for a specific world and chat with filtering
110
+ */
111
+ async getEventsByWorldAndChat(worldId, chatId, options = {}) {
112
+ const eventsArray = this.getEventsArray(worldId, chatId);
113
+ // Start with all events for this context
114
+ let filtered = eventsArray.slice();
115
+ // Apply filters
116
+ if (options.sinceSeq !== undefined) {
117
+ filtered = filtered.filter(e => (e.seq ?? 0) > options.sinceSeq);
118
+ }
119
+ if (options.sinceTime !== undefined) {
120
+ filtered = filtered.filter(e => e.createdAt > options.sinceTime);
121
+ }
122
+ if (options.types && options.types.length > 0) {
123
+ const typeSet = new Set(options.types);
124
+ filtered = filtered.filter(e => typeSet.has(e.type));
125
+ }
126
+ // Sort by sequence and time
127
+ filtered.sort((a, b) => {
128
+ const seqA = a.seq ?? 0;
129
+ const seqB = b.seq ?? 0;
130
+ if (seqA !== seqB) {
131
+ return seqA - seqB;
132
+ }
133
+ return a.createdAt.getTime() - b.createdAt.getTime();
134
+ });
135
+ // Apply order (reverse if desc)
136
+ if (options.order === 'desc') {
137
+ filtered.reverse();
138
+ }
139
+ // Apply limit
140
+ if (options.limit && options.limit > 0) {
141
+ filtered = filtered.slice(0, options.limit);
142
+ }
143
+ // Return deep clones to prevent external mutations
144
+ return filtered.map(e => deepClone(e));
145
+ }
146
+ /**
147
+ * Delete all events for a specific world and chat
148
+ */
149
+ async deleteEventsByWorldAndChat(worldId, chatId) {
150
+ const key = getContextKey(worldId, chatId);
151
+ const eventsArray = this.events.get(key);
152
+ if (!eventsArray) {
153
+ return 0;
154
+ }
155
+ const count = eventsArray.length;
156
+ this.events.delete(key);
157
+ this.seqCounters.delete(key);
158
+ return count;
159
+ }
160
+ /**
161
+ * Delete all events for a specific world (all chats)
162
+ */
163
+ async deleteEventsByWorld(worldId) {
164
+ let totalDeleted = 0;
165
+ // Find all keys that start with this worldId
166
+ const keysToDelete = [];
167
+ for (const key of this.events.keys()) {
168
+ if (key.startsWith(`${worldId}:`)) {
169
+ keysToDelete.push(key);
170
+ }
171
+ }
172
+ // Delete events and count
173
+ for (const key of keysToDelete) {
174
+ const eventsArray = this.events.get(key);
175
+ if (eventsArray) {
176
+ totalDeleted += eventsArray.length;
177
+ }
178
+ this.events.delete(key);
179
+ this.seqCounters.delete(key);
180
+ }
181
+ return totalDeleted;
182
+ }
183
+ /**
184
+ * Get the latest sequence number for a world/chat context
185
+ * Returns 0 if no events exist
186
+ */
187
+ async getLatestSeq(worldId, chatId) {
188
+ const key = getContextKey(worldId, chatId);
189
+ return this.seqCounters.get(key) || 0;
190
+ }
191
+ /**
192
+ * Get events within a specific sequence range (inclusive)
193
+ */
194
+ async getEventRange(worldId, chatId, fromSeq, toSeq) {
195
+ const eventsArray = this.getEventsArray(worldId, chatId);
196
+ // Filter by sequence range
197
+ const filtered = eventsArray.filter(e => {
198
+ const seq = e.seq ?? 0;
199
+ return seq >= fromSeq && seq <= toSeq;
200
+ });
201
+ // Sort by sequence and time
202
+ filtered.sort((a, b) => {
203
+ const seqA = a.seq ?? 0;
204
+ const seqB = b.seq ?? 0;
205
+ if (seqA !== seqB) {
206
+ return seqA - seqB;
207
+ }
208
+ return a.createdAt.getTime() - b.createdAt.getTime();
209
+ });
210
+ // Return deep clones
211
+ return filtered.map(e => deepClone(e));
212
+ }
213
+ /**
214
+ * Clear all events (useful for testing)
215
+ */
216
+ async clear() {
217
+ this.events.clear();
218
+ this.seqCounters.clear();
219
+ }
220
+ /**
221
+ * Get storage statistics (useful for debugging)
222
+ */
223
+ getStats() {
224
+ const eventsByContext = new Map();
225
+ let totalEvents = 0;
226
+ for (const [key, eventsArray] of this.events.entries()) {
227
+ const count = eventsArray.length;
228
+ eventsByContext.set(key, count);
229
+ totalEvents += count;
230
+ }
231
+ return {
232
+ totalContexts: this.events.size,
233
+ totalEvents,
234
+ eventsByContext
235
+ };
236
+ }
237
+ }
238
+ /**
239
+ * Create a new in-memory event storage instance
240
+ */
241
+ export function createMemoryEventStorage() {
242
+ return new MemoryEventStorage();
243
+ }
244
+ //# sourceMappingURL=memoryEventStorage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoryEventStorage.js","sourceRoot":"","sources":["../../../../core/storage/eventStorage/memoryEventStorage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * SQLite Event Storage Implementation
3
+ *
4
+ * Implements EventStorage interface using SQLite database with the repository's existing DB client pattern.
5
+ * Uses parameterized SQL queries and transactions for data integrity and performance.
6
+ *
7
+ * Features:
8
+ * - Parameterized SQL queries to prevent SQL injection
9
+ * - Transaction support for batch operations
10
+ * - Automatic sequence number generation per world/chat using MAX(seq) + 1
11
+ * - Cascade delete via foreign keys to worlds/chats tables
12
+ * - Efficient querying with indexed columns
13
+ * - JSON storage for payload and metadata
14
+ * - Duplicate event ID handling with INSERT OR IGNORE
15
+ *
16
+ * Cascade Delete Behavior:
17
+ * - Foreign keys ensure events are deleted when their parent world is deleted
18
+ * - Foreign keys ensure events are deleted when their parent chat is deleted
19
+ * - PRAGMA foreign_keys = ON must be enabled (done in sqlite-schema.ts)
20
+ *
21
+ * Implementation Notes:
22
+ * - Uses sqlite3 Database from the existing schema pattern
23
+ * - Follows the promisify pattern used in sqlite-storage.ts
24
+ * - Supports both time-based and sequence-based pagination
25
+ * - Auto-increments sequence number using COALESCE(MAX(seq), 0) + 1
26
+ * - No separate sequence tracking table needed (removed event_sequences)
27
+ * - Uses INSERT OR IGNORE to prevent UNIQUE constraint violations from duplicate event IDs
28
+ * (can occur due to retries, multiple listeners, or error recovery)
29
+ *
30
+ * Changes:
31
+ * - 2025-11-09: CRITICAL FIX - Let AUTOINCREMENT handle seq, don't set manually (was causing INSERT failures)
32
+ * - 2025-11-03: Added INSERT OR IGNORE to handle duplicate event IDs gracefully
33
+ * - 2025-11-06: Removed event_sequences table, use MAX(seq) + 1 for auto-increment
34
+ */
35
+ import type { Database } from 'sqlite3';
36
+ import type { EventStorage } from './types.js';
37
+ export interface SQLiteEventStorageContext {
38
+ db: Database;
39
+ isInitialized: boolean;
40
+ }
41
+ /**
42
+ * Create SQLite event storage context
43
+ */
44
+ export declare function createSQLiteEventStorage(db: Database): Promise<EventStorage>;
45
+ //# sourceMappingURL=sqliteEventStorage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqliteEventStorage.d.ts","sourceRoot":"","sources":["../../../../core/storage/eventStorage/sqliteEventStorage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,OAAO,KAAK,EAAE,YAAY,EAAiC,MAAM,YAAY,CAAC;AAG9E,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,QAAQ,CAAC;IACb,aAAa,EAAE,OAAO,CAAC;CACxB;AAsCD;;GAEG;AACH,wBAAsB,wBAAwB,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC,CAoBlF"}