@yemi33/minions 0.1.670 → 0.1.672

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,8 +1,12 @@
1
1
  # Changelog
2
2
 
3
- ## 0.1.670 (2026-04-09)
3
+ ## 0.1.672 (2026-04-09)
4
+
5
+ ### Features
6
+ - populate _artifacts on work items for detail modal
4
7
 
5
8
  ### Fixes
9
+ - cache dir listings in artifact population, make notes clickable
6
10
  - surface blocking tool call state in dashboard (closes #619) (#634)
7
11
  - interrupt blocking tool calls immediately on steering (closes #627) (#632)
8
12
  - reduce Bash blocking grace and errored task dedup window (closes #593) (#630)
@@ -457,8 +457,9 @@ function openWorkItemDetail(id) {
457
457
  if (arts.prd) artPills += '<span onclick="planView(\'' + escHtml(arts.prd) + '\')" style="' + pillStyle + '">📄 PRD</span> ';
458
458
  if (arts.sourcePlan) artPills += '<span onclick="planView(\'' + escHtml(arts.sourcePlan) + '\')" style="' + pillStyle + '">📋 Source Plan</span> ';
459
459
  if (arts.notes && arts.notes.length > 0) arts.notes.forEach(function(n) {
460
- var noteLabel = (n && typeof n === 'object') ? (n.id || n.file || 'note').slice(0, 30) : String(n || 'note').replace(/\.md$/, '').slice(0, 30);
461
- artPills += '<span onclick="closeModal();switchPage(\'inbox\')" style="' + pillStyle + '">📝 ' + escHtml(noteLabel) + '</span> ';
460
+ var noteFile = (n && typeof n === 'object') ? (n.file || n) : String(n || '');
461
+ var noteLabel = noteFile.replace(/\.md$/, '').slice(0, 30);
462
+ artPills += '<span onclick="openInboxNote(\'' + escHtml(noteFile) + '\')" style="' + pillStyle + '">📝 ' + escHtml(noteLabel) + '</span> ';
462
463
  });
463
464
  if (arts.skills && arts.skills.length > 0) arts.skills.forEach(function(s) { artPills += '<span onclick="openSkill(\'' + escHtml(s) + '\',\'minions\',\'\')" style="' + pillStyle + '">⚙ ' + escHtml(s) + '</span> '; });
464
465
  if (artPills) html += field('Artifacts', '<div style="display:flex;flex-wrap:wrap;gap:4px">' + artPills + '</div>');
@@ -501,4 +502,16 @@ function viewAgentOutput(logPath) {
501
502
  });
502
503
  }
503
504
 
504
- window.MinionsWork = { wiRow, renderWorkItems, editWorkItem, submitWorkItemEdit, deleteWorkItem, archiveWorkItem, toggleWorkItemArchive, retryWorkItem, wiPrev, wiNext, feedbackWorkItem, submitFeedback, openCreateWorkItemModal, openWorkItemDetail, openAllWorkItems, viewAgentOutput };
505
+ function openInboxNote(filename) {
506
+ // Find in inboxData by filename, or open directly via fetch
507
+ var idx = (inboxData || []).findIndex(function(item) { return item.name === filename; });
508
+ if (idx >= 0) {
509
+ openModal(idx);
510
+ } else {
511
+ // Fallback: switch to inbox page
512
+ closeModal();
513
+ switchPage('inbox');
514
+ }
515
+ }
516
+
517
+ window.MinionsWork = { wiRow, renderWorkItems, editWorkItem, submitWorkItemEdit, deleteWorkItem, archiveWorkItem, toggleWorkItemArchive, retryWorkItem, wiPrev, wiNext, feedbackWorkItem, submitFeedback, openCreateWorkItemModal, openWorkItemDetail, openAllWorkItems, viewAgentOutput, openInboxNote };
package/engine/queries.js CHANGED
@@ -706,6 +706,31 @@ function getWorkItems(config) {
706
706
  }
707
707
  }
708
708
 
709
+ // Populate _artifacts for the work item detail modal
710
+ // Cache directory listings to avoid N × readdirSync
711
+ const _agentDirCache = {};
712
+ const _inboxFiles = safeReadDir(INBOX_DIR);
713
+ for (const item of allItems) {
714
+ const arts = {};
715
+ const agentId = item.dispatched_to || item.agent;
716
+ if (agentId) {
717
+ const idSuffix = item.id?.slice(-8) || '___';
718
+ // Output log
719
+ if (!_agentDirCache[agentId]) {
720
+ _agentDirCache[agentId] = safeReadDir(path.join(MINIONS_DIR, 'agents', agentId)).filter(f => f.startsWith('output-') && f.endsWith('.log'));
721
+ }
722
+ const matchLog = _agentDirCache[agentId].filter(f => f.includes(idSuffix));
723
+ if (matchLog.length > 0) arts.outputLog = agentId + '/' + matchLog[matchLog.length - 1];
724
+ // Inbox notes
725
+ const matchNotes = _inboxFiles.filter(f => f.includes(agentId) && (f.includes(item.id || '___') || f.includes(idSuffix)));
726
+ if (matchNotes.length > 0) arts.notes = matchNotes;
727
+ }
728
+ if (item.branch) arts.branch = item.branch;
729
+ if (item.sourcePlan) arts.sourcePlan = item.sourcePlan;
730
+ if (item._pr) arts.pr = item._pr;
731
+ if (Object.keys(arts).length > 0) item._artifacts = arts;
732
+ }
733
+
709
734
  const statusOrder = {
710
735
  pending: 0,
711
736
  queued: 0,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.670",
3
+ "version": "0.1.672",
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"