@outerlayer/cli 0.33.0-next.20261022004023 → 0.33.0-next.20261022124145

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 (94) hide show
  1. package/README.md +12 -11
  2. package/dist/{agent-setup-UY5NBT7C.js → agent-setup-2MJXGAZ5.js} +10 -10
  3. package/dist/{artifact-link-cmd-2MBHG3PO.js → artifact-link-cmd-6FF2Y6QI.js} +2 -2
  4. package/dist/build-disk-5GIWYDOB.js +18 -0
  5. package/dist/build-info.json +1 -1
  6. package/dist/{builder-VR55L4PV.js → builder-EELBB7SI.js} +4 -4
  7. package/dist/{check-XGBAFJPP.js → check-EJKRXI2N.js} +36 -34
  8. package/dist/{chunk-N3KK5BKF.js → chunk-2GHI2J26.js} +7 -7
  9. package/dist/{chunk-AKR32WHV.js → chunk-5DNCFOXA.js} +9 -7
  10. package/dist/{chunk-UIBTEDLA.js → chunk-6JNCNHSV.js} +5 -5
  11. package/dist/{chunk-GHQFV3TS.js → chunk-6WUQSARX.js} +11 -10
  12. package/dist/{chunk-EG7KPSSP.js → chunk-72BIONOT.js} +6 -6
  13. package/dist/{chunk-XNGS6LUK.js → chunk-AESNEWYR.js} +1 -1
  14. package/dist/{chunk-LN4WDONI.js → chunk-AVTI3FL5.js} +1 -1
  15. package/dist/{chunk-5RUH3PCG.js → chunk-B3EE7OKK.js} +4 -4
  16. package/dist/{chunk-Y3LIJIRH.js → chunk-BJQ25STI.js} +4 -4
  17. package/dist/{chunk-6TFTRVOA.js → chunk-C3XLVHN6.js} +2 -2
  18. package/dist/{chunk-OEITN64Z.js → chunk-D7ECJX4J.js} +15 -38
  19. package/dist/{chunk-UWEJ6HGB.js → chunk-DY7Y7UT4.js} +2 -2
  20. package/dist/{chunk-AKHGQKNR.js → chunk-E6CO3MJE.js} +34 -2
  21. package/dist/{chunk-DM4EGXDO.js → chunk-EWVYQLD3.js} +1 -1
  22. package/dist/{chunk-BUBMAMIP.js → chunk-FQW7TKIU.js} +2 -2
  23. package/dist/{chunk-KUTZ6XLS.js → chunk-G63KT5I5.js} +1 -1
  24. package/dist/{chunk-Q2D4M3GC.js → chunk-GFYEMCPP.js} +1 -1
  25. package/dist/{chunk-4IG6EZHU.js → chunk-HJYBWJAS.js} +2 -2
  26. package/dist/{chunk-CMTRZC23.js → chunk-HVIYKGK5.js} +79 -12
  27. package/dist/{chunk-TNJXCNQ6.js → chunk-JHTJPQSL.js} +4 -4
  28. package/dist/{chunk-RVWADVBN.js → chunk-JZ4FXSLI.js} +3 -3
  29. package/dist/{chunk-HT7LVCTX.js → chunk-L3DUKDTR.js} +2 -2
  30. package/dist/{chunk-KDM77TVX.js → chunk-LCVR4UIS.js} +2 -2
  31. package/dist/{chunk-OGCG5LOX.js → chunk-LJG6EMLJ.js} +1 -1
  32. package/dist/{chunk-HJEZ3D3E.js → chunk-LWODW66U.js} +16 -16
  33. package/dist/chunk-MBE6FEQ3.js +111 -0
  34. package/dist/{chunk-RW52CUFX.js → chunk-NSPRS7WK.js} +1 -1
  35. package/dist/{chunk-DE7YSNDX.js → chunk-OJ63GRZ2.js} +2 -2
  36. package/dist/{chunk-Q4YVHYHT.js → chunk-QJNFO7TQ.js} +3 -3
  37. package/dist/{chunk-NOXK3QW6.js → chunk-QSSYXK6C.js} +3 -3
  38. package/dist/{chunk-UENWEDZ3.js → chunk-S2IJQER5.js} +255 -255
  39. package/dist/{chunk-RQKQTRXM.js → chunk-THTBXIK5.js} +4 -4
  40. package/dist/{chunk-M5OBRUQE.js → chunk-UIUGTW5C.js} +2 -2
  41. package/dist/{chunk-YH2632RT.js → chunk-V2EUC2MJ.js} +43 -20
  42. package/dist/{chunk-SFJD4MRY.js → chunk-WHRR55PC.js} +14 -7
  43. package/dist/{chunk-CALFNNIY.js → chunk-XTBGPISI.js} +17 -6
  44. package/dist/chunk-YYYRBYWG.js +32 -0
  45. package/dist/{claude-launcher-STSKZNW3.js → claude-launcher-IUDNUD2J.js} +17 -6
  46. package/dist/{cli-BMV37UKQ.js → cli-5JSVOAE5.js} +89 -89
  47. package/dist/{command-35IERXEA.js → command-7IY3XGAG.js} +24 -23
  48. package/dist/{connect-cmd-WFHAPGCZ.js → connect-cmd-AQSJVDQU.js} +8 -8
  49. package/dist/{container-start-3FFBFFNK.js → container-start-BPQHJMNF.js} +25 -24
  50. package/dist/{context-cleanup-UBOJHGQM.js → context-cleanup-BX5Y3AFL.js} +3 -3
  51. package/dist/{control-plane-launch-R4X63DYW.js → control-plane-launch-K7YD6KEN.js} +6 -6
  52. package/dist/{dist-ADFLG3AY.js → dist-ACTRIBVW.js} +2 -2
  53. package/dist/{docker-2NN3EKTR.js → docker-UKJBLZLW.js} +4 -4
  54. package/dist/{doctor-CA5QQ5KS.js → doctor-JUR62PMF.js} +48 -25
  55. package/dist/{emit-artifact-cmd-FR5PUUJR.js → emit-artifact-cmd-HI3EYJA3.js} +13 -13
  56. package/dist/{emit-cmd-JOO6ZTEI.js → emit-cmd-OX6LYS6I.js} +6 -6
  57. package/dist/{emit-criteria-cmd-DKPZJTIN.js → emit-criteria-cmd-IC5OIZX2.js} +9 -9
  58. package/dist/{emit-demo-cmd-G2I4SB7A.js → emit-demo-cmd-HWDC3MAK.js} +211 -101
  59. package/dist/{emit-finding-cmd-VM4KIVEM.js → emit-finding-cmd-A7RBLHTN.js} +10 -10
  60. package/dist/{emit-result-cmd-SEKL6HUU.js → emit-result-cmd-2WVVAGST.js} +12 -12
  61. package/dist/{emit-step-cmd-4YAWK4VE.js → emit-step-cmd-KNVHYSXT.js} +10 -10
  62. package/dist/{findings-cmd-RXYIWXY4.js → findings-cmd-ISP3P3UY.js} +10 -10
  63. package/dist/{fleet-readiness-VIX76RNL.js → fleet-readiness-O2WAJJVT.js} +8 -8
  64. package/dist/{governing-source-APGCKDTS.js → governing-source-PMWZJCXJ.js} +13 -13
  65. package/dist/{guest-init-BI7267TB.js → guest-init-3LNAL3TB.js} +2 -2
  66. package/dist/{hook-fast-NVBMSE3N.js → hook-fast-FJ2PMBML.js} +1 -1
  67. package/dist/index.js +4 -4
  68. package/dist/{init-BZMBUTU4.js → init-YRSKJNSB.js} +25 -24
  69. package/dist/{init-VPK3MDM5.js → init-ZXV6LILS.js} +26 -25
  70. package/dist/{init-cmd-PTQ5WSQ5.js → init-cmd-3F436JBW.js} +18 -18
  71. package/dist/{init-update-HOTJISWA.js → init-update-6OPETOBA.js} +17 -17
  72. package/dist/{layout-ZI4RJ6MT.js → layout-JGF7MJHG.js} +4 -4
  73. package/dist/{login-browser-WUSIVD5E.js → login-browser-3RIZQJY2.js} +2 -2
  74. package/dist/{loop-FDFEXDKA.js → loop-MCR3EUSZ.js} +36 -34
  75. package/dist/{machine-ZL72TS6B.js → machine-35YQ7MGN.js} +23 -22
  76. package/dist/{machine-skills-REHDWINX.js → machine-skills-AGERT2HN.js} +4 -4
  77. package/dist/{runner-identity-DSFLFUR2.js → runner-identity-GO762MHZ.js} +4 -4
  78. package/dist/{runner-key-XJ7YSMOF.js → runner-key-BQSR6MK4.js} +25 -24
  79. package/dist/{session-sender-PLQ5NOEW.js → session-sender-ENL3IBVD.js} +13 -13
  80. package/dist/{spec-cmd-NIAQWMLE.js → spec-cmd-SLJT7MRX.js} +10 -10
  81. package/dist/{starter-pack-OESK7UX2.js → starter-pack-UBEC5LTE.js} +5 -5
  82. package/dist/{status-LJ2UBJCE.js → status-GQEAZBUJ.js} +29 -28
  83. package/dist/{sync-cmd-UTESQMDU.js → sync-cmd-Z4BYKM6K.js} +12 -12
  84. package/dist/{watch-4UC4FGI5.js → watch-MBEA6QB4.js} +12 -12
  85. package/dist/{work-claim-cmd-ODYRE44S.js → work-claim-cmd-TLXRPJWO.js} +12 -12
  86. package/dist/{work-cmd-QQDUI3YX.js → work-cmd-DYM67Z3F.js} +10 -10
  87. package/dist/{work-comment-cmd-FIOMDPIZ.js → work-comment-cmd-CRRWP3AH.js} +10 -10
  88. package/dist/{work-logs-cmd-DA6MPQ6O.js → work-logs-cmd-7LFOEVXI.js} +10 -10
  89. package/dist/{work-open-pr-cmd-QG2FT7OW.js → work-open-pr-cmd-XXQ75PSU.js} +11 -11
  90. package/dist/{work-pr-cmd-XNXWWLS5.js → work-pr-cmd-ZVE7EGSC.js} +10 -10
  91. package/dist/{work-stop-cmd-2KLZ2UH2.js → work-stop-cmd-GVFSTGLK.js} +10 -10
  92. package/package.json +1 -1
  93. package/skill-pack/maintained/outerlayer-evidence/SKILL.md +8 -5
  94. package/dist/{chunk-RJYKTWUP.js → chunk-ELYHDWCC.js} +1 -1
