@ioai/lerobot-studio 1.0.0 → 1.0.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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.0.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Improve dataset quality report filtering and update published package documentation.
8
+
3
9
  > **Language / 语言:** [English](./CHANGELOG.md) | [简体中文](./CHANGELOG.zh-CN.md)
4
10
 
5
11
  All notable changes to this project will be documented in this file.
package/README.md CHANGED
@@ -3,12 +3,13 @@
3
3
  [简体中文 — README.zh-CN.md](README.zh-CN.md)
4
4
 
5
5
  [![CI](https://github.com/ioai-tech/lerobot-studio/actions/workflows/ci.yml/badge.svg)](https://github.com/ioai-tech/lerobot-studio/actions/workflows/ci.yml)
6
+ [![npm version](https://img.shields.io/npm/v/@ioai/lerobot-studio.svg)](https://www.npmjs.com/package/@ioai/lerobot-studio)
6
7
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
7
8
  [![Docs](https://img.shields.io/badge/docs-VitePress-blue.svg)](https://ioai-tech.github.io/lerobot-studio/)
8
9
 
9
10
  > Open [LeRobot](https://github.com/huggingface/lerobot) datasets in your browser. View video, charts, and raw data together, or add the same viewer to a React application.
10
11
 
11
- Use it as a standalone site at [lerobot.studio](https://lerobot.studio). The React package is not yet published to npm; until it is available, use the standalone app or build from this repository. Local folders and archives are processed in your browser and are not uploaded to a cloud service. If you open a remote URL, the browser requests data from that URL's server.
12
+ Use it as a standalone site at [lerobot.studio](https://lerobot.studio), or install the [`@ioai/lerobot-studio`](https://www.npmjs.com/package/@ioai/lerobot-studio) React package from npm. Local folders and archives are processed in your browser and are not uploaded to a cloud service. If you open a remote URL, the browser requests data from that URL's server.
12
13
 
13
14
  <p align="center">
14
15
  <img src=".github/assets/lerobot-studio-demo.webp" alt="LeRobot Studio demo — synchronized video, charts, and episode navigation" width="800" />
@@ -77,7 +78,7 @@ docker run --rm -p 8080:8080 lerobot-studio
77
78
 
78
79
  ## Embedding in React
79
80
 
80
- The React package has not yet been published to npm. Its package name will be `@ioai/lerobot-studio`; until its first registry release, use the standalone app or build from this repository.
81
+ The React package is published on npm as [`@ioai/lerobot-studio`](https://www.npmjs.com/package/@ioai/lerobot-studio). Install it with:
81
82
 
82
83
  ```bash
83
84
  npm install @ioai/lerobot-studio
package/README.zh-CN.md CHANGED
@@ -3,12 +3,13 @@
3
3
  [English — README.md](README.md)
4
4
 
5
5
  [![CI](https://github.com/ioai-tech/lerobot-studio/actions/workflows/ci.yml/badge.svg)](https://github.com/ioai-tech/lerobot-studio/actions/workflows/ci.yml)
6
+ [![npm version](https://img.shields.io/npm/v/@ioai/lerobot-studio.svg)](https://www.npmjs.com/package/@ioai/lerobot-studio)
6
7
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
7
8
  [![Docs](https://img.shields.io/badge/docs-VitePress-blue.svg)](https://ioai-tech.github.io/lerobot-studio/)
8
9
 
9
10
  > 在浏览器中打开 [LeRobot](https://github.com/huggingface/lerobot) 数据集,同时查看视频、图表和原始数据;也可以将同一套查看器加入 React 应用。
10
11
 
11
- 你可以直接使用 [lerobot.studio](https://lerobot.studio)React 包尚未发布到 npm;发布前请使用独立应用或从本仓库构建。本地文件夹和压缩包会在浏览器中处理,不会上传到云端。只有打开远程链接时,浏览器才会向该链接所在的服务器请求数据。
12
+ 你可以直接使用 [lerobot.studio](https://lerobot.studio),也可以通过 npm 安装 [`@ioai/lerobot-studio`](https://www.npmjs.com/package/@ioai/lerobot-studio) 并嵌入 React 应用。本地文件夹和压缩包会在浏览器中处理,不会上传到云端。只有打开远程链接时,浏览器才会向该链接所在的服务器请求数据。
12
13
 
13
14
  <p align="center">
14
15
  <img src=".github/assets/lerobot-studio-demo.webp" alt="LeRobot Studio 演示 — 同步视频、图表与 Episode 浏览" width="800" />
@@ -77,7 +78,7 @@ docker run --rm -p 8080:8080 lerobot-studio
77
78
 
78
79
  ## 嵌入 React
79
80
 
80
- React 包尚未发布到 npm。其包名为 `@ioai/lerobot-studio`;在首次发布前,请使用独立应用或从本仓库构建。
81
+ React 包已以 [`@ioai/lerobot-studio`](https://www.npmjs.com/package/@ioai/lerobot-studio) 发布到 npm,安装方式:
81
82
 
82
83
  ```bash
83
84
  npm install @ioai/lerobot-studio
@@ -1,4 +1,4 @@
1
- import { $ as e, A as t, B as n, C as r, D as i, E as a, G as o, H as s, I as c, J as l, L as u, M as d, N as f, O as p, P as m, Q as h, R as g, S as _, T as v, V as y, W as b, X as x, Y as S, Z as C, _ as w, at as T, b as E, c as D, ct as O, d as k, dt as A, et as j, f as M, g as N, h as ee, ht as te, it as ne, j as re, k as ie, l as P, mt as F, nt as I, ot as L, pt as R, q as ae, rt as oe, s as se, st as ce, t as le, tt as ue, u as de, ut as fe, w as pe, x as me, y as he, z as ge } from "./react-window-tHOzYrJa.js";
1
+ import { $ as e, A as t, B as n, C as r, D as i, E as a, G as o, H as s, I as c, J as l, L as u, M as d, N as f, O as p, P as m, Q as h, R as g, S as _, T as v, V as y, W as b, X as x, Y as S, Z as C, _ as w, at as T, b as E, c as D, ct as O, d as k, dt as A, et as j, f as M, g as N, h as ee, ht as te, it as ne, j as re, k as ie, l as P, mt as F, nt as I, ot as L, pt as R, q as ae, rt as oe, s as se, st as ce, t as le, tt as ue, u as de, ut as fe, w as pe, x as me, y as he, z as ge } from "./react-window-CGTfzj0C.js";
2
2
  import { n as _e } from "./MediaCache-DZ7bEoOY.js";
3
3
  import * as z from "react";
4
4
  import B, { Component as ve, createContext as V, memo as H, startTransition as ye, useCallback as U, useDeferredValue as be, useEffect as xe, useMemo as W, useRef as G, useState as Se, useSyncExternalStore as Ce } from "react";
@@ -12281,67 +12281,54 @@ function Gl(e) {
12281
12281
  function Kl(e) {
12282
12282
  return e.timeline ? `${e.timeline.startSec.toFixed(2)}s - ${e.timeline.endSec.toFixed(2)}s` : null;
12283
12283
  }
12284
- var ql = ({ featureKey: e, metadata: t, translationPrefix: n, className: r }) => {
12285
- let { t: i } = te();
12286
- if (!t) return null;
12287
- let a = [
12288
- {
12289
- label: i(`${n}.feature`),
12290
- value: e,
12291
- breakAll: !0
12292
- },
12293
- {
12294
- label: i(`${n}.dtype`),
12295
- value: t.dtype
12296
- },
12284
+ var ql = ({ metadata: e, translationPrefix: t, className: n }) => {
12285
+ let { t: r } = te();
12286
+ if (!e) return null;
12287
+ let i = [
12297
12288
  {
12298
- label: i(`${n}.fps`),
12299
- value: t.fps == null ? null : String(t.fps)
12289
+ label: r(`${t}.fps`),
12290
+ value: e.fps == null ? null : String(e.fps)
12300
12291
  },
12301
12292
  {
12302
- label: i(`${n}.resolution`),
12303
- value: Gl(t)
12293
+ label: r(`${t}.resolution`),
12294
+ value: Gl(e)
12304
12295
  },
12305
12296
  {
12306
- label: i(`${n}.codec`),
12307
- value: t.codec
12297
+ label: r(`${t}.codec`),
12298
+ value: e.codec
12308
12299
  },
12309
12300
  {
12310
- label: i(`${n}.pixelFormat`),
12311
- value: t.pixelFormat
12301
+ label: r(`${t}.pixelFormat`),
12302
+ value: e.pixelFormat
12312
12303
  },
12313
12304
  {
12314
- label: i(`${n}.channels`),
12315
- value: t.channels == null ? null : String(t.channels)
12305
+ label: r(`${t}.channels`),
12306
+ value: e.channels == null ? null : String(e.channels)
12316
12307
  },
12317
12308
  {
12318
- label: i(`${n}.hasAudio`),
12319
- value: t.hasAudio == null ? null : t.hasAudio ? i(`${n}.yes`) : i(`${n}.no`)
12309
+ label: r(`${t}.hasAudio`),
12310
+ value: e.hasAudio == null ? null : e.hasAudio ? r(`${t}.yes`) : r(`${t}.no`)
12320
12311
  },
12321
12312
  {
12322
- label: i(`${n}.clipRange`),
12323
- value: Kl(t)
12313
+ label: r(`${t}.clipRange`),
12314
+ value: Kl(e)
12324
12315
  }
12325
12316
  ].filter((e) => e.value);
12326
- return /* @__PURE__ */ q("div", {
12327
- "aria-hidden": "true",
12328
- className: F("pointer-events-none absolute left-2 top-2 z-10 flex max-w-[calc(100%-1rem)] items-center gap-2 overflow-hidden whitespace-nowrap rounded-md border border-white/10 bg-black/70 px-2 py-1 text-[10px] text-white opacity-0 shadow-lg backdrop-blur-sm transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100", r),
12329
- children: [/* @__PURE__ */ K("p", {
12330
- className: "shrink-0 font-semibold uppercase tracking-[0.12em] text-white/70",
12331
- children: i(`${n}.title`)
12332
- }), /* @__PURE__ */ K("dl", {
12333
- className: "flex min-w-0 items-center gap-2 overflow-hidden border-l border-white/15 pl-2",
12334
- children: a.map((e) => /* @__PURE__ */ q("div", {
12335
- className: F("flex shrink-0 items-baseline gap-1", e.breakAll && "min-w-0 shrink"),
12317
+ return i.length === 0 ? null : /* @__PURE__ */ K("div", {
12318
+ className: F("absolute left-2 top-2 z-10 max-h-[50%] max-w-[min(16rem,calc(100%-1rem))] overflow-y-auto rounded-md border border-white/10 bg-black/70 px-2.5 py-2 text-[11px] text-white opacity-0 shadow-lg backdrop-blur-sm transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100", n),
12319
+ children: /* @__PURE__ */ K("dl", {
12320
+ className: "flex flex-col gap-1",
12321
+ children: i.map((e) => /* @__PURE__ */ q("div", {
12322
+ className: "grid grid-cols-[auto_1fr] items-baseline gap-x-3 gap-y-0",
12336
12323
  children: [/* @__PURE__ */ K("dt", {
12337
- className: "shrink-0 text-white/60",
12324
+ className: "shrink-0 text-white/55",
12338
12325
  children: e.label
12339
12326
  }), /* @__PURE__ */ K("dd", {
12340
- className: F("font-mono tabular-nums", e.breakAll && "min-w-0 max-w-48 truncate"),
12327
+ className: "min-w-0 break-all text-right font-mono tabular-nums text-white/95",
12341
12328
  children: e.value
12342
12329
  })]
12343
12330
  }, e.label))
12344
- })]
12331
+ })
12345
12332
  });
12346
12333
  }, Jl = ({ params: e }) => {
12347
12334
  let { t } = te(), { info: n, dataLoader: r, imageService: i, subscribeFrameIndex: a } = se(), { selectedEpisodeIndex: o } = P(), s = W(() => e?.featureKey ? e.featureKey : M(n) || "observation.images.cam_high", [e?.featureKey, n]), [c, l] = Se(!1), [u, d] = Se(null), [f, p] = Se(!1), [m, h] = Se(null), g = G(null), _ = G(!0), v = G(o), y = G(s), b = G(r), x = G(i), S = G(n), C = G(0), w = G(!1), T = G(null), E = G(!1);
@@ -12437,7 +12424,6 @@ var ql = ({ featureKey: e, metadata: t, translationPrefix: n, className: r }) =>
12437
12424
  className: "group relative flex h-full w-full items-center justify-center overflow-hidden bg-black",
12438
12425
  children: [
12439
12426
  /* @__PURE__ */ K(ql, {
12440
- featureKey: s,
12441
12427
  metadata: ee,
12442
12428
  translationPrefix: "panels.image.debug"
12443
12429
  }),
@@ -12612,7 +12598,6 @@ var ql = ({ featureKey: e, metadata: t, translationPrefix: n, className: r }) =>
12612
12598
  className: "group relative flex h-full w-full items-center justify-center overflow-hidden bg-black",
12613
12599
  children: [
12614
12600
  /* @__PURE__ */ K(ql, {
12615
- featureKey: E,
12616
12601
  metadata: D,
12617
12602
  translationPrefix: "panels.video.debug"
12618
12603
  }),
@@ -16087,9 +16072,9 @@ var Ph = ({ params: e }) => {
16087
16072
  children: t("chart.split.open")
16088
16073
  })]
16089
16074
  })]
16090
- }), /* @__PURE__ */ q("div", {
16075
+ }), /* @__PURE__ */ K("div", {
16091
16076
  className: "flex gap-2 shrink-0 items-center",
16092
- children: [(_e || z) && /* @__PURE__ */ q(we, { children: [_e && /* @__PURE__ */ q("div", {
16077
+ children: (_e || z) && /* @__PURE__ */ q(we, { children: [_e && /* @__PURE__ */ q("div", {
16093
16078
  className: "group relative flex items-center gap-1.5 text-[10px] font-medium text-muted-foreground tracking-tight px-1.5 py-0.5 rounded hover:bg-muted/30 transition-colors cursor-pointer",
16094
16079
  onClick: (e) => {
16095
16080
  e.stopPropagation(), de(!ue);
@@ -16162,17 +16147,7 @@ var Ph = ({ params: e }) => {
16162
16147
  children: t("chart.legend.stateAbbr")
16163
16148
  })
16164
16149
  ]
16165
- })] }), Ee?.meta?.simplified && /* @__PURE__ */ K("div", {
16166
- className: "flex items-center ml-2",
16167
- children: /* @__PURE__ */ K("span", {
16168
- className: "text-[9px] font-mono text-muted-foreground/60 bg-muted/40 px-1.5 py-0.5 rounded border border-border/50",
16169
- children: t("chart.sampling.enabled", {
16170
- originalPoints: Ee.meta.originalPoints,
16171
- displayedPoints: Ee.meta.displayedPoints,
16172
- stride: Ee.meta.stride
16173
- })
16174
- })
16175
- })]
16150
+ })] })
16176
16151
  })]
16177
16152
  }),
16178
16153
  /* @__PURE__ */ q("div", {
@@ -101,8 +101,10 @@
101
101
  --color-amber-500: oklch(76.9% .188 70.08);
102
102
  --color-amber-600: oklch(66.6% .179 58.318);
103
103
  --color-amber-700: oklch(55.5% .163 48.998);
104
+ --color-green-400: oklch(79.2% .209 151.711);
104
105
  --color-green-500: oklch(72.3% .219 149.579);
105
106
  --color-green-600: oklch(62.7% .194 149.214);
107
+ --color-green-700: oklch(52.7% .154 150.069);
106
108
  --color-emerald-400: oklch(76.5% .177 163.223);
107
109
  --color-emerald-600: oklch(59.6% .145 163.225);
108
110
  --color-sky-100: oklch(95.1% .026 236.824);
@@ -124,7 +126,6 @@
124
126
  --container-lg: 32rem;
125
127
  --container-xl: 36rem;
126
128
  --container-2xl: 42rem;
127
- --container-5xl: 64rem;
128
129
  --container-6xl: 72rem;
129
130
  --text-xs: .75rem;
130
131
  --text-xs--line-height: calc(1 / .75);
@@ -1001,6 +1002,10 @@
1001
1002
  max-height: 38vh;
1002
1003
  }
1003
1004
 
1005
+ .lerobot-root .max-h-\[50\%\] {
1006
+ max-height: 50%;
1007
+ }
1008
+
1004
1009
  .lerobot-root .max-h-\[60vh\] {
1005
1010
  max-height: 60vh;
1006
1011
  }
@@ -1117,6 +1122,10 @@
1117
1122
  width: calc(var(--spacing) * 80);
1118
1123
  }
1119
1124
 
1125
+ .lerobot-root .w-\[80vw\] {
1126
+ width: 80vw;
1127
+ }
1128
+
1120
1129
  .lerobot-root .w-\[640px\] {
1121
1130
  width: 640px;
1122
1131
  }
@@ -1133,22 +1142,22 @@
1133
1142
  max-width: var(--container-2xl);
1134
1143
  }
1135
1144
 
1136
- .lerobot-root .max-w-5xl {
1137
- max-width: var(--container-5xl);
1138
- }
1139
-
1140
1145
  .lerobot-root .max-w-6xl {
1141
1146
  max-width: var(--container-6xl);
1142
1147
  }
1143
1148
 
1144
- .lerobot-root .max-w-48 {
1145
- max-width: calc(var(--spacing) * 48);
1149
+ .lerobot-root .max-w-\[40vw\] {
1150
+ max-width: 40vw;
1146
1151
  }
1147
1152
 
1148
1153
  .lerobot-root .max-w-\[55\%\] {
1149
1154
  max-width: 55%;
1150
1155
  }
1151
1156
 
1157
+ .lerobot-root .max-w-\[80vw\] {
1158
+ max-width: 80vw;
1159
+ }
1160
+
1152
1161
  .lerobot-root .max-w-\[90vw\] {
1153
1162
  max-width: 90vw;
1154
1163
  }
@@ -1173,14 +1182,14 @@
1173
1182
  max-width: 420px;
1174
1183
  }
1175
1184
 
1176
- .lerobot-root .max-w-\[calc\(100\%-1rem\)\] {
1177
- max-width: calc(100% - 1rem);
1178
- }
1179
-
1180
1185
  .lerobot-root .max-w-\[calc\(100\%-2rem\)\] {
1181
1186
  max-width: calc(100% - 2rem);
1182
1187
  }
1183
1188
 
1189
+ .lerobot-root .max-w-\[min\(16rem\,calc\(100\%-1rem\)\)\] {
1190
+ max-width: min(16rem, 100% - 1rem);
1191
+ }
1192
+
1184
1193
  .lerobot-root .max-w-\[min\(100\%\,280px\)\] {
1185
1194
  max-width: min(100%, 280px);
1186
1195
  }
@@ -1358,6 +1367,10 @@
1358
1367
  grid-template-columns: repeat(3, minmax(0, 1fr));
1359
1368
  }
1360
1369
 
1370
+ .lerobot-root .grid-cols-\[auto_1fr\] {
1371
+ grid-template-columns: auto 1fr;
1372
+ }
1373
+
1361
1374
  .lerobot-root .grid-rows-\[auto_auto\] {
1362
1375
  grid-template-rows: auto auto;
1363
1376
  }
@@ -1497,6 +1510,14 @@
1497
1510
  margin-block-end: calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)));
1498
1511
  }
1499
1512
 
1513
+ .lerobot-root .gap-x-3 {
1514
+ column-gap: calc(var(--spacing) * 3);
1515
+ }
1516
+
1517
+ .lerobot-root .gap-y-0 {
1518
+ row-gap: 0;
1519
+ }
1520
+
1500
1521
  .lerobot-root .self-center {
1501
1522
  align-self: center;
1502
1523
  }
@@ -1733,16 +1754,6 @@
1733
1754
  }
1734
1755
  }
1735
1756
 
1736
- .lerobot-root .border-white\/15 {
1737
- border-color: #ffffff26;
1738
- }
1739
-
1740
- @supports (color: color-mix(in lab, red, red)) {
1741
- .lerobot-root .border-white\/15 {
1742
- border-color: color-mix(in oklab, var(--color-white) 15%, transparent);
1743
- }
1744
- }
1745
-
1746
1757
  .lerobot-root .border-t-transparent {
1747
1758
  border-top-color: #0000;
1748
1759
  }
@@ -2175,10 +2186,6 @@
2175
2186
  padding-bottom: calc(var(--spacing) * 4);
2176
2187
  }
2177
2188
 
2178
- .lerobot-root .pl-2 {
2179
- padding-left: calc(var(--spacing) * 2);
2180
- }
2181
-
2182
2189
  .lerobot-root .pl-4 {
2183
2190
  padding-left: calc(var(--spacing) * 4);
2184
2191
  }
@@ -2320,11 +2327,6 @@
2320
2327
  font-weight: var(--font-weight-semibold);
2321
2328
  }
