@ioai/lerobot-studio 1.1.0 → 1.2.0

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.
@@ -0,0 +1,436 @@
1
+ //#region src/core/subtask/types.ts
2
+ var e = ["subtask_index", "metadata.subtask_index"], t = ["metadata.subtask_label", "subtask"], n = "meta/subtasks.parquet", r = [
3
+ "subtask",
4
+ "__index_level_0__",
5
+ "subtasks",
6
+ "name"
7
+ ];
8
+ function i(e) {
9
+ return e?.status === "supported" && e.adapterVersion === "v3.0";
10
+ }
11
+ function a(t) {
12
+ return t ? e.find((e) => t[e] != null) ?? null : null;
13
+ }
14
+ function o(e) {
15
+ return e ? t.find((t) => e[t] != null) ?? null : null;
16
+ }
17
+ function s(e) {
18
+ return a(e) != null;
19
+ }
20
+ //#endregion
21
+ //#region src/core/subtask/subtaskPlan.ts
22
+ function c(e) {
23
+ return e == null ? "" : String(e).trim();
24
+ }
25
+ function l(e) {
26
+ if (e == null) return null;
27
+ let t = Number(e);
28
+ return !Number.isSafeInteger(t) || t < 0 ? null : t;
29
+ }
30
+ function u(e) {
31
+ return `Subtask ${e}`;
32
+ }
33
+ function d(e, t = {}) {
34
+ let n = { ...t };
35
+ for (let t of e) t != null && (n[t] == null || n[t] === "") && (n[t] = u(t));
36
+ return n;
37
+ }
38
+ function f(e) {
39
+ let t = Array.from(new Set(e.map((e) => c(e)).filter((e) => e.length > 0))).sort(), n = {};
40
+ return t.forEach((e, t) => {
41
+ n[t] = e;
42
+ }), n;
43
+ }
44
+ function ee(e, t) {
45
+ let n = [];
46
+ if (t) for (let e of Object.values(t)) {
47
+ let t = c(e);
48
+ t && n.push(t);
49
+ }
50
+ for (let t of e) if (t) for (let e of t) {
51
+ let t = c(e.label);
52
+ t && n.push(t);
53
+ }
54
+ return n;
55
+ }
56
+ function p(e, t) {
57
+ if (t == null) return null;
58
+ let n = e[t];
59
+ return n != null && n !== "" ? n : null;
60
+ }
61
+ function m(e, t) {
62
+ let n = c(t);
63
+ if (n) {
64
+ for (let [t, r] of Object.entries(e)) if (r === n) return Number(t);
65
+ }
66
+ }
67
+ function h(e, t) {
68
+ if (!Number.isSafeInteger(t) || t < 0) throw Error(`Invalid episode length ${t}`);
69
+ if (!Number.isSafeInteger(e.startFrame) || !Number.isSafeInteger(e.endFrame)) throw Error("Subtask segment frames must be integers");
70
+ let n = c(e.label);
71
+ if (!n) throw Error("Subtask label is required");
72
+ if (e.startFrame < 0 || e.endFrame < 0) throw Error("Subtask segment frames must be non-negative");
73
+ if (e.startFrame > e.endFrame) throw Error("Subtask segment start must be at or before end");
74
+ if (t === 0 || e.endFrame >= t) throw Error(`Subtask segment ${e.startFrame}-${e.endFrame} is outside episode length ${t}`);
75
+ return {
76
+ startFrame: e.startFrame,
77
+ endFrame: e.endFrame,
78
+ label: n
79
+ };
80
+ }
81
+ function g(e, t) {
82
+ return e.startFrame <= t.endFrame && t.startFrame <= e.endFrame;
83
+ }
84
+ function _(e, t, n) {
85
+ return e.find((e, r) => r !== n && g(e, t));
86
+ }
87
+ function v(e) {
88
+ return [...e].sort((e, t) => e.startFrame - t.startFrame);
89
+ }
90
+ function y(e, t, n) {
91
+ let r = h(t, n), i = _(e, r);
92
+ if (i) throw Error(`Subtask "${r.label}" overlaps "${i.label}" (${i.startFrame}-${i.endFrame})`);
93
+ return v([...e, r]);
94
+ }
95
+ function b(e, t, n, r) {
96
+ if (!Number.isSafeInteger(t) || t < 0 || t >= e.length) throw Error(`Subtask segment index ${t} is out of range`);
97
+ let i = h(n, r), a = _(e, i, t);
98
+ if (a) throw Error(`Subtask "${i.label}" overlaps "${a.label}" (${a.startFrame}-${a.endFrame})`);
99
+ let o = [...e];
100
+ return o[t] = i, v(o);
101
+ }
102
+ function x(e, t) {
103
+ let n = [], r = null;
104
+ return e.forEach((e, i) => {
105
+ let a = p(t, l(e));
106
+ if (a == null) {
107
+ r &&= (n.push(r), null);
108
+ return;
109
+ }
110
+ if (r && r.label === a && r.endFrame === i - 1) {
111
+ r = {
112
+ ...r,
113
+ endFrame: i
114
+ };
115
+ return;
116
+ }
117
+ r && n.push(r), r = {
118
+ startFrame: i,
119
+ endFrame: i,
120
+ label: a
121
+ };
122
+ }), r && n.push(r), n;
123
+ }
124
+ function te(e, t) {
125
+ if (!Number.isSafeInteger(e) || e < 0) throw Error(`Invalid episode length ${e}`);
126
+ let n = Array(e).fill(!1);
127
+ for (let r of t) {
128
+ let t = h(r, e);
129
+ for (let e = t.startFrame; e <= t.endFrame; e++) n[e] = !0;
130
+ }
131
+ let r = [], i = null, a = 0;
132
+ for (let t = 0; t < e; t++) n[t] ? (a += 1, i != null && (r.push({
133
+ startFrame: i,
134
+ endFrame: t - 1
135
+ }), i = null)) : i ??= t;
136
+ return i != null && r.push({
137
+ startFrame: i,
138
+ endFrame: e - 1
139
+ }), {
140
+ labeledFrames: a,
141
+ totalFrames: e,
142
+ gaps: r,
143
+ complete: e > 0 && r.length === 0
144
+ };
145
+ }
146
+ function ne(e, t) {
147
+ if (!Number.isSafeInteger(t) || t < 0) return null;
148
+ let n = e.find((e) => t >= e.startFrame && t <= e.endFrame);
149
+ return n ? n.label : null;
150
+ }
151
+ function S(e, t) {
152
+ return e.map((e) => {
153
+ let n = c(e);
154
+ return n ? m(t, n) ?? null : null;
155
+ });
156
+ }
157
+ function C(e) {
158
+ let t = {};
159
+ return e.forEach((e, n) => {
160
+ let r = c(e.label);
161
+ if (!r) return;
162
+ let i = l(e.subtaskIndex) ?? n;
163
+ t[i] = r;
164
+ }), t;
165
+ }
166
+ //#endregion
167
+ //#region node_modules/comlink/dist/esm/comlink.mjs
168
+ var w = Symbol("Comlink.proxy"), T = Symbol("Comlink.endpoint"), E = Symbol("Comlink.releaseProxy"), D = Symbol("Comlink.finalizer"), O = Symbol("Comlink.thrown"), k = (e) => typeof e == "object" && !!e || typeof e == "function", A = /* @__PURE__ */ new Map([["proxy", {
169
+ canHandle: (e) => k(e) && e[w],
170
+ serialize(e) {
171
+ let { port1: t, port2: n } = new MessageChannel();
172
+ return M(e, t), [n, [n]];
173
+ },
174
+ deserialize(e) {
175
+ return e.start(), F(e);
176
+ }
177
+ }], ["throw", {
178
+ canHandle: (e) => k(e) && O in e,
179
+ serialize({ value: e }) {
180
+ let t;
181
+ return t = e instanceof Error ? {
182
+ isError: !0,
183
+ value: {
184
+ message: e.message,
185
+ name: e.name,
186
+ stack: e.stack
187
+ }
188
+ } : {
189
+ isError: !1,
190
+ value: e
191
+ }, [t, []];
192
+ },
193
+ deserialize(e) {
194
+ throw e.isError ? Object.assign(Error(e.value.message), e.value) : e.value;
195
+ }
196
+ }]]);
197
+ function j(e, t) {
198
+ for (let n of e) if (t === n || n === "*" || n instanceof RegExp && n.test(t)) return !0;
199
+ return !1;
200
+ }
201
+ function M(e, t = globalThis, n = ["*"]) {
202
+ t.addEventListener("message", function r(i) {
203
+ if (!i || !i.data) return;
204
+ if (!j(n, i.origin)) {
205
+ console.warn(`Invalid origin '${i.origin}' for comlink proxy`);
206
+ return;
207
+ }
208
+ let { id: a, type: o, path: s } = Object.assign({ path: [] }, i.data), c = (i.data.argumentList || []).map(Y), l;
209
+ try {
210
+ let t = s.slice(0, -1).reduce((e, t) => e[t], e), n = s.reduce((e, t) => e[t], e);
211
+ switch (o) {
212
+ case "GET":
213
+ l = n;
214
+ break;
215
+ case "SET":
216
+ t[s.slice(-1)[0]] = Y(i.data.value), l = !0;
217
+ break;
218
+ case "APPLY":
219
+ l = n.apply(t, c);
220
+ break;
221
+ case "CONSTRUCT":
222
+ l = q(new n(...c));
223
+ break;
224
+ case "ENDPOINT":
225
+ {
226
+ let { port1: t, port2: n } = new MessageChannel();
227
+ M(e, n), l = K(t, [t]);
228
+ }
229
+ break;
230
+ case "RELEASE":
231
+ l = void 0;
232
+ break;
233
+ default: return;
234
+ }
235
+ } catch (e) {
236
+ l = {
237
+ value: e,
238
+ [O]: 0
239
+ };
240
+ }
241
+ Promise.resolve(l).catch((e) => ({
242
+ value: e,
243
+ [O]: 0
244
+ })).then((n) => {
245
+ let [i, s] = J(n);
246
+ t.postMessage(Object.assign(Object.assign({}, i), { id: a }), s), o === "RELEASE" && (t.removeEventListener("message", r), P(t), D in e && typeof e[D] == "function" && e[D]());
247
+ }).catch((e) => {
248
+ let [n, r] = J({
249
+ value: /* @__PURE__ */ TypeError("Unserializable return value"),
250
+ [O]: 0
251
+ });
252
+ t.postMessage(Object.assign(Object.assign({}, n), { id: a }), r);
253
+ });
254
+ }), t.start && t.start();
255
+ }
256
+ function N(e) {
257
+ return e.constructor.name === "MessagePort";
258
+ }
259
+ function P(e) {
260
+ N(e) && e.close();
261
+ }
262
+ function F(e, t) {
263
+ let n = /* @__PURE__ */ new Map();
264
+ return e.addEventListener("message", function(e) {
265
+ let { data: t } = e;
266
+ if (!t || !t.id) return;
267
+ let r = n.get(t.id);
268
+ if (r) try {
269
+ r(t);
270
+ } finally {
271
+ n.delete(t.id);
272
+ }
273
+ }), H(e, n, [], t);
274
+ }
275
+ function I(e) {
276
+ if (e) throw Error("Proxy has been released and is not useable");
277
+ }
278
+ function L(e) {
279
+ return X(e, /* @__PURE__ */ new Map(), { type: "RELEASE" }).then(() => {
280
+ P(e);
281
+ });
282
+ }
283
+ var R = /* @__PURE__ */ new WeakMap(), z = "FinalizationRegistry" in globalThis && new FinalizationRegistry((e) => {
284
+ let t = (R.get(e) || 0) - 1;
285
+ R.set(e, t), t === 0 && L(e);
286
+ });
287
+ function B(e, t) {
288
+ let n = (R.get(t) || 0) + 1;
289
+ R.set(t, n), z && z.register(e, t, e);
290
+ }
291
+ function V(e) {
292
+ z && z.unregister(e);
293
+ }
294
+ function H(e, t, n = [], r = function() {}) {
295
+ let i = !1, a = new Proxy(r, {
296
+ get(r, o) {
297
+ if (I(i), o === E) return () => {
298
+ V(a), L(e), t.clear(), i = !0;
299
+ };
300
+ if (o === "then") {
301
+ if (n.length === 0) return { then: () => a };
302
+ let r = X(e, t, {
303
+ type: "GET",
304
+ path: n.map((e) => e.toString())
305
+ }).then(Y);
306
+ return r.then.bind(r);
307
+ }
308
+ return H(e, t, [...n, o]);
309
+ },
310
+ set(r, a, o) {
311
+ I(i);
312
+ let [s, c] = J(o);
313
+ return X(e, t, {
314
+ type: "SET",
315
+ path: [...n, a].map((e) => e.toString()),
316
+ value: s
317
+ }, c).then(Y);
318
+ },
319
+ apply(r, a, o) {
320
+ I(i);
321
+ let s = n[n.length - 1];
322
+ if (s === T) return X(e, t, { type: "ENDPOINT" }).then(Y);
323
+ if (s === "bind") return H(e, t, n.slice(0, -1));
324
+ let [c, l] = W(o);
325
+ return X(e, t, {
326
+ type: "APPLY",
327
+ path: n.map((e) => e.toString()),
328
+ argumentList: c
329
+ }, l).then(Y);
330
+ },
331
+ construct(r, a) {
332
+ I(i);
333
+ let [o, s] = W(a);
334
+ return X(e, t, {
335
+ type: "CONSTRUCT",
336
+ path: n.map((e) => e.toString()),
337
+ argumentList: o
338
+ }, s).then(Y);
339
+ }
340
+ });
341
+ return B(a, e), a;
342
+ }
343
+ function U(e) {
344
+ return Array.prototype.concat.apply([], e);
345
+ }
346
+ function W(e) {
347
+ let t = e.map(J);
348
+ return [t.map((e) => e[0]), U(t.map((e) => e[1]))];
349
+ }
350
+ var G = /* @__PURE__ */ new WeakMap();
351
+ function K(e, t) {
352
+ return G.set(e, t), e;
353
+ }
354
+ function q(e) {
355
+ return Object.assign(e, { [w]: !0 });
356
+ }
357
+ function J(e) {
358
+ for (let [t, n] of A) if (n.canHandle(e)) {
359
+ let [r, i] = n.serialize(e);
360
+ return [{
361
+ type: "HANDLER",
362
+ name: t,
363
+ value: r
364
+ }, i];
365
+ }
366
+ return [{
367
+ type: "RAW",
368
+ value: e
369
+ }, G.get(e) || []];
370
+ }
371
+ function Y(e) {
372
+ switch (e.type) {
373
+ case "HANDLER": return A.get(e.name).deserialize(e.value);
374
+ case "RAW": return e.value;
375
+ }
376
+ }
377
+ function X(e, t, n, r) {
378
+ return new Promise((i) => {
379
+ let a = re();
380
+ t.set(a, i), e.start && e.start(), e.postMessage(Object.assign({ id: a }, n), r);
381
+ });
382
+ }
383
+ function re() {
384
+ return [
385
+ ,
386
+ ,
387
+ ,
388
+ ,
389
+ ].fill(0).map(() => Math.floor(Math.random() * (2 ** 53 - 1)).toString(16)).join("-");
390
+ }
391
+ //#endregion
392
+ //#region src/platform/workers/parquet.worker.ts?worker&url
393
+ var ie = "" + new URL("assets/parquet.worker-CWkXhGle.js", import.meta.url).href, ae = "" + new URL("assets/parquetImage.worker-DJN4vgFr.js", import.meta.url).href, Z = null, Q = /* @__PURE__ */ new WeakMap();
394
+ async function oe() {
395
+ return Z ||= import("./wasmUrl-BBlR-NOh.js").then(({ wasmUrl: e }) => fetch(e)).then((e) => {
396
+ if (!e.ok) throw Error(`Failed to fetch WASM: ${e.status}`);
397
+ return e.arrayBuffer();
398
+ }).catch((e) => {
399
+ throw Z = null, e;
400
+ }), (await Z).slice(0);
401
+ }
402
+ function $(e) {
403
+ oe().then((t) => {
404
+ e.postMessage({
405
+ type: "init-wasm",
406
+ wasmBuffer: t
407
+ }, [t]);
408
+ }).catch((t) => {
409
+ e.postMessage({
410
+ type: "init-wasm-error",
411
+ message: String(t)
412
+ });
413
+ });
414
+ }
415
+ function se() {
416
+ let e = new Worker(ie, { type: "module" });
417
+ $(e);
418
+ let t = F(e);
419
+ return Q.set(t, e), t;
420
+ }
421
+ function ce() {
422
+ let e = new Worker(ae, { type: "module" });
423
+ $(e);
424
+ let t = F(e);
425
+ return Q.set(t, e), {
426
+ remote: t,
427
+ raw: e
428
+ };
429
+ }
430
+ function le(e) {
431
+ e[E]();
432
+ let t = Q.get(e);
433
+ t && (t.terminate(), Q.delete(e));
434
+ }
435
+ //#endregion
436
+ export { o as C, a as S, d as _, ee as a, i as b, m as c, l as d, c as f, v as g, x as h, f as i, S as l, b as m, se as n, te as o, C as p, le as r, ne as s, ce as t, y as u, n as v, s as x, r as y };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ioai/lerobot-studio",
3
3
  "private": false,
