@yemi33/minions 0.1.350 → 0.1.352

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
+ ## 0.1.352 (2026-04-06)
4
+
5
+ ### Fixes
6
+ - pipeline Continue button shows immediate feedback
7
+ - skip meeting modal re-render when data unchanged
8
+
3
9
  ## 0.1.350 (2026-04-06)
4
10
 
5
11
  ### Fixes
@@ -3,6 +3,7 @@
3
3
  let _showArchived = false;
4
4
  const MTG_PER_PAGE = 10;
5
5
  let _mtgPage = 0;
6
+ let _lastMeetingHash = '';
6
7
 
7
8
  function renderMeetings(meetings) {
8
9
  meetings = (meetings || []).filter(function(m) { return !isDeleted('mtg:' + m.id); });
@@ -213,6 +214,7 @@ function openMeetingDetail(id) {
213
214
  .then(r => r.json())
214
215
  .then(data => {
215
216
  if (!data.meeting) { alert('Meeting not found'); return; }
217
+ _lastMeetingHash = JSON.stringify(data.meeting);
216
218
  _renderMeetingDetail(data.meeting);
217
219
 
218
220
  // Live-poll while modal is open
@@ -225,10 +227,10 @@ function openMeetingDetail(id) {
225
227
  .then(r => r.json())
226
228
  .then(d => {
227
229
  if (d.meeting && _meetingPollId === id) {
228
- const body = document.getElementById('modal-body');
229
- const savedScroll = body ? body.scrollTop : 0;
230
+ const hash = JSON.stringify(d.meeting);
231
+ if (hash === _lastMeetingHash) return; // no change — skip re-render
232
+ _lastMeetingHash = hash;
230
233
  _renderMeetingDetail(d.meeting);
231
- if (body) body.scrollTop = savedScroll;
232
234
  }
233
235
  })
234
236
  .catch(function() {});
@@ -253,13 +253,21 @@ async function _togglePipelineEnabled(id, enabled, btn) {
253
253
  }
254
254
 
255
255
  async function _continuePipeline(id, stageId, btn) {
256
- if (btn) { btn.textContent = 'Continuing...'; btn.style.pointerEvents = 'none'; }
256
+ if (btn) { btn.textContent = 'Continuing...'; btn.style.pointerEvents = 'none'; btn.style.opacity = '0.6'; }
257
257
  try {
258
258
  var res = await fetch('/api/pipelines/continue', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ id: id, stageId: stageId }) });
259
- if (res.ok) { showToast('cmd-toast', 'Stage continued', true); openPipelineDetail(id); }
260
- else { var d = await res.json().catch(function() { return {}; }); alert('Failed: ' + (d.error || 'unknown')); }
261
- } catch (e) { alert('Error: ' + e.message); }
262
- if (btn) { btn.textContent = 'Continue'; btn.style.pointerEvents = ''; }
259
+ if (res.ok) {
260
+ showToast('cmd-toast', 'Stage continued dispatching next tick', true);
261
+ if (btn) { btn.textContent = '\u2713 Continued'; btn.style.color = 'var(--green)'; btn.style.borderColor = 'var(--green)'; btn.style.opacity = '1'; }
262
+ setTimeout(function() { openPipelineDetail(id); }, 2000);
263
+ } else {
264
+ var d = await res.json().catch(function() { return {}; }); alert('Failed: ' + (d.error || 'unknown'));
265
+ if (btn) { btn.textContent = 'Continue'; btn.style.pointerEvents = ''; btn.style.opacity = ''; }
266
+ }
267
+ } catch (e) {
268
+ alert('Error: ' + e.message);
269
+ if (btn) { btn.textContent = 'Continue'; btn.style.pointerEvents = ''; btn.style.opacity = ''; }
270
+ }
263
271
  }
264
272
 
265
273
  async function _deletePipelineConfirm(id) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.350",
3
+ "version": "0.1.352",
4
4
  "description": "Multi-agent AI dev team that runs from ~/.minions/ — five autonomous agents share a single engine, dashboard, and knowledge base",
5
5
  "bin": {
6
6
  "minions": "bin/minions.js"