@yemi33/minions 0.1.867 → 0.1.869
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 +3 -1
- package/dashboard/js/detail-panel.js +13 -0
- package/dashboard/js/render-agents.js +30 -0
- package/engine/queries.js +2 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 0.1.
|
|
3
|
+
## 0.1.869 (2026-04-11)
|
|
4
4
|
|
|
5
5
|
### Features
|
|
6
|
+
- ticking runtime counter on working agent cards
|
|
7
|
+
- show run duration on agent cards and thought-process tab
|
|
6
8
|
- live runtime counter on agent live output tab
|
|
7
9
|
- optimistic running state on pipeline Run Now click
|
|
8
10
|
|
|
@@ -44,6 +44,19 @@ function renderDetailContent(detail, tab) {
|
|
|
44
44
|
if (detail.statusData.task) html += 'Task: ' + escHtml(detail.statusData.task) + '\n';
|
|
45
45
|
if (detail.statusData.started_at) html += 'Started: ' + detail.statusData.started_at + '\n';
|
|
46
46
|
if (detail.statusData.completed_at) html += 'Completed: ' + detail.statusData.completed_at + '\n';
|
|
47
|
+
if (detail.statusData.started_at && detail.statusData.completed_at) {
|
|
48
|
+
var dMs = new Date(detail.statusData.completed_at).getTime() - new Date(detail.statusData.started_at).getTime();
|
|
49
|
+
if (dMs > 0) {
|
|
50
|
+
var dSec = Math.floor(dMs / 1000) % 60, dMin = Math.floor(dMs / 60000) % 60, dHr = Math.floor(dMs / 3600000);
|
|
51
|
+
html += 'Duration: ' + (dHr > 0 ? dHr + 'h ' : '') + dMin + 'm ' + dSec + 's\n';
|
|
52
|
+
}
|
|
53
|
+
} else if (detail.statusData.started_at && detail.statusData.status === 'working') {
|
|
54
|
+
var rMs = Date.now() - new Date(detail.statusData.started_at).getTime();
|
|
55
|
+
if (rMs > 0) {
|
|
56
|
+
var rSec = Math.floor(rMs / 1000) % 60, rMin = Math.floor(rMs / 60000) % 60, rHr = Math.floor(rMs / 3600000);
|
|
57
|
+
html += 'Running: ' + (rHr > 0 ? rHr + 'h ' : '') + rMin + 'm ' + rSec + 's\n';
|
|
58
|
+
}
|
|
59
|
+
}
|
|
47
60
|
html += '</div>';
|
|
48
61
|
if (detail.statusData.resultSummary) {
|
|
49
62
|
html += '<h4>Last Result</h4><div class="section" style="border-left:3px solid var(--green);padding-left:12px">' + renderMd(detail.statusData.resultSummary) + '</div>';
|
|
@@ -11,6 +11,12 @@ function renderAgents(agents) {
|
|
|
11
11
|
</div>
|
|
12
12
|
<div class="agent-role">${escHtml(a.role)}</div>
|
|
13
13
|
<div class="agent-action" title="${escHtml(a.lastAction)}">${escHtml(a.lastAction)}</div>
|
|
14
|
+
${(function() {
|
|
15
|
+
var s = a.started_at, c = a.completed_at;
|
|
16
|
+
if (s && c) { var d = new Date(c) - new Date(s); if (d > 0) { var sec = Math.floor(d/1000)%60, min = Math.floor(d/60000)%60, hr = Math.floor(d/3600000); return '<div style="font-size:9px;color:var(--muted)">Last run: ' + (hr > 0 ? hr + 'h ' : '') + min + 'm ' + sec + 's</div>'; } }
|
|
17
|
+
if (s && a.status === 'working') return '<div class="agent-runtime-tick" data-started="' + s + '" style="font-size:9px;color:var(--yellow)"></div>';
|
|
18
|
+
return '';
|
|
19
|
+
})()}
|
|
14
20
|
${a._blockingToolCall ? `<div style="margin-top:4px;padding:4px 8px;background:rgba(130,160,210,0.13);border:1px solid rgba(130,160,210,0.3);border-radius:4px;font-size:10px;color:var(--muted)">⏳ Blocking tool call (${escHtml(a._blockingToolCall.tool)}) — silent ${Math.round(a._blockingToolCall.silentMs/60000)}min, timeout in ${Math.round(a._blockingToolCall.remainingMs/60000)}min</div>` : ''}
|
|
15
21
|
${a._warning ? `<div style="margin-top:4px;padding:4px 8px;background:rgba(210,153,34,0.15);border:1px solid rgba(210,153,34,0.3);border-radius:4px;font-size:10px;color:var(--yellow)">⚠ ${escHtml(a._warning)}</div>` : ''}
|
|
16
22
|
${a._permissionMode && a._permissionMode !== 'bypassPermissions' && !a._warning ? `<div style="margin-top:4px;font-size:9px;color:var(--muted)">Permission mode: ${escHtml(a._permissionMode)}</div>` : ''}
|
|
@@ -55,4 +61,28 @@ async function openAgentDetail(id) {
|
|
|
55
61
|
|
|
56
62
|
}
|
|
57
63
|
|
|
64
|
+
// Tick running agent timers on cards every second
|
|
65
|
+
var _agentRuntimeTimer = null;
|
|
66
|
+
function _tickAgentRuntimes() {
|
|
67
|
+
var els = document.querySelectorAll('.agent-runtime-tick');
|
|
68
|
+
if (els.length === 0) { if (_agentRuntimeTimer) { clearInterval(_agentRuntimeTimer); _agentRuntimeTimer = null; } return; }
|
|
69
|
+
var now = Date.now();
|
|
70
|
+
els.forEach(function(el) {
|
|
71
|
+
var ms = now - new Date(el.dataset.started).getTime();
|
|
72
|
+
if (ms < 0) ms = 0;
|
|
73
|
+
var sec = Math.floor(ms / 1000) % 60, min = Math.floor(ms / 60000) % 60, hr = Math.floor(ms / 3600000);
|
|
74
|
+
el.textContent = 'Running: ' + (hr > 0 ? hr + 'h ' : '') + min + 'm ' + sec + 's';
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
// Start ticker after each render if working agents exist
|
|
78
|
+
var _origRenderAgents = renderAgents;
|
|
79
|
+
renderAgents = function(agents) {
|
|
80
|
+
_origRenderAgents(agents);
|
|
81
|
+
if (_agentRuntimeTimer) { clearInterval(_agentRuntimeTimer); _agentRuntimeTimer = null; }
|
|
82
|
+
if (agents.some(function(a) { return a.status === 'working' && a.started_at; })) {
|
|
83
|
+
_tickAgentRuntimes();
|
|
84
|
+
_agentRuntimeTimer = setInterval(_tickAgentRuntimes, 1000);
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
|
|
58
88
|
window.MinionsAgents = { renderAgents, openAgentDetail };
|
package/engine/queries.js
CHANGED
|
@@ -341,6 +341,8 @@ function getAgents(config) {
|
|
|
341
341
|
...a, status: s.status, lastAction,
|
|
342
342
|
currentTask: (s.task || '').slice(0, 200),
|
|
343
343
|
resultSummary: (s.resultSummary || '').slice(0, 500),
|
|
344
|
+
started_at: s.started_at || null,
|
|
345
|
+
completed_at: s.completed_at || null,
|
|
344
346
|
_blockingToolCall: s._blockingToolCall || null,
|
|
345
347
|
_warning: s._warning || null,
|
|
346
348
|
_permissionMode: s._permissionMode || null,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yemi33/minions",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.869",
|
|
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"
|