@yemi33/minions 0.1.1585 → 0.1.1587
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/modal-qa.js +2 -2
- package/dashboard.js +3 -0
- package/engine/lifecycle.js +4 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 0.1.
|
|
3
|
+
## 0.1.1587 (2026-04-28)
|
|
4
4
|
|
|
5
5
|
### Fixes
|
|
6
|
+
- align doc chat timeout guards
|
|
7
|
+
- stop URL regex at backslash to prevent JSONL escape leakage
|
|
6
8
|
- optimistic UI for planApprove cascades to linked PRD
|
|
7
9
|
- stack chain-of-thought above progress block (was side-by-side)
|
|
8
10
|
|
package/dashboard/js/modal-qa.js
CHANGED
|
@@ -27,7 +27,7 @@ let _qaProcessing = false; // true while waiting for response
|
|
|
27
27
|
let _qaAbortController = null;
|
|
28
28
|
let _qaQueue = []; // queued messages while processing
|
|
29
29
|
const QA_QUEUE_CAP = 10; // max queued messages
|
|
30
|
-
const QA_STREAM_STALL_MS =
|
|
30
|
+
const QA_STREAM_STALL_MS = 6 * 60 * 1000; // allow the full doc-chat timeout before treating heartbeat-only streams as stalled
|
|
31
31
|
let _qaSessionKey = ''; // key for current conversation (title or filePath)
|
|
32
32
|
|
|
33
33
|
function _renderQaUserMessage(thread, message, selection) {
|
|
@@ -614,7 +614,7 @@ async function _processQaMessage(message, selection, opts) {
|
|
|
614
614
|
clearInterval(qaTimer);
|
|
615
615
|
_clearQaStreamWatchdog();
|
|
616
616
|
const qaElapsedExc = Math.round((Date.now() - qaStartTime) / 1000);
|
|
617
|
-
const stallMessage = 'Doc chat stalled with no tool or text progress for
|
|
617
|
+
const stallMessage = 'Doc chat stalled with no tool or text progress for 6 minutes.';
|
|
618
618
|
const messageHtml = _qaStreamStalled
|
|
619
619
|
? (streamedText
|
|
620
620
|
? _qaBuildAssistantHtml(streamedText + '\n\nError: ' + stallMessage, { borderColor: 'var(--red)', elapsed: qaElapsedExc })
|
package/dashboard.js
CHANGED
|
@@ -548,6 +548,7 @@ const ccLiveStreams = new Map(); // tabId → buffered live stream state for rec
|
|
|
548
548
|
const CC_INFLIGHT_TIMEOUT_MS = 2 * 60 * 1000; // 2 minutes — auto-release if request hangs
|
|
549
549
|
const CC_LOCK_WAIT_MS = 200; // grace period for previous handler's finally to release lock
|
|
550
550
|
const CC_STREAM_HEARTBEAT_MS = 15000; // keep streaming responses alive across proxies/restart races
|
|
551
|
+
const DOC_CHAT_TIMEOUT_MS = 360000; // allow longer doc-chat turns before timing out server-side
|
|
551
552
|
const CC_STREAM_REATTACH_GRACE_MS = 60000; // keep CC job alive briefly after disconnect so the UI can reattach
|
|
552
553
|
const CC_STREAM_DONE_RETENTION_MS = 30000; // retain final payload briefly so reconnect can still receive it
|
|
553
554
|
function _releaseCCTab(tabId) { ccInFlightTabs.delete(tabId); ccInFlightAborts.delete(tabId); }
|
|
@@ -1425,6 +1426,7 @@ async function ccDocCall({ message, document, title, filePath, selection, canEdi
|
|
|
1425
1426
|
const result = await ccCall(message, {
|
|
1426
1427
|
store: 'doc', sessionKey,
|
|
1427
1428
|
extraContext: docContext, label: 'doc-chat',
|
|
1429
|
+
timeout: DOC_CHAT_TIMEOUT_MS,
|
|
1428
1430
|
allowedTools: canEdit ? 'Read,Write,Edit,Glob,Grep' : 'Read,Glob,Grep',
|
|
1429
1431
|
maxTurns: canEdit ? 25 : 10,
|
|
1430
1432
|
skipStatePreamble: true,
|
|
@@ -1473,6 +1475,7 @@ async function ccDocCallStreaming({ message, document, title, filePath, selectio
|
|
|
1473
1475
|
const result = await ccCallStreaming(message, {
|
|
1474
1476
|
store: 'doc', sessionKey,
|
|
1475
1477
|
extraContext: docContext, label: 'doc-chat',
|
|
1478
|
+
timeout: DOC_CHAT_TIMEOUT_MS,
|
|
1476
1479
|
allowedTools: canEdit ? 'Read,Write,Edit,Glob,Grep' : 'Read,Glob,Grep',
|
|
1477
1480
|
maxTurns: canEdit ? 25 : 10,
|
|
1478
1481
|
skipStatePreamble: true,
|
package/engine/lifecycle.js
CHANGED
|
@@ -771,9 +771,11 @@ function syncPrsFromOutput(output, agentId, meta, config) {
|
|
|
771
771
|
|
|
772
772
|
// Extract PR URL directly from agent output — no manual construction
|
|
773
773
|
function extractPrUrl(prId) {
|
|
774
|
-
|
|
774
|
+
// Stop at backslash in addition to whitespace/quotes — raw JSONL encodes newlines as \n (literal
|
|
775
|
+
// backslash-n), so without this the regex would capture e.g. "pull/1804\n/usr/bin/bash".
|
|
776
|
+
const ghMatch = output.match(new RegExp(`https?://github\\.com/[^\\s"'\\)\\]\\\\]*?/pull/${prId}(?:[^\\s"'\\)\\]\\\\]*)`, 'i'));
|
|
775
777
|
if (ghMatch) return ghMatch[0].replace(/[.,;:]+$/, '');
|
|
776
|
-
const adoMatch = output.match(new RegExp(`https?://(?:dev\\.azure\\.com|[^/]+\\.visualstudio\\.com)[^\\s"'\\)\\]]*?pullrequest/${prId}(?:[^\\s"'\\)\\]]*)`, 'i'));
|
|
778
|
+
const adoMatch = output.match(new RegExp(`https?://(?:dev\\.azure\\.com|[^/]+\\.visualstudio\\.com)[^\\s"'\\)\\]\\\\]*?pullrequest/${prId}(?:[^\\s"'\\)\\]\\\\]*)`, 'i'));
|
|
777
779
|
if (adoMatch) return adoMatch[0].replace(/[.,;:]+$/, '');
|
|
778
780
|
return '';
|
|
779
781
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yemi33/minions",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1587",
|
|
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"
|