@veolab/discoverylab 1.3.4 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/dist/chunk-34KRJWZL.js +477 -0
  4. package/dist/chunk-4VNS5WPM.js +42 -0
  5. package/dist/{chunk-FIL7IWEL.js → chunk-DGXAP477.js} +1 -1
  6. package/dist/{chunk-HGWEHWKJ.js → chunk-DKAX5RCX.js} +1 -1
  7. package/dist/{chunk-7EDIUVIO.js → chunk-EU63HPKT.js} +1 -1
  8. package/dist/chunk-QMUEC6B5.js +288 -0
  9. package/dist/{chunk-FNUN7EPB.js → chunk-RCY26WEK.js} +2 -2
  10. package/dist/{chunk-ZLHIHMSL.js → chunk-SWZIBO2R.js} +1 -1
  11. package/dist/chunk-VYYAP5G5.js +265 -0
  12. package/dist/{chunk-VVIOB362.js → chunk-XAMA3JJG.js} +18 -1
  13. package/dist/{chunk-BE7BFMYC.js → chunk-XWBFSSNB.js} +10224 -393
  14. package/dist/{chunk-AHVBE25Y.js → chunk-YNLUOZSZ.js} +274 -667
  15. package/dist/cli.js +33 -31
  16. package/dist/{db-6WLEVKUV.js → db-745LC5YC.js} +2 -2
  17. package/dist/document-AE4XI2CP.js +104 -0
  18. package/dist/{esvp-KVOWYW6G.js → esvp-4LIAU76K.js} +3 -3
  19. package/dist/{esvp-mobile-GZ5EMYPG.js → esvp-mobile-FKFHDS5Q.js} +4 -4
  20. package/dist/frames-RCNLSDD6.js +24 -0
  21. package/dist/{gridCompositor-M3K3LCLZ.js → gridCompositor-VUWBZXYL.js} +262 -3
  22. package/dist/index.d.ts +32 -0
  23. package/dist/index.html +1197 -9
  24. package/dist/index.js +15 -10
  25. package/dist/notion-api-OXSWOJPZ.js +190 -0
  26. package/dist/{ocr-QDYNCSPE.js → ocr-FXRLEP66.js} +1 -1
  27. package/dist/{playwright-VZ7PXDC5.js → playwright-GYKUH34L.js} +3 -3
  28. package/dist/renderer-D22GCMMD.js +17 -0
  29. package/dist/{server-6N3KIEGP.js → server-NTT2XGCC.js} +1 -1
  30. package/dist/server-TKYRIYJ6.js +24 -0
  31. package/dist/{setup-2SQC5UHJ.js → setup-O6WQQAGP.js} +3 -3
  32. package/dist/templates/bundle/bundle.js +4 -2
  33. package/dist/{tools-YGM5HRIB.js → tools-FVVWKEGC.js} +15 -7
  34. package/package.json +2 -2
  35. package/skills/knowledge-brain/SKILL.md +81 -0
  36. package/dist/chunk-MLKGABMK.js +0 -9
  37. package/dist/server-QKZXPZRC.js +0 -22
package/dist/cli.js CHANGED
@@ -5,7 +5,7 @@ import {
5
5
  import {
6
6
  APP_VERSION
7
7
  } from "./chunk-6EGBXRDK.js";
8
- import "./chunk-MLKGABMK.js";
8
+ import "./chunk-4VNS5WPM.js";
9
9
 
10
10
  // src/cli.ts
11
11
  import { Command } from "commander";
@@ -57,7 +57,7 @@ async function withESVPCli(action) {
57
57
  }
58
58
  }
