@elizaos/plugin-vision 1.2.1
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/.npmignore +5 -0
- package/README.md +270 -0
- package/build.config.ts +70 -0
- package/dist/action.d.ts +8 -0
- package/dist/action.js +1212 -0
- package/dist/action.js.map +1 -0
- package/dist/audio-capture-stream.d.ts +42 -0
- package/dist/audio-capture-stream.js +516 -0
- package/dist/audio-capture-stream.js.map +1 -0
- package/dist/audio-capture.d.ts +25 -0
- package/dist/audio-capture.js +412 -0
- package/dist/audio-capture.js.map +1 -0
- package/dist/basic.test.d.ts +1 -0
- package/dist/basic.test.js +97 -0
- package/dist/basic.test.js.map +1 -0
- package/dist/config.d.ts +73 -0
- package/dist/config.js +254 -0
- package/dist/config.js.map +1 -0
- package/dist/entity-tracker.d.ts +32 -0
- package/dist/entity-tracker.js +361 -0
- package/dist/entity-tracker.js.map +1 -0
- package/dist/errors.d.ts +67 -0
- package/dist/errors.js +395 -0
- package/dist/errors.js.map +1 -0
- package/dist/face-recognition.d.ts +31 -0
- package/dist/face-recognition.js +332 -0
- package/dist/face-recognition.js.map +1 -0
- package/dist/florence2-local.d.ts +25 -0
- package/dist/florence2-local.js +280 -0
- package/dist/florence2-local.js.map +1 -0
- package/dist/florence2-model.d.ts +36 -0
- package/dist/florence2-model.js +503 -0
- package/dist/florence2-model.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +73 -0
- package/dist/index.js.map +1 -0
- package/dist/ocr-service-real.d.ts +32 -0
- package/dist/ocr-service-real.js +396 -0
- package/dist/ocr-service-real.js.map +1 -0
- package/dist/ocr-service.d.ts +28 -0
- package/dist/ocr-service.js +216 -0
- package/dist/ocr-service.js.map +1 -0
- package/dist/provider.d.ts +2 -0
- package/dist/provider.js +285 -0
- package/dist/provider.js.map +1 -0
- package/dist/screen-capture.d.ts +16 -0
- package/dist/screen-capture.js +302 -0
- package/dist/screen-capture.js.map +1 -0
- package/dist/service.d.ts +73 -0
- package/dist/service.js +1662 -0
- package/dist/service.js.map +1 -0
- package/dist/tests/e2e/index.d.ts +8 -0
- package/dist/tests/e2e/index.js +33 -0
- package/dist/tests/e2e/index.js.map +1 -0
- package/dist/tests/e2e/run-local.d.ts +2 -0
- package/dist/tests/e2e/run-local.js +166 -0
- package/dist/tests/e2e/run-local.js.map +1 -0
- package/dist/tests/e2e/screen-vision.d.ts +11 -0
- package/dist/tests/e2e/screen-vision.js +384 -0
- package/dist/tests/e2e/screen-vision.js.map +1 -0
- package/dist/tests/e2e/vision-autonomy.d.ts +11 -0
- package/dist/tests/e2e/vision-autonomy.js +375 -0
- package/dist/tests/e2e/vision-autonomy.js.map +1 -0
- package/dist/tests/e2e/vision-basic.d.ts +11 -0
- package/dist/tests/e2e/vision-basic.js +434 -0
- package/dist/tests/e2e/vision-basic.js.map +1 -0
- package/dist/tests/e2e/vision-capture-log.d.ts +11 -0
- package/dist/tests/e2e/vision-capture-log.js +302 -0
- package/dist/tests/e2e/vision-capture-log.js.map +1 -0
- package/dist/tests/e2e/vision-runtime.d.ts +11 -0
- package/dist/tests/e2e/vision-runtime.js +357 -0
- package/dist/tests/e2e/vision-runtime.js.map +1 -0
- package/dist/tests/e2e/vision-worker-tests.d.ts +11 -0
- package/dist/tests/e2e/vision-worker-tests.js +466 -0
- package/dist/tests/e2e/vision-worker-tests.js.map +1 -0
- package/dist/tests/test-pattern-generator.d.ts +40 -0
- package/dist/tests/test-pattern-generator.js +191 -0
- package/dist/tests/test-pattern-generator.js.map +1 -0
- package/dist/tests.d.ts +3 -0
- package/dist/tests.js +11 -0
- package/dist/tests.js.map +1 -0
- package/dist/types.d.ts +222 -0
- package/dist/types.js +16 -0
- package/dist/types.js.map +1 -0
- package/dist/vision-models.d.ts +47 -0
- package/dist/vision-models.js +501 -0
- package/dist/vision-models.js.map +1 -0
- package/dist/vision-worker-manager.d.ts +61 -0
- package/dist/vision-worker-manager.js +668 -0
- package/dist/vision-worker-manager.js.map +1 -0
- package/dist/workers/florence2-worker-simple.d.ts +13 -0
- package/dist/workers/florence2-worker-simple.js +121 -0
- package/dist/workers/florence2-worker-simple.js.map +1 -0
- package/dist/workers/florence2-worker.d.ts +1 -0
- package/dist/workers/florence2-worker.js +328 -0
- package/dist/workers/florence2-worker.js.map +1 -0
- package/dist/workers/ocr-worker.d.ts +1 -0
- package/dist/workers/ocr-worker.js +354 -0
- package/dist/workers/ocr-worker.js.map +1 -0
- package/dist/workers/screen-capture-worker.d.ts +1 -0
- package/dist/workers/screen-capture-worker.js +427 -0
- package/dist/workers/screen-capture-worker.js.map +1 -0
- package/dist/workers/worker-logger.d.ts +9 -0
- package/dist/workers/worker-logger.js +95 -0
- package/dist/workers/worker-logger.js.map +1 -0
- package/package.json +100 -0
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
13
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.VisionCaptureLogTestSuite = void 0;
|
|
40
|
+
var fs = require("fs/promises");
|
|
41
|
+
var path = require("path");
|
|
42
|
+
var VisionCaptureLogTestSuite = /** @class */ (function () {
|
|
43
|
+
function VisionCaptureLogTestSuite() {
|
|
44
|
+
var _this = this;
|
|
45
|
+
this.name = 'plugin-vision-capture-log';
|
|
46
|
+
this.description = 'Captures 30 seconds of vision data and saves to logs for analysis';
|
|
47
|
+
this.tests = [
|
|
48
|
+
{
|
|
49
|
+
name: 'Should capture and log 30 seconds of vision data',
|
|
50
|
+
fn: function (runtime) { return __awaiter(_this, void 0, void 0, function () {
|
|
51
|
+
var visionService, logsDir, sessionDir, captureData, captureInterval, totalDuration, expectedCaptures, captureCount, totalChangePercentage, lastLoggedProgress, startTime, _loop_1, mainLogPath, reportPath, report;
|
|
52
|
+
var _a, _b;
|
|
53
|
+
return __generator(this, function (_c) {
|
|
54
|
+
switch (_c.label) {
|
|
55
|
+
case 0:
|
|
56
|
+
console.log('Starting 30-second vision capture test...');
|
|
57
|
+
visionService = runtime.getService('VISION');
|
|
58
|
+
if (!visionService) {
|
|
59
|
+
throw new Error('Vision service not available');
|
|
60
|
+
}
|
|
61
|
+
if (!visionService.isActive()) {
|
|
62
|
+
console.warn('ā ļø Vision service not active - no camera available');
|
|
63
|
+
console.log(' Cannot capture vision data without a camera');
|
|
64
|
+
return [2 /*return*/];
|
|
65
|
+
}
|
|
66
|
+
logsDir = path.join(process.cwd(), 'logs');
|
|
67
|
+
sessionDir = path.join(logsDir, "vision-capture-".concat(new Date().toISOString().replace(/[:.]/g, '-')));
|
|
68
|
+
return [4 /*yield*/, fs.mkdir(sessionDir, { recursive: true })];
|
|
69
|
+
case 1:
|
|
70
|
+
_c.sent();
|
|
71
|
+
console.log("\u2713 Created log directory: ".concat(sessionDir));
|
|
72
|
+
captureData = {
|
|
73
|
+
sessionId: "vision-capture-".concat(Date.now()),
|
|
74
|
+
startTime: new Date().toISOString(),
|
|
75
|
+
endTime: '',
|
|
76
|
+
runtime: {
|
|
77
|
+
agentId: runtime.agentId,
|
|
78
|
+
characterName: runtime.character.name,
|
|
79
|
+
},
|
|
80
|
+
camera: visionService.getCameraInfo(),
|
|
81
|
+
captures: [],
|
|
82
|
+
statistics: {
|
|
83
|
+
totalFrames: 0,
|
|
84
|
+
totalSceneChanges: 0,
|
|
85
|
+
totalObjectsDetected: 0,
|
|
86
|
+
totalPeopleDetected: 0,
|
|
87
|
+
averageChangePercentage: 0,
|
|
88
|
+
objectTypeCounts: {},
|
|
89
|
+
poseCounts: {},
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
captureInterval = 500;
|
|
93
|
+
totalDuration = 30000;
|
|
94
|
+
expectedCaptures = totalDuration / captureInterval;
|
|
95
|
+
console.log("\uD83D\uDCF8 Capturing vision data every ".concat(captureInterval, "ms for ").concat(totalDuration / 1000, " seconds..."));
|
|
96
|
+
console.log(" Expected captures: ".concat(expectedCaptures));
|
|
97
|
+
captureCount = 0;
|
|
98
|
+
totalChangePercentage = 0;
|
|
99
|
+
lastLoggedProgress = 0;
|
|
100
|
+
startTime = Date.now();
|
|
101
|
+
_loop_1 = function () {
|
|
102
|
+
var captureStartTime, scene, frame, imageBuffer, imageBase64, capture, imagePath, _d, _e, obj, _f, _g, person, sceneLogPath, elapsedSeconds, progress, error_1, captureEndTime, captureDuration, waitTime;
|
|
103
|
+
return __generator(this, function (_h) {
|
|
104
|
+
switch (_h.label) {
|
|
105
|
+
case 0:
|
|
106
|
+
captureStartTime = Date.now();
|
|
107
|
+
_h.label = 1;
|
|
108
|
+
case 1:
|
|
109
|
+
_h.trys.push([1, 9, , 10]);
|
|
110
|
+
return [4 /*yield*/, visionService.getSceneDescription()];
|
|
111
|
+
case 2:
|
|
112
|
+
scene = _h.sent();
|
|
113
|
+
return [4 /*yield*/, visionService.getCurrentFrame()];
|
|
114
|
+
case 3:
|
|
115
|
+
frame = _h.sent();
|
|
116
|
+
return [4 /*yield*/, visionService.captureImage()];
|
|
117
|
+
case 4:
|
|
118
|
+
imageBuffer = _h.sent();
|
|
119
|
+
imageBase64 = null;
|
|
120
|
+
if (imageBuffer) {
|
|
121
|
+
imageBase64 = imageBuffer.toString('base64');
|
|
122
|
+
}
|
|
123
|
+
capture = {
|
|
124
|
+
index: captureCount,
|
|
125
|
+
timestamp: new Date().toISOString(),
|
|
126
|
+
timestampMs: Date.now(),
|
|
127
|
+
elapsedMs: Date.now() - startTime,
|
|
128
|
+
scene: scene
|
|
129
|
+
? {
|
|
130
|
+
description: scene.description,
|
|
131
|
+
changePercentage: scene.changePercentage,
|
|
132
|
+
sceneChanged: scene.sceneChanged,
|
|
133
|
+
objectCount: scene.objects.length,
|
|
134
|
+
peopleCount: scene.people.length,
|
|
135
|
+
objects: scene.objects,
|
|
136
|
+
people: scene.people,
|
|
137
|
+
}
|
|
138
|
+
: null,
|
|
139
|
+
frame: frame
|
|
140
|
+
? {
|
|
141
|
+
width: frame.width,
|
|
142
|
+
height: frame.height,
|
|
143
|
+
format: frame.format,
|
|
144
|
+
timestamp: frame.timestamp,
|
|
145
|
+
}
|
|
146
|
+
: null,
|
|
147
|
+
imageBase64: imageBase64 !== null && imageBase64 !== void 0 ? imageBase64 : null,
|
|
148
|
+
};
|
|
149
|
+
captureData.captures.push(capture);
|
|
150
|
+
if (!imageBase64) return [3 /*break*/, 6];
|
|
151
|
+
imagePath = path.join(sessionDir, "capture-".concat(String(captureCount).padStart(3, '0'), ".jpg"));
|
|
152
|
+
return [4 /*yield*/, fs.writeFile(imagePath, Buffer.from(imageBase64, 'base64'))];
|
|
153
|
+
case 5:
|
|
154
|
+
_h.sent();
|
|
155
|
+
_h.label = 6;
|
|
156
|
+
case 6:
|
|
157
|
+
if (!scene) return [3 /*break*/, 8];
|
|
158
|
+
captureData.statistics.totalFrames++;
|
|
159
|
+
if (scene.sceneChanged) {
|
|
160
|
+
captureData.statistics.totalSceneChanges++;
|
|
161
|
+
}
|
|
162
|
+
if (scene.changePercentage) {
|
|
163
|
+
totalChangePercentage += scene.changePercentage;
|
|
164
|
+
}
|
|
165
|
+
captureData.statistics.totalObjectsDetected += scene.objects.length;
|
|
166
|
+
captureData.statistics.totalPeopleDetected += scene.people.length;
|
|
167
|
+
// Count object types
|
|
168
|
+
for (_d = 0, _e = scene.objects; _d < _e.length; _d++) {
|
|
169
|
+
obj = _e[_d];
|
|
170
|
+
captureData.statistics.objectTypeCounts[obj.type] =
|
|
171
|
+
(captureData.statistics.objectTypeCounts[obj.type] || 0) + 1;
|
|
172
|
+
}
|
|
173
|
+
// Count poses
|
|
174
|
+
for (_f = 0, _g = scene.people; _f < _g.length; _f++) {
|
|
175
|
+
person = _g[_f];
|
|
176
|
+
captureData.statistics.poseCounts[person.pose] =
|
|
177
|
+
(captureData.statistics.poseCounts[person.pose] || 0) + 1;
|
|
178
|
+
}
|
|
179
|
+
sceneLogPath = path.join(sessionDir, "scene-".concat(String(captureCount).padStart(3, '0'), ".json"));
|
|
180
|
+
return [4 /*yield*/, fs.writeFile(sceneLogPath, JSON.stringify({
|
|
181
|
+
capture: captureCount,
|
|
182
|
+
timestamp: capture.timestamp,
|
|
183
|
+
scene: scene,
|
|
184
|
+
frame: frame
|
|
185
|
+
? {
|
|
186
|
+
width: frame.width,
|
|
187
|
+
height: frame.height,
|
|
188
|
+
format: frame.format,
|
|
189
|
+
}
|
|
190
|
+
: null,
|
|
191
|
+
}, null, 2))];
|
|
192
|
+
case 7:
|
|
193
|
+
_h.sent();
|
|
194
|
+
_h.label = 8;
|
|
195
|
+
case 8:
|
|
196
|
+
captureCount++;
|
|
197
|
+
elapsedSeconds = Math.floor((Date.now() - startTime) / 1000);
|
|
198
|
+
if (elapsedSeconds > lastLoggedProgress && elapsedSeconds % 5 === 0) {
|
|
199
|
+
lastLoggedProgress = elapsedSeconds;
|
|
200
|
+
progress = (elapsedSeconds / 30) * 100;
|
|
201
|
+
console.log(" Progress: ".concat(progress.toFixed(0), "% (").concat(elapsedSeconds, "/30s) - Captured ").concat(captureCount, " frames"));
|
|
202
|
+
if (scene) {
|
|
203
|
+
console.log(" Last scene: \"".concat(scene.description.substring(0, 60), "...\""));
|
|
204
|
+
if (scene.objects.length > 0 || scene.people.length > 0) {
|
|
205
|
+
console.log(" Detected: ".concat(scene.objects.length, " objects, ").concat(scene.people.length, " people"));
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return [3 /*break*/, 10];
|
|
210
|
+
case 9:
|
|
211
|
+
error_1 = _h.sent();
|
|
212
|
+
console.error(" Error in capture ".concat(captureCount, ":"), error_1);
|
|
213
|
+
captureData.captures.push({
|
|
214
|
+
index: captureCount,
|
|
215
|
+
timestamp: new Date().toISOString(),
|
|
216
|
+
error: error_1 instanceof Error ? error_1.message : String(error_1),
|
|
217
|
+
});
|
|
218
|
+
captureCount++;
|
|
219
|
+
return [3 /*break*/, 10];
|
|
220
|
+
case 10:
|
|
221
|
+
captureEndTime = Date.now();
|
|
222
|
+
captureDuration = captureEndTime - captureStartTime;
|
|
223
|
+
waitTime = Math.max(0, captureInterval - captureDuration);
|
|
224
|
+
if (!(waitTime > 0)) return [3 /*break*/, 12];
|
|
225
|
+
return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, waitTime); })];
|
|
226
|
+
case 11:
|
|
227
|
+
_h.sent();
|
|
228
|
+
_h.label = 12;
|
|
229
|
+
case 12: return [2 /*return*/];
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
};
|
|
233
|
+
_c.label = 2;
|
|
234
|
+
case 2:
|
|
235
|
+
if (!(Date.now() - startTime < totalDuration)) return [3 /*break*/, 4];
|
|
236
|
+
return [5 /*yield**/, _loop_1()];
|
|
237
|
+
case 3:
|
|
238
|
+
_c.sent();
|
|
239
|
+
return [3 /*break*/, 2];
|
|
240
|
+
case 4:
|
|
241
|
+
// Finalize statistics
|
|
242
|
+
captureData.endTime = new Date().toISOString();
|
|
243
|
+
captureData.statistics.averageChangePercentage =
|
|
244
|
+
captureData.statistics.totalFrames > 0
|
|
245
|
+
? totalChangePercentage / captureData.statistics.totalFrames
|
|
246
|
+
: 0;
|
|
247
|
+
mainLogPath = path.join(sessionDir, 'vision-capture-summary.json');
|
|
248
|
+
return [4 /*yield*/, fs.writeFile(mainLogPath, JSON.stringify(captureData, null, 2))];
|
|
249
|
+
case 5:
|
|
250
|
+
_c.sent();
|
|
251
|
+
reportPath = path.join(sessionDir, 'vision-capture-report.md');
|
|
252
|
+
report = "# Vision Capture Report\n\n## Session Information\n- **Session ID**: ".concat(captureData.sessionId, "\n- **Start Time**: ").concat(captureData.startTime, "\n- **End Time**: ").concat(captureData.endTime, "\n- **Duration**: 30 seconds\n- **Agent**: ").concat(captureData.runtime.characterName, " (").concat(captureData.runtime.agentId, ")\n\n## Camera Information\n- **Name**: ").concat(((_a = captureData.camera) === null || _a === void 0 ? void 0 : _a.name) || 'Unknown', "\n- **ID**: ").concat(((_b = captureData.camera) === null || _b === void 0 ? void 0 : _b.id) || 'Unknown', "\n\n## Capture Statistics\n- **Total Frames Captured**: ").concat(captureCount, "\n- **Total Scene Changes**: ").concat(captureData.statistics.totalSceneChanges, "\n- **Average Change Percentage**: ").concat(captureData.statistics.averageChangePercentage.toFixed(2), "%\n- **Total Objects Detected**: ").concat(captureData.statistics.totalObjectsDetected, "\n- **Total People Detected**: ").concat(captureData.statistics.totalPeopleDetected, "\n\n## Object Type Distribution\n").concat(Object.entries(captureData.statistics.objectTypeCounts)
|
|
253
|
+
.sort(function (_a, _b) {
|
|
254
|
+
var a = _a[1];
|
|
255
|
+
var b = _b[1];
|
|
256
|
+
return b - a;
|
|
257
|
+
})
|
|
258
|
+
.map(function (_a) {
|
|
259
|
+
var type = _a[0], count = _a[1];
|
|
260
|
+
return "- **".concat(type, "**: ").concat(count, " detections");
|
|
261
|
+
})
|
|
262
|
+
.join('\n') || '- No objects detected', "\n\n## Pose Distribution\n").concat(Object.entries(captureData.statistics.poseCounts)
|
|
263
|
+
.map(function (_a) {
|
|
264
|
+
var pose = _a[0], count = _a[1];
|
|
265
|
+
return "- **".concat(pose, "**: ").concat(count, " detections");
|
|
266
|
+
})
|
|
267
|
+
.join('\n') || '- No people detected', "\n\n## Sample Scene Descriptions\n").concat(captureData.captures
|
|
268
|
+
.filter(function (c) { var _a; return (_a = c.scene) === null || _a === void 0 ? void 0 : _a.description; })
|
|
269
|
+
.slice(0, 5)
|
|
270
|
+
.map(function (c, _i) {
|
|
271
|
+
var _a;
|
|
272
|
+
return "### Capture ".concat(c.index, " (").concat(c.elapsedMs, "ms)\n\"").concat(c.scene.description, "\"\n- Change: ").concat((_a = c.scene.changePercentage) === null || _a === void 0 ? void 0 : _a.toFixed(1), "%\n- Objects: ").concat(c.scene.objectCount, "\n- People: ").concat(c.scene.peopleCount);
|
|
273
|
+
})
|
|
274
|
+
.join('\n\n'), "\n\n## Files Generated\n- `vision-capture-summary.json` - Complete capture data\n- `vision-capture-report.md` - This report\n- `capture-XXX.jpg` - Individual captured images\n- `scene-XXX.json` - Detailed scene data for each capture\n");
|
|
275
|
+
return [4 /*yield*/, fs.writeFile(reportPath, report)];
|
|
276
|
+
case 6:
|
|
277
|
+
_c.sent();
|
|
278
|
+
console.log('\nā
Vision capture test completed!');
|
|
279
|
+
console.log('š Capture Summary:');
|
|
280
|
+
console.log(" - Total frames: ".concat(captureCount));
|
|
281
|
+
console.log(" - Scene changes: ".concat(captureData.statistics.totalSceneChanges));
|
|
282
|
+
console.log(" - Average change: ".concat(captureData.statistics.averageChangePercentage.toFixed(2), "%"));
|
|
283
|
+
console.log(" - Objects detected: ".concat(captureData.statistics.totalObjectsDetected));
|
|
284
|
+
console.log(" - People detected: ".concat(captureData.statistics.totalPeopleDetected));
|
|
285
|
+
console.log("\n\uD83D\uDCC1 Results saved to: ".concat(sessionDir));
|
|
286
|
+
console.log(' - Summary: vision-capture-summary.json');
|
|
287
|
+
console.log(' - Report: vision-capture-report.md');
|
|
288
|
+
console.log(' - Images: capture-XXX.jpg');
|
|
289
|
+
console.log(' - Scene data: scene-XXX.json');
|
|
290
|
+
console.log('ā
Vision capture log test PASSED');
|
|
291
|
+
return [2 /*return*/];
|
|
292
|
+
}
|
|
293
|
+
});
|
|
294
|
+
}); },
|
|
295
|
+
},
|
|
296
|
+
];
|
|
297
|
+
}
|
|
298
|
+
return VisionCaptureLogTestSuite;
|
|
299
|
+
}());
|
|
300
|
+
exports.VisionCaptureLogTestSuite = VisionCaptureLogTestSuite;
|
|
301
|
+
exports.default = new VisionCaptureLogTestSuite();
|
|
302
|
+
//# sourceMappingURL=vision-capture-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vision-capture-log.js","sourceRoot":"","sources":["../../../src/tests/e2e/vision-capture-log.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TestSuite, IAgentRuntime } from '@elizaos/core';\nimport { VisionService } from '../../service';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\n\nexport class VisionCaptureLogTestSuite implements TestSuite {\n name = 'plugin-vision-capture-log';\n description = 'Captures 30 seconds of vision data and saves to logs for analysis';\n\n tests = [\n {\n name: 'Should capture and log 30 seconds of vision data',\n fn: async (runtime: IAgentRuntime) => {\n console.log('Starting 30-second vision capture test...');\n\n const visionService = runtime.getService<VisionService>('VISION');\n if (!visionService) {\n throw new Error('Vision service not available');\n }\n\n if (!visionService.isActive()) {\n console.warn('ā ļø Vision service not active - no camera available');\n console.log(' Cannot capture vision data without a camera');\n return;\n }\n\n // Create logs directory if it doesn't exist\n const logsDir = path.join(process.cwd(), 'logs');\n const sessionDir = path.join(\n logsDir,\n `vision-capture-${new Date().toISOString().replace(/[:.]/g, '-')}`\n );\n await fs.mkdir(sessionDir, { recursive: true });\n\n console.log(`ā Created log directory: ${sessionDir}`);\n\n // Initialize capture data\n const captureData = {\n sessionId: `vision-capture-${Date.now()}`,\n startTime: new Date().toISOString(),\n endTime: '',\n runtime: {\n agentId: runtime.agentId,\n characterName: runtime.character.name,\n },\n camera: visionService.getCameraInfo(),\n captures: [] as any[],\n statistics: {\n totalFrames: 0,\n totalSceneChanges: 0,\n totalObjectsDetected: 0,\n totalPeopleDetected: 0,\n averageChangePercentage: 0,\n objectTypeCounts: {} as Record<string, number>,\n poseCounts: {} as Record<string, number>,\n },\n };\n\n // Capture interval - every 500ms for 30 seconds = 60 captures\n const captureInterval = 500;\n const totalDuration = 30000;\n const expectedCaptures = totalDuration / captureInterval;\n\n console.log(\n `šø Capturing vision data every ${captureInterval}ms for ${totalDuration / 1000} seconds...`\n );\n console.log(` Expected captures: ${expectedCaptures}`);\n\n let captureCount = 0;\n let totalChangePercentage = 0;\n let lastLoggedProgress = 0;\n\n const startTime = Date.now();\n\n while (Date.now() - startTime < totalDuration) {\n const captureStartTime = Date.now();\n\n try {\n // Get current scene description\n const scene = await visionService.getSceneDescription();\n const frame = await visionService.getCurrentFrame();\n\n // Capture image as base64\n const imageBuffer = await visionService.captureImage();\n let imageBase64: string | null = null;\n if (imageBuffer) {\n imageBase64 = imageBuffer.toString('base64');\n }\n\n const capture = {\n index: captureCount,\n timestamp: new Date().toISOString(),\n timestampMs: Date.now(),\n elapsedMs: Date.now() - startTime,\n scene: scene\n ? {\n description: scene.description,\n changePercentage: scene.changePercentage,\n sceneChanged: scene.sceneChanged,\n objectCount: scene.objects.length,\n peopleCount: scene.people.length,\n objects: scene.objects,\n people: scene.people,\n }\n : null,\n frame: frame\n ? {\n width: frame.width,\n height: frame.height,\n format: frame.format,\n timestamp: frame.timestamp,\n }\n : null,\n imageBase64: imageBase64 ?? null,\n };\n\n captureData.captures.push(capture);\n\n // Save full image separately\n if (imageBase64) {\n const imagePath = path.join(\n sessionDir,\n `capture-${String(captureCount).padStart(3, '0')}.jpg`\n );\n await fs.writeFile(imagePath, Buffer.from(imageBase64, 'base64'));\n }\n\n // Update statistics\n if (scene) {\n captureData.statistics.totalFrames++;\n if (scene.sceneChanged) {\n captureData.statistics.totalSceneChanges++;\n }\n if (scene.changePercentage) {\n totalChangePercentage += scene.changePercentage;\n }\n captureData.statistics.totalObjectsDetected += scene.objects.length;\n captureData.statistics.totalPeopleDetected += scene.people.length;\n\n // Count object types\n for (const obj of scene.objects) {\n captureData.statistics.objectTypeCounts[obj.type] =\n (captureData.statistics.objectTypeCounts[obj.type] || 0) + 1;\n }\n\n // Count poses\n for (const person of scene.people) {\n captureData.statistics.poseCounts[person.pose] =\n (captureData.statistics.poseCounts[person.pose] || 0) + 1;\n }\n\n // Save detailed scene log\n const sceneLogPath = path.join(\n sessionDir,\n `scene-${String(captureCount).padStart(3, '0')}.json`\n );\n await fs.writeFile(\n sceneLogPath,\n JSON.stringify(\n {\n capture: captureCount,\n timestamp: capture.timestamp,\n scene,\n frame: frame\n ? {\n width: frame.width,\n height: frame.height,\n format: frame.format,\n }\n : null,\n },\n null,\n 2\n )\n );\n }\n\n captureCount++;\n\n // Progress logging every 5 seconds\n const elapsedSeconds = Math.floor((Date.now() - startTime) / 1000);\n if (elapsedSeconds > lastLoggedProgress && elapsedSeconds % 5 === 0) {\n lastLoggedProgress = elapsedSeconds;\n const progress = (elapsedSeconds / 30) * 100;\n console.log(\n ` Progress: ${progress.toFixed(0)}% (${elapsedSeconds}/30s) - Captured ${captureCount} frames`\n );\n\n if (scene) {\n console.log(` Last scene: \"${scene.description.substring(0, 60)}...\"`);\n if (scene.objects.length > 0 || scene.people.length > 0) {\n console.log(\n ` Detected: ${scene.objects.length} objects, ${scene.people.length} people`\n );\n }\n }\n }\n } catch (error) {\n console.error(` Error in capture ${captureCount}:`, error);\n captureData.captures.push({\n index: captureCount,\n timestamp: new Date().toISOString(),\n error: error instanceof Error ? error.message : String(error),\n });\n captureCount++;\n }\n\n // Wait for next capture interval\n const captureEndTime = Date.now();\n const captureDuration = captureEndTime - captureStartTime;\n const waitTime = Math.max(0, captureInterval - captureDuration);\n\n if (waitTime > 0) {\n await new Promise((resolve) => setTimeout(resolve, waitTime));\n }\n }\n\n // Finalize statistics\n captureData.endTime = new Date().toISOString();\n captureData.statistics.averageChangePercentage =\n captureData.statistics.totalFrames > 0\n ? totalChangePercentage / captureData.statistics.totalFrames\n : 0;\n\n // Save main capture log\n const mainLogPath = path.join(sessionDir, 'vision-capture-summary.json');\n await fs.writeFile(mainLogPath, JSON.stringify(captureData, null, 2));\n\n // Generate markdown report\n const reportPath = path.join(sessionDir, 'vision-capture-report.md');\n const report = `# Vision Capture Report\n\n## Session Information\n- **Session ID**: ${captureData.sessionId}\n- **Start Time**: ${captureData.startTime}\n- **End Time**: ${captureData.endTime}\n- **Duration**: 30 seconds\n- **Agent**: ${captureData.runtime.characterName} (${captureData.runtime.agentId})\n\n## Camera Information\n- **Name**: ${captureData.camera?.name || 'Unknown'}\n- **ID**: ${captureData.camera?.id || 'Unknown'}\n\n## Capture Statistics\n- **Total Frames Captured**: ${captureCount}\n- **Total Scene Changes**: ${captureData.statistics.totalSceneChanges}\n- **Average Change Percentage**: ${captureData.statistics.averageChangePercentage.toFixed(2)}%\n- **Total Objects Detected**: ${captureData.statistics.totalObjectsDetected}\n- **Total People Detected**: ${captureData.statistics.totalPeopleDetected}\n\n## Object Type Distribution\n${\n Object.entries(captureData.statistics.objectTypeCounts)\n .sort(([, a], [, b]) => b - a)\n .map(([type, count]) => `- **${type}**: ${count} detections`)\n .join('\\n') || '- No objects detected'\n}\n\n## Pose Distribution\n${\n Object.entries(captureData.statistics.poseCounts)\n .map(([pose, count]) => `- **${pose}**: ${count} detections`)\n .join('\\n') || '- No people detected'\n}\n\n## Sample Scene Descriptions\n${captureData.captures\n .filter((c) => c.scene?.description)\n .slice(0, 5)\n .map(\n (c, _i) => `### Capture ${c.index} (${c.elapsedMs}ms)\n\"${c.scene.description}\"\n- Change: ${c.scene.changePercentage?.toFixed(1)}%\n- Objects: ${c.scene.objectCount}\n- People: ${c.scene.peopleCount}`\n )\n .join('\\n\\n')}\n\n## Files Generated\n- \\`vision-capture-summary.json\\` - Complete capture data\n- \\`vision-capture-report.md\\` - This report\n- \\`capture-XXX.jpg\\` - Individual captured images\n- \\`scene-XXX.json\\` - Detailed scene data for each capture\n`;\n\n await fs.writeFile(reportPath, report);\n\n console.log('\\nā
Vision capture test completed!');\n console.log('š Capture Summary:');\n console.log(` - Total frames: ${captureCount}`);\n console.log(` - Scene changes: ${captureData.statistics.totalSceneChanges}`);\n console.log(\n ` - Average change: ${captureData.statistics.averageChangePercentage.toFixed(2)}%`\n );\n console.log(` - Objects detected: ${captureData.statistics.totalObjectsDetected}`);\n console.log(` - People detected: ${captureData.statistics.totalPeopleDetected}`);\n console.log(`\\nš Results saved to: ${sessionDir}`);\n console.log(' - Summary: vision-capture-summary.json');\n console.log(' - Report: vision-capture-report.md');\n console.log(' - Images: capture-XXX.jpg');\n console.log(' - Scene data: scene-XXX.json');\n\n console.log('ā
Vision capture log test PASSED');\n },\n },\n ];\n}\n\nexport default new VisionCaptureLogTestSuite();\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { TestSuite } from '@elizaos/core';
|
|
2
|
+
export declare class VisionRuntimeTestSuite implements TestSuite {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
tests: {
|
|
6
|
+
name: string;
|
|
7
|
+
fn: (runtime: any) => Promise<void>;
|
|
8
|
+
}[];
|
|
9
|
+
}
|
|
10
|
+
declare const _default: VisionRuntimeTestSuite;
|
|
11
|
+
export default _default;
|