@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.
Files changed (33) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/README.md +70 -211
  4. package/assets/applab-bundle-icon.png +0 -0
  5. package/assets/icons/icons8-claude-150.png +0 -0
  6. package/assets/icons/icons8-claude-500.png +0 -0
  7. package/dist/{chunk-CUBQRT5L.js → chunk-JAA53ES7.js} +111 -2
  8. package/dist/{chunk-HB3YPWF3.js → chunk-Q7Q3A2ZI.js} +301 -10
  9. package/dist/{chunk-XKX6NBHF.js → chunk-TWRWARU4.js} +52 -2
  10. package/dist/{chunk-2UUMLAVR.js → chunk-V6RREMYD.js} +332 -38
  11. package/dist/cli.js +164 -28
  12. package/dist/export/infographic-template.html +254 -0
  13. package/dist/import-W2JEW254.js +180 -0
  14. package/dist/index.d.ts +30 -6
  15. package/dist/index.html +473 -11
  16. package/dist/index.js +5 -5
  17. package/dist/infographic-GQAHEOAA.js +183 -0
  18. package/dist/mcpb/node_modules/@anthropic-ai/sdk/src/lib/.keep +4 -0
  19. package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/Release/better_sqlite3.node.d +1 -0
  20. package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/Release/obj.target/better_sqlite3/src/better_sqlite3.o.d +133 -0
  21. package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/Release/obj.target/deps/locate_sqlite3.stamp.d +1 -0
  22. package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/Release/obj.target/sqlite3/gen/sqlite3/sqlite3.o.d +4 -0
  23. package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/Release/obj.target/test_extension/deps/test_extension.o.d +7 -0
  24. package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/Release/sqlite3.a.d +1 -0
  25. package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/Release/test_extension.node.d +1 -0
  26. package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/ba23eeee118cd63e16015df367567cb043fed872.intermediate.d +1 -0
  27. package/dist/{server-QFNKZCOJ.js → server-C2NZM2RV.js} +1 -1
  28. package/dist/{server-OVOACIOJ.js → server-WN6DCCUA.js} +1 -1
  29. package/dist/{setup-6JJYKKBS.js → setup-SMN7FJNZ.js} +5 -2
  30. package/dist/{tools-Q7OZO732.js → tools-VXU3JEQP.js} +6 -4
  31. package/doc/esvp-protocol.md +116 -0
  32. package/package.json +9 -3
  33. 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
+ };
@@ -0,0 +1,4 @@
1
+ File generated from our OpenAPI spec by Stainless.
2
+
3
+ This directory can be used to store custom files to expand the SDK.
4
+ It is ignored by Stainless code generation and its content (other than this keep file) won't be touched.
@@ -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
@@ -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" ""
@@ -3,7 +3,7 @@ import {
3
3
  getServerPort,
4
4
  startServer,
5
5
  stopServer
6
- } from "./chunk-2UUMLAVR.js";
6
+ } from "./chunk-V6RREMYD.js";
7
7
  import "./chunk-34GGYFXX.js";
8
8
  import "./chunk-6GK5K6CS.js";
9
9
  import "./chunk-7R5YNOXE.js";
@@ -4,7 +4,7 @@ import {
4
4
  createJsonResult,
5
5
  createTextResult,
6
6
  mcpServer
7
- } from "./chunk-XKX6NBHF.js";
7
+ } from "./chunk-TWRWARU4.js";
8
8
  import "./chunk-6EGBXRDK.js";
9
9
  import "./chunk-R5U7XKVJ.js";
10
10
  export {
@@ -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-CUBQRT5L.js";
8
- import "./chunk-XKX6NBHF.js";
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-HB3YPWF3.js";
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-CUBQRT5L.js";
118
- import "./chunk-XKX6NBHF.js";
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.4.4",
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.4.4",
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
  ]