@lumerahq/cli 0.31.0-dev.1 → 0.31.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.
package/dist/index.js CHANGED
@@ -240,25 +240,25 @@ async function main() {
240
240
  switch (command) {
241
241
  // Resource commands
242
242
  case "plan":
243
- await import("./resources-GM2OWDKP.js").then((m) => m.plan(args.slice(1)));
243
+ await import("./resources-FHL4IUQD.js").then((m) => m.plan(args.slice(1)));
244
244
  break;
245
245
  case "apply":
246
- await import("./resources-GM2OWDKP.js").then((m) => m.apply(args.slice(1)));
246
+ await import("./resources-FHL4IUQD.js").then((m) => m.apply(args.slice(1)));
247
247
  break;
248
248
  case "pull":
249
- await import("./resources-GM2OWDKP.js").then((m) => m.pull(args.slice(1)));
249
+ await import("./resources-FHL4IUQD.js").then((m) => m.pull(args.slice(1)));
250
250
  break;
251
251
  case "destroy":
252
- await import("./resources-GM2OWDKP.js").then((m) => m.destroy(args.slice(1)));
252
+ await import("./resources-FHL4IUQD.js").then((m) => m.destroy(args.slice(1)));
253
253
  break;
254
254
  case "list":
255
- await import("./resources-GM2OWDKP.js").then((m) => m.list(args.slice(1)));
255
+ await import("./resources-FHL4IUQD.js").then((m) => m.list(args.slice(1)));
256
256
  break;
257
257
  case "show":
258
- await import("./resources-GM2OWDKP.js").then((m) => m.show(args.slice(1)));
258
+ await import("./resources-FHL4IUQD.js").then((m) => m.show(args.slice(1)));
259
259
  break;
260
260
  case "diff":
261
- await import("./resources-GM2OWDKP.js").then((m) => m.diff(args.slice(1)));
261
+ await import("./resources-FHL4IUQD.js").then((m) => m.diff(args.slice(1)));
262
262
  break;
263
263
  // Development
264
264
  case "dev":
@@ -2661,6 +2661,9 @@ var SKILL_RESOURCE_CONTENT_TYPES = {
2661
2661
  function skillResourceContentType(path) {
2662
2662
  return SKILL_RESOURCE_CONTENT_TYPES[path.split(".").pop()?.toLowerCase() ?? ""] ?? "application/octet-stream";
2663
2663
  }
2664
+ function foldSkillResourcePathPart(value) {
2665
+ return value.toUpperCase();
2666
+ }
2664
2667
  function skillResourcePathError(value) {
2665
2668
  if (!value || Buffer.byteLength(value) > SKILL_RESOURCE_MAX_PATH_BYTES) {
2666
2669
  return `path must be at most ${SKILL_RESOURCE_MAX_PATH_BYTES} bytes`;
@@ -2675,7 +2678,7 @@ function skillResourcePathError(value) {
2675
2678
  if (Buffer.byteLength(part) > SKILL_RESOURCE_MAX_PATH_PART_BYTES) {
2676
2679
  return `path segments must be at most ${SKILL_RESOURCE_MAX_PATH_PART_BYTES} bytes`;
2677
2680
  }
2678
- if (part.toLowerCase() === "skill.md") return "SKILL.md is reserved";
2681
+ if (foldSkillResourcePathPart(part) === "SKILL.MD") return "SKILL.md is reserved";
2679
2682
  }
2680
2683
  return null;
2681
2684
  }
@@ -2685,7 +2688,7 @@ function skillResourcePathsCollide(left, right) {
2685
2688
  const limit = Math.min(leftParts.length, rightParts.length);
2686
2689
  for (let i = 0; i < limit; i++) {
2687
2690
  if (leftParts[i] === rightParts[i]) continue;
2688
- return leftParts[i]?.toLowerCase() === rightParts[i]?.toLowerCase();
2691
+ return foldSkillResourcePathPart(leftParts[i] ?? "") === foldSkillResourcePathPart(rightParts[i] ?? "");
2689
2692
  }
2690
2693
  return true;
2691
2694
  }
@@ -2844,6 +2847,13 @@ ${skill.summary}
2844
2847
  ${skill.instructions}
2845
2848
  `;
2846
2849
  }
2850
+ function skillMetadataChanges(local, remote) {
2851
+ const changes = [];
2852
+ if (local.name !== remote.name) changes.push("name");
2853
+ if (local.summary.trim() !== (remote.summary || "").trim()) changes.push("summary");
2854
+ if (local.instructions.trim() !== (remote.instructions || "").trim()) changes.push("instructions");
2855
+ return changes;
2856
+ }
2847
2857
  function scopedProjectSkillSlug(appName, localSlug) {
2848
2858
  return appName ? `${appName}:${localSlug}` : localSlug;
2849
2859
  }
@@ -2945,10 +2955,7 @@ async function planSkills(api, localSkills, projectId, appName) {
2945
2955
  });
2946
2956
  continue;
2947
2957
  }
2948
- const changed = [];
2949
- if (remote.name !== skill.name) changed.push("name");
2950
- if ((remote.summary || "").trim() !== skill.summary.trim()) changed.push("summary");
2951
- if ((remote.instructions || "").trim() !== skill.instructions.trim()) changed.push("instructions");
2958
+ const changed = skillMetadataChanges(skill, remote);
2952
2959
  const resourceChanges = compareSkillResources(skill.resources, remote.resources ?? []);
2953
2960
  if (!skillResourceChangesEmpty(resourceChanges)) {
2954
2961
  changed.push(`resources (${skillResourceChangesSummary(resourceChanges)})`);
@@ -3066,6 +3073,15 @@ function validateRemoteSkillResources(resources) {
3066
3073
  }
3067
3074
  if (totalBytes > SKILL_RESOURCES_MAX_TOTAL_BYTES) throw new Error("remote skill resources exceed 100 MiB");
3068
3075
  }
3076
+ function writeVerifiedSkillResource(resource, bytes, skillDir, source) {
3077
+ if (bytes.byteLength !== resource.size) throw new Error(`${resource.path}: ${source} size does not match`);
3078
+ if (createHash("sha256").update(bytes).digest("hex") !== resource.sha256) {
3079
+ throw new Error(`${resource.path}: ${source} checksum does not match`);
3080
+ }
3081
+ const destination = join2(skillDir, ...resource.path.split("/"));
3082
+ mkdirSync(dirname2(destination), { recursive: true });
3083
+ writeFileSync(destination, bytes);
3084
+ }
3069
3085
  async function downloadSkillResource(resource, skillDir) {
3070
3086
  if (!resource.url) throw new Error(`${resource.path}: download URL is unavailable`);
3071
3087
  let response;
@@ -3075,14 +3091,7 @@ async function downloadSkillResource(resource, skillDir) {
3075
3091
  throw new Error(`${resource.path}: download failed`);
3076
3092
  }
3077
3093
  if (!response.ok) throw new Error(`${resource.path}: download failed with HTTP ${response.status}`);
3078
- const bytes = Buffer.from(await response.arrayBuffer());
3079
- if (bytes.byteLength !== resource.size) throw new Error(`${resource.path}: downloaded size does not match`);
3080
- if (createHash("sha256").update(bytes).digest("hex") !== resource.sha256) {
3081
- throw new Error(`${resource.path}: downloaded checksum does not match`);
3082
- }
3083
- const destination = join2(skillDir, ...resource.path.split("/"));
3084
- mkdirSync(dirname2(destination), { recursive: true });
3085
- writeFileSync(destination, bytes);
3094
+ writeVerifiedSkillResource(resource, Buffer.from(await response.arrayBuffer()), skillDir, "downloaded");
3086
3095
  }
3087
3096
  function replaceSkillDirectory(stagingDir, skillDir) {
3088
3097
  const backupDir = `${stagingDir}.previous`;
@@ -3096,7 +3105,7 @@ function replaceSkillDirectory(stagingDir, skillDir) {
3096
3105
  }
3097
3106
  if (hadExisting) rmSync(backupDir, { recursive: true, force: true });
3098
3107
  }
3099
- async function pullSkills(api, platformDir, filterName, projectId, appName) {
3108
+ async function pullSkills(api, platformDir, filterName, projectId, appName, checkedLocalSkills) {
3100
3109
  if (!projectId) {
3101
3110
  console.log(pc2.dim(" Skipped \u2014 project not registered (run `lumera register`)"));
3102
3111
  return;
@@ -3108,12 +3117,26 @@ async function pullSkills(api, platformDir, filterName, projectId, appName) {
3108
3117
  appName
3109
3118
  );
3110
3119
  const resolvedFilter = resolveProjectSkillLocalSlug(remoteSkills, filterName);
3120
+ const checkedLocalSkillsBySlug = new Map(checkedLocalSkills?.map((skill) => [skill.slug, skill]) ?? []);
3111
3121
  for (const [localSlug, listedSkill] of remoteSkills) {
3112
3122
  if (!SKILL_SLUG_RE.test(localSlug)) {
3113
3123
  console.log(pc2.yellow(` \u26A0 Skipping ${listedSkill.name}: skill slug ${listedSkill.slug} cannot be represented in platform/skills`));
3114
3124
  continue;
3115
3125
  }
3116
3126
  if (resolvedFilter && localSlug !== resolvedFilter) continue;
3127
+ const listedResources = [...listedSkill.resources ?? []].sort((a, b) => a.path.localeCompare(b.path));
3128
+ validateRemoteSkillResources(listedResources);
3129
+ let local = checkedLocalSkillsBySlug.get(localSlug);
3130
+ if (!checkedLocalSkills) {
3131
+ try {
3132
+ [local] = loadLocalSkills(platformDir, localSlug);
3133
+ } catch {
3134
+ }
3135
+ }
3136
+ if (local && skillMetadataChanges(local, listedSkill).length === 0 && skillResourceChangesEmpty(compareSkillResources(local.resources, listedResources))) {
3137
+ console.log(pc2.green(" \u2713"), `${listedSkill.name} (unchanged)`);
3138
+ continue;
3139
+ }
3117
3140
  const skill = await api.getAgentSkill(listedSkill.id, { resource_urls: "attachment" });
3118
3141
  if (!(skill.summary || "").trim() || !(skill.instructions || "").trim()) {
3119
3142
  console.log(pc2.yellow(` \u26A0 Skipping ${skill.name}: source-managed skills require both summary and instructions`));
@@ -3121,6 +3144,7 @@ async function pullSkills(api, platformDir, filterName, projectId, appName) {
3121
3144
  }
3122
3145
  const resources = [...skill.resources ?? []].sort((a, b) => a.path.localeCompare(b.path));
3123
3146
  validateRemoteSkillResources(resources);
3147
+ const localResources = new Map(local?.resources.map((resource) => [resource.path, resource]) ?? []);
3124
3148
  const skillDir = join2(skillsDir, localSlug);
3125
3149
  mkdirSync(skillsDir, { recursive: true });
3126
3150
  const stagingDir = mkdtempSync(join2(platformDir, `.skill-${localSlug}-pull-`));
@@ -3130,7 +3154,14 @@ async function pullSkills(api, platformDir, filterName, projectId, appName) {
3130
3154
  summary: skill.summary || "",
3131
3155
  instructions: skill.instructions || ""
3132
3156
  }));
3133
- for (const resource of resources) await downloadSkillResource(resource, stagingDir);
3157
+ for (const resource of resources) {
3158
+ const localResource = localResources.get(resource.path);
3159
+ if (localResource?.size === resource.size && localResource.sha256 === resource.sha256) {
3160
+ writeVerifiedSkillResource(resource, readFileSync2(localResource.filePath), stagingDir, "local");
3161
+ } else {
3162
+ await downloadSkillResource(resource, stagingDir);
3163
+ }
3164
+ }
3134
3165
  replaceSkillDirectory(stagingDir, skillDir);
3135
3166
  } finally {
3136
3167
  rmSync(stagingDir, { recursive: true, force: true });
@@ -3565,7 +3596,7 @@ async function listResources(api, platformDir, filterType, appName, projectId) {
3565
3596
  } else {
3566
3597
  const resourceChanges = compareSkillResources(skill.resources, remote.resources ?? []);
3567
3598
  const details = [
3568
- remote.name !== skill.name || (remote.summary || "").trim() !== skill.summary.trim() || (remote.instructions || "").trim() !== skill.instructions.trim() ? "SKILL.md" : "",
3599
+ skillMetadataChanges(skill, remote).length > 0 ? "SKILL.md" : "",
3569
3600
  skillResourceChangesEmpty(resourceChanges) ? "" : `resources (${skillResourceChangesSummary(resourceChanges)})`
3570
3601
  ].filter(Boolean).join(", ");
3571
3602
  results.push(details ? { name: skill.name, type: "skills", status: "changed", details } : { name: skill.name, type: "skills", status: "synced" });
@@ -4077,7 +4108,7 @@ async function showResource(api, platformDir, resourceType, resourceName, appNam
4077
4108
  console.log();
4078
4109
  if (local && remote) {
4079
4110
  const resourceChanges = compareSkillResources(local.resources, remote.resources ?? []);
4080
- const changed = local.name !== remote.name || local.summary.trim() !== (remote.summary || "").trim() || local.instructions.trim() !== (remote.instructions || "").trim() || !skillResourceChangesEmpty(resourceChanges);
4111
+ const changed = skillMetadataChanges(local, remote).length > 0 || !skillResourceChangesEmpty(resourceChanges);
4081
4112
  console.log(` Status: ${changed ? pc2.yellow("changed") : pc2.green("synced")}`);
4082
4113
  if (!skillResourceChangesEmpty(resourceChanges)) {
4083
4114
  console.log(` Resources: ${skillResourceChangesSummary(resourceChanges)}`);
@@ -4525,6 +4556,7 @@ async function pull(args) {
4525
4556
  const api = createApiClient(void 0, void 0, appName);
4526
4557
  const projectId = getProjectId(projectRoot);
4527
4558
  const { type, name } = parseResource(filteredArgs[0]);
4559
+ let checkedLocalSkills;
4528
4560
  if (!force) {
4529
4561
  const conflicts = [];
4530
4562
  let collections;
@@ -4539,16 +4571,16 @@ async function pull(args) {
4539
4571
  await api.listAgentSkills({ project_id: projectId }),
4540
4572
  appName
4541
4573
  );
4542
- const localSkills = loadLocalSkills(
4574
+ checkedLocalSkills = loadLocalSkills(
4543
4575
  platformDir,
4544
4576
  resolveProjectSkillLocalSlug(remoteBySlug, name || void 0)
4545
4577
  );
4546
- if (localSkills.length > 0) {
4547
- for (const skill of localSkills) {
4578
+ if (checkedLocalSkills.length > 0) {
4579
+ for (const skill of checkedLocalSkills) {
4548
4580
  const remote = remoteBySlug.get(skill.slug);
4549
4581
  if (!remote) continue;
4550
4582
  const resourceChanges = compareSkillResources(skill.resources, remote.resources ?? []);
4551
- if (remote.name !== skill.name || (remote.summary || "").trim() !== skill.summary.trim() || (remote.instructions || "").trim() !== skill.instructions.trim() || resourceChanges.added.length > 0 || resourceChanges.replaced.length > 0) {
4583
+ if (skillMetadataChanges(skill, remote).length > 0 || resourceChanges.added.length > 0 || resourceChanges.replaced.length > 0) {
4552
4584
  conflicts.push(`skills/${skill.slug}`);
4553
4585
  }
4554
4586
  }
@@ -4628,7 +4660,7 @@ async function pull(args) {
4628
4660
  }
4629
4661
  if (!type || type === "skills") {
4630
4662
  console.log(pc2.bold(" Skills:"));
4631
- await pullSkills(api, platformDir, name || void 0, projectId, appName);
4663
+ await pullSkills(api, platformDir, name || void 0, projectId, appName, checkedLocalSkills);
4632
4664
  console.log();
4633
4665
  }
4634
4666
  if (!type || type === "agents") {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lumerahq/cli",
3
- "version": "0.31.0-dev.1",
3
+ "version": "0.31.1",
4
4
  "description": "CLI for building and deploying Lumera apps",
5
5
  "type": "module",
6
6
  "engines": {
@@ -31,7 +31,7 @@
31
31
  "check:ci": "biome check . && tsr generate && tsc --noEmit"
32
32
  },
33
33
  "dependencies": {
34
- "@lumerahq/ui": "^0.19.5",
34
+ "@lumerahq/ui": "^0.19.6",
35
35
  "@tanstack/react-query": "^5.90.11",
36
36
  "@tanstack/react-router": "1.155.0",
37
37
  "clsx": "^2.1.1",
@@ -19,8 +19,8 @@ importers:
19
19
  .:
20
20
  dependencies:
21
21
  '@lumerahq/ui':
22
- specifier: ^0.19.5
23
- version: 0.19.5(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
22
+ specifier: ^0.19.6
23
+ version: 0.19.6(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
24
24
  '@tanstack/react-query':
25
25
  specifier: ^5.90.11
26
26
  version: 5.101.0(react@19.2.7)
@@ -221,24 +221,28 @@ packages:
221
221
  engines: {node: '>=14.21.3'}
222
222
  cpu: [arm64]
223
223
  os: [linux]
224
+ libc: [musl]
224
225
 
225
226
  '@biomejs/cli-linux-arm64@2.5.6':
226
227
  resolution: {integrity: sha512-6XsYwCFkp5sMxl85ffhgeGpGgs6A7dRYFnkceZ7WVxvycuTnGdD5xa534Z3xfrBQ0JCMK/mujT6ZNPJoghedwg==}
227
228
  engines: {node: '>=14.21.3'}
228
229
  cpu: [arm64]
229
230
  os: [linux]
231
+ libc: [glibc]
230
232
 
231
233
  '@biomejs/cli-linux-x64-musl@2.5.6':
232
234
  resolution: {integrity: sha512-2Vp13QdKysH3HIWLaYLhUUwbK+jbZonJD1K+Lr0d0RO4wH7mkYd43vJixEDm8cUWrowoRz4UUHF1nm9Ae7ym8A==}
233
235
  engines: {node: '>=14.21.3'}
234
236
  cpu: [x64]
235
237
  os: [linux]
238
+ libc: [musl]
236
239
 
237
240
  '@biomejs/cli-linux-x64@2.5.6':
238
241
  resolution: {integrity: sha512-Pop9VXCFUhFTMfFefZ39S+u2rOPyNp5iHlxbZRwXGACHLy2r0jjiRgJHmaEKJzL3SyxlVeGShXhvvElvWowonA==}
239
242
  engines: {node: '>=14.21.3'}
240
243
  cpu: [x64]
241
244
  os: [linux]
245
+ libc: [glibc]
242
246
 
243
247
  '@biomejs/cli-win32-arm64@2.5.6':
244
248
  resolution: {integrity: sha512-tDGshcm6BdkZOCGnTDX0Y8/U4IfBSlnUU7T56nNDuPEfed+aHg+u8G36NB43fJVl0Os6+QURXIE1yuD7AaEofA==}
@@ -460,8 +464,8 @@ packages:
460
464
  '@jridgewell/trace-mapping@0.3.31':
461
465
  resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
462
466
 
463
- '@lumerahq/ui@0.19.5':
464
- resolution: {integrity: sha512-AkX13UMMEkkHLRktms6Gh6vrygcQbMWxq1Du07qNbiVcVCcAPMWr68chkLdUOM0/00Bgb7JfLu1jrodhtFlrGA==}
467
+ '@lumerahq/ui@0.19.6':
468
+ resolution: {integrity: sha512-ojnHO9T7lt/dvkAQ+ZDuDIrZp/1pDtTvsxePJVc3e9qWI7voUuJlE6QoUYH9FBMkjK5KO34+wNyfktSYGgTRng==}
465
469
  peerDependencies:
466
470
  react: ^18.0.0 || ^19.0.0
467
471
  react-dom: ^18.0.0 || ^19.0.0
@@ -513,36 +517,42 @@ packages:
513
517
  engines: {node: ^20.19.0 || >=22.12.0}
514
518
  cpu: [arm64]
515
519
  os: [linux]
520
+ libc: [glibc]
516
521
 
517
522
  '@rolldown/binding-linux-arm64-musl@1.0.3':
518
523
  resolution: {integrity: sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==}
519
524
  engines: {node: ^20.19.0 || >=22.12.0}
520
525
  cpu: [arm64]
521
526
  os: [linux]
527
+ libc: [musl]
522
528
 
523
529
  '@rolldown/binding-linux-ppc64-gnu@1.0.3':
524
530
  resolution: {integrity: sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==}
525
531
  engines: {node: ^20.19.0 || >=22.12.0}
526
532
  cpu: [ppc64]
527
533
  os: [linux]
534
+ libc: [glibc]
528
535
 
529
536
  '@rolldown/binding-linux-s390x-gnu@1.0.3':
530
537
  resolution: {integrity: sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==}
531
538
  engines: {node: ^20.19.0 || >=22.12.0}
532
539
  cpu: [s390x]
533
540
  os: [linux]
541
+ libc: [glibc]
534
542
 
535
543
  '@rolldown/binding-linux-x64-gnu@1.0.3':
536
544
  resolution: {integrity: sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==}
537
545
  engines: {node: ^20.19.0 || >=22.12.0}
538
546
  cpu: [x64]
539
547
  os: [linux]
548
+ libc: [glibc]
540
549
 
541
550
  '@rolldown/binding-linux-x64-musl@1.0.3':
542
551
  resolution: {integrity: sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==}
543
552
  engines: {node: ^20.19.0 || >=22.12.0}
544
553
  cpu: [x64]
545
554
  os: [linux]
555
+ libc: [musl]
546
556
 
547
557
  '@rolldown/binding-openharmony-arm64@1.0.3':
548
558
  resolution: {integrity: sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==}
@@ -608,24 +618,28 @@ packages:
608
618
  engines: {node: '>= 20'}
609
619
  cpu: [arm64]
610
620
  os: [linux]
621
+ libc: [glibc]
611
622
 
612
623
  '@tailwindcss/oxide-linux-arm64-musl@4.3.0':
613
624
  resolution: {integrity: sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==}
614
625
  engines: {node: '>= 20'}
615
626
  cpu: [arm64]
616
627
  os: [linux]
628
+ libc: [musl]
617
629
 
618
630
  '@tailwindcss/oxide-linux-x64-gnu@4.3.0':
619
631
  resolution: {integrity: sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==}
620
632
  engines: {node: '>= 20'}
621
633
  cpu: [x64]
622
634
  os: [linux]
635
+ libc: [glibc]
623
636
 
624
637
  '@tailwindcss/oxide-linux-x64-musl@4.3.0':
625
638
  resolution: {integrity: sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==}
626
639
  engines: {node: '>= 20'}
627
640
  cpu: [x64]
628
641
  os: [linux]
642
+ libc: [musl]
629
643
 
630
644
  '@tailwindcss/oxide-wasm32-wasi@4.3.0':
631
645
  resolution: {integrity: sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==}
@@ -1419,24 +1433,28 @@ packages:
1419
1433
  engines: {node: '>= 12.0.0'}
1420
1434
  cpu: [arm64]
1421
1435
  os: [linux]
1436
+ libc: [glibc]
1422
1437
 
1423
1438
  lightningcss-linux-arm64-musl@1.32.0:
1424
1439
  resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==}
1425
1440
  engines: {node: '>= 12.0.0'}
1426
1441
  cpu: [arm64]
1427
1442
  os: [linux]
1443
+ libc: [musl]
1428
1444
 
1429
1445
  lightningcss-linux-x64-gnu@1.32.0:
1430
1446
  resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==}
1431
1447
  engines: {node: '>= 12.0.0'}
1432
1448
  cpu: [x64]
1433
1449
  os: [linux]
1450
+ libc: [glibc]
1434
1451
 
1435
1452
  lightningcss-linux-x64-musl@1.32.0:
1436
1453
  resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==}
1437
1454
  engines: {node: '>= 12.0.0'}
1438
1455
  cpu: [x64]
1439
1456
  os: [linux]
1457
+ libc: [musl]
1440
1458
 
1441
1459
  lightningcss-win32-arm64-msvc@1.32.0:
1442
1460
  resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==}
@@ -2300,7 +2318,7 @@ snapshots:
2300
2318
  '@jridgewell/resolve-uri': 3.1.2
2301
2319
  '@jridgewell/sourcemap-codec': 1.5.5
2302
2320
 
2303
- '@lumerahq/ui@0.19.5(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)':
2321
+ '@lumerahq/ui@0.19.6(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)':
2304
2322
  dependencies:
2305
2323
  '@base-ui/react': 1.5.0(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
2306
2324
  '@tanstack/react-query': 5.101.0(react@19.2.7)