@yemi33/minions 0.1.684 → 0.1.686
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 +5 -1
- package/dashboard/js/modal-qa.js +28 -4
- package/dashboard/js/render-work-items.js +3 -1
- package/dashboard/layout.html +10 -4
- package/engine/queries.js +7 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 0.1.
|
|
3
|
+
## 0.1.686 (2026-04-09)
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
- collapsible doc-chat thread in modal
|
|
4
7
|
|
|
5
8
|
### Fixes
|
|
9
|
+
- add archive fallback for artifact notes when KB entry was swept
|
|
6
10
|
- link work item artifacts to KB entries, not raw archive copies
|
|
7
11
|
|
|
8
12
|
## 0.1.683 (2026-04-09)
|
package/dashboard/js/modal-qa.js
CHANGED
|
@@ -98,11 +98,11 @@ function _initQaSession() {
|
|
|
98
98
|
});
|
|
99
99
|
}
|
|
100
100
|
if (prior.filePath) _modalFilePath = prior.filePath;
|
|
101
|
-
|
|
101
|
+
_showThreadWrap();
|
|
102
102
|
} else {
|
|
103
103
|
_qaHistory = [];
|
|
104
104
|
document.getElementById('modal-qa-thread').innerHTML = '';
|
|
105
|
-
|
|
105
|
+
_hideThreadWrap();
|
|
106
106
|
}
|
|
107
107
|
}
|
|
108
108
|
|
|
@@ -111,7 +111,7 @@ function clearQaConversation() {
|
|
|
111
111
|
_qaQueue = [];
|
|
112
112
|
_qaProcessing = false;
|
|
113
113
|
document.getElementById('modal-qa-thread').innerHTML = '';
|
|
114
|
-
|
|
114
|
+
_hideThreadWrap();
|
|
115
115
|
if (_qaSessionKey) _qaSessions.delete(_qaSessionKey);
|
|
116
116
|
}
|
|
117
117
|
|
|
@@ -146,6 +146,7 @@ function modalSend() {
|
|
|
146
146
|
qHtml += '</div>';
|
|
147
147
|
thread.innerHTML += qHtml;
|
|
148
148
|
thread.scrollTop = thread.scrollHeight;
|
|
149
|
+
_showThreadWrap();
|
|
149
150
|
|
|
150
151
|
// Clear input immediately so user can type next message
|
|
151
152
|
input.value = '';
|
|
@@ -334,4 +335,27 @@ function qaAbort() {
|
|
|
334
335
|
}
|
|
335
336
|
}
|
|
336
337
|
|
|
337
|
-
|
|
338
|
+
function toggleDocChat() {
|
|
339
|
+
var wrap = document.getElementById('modal-qa-thread-wrap');
|
|
340
|
+
var expandBar = document.getElementById('qa-expand-bar');
|
|
341
|
+
if (!wrap) return;
|
|
342
|
+
var isVisible = wrap.style.display !== 'none';
|
|
343
|
+
wrap.style.display = isVisible ? 'none' : '';
|
|
344
|
+
if (expandBar) expandBar.style.display = isVisible ? '' : 'none';
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
function _showThreadWrap() {
|
|
348
|
+
var wrap = document.getElementById('modal-qa-thread-wrap');
|
|
349
|
+
var expandBar = document.getElementById('qa-expand-bar');
|
|
350
|
+
if (wrap) wrap.style.display = '';
|
|
351
|
+
if (expandBar) expandBar.style.display = 'none';
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
function _hideThreadWrap() {
|
|
355
|
+
var wrap = document.getElementById('modal-qa-thread-wrap');
|
|
356
|
+
var expandBar = document.getElementById('qa-expand-bar');
|
|
357
|
+
if (wrap) wrap.style.display = 'none';
|
|
358
|
+
if (expandBar) expandBar.style.display = 'none';
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
window.MinionsQA = { showModalQa, modalAskAboutSelection, clearQaSelection, clearQaConversation, modalSend, qaAbort, toggleDocChat };
|
|
@@ -458,13 +458,15 @@ function openWorkItemDetail(id) {
|
|
|
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
460
|
var noteFile = (n && typeof n === 'object') ? (n.file || n) : String(n || '');
|
|
461
|
-
// KB entries prefixed with 'kb:category/file'
|
|
462
461
|
if (noteFile.startsWith('kb:')) {
|
|
463
462
|
var kbParts = noteFile.slice(3).split('/');
|
|
464
463
|
var kbCat = kbParts[0];
|
|
465
464
|
var kbFile = kbParts.slice(1).join('/');
|
|
466
465
|
var kbLabel = kbFile.replace(/\.md$/, '').slice(0, 30);
|
|
467
466
|
artPills += '<span onclick="kbOpenItem(\'' + escHtml(kbCat) + '\',\'' + escHtml(kbFile) + '\')" style="' + pillStyle + '">📚 ' + escHtml(kbLabel) + '</span> ';
|
|
467
|
+
} else if (noteFile.startsWith('archive:')) {
|
|
468
|
+
var archLabel = noteFile.slice(8).replace(/\.md$/, '').replace(/^\d{4}-\d{2}-\d{2}-/, '').slice(0, 30);
|
|
469
|
+
artPills += '<span onclick="openInboxNote(\'' + escHtml(noteFile.slice(8)) + '\')" style="' + pillStyle + ';opacity:0.7">📄 ' + escHtml(archLabel) + ' <span style="font-size:8px">(archived)</span></span> ';
|
|
468
470
|
} else {
|
|
469
471
|
var noteLabel = noteFile.replace(/\.md$/, '').slice(0, 30);
|
|
470
472
|
artPills += '<span onclick="openInboxNote(\'' + escHtml(noteFile) + '\')" style="' + pillStyle + '">📝 ' + escHtml(noteLabel) + '</span> ';
|
package/dashboard/layout.html
CHANGED
|
@@ -108,9 +108,15 @@
|
|
|
108
108
|
</div>
|
|
109
109
|
<div class="modal-body" id="modal-body"></div>
|
|
110
110
|
<div class="modal-qa" id="modal-qa" style="display:none">
|
|
111
|
-
<div
|
|
112
|
-
<div
|
|
113
|
-
|
|
111
|
+
<div id="modal-qa-thread-wrap" style="display:none">
|
|
112
|
+
<div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:4px">
|
|
113
|
+
<button id="qa-clear-btn" style="background:none;border:none;color:var(--muted);font-size:10px;cursor:pointer;padding:2px 6px" onclick="clearQaConversation()" title="Clear conversation">Clear</button>
|
|
114
|
+
<button id="qa-toggle-btn" style="background:none;border:none;color:var(--muted);font-size:10px;cursor:pointer;padding:2px 6px" onclick="toggleDocChat()" title="Collapse thread">▼ Collapse</button>
|
|
115
|
+
</div>
|
|
116
|
+
<div class="modal-qa-thread" id="modal-qa-thread"></div>
|
|
117
|
+
</div>
|
|
118
|
+
<div id="qa-expand-bar" style="display:none;margin-bottom:4px">
|
|
119
|
+
<button style="background:none;border:none;color:var(--muted);font-size:10px;cursor:pointer;padding:2px 6px" onclick="toggleDocChat()">▲ Show thread</button>
|
|
114
120
|
</div>
|
|
115
121
|
<div class="modal-qa-selection-pill" id="modal-qa-pill" style="display:none">
|
|
116
122
|
<span class="pill-label">Selection:</span>
|
|
@@ -118,7 +124,7 @@
|
|
|
118
124
|
<button class="pill-clear" onclick="clearQaSelection()" title="Clear selection">×</button>
|
|
119
125
|
</div>
|
|
120
126
|
<div class="modal-qa-input-wrap">
|
|
121
|
-
<input type="text" class="modal-qa-input" id="modal-qa-input" placeholder="Ask about this document..." onkeydown="if(event.key==='Enter')modalSend()">
|
|
127
|
+
<input type="text" class="modal-qa-input" id="modal-qa-input" placeholder="Ask about this document (or select text first)..." onkeydown="if(event.key==='Enter')modalSend()">
|
|
122
128
|
<button class="modal-qa-btn" id="modal-send-btn" onclick="modalSend()">Send</button>
|
|
123
129
|
</div>
|
|
124
130
|
</div>
|
package/engine/queries.js
CHANGED
|
@@ -721,6 +721,7 @@ function getWorkItems(config) {
|
|
|
721
721
|
}
|
|
722
722
|
const _agentDirCache = {};
|
|
723
723
|
const _inboxFiles = safeReadDir(INBOX_DIR);
|
|
724
|
+
const _archiveFiles = safeReadDir(ARCHIVE_DIR);
|
|
724
725
|
// Use cached KB entries (includes source frontmatter field)
|
|
725
726
|
const _kbEntries = getKnowledgeBaseEntries();
|
|
726
727
|
for (const item of allItems) {
|
|
@@ -736,7 +737,7 @@ function getWorkItems(config) {
|
|
|
736
737
|
const matchLog = _agentDirCache[agentId].find(f => f.includes(dispatchId));
|
|
737
738
|
if (matchLog) arts.outputLog = agentId + '/' + matchLog;
|
|
738
739
|
}
|
|
739
|
-
// Notes:
|
|
740
|
+
// Notes: inbox → KB (via source field) → archive (fallback if KB was swept)
|
|
740
741
|
const itemId = item.id || '___';
|
|
741
742
|
const matchInbox = _inboxFiles.filter(f => f.includes(agentId) && f.includes(itemId));
|
|
742
743
|
const matchKb = _kbEntries.filter(kb => kb.source && kb.source.includes(agentId) && kb.source.includes(itemId));
|
|
@@ -744,6 +745,11 @@ function getWorkItems(config) {
|
|
|
744
745
|
...matchInbox,
|
|
745
746
|
...matchKb.map(kb => 'kb:' + kb.cat + '/' + kb.file),
|
|
746
747
|
];
|
|
748
|
+
// Archive fallback — only if nothing found in inbox or KB
|
|
749
|
+
if (allNotes.length === 0) {
|
|
750
|
+
const matchArchive = _archiveFiles.filter(f => f.includes(agentId) && f.includes(itemId));
|
|
751
|
+
for (const f of matchArchive) allNotes.push('archive:' + f);
|
|
752
|
+
}
|
|
747
753
|
if (allNotes.length > 0) arts.notes = allNotes;
|
|
748
754
|
}
|
|
749
755
|
if (item.branch || item.featureBranch) arts.branch = item.branch || item.featureBranch;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yemi33/minions",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.686",
|
|
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"
|