2322
2329
 
2323
- .lerobot-root .tracking-\[0\.12em\] {
2324
- --tw-tracking: .12em;
2325
- letter-spacing: .12em;
2326
- }
2327
-
2328
2330
  .lerobot-root .tracking-tight {
2329
2331
  --tw-tracking: var(--tracking-tight);
2330
2332
  letter-spacing: var(--tracking-tight);
@@ -2463,6 +2465,10 @@
2463
2465
  color: var(--color-green-600);
2464
2466
  }
2465
2467
 
2468
+ .lerobot-root .text-green-700 {
2469
+ color: var(--color-green-700);
2470
+ }
2471
+
2466
2472
  .lerobot-root .text-muted-foreground, .lerobot-root .text-muted-foreground\/30 {
2467
2473
  color: var(--muted-foreground);
2468
2474
  }
@@ -2539,23 +2545,23 @@
2539
2545
  color: var(--color-white);
2540
2546
  }
2541
2547
 
2542
- .lerobot-root .text-white\/60 {
2543
- color: #fff9;
2548
+ .lerobot-root .text-white\/55 {
2549
+ color: #ffffff8c;
2544
2550
  }
2545
2551
 
2546
2552
  @supports (color: color-mix(in lab, red, red)) {
2547
- .lerobot-root .text-white\/60 {
2548
- color: color-mix(in oklab, var(--color-white) 60%, transparent);
2553
+ .lerobot-root .text-white\/55 {
2554
+ color: color-mix(in oklab, var(--color-white) 55%, transparent);
2549
2555
  }
2550
2556
  }
2551
2557
 
2552
- .lerobot-root .text-white\/70 {
2553
- color: #ffffffb3;
2558
+ .lerobot-root .text-white\/95 {
2559
+ color: #fffffff2;
2554
2560
  }
2555
2561
 
2556
2562
  @supports (color: color-mix(in lab, red, red)) {
2557
- .lerobot-root .text-white\/70 {
2558
- color: color-mix(in oklab, var(--color-white) 70%, transparent);
2563
+ .lerobot-root .text-white\/95 {
2564
+ color: color-mix(in oklab, var(--color-white) 95%, transparent);
2559
2565
  }
2560
2566
  }
2561
2567
 
@@ -3218,7 +3224,7 @@
3218
3224
  }
3219
3225
  }
3220
3226
 
3221
- .lerobot-root .focus-visible\:ring-ring\/50:focus-visible {
3227
+ .lerobot-root .focus-visible\:ring-ring:focus-visible, .lerobot-root .focus-visible\:ring-ring\/50:focus-visible {
3222
3228
  --tw-ring-color: var(--ring);
3223
3229
  }
3224
3230
 
@@ -3238,6 +3244,11 @@
3238
3244
  }
3239
3245
  }
3240
3246
 
3247
+ .lerobot-root .focus-visible\:ring-offset-2:focus-visible {
3248
+ --tw-ring-offset-width: 2px;
3249
+ --tw-ring-offset-shadow: var(--tw-ring-inset, ) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
3250
+ }
3251
+
3241
3252
  .lerobot-root .focus-visible\:outline-hidden:focus-visible {
3242
3253
  --tw-outline-style: none;
3243
3254
  outline-style: none;
@@ -3562,6 +3573,10 @@
3562
3573
  display: inline;
3563
3574
  }
3564
3575
 
3576
+ .lerobot-root .sm\:max-w-\[80vw\] {
3577
+ max-width: 80vw;
3578
+ }
3579
+
3565
3580
  .lerobot-root .sm\:max-w-\[90vw\] {
3566
3581
  max-width: 90vw;
3567
3582
  }
@@ -3704,6 +3719,10 @@
3704
3719
  color: var(--color-emerald-400);
3705
3720
  }