@@ -1,18 +1,18 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { runEmitArtifact } from './chunk-YH2632RT.js';
4
- import './chunk-SFJD4MRY.js';
5
- import './chunk-RQKQTRXM.js';
3
+ import { runEmitArtifact } from './chunk-V2EUC2MJ.js';
4
+ import './chunk-WHRR55PC.js';
5
+ import './chunk-THTBXIK5.js';
6
6
  import './chunk-ESVW4MJY.js';
7
7
  import './chunk-TBT347UY.js';
8
8
  import { VoiceDownloadError, downloadPinned, sha256OfFile } from './chunk-2PGI6RDE.js';
9
9
  import { VOICE_PACK_FILES, VOICE_PACK_VERSION } from './chunk-R6QCSHKC.js';
10
- import { detectActiveSession, autoConnect } from './chunk-6TFTRVOA.js';
11
- import './chunk-5RUH3PCG.js';
12
- import './chunk-DM4EGXDO.js';
13
- import { resolveRepoIdentity } from './chunk-AKR32WHV.js';
14
- import './chunk-4IG6EZHU.js';
15
- import './chunk-RW52CUFX.js';
10
+ import { detectActiveSession, autoConnect } from './chunk-C3XLVHN6.js';
11
+ import './chunk-B3EE7OKK.js';
12
+ import './chunk-EWVYQLD3.js';
13
+ import { resolveRepoIdentity } from './chunk-5DNCFOXA.js';
14
+ import './chunk-HJYBWJAS.js';
15
+ import './chunk-NSPRS7WK.js';
16
16
  import './chunk-G2JWZDFA.js';
17
17
  import { C } from './chunk-ANPNT6PM.js';
18
18
  import { defaultFetch, resolveGatewayCredentials } from './chunk-VQ2JGZSC.js';
@@ -20,13 +20,13 @@ import './chunk-PJDQPF5N.js';
20
20
  import './chunk-JT3YO5MH.js';
21
21
  import './chunk-ESP5VZBD.js';
22
22
  import './chunk-HDSDUTX4.js';
23
- import './chunk-HT7LVCTX.js';
23
+ import './chunk-L3DUKDTR.js';
24
24
  import './chunk-ZJSNLVCE.js';
