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,301 @@
|
|
|
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 { validateEventForPersistence } from './validation.js';
|
|
36
|
+
/**
|
|
37
|
+
* Helper to promisify db.run
|
|
38
|
+
*/
|
|
39
|
+
function dbRun(db, sql, ...params) {
|
|
40
|
+
return new Promise((resolve, reject) => {
|
|
41
|
+
db.run(sql, params, function (err) {
|
|
42
|
+
if (err)
|
|
43
|
+
reject(err);
|
|
44
|
+
else
|
|
45
|
+
resolve(this);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Helper to promisify db.get
|
|
51
|
+
*/
|
|
52
|
+
function dbGet(db, sql, ...params) {
|
|
53
|
+
return new Promise((resolve, reject) => {
|
|
54
|
+
db.get(sql, params, (err, row) => {
|
|
55
|
+
if (err)
|
|
56
|
+
reject(err);
|
|
57
|
+
else
|
|
58
|
+
resolve(row);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Helper to promisify db.all
|
|
64
|
+
*/
|
|
65
|
+
function dbAll(db, sql, ...params) {
|
|
66
|
+
return new Promise((resolve, reject) => {
|
|
67
|
+
db.all(sql, params, (err, rows) => {
|
|
68
|
+
if (err)
|
|
69
|
+
reject(err);
|
|
70
|
+
else
|
|
71
|
+
resolve(rows || []);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Create SQLite event storage context
|
|
77
|
+
*/
|
|
78
|
+
export async function createSQLiteEventStorage(db) {
|
|
79
|
+
const ctx = {
|
|
80
|
+
db,
|
|
81
|
+
isInitialized: false
|
|
82
|
+
};
|
|
83
|
+
await ensureInitialized(ctx);
|
|
84
|
+
return {
|
|
85
|
+
saveEvent: (event) => saveEvent(ctx, event),
|
|
86
|
+
saveEvents: (events) => saveEvents(ctx, events),
|
|
87
|
+
getEventsByWorldAndChat: (worldId, chatId, options) => getEventsByWorldAndChat(ctx, worldId, chatId, options),
|
|
88
|
+
deleteEventsByWorldAndChat: (worldId, chatId) => deleteEventsByWorldAndChat(ctx, worldId, chatId),
|
|
89
|
+
deleteEventsByWorld: (worldId) => deleteEventsByWorld(ctx, worldId),
|
|
90
|
+
getLatestSeq: (worldId, chatId) => getLatestSeq(ctx, worldId, chatId),
|
|
91
|
+
getEventRange: (worldId, chatId, fromSeq, toSeq) => getEventRange(ctx, worldId, chatId, fromSeq, toSeq),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Ensure the events table is created
|
|
96
|
+
* The events table should already exist from the migration, but this provides a fallback
|
|
97
|
+
*/
|
|
98
|
+
async function ensureInitialized(ctx) {
|
|
99
|
+
if (ctx.isInitialized)
|
|
100
|
+
return;
|
|
101
|
+
// Check if events table exists
|
|
102
|
+
const eventsTableCheck = await dbGet(ctx.db, "SELECT name FROM sqlite_master WHERE type='table' AND name='events'");
|
|
103
|
+
if (!eventsTableCheck) {
|
|
104
|
+
// Table doesn't exist, create it
|
|
105
|
+
// This is a fallback - normally the migration should create this table
|
|
106
|
+
// Note: Foreign keys are omitted here because parent tables may not exist yet
|
|
107
|
+
// In production, the migration script handles this properly with foreign keys
|
|
108
|
+
await dbRun(ctx.db, `
|
|
109
|
+
CREATE TABLE IF NOT EXISTS events (
|
|
110
|
+
id TEXT PRIMARY KEY,
|
|
111
|
+
world_id TEXT NOT NULL,
|
|
112
|
+
chat_id TEXT,
|
|
113
|
+
seq INTEGER,
|
|
114
|
+
type TEXT NOT NULL,
|
|
115
|
+
payload TEXT NOT NULL,
|
|
116
|
+
meta TEXT,
|
|
117
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
118
|
+
)
|
|
119
|
+
`);
|
|
120
|
+
// Create indexes
|
|
121
|
+
await dbRun(ctx.db, `
|
|
122
|
+
CREATE INDEX IF NOT EXISTS idx_events_world_chat_time
|
|
123
|
+
ON events(world_id, chat_id, created_at)
|
|
124
|
+
`);
|
|
125
|
+
await dbRun(ctx.db, `
|
|
126
|
+
CREATE INDEX IF NOT EXISTS idx_events_world_chat_seq
|
|
127
|
+
ON events(world_id, chat_id, seq)
|
|
128
|
+
`);
|
|
129
|
+
await dbRun(ctx.db, `
|
|
130
|
+
CREATE INDEX IF NOT EXISTS idx_events_type
|
|
131
|
+
ON events(type)
|
|
132
|
+
`);
|
|
133
|
+
await dbRun(ctx.db, `
|
|
134
|
+
CREATE INDEX IF NOT EXISTS idx_events_world_id
|
|
135
|
+
ON events(world_id)
|
|
136
|
+
`);
|
|
137
|
+
}
|
|
138
|
+
ctx.isInitialized = true;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Save a single event
|
|
142
|
+
*/
|
|
143
|
+
async function saveEvent(ctx, event) {
|
|
144
|
+
await ensureInitialized(ctx);
|
|
145
|
+
// Validate event metadata before persistence
|
|
146
|
+
validateEventForPersistence(event);
|
|
147
|
+
// seq is AUTOINCREMENT - don't specify it, let SQLite handle it
|
|
148
|
+
await dbRun(ctx.db, `INSERT OR IGNORE INTO events (id, world_id, chat_id, type, payload, meta, created_at)
|
|
149
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)`, event.id, event.worldId, event.chatId, event.type, JSON.stringify(event.payload), event.meta ? JSON.stringify(event.meta) : null, event.createdAt.toISOString());
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Save multiple events in a transaction
|
|
153
|
+
*/
|
|
154
|
+
async function saveEvents(ctx, events) {
|
|
155
|
+
await ensureInitialized(ctx);
|
|
156
|
+
if (events.length === 0)
|
|
157
|
+
return;
|
|
158
|
+
// Use transaction for batch insert
|
|
159
|
+
await dbRun(ctx.db, 'BEGIN TRANSACTION');
|
|
160
|
+
try {
|
|
161
|
+
for (const event of events) {
|
|
162
|
+
// Validate event metadata before persistence
|
|
163
|
+
validateEventForPersistence(event);
|
|
164
|
+
// seq is AUTOINCREMENT - let SQLite handle it
|
|
165
|
+
await dbRun(ctx.db, `INSERT OR IGNORE INTO events (id, world_id, chat_id, type, payload, meta, created_at)
|
|
166
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)`, event.id, event.worldId, event.chatId, event.type, JSON.stringify(event.payload), event.meta ? JSON.stringify(event.meta) : null, event.createdAt.toISOString());
|
|
167
|
+
}
|
|
168
|
+
await dbRun(ctx.db, 'COMMIT');
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
await dbRun(ctx.db, 'ROLLBACK');
|
|
172
|
+
throw error;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Get events for a specific world and chat with filtering options
|
|
177
|
+
*/
|
|
178
|
+
async function getEventsByWorldAndChat(ctx, worldId, chatId, options = {}) {
|
|
179
|
+
await ensureInitialized(ctx);
|
|
180
|
+
const whereClauses = ['world_id = ?'];
|
|
181
|
+
const params = [worldId];
|
|
182
|
+
// Handle chatId (including NULL case)
|
|
183
|
+
if (chatId === null) {
|
|
184
|
+
whereClauses.push('chat_id IS NULL');
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
whereClauses.push('chat_id = ?');
|
|
188
|
+
params.push(chatId);
|
|
189
|
+
}
|
|
190
|
+
// Add optional filters
|
|
191
|
+
if (options.sinceSeq !== undefined) {
|
|
192
|
+
whereClauses.push('seq > ?');
|
|
193
|
+
params.push(options.sinceSeq);
|
|
194
|
+
}
|
|
195
|
+
if (options.sinceTime !== undefined) {
|
|
196
|
+
whereClauses.push('created_at > ?');
|
|
197
|
+
params.push(options.sinceTime.toISOString());
|
|
198
|
+
}
|
|
199
|
+
if (options.types && options.types.length > 0) {
|
|
200
|
+
const placeholders = options.types.map(() => '?').join(', ');
|
|
201
|
+
whereClauses.push(`type IN (${placeholders})`);
|
|
202
|
+
params.push(...options.types);
|
|
203
|
+
}
|
|
204
|
+
// Build query
|
|
205
|
+
let sql = `SELECT id, world_id, chat_id, seq, type, payload, meta, created_at
|
|
206
|
+
FROM events
|
|
207
|
+
WHERE ${whereClauses.join(' AND ')}`;
|
|
208
|
+
// Add ordering
|
|
209
|
+
const order = options.order || 'asc';
|
|
210
|
+
sql += ` ORDER BY seq ${order.toUpperCase()}, created_at ${order.toUpperCase()}`;
|
|
211
|
+
// Add limit
|
|
212
|
+
if (options.limit) {
|
|
213
|
+
sql += ` LIMIT ?`;
|
|
214
|
+
params.push(options.limit);
|
|
215
|
+
}
|
|
216
|
+
const rows = await dbAll(ctx.db, sql, ...params);
|
|
217
|
+
// Parse JSON fields and convert to StoredEvent
|
|
218
|
+
return rows.map(row => ({
|
|
219
|
+
id: row.id,
|
|
220
|
+
worldId: row.world_id,
|
|
221
|
+
chatId: row.chat_id,
|
|
222
|
+
seq: row.seq,
|
|
223
|
+
type: row.type,
|
|
224
|
+
payload: JSON.parse(row.payload),
|
|
225
|
+
meta: row.meta ? JSON.parse(row.meta) : undefined,
|
|
226
|
+
createdAt: new Date(row.created_at)
|
|
227
|
+
}));
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Delete all events for a specific world and chat
|
|
231
|
+
*/
|
|
232
|
+
async function deleteEventsByWorldAndChat(ctx, worldId, chatId) {
|
|
233
|
+
await ensureInitialized(ctx);
|
|
234
|
+
let sql;
|
|
235
|
+
let params;
|
|
236
|
+
if (chatId === null) {
|
|
237
|
+
sql = 'DELETE FROM events WHERE world_id = ? AND chat_id IS NULL';
|
|
238
|
+
params = [worldId];
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
sql = 'DELETE FROM events WHERE world_id = ? AND chat_id = ?';
|
|
242
|
+
params = [worldId, chatId];
|
|
243
|
+
}
|
|
244
|
+
const result = await dbRun(ctx.db, sql, ...params);
|
|
245
|
+
return result.changes || 0;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Delete all events for a specific world (all chats)
|
|
249
|
+
*/
|
|
250
|
+
async function deleteEventsByWorld(ctx, worldId) {
|
|
251
|
+
await ensureInitialized(ctx);
|
|
252
|
+
const result = await dbRun(ctx.db, 'DELETE FROM events WHERE world_id = ?', worldId);
|
|
253
|
+
return result.changes || 0;
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Get the latest sequence number for a world/chat context
|
|
257
|
+
* Returns 0 if no events exist
|
|
258
|
+
*/
|
|
259
|
+
async function getLatestSeq(ctx, worldId, chatId) {
|
|
260
|
+
await ensureInitialized(ctx);
|
|
261
|
+
const result = await dbGet(ctx.db, `SELECT COALESCE(MAX(seq), 0) as latestSeq
|
|
262
|
+
FROM events
|
|
263
|
+
WHERE world_id = ? AND (chat_id = ? OR (chat_id IS NULL AND ? IS NULL))`, worldId, chatId, chatId);
|
|
264
|
+
return result.latestSeq || 0;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Get events within a specific sequence range (inclusive)
|
|
268
|
+
*/
|
|
269
|
+
async function getEventRange(ctx, worldId, chatId, fromSeq, toSeq) {
|
|
270
|
+
await ensureInitialized(ctx);
|
|
271
|
+
const whereClauses = ['world_id = ?'];
|
|
272
|
+
const params = [worldId];
|
|
273
|
+
// Handle chatId (including NULL case)
|
|
274
|
+
if (chatId === null) {
|
|
275
|
+
whereClauses.push('chat_id IS NULL');
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
whereClauses.push('chat_id = ?');
|
|
279
|
+
params.push(chatId);
|
|
280
|
+
}
|
|
281
|
+
// Add sequence range filter
|
|
282
|
+
whereClauses.push('seq >= ? AND seq <= ?');
|
|
283
|
+
params.push(fromSeq, toSeq);
|
|
284
|
+
const sql = `SELECT id, world_id, chat_id, seq, type, payload, meta, created_at
|
|
285
|
+
FROM events
|
|
286
|
+
WHERE ${whereClauses.join(' AND ')}
|
|
287
|
+
ORDER BY seq ASC, created_at ASC`;
|
|
288
|
+
const rows = await dbAll(ctx.db, sql, ...params);
|
|
289
|
+
// Parse JSON fields and convert to StoredEvent
|
|
290
|
+
return rows.map(row => ({
|
|
291
|
+
id: row.id,
|
|
292
|
+
worldId: row.world_id,
|
|
293
|
+
chatId: row.chat_id,
|
|
294
|
+
seq: row.seq,
|
|
295
|
+
type: row.type,
|
|
296
|
+
payload: JSON.parse(row.payload),
|
|
297
|
+
meta: row.meta ? JSON.parse(row.meta) : undefined,
|
|
298
|
+
createdAt: new Date(row.created_at)
|
|
299
|
+
}));
|
|
300
|
+
}
|
|
301
|
+
//# sourceMappingURL=sqliteEventStorage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqliteEventStorage.js","sourceRoot":"","sources":["../../../../core/storage/eventStorage/sqliteEventStorage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event Storage Types and Interfaces
|
|
3
|
+
*
|
|
4
|
+
* Defines the interface and types for persistent event storage across different backends.
|
|
5
|
+
* Events are keyed by worldId and chatId, matching patterns used by existing world and agent storage.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Type-safe event storage interface
|
|
9
|
+
* - Support for sequence-based ordering within world/chat contexts
|
|
10
|
+
* - Pagination and filtering capabilities
|
|
11
|
+
* - Multiple backend implementations (SQLite, in-memory, file-backed)
|
|
12
|
+
*
|
|
13
|
+
* Recent Changes:
|
|
14
|
+
* - 2026-02-08: Removed legacy manual tool-intervention metadata fields from message/tool event metadata
|
|
15
|
+
*
|
|
16
|
+
* Event Structure:
|
|
17
|
+
* - id: Unique identifier (UUID)
|
|
18
|
+
* - worldId: World context for the event
|
|
19
|
+
* - chatId: Optional chat context (nullable)
|
|
20
|
+
* - seq: Optional sequence number for ordering
|
|
21
|
+
* - type: Event type (message, sse, tool, system, etc.)
|
|
22
|
+
* - payload: Event-specific data as JSON
|
|
23
|
+
* - meta: Metadata like timestamp, sender, etc.
|
|
24
|
+
* - createdAt: Event creation timestamp
|
|
25
|
+
*/
|
|
26
|
+
export interface StoredEvent {
|
|
27
|
+
id: string;
|
|
28
|
+
worldId: string;
|
|
29
|
+
chatId: string | null;
|
|
30
|
+
seq?: number | null;
|
|
31
|
+
type: string;
|
|
32
|
+
payload: any;
|
|
33
|
+
meta?: any;
|
|
34
|
+
createdAt: Date;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Enhanced metadata for message events
|
|
38
|
+
* All fields REQUIRED - no legacy support
|
|
39
|
+
*/
|
|
40
|
+
export interface MessageEventMetadata {
|
|
41
|
+
sender: string;
|
|
42
|
+
chatId: string | null;
|
|
43
|
+
ownerAgentIds: string[];
|
|
44
|
+
recipientAgentId: string | null;
|
|
45
|
+
originalSender: string | null;
|
|
46
|
+
deliveredToAgents: string[];
|
|
47
|
+
messageDirection: 'outgoing' | 'incoming' | 'broadcast';
|
|
48
|
+
isMemoryOnly: boolean;
|
|
49
|
+
isCrossAgentMessage: boolean;
|
|
50
|
+
isHumanMessage: boolean;
|
|
51
|
+
threadRootId: string | null;
|
|
52
|
+
threadDepth: number;
|
|
53
|
+
isReply: boolean;
|
|
54
|
+
hasReplies: boolean;
|
|
55
|
+
llmTokensInput: number | null;
|
|
56
|
+
llmTokensOutput: number | null;
|
|
57
|
+
llmLatency: number | null;
|
|
58
|
+
llmProvider: string | null;
|
|
59
|
+
llmModel: string | null;
|
|
60
|
+
hasToolCalls: boolean;
|
|
61
|
+
toolCallCount: number;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Enhanced metadata for tool events
|
|
65
|
+
*/
|
|
66
|
+
export interface ToolEventMetadata {
|
|
67
|
+
agentName: string;
|
|
68
|
+
toolType: string;
|
|
69
|
+
ownerAgentId: string;
|
|
70
|
+
triggeredByMessageId: string;
|
|
71
|
+
executionDuration: number;
|
|
72
|
+
resultSize: number;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Validation: All message events must have complete metadata
|
|
76
|
+
*/
|
|
77
|
+
export declare function validateMessageEventMetadata(meta: any): meta is MessageEventMetadata;
|
|
78
|
+
export interface GetEventsOptions {
|
|
79
|
+
/**
|
|
80
|
+
* Get events with sequence number greater than this value
|
|
81
|
+
*/
|
|
82
|
+
sinceSeq?: number;
|
|
83
|
+
/**
|
|
84
|
+
* Get events created after this timestamp
|
|
85
|
+
*/
|
|
86
|
+
sinceTime?: Date;
|
|
87
|
+
/**
|
|
88
|
+
* Maximum number of events to return
|
|
89
|
+
*/
|
|
90
|
+
limit?: number;
|
|
91
|
+
/**
|
|
92
|
+
* Order by sequence or time
|
|
93
|
+
* Default: 'asc'
|
|
94
|
+
*/
|
|
95
|
+
order?: 'asc' | 'desc';
|
|
96
|
+
/**
|
|
97
|
+
* Filter by event types
|
|
98
|
+
*/
|
|
99
|
+
types?: string[];
|
|
100
|
+
ownerAgentId?: string;
|
|
101
|
+
recipientAgentId?: string;
|
|
102
|
+
isMemoryOnly?: boolean;
|
|
103
|
+
isCrossAgent?: boolean;
|
|
104
|
+
threadRootId?: string;
|
|
105
|
+
hasToolCalls?: boolean;
|
|
106
|
+
}
|
|
107
|
+
export interface EventStorage {
|
|
108
|
+
/**
|
|
109
|
+
* Save a single event to storage
|
|
110
|
+
*/
|
|
111
|
+
saveEvent(event: StoredEvent): Promise<void>;
|
|
112
|
+
/**
|
|
113
|
+
* Save multiple events in a batch
|
|
114
|
+
*/
|
|
115
|
+
saveEvents(events: StoredEvent[]): Promise<void>;
|
|
116
|
+
/**
|
|
117
|
+
* Get events for a specific world and chat
|
|
118
|
+
*/
|
|
119
|
+
getEventsByWorldAndChat(worldId: string, chatId: string | null, options?: GetEventsOptions): Promise<StoredEvent[]>;
|
|
120
|
+
/**
|
|
121
|
+
* Delete all events for a specific world and chat
|
|
122
|
+
*/
|
|
123
|
+
deleteEventsByWorldAndChat(worldId: string, chatId: string | null): Promise<number>;
|
|
124
|
+
/**
|
|
125
|
+
* Delete all events for a specific world (all chats)
|
|
126
|
+
*/
|
|
127
|
+
deleteEventsByWorld(worldId: string): Promise<number>;
|
|
128
|
+
/**
|
|
129
|
+
* Get the latest sequence number for a world/chat context
|
|
130
|
+
* Returns 0 if no events exist
|
|
131
|
+
*/
|
|
132
|
+
getLatestSeq(worldId: string, chatId: string | null): Promise<number>;
|
|
133
|
+
/**
|
|
134
|
+
* Get events within a specific sequence range (inclusive)
|
|
135
|
+
*/
|
|
136
|
+
getEventRange(worldId: string, chatId: string | null, fromSeq: number, toSeq: number): Promise<StoredEvent[]>;
|
|
137
|
+
/**
|
|
138
|
+
* Close/cleanup storage resources
|
|
139
|
+
*/
|
|
140
|
+
close?(): Promise<void>;
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../core/storage/eventStorage/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event Storage Types and Interfaces
|
|
3
|
+
*
|
|
4
|
+
* Defines the interface and types for persistent event storage across different backends.
|
|
5
|
+
* Events are keyed by worldId and chatId, matching patterns used by existing world and agent storage.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Type-safe event storage interface
|
|
9
|
+
* - Support for sequence-based ordering within world/chat contexts
|
|
10
|
+
* - Pagination and filtering capabilities
|
|
11
|
+
* - Multiple backend implementations (SQLite, in-memory, file-backed)
|
|
12
|
+
*
|
|
13
|
+
* Recent Changes:
|
|
14
|
+
* - 2026-02-08: Removed legacy manual tool-intervention metadata fields from message/tool event metadata
|
|
15
|
+
*
|
|
16
|
+
* Event Structure:
|
|
17
|
+
* - id: Unique identifier (UUID)
|
|
18
|
+
* - worldId: World context for the event
|
|
19
|
+
* - chatId: Optional chat context (nullable)
|
|
20
|
+
* - seq: Optional sequence number for ordering
|
|
21
|
+
* - type: Event type (message, sse, tool, system, etc.)
|
|
22
|
+
* - payload: Event-specific data as JSON
|
|
23
|
+
* - meta: Metadata like timestamp, sender, etc.
|
|
24
|
+
* - createdAt: Event creation timestamp
|
|
25
|
+
*/
|
|
26
|
+
/**
|
|
27
|
+
* Validation: All message events must have complete metadata
|
|
28
|
+
*/
|
|
29
|
+
export function validateMessageEventMetadata(meta) {
|
|
30
|
+
return !!(meta &&
|
|
31
|
+
typeof meta.sender === 'string' &&
|
|
32
|
+
Array.isArray(meta.ownerAgentIds) &&
|
|
33
|
+
typeof meta.messageDirection === 'string' &&
|
|
34
|
+
typeof meta.isMemoryOnly === 'boolean' &&
|
|
35
|
+
typeof meta.isCrossAgentMessage === 'boolean' &&
|
|
36
|
+
typeof meta.isHumanMessage === 'boolean' &&
|
|
37
|
+
typeof meta.threadDepth === 'number' &&
|
|
38
|
+
typeof meta.isReply === 'boolean' &&
|
|
39
|
+
typeof meta.hasReplies === 'boolean' &&
|
|
40
|
+
typeof meta.hasToolCalls === 'boolean' &&
|
|
41
|
+
typeof meta.toolCallCount === 'number');
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../core/storage/eventStorage/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAoEH;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAAC,IAAS;IACpD,OAAO,CAAC,CAAC,CACP,IAAI;QACJ,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ;QAC/B,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC;QACjC,OAAO,IAAI,CAAC,gBAAgB,KAAK,QAAQ;QACzC,OAAO,IAAI,CAAC,YAAY,KAAK,SAAS;QACtC,OAAO,IAAI,CAAC,mBAAmB,KAAK,SAAS;QAC7C,OAAO,IAAI,CAAC,cAAc,KAAK,SAAS;QACxC,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ;QACpC,OAAO,IAAI,CAAC,OAAO,KAAK,SAAS;QACjC,OAAO,IAAI,CAAC,UAAU,KAAK,SAAS;QACpC,OAAO,IAAI,CAAC,YAAY,KAAK,SAAS;QACtC,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ,CACvC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event Validation and Default Metadata Creation
|
|
3
|
+
*
|
|
4
|
+
* Provides strict validation for event metadata before persistence and
|
|
5
|
+
* default metadata creation helpers to ensure all events have complete metadata.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - validateEventForPersistence: Strict validation that throws on incomplete metadata
|
|
9
|
+
* - createDefaultMessageMetadata: Create safe defaults for all required fields
|
|
10
|
+
* - Type-safe validation with TypeScript type guards
|
|
11
|
+
*
|
|
12
|
+
* Recent Changes:
|
|
13
|
+
* - 2026-02-08: Removed legacy manual tool-intervention metadata defaults
|
|
14
|
+
*
|
|
15
|
+
* Implementation: 2025-11-07
|
|
16
|
+
* - Clean build approach - all metadata fields required from creation
|
|
17
|
+
* - No legacy event support - validation enforces completeness
|
|
18
|
+
* - Human vs agent message type detection
|
|
19
|
+
*/
|
|
20
|
+
import type { StoredEvent, MessageEventMetadata } from './types.js';
|
|
21
|
+
/**
|
|
22
|
+
* Validate event before persistence
|
|
23
|
+
* Throws error if metadata is incomplete
|
|
24
|
+
*/
|
|
25
|
+
export declare function validateEventForPersistence(event: StoredEvent): void;
|
|
26
|
+
/**
|
|
27
|
+
* Create default metadata values for required fields
|
|
28
|
+
*/
|
|
29
|
+
export declare function createDefaultMessageMetadata(sender: string): MessageEventMetadata;
|
|
30
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../../core/storage/eventStorage/validation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAGpE;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAkBpE;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,oBAAoB,CA0BjF"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event Validation and Default Metadata Creation
|
|
3
|
+
*
|
|
4
|
+
* Provides strict validation for event metadata before persistence and
|
|
5
|
+
* default metadata creation helpers to ensure all events have complete metadata.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - validateEventForPersistence: Strict validation that throws on incomplete metadata
|
|
9
|
+
* - createDefaultMessageMetadata: Create safe defaults for all required fields
|
|
10
|
+
* - Type-safe validation with TypeScript type guards
|
|
11
|
+
*
|
|
12
|
+
* Recent Changes:
|
|
13
|
+
* - 2026-02-08: Removed legacy manual tool-intervention metadata defaults
|
|
14
|
+
*
|
|
15
|
+
* Implementation: 2025-11-07
|
|
16
|
+
* - Clean build approach - all metadata fields required from creation
|
|
17
|
+
* - No legacy event support - validation enforces completeness
|
|
18
|
+
* - Human vs agent message type detection
|
|
19
|
+
*/
|
|
20
|
+
import { validateMessageEventMetadata } from './types.js';
|
|
21
|
+
/**
|
|
22
|
+
* Validate event before persistence
|
|
23
|
+
* Throws error if metadata is incomplete
|
|
24
|
+
*/
|
|
25
|
+
export function validateEventForPersistence(event) {
|
|
26
|
+
if (event.type === 'message') {
|
|
27
|
+
if (!validateMessageEventMetadata(event.meta)) {
|
|
28
|
+
throw new Error(`Invalid message event metadata for event ${event.id}. ` +
|
|
29
|
+
`All metadata fields are required. Missing or invalid fields detected.`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (event.type === 'tool') {
|
|
33
|
+
if (!event.meta?.ownerAgentId || !event.meta?.triggeredByMessageId) {
|
|
34
|
+
throw new Error(`Invalid tool event metadata for event ${event.id}. ` +
|
|
35
|
+
`ownerAgentId and triggeredByMessageId are required.`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Create default metadata values for required fields
|
|
41
|
+
*/
|
|
42
|
+
export function createDefaultMessageMetadata(sender) {
|
|
43
|
+
const isHuman = sender === 'human' || sender === 'user';
|
|
44
|
+
return {
|
|
45
|
+
sender,
|
|
46
|
+
chatId: null,
|
|
47
|
+
ownerAgentIds: [],
|
|
48
|
+
recipientAgentId: null,
|
|
49
|
+
originalSender: null,
|
|
50
|
+
deliveredToAgents: [],
|
|
51
|
+
messageDirection: 'broadcast',
|
|
52
|
+
isMemoryOnly: false,
|
|
53
|
+
isCrossAgentMessage: false,
|
|
54
|
+
isHumanMessage: isHuman,
|
|
55
|
+
threadRootId: null,
|
|
56
|
+
threadDepth: 0,
|
|
57
|
+
isReply: false,
|
|
58
|
+
hasReplies: false,
|
|
59
|
+
llmTokensInput: null,
|
|
60
|
+
llmTokensOutput: null,
|
|
61
|
+
llmLatency: null,
|
|
62
|
+
llmProvider: null,
|
|
63
|
+
llmModel: null,
|
|
64
|
+
hasToolCalls: false,
|
|
65
|
+
toolCallCount: 0
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../../core/storage/eventStorage/validation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAE1D;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CAAC,KAAkB;IAC5D,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC,4BAA4B,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CACb,4CAA4C,KAAK,CAAC,EAAE,IAAI;gBACxD,uEAAuE,CACxE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC1B,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,YAAY,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,oBAAoB,EAAE,CAAC;YACnE,MAAM,IAAI,KAAK,CACb,yCAAyC,KAAK,CAAC,EAAE,IAAI;gBACrD,qDAAqD,CACtD,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAAC,MAAc;IACzD,MAAM,OAAO,GAAG,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,MAAM,CAAC;IAExD,OAAO;QACL,MAAM;QACN,MAAM,EAAE,IAAI;QACZ,aAAa,EAAE,EAAE;QACjB,gBAAgB,EAAE,IAAI;QACtB,cAAc,EAAE,IAAI;QACpB,iBAAiB,EAAE,EAAE;QACrB,gBAAgB,EAAE,WAAW;QAC7B,YAAY,EAAE,KAAK;QACnB,mBAAmB,EAAE,KAAK;QAC1B,cAAc,EAAE,OAAO;QACvB,YAAY,EAAE,IAAI;QAClB,WAAW,EAAE,CAAC;QACd,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,KAAK;QACjB,cAAc,EAAE,IAAI;QACpB,eAAe,EAAE,IAAI;QACrB,UAAU,EAAE,IAAI;QAChB,WAAW,EAAE,IAAI;QACjB,QAAQ,EAAE,IAAI;QACd,YAAY,EAAE,KAAK;QACnB,aAAa,EAAE,CAAC;KACjB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Legacy Migration Bridge (v0-7)
|
|
3
|
+
*
|
|
4
|
+
* Purpose: Handles migration from TypeScript-based migrations to SQL-based migrations
|
|
5
|
+
*
|
|
6
|
+
* Features:
|
|
7
|
+
* - Detects databases using old migration system (PRAGMA user_version only)
|
|
8
|
+
* - Applies appropriate schema updates based on current version
|
|
9
|
+
* - Syncs state to new migration tracking system
|
|
10
|
+
* - Ensures smooth transition with zero data loss
|
|
11
|
+
*
|
|
12
|
+
* Supported Legacy Versions:
|
|
13
|
+
* - v0: Base schema or unversioned database
|
|
14
|
+
* - v1-7: Various column additions and features
|
|
15
|
+
*
|
|
16
|
+
* After running legacy migrations, database will be at v7 and ready for new SQL migrations (v8+)
|
|
17
|
+
*
|
|
18
|
+
* Implementation:
|
|
19
|
+
* - 2025-11-02: Initial implementation for migration system transition
|
|
20
|
+
*/
|
|
21
|
+
import type { Database } from 'sqlite3';
|
|
22
|
+
/**
|
|
23
|
+
* Check if database is using legacy migration system
|
|
24
|
+
* Legacy databases have PRAGMA user_version but no schema_migrations table
|
|
25
|
+
*/
|
|
26
|
+
export declare function isLegacyDatabase(db: Database): Promise<boolean>;
|
|
27
|
+
/**
|
|
28
|
+
* Get current version from PRAGMA user_version
|
|
29
|
+
*/
|
|
30
|
+
export declare function getLegacyVersion(db: Database): Promise<number>;
|
|
31
|
+
/**
|
|
32
|
+
* Apply legacy migrations to bring database from v0-7 to v7
|
|
33
|
+
* This replicates the old TypeScript migration logic
|
|
34
|
+
*/
|
|
35
|
+
export declare function applyLegacyMigrations(db: Database): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Sync legacy database to new migration tracking system
|
|
38
|
+
* Creates schema_migrations table and records that v1-7 have been applied
|
|
39
|
+
*/
|
|
40
|
+
export declare function syncToNewMigrationSystem(db: Database): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Main function to handle legacy migration and sync
|
|
43
|
+
*/
|
|
44
|
+
export declare function migrateLegacyDatabase(db: Database): Promise<void>;
|
|
45
|
+
//# sourceMappingURL=legacy-migrations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy-migrations.d.ts","sourceRoot":"","sources":["../../../core/storage/legacy-migrations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAMxC;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAgCrE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAQpE;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAqLvE;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAgD1E;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBvE"}
|