3706
3721
 
3722
+ .lerobot-root .dark\:text-green-400:is(.dark *) {
3723
+ color: var(--color-green-400);
3724
+ }
3725
+
3707
3726
  .lerobot-root .dark\:text-green-500:is(.dark *) {
3708
3727
  color: var(--color-green-500);
3709
3728
  }
@@ -1,4 +1,4 @@
1
- import { A as e, B as t, C as n, D as r, E as i, F as a, G as o, H as s, K as c, M as l, N as u, O as d, P as f, S as p, T as m, U as h, V as g, W as _, _ as v, a as y, b, c as x, ft as S, g as C, gt as w, h as T, ht as E, i as D, j as O, k as ee, l as te, lt as ne, m as k, mt as A, n as re, o as j, p as ie, pt as M, r as ae, s as N, st as oe, t as se, v as ce, w as P, x as F, y as I } from "./react-window-tHOzYrJa.js";
1
+ import { A as e, B as t, C as n, D as r, E as i, F as a, G as o, H as s, K as c, M as l, N as u, O as d, P as f, S as p, T as m, U as h, V as g, W as _, _ as v, a as y, b, c as x, ft as S, g as C, gt as w, h as T, ht as E, i as D, j as O, k as ee, l as te, lt as ne, m as k, mt as A, n as re, o as j, p as ie, pt as M, r as ae, s as N, st as oe, t as se, v as ce, w as P, x as F, y as I } from "./react-window-CGTfzj0C.js";
2
2
  import { r as L, t as le } from "./workerManager-D6ovn2ln.js";