59
59
  async function getESVPBaseResult(serverUrl) {
60
- const { getESVPConnection } = await import("./esvp-KVOWYW6G.js");
60
+ const { getESVPConnection } = await import("./esvp-4LIAU76K.js");
61
61
  const connection = await getESVPConnection(serverUrl);
62
62
  return {
63
63
  serverUrl: connection.serverUrl,
@@ -72,7 +72,7 @@ function executorToPlatform(executor) {
72
72
  var esvp = program.command("esvp").description("Access the public ESVP protocol and runtime from the CLI");
73
73
  esvp.command("status").description("Check the configured ESVP server health").option("-s, --server <url>", "ESVP base URL").action(async (options) => {
74
74
  await withESVPCli(async () => {
75
- const { getESVPHealth } = await import("./esvp-KVOWYW6G.js");
75
+ const { getESVPHealth } = await import("./esvp-4LIAU76K.js");
76
76
  return {
77
77
  ...await getESVPBaseResult(options.server),
78
78
  health: await getESVPHealth(options.server)
@@ -81,7 +81,7 @@ esvp.command("status").description("Check the configured ESVP server health").op
81
81
  });
82
82
  esvp.command("devices").description("List ESVP-visible devices").option("-s, --server <url>", "ESVP base URL").option("-p, --platform <platform>", "adb | ios-sim | maestro-ios | all", "all").action(async (options) => {
83
83
  await withESVPCli(async () => {
84
- const { listESVPDevices } = await import("./esvp-KVOWYW6G.js");
84
+ const { listESVPDevices } = await import("./esvp-4LIAU76K.js");
85
85
  return {
86
86
  ...await getESVPBaseResult(options.server),
87
87
  devices: await listESVPDevices(options.platform, options.server)
@@ -90,7 +90,7 @@ esvp.command("devices").description("List ESVP-visible devices").option("-s, --s
90
90
  });
91
91
  esvp.command("sessions").description("List public ESVP sessions").option("-s, --server <url>", "ESVP base URL").action(async (options) => {
92
92
  await withESVPCli(async () => {
93
- const { listESVPSessions } = await import("./esvp-KVOWYW6G.js");
93
+ const { listESVPSessions } = await import("./esvp-4LIAU76K.js");
94
94
  return {
95
95
  ...await getESVPBaseResult(options.server),
96
96
  ...await listESVPSessions(options.server)
@@ -99,7 +99,7 @@ esvp.command("sessions").description("List public ESVP sessions").option("-s, --
99
99
  });
100
100
  esvp.command("create").description("Create a new ESVP session").requiredOption("-e, --executor <executor>", "fake | adb | ios-sim | maestro-ios").option("-s, --server <url>", "ESVP base URL").option("-d, --device-id <id>", "Device or simulator ID").option("--meta-json <json>", "Session metadata as JSON").option("--meta-file <path>", "Path to session metadata JSON").option("--crash-clip-json <json>", "Crash clip config as JSON").option("--crash-clip-file <path>", "Path to crash clip config JSON").option("--with-network", "Auto-configure the default App Lab external-proxy profile after creating the session").action(async (options) => {
101
101
  await withESVPCli(async () => {
102
- const { createESVPSession, configureESVPNetwork } = await import("./esvp-KVOWYW6G.js");
102
+ const { createESVPSession, configureESVPNetwork } = await import("./esvp-4LIAU76K.js");
103
103
  const meta = await readJsonSource(options.metaJson, options.metaFile, "meta");
104
104
  const crashClip = await readJsonSource(options.crashClipJson, options.crashClipFile, "crash clip");
105
105
  const createResult = await createESVPSession(
@@ -142,7 +142,7 @@ esvp.command("create").description("Create a new ESVP session").requiredOption("
142
142
  });
143
143
  esvp.command("get <sessionId>").description("Get a public ESVP session summary").option("-s, --server <url>", "ESVP base URL").action(async (sessionId, options) => {
144
144
  await withESVPCli(async () => {
145
- const { getESVPSession } = await import("./esvp-KVOWYW6G.js");
145
+ const { getESVPSession } = await import("./esvp-4LIAU76K.js");
146
146
  return {
147
147
  ...await getESVPBaseResult(options.server),
148
148
  ...await getESVPSession(sessionId, options.server)
@@ -151,7 +151,7 @@ esvp.command("get <sessionId>").description("Get a public ESVP session summary")
151
151
  });
152
152
  esvp.command("inspect <sessionId>").description("Inspect a session and optionally load transcript and artifacts").option("-s, --server <url>", "ESVP base URL").option("--transcript", "Include transcript").option("--artifacts", "Include artifacts").action(async (sessionId, options) => {
153
153
  await withESVPCli(async () => {
154
- const { inspectESVPSession } = await import("./esvp-KVOWYW6G.js");
154
+ const { inspectESVPSession } = await import("./esvp-4LIAU76K.js");
155
155
  return {
156
156
  ...await getESVPBaseResult(options.server),
157
157
  ...await inspectESVPSession(
@@ -167,7 +167,7 @@ esvp.command("inspect <sessionId>").description("Inspect a session and optionall
167
167
  });
168
168
  esvp.command("transcript <sessionId>").description("Fetch the canonical session transcript").option("-s, --server <url>", "ESVP base URL").action(async (sessionId, options) => {
169
169
  await withESVPCli(async () => {
170
- const { getESVPTranscript } = await import("./esvp-KVOWYW6G.js");
170
+ const { getESVPTranscript } = await import("./esvp-4LIAU76K.js");
171
171
  return {
172
172
  ...await getESVPBaseResult(options.server),
173
173
  sessionId,
@@ -177,7 +177,7 @@ esvp.command("transcript <sessionId>").description("Fetch the canonical session
177
177
  });
178
178
  esvp.command("artifacts <sessionId>").description("List session artifacts").option("-s, --server <url>", "ESVP base URL").action(async (sessionId, options) => {
179
179
  await withESVPCli(async () => {
180
- const { listESVPArtifacts } = await import("./esvp-KVOWYW6G.js");
180
+ const { listESVPArtifacts } = await import("./esvp-4LIAU76K.js");
181
181
  return {
182
182
  ...await getESVPBaseResult(options.server),
183
183
  sessionId,
@@ -187,13 +187,13 @@ esvp.command("artifacts <sessionId>").description("List session artifacts").opti
187
187
  });
188
188
  esvp.command("artifact <sessionId> <artifactPath>").description("Read a public artifact payload").option("-s, --server <url>", "ESVP base URL").action(async (sessionId, artifactPath, options) => {
189
189
  await withESVPCli(async () => {
190
- const { getESVPArtifactContent } = await import("./esvp-KVOWYW6G.js");
190
+ const { getESVPArtifactContent } = await import("./esvp-4LIAU76K.js");
191
191
  return await getESVPArtifactContent(sessionId, artifactPath, options.server);
192
192
  });
193
193
  });
194
194
  esvp.command("actions <sessionId>").description("Run public ESVP actions inside a session").option("-s, --server <url>", "ESVP base URL").option("--actions-json <json>", "JSON array of ESVP actions").option("--actions-file <path>", "Path to a JSON file with ESVP actions").option("--finish", "Finish the session after actions").option("--capture-logcat", "Capture logcat on finish when supported").option("--checkpoint-after-each", "Set checkpointAfter on every action").option("--with-network", "Auto-configure the default App Lab external-proxy profile before running actions if not already configured").action(async (sessionId, options) => {
195
195
  await withESVPCli(async () => {
196
- const { runESVPActions, getESVPSessionNetwork, configureESVPNetwork } = await import("./esvp-KVOWYW6G.js");
196
+ const { runESVPActions, getESVPSessionNetwork, configureESVPNetwork } = await import("./esvp-4LIAU76K.js");
197
197
  const actions = await readJsonSource(options.actionsJson, options.actionsFile, "actions");
198
198
  if (!Array.isArray(actions) || actions.length === 0) {
199
199
  failCli("Provide --actions-json or --actions-file with a non-empty array of ESVP actions.");
@@ -239,7 +239,7 @@ esvp.command("actions <sessionId>").description("Run public ESVP actions inside
239
239
  });
240
240
  esvp.command("checkpoint <sessionId>").description("Capture an ESVP checkpoint").option("-s, --server <url>", "ESVP base URL").option("-l, --label <label>", "Checkpoint label").action(async (sessionId, options) => {
241
241
  await withESVPCli(async () => {
242
- const { captureESVPCheckpoint } = await import("./esvp-KVOWYW6G.js");
242
+ const { captureESVPCheckpoint } = await import("./esvp-4LIAU76K.js");
243
243
  return {
244
244
  ...await getESVPBaseResult(options.server),
245
245
  ...await captureESVPCheckpoint(
@@ -254,7 +254,7 @@ esvp.command("checkpoint <sessionId>").description("Capture an ESVP checkpoint")
254
254
  });
255
255
  esvp.command("finish <sessionId>").description("Finish an ESVP session").option("-s, --server <url>", "ESVP base URL").option("--capture-logcat", "Capture logcat on finish when supported").action(async (sessionId, options) => {
256
256
  await withESVPCli(async () => {
257
- const { finishESVPSession } = await import("./esvp-KVOWYW6G.js");
257
+ const { finishESVPSession } = await import("./esvp-4LIAU76K.js");
258
258
  return {
259
259
  ...await getESVPBaseResult(options.server),
260
260
  ...await finishESVPSession(
@@ -269,7 +269,7 @@ esvp.command("finish <sessionId>").description("Finish an ESVP session").option(
269
269
  });
270
270
  esvp.command("preflight <sessionId>").description("Run preflight/bootstrap rules on an ESVP session").option("-s, --server <url>", "ESVP base URL").option("--policy <policy>", "Preflight policy name (e.g. fresh_install)").option("--app-id <appId>", "Target app ID").option("--json <json>", "Preflight config as JSON string").option("--file <path>", "Path to preflight config JSON file").action(async (sessionId, options) => {
271
271
  await withESVPCli(async () => {
272
- const { runESVPPreflight } = await import("./esvp-KVOWYW6G.js");
272
+ const { runESVPPreflight } = await import("./esvp-4LIAU76K.js");
273
273
  const fromSource = await readJsonSource(options.json, options.file, "preflight config");
274
274
  const config = {
275
275
  ...typeof fromSource === "object" && fromSource ? fromSource : {},
@@ -284,7 +284,7 @@ esvp.command("preflight <sessionId>").description("Run preflight/bootstrap rules
284
284
  });
285
285
  esvp.command("replay-run <sessionId>").description("Replay a session to a new ESVP session").option("-s, --server <url>", "ESVP base URL").option("-e, --executor <executor>", "fake | adb | ios-sim | maestro-ios").option("-d, --device-id <id>", "Replay target device ID").option("--capture-logcat", "Capture logcat on finish when supported").option("--meta-json <json>", "Replay metadata as JSON").option("--meta-file <path>", "Path to replay metadata JSON").action(async (sessionId, options) => {
286
286
  await withESVPCli(async () => {
287
- const { replayESVPSession, getESVPReplayConsistency } = await import("./esvp-KVOWYW6G.js");
287
+ const { replayESVPSession, getESVPReplayConsistency } = await import("./esvp-4LIAU76K.js");
288
288
  const meta = await readJsonSource(options.metaJson, options.metaFile, "replay meta");
289
289
  const replay = await replayESVPSession(
290
290
  sessionId,
@@ -307,7 +307,7 @@ esvp.command("replay-run <sessionId>").description("Replay a session to a new ES
307
307
  });
308
308
  esvp.command("replay-validate <sessionId>").description("Validate whether a session supports public replay").option("-s, --server <url>", "ESVP base URL").action(async (sessionId, options) => {
309
309
  await withESVPCli(async () => {
310
- const { validateESVPReplay } = await import("./esvp-KVOWYW6G.js");
310
+ const { validateESVPReplay } = await import("./esvp-4LIAU76K.js");
311
311
  return {
312
312
  ...await getESVPBaseResult(options.server),
313
313
  ...await validateESVPReplay(sessionId, options.server)
@@ -316,7 +316,7 @@ esvp.command("replay-validate <sessionId>").description("Validate whether a sess
316
316
  });
317
317
  esvp.command("replay-consistency <sessionId>").description("Inspect replay consistency for a replay session").option("-s, --server <url>", "ESVP base URL").action(async (sessionId, options) => {
318
318
  await withESVPCli(async () => {
319
- const { getESVPReplayConsistency } = await import("./esvp-KVOWYW6G.js");
319
+ const { getESVPReplayConsistency } = await import("./esvp-4LIAU76K.js");
320
320
  return {
321
321
  ...await getESVPBaseResult(options.server),
322
322
  ...await getESVPReplayConsistency(sessionId, options.server)
@@ -325,7 +325,7 @@ esvp.command("replay-consistency <sessionId>").description("Inspect replay consi
325
325
  });
326
326
  esvp.command("network <sessionId>").description("Read the public network state for a session").option("-s, --server <url>", "ESVP base URL").action(async (sessionId, options) => {
327
327
  await withESVPCli(async () => {
328
- const { getESVPSessionNetwork } = await import("./esvp-KVOWYW6G.js");
328
+ const { getESVPSessionNetwork } = await import("./esvp-4LIAU76K.js");
329
329
  return {
330
330
  ...await getESVPBaseResult(options.server),
331
331
  ...await getESVPSessionNetwork(sessionId, options.server)
@@ -334,7 +334,7 @@ esvp.command("network <sessionId>").description("Read the public network state f
334
334
  });
335
335
  esvp.command("network-configure <sessionId>").description("Apply a public ESVP network profile").option("-s, --server <url>", "ESVP base URL").option("--json <json>", "Raw network profile JSON").option("--file <path>", "Path to network profile JSON").option("--profile <name>", "Profile name").option("--label <label>", "Profile label").option("--connectivity <state>", "online | offline | reset").action(async (sessionId, options) => {
336
336
  await withESVPCli(async () => {
337
- const { configureESVPNetwork } = await import("./esvp-KVOWYW6G.js");
337
+ const { configureESVPNetwork } = await import("./esvp-4LIAU76K.js");
338
338
  const payload = await readJsonSource(options.json, options.file, "network profile") || {};
339
339
  const merged = {
340
340
  ...typeof payload === "object" && payload ? payload : {},
@@ -350,7 +350,7 @@ esvp.command("network-configure <sessionId>").description("Apply a public ESVP n
350
350
  });
351
351
  esvp.command("network-clear <sessionId>").description("Clear the active ESVP network profile").option("-s, --server <url>", "ESVP base URL").action(async (sessionId, options) => {
352
352
  await withESVPCli(async () => {
353
- const { clearESVPNetwork } = await import("./esvp-KVOWYW6G.js");
353
+ const { clearESVPNetwork } = await import("./esvp-4LIAU76K.js");
354
354
  return {
355
355
  ...await getESVPBaseResult(options.server),
356
356
  ...await clearESVPNetwork(sessionId, options.server)
@@ -359,7 +359,7 @@ esvp.command("network-clear <sessionId>").description("Clear the active ESVP net
359
359
  });
360
360
  esvp.command("trace-attach <sessionId>").description("Attach a public network trace artifact to a session").requiredOption("--trace-kind <kind>", "Trace kind, e.g. http_trace or har").option("-s, --server <url>", "ESVP base URL").option("--json <json>", "Trace payload JSON").option("--file <path>", "Path to trace payload JSON/text").option("--label <label>", "Trace label").option("--source <source>", "Trace source").option("--request-id <id>", "Correlated request ID").option("--method <method>", "HTTP method").option("--url <url>", "Request URL").option("--status-code <code>", "HTTP status code").option("--format <format>", "Payload format label").action(async (sessionId, options) => {
361
361
  await withESVPCli(async () => {
362
- const { attachESVPNetworkTrace } = await import("./esvp-KVOWYW6G.js");
362
+ const { attachESVPNetworkTrace } = await import("./esvp-4LIAU76K.js");
363
363
  const payload = await readJsonSource(options.json, options.file, "trace payload");
364
364
  if (payload == null) {
365
365
  failCli("Provide --json or --file with the trace payload to attach.");
@@ -389,7 +389,7 @@ program.command("serve").alias("server").description("Start the DiscoveryLab web
389
389
  console.log(chalk.cyan("\n DiscoveryLab"));
390
390
  console.log(chalk.gray(" AI-powered app testing & evidence generator\n"));
391
391
  try {
392
- const { startServer } = await import("./server-QKZXPZRC.js");
392
+ const { startServer } = await import("./server-TKYRIYJ6.js");
393
393
  await startServer(port);
394
394
  console.log(chalk.green(` Server running at http://localhost:${port}`));
395
395
  console.log(chalk.gray(" Press Ctrl+C to stop\n"));
@@ -404,7 +404,7 @@ program.command("serve").alias("server").description("Start the DiscoveryLab web
404
404
  program.command("setup").description("Check and configure DiscoveryLab dependencies").action(async () => {
405
405
  console.log(chalk.cyan("\n DiscoveryLab Setup\n"));
406
406
  try {
407
- const { setupStatusTool } = await import("./setup-2SQC5UHJ.js");
407
+ const { setupStatusTool } = await import("./setup-O6WQQAGP.js");
408
408
  const result = await setupStatusTool.handler({});
409
409
  if (result.isError) {
410
410
  console.error(chalk.red(" Setup check failed"));
@@ -440,7 +440,7 @@ program.command("setup").description("Check and configure DiscoveryLab dependenc
440
440
  program.command("init").description("Initialize DiscoveryLab data directories").action(async () => {
441
441
  console.log(chalk.cyan("\n Initializing DiscoveryLab...\n"));
442
442
  try {
443
- const { getDatabase, DATA_DIR, PROJECTS_DIR, EXPORTS_DIR } = await import("./db-6WLEVKUV.js");
443
+ const { getDatabase, DATA_DIR, PROJECTS_DIR, EXPORTS_DIR } = await import("./db-745LC5YC.js");
444
444
  getDatabase();
445
445
  console.log(chalk.green(" Created directories:"));
446
446
  console.log(chalk.gray(` ${DATA_DIR}`));
@@ -486,9 +486,9 @@ program.command("install").description("Install DiscoveryLab as Claude Code MCP
486
486
  });
487
487
  program.command("mcp").description("Run as MCP server (for Claude Code integration)").action(async () => {
488
488
  try {
489
- const { getDatabase } = await import("./db-6WLEVKUV.js");
489
+ const { getDatabase } = await import("./db-745LC5YC.js");
490
490
  getDatabase();
491
- const { mcpServer } = await import("./server-6N3KIEGP.js");
491
+ const { mcpServer } = await import("./server-NTT2XGCC.js");
492
492
  const {
493
493
  uiTools,
494
494
  projectTools,
@@ -500,8 +500,9 @@ program.command("mcp").description("Run as MCP server (for Claude Code integrati
500
500
  testingTools,
501
501
  integrationTools,
502
502
  taskHubTools,
503
- esvpTools
504
- } = await import("./tools-YGM5HRIB.js");
503
+ esvpTools,
504
+ knowledgeTools
505
+ } = await import("./tools-FVVWKEGC.js");
505
506
  mcpServer.registerTools([
506
507
  ...uiTools,
507
508
  ...projectTools,
@@ -513,7 +514,8 @@ program.command("mcp").description("Run as MCP server (for Claude Code integrati
513
514
  ...testingTools,
514
515
  ...integrationTools,
515
516
  ...taskHubTools,
516
- ...esvpTools
517
+ ...esvpTools,
518
+ ...knowledgeTools
517
519
  ]);
518
520
  await mcpServer.runStdio();
519
521
  } catch (error) {
@@ -528,7 +530,7 @@ program.command("info").description("Show version and configuration info").actio
528
530
  console.log(chalk.gray(" AI-powered app testing & evidence generator"));
529
531
  console.log(chalk.gray(" Claude Code Plugin\n"));
530
532
  try {
531
- const { DATA_DIR, DB_PATH } = await import("./db-6WLEVKUV.js");
533
+ const { DATA_DIR, DB_PATH } = await import("./db-745LC5YC.js");
532
534
  console.log(chalk.white(" Paths:"));
533
535
  console.log(chalk.gray(` Data: ${DATA_DIR}`));
534
536
  console.log(chalk.gray(` Database: ${DB_PATH}`));
@@ -15,8 +15,8 @@ import {
15
15
  projects,
16
16
  settings,
17
17
  testVariables
18
- } from "./chunk-VVIOB362.js";
19
- import "./chunk-MLKGABMK.js";
18
+ } from "./chunk-XAMA3JJG.js";
19
+ import "./chunk-4VNS5WPM.js";
20
20
  export {
21
21
  DATA_DIR,
22
22
  DB_PATH,
@@ -0,0 +1,104 @@
1
+ import "./chunk-4VNS5WPM.js";
2
+
3
+ // src/core/export/document.ts
4
+ function buildDefaultDocument(project) {
5
+ const sections = [];
6
+ const title = project.marketingTitle || project.name;
7
+ sections.push({
8
+ type: "callout",
9
+ text: title,
10
+ color: "purple"
11
+ });
12
+ if (project.marketingDescription) {
13
+ sections.push({
14
+ type: "paragraph",
15
+ text: project.marketingDescription
16
+ });
17
+ }
18
+ let links = [];
19
+ if (project.taskHubLinks) {
20
+ try {
21
+ const parsed = JSON.parse(project.taskHubLinks);
22
+ links = parsed.map((l) => ({
23
+ label: l.title || l.url,
24
+ url: l.url,
25
+ linkType: l.type || "other"
26
+ }));
27
+ } catch {
28
+ }
29
+ }
30
+ if (links.length > 0) {
31
+ sections.push({ type: "links", items: links });
32
+ }
33
+ sections.push({ type: "divider" });
34
+ if (project.frames && project.frames.length > 0) {
35
+ sections.push({
36
+ type: "image-gallery",
37
+ images: project.frames.map((f, i) => ({
38
+ path: f.imagePath,
39
+ caption: f.ocrText?.slice(0, 40) || `Screen ${i + 1}`,
40
+ selected: true
41
+ }))
42
+ });
43
+ }
44
+ if (project.templateRenderPath) {
45
+ sections.push({
46
+ type: "video",
47
+ path: project.templateRenderPath,
48
+ duration: project.duration || void 0
49
+ });
50
+ } else if (project.videoPath) {
51
+ sections.push({
52
+ type: "video",
53
+ path: project.videoPath,
54
+ duration: project.duration || void 0
55
+ });
56
+ }
57
+ if (project.frames && project.frames.length > 0) {
58
+ sections.push({
59
+ type: "gif",
60
+ path: "",
61
+ // generated on export
62
+ caption: "Flow Diagram",
63
+ templateId: "flow-diagram"
64
+ });
65
+ }
66
+ if (project.aiSummary) {
67
+ sections.push({ type: "divider" });
68
+ sections.push({
69
+ type: "markdown",
70
+ content: project.aiSummary,
71
+ collapsible: true,
72
+ label: "App Intelligence"
73
+ });
74
+ }
75
+ return {
76
+ title,
77
+ subtitle: project.marketingDescription || void 0,
78
+ sections,
79
+ metadata: {
80
+ projectId: project.id,
81
+ platform: project.platform || void 0
82
+ }
83
+ };
84
+ }
85
+ function getSectionTypeInfo(type) {
86
+ const info = {
87
+ "heading": { label: "Heading", description: "Section title" },
88
+ "paragraph": { label: "Description", description: "Text content" },
89
+ "divider": { label: "Divider", description: "Horizontal line" },
90
+ "callout": { label: "Header", description: "Highlighted title block" },
91
+ "links": { label: "Links", description: "External references" },
92
+ "image-gallery": { label: "Screenshots", description: "Select frames to include" },
93
+ "image": { label: "Image", description: "Single image" },
94
+ "video": { label: "Video", description: "Recording file" },
95
+ "gif": { label: "Interactive", description: "Animated visualization" },
96
+ "grid": { label: "Grid", description: "Composed screenshot grid" },
97
+ "markdown": { label: "Analysis", description: "App Intelligence report" }
98
+ };
99
+ return info[type] || { label: type, description: "" };
100
+ }
101
+ export {
102
+ buildDefaultDocument,
103
+ getSectionTypeInfo
104
+ };
@@ -22,10 +22,10 @@ import {
22
22
  runESVPActions,
23
23
  runESVPPreflight,
24
24
  validateESVPReplay
25
- } from "./chunk-7EDIUVIO.js";
25
+ } from "./chunk-EU63HPKT.js";
26
26
  import "./chunk-6EGBXRDK.js";
27
- import "./chunk-VVIOB362.js";
28
- import "./chunk-MLKGABMK.js";
27
+ import "./chunk-XAMA3JJG.js";
28
+ import "./chunk-4VNS5WPM.js";
29
29
  export {
30
30
  attachESVPNetworkTrace,
31
31
  captureESVPCheckpoint,
@@ -4,14 +4,14 @@ import {
4
4
  diagnoseESVPNetworkState,
5
5
  translateMaestroActionsToESVP,
6
6
  validateMaestroRecordingWithESVP
7
- } from "./chunk-ZLHIHMSL.js";
7
+ } from "./chunk-SWZIBO2R.js";
8
8
  import "./chunk-LB3RNE3O.js";
9
- import "./chunk-7EDIUVIO.js";
9
+ import "./chunk-EU63HPKT.js";
10
10
  import "./chunk-6EGBXRDK.js";
11
11
  import "./chunk-SLNJEF32.js";
12
- import "./chunk-VVIOB362.js";
12
+ import "./chunk-XAMA3JJG.js";
13
13
  import "./chunk-XFVDP332.js";
14
- import "./chunk-MLKGABMK.js";
14
+ import "./chunk-4VNS5WPM.js";
15
15
  export {
16
16
  collectESVPSessionNetworkData,
17
17
  createMobileNetworkCaptureMeta,
@@ -0,0 +1,24 @@
1
+ import {
2
+ cleanupFrames,
3
+ compareFrames,
4
+ detectKeyFrames,
5
+ extractFrames,
6
+ extractKeyFramesOnly,
7
+ filterBlankFrames,
8
+ generateThumbnail,
9
+ getVideoInfo,
10
+ isBlankFrame
11
+ } from "./chunk-QMUEC6B5.js";
12
+ import "./chunk-XAMA3JJG.js";
13
+ import "./chunk-4VNS5WPM.js";
14
+ export {
15
+ cleanupFrames,
16
+ compareFrames,
17
+ detectKeyFrames,
18
+ extractFrames,
19
+ extractKeyFramesOnly,
20
+ filterBlankFrames,
21
+ generateThumbnail,
22
+ getVideoInfo,
23
+ isBlankFrame
24
+ };