@veolab/discoverylab 1.4.4 → 1.6.5
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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +70 -211
- package/assets/applab-bundle-icon.png +0 -0
- package/assets/icons/icons8-claude-150.png +0 -0
- package/assets/icons/icons8-claude-500.png +0 -0
- package/dist/{chunk-CUBQRT5L.js → chunk-JAA53ES7.js} +111 -2
- package/dist/{chunk-HB3YPWF3.js → chunk-Q7Q3A2ZI.js} +301 -10
- package/dist/{chunk-XKX6NBHF.js → chunk-TWRWARU4.js} +52 -2
- package/dist/{chunk-2UUMLAVR.js → chunk-V6RREMYD.js} +332 -38
- package/dist/cli.js +164 -28
- package/dist/export/infographic-template.html +254 -0
- package/dist/import-W2JEW254.js +180 -0
- package/dist/index.d.ts +30 -6
- package/dist/index.html +473 -11
- package/dist/index.js +5 -5
- package/dist/infographic-GQAHEOAA.js +183 -0
- package/dist/mcpb/node_modules/@anthropic-ai/sdk/src/lib/.keep +4 -0
- package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/Release/better_sqlite3.node.d +1 -0
- package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/Release/obj.target/better_sqlite3/src/better_sqlite3.o.d +133 -0
- package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/Release/obj.target/deps/locate_sqlite3.stamp.d +1 -0
- package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/Release/obj.target/sqlite3/gen/sqlite3/sqlite3.o.d +4 -0
- package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/Release/obj.target/test_extension/deps/test_extension.o.d +7 -0
- package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/Release/sqlite3.a.d +1 -0
- package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/Release/test_extension.node.d +1 -0
- package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/ba23eeee118cd63e16015df367567cb043fed872.intermediate.d +1 -0
- package/dist/{server-QFNKZCOJ.js → server-C2NZM2RV.js} +1 -1
- package/dist/{server-OVOACIOJ.js → server-WN6DCCUA.js} +1 -1
- package/dist/{setup-6JJYKKBS.js → setup-SMN7FJNZ.js} +5 -2
- package/dist/{tools-Q7OZO732.js → tools-VXU3JEQP.js} +6 -4
- package/doc/esvp-protocol.md +116 -0
- package/package.json +9 -3
- package/skills/knowledge-brain/SKILL.md +44 -43
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import "./chunk-R5U7XKVJ.js";
|
|
2
|
+
|
|
3
|
+
// src/core/export/infographic.ts
|
|
4
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, statSync } from "fs";
|
|
5
|
+
import { join, dirname, extname } from "path";
|
|
6
|
+
import { fileURLToPath } from "url";
|
|
7
|
+
function findTemplate() {
|
|
8
|
+
const __dir = dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
const possiblePaths = [
|
|
10
|
+
join(__dir, "infographic-template.html"),
|
|
11
|
+
join(__dir, "..", "export", "infographic-template.html"),
|
|
12
|
+
join(process.cwd(), "dist", "export", "infographic-template.html"),
|
|
13
|
+
join(process.cwd(), "src", "core", "export", "infographic-template.html")
|
|
14
|
+
];
|
|
15
|
+
for (const p of possiblePaths) {
|
|
16
|
+
if (existsSync(p)) return p;
|
|
17
|
+
}
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
function imageToBase64(imagePath) {
|
|
21
|
+
if (!existsSync(imagePath)) return "";
|
|
22
|
+
const buffer = readFileSync(imagePath);
|
|
23
|
+
const ext = extname(imagePath).toLowerCase();
|
|
24
|
+
const mimeTypes = {
|
|
25
|
+
".png": "image/png",
|
|
26
|
+
".jpg": "image/jpeg",
|
|
27
|
+
".jpeg": "image/jpeg",
|
|
28
|
+
".webp": "image/webp",
|
|
29
|
+
".gif": "image/gif"
|
|
30
|
+
};
|
|
31
|
+
const mime = mimeTypes[ext] || "image/png";
|
|
32
|
+
return `data:${mime};base64,${buffer.toString("base64")}`;
|
|
33
|
+
}
|
|
34
|
+
function stripMarkdown(text) {
|
|
35
|
+
return text.replace(/\*\*(.+?)\*\*/g, "$1").replace(/\*(.+?)\*/g, "$1").replace(/__(.+?)__/g, "$1").replace(/_(.+?)_/g, "$1").replace(/`(.+?)`/g, "$1").replace(/^#{1,3}\s+/gm, "").replace(/^-\s+/gm, "").replace(/^\d+\.\s+/gm, "").replace(/\[(.+?)\]\(.*?\)/g, "$1").trim();
|
|
36
|
+
}
|
|
37
|
+
function collectFrameImages(framesDir, videoPath, projectsDir, projectId) {
|
|
38
|
+
const imageExts = /\.(png|jpg|jpeg|webp|gif)$/i;
|
|
39
|
+
const dirs = [
|
|
40
|
+
framesDir,
|
|
41
|
+
...videoPath ? [join(videoPath, "screenshots"), videoPath] : [],
|
|
42
|
+
...projectsDir && projectId ? [
|
|
43
|
+
join(projectsDir, "maestro-recordings", projectId, "screenshots"),
|
|
44
|
+
join(projectsDir, "web-recordings", projectId, "screenshots")
|
|
45
|
+
] : []
|
|
46
|
+
];
|
|
47
|
+
for (const dir of dirs) {
|
|
48
|
+
if (!existsSync(dir) || !statSync(dir).isDirectory()) continue;
|
|
49
|
+
const files = readdirSync(dir).filter((f) => imageExts.test(f)).sort().map((f) => join(dir, f));
|
|
50
|
+
if (files.length > 0) return files;
|
|
51
|
+
}
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
function buildInfographicData(project, frameFiles, frameOcr, annotations) {
|
|
55
|
+
let flowSteps = [];
|
|
56
|
+
let uiElements = [];
|
|
57
|
+
if (project.aiSummary) {
|
|
58
|
+
const flowMatch = project.aiSummary.match(/## (?:User Flow|Likely User Flow)\n([\s\S]*?)(?=\n##|\n$|$)/);
|
|
59
|
+
if (flowMatch) {
|
|
60
|
+
flowSteps = (flowMatch[1].match(/^\d+\.\s+(.+)$/gm) || []).map((s) => s.replace(/^\d+\.\s+/, ""));
|
|
61
|
+
}
|
|
62
|
+
const uiMatch = project.aiSummary.match(/## (?:UI Elements Found|Key UI Elements)\n([\s\S]*?)(?=\n##|\n$|$)/);
|
|
63
|
+
if (uiMatch) {
|
|
64
|
+
uiElements = (uiMatch[1].match(/^-\s+(.+)$/gm) || []).map((s) => s.replace(/^-\s+/, ""));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const elementsPerFrame = Math.max(1, Math.ceil(uiElements.length / Math.max(frameFiles.length, 1)));
|
|
68
|
+
const hotspotColors = ["#818CF8", "#34D399", "#F59E0B", "#EC4899", "#06B6D4", "#8B5CF6"];
|
|
69
|
+
const hotspotPositions = [
|
|
70
|
+
{ x: 50, y: 8 },
|
|
71
|
+
// top center (nav bar)
|
|
72
|
+
{ x: 15, y: 30 },
|
|
73
|
+
// left middle
|
|
74
|
+
{ x: 85, y: 30 },
|
|
75
|
+
// right middle
|
|
76
|
+
{ x: 50, y: 50 },
|
|
77
|
+
// center
|
|
78
|
+
{ x: 50, y: 85 },
|
|
79
|
+
// bottom center (tab bar)
|
|
80
|
+
{ x: 15, y: 70 }
|
|
81
|
+
// bottom left
|
|
82
|
+
];
|
|
83
|
+
const frames = frameFiles.map((filePath, i) => {
|
|
84
|
+
const rawStepName = annotations?.[i]?.label || flowSteps[i] || `Step ${i + 1}`;
|
|
85
|
+
const stepName = stripMarkdown(rawStepName);
|
|
86
|
+
const ocr = frameOcr[i]?.ocrText || "";
|
|
87
|
+
const rawDesc = flowSteps[i] || ocr.slice(0, 100) || `Screen ${i + 1}`;
|
|
88
|
+
const description = stripMarkdown(rawDesc);
|
|
89
|
+
const hotspots = [];
|
|
90
|
+
const startIdx = i * elementsPerFrame;
|
|
91
|
+
const frameElements = uiElements.slice(startIdx, startIdx + elementsPerFrame).slice(0, 4);
|
|
92
|
+
frameElements.forEach((el, j) => {
|
|
93
|
+
const cleanEl = stripMarkdown(el);
|
|
94
|
+
const pos = hotspotPositions[j % hotspotPositions.length];
|
|
95
|
+
hotspots.push({
|
|
96
|
+
id: String.fromCharCode(65 + j),
|
|
97
|
+
x_percent: pos.x,
|
|
98
|
+
y_percent: pos.y,
|
|
99
|
+
label: cleanEl.slice(0, 20),
|
|
100
|
+
title: cleanEl.slice(0, 40),
|
|
101
|
+
description: cleanEl,
|
|
102
|
+
color: hotspotColors[j % hotspotColors.length]
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
if (hotspots.length === 0 && ocr) {
|
|
106
|
+
const ocrWords = ocr.split(/\s+/).filter((w) => w.length > 3).slice(0, 3);
|
|
107
|
+
ocrWords.forEach((w, j) => {
|
|
108
|
+
const pos = hotspotPositions[j % hotspotPositions.length];
|
|
109
|
+
hotspots.push({
|
|
110
|
+
id: String.fromCharCode(65 + j),
|
|
111
|
+
x_percent: pos.x,
|
|
112
|
+
y_percent: pos.y,
|
|
113
|
+
label: w.slice(0, 15),
|
|
114
|
+
title: w,
|
|
115
|
+
description: `Text found: "${w}"`,
|
|
116
|
+
color: hotspotColors[j % hotspotColors.length]
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
id: `frame-${i}`,
|
|
122
|
+
step_name: stepName,
|
|
123
|
+
description,
|
|
124
|
+
base64: imageToBase64(filePath),
|
|
125
|
+
baseline_status: "not_validated",
|
|
126
|
+
hotspots
|
|
127
|
+
};
|
|
128
|
+
});
|
|
129
|
+
return {
|
|
130
|
+
name: project.marketingTitle || project.name,
|
|
131
|
+
platform: project.platform || "unknown",
|
|
132
|
+
recorded_at: project.createdAt instanceof Date ? project.createdAt.toISOString() : typeof project.createdAt === "string" ? project.createdAt : (/* @__PURE__ */ new Date()).toISOString(),
|
|
133
|
+
frames
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
function generateInfographicHtmlString(data) {
|
|
137
|
+
const templatePath = findTemplate();
|
|
138
|
+
if (!templatePath) return null;
|
|
139
|
+
let html = readFileSync(templatePath, "utf-8");
|
|
140
|
+
html = html.replace("__TITLE__", data.name);
|
|
141
|
+
const dataJson = JSON.stringify(data);
|
|
142
|
+
html = html.replace(
|
|
143
|
+
"window.FLOW_DATA || { name: 'Flow', frames: [] }",
|
|
144
|
+
`window.FLOW_DATA || ${dataJson}`
|
|
145
|
+
);
|
|
146
|
+
return html;
|
|
147
|
+
}
|
|
148
|
+
function generateInfographicHtml(data, outputPath) {
|
|
149
|
+
try {
|
|
150
|
+
const templatePath = findTemplate();
|
|
151
|
+
if (!templatePath) {
|
|
152
|
+
return { success: false, error: "Infographic template not found" };
|
|
153
|
+
}
|
|
154
|
+
let html = readFileSync(templatePath, "utf-8");
|
|
155
|
+
html = html.replace("__TITLE__", data.name);
|
|
156
|
+
const dataJson = JSON.stringify(data);
|
|
157
|
+
html = html.replace(
|
|
158
|
+
"window.FLOW_DATA || { name: 'Flow', frames: [] }",
|
|
159
|
+
`window.FLOW_DATA || ${dataJson}`
|
|
160
|
+
);
|
|
161
|
+
const outDir = dirname(outputPath);
|
|
162
|
+
if (!existsSync(outDir)) mkdirSync(outDir, { recursive: true });
|
|
163
|
+
writeFileSync(outputPath, html, "utf-8");
|
|
164
|
+
const stat = statSync(outputPath);
|
|
165
|
+
return {
|
|
166
|
+
success: true,
|
|
167
|
+
outputPath,
|
|
168
|
+
size: stat.size,
|
|
169
|
+
frameCount: data.frames.length
|
|
170
|
+
};
|
|
171
|
+
} catch (error) {
|
|
172
|
+
return {
|
|
173
|
+
success: false,
|
|
174
|
+
error: error instanceof Error ? error.message : String(error)
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
export {
|
|
179
|
+
buildInfographicData,
|
|
180
|
+
collectFrameImages,
|
|
181
|
+
generateInfographicHtml,
|
|
182
|
+
generateInfographicHtmlString
|
|
183
|
+
};
|
package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/Release/better_sqlite3.node.d
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
cmd_Release/better_sqlite3.node := c++ -bundle -undefined dynamic_lookup -Wl,-search_paths_first -Wl,-dead_strip -mmacosx-version-min=10.7 -arch arm64 -L./Release -stdlib=libc++ -o Release/better_sqlite3.node Release/obj.target/better_sqlite3/src/better_sqlite3.o Release/sqlite3.a
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
cmd_Release/obj.target/better_sqlite3/src/better_sqlite3.o := c++ -o Release/obj.target/better_sqlite3/src/better_sqlite3.o ../src/better_sqlite3.cpp '-DNODE_GYP_MODULE_NAME=better_sqlite3' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-D_GLIBCXX_USE_CXX11_ABI=1' '-D_FILE_OFFSET_BITS=64' '-D_DARWIN_USE_64_BIT_INODE=1' '-D_LARGEFILE_SOURCE' '-DOPENSSL_NO_PINSHARED' '-DOPENSSL_THREADS' '-DBUILDING_NODE_EXTENSION' '-DNDEBUG' -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/src -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/deps/openssl/config -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/deps/openssl/openssl/include -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/deps/uv/include -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/deps/zlib -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/deps/v8/include -I./Release/obj/gen/sqlite3 -O3 -fno-strict-aliasing -mmacosx-version-min=10.7 -arch arm64 -Wall -Wendif-labels -W -Wno-unused-parameter -std=gnu++20 -stdlib=libc++ -fno-rtti -fno-exceptions -fvisibility-inlines-hidden -std=c++20 -stdlib=libc++ -MMD -MF ./Release/.deps/Release/obj.target/better_sqlite3/src/better_sqlite3.o.d.raw -c
|
|
2
|
+
Release/obj.target/better_sqlite3/src/better_sqlite3.o: \
|
|
3
|
+
../src/better_sqlite3.cpp ../src/better_sqlite3.hpp \
|
|
4
|
+
Release/obj/gen/sqlite3/sqlite3.h \
|
|
5
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/node.h \
|
|
6
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8.h \
|
|
7
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/cppgc/common.h \
|
|
8
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8config.h \
|
|
9
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-array-buffer.h \
|
|
10
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-local-handle.h \
|
|
11
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-handle-base.h \
|
|
12
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-internal.h \
|
|
13
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-memory-span.h \
|
|
14
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-object.h \
|
|
15
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-maybe.h \
|
|
16
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/cppgc/internal/conditional-stack-allocated.h \
|
|
17
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/cppgc/macros.h \
|
|
18
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/cppgc/internal/compiler-specific.h \
|
|
19
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/cppgc/type-traits.h \
|
|
20
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-persistent-handle.h \
|
|
21
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-weak-callback-info.h \
|
|
22
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-primitive.h \
|
|
23
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-data.h \
|
|
24
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-value.h \
|
|
25
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-sandbox.h \
|
|
26
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-traced-handle.h \
|
|
27
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-platform.h \
|
|
28
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-source-location.h \
|
|
29
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-container.h \
|
|
30
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-context.h \
|
|
31
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-snapshot.h \
|
|
32
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-isolate.h \
|
|
33
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-callbacks.h \
|
|
34
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-promise.h \
|
|
35
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-debug.h \
|
|
36
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-script.h \
|
|
37
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-message.h \
|
|
38
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-embedder-heap.h \
|
|
39
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-exception.h \
|
|
40
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-function-callback.h \
|
|
41
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-microtask.h \
|
|
42
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-statistics.h \
|
|
43
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-unwinder.h \
|
|
44
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-embedder-state-scope.h \
|
|
45
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-date.h \
|
|
46
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-extension.h \
|
|
47
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-external.h \
|
|
48
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-function.h \
|
|
49
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-template.h \
|
|
50
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-initialization.h \
|
|
51
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-json.h \
|
|
52
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-locker.h \
|
|
53
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-microtask-queue.h \
|
|
54
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-primitive-object.h \
|
|
55
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-proxy.h \
|
|
56
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-regexp.h \
|
|
57
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-typed-array.h \
|
|
58
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-value-serializer.h \
|
|
59
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-version.h \
|
|
60
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-wasm.h \
|
|
61
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/node_version.h \
|
|
62
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/node_api.h \
|
|
63
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/js_native_api.h \
|
|
64
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/js_native_api_types.h \
|
|
65
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/node_api_types.h \
|
|
66
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/node_object_wrap.h \
|
|
67
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/node_buffer.h
|
|
68
|
+
../src/better_sqlite3.cpp:
|
|
69
|
+
../src/better_sqlite3.hpp:
|
|
70
|
+
Release/obj/gen/sqlite3/sqlite3.h:
|
|
71
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/node.h:
|
|
72
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8.h:
|
|
73
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/cppgc/common.h:
|
|
74
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8config.h:
|
|
75
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-array-buffer.h:
|
|
76
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-local-handle.h:
|
|
77
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-handle-base.h:
|
|
78
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-internal.h:
|
|
79
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-memory-span.h:
|
|
80
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-object.h:
|
|
81
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-maybe.h:
|
|
82
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/cppgc/internal/conditional-stack-allocated.h:
|
|
83
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/cppgc/macros.h:
|
|
84
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/cppgc/internal/compiler-specific.h:
|
|
85
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/cppgc/type-traits.h:
|
|
86
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-persistent-handle.h:
|
|
87
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-weak-callback-info.h:
|
|
88
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-primitive.h:
|
|
89
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-data.h:
|
|
90
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-value.h:
|
|
91
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-sandbox.h:
|
|
92
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-traced-handle.h:
|
|
93
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-platform.h:
|
|
94
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-source-location.h:
|
|
95
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-container.h:
|
|
96
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-context.h:
|
|
97
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-snapshot.h:
|
|
98
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-isolate.h:
|
|
99
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-callbacks.h:
|
|
100
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-promise.h:
|
|
101
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-debug.h:
|
|
102
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-script.h:
|
|
103
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-message.h:
|
|
104
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-embedder-heap.h:
|
|
105
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-exception.h:
|
|
106
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-function-callback.h:
|
|
107
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-microtask.h:
|
|
108
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-statistics.h:
|
|
109
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-unwinder.h:
|
|
110
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-embedder-state-scope.h:
|
|
111
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-date.h:
|
|
112
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-extension.h:
|
|
113
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-external.h:
|
|
114
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-function.h:
|
|
115
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-template.h:
|
|
116
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-initialization.h:
|
|
117
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-json.h:
|
|
118
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-locker.h:
|
|
119
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-microtask-queue.h:
|
|
120
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-primitive-object.h:
|
|
121
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-proxy.h:
|
|
122
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-regexp.h:
|
|
123
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-typed-array.h:
|
|
124
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-value-serializer.h:
|
|
125
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-version.h:
|
|
126
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-wasm.h:
|
|
127
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/node_version.h:
|
|
128
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/node_api.h:
|
|
129
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/js_native_api.h:
|
|
130
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/js_native_api_types.h:
|
|
131
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/node_api_types.h:
|
|
132
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/node_object_wrap.h:
|
|
133
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/node_buffer.h:
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
cmd_Release/obj.target/deps/locate_sqlite3.stamp := touch Release/obj.target/deps/locate_sqlite3.stamp
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
cmd_Release/obj.target/sqlite3/gen/sqlite3/sqlite3.o := cc -o Release/obj.target/sqlite3/gen/sqlite3/sqlite3.o Release/obj/gen/sqlite3/sqlite3.c '-DNODE_GYP_MODULE_NAME=sqlite3' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-D_GLIBCXX_USE_CXX11_ABI=1' '-D_FILE_OFFSET_BITS=64' '-D_DARWIN_USE_64_BIT_INODE=1' '-D_LARGEFILE_SOURCE' '-DOPENSSL_NO_PINSHARED' '-DOPENSSL_THREADS' '-DHAVE_INT16_T=1' '-DHAVE_INT32_T=1' '-DHAVE_INT8_T=1' '-DHAVE_STDINT_H=1' '-DHAVE_UINT16_T=1' '-DHAVE_UINT32_T=1' '-DHAVE_UINT8_T=1' '-DHAVE_USLEEP=1' '-DSQLITE_DEFAULT_CACHE_SIZE=-16000' '-DSQLITE_DEFAULT_FOREIGN_KEYS=1' '-DSQLITE_DEFAULT_MEMSTATUS=0' '-DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1' '-DSQLITE_DQS=0' '-DSQLITE_ENABLE_COLUMN_METADATA' '-DSQLITE_ENABLE_DBSTAT_VTAB' '-DSQLITE_ENABLE_DESERIALIZE' '-DSQLITE_ENABLE_FTS3' '-DSQLITE_ENABLE_FTS3_PARENTHESIS' '-DSQLITE_ENABLE_FTS4' '-DSQLITE_ENABLE_FTS5' '-DSQLITE_ENABLE_GEOPOLY' '-DSQLITE_ENABLE_JSON1' '-DSQLITE_ENABLE_MATH_FUNCTIONS' '-DSQLITE_ENABLE_RTREE' '-DSQLITE_ENABLE_STAT4' '-DSQLITE_ENABLE_UPDATE_DELETE_LIMIT' '-DSQLITE_LIKE_DOESNT_MATCH_BLOBS' '-DSQLITE_OMIT_DEPRECATED' '-DSQLITE_OMIT_PROGRESS_CALLBACK' '-DSQLITE_OMIT_SHARED_CACHE' '-DSQLITE_OMIT_TCL_VARIABLE' '-DSQLITE_SOUNDEX' '-DSQLITE_THREADSAFE=2' '-DSQLITE_TRACE_SIZE_LIMIT=32' '-DSQLITE_USE_URI=0' '-DNDEBUG' -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/src -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/deps/openssl/config -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/deps/openssl/openssl/include -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/deps/uv/include -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/deps/zlib -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/deps/v8/include -I./Release/obj/gen/sqlite3 -O3 -fno-strict-aliasing -mmacosx-version-min=10.7 -arch arm64 -Wall -Wendif-labels -W -Wno-unused-parameter -w -std=c99 -MMD -MF ./Release/.deps/Release/obj.target/sqlite3/gen/sqlite3/sqlite3.o.d.raw -c
|
|
2
|
+
Release/obj.target/sqlite3/gen/sqlite3/sqlite3.o: \
|
|
3
|
+
Release/obj/gen/sqlite3/sqlite3.c
|
|
4
|
+
Release/obj/gen/sqlite3/sqlite3.c:
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
cmd_Release/obj.target/test_extension/deps/test_extension.o := cc -o Release/obj.target/test_extension/deps/test_extension.o ../deps/test_extension.c '-DNODE_GYP_MODULE_NAME=test_extension' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-D_GLIBCXX_USE_CXX11_ABI=1' '-D_FILE_OFFSET_BITS=64' '-D_DARWIN_USE_64_BIT_INODE=1' '-D_LARGEFILE_SOURCE' '-DOPENSSL_NO_PINSHARED' '-DOPENSSL_THREADS' '-DBUILDING_NODE_EXTENSION' '-DNDEBUG' -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/src -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/deps/openssl/config -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/deps/openssl/openssl/include -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/deps/uv/include -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/deps/zlib -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/deps/v8/include -I./Release/obj/gen/sqlite3 -O3 -fno-strict-aliasing -mmacosx-version-min=10.7 -arch arm64 -Wall -Wendif-labels -W -Wno-unused-parameter -MMD -MF ./Release/.deps/Release/obj.target/test_extension/deps/test_extension.o.d.raw -c
|
|
2
|
+
Release/obj.target/test_extension/deps/test_extension.o: \
|
|
3
|
+
../deps/test_extension.c Release/obj/gen/sqlite3/sqlite3ext.h \
|
|
4
|
+
Release/obj/gen/sqlite3/sqlite3.h
|
|
5
|
+
../deps/test_extension.c:
|
|
6
|
+
Release/obj/gen/sqlite3/sqlite3ext.h:
|
|
7
|
+
Release/obj/gen/sqlite3/sqlite3.h:
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
cmd_Release/sqlite3.a := rm -f Release/sqlite3.a && /Applications/Xcode.app/Contents/Developer/usr/bin/python3 gyp-mac-tool filter-libtool libtool -static -o Release/sqlite3.a Release/obj.target/sqlite3/gen/sqlite3/sqlite3.o
|
package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/Release/test_extension.node.d
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
cmd_Release/test_extension.node := c++ -bundle -undefined dynamic_lookup -Wl,-search_paths_first -Wl,-dead_strip -mmacosx-version-min=10.7 -arch arm64 -L./Release -stdlib=libc++ -o Release/test_extension.node Release/obj.target/test_extension/deps/test_extension.o Release/sqlite3.a
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
cmd_ba23eeee118cd63e16015df367567cb043fed872.intermediate := LD_LIBRARY_PATH=/Users/andersonmelo/work/ander.ai/veolab/applab-discovery/node_modules/better-sqlite3/build/Release/lib.host:/Users/andersonmelo/work/ander.ai/veolab/applab-discovery/node_modules/better-sqlite3/build/Release/lib.target:$$LD_LIBRARY_PATH; export LD_LIBRARY_PATH; cd ../deps; mkdir -p /Users/andersonmelo/work/ander.ai/veolab/applab-discovery/node_modules/better-sqlite3/build/Release/obj/gen/sqlite3; node copy.js "/Users/andersonmelo/work/ander.ai/veolab/applab-discovery/node_modules/better-sqlite3/build/Release/obj/gen/sqlite3" ""
|
|
@@ -2,10 +2,12 @@ import {
|
|
|
2
2
|
setupCheckTool,
|
|
3
3
|
setupInitTool,
|
|
4
4
|
setupInstallTool,
|
|
5
|
+
setupReplayStatusTool,
|
|
5
6
|
setupStatusTool,
|
|
6
7
|
setupTools
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
8
|
+
} from "./chunk-JAA53ES7.js";
|
|
9
|
+
import "./chunk-TWRWARU4.js";
|
|
10
|
+
import "./chunk-GRU332L4.js";
|
|
9
11
|
import "./chunk-6EGBXRDK.js";
|
|
10
12
|
import "./chunk-YYOK2RF7.js";
|
|
11
13
|
import "./chunk-R5U7XKVJ.js";
|
|
@@ -13,6 +15,7 @@ export {
|
|
|
13
15
|
setupCheckTool,
|
|
14
16
|
setupInitTool,
|
|
15
17
|
setupInstallTool,
|
|
18
|
+
setupReplayStatusTool,
|
|
16
19
|
setupStatusTool,
|
|
17
20
|
setupTools
|
|
18
21
|
};
|
|
@@ -107,16 +107,17 @@ import {
|
|
|
107
107
|
uiStatusTool,
|
|
108
108
|
uiTools,
|
|
109
109
|
videoInfoTool
|
|
110
|
-
} from "./chunk-
|
|
110
|
+
} from "./chunk-Q7Q3A2ZI.js";
|
|
111
|
+
import "./chunk-34GGYFXX.js";
|
|
111
112
|
import "./chunk-PMCXEA7J.js";
|
|
112
113
|
import {
|
|
113
114
|
setupCheckTool,
|
|
114
115
|
setupInitTool,
|
|
116
|
+
setupReplayStatusTool,
|
|
115
117
|
setupStatusTool,
|
|
116
118
|
setupTools
|
|
117
|
-
} from "./chunk-
|
|
118
|
-
import "./chunk-
|
|
119
|
-
import "./chunk-34GGYFXX.js";
|
|
119
|
+
} from "./chunk-JAA53ES7.js";
|
|
120
|
+
import "./chunk-TWRWARU4.js";
|
|
120
121
|
import "./chunk-7R5YNOXE.js";
|
|
121
122
|
import "./chunk-3ERJNXYM.js";
|
|
122
123
|
import "./chunk-LB3RNE3O.js";
|
|
@@ -217,6 +218,7 @@ export {
|
|
|
217
218
|
projectTools,
|
|
218
219
|
setupCheckTool,
|
|
219
220
|
setupInitTool,
|
|
221
|
+
setupReplayStatusTool,
|
|
220
222
|
setupStatusTool,
|
|
221
223
|
setupTools,
|
|
222
224
|
startRecordingTool,
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# ESVP Protocol Integration
|
|
2
|
+
|
|
3
|
+
DiscoveryLab includes a built-in client for the open [ESVP protocol](https://esvp.dev) by Entropy Lab — enabling reproducible mobile sessions, automated replay, and network-aware validation.
|
|
4
|
+
|
|
5
|
+
## Configuration
|
|
6
|
+
|
|
7
|
+
| Mode | How |
|
|
8
|
+
|------|-----|
|
|
9
|
+
| **Remote** | Set `ESVP_BASE_URL=http://your-esvp-host:8787` |
|
|
10
|
+
| **Local** | Leave `ESVP_BASE_URL` unset — DiscoveryLab boots an embedded local runtime |
|
|
11
|
+
| **Dev (custom module)** | Set `DISCOVERYLAB_ESVP_LOCAL_MODULE=/path/to/esvp-server-reference/server.js` |
|
|
12
|
+
|
|
13
|
+
## MCP Tools
|
|
14
|
+
|
|
15
|
+
| Tool | Description |
|
|
16
|
+
|------|-------------|
|
|
17
|
+
| `dlab.esvp.status` | Check control-plane health |
|
|
18
|
+
| `dlab.esvp.devices` | List available devices |
|
|
19
|
+
| `dlab.esvp.sessions.list` | List sessions |
|
|
20
|
+
| `dlab.esvp.session.create` | Create session (ios-sim, maestro-ios, adb) |
|
|
21
|
+
| `dlab.esvp.session.get` | Get session details |
|
|
22
|
+
| `dlab.esvp.session.inspect` | Inspect session state |
|
|
23
|
+
| `dlab.esvp.session.transcript` | Get session transcript |
|
|
24
|
+
| `dlab.esvp.session.artifacts.list` | List artifacts |
|
|
25
|
+
| `dlab.esvp.session.artifact.get` | Get specific artifact |
|
|
26
|
+
| `dlab.esvp.session.actions` | Run actions on session |
|
|
27
|
+
| `dlab.esvp.session.checkpoint` | Create checkpoint |
|
|
28
|
+
| `dlab.esvp.session.finish` | Finish session |
|
|
29
|
+
| `dlab.esvp.replay.run` | Replay recording |
|
|
30
|
+
| `dlab.esvp.replay.validate` | Validate replay |
|
|
31
|
+
| `dlab.esvp.session.network` | Get network data |
|
|
32
|
+
| `dlab.esvp.network.configure` | Configure network proxy |
|
|
33
|
+
| `dlab.esvp.network.trace.attach` | Attach network trace |
|
|
34
|
+
| `dlab.project.esvp.current` | Get current project ESVP state |
|
|
35
|
+
| `dlab.project.esvp.validate` | Validate project recording |
|
|
36
|
+
| `dlab.project.esvp.replay` | Replay project recording |
|
|
37
|
+
| `dlab.project.esvp.sync_network` | Sync network traces |
|
|
38
|
+
| `dlab.project.esvp.app_trace_bootstrap` | Bootstrap app tracing |
|
|
39
|
+
|
|
40
|
+
## CLI Commands
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
discoverylab esvp status
|
|
44
|
+
discoverylab esvp devices
|
|
45
|
+
discoverylab esvp sessions
|
|
46
|
+
discoverylab esvp create
|
|
47
|
+
discoverylab esvp get <sessionId>
|
|
48
|
+
discoverylab esvp inspect <sessionId>
|
|
49
|
+
discoverylab esvp transcript <sessionId>
|
|
50
|
+
discoverylab esvp artifacts <sessionId>
|
|
51
|
+
discoverylab esvp artifact <sessionId> <artifactPath>
|
|
52
|
+
discoverylab esvp actions <sessionId>
|
|
53
|
+
discoverylab esvp checkpoint <sessionId>
|
|
54
|
+
discoverylab esvp finish <sessionId>
|
|
55
|
+
discoverylab esvp replay-run <sessionId>
|
|
56
|
+
discoverylab esvp replay-validate <sessionId>
|
|
57
|
+
discoverylab esvp replay-consistency <sessionId>
|
|
58
|
+
discoverylab esvp network <sessionId>
|
|
59
|
+
discoverylab esvp network-configure <sessionId>
|
|
60
|
+
discoverylab esvp network-clear <sessionId>
|
|
61
|
+
discoverylab esvp trace-attach <sessionId>
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Network Proxy
|
|
65
|
+
|
|
66
|
+
DiscoveryLab defaults to `external-proxy` mode — the proxy runs locally and ESVP only persists traces.
|
|
67
|
+
|
|
68
|
+
### Host Rules
|
|
69
|
+
|
|
70
|
+
| Setup | Proxy Address |
|
|
71
|
+
|-------|--------------|
|
|
72
|
+
| macOS + iOS Simulator | `127.0.0.1` |
|
|
73
|
+
| macOS/Linux + Android Emulator | `10.0.2.2` |
|
|
74
|
+
| Physical Android | Host LAN IP |
|
|
75
|
+
|
|
76
|
+
### Environment Variables
|
|
77
|
+
|
|
78
|
+
| Variable | Purpose |
|
|
79
|
+
|----------|---------|
|
|
80
|
+
| `DISCOVERYLAB_NETWORK_PROXY_PORT` | Proxy port |
|
|
81
|
+
| `DISCOVERYLAB_NETWORK_PROXY_HOST` | Proxy host for device |
|
|
82
|
+
| `DISCOVERYLAB_NETWORK_PROXY_BIND_HOST` | Bind address (LAN) |
|
|
83
|
+
| `DISCOVERYLAB_NETWORK_PROXY_PROTOCOL` | Protocol (http/https) |
|
|
84
|
+
| `DISCOVERYLAB_NETWORK_PROXY_BYPASS` | Bypass patterns |
|
|
85
|
+
| `DISCOVERYLAB_NETWORK_PROXY_MAX_DURATION_MS` | Auto-finalize timeout (default: 15min) |
|
|
86
|
+
|
|
87
|
+
### Safety
|
|
88
|
+
|
|
89
|
+
- Proxies auto-finalize after 15 minutes to prevent stale proxy state
|
|
90
|
+
- Settings UI has an emergency lock and "Disable Active Proxy Now" button
|
|
91
|
+
- Server shutdown auto-cleans active proxies
|
|
92
|
+
|
|
93
|
+
## Example Prompts
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
Check my ESVP control-plane health
|
|
97
|
+
Create an ios-sim ESVP session and take a screenshot
|
|
98
|
+
Replay this iOS recording with an external proxy
|
|
99
|
+
Configure a proxy on this session and attach the HTTP trace
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Programmatic Usage
|
|
103
|
+
|
|
104
|
+
```ts
|
|
105
|
+
import { createESVPSession, runESVPActions } from '@veolab/discoverylab';
|
|
106
|
+
|
|
107
|
+
const created = await createESVPSession({
|
|
108
|
+
executor: 'ios-sim',
|
|
109
|
+
meta: { source: 'demo' },
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
await runESVPActions(created.session.id, {
|
|
113
|
+
actions: [{ name: 'screenshot' }],
|
|
114
|
+
finish: true,
|
|
115
|
+
});
|
|
116
|
+
```
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@veolab/discoverylab",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.5",
|
|
4
4
|
"description": "AI-powered app testing & evidence generator - Claude Code Plugin",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -10,8 +10,10 @@
|
|
|
10
10
|
},
|
|
11
11
|
"scripts": {
|
|
12
12
|
"dev": "tsx watch src/cli.ts serve",
|
|
13
|
-
"build": "tsup src/index.ts src/cli.ts --format esm --dts --clean && cp src/web/index.html dist/index.html && mkdir -p dist/visualizations && cp src/core/visualizations/templates/*.html dist/visualizations/ && node scripts/build-host-runtime.mjs --best-effort",
|
|
13
|
+
"build": "tsup src/index.ts src/cli.ts --format esm --dts --clean && cp src/web/index.html dist/index.html && mkdir -p dist/visualizations dist/export && cp src/core/visualizations/templates/*.html dist/visualizations/ && cp src/core/export/infographic-template.html dist/export/ && node scripts/build-host-runtime.mjs --best-effort",
|
|
14
14
|
"build:host-runtime": "node scripts/build-host-runtime.mjs",
|
|
15
|
+
"mcpb:stage": "npm run build && node scripts/stage-mcpb.mjs",
|
|
16
|
+
"mcpb:pack": "npm run mcpb:stage && node scripts/pack-mcpb.mjs",
|
|
15
17
|
"pack:local": "npm run build && npm run build:host-runtime && node scripts/verify-host-runtime-bundle.mjs && npm pack",
|
|
16
18
|
"prepack": "npm run build && npm run build:host-runtime && node scripts/verify-host-runtime-bundle.mjs",
|
|
17
19
|
"start": "node dist/cli.js serve",
|
|
@@ -68,7 +70,7 @@
|
|
|
68
70
|
"claude-plugin": {
|
|
69
71
|
"name": "DiscoveryLab",
|
|
70
72
|
"description": "AI-powered app testing & evidence generator",
|
|
71
|
-
"version": "1.
|
|
73
|
+
"version": "1.6.5",
|
|
72
74
|
"tools": [
|
|
73
75
|
"dlab.capture.screen",
|
|
74
76
|
"dlab.capture.emulator",
|
|
@@ -107,7 +109,11 @@
|
|
|
107
109
|
"dlab.project.save",
|
|
108
110
|
"dlab.project.export",
|
|
109
111
|
"dlab.setup.status",
|
|
112
|
+
"dlab.setup.replay.status",
|
|
110
113
|
"dlab.setup.install",
|
|
114
|
+
"dlab.knowledge.search",
|
|
115
|
+
"dlab.knowledge.summary",
|
|
116
|
+
"dlab.knowledge.open",
|
|
111
117
|
"dlab.template.list",
|
|
112
118
|
"dlab.template.render"
|
|
113
119
|
]
|