@yemi33/minions 0.1.338 → 0.1.339

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,10 +1,13 @@
1
1
  # Changelog
2
2
 
3
- ## 0.1.338 (2026-04-04)
3
+ ## 0.1.339 (2026-04-04)
4
4
 
5
5
  ### Features
6
6
  - add Reset to Defaults button in settings modal
7
7
 
8
+ ### Fixes
9
+ - CC stop button kills LLM process immediately + fix text/copy overlap
10
+
8
11
  ## 0.1.337 (2026-04-03)
9
12
 
10
13
  ### 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(--muted);font-size:11px">Stopped</span>');
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();
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
- // Clear ccInFlight if client disconnects mid-stream
3026
- req.on('close', () => { ccInFlight = false; ccInFlightSince = 0; });
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 result = await callLLMStreaming(prompt, CC_STATIC_SYSTEM_PROMPT, {
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
- return new Promise((resolve) => {
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.338",
3
+ "version": "0.1.339",
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"