@yemi33/minions 0.1.338 → 0.1.340
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/command-center.js +2 -2
- package/dashboard/js/render-work-items.js +1 -1
- package/dashboard.js +6 -3
- package/engine/llm.js +6 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 0.1.
|
|
3
|
+
## 0.1.340 (2026-04-04)
|
|
4
4
|
|
|
5
5
|
### Features
|
|
6
6
|
- add Reset to Defaults button in settings modal
|
|
7
7
|
|
|
8
|
+
### Fixes
|
|
9
|
+
- work items table shows date (YYYY-MM-DD) instead of time-only
|
|
10
|
+
- CC stop button kills LLM process immediately + fix text/copy overlap
|
|
11
|
+
|
|
8
12
|
## 0.1.337 (2026-04-03)
|
|
9
13
|
|
|
10
14
|
### Fixes
|
|
@@ -312,9 +312,9 @@ async function _ccDoSend(message, skipUserMsg) {
|
|
|
312
312
|
if (e.name === 'AbortError') {
|
|
313
313
|
if (streamedText) {
|
|
314
314
|
const ccElapsed = Math.round((Date.now() - ccStartTime) / 1000);
|
|
315
|
-
ccAddMessage('assistant', renderMd(streamedText) + '<div style="font-size:9px;color:var(--muted);margin-top:6px">Stopped after ' + ccElapsed + 's</div>');
|
|
315
|
+
ccAddMessage('assistant', renderMd(streamedText) + '<div style="font-size:9px;color:var(--muted);margin-top:6px;display:flex;justify-content:flex-end;padding-right:30px">Stopped after ' + ccElapsed + 's</div>');
|
|
316
316
|
} else {
|
|
317
|
-
ccAddMessage('assistant', '<span style="color:var(--
|
|
317
|
+
ccAddMessage('assistant', '<span style="color:var(--red);font-size:11px">Stopped</span>');
|
|
318
318
|
}
|
|
319
319
|
} else {
|
|
320
320
|
const retryId = 'cc-retry-' + Date.now();
|
|
@@ -56,7 +56,7 @@ function wiRow(item) {
|
|
|
56
56
|
(item.failReason ? '<span style="display:block;font-size:9px;color:var(--red)" title="' + escHtml(item.failReason) + '">' + escHtml(item.failReason.slice(0, 30)) + '</span>' : '') +
|
|
57
57
|
'</td>' +
|
|
58
58
|
'<td>' + prLink + '</td>' +
|
|
59
|
-
'<td><span class="pr-date">' +
|
|
59
|
+
'<td><span class="pr-date">' + escHtml((item.created || '').slice(0, 10)) + '</span></td>' +
|
|
60
60
|
'<td style="white-space:nowrap;font-size:9px;color:var(--muted)">' +
|
|
61
61
|
(item.references && item.references.length ? '<span title="' + item.references.length + ' reference(s)" style="margin-right:4px">🔗' + item.references.length + '</span>' : '') +
|
|
62
62
|
(item.acceptanceCriteria && item.acceptanceCriteria.length ? '<span title="' + item.acceptanceCriteria.length + ' acceptance criteria">☑' + item.acceptanceCriteria.length + '</span>' : '') +
|
package/dashboard.js
CHANGED
|
@@ -3022,8 +3022,9 @@ What would you like to discuss or change? When you're happy, say "approve" and I
|
|
|
3022
3022
|
ccInFlightSince = Date.now();
|
|
3023
3023
|
|
|
3024
3024
|
res.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive' });
|
|
3025
|
-
|
|
3026
|
-
|
|
3025
|
+
let _ccStreamAbort = null;
|
|
3026
|
+
// Kill LLM process immediately if client disconnects mid-stream
|
|
3027
|
+
req.on('close', () => { ccInFlight = false; ccInFlightSince = 0; if (_ccStreamAbort) _ccStreamAbort(); });
|
|
3027
3028
|
|
|
3028
3029
|
try {
|
|
3029
3030
|
// Session management — same as non-streaming path
|
|
@@ -3036,7 +3037,7 @@ What would you like to discuss or change? When you're happy, say "approve" and I
|
|
|
3036
3037
|
const prompt = preamble + '\n\n---\n\n' + body.message;
|
|
3037
3038
|
|
|
3038
3039
|
const { callLLMStreaming, trackEngineUsage: trackUsage } = require('./engine/llm');
|
|
3039
|
-
const
|
|
3040
|
+
const llmPromise = callLLMStreaming(prompt, CC_STATIC_SYSTEM_PROMPT, {
|
|
3040
3041
|
timeout: 900000, label: 'command-center', model: 'sonnet', maxTurns: 50,
|
|
3041
3042
|
allowedTools: 'Bash,Read,Write,Edit,Glob,Grep,WebFetch,WebSearch',
|
|
3042
3043
|
sessionId,
|
|
@@ -3047,6 +3048,8 @@ What would you like to discuss or change? When you're happy, say "approve" and I
|
|
|
3047
3048
|
try { res.write('data: ' + JSON.stringify({ type: 'tool', name, input: typeof input === 'string' ? input.slice(0, 200) : JSON.stringify(input).slice(0, 200) }) + '\n\n'); } catch {}
|
|
3048
3049
|
}
|
|
3049
3050
|
});
|
|
3051
|
+
_ccStreamAbort = llmPromise.abort;
|
|
3052
|
+
const result = await llmPromise;
|
|
3050
3053
|
trackUsage('command-center', result.usage);
|
|
3051
3054
|
|
|
3052
3055
|
// Handle failure — same error reporting as non-streaming
|
package/engine/llm.js
CHANGED
|
@@ -114,7 +114,8 @@ function isResumeSessionStillValid(result) {
|
|
|
114
114
|
* onChunk(text) is called for each assistant text block as it arrives.
|
|
115
115
|
*/
|
|
116
116
|
function callLLMStreaming(promptText, sysPromptText, { timeout = 120000, label = 'llm', model = 'sonnet', maxTurns = 1, allowedTools = '', sessionId = null, onChunk = () => {}, onToolUse = null } = {}) {
|
|
117
|
-
|
|
117
|
+
let _abort = null;
|
|
118
|
+
const promise = new Promise((resolve) => {
|
|
118
119
|
const id = uid();
|
|
119
120
|
const tmpDir = path.join(ENGINE_DIR, 'tmp');
|
|
120
121
|
if (!require('fs').existsSync(tmpDir)) require('fs').mkdirSync(tmpDir, { recursive: true });
|
|
@@ -135,6 +136,8 @@ function callLLMStreaming(promptText, sysPromptText, { timeout = 120000, label =
|
|
|
135
136
|
|
|
136
137
|
const proc = runFile(process.execPath, args, { cwd: MINIONS_DIR, stdio: ['pipe', 'pipe', 'pipe'], env: cleanChildEnv() });
|
|
137
138
|
|
|
139
|
+
_abort = () => { shared.killImmediate(proc); };
|
|
140
|
+
|
|
138
141
|
let stdout = '';
|
|
139
142
|
let stderr = '';
|
|
140
143
|
let lineBuf = '';
|
|
@@ -197,6 +200,8 @@ function callLLMStreaming(promptText, sysPromptText, { timeout = 120000, label =
|
|
|
197
200
|
resolve({ text: '', usage: null, sessionId: null, code: 1, stderr: err.message, raw: '' });
|
|
198
201
|
});
|
|
199
202
|
});
|
|
203
|
+
promise.abort = () => { if (_abort) _abort(); };
|
|
204
|
+
return promise;
|
|
200
205
|
}
|
|
201
206
|
|
|
202
207
|
module.exports = {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yemi33/minions",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.340",
|
|
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"
|