hyperbook 0.98.1 → 0.99.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,486 @@
1
+ {
2
+ "deviceName": "Craftbot Plus Pro",
3
+ "new": false,
4
+ "mode": "FDM",
5
+ "internal": 0,
6
+ "bedWidth": 255,
7
+ "bedDepth": 200,
8
+ "bedHeight": 2,
9
+ "maxHeight": 200,
10
+ "bedRound": false,
11
+ "bedBelt": false,
12
+ "deviceZMax": 0,
13
+ "originCenter": false,
14
+ "extrudeAbs": false,
15
+ "spindleMax": 0,
16
+ "gcodeFan": [
17
+ "M106 S{fan_speed}"
18
+ ],
19
+ "gcodeTrack": [
20
+ "M73 P{progress}"
21
+ ],
22
+ "gcodeLayer": [
23
+ ";; LAYER {layer} of {layers}",
24
+ "M117 Layer {layer} of {layers}"
25
+ ],
26
+ "gcodePre": [
27
+ "G21 ; set units to millimeters",
28
+ "G90 ; use absolute coordinates",
29
+ "M83 ; use relative distances for extruder",
30
+ "M106 S0 ; turn off cooling fan",
31
+ "G92 E0 ; zero the extruded length",
32
+ "G1 F1800 ; set feedrate",
33
+ "M104 S{temp} ; set extruder temp",
34
+ "M140 S{bed_temp} ; set bed temp",
35
+ "M190 S{bed_temp} ; wait for bed temp",
36
+ "M109 S{temp} ; wait for extruder temp",
37
+ "G28 ; home all axes",
38
+ "G1 Z15.0 F6000 ; move nozzle away from bed",
39
+ "G1 X0 Y0 ; move to origin",
40
+ "G1 Z0.3 ; lower nozzle to first layer height",
41
+ "G92 E0 ; zero the extruded length again",
42
+ "G1 E5 F50 ; purge a little filament",
43
+ "G92 E0 ; zero the extruded length again",
44
+ "M117 Printing..."
45
+ ],
46
+ "gcodePost": [
47
+ "M104 S0 ; turn off extruder",
48
+ "M140 S0 ; turn off bed",
49
+ "M106 S0 ; turn off fan",
50
+ "G1 E-1 F300 ; retract filament",
51
+ "G1 Z10 F3000 ; raise Z",
52
+ "G28 X Y ; home X and Y",
53
+ "M84 ; disable steppers",
54
+ "M117 Print Done"
55
+ ],
56
+ "gcodeProc": "",
57
+ "gcodeDwell": [],
58
+ "gcodeSpindle": [],
59
+ "gcodeChange": [],
60
+ "gcodeFExt": "gcode",
61
+ "gcodeSpace": true,
62
+ "gcodeStrip": false,
63
+ "gcodeLaserOn": [],
64
+ "gcodeLaserOff": [],
65
+ "extruders": [
66
+ {
67
+ "extFilament": 1.75,
68
+ "extNozzle": 0.4,
69
+ "extOffsetX": 0,
70
+ "extOffsetY": 0
71
+ }
72
+ ],
73
+ "fwRetract": false,
74
+ "profiles": [
75
+ {
76
+ "processName": "Craftbot Plus Pro 0.20mm Standard",
77
+ "sliceHeight": 0.2,
78
+ "sliceShells": 2,
79
+ "sliceShellOrder": "in-out",
80
+ "sliceLayerStart": "center",
81
+ "sliceFillAngle": 45,
82
+ "sliceFillOverlap": 0.35,
83
+ "sliceFillSparse": 0.1,
84
+ "sliceFillType": "hex",
85
+ "sliceAdaptive": false,
86
+ "sliceMinHeight": 0,
87
+ "sliceSupportDensity": 0.2,
88
+ "sliceSupportOffset": 0.4,
89
+ "sliceSupportGap": 0.5,
90
+ "sliceSupportSize": 6,
91
+ "sliceSupportArea": 0.25,
92
+ "sliceSupportExtra": 0,
93
+ "sliceSupportAngle": 60,
94
+ "sliceSupportNozzle": 0,
95
+ "sliceSolidMinArea": 1,
96
+ "sliceSolidLayers": 3,
97
+ "sliceBottomLayers": 3,
98
+ "sliceTopLayers": 4,
99
+ "firstLayerRate": 20,
100
+ "firstLayerPrintMult": 1,
101
+ "firstLayerYOffset": 0,
102
+ "firstLayerBrim": 0,
103
+ "firstLayerBeltLead": 200,
104
+ "firstLayerFanSpeed": 0,
105
+ "outputTemp": 205,
106
+ "outputBedTemp": 60,
107
+ "outputFanSpeed": 255,
108
+ "outputFeedrate": 40,
109
+ "outputFinishrate": 30,
110
+ "outputSeekrate": 150,
111
+ "outputShellMult": 1.05,
112
+ "outputFillMult": 1.1,
113
+ "outputSparseMult": 1.1,
114
+ "outputRetractDist": 1.2,
115
+ "outputRetractSpeed": 80,
116
+ "outputRetractWipe": 2,
117
+ "outputRetractDwell": 0,
118
+ "outputShortPoly": 50,
119
+ "outputMinSpeed": 1,
120
+ "outputCoastDist": 0,
121
+ "outputLayerRetract": false,
122
+ "zHopDistance": 0.12,
123
+ "antiBacklash": 0,
124
+ "sliceFillWidth": 1,
125
+ "sliceFillRate": 0,
126
+ "sliceSupportEnable": false,
127
+ "firstSliceHeight": 0.2,
128
+ "firstLayerFillRate": 35,
129
+ "firstLayerLineMult": 1,
130
+ "firstLayerNozzleTemp": 0,
131
+ "firstLayerBedTemp": 0,
132
+ "firstLayerBrimTrig": 0,
133
+ "firstLayerBrimGap": 0,
134
+ "outputRaft": false,
135
+ "outputRaftSpacing": 0.2,
136
+ "outputBrimCount": 0,
137
+ "outputBrimOffset": 2,
138
+ "outputPurgeTower": 0,
139
+ "outputInvertX": false,
140
+ "outputInvertY": false,
141
+ "arcTolerance": 0,
142
+ "ranges": [],
143
+ "outputLoops": 0,
144
+ "firstLayerBrimIn": 0,
145
+ "firstLayerBeltBump": 0,
146
+ "outputBeltFirst": false,
147
+ "sliceFillRepeat": 4,
148
+ "sliceLineWidth": 0,
149
+ "sliceSupportSpan": 5,
150
+ "sliceSupportOutline": true,
151
+ "firstLayerFlatten": 0,
152
+ "outputDraftShield": false,
153
+ "outputAvoidGaps": true,
154
+ "sliceDetectThin": "off",
155
+ "beltAnchor": 200
156
+ },
157
+ {
158
+ "processName": "Craftbot Plus Pro 0.20mm Fast",
159
+ "sliceHeight": 0.2,
160
+ "sliceShells": 2,
161
+ "sliceShellOrder": "in-out",
162
+ "sliceLayerStart": "center",
163
+ "sliceFillAngle": 45,
164
+ "sliceFillOverlap": 0.35,
165
+ "sliceFillSparse": 0.1,
166
+ "sliceFillType": "hex",
167
+ "sliceAdaptive": false,
168
+ "sliceMinHeight": 0,
169
+ "sliceSupportDensity": 0.2,
170
+ "sliceSupportOffset": 0.4,
171
+ "sliceSupportGap": 0.5,
172
+ "sliceSupportSize": 6,
173
+ "sliceSupportArea": 0.25,
174
+ "sliceSupportExtra": 0,
175
+ "sliceSupportAngle": 60,
176
+ "sliceSupportNozzle": 0,
177
+ "sliceSolidMinArea": 1,
178
+ "sliceSolidLayers": 3,
179
+ "sliceBottomLayers": 3,
180
+ "sliceTopLayers": 4,
181
+ "firstLayerRate": 20,
182
+ "firstLayerPrintMult": 1,
183
+ "firstLayerYOffset": 0,
184
+ "firstLayerBrim": 0,
185
+ "firstLayerBeltLead": 200,
186
+ "firstLayerFanSpeed": 0,
187
+ "outputTemp": 205,
188
+ "outputBedTemp": 60,
189
+ "outputFanSpeed": 255,
190
+ "outputFeedrate": 60,
191
+ "outputFinishrate": 40,
192
+ "outputSeekrate": 200,
193
+ "outputShellMult": 1.05,
194
+ "outputFillMult": 1.15,
195
+ "outputSparseMult": 1.15,
196
+ "outputRetractDist": 1.2,
197
+ "outputRetractSpeed": 80,
198
+ "outputRetractWipe": 2,
199
+ "outputRetractDwell": 0,
200
+ "outputShortPoly": 50,
201
+ "outputMinSpeed": 1,
202
+ "outputCoastDist": 0,
203
+ "outputLayerRetract": false,
204
+ "zHopDistance": 0.12,
205
+ "antiBacklash": 0,
206
+ "sliceFillWidth": 1,
207
+ "sliceFillRate": 0,
208
+ "sliceSupportEnable": false,
209
+ "firstSliceHeight": 0.2,
210
+ "firstLayerFillRate": 35,
211
+ "firstLayerLineMult": 1,
212
+ "firstLayerNozzleTemp": 0,
213
+ "firstLayerBedTemp": 0,
214
+ "firstLayerBrimTrig": 0,
215
+ "firstLayerBrimGap": 0,
216
+ "outputRaft": false,
217
+ "outputRaftSpacing": 0.2,
218
+ "outputBrimCount": 0,
219
+ "outputBrimOffset": 2,
220
+ "outputPurgeTower": 0,
221
+ "outputInvertX": false,
222
+ "outputInvertY": false,
223
+ "arcTolerance": 0,
224
+ "ranges": [],
225
+ "outputLoops": 0,
226
+ "firstLayerBrimIn": 0,
227
+ "firstLayerBeltBump": 0,
228
+ "outputBeltFirst": false,
229
+ "sliceFillRepeat": 4,
230
+ "sliceLineWidth": 0,
231
+ "sliceSupportSpan": 5,
232
+ "sliceSupportOutline": true,
233
+ "firstLayerFlatten": 0,
234
+ "outputDraftShield": false,
235
+ "outputAvoidGaps": true,
236
+ "sliceDetectThin": "off",
237
+ "beltAnchor": 200
238
+ },
239
+ {
240
+ "processName": "Craftbot Plus Pro 0.15mm Draft",
241
+ "sliceHeight": 0.15,
242
+ "sliceShells": 2,
243
+ "sliceShellOrder": "in-out",
244
+ "sliceLayerStart": "center",
245
+ "sliceFillAngle": 45,
246
+ "sliceFillOverlap": 0.35,
247
+ "sliceFillSparse": 0.1,
248
+ "sliceFillType": "hex",
249
+ "sliceAdaptive": false,
250
+ "sliceMinHeight": 0,
251
+ "sliceSupportDensity": 0.2,
252
+ "sliceSupportOffset": 0.4,
253
+ "sliceSupportGap": 0.5,
254
+ "sliceSupportSize": 6,
255
+ "sliceSupportArea": 0.25,
256
+ "sliceSupportExtra": 0,
257
+ "sliceSupportAngle": 60,
258
+ "sliceSupportNozzle": 0,
259
+ "sliceSolidMinArea": 1,
260
+ "sliceSolidLayers": 2,
261
+ "sliceBottomLayers": 2,
262
+ "sliceTopLayers": 3,
263
+ "firstLayerRate": 20,
264
+ "firstLayerPrintMult": 1,
265
+ "firstLayerYOffset": 0,
266
+ "firstLayerBrim": 0,
267
+ "firstLayerBeltLead": 200,
268
+ "firstLayerFanSpeed": 0,
269
+ "outputTemp": 205,
270
+ "outputBedTemp": 60,
271
+ "outputFanSpeed": 255,
272
+ "outputFeedrate": 60,
273
+ "outputFinishrate": 30,
274
+ "outputSeekrate": 200,
275
+ "outputShellMult": 0.92,
276
+ "outputFillMult": 1.1,
277
+ "outputSparseMult": 1.1,
278
+ "outputRetractDist": 1.2,
279
+ "outputRetractSpeed": 80,
280
+ "outputRetractWipe": 2,
281
+ "outputRetractDwell": 0,
282
+ "outputShortPoly": 50,
283
+ "outputMinSpeed": 1,
284
+ "outputCoastDist": 0,
285
+ "outputLayerRetract": false,
286
+ "zHopDistance": 0.12,
287
+ "antiBacklash": 0,
288
+ "sliceFillWidth": 1,
289
+ "sliceFillRate": 0,
290
+ "sliceSupportEnable": false,
291
+ "firstSliceHeight": 0.2,
292
+ "firstLayerFillRate": 35,
293
+ "firstLayerLineMult": 1,
294
+ "firstLayerNozzleTemp": 0,
295
+ "firstLayerBedTemp": 0,
296
+ "firstLayerBrimTrig": 0,
297
+ "firstLayerBrimGap": 0,
298
+ "outputRaft": false,
299
+ "outputRaftSpacing": 0.2,
300
+ "outputBrimCount": 0,
301
+ "outputBrimOffset": 2,
302
+ "outputPurgeTower": 0,
303
+ "outputInvertX": false,
304
+ "outputInvertY": false,
305
+ "arcTolerance": 0,
306
+ "ranges": [],
307
+ "outputLoops": 0,
308
+ "firstLayerBrimIn": 0,
309
+ "firstLayerBeltBump": 0,
310
+ "outputBeltFirst": false,
311
+ "sliceFillRepeat": 4,
312
+ "sliceLineWidth": 0.5,
313
+ "sliceSupportSpan": 5,
314
+ "sliceSupportOutline": true,
315
+ "firstLayerFlatten": 0,
316
+ "outputDraftShield": false,
317
+ "outputAvoidGaps": true,
318
+ "sliceDetectThin": "off",
319
+ "beltAnchor": 200
320
+ },
321
+ {
322
+ "processName": "Craftbot Plus Pro 0.30mm Standard 0.6mm",
323
+ "sliceHeight": 0.3,
324
+ "sliceShells": 2,
325
+ "sliceShellOrder": "in-out",
326
+ "sliceLayerStart": "center",
327
+ "sliceFillAngle": 45,
328
+ "sliceFillOverlap": 0.35,
329
+ "sliceFillSparse": 0.1,
330
+ "sliceFillType": "hex",
331
+ "sliceAdaptive": false,
332
+ "sliceMinHeight": 0,
333
+ "sliceSupportDensity": 0.2,
334
+ "sliceSupportOffset": 0.4,
335
+ "sliceSupportGap": 0.5,
336
+ "sliceSupportSize": 6,
337
+ "sliceSupportArea": 0.25,
338
+ "sliceSupportExtra": 0,
339
+ "sliceSupportAngle": 60,
340
+ "sliceSupportNozzle": 0,
341
+ "sliceSolidMinArea": 1,
342
+ "sliceSolidLayers": 3,
343
+ "sliceBottomLayers": 2,
344
+ "sliceTopLayers": 3,
345
+ "firstLayerRate": 20,
346
+ "firstLayerPrintMult": 1,
347
+ "firstLayerYOffset": 0,
348
+ "firstLayerBrim": 0,
349
+ "firstLayerBeltLead": 200,
350
+ "firstLayerFanSpeed": 0,
351
+ "outputTemp": 215,
352
+ "outputBedTemp": 65,
353
+ "outputFanSpeed": 255,
354
+ "outputFeedrate": 40,
355
+ "outputFinishrate": 25,
356
+ "outputSeekrate": 150,
357
+ "outputShellMult": 1.05,
358
+ "outputFillMult": 1.1,
359
+ "outputSparseMult": 1.1,
360
+ "outputRetractDist": 2,
361
+ "outputRetractSpeed": 80,
362
+ "outputRetractWipe": 2,
363
+ "outputRetractDwell": 0,
364
+ "outputShortPoly": 50,
365
+ "outputMinSpeed": 1,
366
+ "outputCoastDist": 0,
367
+ "outputLayerRetract": false,
368
+ "zHopDistance": 0.12,
369
+ "antiBacklash": 0,
370
+ "sliceFillWidth": 1,
371
+ "sliceFillRate": 0,
372
+ "sliceSupportEnable": false,
373
+ "firstSliceHeight": 0.3,
374
+ "firstLayerFillRate": 35,
375
+ "firstLayerLineMult": 1,
376
+ "firstLayerNozzleTemp": 0,
377
+ "firstLayerBedTemp": 0,
378
+ "firstLayerBrimTrig": 0,
379
+ "firstLayerBrimGap": 0,
380
+ "outputRaft": false,
381
+ "outputRaftSpacing": 0.2,
382
+ "outputBrimCount": 0,
383
+ "outputBrimOffset": 2,
384
+ "outputPurgeTower": 0,
385
+ "outputInvertX": false,
386
+ "outputInvertY": false,
387
+ "arcTolerance": 0,
388
+ "ranges": [],
389
+ "outputLoops": 0,
390
+ "firstLayerBrimIn": 0,
391
+ "firstLayerBeltBump": 0,
392
+ "outputBeltFirst": false,
393
+ "sliceFillRepeat": 4,
394
+ "sliceLineWidth": 0,
395
+ "sliceSupportSpan": 5,
396
+ "sliceSupportOutline": true,
397
+ "firstLayerFlatten": 0,
398
+ "outputDraftShield": false,
399
+ "outputAvoidGaps": true,
400
+ "sliceDetectThin": "off",
401
+ "beltAnchor": 200
402
+ },
403
+ {
404
+ "processName": "Craftbot Plus Pro 0.40mm Superdraft 0.6mm",
405
+ "sliceHeight": 0.4,
406
+ "sliceShells": 1,
407
+ "sliceShellOrder": "in-out",
408
+ "sliceLayerStart": "center",
409
+ "sliceFillAngle": 45,
410
+ "sliceFillOverlap": 0.35,
411
+ "sliceFillSparse": 0.2,
412
+ "sliceFillType": "hex",
413
+ "sliceAdaptive": false,
414
+ "sliceMinHeight": 0,
415
+ "sliceSupportDensity": 0.15,
416
+ "sliceSupportOffset": 0.4,
417
+ "sliceSupportGap": 0.5,
418
+ "sliceSupportSize": 8,
419
+ "sliceSupportArea": 0.25,
420
+ "sliceSupportExtra": 0,
421
+ "sliceSupportAngle": 60,
422
+ "sliceSupportNozzle": 0,
423
+ "sliceSolidMinArea": 1,
424
+ "sliceSolidLayers": 2,
425
+ "sliceBottomLayers": 1,
426
+ "sliceTopLayers": 2,
427
+ "firstLayerRate": 25,
428
+ "firstLayerPrintMult": 1,
429
+ "firstLayerYOffset": 0,
430
+ "firstLayerBrim": 0,
431
+ "firstLayerBeltLead": 200,
432
+ "firstLayerFanSpeed": 0,
433
+ "outputTemp": 220,
434
+ "outputBedTemp": 70,
435
+ "outputFanSpeed": 200,
436
+ "outputFeedrate": 80,
437
+ "outputFinishrate": 40,
438
+ "outputSeekrate": 200,
439
+ "outputShellMult": 1.1,
440
+ "outputFillMult": 1.2,
441
+ "outputSparseMult": 1.2,
442
+ "outputRetractDist": 2,
443
+ "outputRetractSpeed": 80,
444
+ "outputRetractWipe": 2,
445
+ "outputRetractDwell": 0,
446
+ "outputShortPoly": 50,
447
+ "outputMinSpeed": 1,
448
+ "outputCoastDist": 0,
449
+ "outputLayerRetract": false,
450
+ "zHopDistance": 0,
451
+ "antiBacklash": 0,
452
+ "sliceFillWidth": 1,
453
+ "sliceFillRate": 0,
454
+ "sliceSupportEnable": false,
455
+ "firstSliceHeight": 0.4,
456
+ "firstLayerFillRate": 40,
457
+ "firstLayerLineMult": 1,
458
+ "firstLayerNozzleTemp": 0,
459
+ "firstLayerBedTemp": 0,
460
+ "firstLayerBrimTrig": 0,
461
+ "firstLayerBrimGap": 0,
462
+ "outputRaft": false,
463
+ "outputRaftSpacing": 0.2,
464
+ "outputBrimCount": 0,
465
+ "outputBrimOffset": 2,
466
+ "outputPurgeTower": 0,
467
+ "outputInvertX": false,
468
+ "outputInvertY": false,
469
+ "arcTolerance": 0,
470
+ "ranges": [],
471
+ "outputLoops": 0,
472
+ "firstLayerBrimIn": 0,
473
+ "firstLayerBeltBump": 0,
474
+ "outputBeltFirst": false,
475
+ "sliceFillRepeat": 2,
476
+ "sliceLineWidth": 0,
477
+ "sliceSupportSpan": 8,
478
+ "sliceSupportOutline": false,
479
+ "firstLayerFlatten": 0,
480
+ "outputDraftShield": false,
481
+ "outputAvoidGaps": true,
482
+ "sliceDetectThin": "off",
483
+ "beltAnchor": 200
484
+ }
485
+ ]
486
+ }
@@ -0,0 +1,30 @@
1
+ .directive-kirimoto {
2
+ border: 1px solid var(--color-spacer);
3
+ border-radius: 8px;
4
+ overflow: hidden;
5
+ display: flex;
6
+ flex-direction: column;
7
+ height: var(--kirimoto-height, calc(100vh - 60px));
8
+ }
9
+
10
+ .directive-kirimoto iframe {
11
+ flex: 1;
12
+ min-height: 0;
13
+ width: 100%;
14
+ border: none;
15
+ }
16
+
17
+ .directive-kirimoto .menu {
18
+ display: flex;
19
+ border-top: 1px solid var(--color-spacer);
20
+ }
21
+
22
+ .directive-kirimoto .menu button {
23
+ flex: 1;
24
+ font-size: 0.9rem;
25
+ padding: 0.4rem 0.2rem;
26
+ background: var(--color-nav);
27
+ color: var(--color-text);
28
+ border: none;
29
+ cursor: pointer;
30
+ }
@@ -537,8 +537,12 @@ const runOpenScadInvocation = async ({
537
537
 
538
538
  const outputs = [];
539
539
  for (const outputPath of outputPaths) {
540
- const content = instance.FS.readFile(outputPath, { encoding: "binary" });
541
- outputs.push([outputPath, content]);
540
+ try {
541
+ const content = instance.FS.readFile(outputPath, { encoding: "binary" });
542
+ outputs.push([outputPath, content]);
543
+ } catch (_) {
544
+ // Output file missing — render produced no output (handled by caller)
545
+ }
542
546
  }
543
547
 
544
548
  return {
@@ -548,7 +552,7 @@ const runOpenScadInvocation = async ({
548
552
  elapsedMillis: performance.now() - start,
549
553
  };
550
554
  } catch (e) {
551
- const error = `${e}`;
555
+ const error = e?.message || (typeof e === "string" ? e : String(e)) || "Unknown error";
552
556
  mergedOutputs.push({ error });
553
557
  return {
554
558
  exitCode: undefined,
@@ -560,6 +564,24 @@ const runOpenScadInvocation = async ({
560
564
  }
561
565
  };
562
566
 
567
+ // Adjust "line N" references in stderr messages by a given offset (e.g. -1 when a
568
+ // header line is prepended to the user's code so reported line numbers stay accurate).
569
+ // Parser syntax errors are reported at the position OpenSCAD expected the next token
570
+ // (one past the actual expression), so they get an extra -1 applied.
571
+ const adjustStderrLineNumbers = (mergedOutputs, offset) =>
572
+ mergedOutputs.map((entry) => {
573
+ if (typeof entry?.stderr !== "string") return entry;
574
+ const isParserError = /Parser error/i.test(entry.stderr);
575
+ const effectiveOffset = isParserError ? offset - 1 : offset;
576
+ return {
577
+ ...entry,
578
+ stderr: entry.stderr.replace(/\bline (\d+)/g, (match, n) => {
579
+ const adjusted = parseInt(n, 10) + effectiveOffset;
580
+ return `line ${adjusted > 0 ? adjusted : parseInt(n, 10)}`;
581
+ }),
582
+ };
583
+ });
584
+
563
585
  self.addEventListener("message", async (event) => {
564
586
  const { requestId, type, payload } = event.data || {};
565
587
  if (!requestId || typeof type !== "string") return;
@@ -582,6 +604,7 @@ self.addEventListener("message", async (event) => {
582
604
  "--export-format=param",
583
605
  ],
584
606
  });
607
+ result = { ...result, mergedOutputs: adjustStderrLineNumbers(result.mergedOutputs, -1) };
585
608
  const serialized = serializeInvocationResults(result);
586
609
  self.postMessage({ requestId, ok: true, result: serialized.result }, serialized.transfer);
587
610
  return;
@@ -602,6 +625,7 @@ self.addEventListener("message", async (event) => {
602
625
  "--export-format=param",
603
626
  ],
604
627
  });
628
+ result = { ...result, mergedOutputs: adjustStderrLineNumbers(result.mergedOutputs, -1) };
605
629
 
606
630
  const codeParams = getExtractedParameters(result);
607
631
  const ui = buildParamFormUi(
@@ -642,6 +666,9 @@ self.addEventListener("message", async (event) => {
642
666
  ...OPENSCAD_FEATURE_ARGS,
643
667
  ],
644
668
  });
669
+ if (payload?.isPreview) {
670
+ result = { ...result, mergedOutputs: adjustStderrLineNumbers(result.mergedOutputs, -1) };
671
+ }
645
672
  // For preview OFF renders, parse geometry here in the worker so the main thread
646
673
  // never has to do heavy text parsing or Float32Array building.
647
674
  if (format === "off" && payload?.isPreview && result.exitCode === 0 && !result.error) {