3
3
  import * as ue from "react";
4
4
  import R, { Suspense as de, createContext as fe, memo as pe, useCallback as z, useContext as me, useEffect as B, useMemo as V, useRef as H, useState as U } from "react";
@@ -7026,7 +7026,7 @@ var Kl = () => {
7026
7026
  })
7027
7027
  ]
7028
7028
  });
7029
- }, Jl = R.lazy(async () => ({ default: (await import("./DockviewLayout-Bf0kd_q_.js")).DockviewLayout }));
7029
+ }, Jl = R.lazy(async () => ({ default: (await import("./DockviewLayout-0MP_kiQC.js")).DockviewLayout }));
7030
7030
  function Yl({ showSidebar: e = !0, showPlaybackBar: t = !0, className: n, sidebar: r, emptyState: i, sidebarHeader: a, showToaster: o = !0, onRetry: s }) {
7031
7031
  let { t: c } = E(), { episodes: l, info: u, clearError: d, error: f } = N(), { tasks: p } = ol(), m = u !== null && l.length > 0, h = m && e && !!r, g = p.find((e) => e.phase !== "ready" && e.phase !== "idle" && e.phase !== "error"), _ = p.find((e) => e.phase === "error"), v = s ?? (() => {
7032
7032
  d();
@@ -3047,6 +3047,9 @@ var hn = {
3047
3047
  errorsCount: "{{count}} 个错误",
3048
3048
  warningsCount: "{{count}} 个警告",
3049
3049
  passedCount: "{{count}} 项通过",
3050
+ filterErrors: "仅显示 {{count}} 个错误",
3051
+ filterWarnings: "仅显示 {{count}} 个警告",
3052
+ filterPassed: "仅显示 {{count}} 项通过检查",
3050
3053
  close: "关闭",
3051
3054
  retry: "重试",
3052
3055
  export: "导出",
@@ -3399,10 +3402,6 @@ var hn = {
3399
3402
  title: "视频面板",
3400
3403
  placeholder: "等待加载视频文件...",
3401
3404
  debug: {
3402
- title: "媒体调试信息",
3403
- feature: "Feature",
3404
- dtype: "类型",
3405
- shape: "Shape",
3406
3405
  fps: "FPS",
3407
3406
  resolution: "分辨率",
3408
3407
  codec: "编码",
@@ -3418,10 +3417,6 @@ var hn = {
3418
3417
  title: "图像面板",
3419
3418
  placeholder: "等待加载图像文件...",
3420
3419
  debug: {
3421
- title: "媒体调试信息",
3422
- feature: "Feature",
3423
- dtype: "类型",
3424
- shape: "Shape",
3425
3420
  fps: "FPS",
3426
3421
  resolution: "分辨率",
3427
3422
  codec: "编码",
@@ -3783,6 +3778,9 @@ var hn = {
3783
3778
  errorsCount: "{{count}} error(s)",
3784
3779
  warningsCount: "{{count}} warning(s)",
3785
3780
  passedCount: "{{count}} passed",
3781
+ filterErrors: "Show only {{count}} error(s)",
3782
+ filterWarnings: "Show only {{count}} warning(s)",
3783
+ filterPassed: "Show only {{count}} passed check(s)",
3786
3784
  close: "Close",
3787
3785
  retry: "Retry",
3788
3786
  export: "Export",
@@ -4135,10 +4133,6 @@ var hn = {
4135
4133
  title: "Video Panel",
4136
4134
  placeholder: "Waiting for video file...",
4137
4135
  debug: {
4138
- title: "Media debug",
4139
- feature: "Feature",
4140
- dtype: "DType",
4141
- shape: "Shape",
4142
4136
  fps: "FPS",
4143
4137
  resolution: "Resolution",
4144
4138
  codec: "Codec",
@@ -4154,10 +4148,6 @@ var hn = {
4154
4148
  title: "Image Panel",
4155
4149
  placeholder: "Waiting for image file...",
4156
4150
  debug: {
4157
- title: "Media debug",
4158
- feature: "Feature",
4159
- dtype: "DType",
4160
- shape: "Shape",
4161
4151
  fps: "FPS",
4162
4152
  resolution: "Resolution",
4163
4153
  codec: "Codec",
@@ -4491,7 +4481,7 @@ var hn = {
4491
4481
  },
4492
4482
  speed: "再生速度"
4493
4483
  },
4494
- health: /* @__PURE__ */ JSON.parse("{\"noData\":\"データセットを読み込むとヘルスチェックを表示します\",\"statusErrors\":\"検証でエラーを検出\",\"statusWarnings\":\"検証で警告を検出\",\"statusOk\":\"フォーマットチェック完了\",\"checks\":\"チェック項目\",\"noIssues\":\"問題はありません\",\"fpsInvalid\":\"info.fps が未設定または ≤ 0 です。再生が不正になる可能性があります。\",\"zeroLengthEpisodes\":\"{{count}} 件のエピソードの長さが 0 です\",\"episodeCountMismatch\":\"有効エピソード数({{effective}})が info.total_episodes({{total}})と一致しません。編集/削除を反映しました。\",\"footnote\":\"フォーマット検証は読み込み時に実行されます。データ品質(NaN/外れ値)は今後のバージョンで対応予定です。\",\"healthCheckButton\":\"データセットヘルスチェック\",\"check\":\"チェック\",\"validation\":{\"columns\":{\"field\":\"チェック項目\",\"current\":\"現在\",\"expected\":\"期待値\",\"suggestion\":\"推奨対応\"},\"dialog\":{\"title\":\"データセット品質レポート\",\"summaryErrors\":\"検証でエラーを検出\",\"summaryWarnings\":\"検証で警告を検出\",\"summaryOk\":\"すべてのチェックを通過\",\"errorsCount\":\"エラー {{count}} 件\",\"warningsCount\":\"警告 {{count}} 件\",\"passedCount\":\"{{count}} 件通過\",\"close\":\"閉じる\",\"retry\":\"再試行\",\"export\":\"エクスポート\",\"exportCsv\":\"CSV でエクスポート\",\"exportPdf\":\"PDF でエクスポート\"},\"categories\":{\"file_structure\":\"ファイル構造\",\"meta_info\":\"メタデータ\",\"features\":\"特徴量\",\"episodes\":\"エピソード\"},\"terms\":{\"exists\":\"存在する\",\"missing\":\"欠損\",\"notExists\":\"見つかりません\",\"invalidJson\":\"無効な JSON\",\"validJson\":\"有効な JSON ファイル\",\"positiveInteger\":\"正の整数\",\"nonNegativeInteger\":\"0 以上の整数\",\"positiveNumber\":\"正の数\",\"nonEmptyString\":\"空でない文字列\",\"present\":\"存在\",\"unknown\":\"不明\",\"validDtype\":\"有効な dtype\",\"object\":\"オブジェクト\",\"arrayOrNull\":\"配列または null\",\"nFeatures\":\"{{count}} 特徴量\",\"pathOrFileExists\":\"パスまたはファイルが存在\",\"fieldExists\":\"フィールドが存在\",\"positiveIntArray\":\"[正の整数, ...]\",\"stringArrayMatchShape\":\"string[](長さ = shape の最終次元)\",\"objectWithFeatures\":\"1 つ以上の feature を持つオブジェクト\",\"positiveIntMatchTotalEpisodes\":\"正の整数、total_episodes と一致\",\"episodeLengthPositive\":\"各エピソードの length > 0\",\"nonNegativeIntCount\":\"0 以上の整数(件数)\",\"requiredParquetColumns\":\"frame_index, episode_index, index, timestamp など\",\"objectWithTrainKey\":\"\\\"train\\\" キーを持つオブジェクト\",\"containsTrain\":\"\\\"train\\\" を含む\",\"requiredEpisodesColumns\":\"episode_index, length, dataset_from_index, dataset_to_index\",\"tasksPresent\":\"tasks.jsonl または tasks.parquet が存在\"},\"codes\":{\"INFO_MISSING\":{\"message\":\"meta/info.json が存在しないか読み取れません\",\"suggestion\":\"LeRobot データセットルートに meta/info.json があることを確認してください\"},\"INFO_PARSE_ERROR\":{\"message\":\"meta/info.json の JSON 解析に失敗しました\",\"suggestion\":\"JSON 構文を確認してください(例: https://jsonlint.com)\"},\"VERSION_MISMATCH\":{\"message\":\"codebase_version が v2.x ではありません\",\"suggestion\":\"v3.0 の場合は対応ローダーを使用するか、codebase_version を v2.0 または v2.1 に設定してください\"},\"VERSION_MISMATCH_V3\":{\"message\":\"codebase_version が v3.x ではありません\",\"suggestion\":\"codebase_version を v3.0 に設定してください\"},\"ROBOT_TYPE_MISSING\":{\"message\":\"robot_type が未設定または空です\",\"suggestion\":\"ロボットタイプを設定してください(例: \\\"so100\\\", \\\"lekiwi\\\")\"},\"TOTAL_EPISODES_INVALID\":{\"message\":\"total_episodes は正の整数である必要があります\",\"suggestion\":\"正しいエピソード総数を設定してください\"},\"TOTAL_FRAMES_INVALID\":{\"message\":\"total_frames は正の整数である必要があります\",\"suggestion\":\"正しいフレーム総数を設定してください\"},\"TOTAL_TASKS_INVALID\":{\"message\":\"total_tasks は 0 以上の整数である必要があります\",\"suggestion\":\"正しいタスク総数を設定してください(0 可)\"},\"FPS_INVALID\":{\"message\":\"fps は正の数である必要があります\",\"suggestion\":\"正しい FPS を設定してください(例: 30)\"},\"CHUNKS_SIZE_MISSING\":{\"message\":\"chunks_size が未設定です。デフォルト 1000 を使用します\",\"suggestion\":\"chunks_size フィールドを追加してください(推奨: 1000)\"},\"FEATURES_EMPTY\":{\"message\":\"features が未設定または空です\",\"suggestion\":\"info.json の features にデータセットの全カラムを定義してください\"},\"EPISODES_MISSING\":{\"message\":\"meta/episodes.jsonl が存在しないか読み取れません\",\"suggestion\":\"1 行 1 エピソードの JSON で meta/episodes.jsonl を作成してください\"},\"EPISODES_INVALID_JSONL\":{\"message\":\"episodes.jsonl の行の JSON 解析に失敗しました\",\"suggestion\":\"各行が有効な JSON オブジェクトであることを確認してください\"},\"EPISODES_EMPTY\":{\"message\":\"episodes.jsonl は空です\",\"suggestion\":\"episodes.jsonl にデータがあることを確認してください\"},\"EPISODES_COUNT_MISMATCH\":{\"message\":\"解析したエピソード数({{parsed}})が total_episodes({{expected}})と一致しません\",\"suggestion\":\"episodes.jsonl を再生成するか info.json の total_episodes を修正してください\"},\"ZERO_LENGTH_EPISODES\":{\"message\":\"{{count}} 件のエピソードの長さが 0 です\",\"suggestion\":\"各エピソードが正のフレーム数を持つよう episodes.jsonl を再生成してください\"},\"EPISODES_NO_LENGTH\":{\"message\":\"{{count}} 件のエピソードに length/num_frames がありません\",\"suggestion\":\"episodes.jsonl の各行に \\\"length\\\" を追加してください\"},\"TASKS_MISSING\":{\"message\":\"meta/tasks.jsonl が存在しないか空です\",\"suggestion\":\"1 行 1 JSON で tasks.jsonl を作成: {\\\"task_index\\\": 0, \\\"task\\\": \\\"説明\\\"}\"},\"DATA_FILE_MISSING\":{\"message\":\"データファイルが存在しません\",\"suggestion\":\"v2 形式で data/ に Parquet ファイルを生成してください\"},\"DATA_FILE_CHECK_FAILED\":{\"message\":\"データファイルの存在を確認できませんでした\",\"suggestion\":\"data/chunk-xxx/episode_xxxxxx.parquet が存在することを確認してください\"},\"VIDEO_FILE_MISSING\":{\"message\":\"動画ファイルが存在しません\",\"suggestion\":\"videos/chunk-xxx/<key>/episode_xxxxxx.mp4 を生成してください\"},\"VIDEO_FILE_CHECK_FAILED\":{\"message\":\"動画ファイルの存在を確認できませんでした\",\"suggestion\":\"videos/chunk-xxx/<key>/episode_xxxxxx.mp4 が存在することを確認してください\"},\"PARQUET_MISSING_COLS\":{\"message\":\"データ Parquet に必須カラムがありません: {{cols}}\",\"suggestion\":\"システムカラムを含むデータ Parquet を再生成してください\"},\"DEFAULT_FEATURE_MISSING\":{\"message\":\"システムフィールド {{key}} がありません\",\"suggestion\":\"meta/info.json の features に \\\"{{key}}\\\" を追加してください\"},\"FEATURE_INVALID\":{\"message\":\"features.{{key}} は有効なオブジェクトではありません\",\"suggestion\":\"各 feature が dtype と shape を持つオブジェクトであることを確認してください\"},\"DTYPE_MISSING\":{\"message\":\"features.{{key}}.dtype がありません\",\"suggestion\":\"dtype を追加してください(例: float32, int64, video, image, string)\"},\"DTYPE_INVALID\":{\"message\":\"features.{{key}}.dtype が無効です: {{dtype}}\",\"suggestion\":\"標準の dtype を使用してください\"},\"SHAPE_INVALID\":{\"message\":\"features.{{key}}.shape は正の整数の非空配列である必要があります\",\"suggestion\":\"shape を設定してください(例: [7], [3, 480, 640])\"},\"NAMES_INVALID\":{\"message\":\"features.{{key}}.names は配列ではありません\",\"suggestion\":\"names を文字列配列または null に設定してください\"},\"NAMES_LENGTH_MISMATCH\":{\"message\":\"features.{{key}}.names の長さ({{actual}})が shape の最終次元({{expected}})と一致しません\",\"suggestion\":\"names の長さを shape の最終次元と一致させてください\"},\"VIDEO_FPS_MISSING\":{\"message\":\"動画 feature {{key}} の fps が未設定または ≤0 です。info.fps を使用します\",\"suggestion\":\"オプション: この feature に fps を設定。未設定の場合は info.fps を使用\"},\"VIDEO_SHAPE_CHANNELS\":{\"message\":\"動画の shape チャンネル数が一般的ではありません\",\"suggestion\":\"通常は 3(RGB)です。[C,H,W] と [H,W,C] の両方に対応\"},\"VIDEO_SHAPE_NDIM\":{\"message\":\"動画 shape は 3D (C, H, W) である必要があります。現在 {{n}}D です\",\"suggestion\":\"shape を [C, H, W] に設定してください\"},\"IMAGE_SHAPE_NDIM\":{\"message\":\"画像 shape は 3D (C, H, W) である必要があります。現在 {{n}}D です\",\"suggestion\":\"shape を [C, H, W] に設定してください\"},\"EPISODES_PARQUET_MISSING\":{\"message\":\"meta/episodes の最初のファイルが存在しません\",\"suggestion\":\"v3 形式で meta/episodes/chunk-xxx/file-xxx.parquet を生成してください\"},\"EPISODES_PARQUET_INVALID\":{\"message\":\"meta/episodes の最初のファイルを Parquet として解析できませんでした\",\"suggestion\":\"episodes Parquet ファイルが有効であることを確認してください\"},\"DATA_PATH_TEMPLATE\":{\"message\":\"info.data_path がデフォルトテンプレートと一致しません\",\"suggestion\":\"デフォルトの data パステンプレートを使用するか、カスタムパスを一貫させてください\"},\"VIDEO_PATH_TEMPLATE\":{\"message\":\"info.video_path がデフォルトテンプレートと一致しません\",\"suggestion\":\"デフォルトの動画パステンプレートを使用してください\"},\"TASKS_PRESENT\":{\"message\":\"タスクメタデータを検出しました\",\"suggestion\":\"\"},\"EPISODE_COUNT\":{\"message\":\"{{count}} 件のエピソードを解析しました\",\"suggestion\":\"\"},\"TASK_COUNT\":{\"message\":\"{{count}} 件のタスクを解析しました\",\"suggestion\":\"\"},\"SPLITS_MISSING_TRAIN\":{\"message\":\"splits に \\\"train\\\" が必要です\",\"suggestion\":\"splits に少なくとも \\\"train\\\" キーを追加してください\"}}}}"),
4484
+ health: /* @__PURE__ */ JSON.parse("{\"noData\":\"データセットを読み込むとヘルスチェックを表示します\",\"statusErrors\":\"検証でエラーを検出\",\"statusWarnings\":\"検証で警告を検出\",\"statusOk\":\"フォーマットチェック完了\",\"checks\":\"チェック項目\",\"noIssues\":\"問題はありません\",\"fpsInvalid\":\"info.fps が未設定または ≤ 0 です。再生が不正になる可能性があります。\",\"zeroLengthEpisodes\":\"{{count}} 件のエピソードの長さが 0 です\",\"episodeCountMismatch\":\"有効エピソード数({{effective}})が info.total_episodes({{total}})と一致しません。編集/削除を反映しました。\",\"footnote\":\"フォーマット検証は読み込み時に実行されます。データ品質(NaN/外れ値)は今後のバージョンで対応予定です。\",\"healthCheckButton\":\"データセットヘルスチェック\",\"check\":\"チェック\",\"validation\":{\"columns\":{\"field\":\"チェック項目\",\"current\":\"現在\",\"expected\":\"期待値\",\"suggestion\":\"推奨対応\"},\"dialog\":{\"title\":\"データセット品質レポート\",\"summaryErrors\":\"検証でエラーを検出\",\"summaryWarnings\":\"検証で警告を検出\",\"summaryOk\":\"すべてのチェックを通過\",\"errorsCount\":\"エラー {{count}} 件\",\"warningsCount\":\"警告 {{count}} 件\",\"passedCount\":\"{{count}} 件通過\",\"filterErrors\":\"エラー {{count}} 件のみを表示\",\"filterWarnings\":\"警告 {{count}} 件のみを表示\",\"filterPassed\":\"通過した {{count}} 件のみを表示\",\"close\":\"閉じる\",\"retry\":\"再試行\",\"export\":\"エクスポート\",\"exportCsv\":\"CSV でエクスポート\",\"exportPdf\":\"PDF でエクスポート\"},\"categories\":{\"file_structure\":\"ファイル構造\",\"meta_info\":\"メタデータ\",\"features\":\"特徴量\",\"episodes\":\"エピソード\"},\"terms\":{\"exists\":\"存在する\",\"missing\":\"欠損\",\"notExists\":\"見つかりません\",\"invalidJson\":\"無効な JSON\",\"validJson\":\"有効な JSON ファイル\",\"positiveInteger\":\"正の整数\",\"nonNegativeInteger\":\"0 以上の整数\",\"positiveNumber\":\"正の数\",\"nonEmptyString\":\"空でない文字列\",\"present\":\"存在\",\"unknown\":\"不明\",\"validDtype\":\"有効な dtype\",\"object\":\"オブジェクト\",\"arrayOrNull\":\"配列または null\",\"nFeatures\":\"{{count}} 特徴量\",\"pathOrFileExists\":\"パスまたはファイルが存在\",\"fieldExists\":\"フィールドが存在\",\"positiveIntArray\":\"[正の整数, ...]\",\"stringArrayMatchShape\":\"string[](長さ = shape の最終次元)\",\"objectWithFeatures\":\"1 つ以上の feature を持つオブジェクト\",\"positiveIntMatchTotalEpisodes\":\"正の整数、total_episodes と一致\",\"episodeLengthPositive\":\"各エピソードの length > 0\",\"nonNegativeIntCount\":\"0 以上の整数(件数)\",\"requiredParquetColumns\":\"frame_index, episode_index, index, timestamp など\",\"objectWithTrainKey\":\"\\\"train\\\" キーを持つオブジェクト\",\"containsTrain\":\"\\\"train\\\" を含む\",\"requiredEpisodesColumns\":\"episode_index, length, dataset_from_index, dataset_to_index\",\"tasksPresent\":\"tasks.jsonl または tasks.parquet が存在\"},\"codes\":{\"INFO_MISSING\":{\"message\":\"meta/info.json が存在しないか読み取れません\",\"suggestion\":\"LeRobot データセットルートに meta/info.json があることを確認してください\"},\"INFO_PARSE_ERROR\":{\"message\":\"meta/info.json の JSON 解析に失敗しました\",\"suggestion\":\"JSON 構文を確認してください(例: https://jsonlint.com)\"},\"VERSION_MISMATCH\":{\"message\":\"codebase_version が v2.x ではありません\",\"suggestion\":\"v3.0 の場合は対応ローダーを使用するか、codebase_version を v2.0 または v2.1 に設定してください\"},\"VERSION_MISMATCH_V3\":{\"message\":\"codebase_version が v3.x ではありません\",\"suggestion\":\"codebase_version を v3.0 に設定してください\"},\"ROBOT_TYPE_MISSING\":{\"message\":\"robot_type が未設定または空です\",\"suggestion\":\"ロボットタイプを設定してください(例: \\\"so100\\\", \\\"lekiwi\\\")\"},\"TOTAL_EPISODES_INVALID\":{\"message\":\"total_episodes は正の整数である必要があります\",\"suggestion\":\"正しいエピソード総数を設定してください\"},\"TOTAL_FRAMES_INVALID\":{\"message\":\"total_frames は正の整数である必要があります\",\"suggestion\":\"正しいフレーム総数を設定してください\"},\"TOTAL_TASKS_INVALID\":{\"message\":\"total_tasks は 0 以上の整数である必要があります\",\"suggestion\":\"正しいタスク総数を設定してください(0 可)\"},\"FPS_INVALID\":{\"message\":\"fps は正の数である必要があります\",\"suggestion\":\"正しい FPS を設定してください(例: 30)\"},\"CHUNKS_SIZE_MISSING\":{\"message\":\"chunks_size が未設定です。デフォルト 1000 を使用します\",\"suggestion\":\"chunks_size フィールドを追加してください(推奨: 1000)\"},\"FEATURES_EMPTY\":{\"message\":\"features が未設定または空です\",\"suggestion\":\"info.json の features にデータセットの全カラムを定義してください\"},\"EPISODES_MISSING\":{\"message\":\"meta/episodes.jsonl が存在しないか読み取れません\",\"suggestion\":\"1 行 1 エピソードの JSON で meta/episodes.jsonl を作成してください\"},\"EPISODES_INVALID_JSONL\":{\"message\":\"episodes.jsonl の行の JSON 解析に失敗しました\",\"suggestion\":\"各行が有効な JSON オブジェクトであることを確認してください\"},\"EPISODES_EMPTY\":{\"message\":\"episodes.jsonl は空です\",\"suggestion\":\"episodes.jsonl にデータがあることを確認してください\"},\"EPISODES_COUNT_MISMATCH\":{\"message\":\"解析したエピソード数({{parsed}})が total_episodes({{expected}})と一致しません\",\"suggestion\":\"episodes.jsonl を再生成するか info.json の total_episodes を修正してください\"},\"ZERO_LENGTH_EPISODES\":{\"message\":\"{{count}} 件のエピソードの長さが 0 です\",\"suggestion\":\"各エピソードが正のフレーム数を持つよう episodes.jsonl を再生成してください\"},\"EPISODES_NO_LENGTH\":{\"message\":\"{{count}} 件のエピソードに length/num_frames がありません\",\"suggestion\":\"episodes.jsonl の各行に \\\"length\\\" を追加してください\"},\"TASKS_MISSING\":{\"message\":\"meta/tasks.jsonl が存在しないか空です\",\"suggestion\":\"1 行 1 JSON で tasks.jsonl を作成: {\\\"task_index\\\": 0, \\\"task\\\": \\\"説明\\\"}\"},\"DATA_FILE_MISSING\":{\"message\":\"データファイルが存在しません\",\"suggestion\":\"v2 形式で data/ に Parquet ファイルを生成してください\"},\"DATA_FILE_CHECK_FAILED\":{\"message\":\"データファイルの存在を確認できませんでした\",\"suggestion\":\"data/chunk-xxx/episode_xxxxxx.parquet が存在することを確認してください\"},\"VIDEO_FILE_MISSING\":{\"message\":\"動画ファイルが存在しません\",\"suggestion\":\"videos/chunk-xxx/<key>/episode_xxxxxx.mp4 を生成してください\"},\"VIDEO_FILE_CHECK_FAILED\":{\"message\":\"動画ファイルの存在を確認できませんでした\",\"suggestion\":\"videos/chunk-xxx/<key>/episode_xxxxxx.mp4 が存在することを確認してください\"},\"PARQUET_MISSING_COLS\":{\"message\":\"データ Parquet に必須カラムがありません: {{cols}}\",\"suggestion\":\"システムカラムを含むデータ Parquet を再生成してください\"},\"DEFAULT_FEATURE_MISSING\":{\"message\":\"システムフィールド {{key}} がありません\",\"suggestion\":\"meta/info.json の features に \\\"{{key}}\\\" を追加してください\"},\"FEATURE_INVALID\":{\"message\":\"features.{{key}} は有効なオブジェクトではありません\",\"suggestion\":\"各 feature が dtype と shape を持つオブジェクトであることを確認してください\"},\"DTYPE_MISSING\":{\"message\":\"features.{{key}}.dtype がありません\",\"suggestion\":\"dtype を追加してください(例: float32, int64, video, image, string)\"},\"DTYPE_INVALID\":{\"message\":\"features.{{key}}.dtype が無効です: {{dtype}}\",\"suggestion\":\"標準の dtype を使用してください\"},\"SHAPE_INVALID\":{\"message\":\"features.{{key}}.shape は正の整数の非空配列である必要があります\",\"suggestion\":\"shape を設定してください(例: [7], [3, 480, 640])\"},\"NAMES_INVALID\":{\"message\":\"features.{{key}}.names は配列ではありません\",\"suggestion\":\"names を文字列配列または null に設定してください\"},\"NAMES_LENGTH_MISMATCH\":{\"message\":\"features.{{key}}.names の長さ({{actual}})が shape の最終次元({{expected}})と一致しません\",\"suggestion\":\"names の長さを shape の最終次元と一致させてください\"},\"VIDEO_FPS_MISSING\":{\"message\":\"動画 feature {{key}} の fps が未設定または ≤0 です。info.fps を使用します\",\"suggestion\":\"オプション: この feature に fps を設定。未設定の場合は info.fps を使用\"},\"VIDEO_SHAPE_CHANNELS\":{\"message\":\"動画の shape チャンネル数が一般的ではありません\",\"suggestion\":\"通常は 3(RGB)です。[C,H,W] と [H,W,C] の両方に対応\"},\"VIDEO_SHAPE_NDIM\":{\"message\":\"動画 shape は 3D (C, H, W) である必要があります。現在 {{n}}D です\",\"suggestion\":\"shape を [C, H, W] に設定してください\"},\"IMAGE_SHAPE_NDIM\":{\"message\":\"画像 shape は 3D (C, H, W) である必要があります。現在 {{n}}D です\",\"suggestion\":\"shape を [C, H, W] に設定してください\"},\"EPISODES_PARQUET_MISSING\":{\"message\":\"meta/episodes の最初のファイルが存在しません\",\"suggestion\":\"v3 形式で meta/episodes/chunk-xxx/file-xxx.parquet を生成してください\"},\"EPISODES_PARQUET_INVALID\":{\"message\":\"meta/episodes の最初のファイルを Parquet として解析できませんでした\",\"suggestion\":\"episodes Parquet ファイルが有効であることを確認してください\"},\"DATA_PATH_TEMPLATE\":{\"message\":\"info.data_path がデフォルトテンプレートと一致しません\",\"suggestion\":\"デフォルトの data パステンプレートを使用するか、カスタムパスを一貫させてください\"},\"VIDEO_PATH_TEMPLATE\":{\"message\":\"info.video_path がデフォルトテンプレートと一致しません\",\"suggestion\":\"デフォルトの動画パステンプレートを使用してください\"},\"TASKS_PRESENT\":{\"message\":\"タスクメタデータを検出しました\",\"suggestion\":\"\"},\"EPISODE_COUNT\":{\"message\":\"{{count}} 件のエピソードを解析しました\",\"suggestion\":\"\"},\"TASK_COUNT\":{\"message\":\"{{count}} 件のタスクを解析しました\",\"suggestion\":\"\"},\"SPLITS_MISSING_TRAIN\":{\"message\":\"splits に \\\"train\\\" が必要です\",\"suggestion\":\"splits に少なくとも \\\"train\\\" キーを追加してください\"}}}}"),
4495
4485
  summary: {
4496
4486
  noData: "データセットを読み込むと概要を表示します",
4497
4487
  overview: "概要",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ioai/lerobot-studio",
3
3
  "private": false,
4
- "version": "1.0.0",
4
+ "version": "1.0.1",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.7.0",
7
7
  "scripts": {