4
- "version": "1.1.0",
4
+ "version": "1.2.0",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.7.0",
7
7
  "scripts": {
@@ -40,7 +40,7 @@
40
40
  "@microsoft/api-extractor": "^7.58.12",
41
41
  "@playwright/test": "^1.62.1",
42
42
  "@tailwindcss/vite": "^4.3.3",
43
- "@types/node": "^26.1.2",
43
+ "@types/node": "^26.2.0",
44
44
  "@types/react": "^19.2.18",
45
45
  "@types/react-dom": "^19.2.4",
46
46
  "@vitejs/plugin-react": "^6.0.4",
@@ -50,18 +50,18 @@
50
50
  "axe-core": "^4.12.1",
51
51
  "eslint": "^10.8.0",
52
52
  "eslint-plugin-react-hooks": "^7.1.1",
53
- "eslint-plugin-react-refresh": "^0.5.3",
54
- "globals": "^17.9.0",
53
+ "eslint-plugin-react-refresh": "^0.5.4",
54
+ "globals": "^17.11.0",
55
55
  "lightningcss": "^1.33.0",
56
56
  "playwright": "^1.62.1",
57
57
  "prettier": "^3.6.2",
58
58
  "publint": "^0.3.23",
59
59
  "react": "^19.2.8",
60
60
  "react-dom": "^19.2.8",
61
- "shadcn": "^4.16.0",
61
+ "shadcn": "^4.18.0",
62
62
  "tailwindcss": "^4.3.3",
63
63
  "typescript": "6.0.3",
64
- "typescript-eslint": "^8.66.0",
64
+ "typescript-eslint": "^8.67.0",
65
65
  "vite": "^8.1.5",
66
66
  "vitepress": "2.0.0-alpha.19",
67
67
  "vitest": "^4.1.10"
@@ -115,10 +115,13 @@
115
115
  "publishConfig": {
116
116
  "access": "public"
117
117
  },
118
+ "overrides": {
119
+ "browserslist": "^4.28.8"
120
+ },
118
121
  "dependencies": {
119
122
  "@base-ui/react": "^1.7.0",
120
123
  "@fontsource-variable/geist": "^5.3.0",
121
- "@zip.js/zip.js": "^2.8.34",
124
+ "@zip.js/zip.js": "^2.8.51",
122
125
  "apache-arrow": "^21.2.0",
123
126
  "class-variance-authority": "^0.7.1",
124
127
  "clsx": "^2.1.1",
@@ -126,14 +129,14 @@
126
129
  "dockview-react": "^7.0.4",
127
130
  "fflate": "^0.8.3",
128
131
  "framer-motion": "^12.43.0",
129
- "lucide-react": "^1.28.0",
132
+ "lucide-react": "^1.31.0",
130
133
  "mediabunny": "^1.52.3",
131
134
  "next-themes": "^0.4.6",
132
135
  "parquet-wasm": "^0.7.2",
133
136
  "radix-ui": "^1.6.7",
134
- "react-intl": "^10.1.20",
137
+ "react-intl": "10.1.23",
135
138
  "react-window": "^2.3.0",
136
- "sonner": "^2.0.7",
139
+ "sonner": "^2.0.8",
137
140
  "tailwind-merge": "^3.6.0",
138
141
  "tw-animate-css": "^1.4.0",
139
142
  "uplot": "^1.6.32",