project-foundry 1.0.5 → 1.0.6

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "project-foundry",
3
- "version": "1.0.5",
3
+ "version": "1.0.6",
4
4
  "description": "Project Foundry CLI & Local Node Daemon Manager",
5
5
  "bin": {
6
6
  "project-foundry": "bin/foundry.js",
@@ -103,20 +103,40 @@ export async function executeLocalPrinterAction({ action, printerId, connectionC
103
103
  let status = klippyState === 'ready' ? 'IDLE' : 'ERROR';
104
104
  let message = `Klipper: ${klippyState}`;
105
105
  let temperatures = {};
106
+ let progress = 0;
107
+ let currentLayer = 0;
108
+ let totalLayers = 0;
109
+ let filename;
110
+ let elapsedSeconds = 0;
106
111
 
107
112
  try {
108
113
  const telRes = await fetch(
109
- `${baseUrl}/printer/objects/query?print_stats&extruder&heater_bed`,
110
- { headers, signal: AbortSignal.timeout(5000) }
114
+ `${baseUrl}/printer/objects/query?print_stats&display_status&virtual_sdcard&extruder&heater_bed`,
115
+ { headers, signal: AbortSignal.timeout(6000) }
111
116
  );
112
117
  if (telRes.ok) {
113
118
  const tel = await telRes.json();
114
- const stats = tel?.result?.status?.print_stats || {};
115
- const ext = tel?.result?.status?.extruder || {};
116
- const bed = tel?.result?.status?.heater_bed || {};
117
- const st = String(stats.state || '').toLowerCase();
119
+ const s = tel?.result?.status || {};
120
+ const printStats = s.print_stats || {};
121
+ const display = s.display_status || {};
122
+ const virtualSd = s.virtual_sdcard || {};
123
+ const ext = s.extruder || {};
124
+ const bed = s.heater_bed || {};
125
+
126
+ const st = String(printStats.state || '').toLowerCase();
118
127
  if (st === 'printing') status = 'PRINTING';
119
128
  else if (st === 'paused') status = 'PAUSED';
129
+ else if (st === 'complete') status = 'IDLE';
130
+ else if (st === 'error') status = 'ERROR';
131
+
132
+ const dispProg = Number(display.progress || 0);
133
+ const sdProg = Number(virtualSd.progress || 0);
134
+ progress = Math.round(Math.max(dispProg, sdProg) * 100);
135
+
136
+ currentLayer = Number(virtualSd.layer || printStats?.info?.current_layer || 0);
137
+ totalLayers = Number(virtualSd.layer_count || printStats?.info?.total_layer || 0);
138
+ filename = printStats.filename || undefined;
139
+ elapsedSeconds = Number(printStats.print_duration || printStats.total_duration || 0);
120
140
 
121
141
  temperatures = {
122
142
  hotend: ext.temperature,
@@ -124,7 +144,7 @@ export async function executeLocalPrinterAction({ action, printerId, connectionC
124
144
  bed: bed.temperature,
125
145
  bedTarget: bed.target,
126
146
  };
127
- if (stats.message) message = stats.message;
147
+ if (printStats.message) message = printStats.message;
128
148
  }
129
149
  } catch {}
130
150
 
@@ -132,6 +152,11 @@ export async function executeLocalPrinterAction({ action, printerId, connectionC
132
152
  online: true,
133
153
  status,
134
154
  message,
155
+ progress,
156
+ currentLayer,
157
+ totalLayers,
158
+ filename,
159
+ elapsedSeconds,
135
160
  temperatures,
136
161
  };
137
162
  }
@@ -183,20 +208,41 @@ export async function executeLocalPrinterAction({ action, printerId, connectionC
183
208
  isDone = true;
184
209
  clearTimeout(timer);
185
210
  client.end(true);
211
+
186
212
  const state = String(data.print.gcode_state || 'IDLE').toUpperCase();
187
213
  const percent = Number(data.print.mc_percent || 0);
188
- const isPrinting = state === 'RUNNING' || state === 'PREPARE';
214
+ const isFinished = state === 'FINISH' || (state === 'IDLE' && percent === 100);
215
+ const isPrinting = (state === 'RUNNING' || state === 'PREPARE') && !isFinished;
216
+ const isPaused = state === 'PAUSE';
217
+
218
+ const filename =
219
+ typeof data.print.subtask_name === 'string' && data.print.subtask_name.trim()
220
+ ? data.print.subtask_name.trim()
221
+ : typeof data.print.gcode_file === 'string' && data.print.gcode_file.trim()
222
+ ? data.print.gcode_file.trim()
223
+ : undefined;
224
+
225
+ const remainingMins = Number(data.print.mc_remaining_time);
226
+ const remainingSeconds = Number.isFinite(remainingMins) ? Math.max(0, remainingMins * 60) : undefined;
227
+
189
228
  resolve({
190
229
  online: true,
191
- status: isPrinting ? 'PRINTING' : (state === 'PAUSE' ? 'PAUSED' : 'IDLE'),
192
- message: `Bambu LAN conectada (${state})`,
230
+ status: isPrinting ? 'PRINTING' : (isPaused ? 'PAUSED' : 'IDLE'),
231
+ message: isFinished
232
+ ? 'Impressão concluída com sucesso'
233
+ : `Bambu LAN conectada (${state})`,
193
234
  progress: percent,
235
+ currentLayer: Number(data.print.layer_num || 0),
236
+ totalLayers: Number(data.print.total_layer_num || 0),
237
+ filename,
238
+ remainingSeconds,
239
+ jobFinished: isFinished,
194
240
  temperatures: {
195
- hotend: data.print.nozzle_temper,
196
- hotendTarget: data.print.nozzle_target_temper,
197
- bed: data.print.bed_temper,
198
- bedTarget: data.print.bed_target_temper,
199
- chamber: data.print.chamber_temper,
241
+ hotend: Number(data.print.nozzle_temper || 0),
242
+ hotendTarget: Number(data.print.nozzle_target_temper || 0),
243
+ bed: Number(data.print.bed_temper || 0),
244
+ bedTarget: Number(data.print.bed_target_temper || 0),
245
+ chamber: Number(data.print.chamber_temper || 0),
200
246
  },
201
247
  });
202
248
  }