25
25
  import './chunk-2O5KA67H.js';
26
26
  import './chunk-BKO6JEZI.js';
27
27
  import './chunk-HCVLP7XA.js';
28
28
  import './chunk-BJ3KTMDH.js';
29
- import './chunk-KUTZ6XLS.js';
29
+ import './chunk-G63KT5I5.js';
30
30
  import './chunk-5BHIBJDA.js';
31
31
  import './chunk-CDDED64E.js';
32
32
  import './chunk-RA3O54FC.js';
@@ -35,8 +35,8 @@ import './chunk-WZBHBH3J.js';
35
35
  import './chunk-CRB3POP4.js';
36
36
  import './chunk-URIZRCRY.js';
37
37
  import './chunk-TUSYOL2O.js';
38
- import './chunk-OGCG5LOX.js';
39
- import { ARTIFACT_MAX_BYTES, ARTIFACT_MAX_CAPTION_LENGTH, DEMO_RECORD_MEDIA_TYPE, DemoManifestSchema } from './chunk-AKHGQKNR.js';
38
+ import './chunk-LJG6EMLJ.js';
39
+ import { ARTIFACT_MAX_BYTES, ARTIFACT_MAX_CAPTION_LENGTH, DEMO_RECORD_MEDIA_TYPE, DemoManifestSchema } from './chunk-E6CO3MJE.js';
40
40
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
41
41
  import './chunk-XD4ZCMA4.js';
42
42
  import './chunk-MESOOLF4.js';
@@ -2311,28 +2311,8 @@ function missingProgramMessage(name, narrated) {
2311
2311
  }
2312
2312
 
2313
2313
  // src/demo/media.ts
