@veolab/discoverylab 1.6.3 → 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 (27) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/assets/applab-bundle-icon.png +0 -0
  4. package/assets/icons/icons8-claude-150.png +0 -0
  5. package/assets/icons/icons8-claude-500.png +0 -0
  6. package/dist/{chunk-HFN6BTVO.js → chunk-JAA53ES7.js} +1 -1
  7. package/dist/{chunk-5AISGCS4.js → chunk-Q7Q3A2ZI.js} +136 -3
  8. package/dist/{chunk-XKX6NBHF.js → chunk-TWRWARU4.js} +52 -2
  9. package/dist/{chunk-IVX2OSOJ.js → chunk-V6RREMYD.js} +94 -50
  10. package/dist/cli.js +10 -5
  11. package/dist/index.d.ts +30 -6
  12. package/dist/index.html +70 -19
  13. package/dist/index.js +4 -4
  14. package/dist/mcpb/node_modules/@anthropic-ai/sdk/src/lib/.keep +4 -0
  15. package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/Release/better_sqlite3.node.d +1 -0
  16. package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/Release/obj.target/better_sqlite3/src/better_sqlite3.o.d +133 -0
  17. package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/Release/obj.target/deps/locate_sqlite3.stamp.d +1 -0
  18. package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/Release/obj.target/sqlite3/gen/sqlite3/sqlite3.o.d +4 -0
  19. package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/Release/obj.target/test_extension/deps/test_extension.o.d +7 -0
  20. package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/Release/sqlite3.a.d +1 -0
  21. package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/Release/test_extension.node.d +1 -0
  22. package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/ba23eeee118cd63e16015df367567cb043fed872.intermediate.d +1 -0
  23. package/dist/{server-W3JQ5RG7.js → server-C2NZM2RV.js} +1 -1
  24. package/dist/{server-OVOACIOJ.js → server-WN6DCCUA.js} +1 -1
  25. package/dist/{setup-F7MGEFIM.js → setup-SMN7FJNZ.js} +2 -2
  26. package/dist/{tools-VYFNRUS4.js → tools-VXU3JEQP.js} +3 -3
  27. package/package.json +8 -2
@@ -12,7 +12,7 @@
12
12
  "name": "discoverylab",
13
13
  "source": ".",
14
14
  "description": "AI-powered app testing & marketing asset generator. Record mobile/web apps, run automated tests with Maestro & Playwright, and generate professional screenshots, GIFs, and test reports.",
