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.
- package/README.md +17 -7
- package/dist/cli/commands.d.ts +109 -0
- package/dist/cli/commands.js +2024 -0
- package/dist/cli/display.d.ts +124 -0
- package/dist/cli/display.js +381 -0
- package/dist/cli/hitl.d.ts +33 -0
- package/dist/cli/hitl.js +81 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/stream.d.ts +41 -0
- package/dist/cli/stream.js +222 -0
- package/dist/core/activity-tracker.d.ts +16 -0
- package/dist/core/activity-tracker.d.ts.map +1 -0
- package/dist/core/activity-tracker.js +91 -0
- package/dist/core/activity-tracker.js.map +1 -0
- package/dist/core/ai-commands.d.ts +16 -0
- package/dist/core/ai-commands.d.ts.map +1 -0
- package/dist/core/ai-commands.js +24 -0
- package/dist/core/ai-commands.js.map +1 -0
- package/dist/core/ai-sdk-patch.d.ts +24 -0
- package/dist/core/ai-sdk-patch.d.ts.map +1 -0
- package/dist/core/ai-sdk-patch.js +169 -0
- package/dist/core/ai-sdk-patch.js.map +1 -0
- package/dist/core/anthropic-direct.d.ts +52 -0
- package/dist/core/anthropic-direct.d.ts.map +1 -0
- package/dist/core/anthropic-direct.js +301 -0
- package/dist/core/anthropic-direct.js.map +1 -0
- package/dist/core/approval-cache.d.ts +104 -0
- package/dist/core/approval-cache.d.ts.map +1 -0
- package/dist/core/approval-cache.js +150 -0
- package/dist/core/approval-cache.js.map +1 -0
- package/dist/core/chat-constants.d.ts +20 -0
- package/dist/core/chat-constants.d.ts.map +1 -0
- package/dist/core/chat-constants.js +22 -0
- package/dist/core/chat-constants.js.map +1 -0
- package/dist/core/create-agent-tool.d.ts +66 -0
- package/dist/core/create-agent-tool.d.ts.map +1 -0
- package/dist/core/create-agent-tool.js +212 -0
- package/dist/core/create-agent-tool.js.map +1 -0
- package/dist/core/events/approval-checker.d.ts +61 -0
- package/dist/core/events/approval-checker.d.ts.map +1 -0
- package/dist/core/events/approval-checker.js +226 -0
- package/dist/core/events/approval-checker.js.map +1 -0
- package/dist/core/events/index.d.ts +25 -0
- package/dist/core/events/index.d.ts.map +1 -0
- package/dist/core/events/index.js +30 -0
- package/dist/core/events/index.js.map +1 -0
- package/dist/core/events/memory-manager.d.ts +73 -0
- package/dist/core/events/memory-manager.d.ts.map +1 -0
- package/dist/core/events/memory-manager.js +1218 -0
- package/dist/core/events/memory-manager.js.map +1 -0
- package/dist/core/events/mention-logic.d.ts +39 -0
- package/dist/core/events/mention-logic.d.ts.map +1 -0
- package/dist/core/events/mention-logic.js +163 -0
- package/dist/core/events/mention-logic.js.map +1 -0
- package/dist/core/events/orchestrator.d.ts +69 -0
- package/dist/core/events/orchestrator.d.ts.map +1 -0
- package/dist/core/events/orchestrator.js +883 -0
- package/dist/core/events/orchestrator.js.map +1 -0
- package/dist/core/events/persistence.d.ts +41 -0
- package/dist/core/events/persistence.d.ts.map +1 -0
- package/dist/core/events/persistence.js +296 -0
- package/dist/core/events/persistence.js.map +1 -0
- package/dist/core/events/publishers.d.ts +81 -0
- package/dist/core/events/publishers.d.ts.map +1 -0
- package/dist/core/events/publishers.js +272 -0
- package/dist/core/events/publishers.js.map +1 -0
- package/dist/core/events/subscribers.d.ts +45 -0
- package/dist/core/events/subscribers.d.ts.map +1 -0
- package/dist/core/events/subscribers.js +288 -0
- package/dist/core/events/subscribers.js.map +1 -0
- package/dist/core/events/tool-bridge-logging.d.ts +28 -0
- package/dist/core/events/tool-bridge-logging.d.ts.map +1 -0
- package/dist/core/events/tool-bridge-logging.js +94 -0
- package/dist/core/events/tool-bridge-logging.js.map +1 -0
- package/dist/core/events-metadata.d.ts +72 -0
- package/dist/core/events-metadata.d.ts.map +1 -0
- package/dist/core/events-metadata.js +167 -0
- package/dist/core/events-metadata.js.map +1 -0
- package/dist/core/events.d.ts +186 -0
- package/dist/core/events.d.ts.map +1 -0
- package/dist/core/events.js +1248 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/export.d.ts +106 -0
- package/dist/core/export.d.ts.map +1 -0
- package/dist/core/export.js +705 -0
- package/dist/core/export.js.map +1 -0
- package/dist/core/file-tools.d.ts +114 -0
- package/dist/core/file-tools.d.ts.map +1 -0
- package/dist/core/file-tools.js +370 -0
- package/dist/core/file-tools.js.map +1 -0
- package/dist/core/google-direct.d.ts +58 -0
- package/dist/core/google-direct.d.ts.map +1 -0
- package/dist/core/google-direct.js +298 -0
- package/dist/core/google-direct.js.map +1 -0
- package/dist/core/hitl.d.ts +54 -0
- package/dist/core/hitl.d.ts.map +1 -0
- package/dist/core/hitl.js +153 -0
- package/dist/core/hitl.js.map +1 -0
- package/dist/core/index.d.ts +59 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +70 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/llm-config.d.ts +128 -0
- package/dist/core/llm-config.d.ts.map +1 -0
- package/dist/core/llm-config.js +164 -0
- package/dist/core/llm-config.js.map +1 -0
- package/dist/core/llm-manager.d.ts +163 -0
- package/dist/core/llm-manager.d.ts.map +1 -0
- package/dist/core/llm-manager.js +669 -0
- package/dist/core/llm-manager.js.map +1 -0
- package/dist/core/load-skill-tool.d.ts +55 -0
- package/dist/core/load-skill-tool.d.ts.map +1 -0
- package/dist/core/load-skill-tool.js +468 -0
- package/dist/core/load-skill-tool.js.map +1 -0
- package/dist/core/logger.d.ts +88 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +358 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/managers.d.ts +131 -0
- package/dist/core/managers.d.ts.map +1 -0
- package/dist/core/managers.js +1223 -0
- package/dist/core/managers.js.map +1 -0
- package/dist/core/mcp-server-registry.d.ts +304 -0
- package/dist/core/mcp-server-registry.d.ts.map +1 -0
- package/dist/core/mcp-server-registry.js +1769 -0
- package/dist/core/mcp-server-registry.js.map +1 -0
- package/dist/core/mcp-tools.d.ts +56 -0
- package/dist/core/mcp-tools.d.ts.map +1 -0
- package/dist/core/mcp-tools.js +186 -0
- package/dist/core/mcp-tools.js.map +1 -0
- package/dist/core/message-prep.d.ts +81 -0
- package/dist/core/message-prep.d.ts.map +1 -0
- package/dist/core/message-prep.js +223 -0
- package/dist/core/message-prep.js.map +1 -0
- package/dist/core/message-processing-control.d.ts +54 -0
- package/dist/core/message-processing-control.d.ts.map +1 -0
- package/dist/core/message-processing-control.js +139 -0
- package/dist/core/message-processing-control.js.map +1 -0
- package/dist/core/openai-direct.d.ts +80 -0
- package/dist/core/openai-direct.d.ts.map +1 -0
- package/dist/core/openai-direct.js +374 -0
- package/dist/core/openai-direct.js.map +1 -0
- package/dist/core/shell-cmd-tool.d.ts +235 -0
- package/dist/core/shell-cmd-tool.d.ts.map +1 -0
- package/dist/core/shell-cmd-tool.js +1157 -0
- package/dist/core/shell-cmd-tool.js.map +1 -0
- package/dist/core/shell-process-registry.d.ts +88 -0
- package/dist/core/shell-process-registry.d.ts.map +1 -0
- package/dist/core/shell-process-registry.js +309 -0
- package/dist/core/shell-process-registry.js.map +1 -0
- package/dist/core/skill-registry.d.ts +75 -0
- package/dist/core/skill-registry.d.ts.map +1 -0
- package/dist/core/skill-registry.js +369 -0
- package/dist/core/skill-registry.js.map +1 -0
- package/dist/core/skill-script-runner.d.ts +89 -0
- package/dist/core/skill-script-runner.d.ts.map +1 -0
- package/dist/core/skill-script-runner.js +274 -0
- package/dist/core/skill-script-runner.js.map +1 -0
- package/dist/core/skill-selector.d.ts +65 -0
- package/dist/core/skill-selector.d.ts.map +1 -0
- package/dist/core/skill-selector.js +190 -0
- package/dist/core/skill-selector.js.map +1 -0
- package/dist/core/skill-settings.d.ts +20 -0
- package/dist/core/skill-settings.d.ts.map +1 -0
- package/dist/core/skill-settings.js +40 -0
- package/dist/core/skill-settings.js.map +1 -0
- package/dist/core/storage/agent-storage.d.ts +134 -0
- package/dist/core/storage/agent-storage.d.ts.map +1 -0
- package/dist/core/storage/agent-storage.js +498 -0
- package/dist/core/storage/agent-storage.js.map +1 -0
- package/dist/core/storage/eventStorage/fileEventStorage.d.ts +100 -0
- package/dist/core/storage/eventStorage/fileEventStorage.d.ts.map +1 -0
- package/dist/core/storage/eventStorage/fileEventStorage.js +494 -0
- package/dist/core/storage/eventStorage/fileEventStorage.js.map +1 -0
- package/dist/core/storage/eventStorage/index.d.ts +31 -0
- package/dist/core/storage/eventStorage/index.d.ts.map +1 -0
- package/dist/core/storage/eventStorage/index.js +31 -0
- package/dist/core/storage/eventStorage/index.js.map +1 -0
- package/dist/core/storage/eventStorage/memoryEventStorage.d.ts +87 -0
- package/dist/core/storage/eventStorage/memoryEventStorage.d.ts.map +1 -0
- package/dist/core/storage/eventStorage/memoryEventStorage.js +244 -0
- package/dist/core/storage/eventStorage/memoryEventStorage.js.map +1 -0
- package/dist/core/storage/eventStorage/sqliteEventStorage.d.ts +45 -0
- package/dist/core/storage/eventStorage/sqliteEventStorage.d.ts.map +1 -0
- package/dist/core/storage/eventStorage/sqliteEventStorage.js +301 -0
- package/dist/core/storage/eventStorage/sqliteEventStorage.js.map +1 -0
- package/dist/core/storage/eventStorage/types.d.ts +142 -0
- package/dist/core/storage/eventStorage/types.d.ts.map +1 -0
- package/dist/core/storage/eventStorage/types.js +43 -0
- package/dist/core/storage/eventStorage/types.js.map +1 -0
- package/dist/core/storage/eventStorage/validation.d.ts +30 -0
- package/dist/core/storage/eventStorage/validation.d.ts.map +1 -0
- package/dist/core/storage/eventStorage/validation.js +68 -0
- package/dist/core/storage/eventStorage/validation.js.map +1 -0
- package/dist/core/storage/legacy-migrations.d.ts +45 -0
- package/dist/core/storage/legacy-migrations.d.ts.map +1 -0
- package/dist/core/storage/legacy-migrations.js +295 -0
- package/dist/core/storage/legacy-migrations.js.map +1 -0
- package/dist/core/storage/memory-storage.d.ts +105 -0
- package/dist/core/storage/memory-storage.d.ts.map +1 -0
- package/dist/core/storage/memory-storage.js +415 -0
- package/dist/core/storage/memory-storage.js.map +1 -0
- package/dist/core/storage/migration-runner.d.ts +96 -0
- package/dist/core/storage/migration-runner.d.ts.map +1 -0
- package/dist/core/storage/migration-runner.js +306 -0
- package/dist/core/storage/migration-runner.js.map +1 -0
- package/dist/core/storage/queue-storage.d.ts +147 -0
- package/dist/core/storage/queue-storage.d.ts.map +1 -0
- package/dist/core/storage/queue-storage.js +290 -0
- package/dist/core/storage/queue-storage.js.map +1 -0
- package/dist/core/storage/skill-storage.d.ts +136 -0
- package/dist/core/storage/skill-storage.d.ts.map +1 -0
- package/dist/core/storage/skill-storage.js +474 -0
- package/dist/core/storage/skill-storage.js.map +1 -0
- package/dist/core/storage/sqlite-schema.d.ts +95 -0
- package/dist/core/storage/sqlite-schema.d.ts.map +1 -0
- package/dist/core/storage/sqlite-schema.js +156 -0
- package/dist/core/storage/sqlite-schema.js.map +1 -0
- package/dist/core/storage/sqlite-storage.d.ts +146 -0
- package/dist/core/storage/sqlite-storage.d.ts.map +1 -0
- package/dist/core/storage/sqlite-storage.js +709 -0
- package/dist/core/storage/sqlite-storage.js.map +1 -0
- package/dist/core/storage/storage-factory.d.ts +61 -0
- package/dist/core/storage/storage-factory.d.ts.map +1 -0
- package/dist/core/storage/storage-factory.js +794 -0
- package/dist/core/storage/storage-factory.js.map +1 -0
- package/dist/core/storage/validation.d.ts +36 -0
- package/dist/core/storage/validation.d.ts.map +1 -0
- package/dist/core/storage/validation.js +79 -0
- package/dist/core/storage/validation.js.map +1 -0
- package/dist/core/storage/world-storage.d.ts +114 -0
- package/dist/core/storage/world-storage.d.ts.map +1 -0
- package/dist/core/storage/world-storage.js +378 -0
- package/dist/core/storage/world-storage.js.map +1 -0
- package/dist/core/subscription.d.ts +43 -0
- package/dist/core/subscription.d.ts.map +1 -0
- package/dist/core/subscription.js +227 -0
- package/dist/core/subscription.js.map +1 -0
- package/dist/core/tool-utils.d.ts +80 -0
- package/dist/core/tool-utils.d.ts.map +1 -0
- package/dist/core/tool-utils.js +273 -0
- package/dist/core/tool-utils.js.map +1 -0
- package/dist/core/types.d.ts +595 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +158 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/utils.d.ts +138 -0
- package/dist/core/utils.d.ts.map +1 -0
- package/dist/core/utils.js +478 -0
- package/dist/core/utils.js.map +1 -0
- package/dist/core/world-class.d.ts +43 -0
- package/dist/core/world-class.d.ts.map +1 -0
- package/dist/core/world-class.js +90 -0
- package/dist/core/world-class.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/public/assets/agent-sprites-DJFgj-zP.png +0 -0
- package/dist/public/assets/border-KHK37r8y.svg +83 -0
- package/dist/public/assets/index-C9kPXL6G.css +1 -0
- package/dist/public/assets/index-DOQEHGWt.js +96 -0
- package/dist/public/index.html +21 -0
- package/dist/server/api.d.ts +2 -0
- package/dist/server/api.js +1124 -0
- package/dist/server/index.d.ts +29 -0
- package/dist/server/sse-handler.d.ts +62 -0
- package/dist/server/sse-handler.js +234 -0
- package/package.json +15 -3
- 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"}
|