@yemi33/minions 0.1.1855 → 0.1.1856

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,10 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.1856 (2026-05-10)
4
+
5
+ ### Other
6
+ - ui(toast): add inline toast variant + scope KB sweep / meeting plan feedback locally
7
+
3
8
  ## 0.1.1855 (2026-05-10)
4
9
 
5
10
  ### Other
@@ -14,13 +14,15 @@ function cmdUpdateProjectList(projects) {
14
14
  function showToast(id, msg, ok, durationMs) {
15
15
  const el = document.getElementById(id);
16
16
  if (!el) { console.warn('[showToast] no element with id', id, '— message:', msg); return; }
17
- el.className = 'cmd-toast ' + (ok ? 'success' : 'error');
17
+ el.classList.add('cmd-toast');
18
+ el.classList.remove('success', 'error');
19
+ el.classList.add(ok ? 'success' : 'error');
18
20
  if (msg.includes('<a ') || msg.includes('<strong>')) {
19
21
  el.innerHTML = msg;
20
22
  } else {
21
23
  el.textContent = msg;
22
24
  }
23
- setTimeout(() => { el.className = 'cmd-toast'; }, durationMs || (msg.includes('<a ') ? 15000 : 4000));
25
+ setTimeout(() => { el.classList.remove('success', 'error'); }, durationMs || (msg.includes('<a ') ? 15000 : 4000));
24
26
  }
25
27
 
26
28
  function detectWorkItemType(text) {
@@ -152,12 +152,12 @@ async function kbSweep() {
152
152
  });
153
153
  const data = await res.json();
154
154
  if (!data.ok) {
155
- showToast('cmd-toast', 'Sweep failed: ' + (data.error || 'unknown'), false);
155
+ showToast('kb-sweep-toast', 'Sweep failed: ' + (data.error || 'unknown'), false);
156
156
  return;
157
157
  }
158
- showToast('cmd-toast', data.alreadyRunning ? 'KB sweep already running' : 'KB sweep queued', true);
158
+ showToast('kb-sweep-toast', data.alreadyRunning ? 'KB sweep already running' : 'KB sweep queued', true);
159
159
  } catch (e) {
160
- showToast('cmd-toast', 'Sweep error: ' + e.message, false);
160
+ showToast('kb-sweep-toast', 'Sweep error: ' + e.message, false);
161
161
  }
162
162
  }
163
163
 
@@ -192,14 +192,14 @@ async function submitKbEntry(e) {
192
192
  const content = document.getElementById('kb-new-content').value;
193
193
  if (!title || !content) { if (btn) { btn.disabled = false; btn.textContent = 'Save'; } alert('Title and content are required'); return; }
194
194
  try {
195
- showToast('cmd-toast', 'KB entry created', true);
195
+ showToast('kb-sweep-toast', 'KB entry created', true);
196
196
  const res = await fetch('/api/knowledge', {
197
197
  method: 'POST', headers: { 'Content-Type': 'application/json' },
198
198
  body: JSON.stringify({ category, title, content })
199
199
  });
200
200
  if (res.ok) { closeModal(); refreshKnowledgeBase(); }
201
- else { if (btn) { btn.disabled = false; btn.textContent = 'Save'; } const d = await res.json().catch(() => ({})); showToast('cmd-toast', 'KB create failed: ' + (d.error || 'unknown'), false); }
202
- } catch (err) { if (btn) { btn.disabled = false; btn.textContent = 'Save'; } showToast('cmd-toast', 'Error: ' + err.message, false); }
201
+ else { if (btn) { btn.disabled = false; btn.textContent = 'Save'; } const d = await res.json().catch(() => ({})); showToast('kb-sweep-toast', 'KB create failed: ' + (d.error || 'unknown'), false); }
202
+ } catch (err) { if (btn) { btn.disabled = false; btn.textContent = 'Save'; } showToast('kb-sweep-toast', 'Error: ' + err.message, false); }
203
203
  }
204
204
 
