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,290 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Queue Storage - In-Memory Message Queue Implementation
|
|
3
|
+
*
|
|
4
|
+
* Purpose: Simple in-memory message queue for async processing
|
|
5
|
+
*
|
|
6
|
+
* Features:
|
|
7
|
+
* - FIFO per-world message queuing
|
|
8
|
+
* - Per-world locking (one message processing at a time)
|
|
9
|
+
* - Automatic retry on failure
|
|
10
|
+
* - Basic statistics tracking
|
|
11
|
+
*
|
|
12
|
+
* Implementation:
|
|
13
|
+
* - In-memory queues with Map-based storage
|
|
14
|
+
* - Simple locking via processing state tracking
|
|
15
|
+
* - Auto-retry when marking failed (up to maxRetries)
|
|
16
|
+
*
|
|
17
|
+
* Queue Message Lifecycle:
|
|
18
|
+
* 1. pending: Message enqueued, waiting in queue
|
|
19
|
+
* 2. processing: Message dequeued and being processed
|
|
20
|
+
* 3. completed: Processing finished successfully
|
|
21
|
+
* 4. failed: Processing failed after max retries
|
|
22
|
+
*
|
|
23
|
+
* Note: Data is NOT persisted - queue cleared on restart
|
|
24
|
+
* For production with persistence, use external MQ system (Redis, RabbitMQ, etc)
|
|
25
|
+
*
|
|
26
|
+
* Changes:
|
|
27
|
+
* - 2025-11-01: Replace SQL implementation with in-memory version
|
|
28
|
+
* - Reduced from 716 lines to 453 lines (242 lines of actual code)
|
|
29
|
+
* - Removed: SQL transactions, heartbeat monitoring, stuck detection, priority ordering
|
|
30
|
+
* - Kept: Core queue operations, per-world locking, auto-retry, statistics
|
|
31
|
+
* - All 31 unit tests pass with in-memory implementation
|
|
32
|
+
*/
|
|
33
|
+
/**
|
|
34
|
+
* Generate UUID v4
|
|
35
|
+
*/
|
|
36
|
+
function generateUUID() {
|
|
37
|
+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
|
|
38
|
+
const r = (Math.random() * 16) | 0;
|
|
39
|
+
const v = c === 'x' ? r : (r & 0x3) | 0x8;
|
|
40
|
+
return v.toString(16);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* In-Memory Queue Storage Implementation
|
|
45
|
+
*/
|
|
46
|
+
export function createMemoryQueueStorage() {
|
|
47
|
+
// Per-world pending message queues
|
|
48
|
+
const queues = new Map();
|
|
49
|
+
// Currently processing messages (one per world)
|
|
50
|
+
const processing = new Map();
|
|
51
|
+
// Completed/failed messages (for stats)
|
|
52
|
+
const completed = new Map();
|
|
53
|
+
const failed = new Map();
|
|
54
|
+
/**
|
|
55
|
+
* Enqueue a message for processing
|
|
56
|
+
*/
|
|
57
|
+
async function enqueue(message) {
|
|
58
|
+
const queueMessage = {
|
|
59
|
+
id: generateUUID(),
|
|
60
|
+
worldId: message.worldId,
|
|
61
|
+
messageId: message.messageId,
|
|
62
|
+
content: message.content,
|
|
63
|
+
sender: message.sender,
|
|
64
|
+
chatId: message.chatId ?? null,
|
|
65
|
+
status: 'pending',
|
|
66
|
+
priority: message.priority,
|
|
67
|
+
createdAt: new Date(),
|
|
68
|
+
retryCount: 0,
|
|
69
|
+
maxRetries: message.maxRetries,
|
|
70
|
+
timeoutSeconds: message.timeoutSeconds
|
|
71
|
+
};
|
|
72
|
+
const queue = queues.get(message.worldId) || [];
|
|
73
|
+
queue.push(queueMessage);
|
|
74
|
+
queues.set(message.worldId, queue);
|
|
75
|
+
return queueMessage;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Dequeue the next pending message for a specific world
|
|
79
|
+
* Returns null if world is already processing or no pending messages
|
|
80
|
+
*/
|
|
81
|
+
async function dequeue(worldId) {
|
|
82
|
+
// Check if world is already processing
|
|
83
|
+
if (processing.has(worldId)) {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
// Get queue for this world
|
|
87
|
+
const queue = queues.get(worldId);
|
|
88
|
+
if (!queue || queue.length === 0) {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
// Dequeue first message (FIFO)
|
|
92
|
+
const message = queue.shift();
|
|
93
|
+
message.status = 'processing';
|
|
94
|
+
message.processedAt = new Date();
|
|
95
|
+
message.heartbeatAt = new Date();
|
|
96
|
+
// Mark as processing
|
|
97
|
+
processing.set(worldId, message);
|
|
98
|
+
// Update queue
|
|
99
|
+
if (queue.length === 0) {
|
|
100
|
+
queues.delete(worldId);
|
|
101
|
+
}
|
|
102
|
+
return message;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Update heartbeat timestamp (no-op for simple implementation)
|
|
106
|
+
*/
|
|
107
|
+
async function updateHeartbeat(messageId) {
|
|
108
|
+
// Find processing message and update heartbeat
|
|
109
|
+
for (const [, message] of processing) {
|
|
110
|
+
if (message.messageId === messageId) {
|
|
111
|
+
message.heartbeatAt = new Date();
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Mark a message as completed successfully
|
|
118
|
+
*/
|
|
119
|
+
async function markCompleted(messageId) {
|
|
120
|
+
// Find and remove from processing
|
|
121
|
+
for (const [worldId, message] of processing) {
|
|
122
|
+
if (message.id === messageId) {
|
|
123
|
+
message.status = 'completed';
|
|
124
|
+
message.completedAt = new Date();
|
|
125
|
+
processing.delete(worldId);
|
|
126
|
+
completed.set(message.id, message);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
} /**
|
|
131
|
+
* Mark a message as failed with error details
|
|
132
|
+
* Automatically retries if retryCount < maxRetries
|
|
133
|
+
*/
|
|
134
|
+
async function markFailed(messageId, error) {
|
|
135
|
+
// Find message in processing
|
|
136
|
+
for (const [worldId, message] of processing) {
|
|
137
|
+
if (message.id === messageId) {
|
|
138
|
+
message.error = error;
|
|
139
|
+
message.retryCount++;
|
|
140
|
+
if (message.retryCount < message.maxRetries) {
|
|
141
|
+
// Retry: reset to pending and re-enqueue
|
|
142
|
+
message.status = 'pending';
|
|
143
|
+
message.processedAt = undefined;
|
|
144
|
+
message.heartbeatAt = undefined;
|
|
145
|
+
processing.delete(worldId);
|
|
146
|
+
const queue = queues.get(worldId) || [];
|
|
147
|
+
queue.push(message);
|
|
148
|
+
queues.set(worldId, queue);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
// Max retries reached: mark as failed
|
|
152
|
+
message.status = 'failed';
|
|
153
|
+
message.completedAt = new Date();
|
|
154
|
+
processing.delete(worldId);
|
|
155
|
+
failed.set(message.id, message);
|
|
156
|
+
}
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Retry a failed message (reset to pending)
|
|
163
|
+
*/
|
|
164
|
+
async function retryMessage(messageId) {
|
|
165
|
+
// Find in failed messages
|
|
166
|
+
for (const [id, message] of failed) {
|
|
167
|
+
if (message.messageId === messageId && message.retryCount < message.maxRetries) {
|
|
168
|
+
message.status = 'pending';
|
|
169
|
+
message.retryCount++;
|
|
170
|
+
message.processedAt = undefined;
|
|
171
|
+
message.heartbeatAt = undefined;
|
|
172
|
+
message.completedAt = undefined;
|
|
173
|
+
failed.delete(id);
|
|
174
|
+
const queue = queues.get(message.worldId) || [];
|
|
175
|
+
queue.push(message);
|
|
176
|
+
queues.set(message.worldId, queue);
|
|
177
|
+
return true;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Get queue depth for a world
|
|
184
|
+
*/
|
|
185
|
+
async function getQueueDepth(worldId) {
|
|
186
|
+
const queue = queues.get(worldId);
|
|
187
|
+
return queue ? queue.length : 0;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Get queue statistics
|
|
191
|
+
*/
|
|
192
|
+
async function getQueueStats(worldId) {
|
|
193
|
+
const worldIds = worldId ? [worldId] : [
|
|
194
|
+
...new Set([
|
|
195
|
+
...queues.keys(),
|
|
196
|
+
...Array.from(processing.values()).map(m => m.worldId),
|
|
197
|
+
...Array.from(completed.values()).map(m => m.worldId),
|
|
198
|
+
...Array.from(failed.values()).map(m => m.worldId)
|
|
199
|
+
])
|
|
200
|
+
];
|
|
201
|
+
return worldIds.map(wid => {
|
|
202
|
+
const queue = queues.get(wid) || [];
|
|
203
|
+
const proc = Array.from(processing.values()).filter(m => m.worldId === wid);
|
|
204
|
+
const comp = Array.from(completed.values()).filter(m => m.worldId === wid);
|
|
205
|
+
const fail = Array.from(failed.values()).filter(m => m.worldId === wid);
|
|
206
|
+
const oldestPending = queue.length > 0 ? queue[0].createdAt : undefined;
|
|
207
|
+
const processingTimes = comp
|
|
208
|
+
.filter(m => m.processedAt && m.completedAt)
|
|
209
|
+
.map(m => m.completedAt.getTime() - m.processedAt.getTime());
|
|
210
|
+
const avgProcessingTime = processingTimes.length > 0
|
|
211
|
+
? processingTimes.reduce((a, b) => a + b, 0) / processingTimes.length
|
|
212
|
+
: undefined;
|
|
213
|
+
return {
|
|
214
|
+
worldId: wid,
|
|
215
|
+
pending: queue.length,
|
|
216
|
+
processing: proc.length,
|
|
217
|
+
completed: comp.length,
|
|
218
|
+
failed: fail.length,
|
|
219
|
+
oldestPending,
|
|
220
|
+
avgProcessingTime
|
|
221
|
+
};
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Detect stuck messages (not implemented for simple version)
|
|
226
|
+
*/
|
|
227
|
+
async function detectStuckMessages() {
|
|
228
|
+
return 0;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Cleanup old messages
|
|
232
|
+
*/
|
|
233
|
+
async function cleanup(olderThan) {
|
|
234
|
+
let count = 0;
|
|
235
|
+
const threshold = olderThan.getTime();
|
|
236
|
+
// Cleanup completed messages
|
|
237
|
+
for (const [id, message] of completed) {
|
|
238
|
+
if (message.completedAt && message.completedAt.getTime() < threshold) {
|
|
239
|
+
completed.delete(id);
|
|
240
|
+
count++;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
// Cleanup failed messages
|
|
244
|
+
for (const [id, message] of failed) {
|
|
245
|
+
if (message.completedAt && message.completedAt.getTime() < threshold) {
|
|
246
|
+
failed.delete(id);
|
|
247
|
+
count++;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return count;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Get message by ID
|
|
254
|
+
*/
|
|
255
|
+
async function getMessage(messageId) {
|
|
256
|
+
// Check all storage locations
|
|
257
|
+
for (const queue of queues.values()) {
|
|
258
|
+
const msg = queue.find(m => m.messageId === messageId);
|
|
259
|
+
if (msg)
|
|
260
|
+
return msg;
|
|
261
|
+
}
|
|
262
|
+
for (const msg of processing.values()) {
|
|
263
|
+
if (msg.messageId === messageId)
|
|
264
|
+
return msg;
|
|
265
|
+
}
|
|
266
|
+
for (const msg of completed.values()) {
|
|
267
|
+
if (msg.messageId === messageId)
|
|
268
|
+
return msg;
|
|
269
|
+
}
|
|
270
|
+
for (const msg of failed.values()) {
|
|
271
|
+
if (msg.messageId === messageId)
|
|
272
|
+
return msg;
|
|
273
|
+
}
|
|
274
|
+
return null;
|
|
275
|
+
}
|
|
276
|
+
return {
|
|
277
|
+
enqueue,
|
|
278
|
+
dequeue,
|
|
279
|
+
updateHeartbeat,
|
|
280
|
+
markCompleted,
|
|
281
|
+
markFailed,
|
|
282
|
+
retryMessage,
|
|
283
|
+
getQueueDepth,
|
|
284
|
+
getQueueStats,
|
|
285
|
+
detectStuckMessages,
|
|
286
|
+
cleanup,
|
|
287
|
+
getMessage
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=queue-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue-storage.js","sourceRoot":"","sources":["../../../core/storage/queue-storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Storage Module - File I/O Operations for World-Level Agent Skills
|
|
3
|
+
*
|
|
4
|
+
* Purpose:
|
|
5
|
+
* File-based storage for world-scoped skills following the Anthropic Agent Skills Protocol.
|
|
6
|
+
* Each skill is a directory under `{world-dir}/skills/{skill-name}/` containing a `SKILL.md`
|
|
7
|
+
* file with YAML frontmatter metadata and markdown body instructions.
|
|
8
|
+
*
|
|
9
|
+
* Features:
|
|
10
|
+
* - SKILL.md parsing with YAML frontmatter extraction and validation
|
|
11
|
+
* - Skill CRUD operations (import, read, list, delete, export)
|
|
12
|
+
* - `.meta.json` write-time cache for fast metadata listing
|
|
13
|
+
* - Cache fallback to SKILL.md parsing when cache is missing or corrupt
|
|
14
|
+
* - Path traversal protection using resolve + startsWith guards
|
|
15
|
+
* - Duplicate skill rejection via `skillExists()` check before import
|
|
16
|
+
* - Content size and line-count validation with warnings
|
|
17
|
+
*
|
|
18
|
+
* Notes:
|
|
19
|
+
* - Follows `agent-storage.ts` pattern: standalone module with explicit `rootPath`
|
|
20
|
+
* - Uses `fs/promises` for all I/O, pure functions, no classes
|
|
21
|
+
* - Skills are NOT tool calls — they follow the Anthropic Agent Skills Protocol
|
|
22
|
+
* as a content/instruction protocol (app reads SKILL.md, injects into user message)
|
|
23
|
+
* - Skill metadata limits: name max 64 chars (kebab-case), description max 256 chars
|
|
24
|
+
*
|
|
25
|
+
* Recent Changes:
|
|
26
|
+
* - 2026-02-09: Initial implementation for world-level skills system
|
|
27
|
+
*/
|
|
28
|
+
import type { SkillMetadata, SkillData, WorldSkill, SkillValidationResult } from '../types.js';
|
|
29
|
+
/**
|
|
30
|
+
* Get the skills root directory for a world.
|
|
31
|
+
*/
|
|
32
|
+
export declare function getSkillsDir(rootPath: string, worldId: string): string;
|
|
33
|
+
/**
|
|
34
|
+
* Get the directory path for a specific skill.
|
|
35
|
+
*/
|
|
36
|
+
export declare function getSkillDir(rootPath: string, worldId: string, skillName: string): string;
|
|
37
|
+
/**
|
|
38
|
+
* Get the SKILL.md file path for a specific skill.
|
|
39
|
+
*/
|
|
40
|
+
export declare function getSkillFilePath(rootPath: string, worldId: string, skillName: string): string;
|
|
41
|
+
/**
|
|
42
|
+
* Ensure the skills root directory exists.
|
|
43
|
+
*/
|
|
44
|
+
export declare function ensureSkillsDirectory(rootPath: string, worldId: string): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Ensure a specific skill directory exists.
|
|
47
|
+
*/
|
|
48
|
+
export declare function ensureSkillDirectory(rootPath: string, worldId: string, skillName: string): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Parse SKILL.md content into metadata (YAML frontmatter) and body content.
|
|
51
|
+
* Supports standard YAML frontmatter delimited by `---` lines.
|
|
52
|
+
*
|
|
53
|
+
* @param raw - Raw file content of SKILL.md
|
|
54
|
+
* @returns Parsed SkillData with metadata and content
|
|
55
|
+
* @throws Error if frontmatter is missing or malformed
|
|
56
|
+
*/
|
|
57
|
+
export declare function parseSkillFile(raw: string): SkillData;
|
|
58
|
+
/**
|
|
59
|
+
* Extract just the metadata from a SKILL.md file (without body content).
|
|
60
|
+
*/
|
|
61
|
+
export declare function extractSkillMetadata(raw: string): SkillMetadata;
|
|
62
|
+
/**
|
|
63
|
+
* Validate skill metadata against protocol constraints.
|
|
64
|
+
*/
|
|
65
|
+
export declare function validateSkillMetadata(metadata: SkillMetadata): SkillValidationResult;
|
|
66
|
+
/**
|
|
67
|
+
* Validate skill content (SKILL.md body) for size and line count.
|
|
68
|
+
*/
|
|
69
|
+
export declare function validateSkillContent(content: string): SkillValidationResult;
|
|
70
|
+
/**
|
|
71
|
+
* Check if a skill exists in a world.
|
|
72
|
+
*/
|
|
73
|
+
export declare function skillExists(rootPath: string, worldId: string, skillName: string): Promise<boolean>;
|
|
74
|
+
/**
|
|
75
|
+
* Save a SKILL.md file for a skill.
|
|
76
|
+
*/
|
|
77
|
+
export declare function saveSkillFile(rootPath: string, worldId: string, skillName: string, content: string): Promise<void>;
|
|
78
|
+
/**
|
|
79
|
+
* Load a SKILL.md file content for a skill.
|
|
80
|
+
*/
|
|
81
|
+
export declare function loadSkillFile(rootPath: string, worldId: string, skillName: string): Promise<string>;
|
|
82
|
+
/**
|
|
83
|
+
* Delete a skill directory and all its contents.
|
|
84
|
+
*/
|
|
85
|
+
export declare function deleteSkillFolder(rootPath: string, worldId: string, skillName: string): Promise<boolean>;
|
|
86
|
+
/**
|
|
87
|
+
* List all skill folder names in a world's skills directory.
|
|
88
|
+
*/
|
|
89
|
+
export declare function listSkillFolders(rootPath: string, worldId: string): Promise<string[]>;
|
|
90
|
+
/**
|
|
91
|
+
* Get a full WorldSkill object for a specific skill.
|
|
92
|
+
*/
|
|
93
|
+
export declare function getWorldSkill(rootPath: string, worldId: string, skillName: string): Promise<WorldSkill | null>;
|
|
94
|
+
/**
|
|
95
|
+
* Get just the metadata for a specific skill.
|
|
96
|
+
*/
|
|
97
|
+
export declare function getWorldSkillMetadata(rootPath: string, worldId: string, skillName: string): Promise<SkillMetadata | null>;
|
|
98
|
+
/**
|
|
99
|
+
* List all WorldSkill objects in a world.
|
|
100
|
+
*/
|
|
101
|
+
export declare function listWorldSkills(rootPath: string, worldId: string): Promise<WorldSkill[]>;
|
|
102
|
+
/**
|
|
103
|
+
* List skill metadata for all skills in a world.
|
|
104
|
+
* Uses `.meta.json` cache for fast listing; falls back to SKILL.md parsing.
|
|
105
|
+
*/
|
|
106
|
+
export declare function listWorldSkillsMetadata(rootPath: string, worldId: string): Promise<SkillMetadata[]>;
|
|
107
|
+
/**
|
|
108
|
+
* Import a skill into a world from raw SKILL.md content.
|
|
109
|
+
* Validates metadata, rejects duplicates, and regenerates cache.
|
|
110
|
+
*
|
|
111
|
+
* @throws {DuplicateSkillError} if skill with same name already exists
|
|
112
|
+
* @throws {Error} if content is invalid
|
|
113
|
+
*/
|
|
114
|
+
export declare function importWorldSkill(rootPath: string, worldId: string, skillContent: string): Promise<WorldSkill>;
|
|
115
|
+
/**
|
|
116
|
+
* Export a skill's SKILL.md content as a raw string.
|
|
117
|
+
*/
|
|
118
|
+
export declare function exportWorldSkill(rootPath: string, worldId: string, skillName: string): Promise<string | null>;
|
|
119
|
+
/**
|
|
120
|
+
* Delete a skill from a world and regenerate the metadata cache.
|
|
121
|
+
*/
|
|
122
|
+
export declare function deleteWorldSkill(rootPath: string, worldId: string, skillName: string): Promise<boolean>;
|
|
123
|
+
/**
|
|
124
|
+
* Get total size (in bytes) of all SKILL.md files in a world.
|
|
125
|
+
*/
|
|
126
|
+
export declare function getWorldSkillsSize(rootPath: string, worldId: string): Promise<number>;
|
|
127
|
+
/**
|
|
128
|
+
* Regenerate the `.meta.json` metadata cache from all SKILL.md files.
|
|
129
|
+
*/
|
|
130
|
+
export declare function regenerateMetaCache(rootPath: string, worldId: string): Promise<void>;
|
|
131
|
+
/**
|
|
132
|
+
* Load the `.meta.json` metadata cache.
|
|
133
|
+
* Returns null if cache is missing or corrupt.
|
|
134
|
+
*/
|
|
135
|
+
export declare function loadMetaCache(rootPath: string, worldId: string): Promise<SkillMetadata[] | null>;
|
|
136
|
+
//# sourceMappingURL=skill-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-storage.d.ts","sourceRoot":"","sources":["../../../core/storage/skill-storage.ts"],"names":[],"mappings":"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"}
|