2314
- function clipArgs(plan) {
2315
- const duration = plan.end - plan.start;
2316
- const audio = plan.audio;
2317
- const pad = `apad=whole_dur=${duration.toFixed(3)}`;
2318
- const audioInput = audio === void 0 ? [] : audio === "silence" ? ["-f", "lavfi", "-t", duration.toFixed(3), "-i", "anullsrc=channel_layout=mono:sample_rate=48000"] : ["-i", audio.wavPath];
2319
- const audioFilter = audio === void 0 ? void 0 : audio === "silence" ? `[1:a]${pad}[speech]` : `[1:a]${audio.tempo === 1 ? "" : `atempo=${audio.tempo.toFixed(4)},`}adelay=${Math.round(audio.delaySeconds * 1e3)}:all=1,aresample=48000,${pad}[speech]`;
2320
- const speech = audioFilter === void 0 ? [] : ["-filter_complex", audioFilter, "-map", "[speech]", "-c:a", "libopus", "-b:a", "48k"];
2314
+ function encodeArgs(duration, output) {
2321
2315
  return [
2322
- "-y",
2323
- "-v",
2324
- "error",
2325
- // The cut sits before the input and the clip is re-encoded, so it starts on the exact frame, not the nearest key frame.
2326
- "-ss",
2327
- plan.start.toFixed(3),
2328
- "-t",
2329
- duration.toFixed(3),
2330
- "-i",
2331
- plan.video,
2332
- ...audioInput,
2333
- "-map",
2334
- "0:v:0",
2335
- ...audio === void 0 ? ["-an"] : speech,
2336
2316
  "-c:v",
2337
2317
  "libvpx-vp9",
2338
2318
  "-b:v",
@@ -2356,7 +2336,61 @@ function clipArgs(plan) {
2356
2336
  "+bitexact",
2357
2337
  "-t",
2358
2338
  duration.toFixed(3),
2359
- plan.output
2339
+ output
2340
+ ];
2341
+ }
2342
+ function tempoStage(tempo) {
2343
+ return tempo === 1 ? "" : `atempo=${tempo.toFixed(4)},`;
2344
+ }
2345
+ function clipArgs(plan) {
2346
+ const duration = plan.end - plan.start;
2347
+ const audio = plan.audio;
2348
+ const pad = `apad=whole_dur=${duration.toFixed(3)}`;
2349
+ const audioInput = audio === void 0 ? [] : audio === "silence" ? ["-f", "lavfi", "-t", duration.toFixed(3), "-i", "anullsrc=channel_layout=mono:sample_rate=48000"] : ["-i", audio.wavPath];
2350
+ const audioFilter = audio === void 0 ? void 0 : audio === "silence" ? `[1:a]${pad}[speech]` : `[1:a]${tempoStage(audio.tempo)}adelay=${Math.round(audio.delaySeconds * 1e3)}:all=1,aresample=48000,${pad}[speech]`;
2351
+ const speech = audioFilter === void 0 ? [] : ["-filter_complex", audioFilter, "-map", "[speech]", "-c:a", "libopus", "-b:a", "48k"];
2352
+ return [
2353
+ "-y",
2354
+ "-v",
2355
+ "error",
2356
+ // The cut sits before the input and the clip is re-encoded, so it starts on the exact frame, not the nearest key frame.
2357
+ "-ss",
2358
+ plan.start.toFixed(3),
2359
+ "-t",
2360
+ duration.toFixed(3),
2361
+ "-i",
2362
+ plan.video,
2363
+ ...audioInput,
2364
+ "-map",
2365
+ "0:v:0",
2366
+ ...audio === void 0 ? ["-an"] : speech,
2367
+ ...encodeArgs(duration, plan.output)
2368
+ ];
2369
+ }
2370
+ function demoArgs(plan) {
2371
+ const duration = plan.end - plan.start;
2372
+ const pad = `apad=whole_dur=${duration.toFixed(3)}`;
2373
+ const stages = plan.speech.map(
2374
+ (speech, index) => `[${index + 1}:a]${tempoStage(speech.tempo)}adelay=${Math.round(speech.delaySeconds * 1e3)}:all=1[line${index}]`
2375
+ );
2376
+ const mixed = plan.speech.length === 0 ? `anullsrc=channel_layout=mono:sample_rate=48000,${pad}[speech]` : plan.speech.length === 1 ? `[line0]aresample=48000,${pad}[speech]` : `${plan.speech.map((_, index) => `[line${index}]`).join("")}amix=inputs=${plan.speech.length}:normalize=0,aresample=48000,${pad}[speech]`;
2377
+ const filter = [...stages, mixed].join(";");
2378
+ return [
2379
+ "-y",
2380
+ "-v",
2381
+ "error",
2382
+ // The cut sits before the input and the demo is re-encoded, so it starts on the exact frame, not the nearest key frame.
2383
+ "-ss",
2384
+ plan.start.toFixed(3),
2385
+ "-t",
2386
+ duration.toFixed(3),
2387
+ "-i",
2388
+ plan.video,
2389
+ ...plan.speech.flatMap((speech) => ["-i", speech.wavPath]),
2390
+ "-map",
2391
+ "0:v:0",
2392
+ ...plan.narrated ? ["-filter_complex", filter, "-map", "[speech]", "-c:a", "libopus", "-b:a", "48k"] : ["-an"],
2393
+ ...encodeArgs(duration, plan.output)
2360
2394
  ];
2361
2395
  }
2362
2396
  function durationFromProbe(formatDuration, lastPacketLines) {
@@ -2390,6 +2424,9 @@ function createMediaTools(env, exec = execFileSync) {
2390
2424
  },
2391
2425
  renderClip(plan) {
2392
2426
  run(ffmpeg, clipArgs(plan));
2427
+ },
2428
+ renderDemo(plan) {
2429
+ run(ffmpeg, demoArgs(plan));
2393
2430
  }
2394
2431
  };
2395
2432
  }
@@ -2398,15 +2435,16 @@ function createMediaTools(env, exec = execFileSync) {
2398
2435
  function chapterPassed(checks) {
2399
2436
  return checks.length > 0 && checks.every((check) => check.passed);
2400
2437
  }
2401
- function buildDemoRecord(manifest, clips, comparisons) {
2402
- if (clips.length !== manifest.chapters.length) {
2403
- throw new Error(`the demo has ${manifest.chapters.length} chapters but ${clips.length} clips`);
2438
+ function buildDemoRecord(manifest, video, stored, comparisons) {
2439
+ if (stored.length !== manifest.chapters.length) {
2440
+ throw new Error(`the demo has ${manifest.chapters.length} chapters but ${stored.length} stored artifacts`);
2404
2441
  }
2405
2442
  if (comparisons.length !== manifest.chapters.length) {
2406
2443
  throw new Error(`the demo has ${manifest.chapters.length} chapters but ${comparisons.length} comparisons`);
2407
2444
  }
2408
2445
  return {
2409
- schemaVersion: 2,
2446
+ schemaVersion: 3,
2447
+ video,
2410
2448
  chapters: manifest.chapters.map((chapter, index) => {
2411
2449
  const comparison = comparisons[index];
2412
2450
  return {
@@ -2416,8 +2454,9 @@ function buildDemoRecord(manifest, clips, comparisons) {
2416
2454
  title: chapter.title,
2417
2455
  narration: chapter.narration,
2418
2456
  checks: chapter.checks,
2419
- clipArtifactId: clips[index].clipArtifactId,
2420
- bound: clips[index].bound,
2457
+ artifactId: stored[index].artifactId,
2458
+ range: stored[index].range,
2459
+ bound: stored[index].bound,
2421
2460
  comparable: comparison.comparable,
2422
2461
  stills: comparison.stills,
2423
2462
  ...comparison.difference === void 0 ? {} : { difference: comparison.difference }
@@ -2815,57 +2854,96 @@ async function runEmitDemo(opts) {
2815
2854
  const work = mkdtempSync(join(tmpdir(), "outerlayer-demo-"));
2816
2855
  try {
2817
2856
  const speaker = narrated ? opts.speaker ?? await realSpeaker({ env, home, work, say, installedRoot: opts.installedVoiceRoot }) : void 0;
2818
- const plans = [];
2857
+ const spoken = [];
2819
2858
  for (const [index, chapter] of manifest.chapters.entries()) {
2820
- const plan = {
2821
- video: videoPath,
2822
- start: chapter.start,
2823
- end: chapter.end,
2824
- output: join(work, `chapter-${String(index + 1).padStart(2, "0")}.webm`)
2825
- };
2826
- if (speaker !== void 0 && chapter.narration.trim() !== "") {
2827
- let speech;
2859
+ if (speaker === void 0 || chapter.narration.trim() === "") continue;
2860
+ let speech;
2861
+ try {
2862
+ speech = await speaker(chapter.narration);
2863
+ } catch (err) {
2864
+ throw new EmitDemoError(`${chapterLabel(index, chapter.title)}: the narration could not be spoken: ${err instanceof Error ? err.message : String(err)}`);
2865
+ }
2866
+ const fit = fitSpeech(speech.seconds, chapter.end - chapter.start);
2867
+ if (!fit.ok) {
2868
+ throw new EmitDemoError(
2869
+ `${chapterLabel(index, chapter.title)}: the narration runs ${fit.overrunSeconds.toFixed(1)} s too long even at 1.3 times speed \u2014 shorten the line or lengthen the chapter`
2870
+ );
2871
+ }
2872
+ spoken.push({ index, wavPath: speech.wavPath, tempo: fit.tempo });
2873
+ }
2874
+ const first = manifest.chapters[0];
2875
+ const last = manifest.chapters[manifest.chapters.length - 1];
2876
+ const wholePlan = {
2877
+ video: videoPath,
2878
+ start: first.start,
2879
+ end: last.end,
2880
+ output: join(work, "demo.webm"),
2881
+ narrated: speaker !== void 0,
2882
+ speech: spoken.map((line) => ({
2883
+ wavPath: line.wavPath,
2884
+ tempo: line.tempo,
2885
+ delaySeconds: manifest.chapters[line.index].start - first.start + SPEECH_LEAD_IN
2886
+ }))
2887
+ };
2888
+ try {
2889
+ media.renderDemo(wholePlan);
2890
+ } catch (err) {
2891
+ throw new EmitDemoError(`ffmpeg could not cut the demo: ${String(err)}`);
2892
+ }
2893
+ const wholeBytes = statSync(wholePlan.output).size;
2894
+ const wholeFits = wholeBytes <= ARTIFACT_MAX_BYTES;
2895
+ const clipPlans = [];
2896
+ if (!wholeFits) {
2897
+ for (const [index, chapter] of manifest.chapters.entries()) {
2898
+ const clipStart = index === 0 ? chapter.start : manifest.chapters[index - 1].end;
2899
+ const line = spoken.find((entry) => entry.index === index);
2900
+ clipPlans.push({
2901
+ video: videoPath,
2902
+ start: clipStart,
2903
+ end: chapter.end,
2904
+ output: join(work, `chapter-${String(index + 1).padStart(2, "0")}.webm`),
2905
+ ...line !== void 0 ? { audio: { wavPath: line.wavPath, tempo: line.tempo, delaySeconds: chapter.start - clipStart + SPEECH_LEAD_IN } } : (
2906
+ // A chapter with no line still carries a track in a narrated demo, so every clip of the demo has audio.
2907
+ speaker !== void 0 ? { audio: "silence" } : {}
2908
+ )
2909
+ });
2910
+ }
2911
+ for (const [index, plan] of clipPlans.entries()) {
2912
+ const chapter = manifest.chapters[index];
2828
2913
  try {
2829
- speech = await speaker(chapter.narration);
2914
+ media.renderClip(plan);
2830
2915
  } catch (err) {
2831
- throw new EmitDemoError(`${chapterLabel(index, chapter.title)}: the narration could not be spoken: ${err instanceof Error ? err.message : String(err)}`);
2916
+ throw new EmitDemoError(`${chapterLabel(index, chapter.title)}: ffmpeg could not cut the clip: ${String(err)}`);
2832
2917
  }
2833
- const fit = fitSpeech(speech.seconds, chapter.end - chapter.start);
2834
- if (!fit.ok) {
2918
+ const bytes = statSync(plan.output).size;
2919
+ if (bytes > ARTIFACT_MAX_BYTES) {
2835
2920
  throw new EmitDemoError(
2836
- `${chapterLabel(index, chapter.title)}: the narration runs ${fit.overrunSeconds.toFixed(1)} s too long even at 1.3 times speed \u2014 shorten the line or lengthen the chapter`
2921
+ `${chapterLabel(index, chapter.title)}: the clip is ${(bytes / MIB).toFixed(1)} MiB, over the ${ARTIFACT_MAX_BYTES / MIB} MiB limit \u2014 shorten the chapter or record a smaller window`
2837
2922
  );
2838
2923
  }
2839
- plan.audio = { wavPath: speech.wavPath, tempo: fit.tempo, delaySeconds: SPEECH_LEAD_IN };
2840
- } else if (speaker !== void 0) {
2841
- plan.audio = "silence";
2842
- }
2843
- plans.push(plan);
2844
- }
2845
- for (const [index, plan] of plans.entries()) {
2846
- const chapter = manifest.chapters[index];
2847
- try {
2848
- media.renderClip(plan);
2849
- } catch (err) {
2850
- throw new EmitDemoError(`${chapterLabel(index, chapter.title)}: ffmpeg could not cut the clip: ${String(err)}`);
2851
- }
2852
- const bytes = statSync(plan.output).size;
2853
- if (bytes > ARTIFACT_MAX_BYTES) {
2854
- throw new EmitDemoError(
2855
- `${chapterLabel(index, chapter.title)}: the clip is ${(bytes / MIB).toFixed(1)} MiB, over the ${ARTIFACT_MAX_BYTES / MIB} MiB limit \u2014 shorten the chapter or record a smaller window`
2856
- );
2857
2924
  }
2858
2925
  }
2859
2926
  const seed = createHash("sha256").update(manifestText).update("\0").update(readFileSync(videoPath)).update(`\0${opts.item ?? ""}\0${opts.pr ?? ""}`).digest("hex");
2860
2927
  const idFor = (label, file) => `demo-${createHash("sha256").update(seed).update("\0").update(label).update("\0").update(readFileSync(file)).digest("hex").slice(0, 40)}`;
2861
- const clipIds = plans.map((plan, index) => idFor(`clip-${index + 1}`, plan.output));
2862
- const plannedRecord = JSON.stringify(
2863
- buildDemoRecord(
2864
- manifest,
2865
- manifest.chapters.map((chapter, index) => ({ clipArtifactId: clipIds[index], bound: chapter.criterionId !== null && chapterPassed(chapter.checks) })),
2866
- comparisons
2867
- )
2868
- );
2928
+ const bound = manifest.chapters.map((chapter) => chapter.criterionId !== null && chapterPassed(chapter.checks));
2929
+ let video;
2930
+ let stored;
2931
+ if (wholeFits) {
2932
+ video = { artifactId: idFor("video", wholePlan.output) };
2933
+ stored = manifest.chapters.map((chapter, index) => ({
2934
+ artifactId: idFor(`chapter-${index + 1}`, wholePlan.output),
2935
+ range: { start: chapter.start - first.start, end: chapter.end - first.start },
2936
+ bound: bound[index]
2937
+ }));
2938
+ } else {
2939
+ video = { omitted: "size", bytes: wholeBytes };
2940
+ stored = manifest.chapters.map((chapter, index) => ({
2941
+ artifactId: idFor(`clip-${index + 1}`, clipPlans[index].output),
2942
+ range: { start: chapter.start - clipPlans[index].start, end: chapter.end - clipPlans[index].start },
2943
+ bound: bound[index]
2944
+ }));
2945
+ }
2946
+ const plannedRecord = JSON.stringify(buildDemoRecord(manifest, video, stored, comparisons));
2869
2947
  const recordBytes = Buffer.byteLength(plannedRecord);
2870
2948
  if (recordBytes > ARTIFACT_MAX_BYTES) {
2871
2949
  throw new EmitDemoError(
@@ -2885,36 +2963,66 @@ async function runEmitDemo(opts) {
2885
2963
  env,
2886
2964
  fetchImpl: opts.fetchImpl
2887
2965
  };
2888
- const clips = [];
2966
+ const total = manifest.chapters.length + (wholeFits ? 1 : 0) + 1;
2967
+ const unit = "artifacts";
2968
+ let emitted = 0;
2969
+ const emitStep = async (params) => {
2970
+ const result = await emitOrExplain(emit, { ...base, ...params }, emitted, total, unit);
2971
+ emitted += 1;
2972
+ return result;
2973
+ };
2974
+ if (wholeFits) {
2975
+ const wholeResult = await emitStep({
2976
+ file: wholePlan.output,
2977
+ artifactId: video.artifactId,
2978
+ caption: `Demo: ${manifest.chapters.length} chapter${manifest.chapters.length === 1 ? "" : "s"}, ${(wholePlan.end - wholePlan.start).toFixed(1)} s`,
2979
+ blobOptional: true
2980
+ });
2981
+ video = { artifactId: artifactIdOf(wholeResult) };
2982
+ }
2889
2983
  const failures = [];
2984
+ const clips = [];
2890
2985
  for (const [index, chapter] of manifest.chapters.entries()) {
2891
- const bound = chapter.criterionId !== null && chapterPassed(chapter.checks);
2892
2986
  const failed = chapter.checks.filter((check) => !check.passed);
2893
2987
  if (failed.length > 0) {
2894
2988
  failures.push(`${chapterLabel(index, chapter.title)} failed: ${failed.map((check) => `"${check.text}"`).join(", ")}`);
2895
2989
  } else if (chapter.criterionId !== null && chapter.checks.length === 0) {
2896
- say(`${C.yellow}!${C.reset} ${chapterLabel(index, chapter.title)} ran no checks, so its clip is not bound to ${chapter.criterionId}`);
2990
+ say(`${C.yellow}!${C.reset} ${chapterLabel(index, chapter.title)} ran no checks, so its ${wholeFits ? "proof" : "clip"} is not bound to ${chapter.criterionId}`);
2897
2991
  }
2898
2992
  const caption = `Demo chapter ${index + 1}: ${chapter.title}${failed.length > 0 ? ` (${failed.length} failed check${failed.length === 1 ? "" : "s"})` : ""}`;
2899
- const result = await emitOrExplain(emit, {
2900
- ...base,
2901
- file: plans[index].output,
2902
- artifactId: clipIds[index],
2993
+ const chapterName = `chapter-${String(index + 1).padStart(2, "0")}.webm`;
2994
+ const result = await emitStep({
2995
+ file: wholeFits ? wholePlan.output : clipPlans[index].output,
2996
+ filename: chapterName,
2997
+ artifactId: stored[index].artifactId,
2903
2998
  caption: caption.slice(0, ARTIFACT_MAX_CAPTION_LENGTH),
2904
- ...bound ? { criterionId: chapter.criterionId } : {}
2905
- }, clips.length, manifest.chapters.length);
2906
- clips.push({ clipArtifactId: artifactIdOf(result), bound, title: chapter.title, comparable: comparisons[index].comparable });
2999
+ ...bound[index] ? { criterionId: chapter.criterionId } : {},
3000
+ ...wholeFits ? { range: stored[index].range } : {},
3001
+ blobOptional: true
3002
+ });
3003
+ clips.push({
3004
+ clipArtifactId: artifactIdOf(result),
3005
+ bound: bound[index],
3006
+ title: chapter.title,
3007
+ comparable: comparisons[index].comparable,
3008
+ range: stored[index].range
3009
+ });
2907
3010
  }
2908
- const record = buildDemoRecord(manifest, clips, comparisons);
3011
+ const record = buildDemoRecord(
3012
+ manifest,
3013
+ video,
3014
+ clips.map((clip) => ({ artifactId: clip.clipArtifactId, range: clip.range, bound: clip.bound })),
3015
+ comparisons
3016
+ );
2909
3017
  const recordPath = join(work, "demo.json");
2910
3018
  writeFileSync(recordPath, JSON.stringify(record));
2911
- const recorded = await emitOrExplain(emit, {
2912
- ...base,
3019
+ const recorded = await emitStep({
2913
3020
  file: recordPath,
2914
3021
  artifactId: idFor("record", recordPath),
2915
3022
  caption: `Demo record: ${clips.length} chapter${clips.length === 1 ? "" : "s"}, ${clips.filter((clip) => clip.bound).length} bound to a criterion`,
2916
- mediaType: DEMO_RECORD_MEDIA_TYPE
2917
- }, clips.length, manifest.chapters.length);
3023
+ mediaType: DEMO_RECORD_MEDIA_TYPE,
3024
+ blobOptional: true
3025
+ });
2918
3026
  const recordArtifactId = artifactIdOf(recorded);
2919
3027
  const exitCode = failures.length > 0 ? 1 : 0;
2920
3028
  const differences = manifest.chapters.flatMap((chapter, index) => {
@@ -2924,13 +3032,15 @@ async function runEmitDemo(opts) {
2924
3032
  return [`${chapterLabel(index, chapter.title)} is not comparable: the still after check ${difference.check + 1} differs in the region x ${x}, y ${y}, ${width} \xD7 ${height} (width \xD7 height)`];
2925
3033
  });
2926
3034
  const compared = comparisons.filter((comparison) => comparison.comparable !== "not checked").length;
2927
- const summary = `${C.green}\u2713${C.reset} demo emitted ${C.dim}\xB7${C.reset} ${clips.length} clip${clips.length === 1 ? "" : "s"}, ${clips.filter((clip) => clip.bound).length} bound to a criterion ${C.dim}\xB7${C.reset} record ${recordArtifactId}`;
2928
- const output = opts.json ? JSON.stringify({ recordArtifactId, clips, failures, differences, exitCode }) : [
3035
+ const boundCount = clips.filter((clip) => clip.bound).length;
3036
+ const what = wholeFits ? `1 video, ${clips.length} chapter${clips.length === 1 ? "" : "s"}, ${boundCount} bound to a criterion` : `whole video left out for its size (${wholeBytes} bytes) ${C.dim}\xB7${C.reset} ${clips.length} clip${clips.length === 1 ? "" : "s"}, ${boundCount} bound to a criterion`;
3037
+ const summary = `${C.green}\u2713${C.reset} demo emitted ${C.dim}\xB7${C.reset} ${what} ${C.dim}\xB7${C.reset} record ${recordArtifactId}`;
3038
+ const output = opts.json ? JSON.stringify({ recordArtifactId, video, clips, failures, differences, exitCode }) : [
2929
3039
  ...differences.map((line) => `${C.yellow}!${C.reset} ${line}`),
2930
3040
  summary + (opts.compare === void 0 ? "" : ` ${C.dim}\xB7${C.reset} ${compared} of ${clips.length} chapter${clips.length === 1 ? "" : "s"} compared, ${comparisons.filter((comparison) => comparison.comparable === "yes").length} comparable`)
2931
3041
  ].join("\n");
2932
3042
  if (!opts.quiet) process.stdout.write(output + "\n");
2933
- return { exitCode, output, failures, recordArtifactId, clips, differences };
3043
+ return { exitCode, output, failures, recordArtifactId, video, clips, differences };
2934
3044
  } finally {
2935
3045
  rmSync(work, { recursive: true, force: true });
2936
3046
  }
@@ -2966,13 +3076,13 @@ function artifactIdOf(result) {
2966
3076
  if (typeof id !== "string") throw new EmitDemoError("the artifact was emitted but its id was not returned");
2967
3077
  return id;
2968
3078
  }
2969
- async function emitOrExplain(emit, opts, emitted, total) {
3079
+ async function emitOrExplain(emit, opts, emitted, total, unit) {
2970
3080
  try {
2971
3081
  return await emit(opts);
2972
3082
  } catch (err) {
2973
3083
  const message = err instanceof Error ? err.message : String(err);
2974
3084
  throw new EmitDemoError(
2975
- emitted > 0 ? `${message} \u2014 ${emitted} of ${total} clips were already emitted; run the command again to emit the whole demo` : message
3085
+ emitted > 0 ? `${message} \u2014 ${emitted} of ${total} ${unit} were already emitted; run the command again to emit the whole demo` : message
2976
3086
  );
2977
3087
  }
2978
3088
  }
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { EmitFindingError, detectUploadSessionId, refuseRemovedFindingFlags, resolveUploadTarget, runEmitFinding, runEmitFindings } from './chunk-NOXK3QW6.js';
3
+ export { EmitFindingError, detectUploadSessionId, refuseRemovedFindingFlags, resolveUploadTarget, runEmitFinding, runEmitFindings } from './chunk-QSSYXK6C.js';
4
4
  import './chunk-ESVW4MJY.js';
5
- import './chunk-6TFTRVOA.js';
6
- import './chunk-5RUH3PCG.js';
7
- import './chunk-DM4EGXDO.js';
8
- import './chunk-AKR32WHV.js';
9
- import './chunk-4IG6EZHU.js';
10
- import './chunk-RW52CUFX.js';
5
+ import './chunk-C3XLVHN6.js';
6
+ import './chunk-B3EE7OKK.js';
7
+ import './chunk-EWVYQLD3.js';
8
+ import './chunk-5DNCFOXA.js';
9
+ import './chunk-HJYBWJAS.js';
10
+ import './chunk-NSPRS7WK.js';
11
11
  import './chunk-G2JWZDFA.js';
12
12
  import './chunk-ANPNT6PM.js';
13
13
  import './chunk-VQ2JGZSC.js';
@@ -17,15 +17,15 @@ import './chunk-ESP5VZBD.js';
17
17
  import './chunk-HDSDUTX4.js';
18
18
  import './chunk-ZJSNLVCE.js';
19
19
  import './chunk-BJ3KTMDH.js';
20
- import './chunk-KUTZ6XLS.js';
20
+ import './chunk-G63KT5I5.js';
21
21
  import './chunk-5BHIBJDA.js';
22
22
  import './chunk-CDDED64E.js';
23
23
  import './chunk-RA3O54FC.js';
24
24
  import './chunk-T2Q7ISPE.js';
25
25
  import './chunk-WZBHBH3J.js';
26
26
  import './chunk-CRB3POP4.js';
27
- import './chunk-OGCG5LOX.js';
28
- import './chunk-AKHGQKNR.js';
27
+ import './chunk-LJG6EMLJ.js';
28
+ import './chunk-E6CO3MJE.js';
29
29
  import './chunk-VNVZDWO3.js';
30
30
  import './chunk-XD4ZCMA4.js';
31
31
  import './chunk-MESOOLF4.js';
@@ -1,16 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
3
  import { zodProblem } from './chunk-I3LTIAOR.js';
4
- import { detectCi } from './chunk-SFJD4MRY.js';
5
- import './chunk-RQKQTRXM.js';
4
+ import { detectCi } from './chunk-WHRR55PC.js';
5
+ import './chunk-THTBXIK5.js';
6
6
  import { launchRefusalForSession } from './chunk-ESVW4MJY.js';
7
7
  import './chunk-TBT347UY.js';
8
- import { detectActiveSession, autoConnect } from './chunk-6TFTRVOA.js';
9
- import './chunk-5RUH3PCG.js';
10
- import './chunk-DM4EGXDO.js';
11
- import { resolveRepoIdentity } from './chunk-AKR32WHV.js';
12
- import './chunk-4IG6EZHU.js';
13
- import './chunk-RW52CUFX.js';
8
+ import { detectActiveSession, autoConnect } from './chunk-C3XLVHN6.js';
9
+ import './chunk-B3EE7OKK.js';
10
+ import './chunk-EWVYQLD3.js';
11
+ import { resolveRepoIdentity } from './chunk-5DNCFOXA.js';
12
+ import './chunk-HJYBWJAS.js';
13
+ import './chunk-NSPRS7WK.js';
14
14
  import './chunk-G2JWZDFA.js';
15
15
  import { C } from './chunk-ANPNT6PM.js';
16
16
  import { resolveGatewayCredentials, defaultFetch, unauthorizedMessage } from './chunk-VQ2JGZSC.js';
@@ -18,13 +18,13 @@ import './chunk-PJDQPF5N.js';
18
18
  import './chunk-JT3YO5MH.js';
19
19
  import './chunk-ESP5VZBD.js';
20
20
  import './chunk-HDSDUTX4.js';
21
- import './chunk-HT7LVCTX.js';
21
+ import './chunk-L3DUKDTR.js';
22
22
  import './chunk-ZJSNLVCE.js';
23
23
  import './chunk-2O5KA67H.js';
24
24
  import './chunk-BKO6JEZI.js';
25
25
  import './chunk-HCVLP7XA.js';
26
26
  import './chunk-BJ3KTMDH.js';
27
- import './chunk-KUTZ6XLS.js';
27
+ import './chunk-G63KT5I5.js';
28
28
  import './chunk-5BHIBJDA.js';
29
29
  import './chunk-CDDED64E.js';
30
30
  import './chunk-RA3O54FC.js';
@@ -33,8 +33,8 @@ import { parseTrackerNumber, trackerNumberError } from './chunk-WZBHBH3J.js';
33
33
  import './chunk-CRB3POP4.js';
34
34
  import './chunk-URIZRCRY.js';
35
35
  import './chunk-TUSYOL2O.js';
36
- import './chunk-OGCG5LOX.js';
37
- import { EmittedNameSchema, EMITTED_RESULT_MAX_LINK_LENGTH, EMITTED_RESULTS, itemsAllowResult, EMITTED_RESULT_MAX_BODY_LENGTH, CheckItemsSchema } from './chunk-AKHGQKNR.js';
36
+ import './chunk-LJG6EMLJ.js';
37
+ import { EmittedNameSchema, EMITTED_RESULT_MAX_LINK_LENGTH, EMITTED_RESULTS, itemsAllowResult, EMITTED_RESULT_MAX_BODY_LENGTH, CheckItemsSchema } from './chunk-E6CO3MJE.js';
38
38
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
39
39
  import './chunk-XD4ZCMA4.js';
40
40
  import './chunk-MESOOLF4.js';
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { EmitStepError, runEmitStep, uploadSpooledSteps } from './chunk-RQKQTRXM.js';
3
+ export { EmitStepError, runEmitStep, uploadSpooledSteps } from './chunk-THTBXIK5.js';
4
4
  import './chunk-ESVW4MJY.js';
5
- import './chunk-6TFTRVOA.js';
6
- import './chunk-5RUH3PCG.js';
7
- import './chunk-DM4EGXDO.js';
8
- import './chunk-AKR32WHV.js';
9
- import './chunk-4IG6EZHU.js';
10
- import './chunk-RW52CUFX.js';
5
+ import './chunk-C3XLVHN6.js';
6
+ import './chunk-B3EE7OKK.js';
7
+ import './chunk-EWVYQLD3.js';
8
+ import './chunk-5DNCFOXA.js';
9
+ import './chunk-HJYBWJAS.js';
10
+ import './chunk-NSPRS7WK.js';
11
11
  import './chunk-G2JWZDFA.js';
12
12
  import './chunk-ANPNT6PM.js';
13
13
  import './chunk-VQ2JGZSC.js';
@@ -16,15 +16,15 @@ import './chunk-JT3YO5MH.js';
16
16
  import './chunk-ESP5VZBD.js';
17
17
  import './chunk-HDSDUTX4.js';
18
18
  import './chunk-BJ3KTMDH.js';
19
- import './chunk-KUTZ6XLS.js';
19
+ import './chunk-G63KT5I5.js';
20
20
  import './chunk-5BHIBJDA.js';
21
21
  import './chunk-CDDED64E.js';
22
22
  import './chunk-RA3O54FC.js';
23
23
  import './chunk-T2Q7ISPE.js';
24
24
  import './chunk-WZBHBH3J.js';
25
25
  import './chunk-CRB3POP4.js';
26
- import './chunk-OGCG5LOX.js';
27
- import './chunk-AKHGQKNR.js';
26
+ import './chunk-LJG6EMLJ.js';
27
+ import './chunk-E6CO3MJE.js';
28
28
  import './chunk-VNVZDWO3.js';
29
29
  import './chunk-XD4ZCMA4.js';
30
30
  import './chunk-MESOOLF4.js';
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { resolveUploadTarget, detectUploadSessionId, EmitFindingError } from './chunk-NOXK3QW6.js';
3
+ import { resolveUploadTarget, detectUploadSessionId, EmitFindingError } from './chunk-QSSYXK6C.js';
4
4
  import './chunk-ESVW4MJY.js';
5
- import { autoConnect } from './chunk-6TFTRVOA.js';
6
- import './chunk-5RUH3PCG.js';
7
- import './chunk-DM4EGXDO.js';
8
- import './chunk-AKR32WHV.js';
9
- import './chunk-4IG6EZHU.js';
10
- import './chunk-RW52CUFX.js';
5
+ import { autoConnect } from './chunk-C3XLVHN6.js';
6
+ import './chunk-B3EE7OKK.js';
7
+ import './chunk-EWVYQLD3.js';
8
+ import './chunk-5DNCFOXA.js';
9
+ import './chunk-HJYBWJAS.js';
10
+ import './chunk-NSPRS7WK.js';
11
11
  import './chunk-G2JWZDFA.js';
12
12
  import { C } from './chunk-ANPNT6PM.js';
13
13
  import { resolveGatewayCredentials, defaultFetch, unauthorizedMessage } from './chunk-VQ2JGZSC.js';
@@ -17,15 +17,15 @@ import './chunk-ESP5VZBD.js';
17
17
  import './chunk-HDSDUTX4.js';
18
18
  import './chunk-ZJSNLVCE.js';
19
19
  import './chunk-BJ3KTMDH.js';
20
- import './chunk-KUTZ6XLS.js';
20
+ import './chunk-G63KT5I5.js';
21
21
  import './chunk-5BHIBJDA.js';
22
22
  import './chunk-CDDED64E.js';
23
23
  import './chunk-RA3O54FC.js';
24
24
  import './chunk-T2Q7ISPE.js';
25
25
  import './chunk-WZBHBH3J.js';
26
26
  import './chunk-CRB3POP4.js';
27
- import './chunk-OGCG5LOX.js';
28
- import './chunk-AKHGQKNR.js';
27
+ import './chunk-LJG6EMLJ.js';
28
+ import './chunk-E6CO3MJE.js';
29
29
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
30
30
  import './chunk-XD4ZCMA4.js';
31
31
  import './chunk-MESOOLF4.js';
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { describeFleet, fleetCheck, fleetReadiness } from './chunk-EG7KPSSP.js';
4
- import './chunk-DM4EGXDO.js';
5
- import './chunk-4IG6EZHU.js';
3
+ export { describeFleet, fleetCheck, fleetReadiness } from './chunk-72BIONOT.js';
4
+ import './chunk-EWVYQLD3.js';
5
+ import './chunk-HJYBWJAS.js';
6
6
  import './chunk-VQ2JGZSC.js';
7
7
  import './chunk-PJDQPF5N.js';
8
8
  import './chunk-JT3YO5MH.js';
@@ -10,17 +10,17 @@ import './chunk-ESP5VZBD.js';
10
10
  import './chunk-HDSDUTX4.js';
11
11
  import './chunk-HCVLP7XA.js';
12
12
  import './chunk-BJ3KTMDH.js';
13
- import './chunk-Q2D4M3GC.js';
14
- import './chunk-KUTZ6XLS.js';
13
+ import './chunk-GFYEMCPP.js';
14
+ import './chunk-G63KT5I5.js';
15
15
  import './chunk-5BHIBJDA.js';
16
16
  import './chunk-CDDED64E.js';
17
17
  import './chunk-RA3O54FC.js';
18
18
  import './chunk-CRB3POP4.js';
19
- import './chunk-LN4WDONI.js';
19
+ import './chunk-AVTI3FL5.js';
20
20
  import './chunk-YQR6E6OV.js';
21
21
  import './chunk-TUSYOL2O.js';
22
- import './chunk-OGCG5LOX.js';
23
- import './chunk-AKHGQKNR.js';
22
+ import './chunk-LJG6EMLJ.js';
23
+ import './chunk-E6CO3MJE.js';
24
24
  import './chunk-VNVZDWO3.js';
25
25
  import './chunk-XD4ZCMA4.js';
26
26
  import './chunk-MESOOLF4.js';