205
205
  async function kbOpenItem(category, file) {
@@ -191,6 +191,7 @@ function _renderMeetingDetail(m) {
191
191
  '<button class="pr-pager-btn" style="font-size:9px;padding:2px 8px" onclick="_archiveMeeting(\'' + escHtml(m.id) + '\')">Archive</button>' +
192
192
  '<button class="pr-pager-btn" style="font-size:9px;padding:2px 8px;color:var(--red);border-color:var(--red)" onclick="_deleteMeeting(\'' + escHtml(m.id) + '\')">Delete</button>' +
193
193
  '</div>' +
194
+ '<div id="meeting-plan-toast" class="cmd-toast cmd-toast-inline" style="margin-top:6px"></div>' +
194
195
  '<div style="font-size:9px;color:var(--muted);margin-top:4px">Use the Q&amp;A below to discuss action items' + (linkedPlan ? '' : ', then create a plan to execute them') + '.</div>';
195
196
  } else {
196
197
  html += '<div style="display:flex;gap:8px;border-top:1px solid var(--border);padding-top:8px">' +
@@ -422,7 +423,7 @@ async function _createPlanFromMeeting(id, btn) {
422
423
  try {
423
424
  const res = await fetch('/api/meetings/' + encodeURIComponent(id));
424
425
  const data = await res.json();
425
- if (!data.meeting) { showToast('cmd-toast', 'Meeting not found', false); return; }
426
+ if (!data.meeting) { showToast('meeting-plan-toast', 'Meeting not found', false); return; }
426
427
  const m = data.meeting;
427
428
 
428
429
  const existing = _findLinkedPlan(m);
@@ -457,14 +458,14 @@ async function _createPlanFromMeeting(id, btn) {
457
458
  });
458
459
  const planData = await planRes.json();
459
460
  if (!planRes.ok || !planData.ok) {
460
- showToast('cmd-toast', 'Failed to queue plan task: ' + (planData.error || 'unknown'), false);
461
+ showToast('meeting-plan-toast', 'Failed to queue plan task: ' + (planData.error || 'unknown'), false);
461
462
  return;
462
463
  }
463
- showToast('cmd-toast', 'Plan task queued' + (planData.id ? ' (' + planData.id + ')' : ''), true);
464
+ showToast('meeting-plan-toast', 'Plan task queued' + (planData.id ? ' (' + planData.id + ')' : ''), true);
464
465
  if (typeof wakeEngine === 'function') wakeEngine();
465
466
  if (typeof refresh === 'function') refresh();
466
467
  } catch (e) {
467
- showToast('cmd-toast', 'Error: ' + e.message, false);
468
+ showToast('meeting-plan-toast', 'Error: ' + e.message, false);
468
469
  }
469
470
  }
470
471
 
@@ -8,6 +8,7 @@
8
8
  </section>
9
9
  <section>
10
10
  <h2>Knowledge Base <span class="count" id="kb-count">0</span> <button class="pr-pager-btn" style="font-size:9px;padding:1px 6px;color:var(--green);border-color:var(--green);margin-left:8px" onclick="openCreateKbModal()">+ New</button><button id="kb-sweep-btn" onclick="kbSweep()" style="font-size:9px;padding:2px 8px;background:var(--surface2);border:1px solid var(--border);color:var(--muted);border-radius:4px;cursor:pointer;margin-left:8px;vertical-align:middle">sweep</button><span id="kb-swept-time" style="font-size:10px;color:var(--muted);font-weight:400;text-transform:none;letter-spacing:0;margin-left:8px"></span></h2>
11
+ <div id="kb-sweep-toast" class="cmd-toast cmd-toast-inline" style="margin:6px 0"></div>
11
12
  <div class="kb-tabs" id="kb-tabs"></div>
12
13
  <div class="kb-list" id="kb-list"><p class="empty">No knowledge entries yet. Notes are classified here after consolidation.</p></div>
13
14
  </section>
@@ -512,6 +512,9 @@
512
512
  }
513
513
  .cmd-toast.success { display: block; background: rgba(63,185,80,0.15); color: var(--green); border: 1px solid var(--green); }
514
514
  .cmd-toast.error { display: block; background: rgba(248,81,73,0.15); color: var(--red); border: 1px solid var(--red); }
515
+ /* Inline variant — overrides the floating top-right default for callers that want feedback in the local UI. */
516
+ .cmd-toast.cmd-toast-inline { position: static; box-shadow: none; max-width: 100%; }
517
+ .cmd-toast.cmd-toast-inline.success, .cmd-toast.cmd-toast-inline.error { display: block; }
515
518
  @keyframes fadeIn { from{opacity:0;transform:translateY(-4px)} to{opacity:1;transform:translateY(0)} }
516
519
 
517
520
  /* Engine Status */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.1855",
3
+ "version": "0.1.1856",
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"