15
- "version": "1.6.3",
15
+ "version": "1.6.4",
16
16
  "author": {
17
17
  "name": "Anderson Melo"
18
18
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "discoverylab",
3
3
  "description": "AI-powered app testing & marketing asset generator. Record mobile/web apps, run automated tests with Maestro & Playwright, and generate professional screenshots, GIFs, and test reports.",
4
- "version": "1.6.3",
4
+ "version": "1.6.4",
5
5
  "author": {
6
6
  "name": "Anderson Melo",
7
7
  "email": "anderson.90@gmail.com"
Binary file
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createJsonResult,
3
3
  createTextResult
4
- } from "./chunk-XKX6NBHF.js";
4
+ } from "./chunk-TWRWARU4.js";
5
5
  import {
6
6
  LOCAL_ESVP_SERVER_URL,
7
7
  getESVPHealth,
@@ -14,8 +14,9 @@ import {
14
14
  import {
15
15
  createErrorResult,
16
16
  createJsonResult,
17
- createTextResult
18
- } from "./chunk-XKX6NBHF.js";
17
+ createTextResult,
18
+ mcpServer
19
+ } from "./chunk-TWRWARU4.js";
19
20
  import {
20
21
  getAvailableTemplates,
21
22
  isTemplatesInstalled
@@ -6919,6 +6920,102 @@ var templateTools = [
6919
6920
  // src/mcp/tools/knowledge.ts
6920
6921
  import { z as z12 } from "zod";
6921
6922
  import { desc as desc2 } from "drizzle-orm";
6923
+ var KNOWLEDGE_VIEWER_RESOURCE_URI = "ui://discoverylab/knowledge-viewer.html";
6924
+ var KNOWLEDGE_VIEWER_MIME_TYPE = "text/html;profile=mcp-app";
6925
+ function buildViewerPlaceholderHtml(message) {
6926
+ const safeMessage = JSON.stringify(message);
6927
+ return `<!DOCTYPE html>
6928
+ <html lang="en">
6929
+ <head>
6930
+ <meta charset="UTF-8" />
6931
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6932
+ <title>DiscoveryLab Flow Viewer</title>
6933
+ <style>
6934
+ :root {
6935
+ color-scheme: dark;
6936
+ --bg: #0b1117;
6937
+ --panel: rgba(255, 255, 255, 0.04);
6938
+ --border: rgba(255, 255, 255, 0.1);
6939
+ --text: #eff5fb;
6940
+ --muted: #9fb0c2;
6941
+ --accent: #2dd4bf;
6942
+ }
6943
+
6944
+ * { box-sizing: border-box; }
6945
+
6946
+ body {
6947
+ margin: 0;
6948
+ min-height: 100vh;
6949
+ display: grid;
6950
+ place-items: center;
6951
+ padding: 24px;
6952
+ background:
6953
+ radial-gradient(circle at top left, rgba(45, 212, 191, 0.18), transparent 28%),
6954
+ linear-gradient(180deg, #101826, var(--bg));
6955
+ color: var(--text);
6956
+ font: 14px/1.5 "IBM Plex Sans", "Segoe UI", system-ui, sans-serif;
6957
+ }
6958
+
6959
+ .card {
6960
+ width: min(720px, 100%);
6961
+ border: 1px solid var(--border);
6962
+ border-radius: 24px;
6963
+ padding: 24px;
6964
+ background: var(--panel);
6965
+ box-shadow: 0 24px 60px rgba(0, 0, 0, 0.28);
6966
+ }
6967
+
6968
+ .eyebrow {
6969
+ display: inline-flex;
6970
+ align-items: center;
6971
+ gap: 8px;
6972
+ border: 1px solid var(--border);
6973
+ border-radius: 999px;
6974
+ padding: 6px 12px;
6975
+ color: var(--muted);
6976
+ font-size: 12px;
6977
+ text-transform: uppercase;
6978
+ letter-spacing: 0.03em;
6979
+ }
6980
+
6981
+ h1 {
6982
+ margin: 16px 0 8px;
6983
+ font: 700 32px/1.02 "Space Grotesk", "Avenir Next", system-ui, sans-serif;
6984
+ letter-spacing: -0.03em;
6985
+ }
6986
+
6987
+ p {
6988
+ margin: 0;
6989
+ color: var(--muted);
6990
+ }
6991
+ </style>
6992
+ </head>
6993
+ <body>
6994
+ <main class="card">
6995
+ <div class="eyebrow">DiscoveryLab Local Viewer</div>
6996
+ <h1>Open a flow in Claude Desktop</h1>
6997
+ <p id="message"></p>
6998
+ </main>
6999
+ <script>
7000
+ document.getElementById('message').textContent = ${safeMessage};
7001
+ </script>
7002
+ </body>
7003
+ </html>`;
7004
+ }
7005
+ mcpServer.registerResource({
7006
+ uri: KNOWLEDGE_VIEWER_RESOURCE_URI,
7007
+ name: "discoverylab-knowledge-viewer",
7008
+ title: "DiscoveryLab Flow Viewer",
7009
+ description: "Interactive local flow viewer for DiscoveryLab projects.",
7010
+ mimeType: KNOWLEDGE_VIEWER_MIME_TYPE,
7011
+ contents: [
7012
+ {
7013
+ uri: KNOWLEDGE_VIEWER_RESOURCE_URI,
7014
+ mimeType: KNOWLEDGE_VIEWER_MIME_TYPE,
7015
+ text: buildViewerPlaceholderHtml("Use dlab.knowledge.open to load a local project into the canvas.")
7016
+ }
7017
+ ]
7018
+ });
6922
7019
  var knowledgeSearchTool = {
6923
7020
  name: "dlab.knowledge.search",
6924
7021
  description: `Search across all DiscoveryLab projects for app flows, UI elements, screens, and behaviors. Use this when the user asks about how an app works, what a specific screen looks like, or any question about captured app flows. Returns relevant projects with their analysis, OCR text, and context.`,
@@ -7093,6 +7190,11 @@ var knowledgeOpenTool = {
7093
7190
  query: z12.string().optional().describe('Search query to find the project (e.g. "login flow", "onboarding")'),
7094
7191
  projectId: z12.string().optional().describe("Direct project ID if known")
7095
7192
  }),
7193
+ _meta: {
7194
+ ui: {
7195
+ resourceUri: KNOWLEDGE_VIEWER_RESOURCE_URI
7196
+ }
7197
+ },
7096
7198
  handler: async (params) => {
7097
7199
  try {
7098
7200
  const db = getDatabase();
@@ -7148,7 +7250,38 @@ var knowledgeOpenTool = {
7148
7250
  if (!html) {
7149
7251
  return createErrorResult("Failed to generate infographic HTML (template not found)");
7150
7252
  }
7151
- return createTextResult(html);
7253
+ mcpServer.upsertResourceContents(KNOWLEDGE_VIEWER_RESOURCE_URI, {
7254
+ name: "discoverylab-knowledge-viewer",
7255
+ title: `DiscoveryLab Flow Viewer \xB7 ${project.marketingTitle || project.name}`,
7256
+ description: "Interactive local flow viewer for DiscoveryLab projects.",
7257
+ mimeType: KNOWLEDGE_VIEWER_MIME_TYPE,
7258
+ contents: [
7259
+ {
7260
+ uri: KNOWLEDGE_VIEWER_RESOURCE_URI,
7261
+ mimeType: KNOWLEDGE_VIEWER_MIME_TYPE,
7262
+ text: html
7263
+ }
7264
+ ]
7265
+ });
7266
+ return {
7267
+ content: [
7268
+ {
7269
+ type: "text",
7270
+ text: `Opened the local DiscoveryLab flow viewer for ${project.marketingTitle || project.name}.`
7271
+ }
7272
+ ],
7273
+ structuredContent: {
7274
+ projectId: project.id,
7275
+ name: project.marketingTitle || project.name,
7276
+ frameCount: frameFiles.length,
7277
+ platform: project.platform || "unknown"
7278
+ },
7279
+ _meta: {
7280
+ ui: {
7281
+ resourceUri: KNOWLEDGE_VIEWER_RESOURCE_URI
7282
+ }
7283
+ }
7284
+ };
7152
7285
  } catch (error) {
7153
7286
  return createErrorResult(`Failed to open flow: ${error instanceof Error ? error.message : String(error)}`);
7154
7287
  }
@@ -6,6 +6,7 @@ import {
6
6
  import { z } from "zod";
7
7
  var MCPServer = class {
8
8
  tools = /* @__PURE__ */ new Map();
9
+ resources = /* @__PURE__ */ new Map();
9
10
  serverInfo = {
10
11
  name: "discoverylab",
11
12
  version: APP_VERSION
@@ -18,6 +19,15 @@ var MCPServer = class {
18
19
  this.registerTool(tool);
19
20
  }
20
21
  }
22
+ registerResource(resource) {
23
+ this.resources.set(resource.uri, resource);
24
+ }
25
+ upsertResourceContents(uri, resource) {
26
+ this.resources.set(uri, {
27
+ uri,
28
+ ...resource
29
+ });
30
+ }
21
31
  async handleRequest(request) {
22
32
  const { id, method, params } = request;
23
33
  try {
@@ -28,6 +38,10 @@ var MCPServer = class {
28
38
  return this.handleToolsList(id);
29
39
  case "tools/call":
30
40
  return this.handleToolCall(id, params);
41
+ case "resources/list":
42
+ return this.handleResourcesList(id);
43
+ case "resources/read":
44
+ return this.handleResourcesRead(id, params);
31
45
  case "ping":
32
46
  return { jsonrpc: "2.0", id, result: { pong: true } };
33
47
  default:
@@ -54,7 +68,8 @@ var MCPServer = class {
54
68
  protocolVersion: "2024-11-05",
55
69
  serverInfo: this.serverInfo,
56
70
  capabilities: {
57
- tools: {}
71
+ tools: {},
72
+ resources: {}
58
73
  }
59
74
  }
60
75
  };
@@ -63,7 +78,8 @@ var MCPServer = class {
63
78
  const tools = Array.from(this.tools.values()).map((tool) => ({
64
79
  name: tool.name,
65
80
  description: tool.description,
66
- inputSchema: this.zodToJsonSchema(tool.inputSchema)
81
+ inputSchema: this.zodToJsonSchema(tool.inputSchema),
82
+ ...tool._meta ? { _meta: tool._meta } : {}
67
83
  }));
68
84
  return {
69
85
  jsonrpc: "2.0",
@@ -71,6 +87,40 @@ var MCPServer = class {
71
87
  result: { tools }
72
88
  };
73
89
  }
90
+ handleResourcesList(id) {
91
+ const resources = Array.from(this.resources.values()).map((resource) => ({
92
+ uri: resource.uri,
93
+ name: resource.name,
94
+ ...resource.title ? { title: resource.title } : {},
95
+ ...resource.description ? { description: resource.description } : {},
96
+ mimeType: resource.mimeType
97
+ }));
98
+ return {
99
+ jsonrpc: "2.0",
100
+ id,
101
+ result: { resources }
102
+ };
103
+ }
104
+ handleResourcesRead(id, params) {
105
+ const uri = typeof params?.uri === "string" ? params.uri : "";
106
+ const resource = this.resources.get(uri);
107
+ if (!resource) {
108
+ return {
109
+ jsonrpc: "2.0",
110
+ id,
111
+ error: { code: -32602, message: `Resource not found: ${uri}` }
112
+ };
113
+ }
114
+ const contents = Array.isArray(resource.contents) && resource.contents.length > 0 ? resource.contents : [{
115
+ uri: resource.uri,
116
+ mimeType: resource.mimeType
117
+ }];
118
+ return {
119
+ jsonrpc: "2.0",
120
+ id,
121
+ result: { contents }
122
+ };
123
+ }
74
124
  async handleToolCall(id, params) {
75
125
  const { name, arguments: args } = params;
76
126
  const tool = this.tools.get(name);
@@ -67,6 +67,7 @@ import {
67
67
  import {
68
68
  DATA_DIR,
69
69
  EXPORTS_DIR,
70
+ FRAMES_DIR,
70
71
  PROJECTS_DIR,
71
72
  frames,
72
73
  getDatabase,
@@ -3707,7 +3708,7 @@ app.post("/api/upload", async (c) => {
3707
3708
  const { exec: exec2 } = await import("child_process");
3708
3709
  const { promisify } = await import("util");
3709
3710
  const execAsync = promisify(exec2);
3710
- const { PROJECTS_DIR: PROJECTS_DIR2, FRAMES_DIR } = await import("./db-5ECN3O7F.js");
3711
+ const { PROJECTS_DIR: PROJECTS_DIR2, FRAMES_DIR: FRAMES_DIR2 } = await import("./db-5ECN3O7F.js");
3711
3712
  const id = crypto.randomUUID();
3712
3713
  const now = /* @__PURE__ */ new Date();
3713
3714
  const projectDir = join6(PROJECTS_DIR2, id);
@@ -3736,7 +3737,7 @@ app.post("/api/upload", async (c) => {
3736
3737
  let framePaths = [];
3737
3738
  try {
3738
3739
  if (isVideo) {
3739
- const projectFramesDir = join6(FRAMES_DIR, id);
3740
+ const projectFramesDir = join6(FRAMES_DIR2, id);
3740
3741
  if (!fsExists(projectFramesDir)) {
3741
3742
  mkdirSync5(projectFramesDir, { recursive: true });
3742
3743
  }
@@ -4503,8 +4504,8 @@ app.post("/api/analyze/:id", async (c) => {
4503
4504
  const { promisify } = await import("util");
4504
4505
  const { mkdirSync: mkdirSync5, readdirSync: readdirSync5 } = await import("fs");
4505
4506
  const execAsync = promisify(exec2);
4506
- const { FRAMES_DIR } = await import("./db-5ECN3O7F.js");
4507
- const projectFramesDir = join6(FRAMES_DIR, id);
4507
+ const { FRAMES_DIR: FRAMES_DIR2 } = await import("./db-5ECN3O7F.js");
4508
+ const projectFramesDir = join6(FRAMES_DIR2, id);
4508
4509
  if (!existsSync5(projectFramesDir)) {
4509
4510
  mkdirSync5(projectFramesDir, { recursive: true });
4510
4511
  }
@@ -5007,11 +5008,11 @@ app.get("/api/grid/project-frames/:id", async (c) => {
5007
5008
  return c.json({ error: "Project not found" }, 404);
5008
5009
  }
5009
5010
  const project = result[0];
5010
- const { FRAMES_DIR } = await import("./db-5ECN3O7F.js");
5011
+ const { FRAMES_DIR: FRAMES_DIR2 } = await import("./db-5ECN3O7F.js");
5011
5012
  const { readdirSync: readdirSync5 } = await import("fs");
5012
5013
  const availableFrames = [];
5013
5014
  const { isBlankFrame } = await import("./frames-2NFCSKXQ.js");
5014
- const projectFramesDir = join6(FRAMES_DIR, id);
5015
+ const projectFramesDir = join6(FRAMES_DIR2, id);
5015
5016
  if (existsSync5(projectFramesDir)) {
5016
5017
  const frameFiles = readdirSync5(projectFramesDir).filter((f) => /\.(png|jpg|jpeg)$/i.test(f)).sort();
5017
5018
  for (const f of frameFiles) {
@@ -5138,18 +5139,43 @@ function resolveProjectBundleRecordingDir(originalVideoPath, resolvedVideoPath)
5138
5139
  }
5139
5140
  return null;
5140
5141
  }
5141
- function copyProjectExportArtifacts(sourceDir, destinationDir) {
5142
- if (!existsSync5(sourceDir) || !statSync3(sourceDir).isDirectory()) {
5143
- return 0;
5142
+ function collectProjectExportFramePaths(projectId, recordingBaseDir) {
5143
+ const candidateDirs = [
5144
+ join6(FRAMES_DIR, projectId),
5145
+ join6(PROJECTS_DIR, projectId, "frames"),
5146
+ recordingBaseDir ? join6(recordingBaseDir, "screenshots") : null,
5147
+ recordingBaseDir
5148
+ ].filter((value, index, items) => !!value && items.indexOf(value) === index);
5149
+ const framePaths = [];
5150
+ const seen = /* @__PURE__ */ new Set();
5151
+ for (const dirPath of candidateDirs) {
5152
+ if (!existsSync5(dirPath) || !statSync3(dirPath).isDirectory()) {
5153
+ continue;
5154
+ }
5155
+ const files = readdirSync4(dirPath).filter((entry) => /\.(png|jpg|jpeg|webp)$/i.test(entry)).filter((entry) => !entry.startsWith("._")).sort();
5156
+ for (const entry of files) {
5157
+ const absolutePath = join6(dirPath, entry);
5158
+ if (seen.has(absolutePath)) {
5159
+ continue;
5160
+ }
5161
+ seen.add(absolutePath);
5162
+ framePaths.push(absolutePath);
5163
+ }
5144
5164
  }
5145
- let copiedCount = 0;
5146
- for (const entry of readdirSync4(sourceDir)) {
5147
- if (/\.(applab|esvp)$/i.test(entry)) continue;
5148
- if (copyPathIntoExportBundle(join6(sourceDir, entry), join6(destinationDir, entry))) {
5149
- copiedCount += 1;
5165
+ return framePaths;
5166
+ }
5167
+ function resolveAppLabBundleIconPath() {
5168
+ const candidates = [
5169
+ join6(__dirname, "..", "..", "assets", "applab-bundle-icon.png"),
5170
+ join6(__dirname, "..", "assets", "applab-bundle-icon.png"),
5171
+ join6(process.cwd(), "assets", "applab-bundle-icon.png")
5172
+ ];
5173
+ for (const candidate of candidates) {
5174
+ if (existsSync5(candidate)) {
5175
+ return candidate;
5150
5176
  }
5151
5177
  }
5152
- return copiedCount;
5178
+ return null;
5153
5179
  }
5154
5180
  async function runExportCommand(command, args, cwd) {
5155
5181
  await new Promise((resolve, reject) => {
@@ -5282,7 +5308,6 @@ app.post("/api/export", async (c) => {
5282
5308
  const projectFrames = await db.select().from(frames).where(eq(frames.projectId, projectId)).orderBy(frames.frameNumber);
5283
5309
  const exportRecords = await db.select().from(projectExports).where(eq(projectExports.projectId, projectId)).orderBy(desc(projectExports.createdAt));
5284
5310
  const recordingBaseDir = resolveProjectBundleRecordingDir(rawProject.videoPath, resolvedVideoPath);
5285
- const exportArtifactsDir = join6(EXPORTS_DIR, projectId);
5286
5311
  const sessionPath = recordingBaseDir ? join6(recordingBaseDir, "session.json") : null;
5287
5312
  let sessionData = null;
5288
5313
  let networkEntries = [];
@@ -5307,8 +5332,7 @@ app.post("/api/export", async (c) => {
5307
5332
  const summaryPath = rawProject.aiSummary ? "analysis/app-intelligence.md" : null;
5308
5333
  const ocrPath = rawProject.ocrText ? "analysis/ocr.txt" : null;
5309
5334
  const thumbnailName = rawProject.thumbnailPath ? basename3(rawProject.thumbnailPath) : null;
5310
- const resolvedMediaName = resolvedVideoPath ? basename3(resolvedVideoPath) : null;
5311
- const bundledFrames = projectFrames.map((frame) => {
5335
+ let bundledFrames = projectFrames.map((frame) => {
5312
5336
  const extensionMatch = basename3(frame.imagePath).match(/(\.[^.]+)$/);
5313
5337
  const extension = extensionMatch ? extensionMatch[1] : ".png";
5314
5338
  const relativeImagePath = `frames/frame-${String(frame.frameNumber).padStart(4, "0")}${extension}`;
@@ -5318,19 +5342,39 @@ app.post("/api/export", async (c) => {
5318
5342
  imagePath: relativeImagePath
5319
5343
  };
5320
5344
  });
5321
- const mediaFiles = [];
5322
- if (resolvedVideoPath && existsSync5(resolvedVideoPath) && !statSync3(resolvedVideoPath).isDirectory()) {
5323
- const relativePath = `media/${resolvedMediaName}`;
5324
- copyPathIntoExportBundle(resolvedVideoPath, join6(bundleRoot, relativePath));
5325
- mediaFiles.push({ role: "primary-media", path: relativePath });
5345
+ if (bundledFrames.length === 0) {
5346
+ const fallbackFramePaths = collectProjectExportFramePaths(projectId, recordingBaseDir);
5347
+ bundledFrames = fallbackFramePaths.map((framePath, index) => {
5348
+ const extensionMatch = basename3(framePath).match(/(\.[^.]+)$/);
5349
+ const extension = extensionMatch ? extensionMatch[1] : ".png";
5350
+ const relativeImagePath = `frames/frame-${String(index + 1).padStart(4, "0")}${extension}`;
5351
+ copyPathIntoExportBundle(framePath, join6(bundleRoot, relativeImagePath));
5352
+ return {
5353
+ id: `${projectId}-fallback-frame-${index + 1}`,
5354
+ projectId,
5355
+ frameNumber: index + 1,
5356
+ imagePath: relativeImagePath,
5357
+ ocrText: null,
5358
+ timestamp,
5359
+ createdAt: new Date(timestamp),
5360
+ isKeyFrame: null
5361
+ };
5362
+ });
5326
5363
  }
5364
+ const mediaFiles = [];
5327
5365
  if (rawProject.thumbnailPath && existsSync5(rawProject.thumbnailPath) && thumbnailName) {
5328
5366
  const relativePath = `media/${thumbnailName}`;
5329
5367
  copyPathIntoExportBundle(rawProject.thumbnailPath, join6(bundleRoot, relativePath));
5330
5368
  mediaFiles.push({ role: "thumbnail", path: relativePath });
5331
5369
  }
5332
- const recordingIncluded = recordingBaseDir ? copyPathIntoExportBundle(recordingBaseDir, join6(bundleRoot, "recording")) : false;
5333
- const exportArtifactCount = copyProjectExportArtifacts(exportArtifactsDir, join6(bundleRoot, "exports"));
5370
+ const canonicalBundleIconPath = resolveAppLabBundleIconPath();
5371
+ const bundleIconRelativePath = canonicalBundleIconPath ? "media/icon.png" : null;
5372
+ if (canonicalBundleIconPath && bundleIconRelativePath) {
5373
+ copyPathIntoExportBundle(canonicalBundleIconPath, join6(bundleRoot, bundleIconRelativePath));
5374
+ mediaFiles.push({ role: "icon", path: bundleIconRelativePath });
5375
+ }
5376
+ const recordingIncluded = false;
5377
+ const exportArtifactCount = 0;
5334
5378
  const esvpSessionId = resolveProjectESVPSessionId(esvp);
5335
5379
  const esvpServerUrl = resolveProjectESVPServerUrl(esvp);
5336
5380
  let esvpSnapshot = null;
@@ -5352,9 +5396,13 @@ app.post("/api/export", async (c) => {
5352
5396
  }
5353
5397
  const packagedProject = {
5354
5398
  ...normalizedProject,
5355
- videoPath: resolvedMediaName ? `media/${resolvedMediaName}` : normalizedProject.videoPath,
5399
+ videoPath: null,
5356
5400
  thumbnailPath: thumbnailName ? `media/${thumbnailName}` : normalizedProject.thumbnailPath,
5357
- frames: bundledFrames
5401
+ frames: bundledFrames,
5402
+ icon: bundleIconRelativePath ? {
5403
+ path: bundleIconRelativePath,
5404
+ kind: "app-icon"
5405
+ } : null
5358
5406
  };
5359
5407
  writeExportJson(join6(bundleRoot, "manifest.json"), {
5360
5408
  bundleVersion: 1,
@@ -5368,6 +5416,10 @@ app.post("/api/export", async (c) => {
5368
5416
  id: rawProject.id,
5369
5417
  name: rawProject.name,
5370
5418
  platform: rawProject.platform || null,
5419
+ icon: bundleIconRelativePath ? {
5420
+ path: bundleIconRelativePath,
5421
+ kind: "app-icon"
5422
+ } : null,
5371
5423
  frameCount: bundledFrames.length,
5372
5424
  hasRecordingFolder: recordingIncluded,
5373
5425
  hasNetworkTrace: networkEntries.length > 0 || !!networkCapture,
@@ -5419,18 +5471,6 @@ app.post("/api/export", async (c) => {
5419
5471
  if (esvpSnapshot) {
5420
5472
  writeExportJson(join6(bundleRoot, "esvp", "snapshot.json"), esvpSnapshot);
5421
5473
  }
5422
- const projectExportsDir = join6(EXPORTS_DIR, projectId);
5423
- if (existsSync5(projectExportsDir) && statSync3(projectExportsDir).isDirectory()) {
5424
- const rendersDir = join6(bundleRoot, "renders");
5425
- mkdirSync4(rendersDir, { recursive: true });
5426
- const exportFiles = readdirSync4(projectExportsDir);
5427
- for (const f of exportFiles) {
5428
- const src = join6(projectExportsDir, f);
5429
- if (statSync3(src).isFile()) {
5430
- cpSync(src, join6(rendersDir, f));
5431
- }
5432
- }
5433
- }
5434
5474
  const templateContentPath = join6(PROJECTS_DIR, projectId, "template-content.json");
5435
5475
  if (existsSync5(templateContentPath)) {
5436
5476
  mkdirSync4(join6(bundleRoot, "templates"), { recursive: true });
@@ -5443,12 +5483,16 @@ app.post("/api/export", async (c) => {
5443
5483
  "This package bundles the local project context for sharing or re-analysis.",
5444
5484
  "",
5445
5485
  "Included when available:",
5446
- "- original media and thumbnail",
5447
- "- recording folder with session data, screenshots, and test script",
5486
+ "- selected thumbnail and analyzed frames",
5487
+ "- lightweight project/session metadata",
5448
5488
  "- OCR text and app intelligence summary",
5449
5489
  "- network trace, capture metadata, and ESVP snapshot",
5450
- "- previously generated export assets such as grids and renders",
5451
- "- Task Hub links, requirements, and test map"
5490
+ "- Task Hub links, requirements, and test map",
5491
+ "",
5492
+ "Excluded by default to keep the bundle Claude-friendly:",
5493
+ "- original long-form media",
5494
+ "- recording folder",
5495
+ "- generated export assets and renders"
5452
5496
  ].join("\n"));
5453
5497
  outputPath = join6(exportDir, `export-${timestamp}.${format}`);
5454
5498
  mimeType = "application/zip";
@@ -5609,8 +5653,8 @@ app.get("/api/visualization/:projectId/:templateId", async (c) => {
5609
5653
  const db = getDatabase();
5610
5654
  const [project] = await db.select().from(projects).where(eq(projects.id, projectId)).limit(1);
5611
5655
  if (!project) return c.json({ error: "Project not found" }, 404);
5612
- const { FRAMES_DIR } = await import("./db-5ECN3O7F.js");
5613
- const projectFramesDir = join6(FRAMES_DIR, projectId);
5656
+ const { FRAMES_DIR: FRAMES_DIR2 } = await import("./db-5ECN3O7F.js");
5657
+ const projectFramesDir = join6(FRAMES_DIR2, projectId);
5614
5658
  const dbFrames = await db.select().from(frames).where(eq(frames.projectId, projectId)).orderBy(frames.frameNumber).limit(10);
5615
5659
  let frameImages = [];
5616
5660
  if (dbFrames.length > 0) {
@@ -6006,9 +6050,9 @@ app.get("/api/export/document/:projectId", async (c) => {
6006
6050
  const projectFrames = await db.select().from(frames).where(eq(frames.projectId, projectId)).orderBy(frames.frameNumber).limit(20);
6007
6051
  let frameData = projectFrames.map((f) => ({ imagePath: f.imagePath, ocrText: f.ocrText }));
6008
6052
  if (frameData.length === 0 && project.videoPath) {
6009
- const { FRAMES_DIR } = await import("./db-5ECN3O7F.js");
6053
+ const { FRAMES_DIR: FRAMES_DIR2 } = await import("./db-5ECN3O7F.js");
6010
6054
  const dirs = [
6011
- join6(FRAMES_DIR, projectId),
6055
+ join6(FRAMES_DIR2, projectId),
6012
6056
  join6(project.videoPath, "screenshots"),
6013
6057
  join6(PROJECTS_DIR, "maestro-recordings", projectId, "screenshots"),
6014
6058
  join6(PROJECTS_DIR, "web-recordings", projectId, "screenshots")
@@ -6085,7 +6129,7 @@ app.post("/api/export/batch", async (c) => {
6085
6129
  if (!manifest.destination?.type) {
6086
6130
  return c.json({ error: "Destination type required" }, 400);
6087
6131
  }
6088
- const { FRAMES_DIR } = await import("./db-5ECN3O7F.js");
6132
+ const { FRAMES_DIR: FRAMES_DIR2 } = await import("./db-5ECN3O7F.js");
6089
6133
  const dataProvider = {
6090
6134
  async getProject(projectId) {
6091
6135
  const db2 = getDatabase();
@@ -6093,7 +6137,7 @@ app.post("/api/export/batch", async (c) => {
6093
6137
  return p || null;
6094
6138
  },
6095
6139
  getFramesDir(projectId) {
6096
- return join6(FRAMES_DIR, projectId);
6140
+ return join6(FRAMES_DIR2, projectId);
6097
6141
  }
6098
6142
  };
6099
6143
  const result = await executeBatchExport(manifest, dataProvider, (progress) => {
@@ -10112,7 +10156,7 @@ app.get("/api/mobile-chat/providers", async (c) => {
10112
10156
  });
10113
10157
  app.get("/api/setup/status", async (c) => {
10114
10158
  try {
10115
- const { setupStatusTool } = await import("./setup-F7MGEFIM.js");
10159
+ const { setupStatusTool } = await import("./setup-SMN7FJNZ.js");
10116
10160
  const result = await setupStatusTool.handler({});
10117
10161
  const data = JSON.parse(result.content[0].text);
10118
10162
  const idbInstalled = await isIdbInstalled().catch(() => false);
package/dist/cli.js CHANGED
@@ -11,6 +11,7 @@ import "./chunk-R5U7XKVJ.js";
11
11
  import { Command } from "commander";
12
12
  import chalk from "chalk";
13
13
  import open from "open";
14
+ import { fileURLToPath } from "url";
14
15
  var program = new Command();
15
16
  var binName = process.argv[1]?.replace(/.*[\\/]/, "").replace(/\.[^.]+$/, "") === "applab" ? "applab" : "discoverylab";
16
17
  program.name(binName).description("AI-powered app testing & evidence generator - Claude Code Plugin").version(APP_VERSION);
@@ -389,7 +390,7 @@ program.command("serve").alias("server").description("Start the DiscoveryLab web
389
390
  console.log(chalk.cyan("\n DiscoveryLab"));
390
391
  console.log(chalk.gray(" AI-powered app testing & evidence generator\n"));
391
392
  try {
392
- const { startServer } = await import("./server-W3JQ5RG7.js");
393
+ const { startServer } = await import("./server-C2NZM2RV.js");
393
394
  await startServer(port);
394
395
  console.log(chalk.green(` Server running at http://localhost:${port}`));
395
396
  console.log(chalk.gray(" Press Ctrl+C to stop\n"));
@@ -404,7 +405,7 @@ program.command("serve").alias("server").description("Start the DiscoveryLab web
404
405
  program.command("setup").description("Check and configure DiscoveryLab dependencies").action(async () => {
405
406
  console.log(chalk.cyan("\n DiscoveryLab Setup\n"));
406
407
  try {
407
- const { setupStatusTool } = await import("./setup-F7MGEFIM.js");
408
+ const { setupStatusTool } = await import("./setup-SMN7FJNZ.js");
408
409
  const result = await setupStatusTool.handler({});
409
410
  if (result.isError) {
410
411
  console.error(chalk.red(" Setup check failed"));
@@ -459,7 +460,11 @@ program.command("install").description("Install DiscoveryLab as MCP server for C
459
460
  const { existsSync, readFileSync, writeFileSync, mkdirSync } = await import("fs");
460
461
  const { join, dirname } = await import("path");
461
462
  const home = homedir();
462
- const mcpEntry = {
463
+ const localMcpEntrypoint = fileURLToPath(new URL("./index.js", import.meta.url));
464
+ const mcpEntry = existsSync(localMcpEntrypoint) ? {
465
+ command: process.execPath,
466
+ args: [localMcpEntrypoint]
467
+ } : {
463
468
  command: "npx",
464
469
  args: ["-y", "@veolab/discoverylab@latest", "mcp"]
465
470
  };
@@ -531,7 +536,7 @@ program.command("mcp").description("Run as MCP server (for Claude Code integrati
531
536
  try {
532
537
  const { getDatabase } = await import("./db-5ECN3O7F.js");
533
538
  getDatabase();
534
- const { mcpServer } = await import("./server-OVOACIOJ.js");
539
+ const { mcpServer } = await import("./server-WN6DCCUA.js");
535
540
  const {
536
541
  uiTools,
537
542
  projectTools,
@@ -545,7 +550,7 @@ program.command("mcp").description("Run as MCP server (for Claude Code integrati
545
550
  taskHubTools,
546
551
  esvpTools,
547
552
  knowledgeTools
548
- } = await import("./tools-VYFNRUS4.js");
553
+ } = await import("./tools-VXU3JEQP.js");
549
554
  mcpServer.registerTools([
550
555
  ...uiTools,
551
556
  ...projectTools,
package/dist/index.d.ts CHANGED
@@ -13,16 +13,35 @@ interface MCPTool {
13
13
  name: string;
14
14
  description: string;
15
15
  inputSchema: z.ZodType<any>;
16
+ _meta?: Record<string, any>;
16
17
  handler: (params: any) => Promise<MCPToolResult>;
17
18
  }
19
+ interface MCPToolContent {
20
+ type: 'text' | 'image';
21
+ text?: string;
22
+ data?: string;
23
+ mimeType?: string;
24
+ }
18
25
  interface MCPToolResult {
19
- content: Array<{
20
- type: 'text' | 'image';
21
- text?: string;
22
- data?: string;
23
- mimeType?: string;
24
- }>;
26
+ content: MCPToolContent[];
25
27
  isError?: boolean;
28
+ structuredContent?: Record<string, any>;
29
+ _meta?: Record<string, any>;
30
+ }
31
+ interface MCPResourceContents {
32
+ uri: string;
33
+ mimeType: string;
34
+ text?: string;
35
+ blob?: string;
36
+ _meta?: Record<string, any>;
37
+ }
38
+ interface MCPResource {
39
+ uri: string;
40
+ name: string;
41
+ title?: string;
42
+ description?: string;
43
+ mimeType: string;
44
+ contents?: MCPResourceContents[];
26
45
  }
27
46
  interface MCPRequest {
28
47
  jsonrpc: '2.0';
@@ -42,12 +61,17 @@ interface MCPResponse {
42
61
  }
43
62
  declare class MCPServer {
44
63
  private tools;
64
+ private resources;
45
65
  private serverInfo;
46
66
  registerTool(tool: MCPTool): void;
47
67
  registerTools(tools: MCPTool[]): void;
68
+ registerResource(resource: MCPResource): void;
69
+ upsertResourceContents(uri: string, resource: Omit<MCPResource, 'uri'>): void;
48
70
  handleRequest(request: MCPRequest): Promise<MCPResponse>;
49
71
  private handleInitialize;
50
72
  private handleToolsList;
73
+ private handleResourcesList;
74
+ private handleResourcesRead;
51
75
  private handleToolCall;
52
76
  private zodToJsonSchema;
53
77
  runStdio(): Promise<void>;
package/dist/index.html CHANGED
@@ -927,7 +927,7 @@
927
927
  .project-claude-action {
928
928
  position: absolute;
929
929
  top: 8px;
930
- left: 8px;
930
+ right: 8px;
931
931
  display: inline-flex;
932
932
  align-items: center;
933
933
  justify-content: center;
@@ -944,13 +944,20 @@
944
944
  backdrop-filter: blur(10px);
945
945
  }
946
946
 
947
+ .project-claude-action.secondary {
948
+ background: rgba(18, 24, 34, 0.6);
949
+ border-color: rgba(255, 255, 255, 0.1);
950
+ color: var(--text-secondary);
951
+ }
952
+
947
953
  .project-claude-action:hover {
948
954
  transform: translateY(-1px);
949
955
  border-color: rgba(245, 240, 230, 0.5);
950
956
  background: rgba(17, 24, 32, 0.92);
951
957
  }
952
958
 
953
- .project-claude-action svg {
959
+ .project-claude-action svg,
960
+ .project-claude-action img {
954
961
  width: 16px;
955
962
  height: 16px;
956
963
  }
@@ -1092,10 +1099,12 @@
1092
1099
  transform: none;
1093
1100
  }
1094
1101
 
1095
- .claude-action-btn svg {
1102
+ .claude-action-btn svg,
1103
+ .claude-action-btn img {
1096
1104
  width: 14px;
1097
1105
  height: 14px;
1098
1106
  flex-shrink: 0;
1107
+ object-fit: contain;
1099
1108
  }
1100
1109
 
1101
1110
  .project-meta {
@@ -8235,14 +8244,19 @@
8235
8244
 
8236
8245
  function getClaudeIconSvg() {
8237
8246
  return `
8238
- <svg viewBox="0 0 24 24" fill="none" aria-hidden="true">
8239
- <path d="M12 3.5c-2.1 0-3.8 1-4.9 2.8C4.9 6.5 3.5 8.4 3.5 11c0 3.9 2.9 6.8 7.1 8.7a3 3 0 0 0 2.8 0c4.1-1.9 7.1-4.8 7.1-8.7 0-2.6-1.4-4.5-3.6-4.7C15.8 4.5 14.1 3.5 12 3.5Z" stroke="currentColor" stroke-width="1.5"/>
8240
- <path d="M8.5 10.5c.9-1 2.1-1.5 3.5-1.5s2.6.5 3.5 1.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
8241
- <path d="M9.2 13.8c.8.7 1.7 1.1 2.8 1.1 1 0 2-.4 2.8-1.1" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
8242
- </svg>
8247
+ <img src="/assets/icons/icons8-claude-150.png" alt="" aria-hidden="true" />
8243
8248
  `;
8244
8249
  }
8245
8250
 
8251
+ function projectHasRenderableThumb(project) {
8252
+ if (!project) return false;
8253
+ if (project.thumbnailPath) return true;
8254
+ if (!project.videoPath) return false;
8255
+
8256
+ const ext = String(project.videoPath).toLowerCase().split('.').pop();
8257
+ return ['png', 'jpg', 'jpeg', 'gif', 'webp', 'mp4', 'mov', 'webm'].includes(ext);
8258
+ }
8259
+
8246
8260
  function isProjectReadyForClaude(project) {
8247
8261
  if (!project) return false;
8248
8262
  if (isProjectAnalyzing(project.status || '')) return false;
@@ -8265,14 +8279,22 @@
8265
8279
  }
8266
8280
 
8267
8281
  function renderClaudeProjectQuickAction(project) {
8268
- if (!claudeDesktopStatus.ready || !isProjectReadyForClaude(project)) {
8282
+ if (!isProjectReadyForClaude(project) || !claudeDesktopStatus.launcherSupported || !projectHasRenderableThumb(project)) {
8269
8283
  return '';
8270
8284
  }
8271
8285
 
8272
- const promptTitle = `Copy prompt and open ${project.name} in Claude Desktop`;
8286
+ const setupNeeded = claudeDesktopStatus.appDetected && !claudeDesktopStatus.mcpConfigured;
8287
+ const ready = claudeDesktopStatus.ready;
8288
+ const promptTitle = ready
8289
+ ? `Copy prompt and open ${project.name} in Claude Desktop`
8290
+ : setupNeeded
8291
+ ? `Copy the ${project.name} prompt and open Claude Desktop`
8292
+ : `Copy the ${project.name} prompt and check Claude Desktop`;
8293
+ const buttonClass = ready ? 'project-claude-action' : 'project-claude-action secondary';
8294
+
8273
8295
  return `
8274
8296
  <button
8275
- class="project-claude-action"
8297
+ class="${buttonClass}"
8276
8298
  type="button"
8277
8299
  data-project-id="${escapeAttr(project.id)}"
8278
8300
  title="${escapeAttr(promptTitle)}"
@@ -8298,7 +8320,7 @@
8298
8320
  : !projectReady
8299
8321
  ? 'Analyze first'
8300
8322
  : setupNeeded
8301
- ? 'Copy install command'
8323
+ ? 'Copy prompt'
8302
8324
  : 'Reload';
8303
8325
  const buttonClass = ready ? 'claude-action-btn' : 'claude-action-btn secondary';
8304
8326
  const action = ready
@@ -8306,7 +8328,7 @@
8306
8328
  : !projectReady
8307
8329
  ? ''
8308
8330
  : setupNeeded
8309
- ? 'copyClaudeDesktopInstallCommand()'
8331
+ ? 'copyCurrentProjectClaudePrompt()'
8310
8332
  : 'refreshClaudeDesktopStatus()';
8311
8333
 
8312
8334
  return `
@@ -8383,6 +8405,30 @@
8383
8405
  });
8384
8406
  }
8385
8407
 
8408
+ async function copyClaudeProjectPrompt(project) {
8409
+ if (!project) return false;
8410
+
8411
+ const copied = await copyToClipboard(buildClaudeDesktopPrompt(project), { silent: true });
8412
+ if (!copied) {
8413
+ showToast('Failed to copy Claude Desktop prompt', 'error');
8414
+ return false;
8415
+ }
8416
+
8417
+ return true;
8418
+ }
8419
+
8420
+ async function copyCurrentProjectClaudePrompt() {
8421
+ if (!currentProject?.id) {
8422
+ showToast('Select a project first', 'warning');
8423
+ return;
8424
+ }
8425
+
8426
+ const copied = await copyClaudeProjectPrompt(currentProject);
8427
+ if (!copied) return;
8428
+
8429
+ showToast('Claude Desktop prompt copied', 'success');
8430
+ }
8431
+
8386
8432
  async function launchClaudeDesktop() {
8387
8433
  const response = await fetch('/api/integrations/claude-desktop/launch', { method: 'POST' });
8388
8434
  const data = await response.json();
@@ -8394,9 +8440,8 @@
8394
8440
  async function copyPromptAndLaunchClaude(project) {
8395
8441
  if (!project) return;
8396
8442
 
8397
- const copied = await copyToClipboard(buildClaudeDesktopPrompt(project), { silent: true });
8443
+ const copied = await copyClaudeProjectPrompt(project);
8398
8444
  if (!copied) {
8399
- showToast('Failed to copy Claude Desktop prompt', 'error');
8400
8445
  return;
8401
8446
  }
8402
8447
 
@@ -8417,11 +8462,17 @@
8417
8462
 
8418
8463
  if (!claudeDesktopStatus.ready) {
8419
8464
  if (claudeDesktopStatus.appDetected && !claudeDesktopStatus.mcpConfigured) {
8420
- copyClaudeDesktopInstallCommand();
8465
+ const copied = await copyClaudeProjectPrompt(project);
8466
+ if (copied) {
8467
+ showToast('Project prompt copied. Enable the DiscoveryLab extension in Claude Desktop to open it there.', 'warning');
8468
+ }
8421
8469
  return;
8422
8470
  }
8423
8471
 
8424
- showToast(claudeDesktopStatus.message || 'Claude Desktop is not ready yet.', 'warning');
8472
+ const copied = await copyClaudeProjectPrompt(project);
8473
+ if (copied) {
8474
+ showToast(claudeDesktopStatus.message || 'Project prompt copied. Claude Desktop is not ready yet.', 'warning');
8475
+ }
8425
8476
  return;
8426
8477
  }
8427
8478
 
@@ -22371,8 +22422,8 @@ appId: ${platform === 'ios' ? 'com.apple.Preferences' : 'com.android.settings'}
22371
22422
  jpg: 'Exports the current capture as JPEG images.',
22372
22423
  mp4: 'Exports the current capture as an MP4 video.',
22373
22424
  gif: 'Exports the current capture as an animated GIF.',
22374
- applab: 'Packages everything App Lab has locally for this project: media, recording session, test script, network trace, OCR, app intelligence, Task Hub data, and prior export artifacts like grids.',
22375
- esvp: 'Packages the full local project plus the attached ESVP session snapshot when available, so you can share trace, scripts, media, OCR, and app intelligence together.',
22425
+ applab: 'Packages a Claude-friendly App Lab bundle: analyzed frames, thumbnail, OCR, app intelligence, network trace, ESVP snapshot, and Task Hub metadata without heavy renders or long recordings.',
22426
+ esvp: 'Packages a lightweight ESVP-ready bundle with analyzed frames, OCR, app intelligence, network trace, and the attached ESVP snapshot when available.',
22376
22427
  };
22377
22428
 
22378
22429
  help.textContent = descriptions[select.value] || '';
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  startServer,
4
4
  stopServer
5
- } from "./chunk-IVX2OSOJ.js";
5
+ } from "./chunk-V6RREMYD.js";
6
6
  import {
7
7
  analyzeTools,
8
8
  canvasTools,
@@ -16,15 +16,15 @@ import {
16
16
  templateTools,
17
17
  testingTools,
18
18
  uiTools
19
- } from "./chunk-5AISGCS4.js";
19
+ } from "./chunk-Q7Q3A2ZI.js";
20
20
  import "./chunk-34GGYFXX.js";
21
21
  import "./chunk-PMCXEA7J.js";
22
22
  import {
23
23
  setupTools
24
- } from "./chunk-HFN6BTVO.js";
24
+ } from "./chunk-JAA53ES7.js";
25
25
  import {
26
26
  mcpServer
27
- } from "./chunk-XKX6NBHF.js";
27
+ } from "./chunk-TWRWARU4.js";
28
28
  import "./chunk-6GK5K6CS.js";
29
29
  import "./chunk-7R5YNOXE.js";
30
30
  import "./chunk-3ERJNXYM.js";
@@ -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-IVX2OSOJ.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 {
@@ -5,8 +5,8 @@ import {
5
5
  setupReplayStatusTool,
6
6
  setupStatusTool,
7
7
  setupTools
8
- } from "./chunk-HFN6BTVO.js";
9
- import "./chunk-XKX6NBHF.js";
8
+ } from "./chunk-JAA53ES7.js";
9
+ import "./chunk-TWRWARU4.js";
10
10
  import "./chunk-GRU332L4.js";
11
11
  import "./chunk-6EGBXRDK.js";
12
12
  import "./chunk-YYOK2RF7.js";
@@ -107,7 +107,7 @@ import {
107
107
  uiStatusTool,
108
108
  uiTools,
109
109
  videoInfoTool
110
- } from "./chunk-5AISGCS4.js";
110
+ } from "./chunk-Q7Q3A2ZI.js";
111
111
  import "./chunk-34GGYFXX.js";
112
112
  import "./chunk-PMCXEA7J.js";
113
113
  import {
@@ -116,8 +116,8 @@ import {
116
116
  setupReplayStatusTool,
117
117
  setupStatusTool,
118
118
  setupTools
119
- } from "./chunk-HFN6BTVO.js";
120
- import "./chunk-XKX6NBHF.js";
119
+ } from "./chunk-JAA53ES7.js";
120
+ import "./chunk-TWRWARU4.js";
121
121
  import "./chunk-7R5YNOXE.js";
122
122
  import "./chunk-3ERJNXYM.js";
123
123
  import "./chunk-LB3RNE3O.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@veolab/discoverylab",
3
- "version": "1.6.3",
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",
@@ -12,6 +12,8 @@
12
12
  "dev": "tsx watch src/cli.ts serve",
13
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.6.3",
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
  ]