viewgate-mcp 1.0.48 → 1.0.49
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/dist/index.js +29 -7
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -53,6 +53,7 @@ function createMcpServer(apiKey, personalKey) {
|
|
|
53
53
|
step: 0,
|
|
54
54
|
startedAt: Date.now(),
|
|
55
55
|
lastActivityAt: Date.now(),
|
|
56
|
+
lockTokens: {},
|
|
56
57
|
};
|
|
57
58
|
function resetGuard() {
|
|
58
59
|
guard.flow = "idle";
|
|
@@ -60,6 +61,8 @@ function createMcpServer(apiKey, personalKey) {
|
|
|
60
61
|
guard.lastTool = undefined;
|
|
61
62
|
guard.startedAt = Date.now();
|
|
62
63
|
guard.lastActivityAt = Date.now();
|
|
64
|
+
guard.lockTokens = {};
|
|
65
|
+
guard.backlogVersion = undefined;
|
|
63
66
|
}
|
|
64
67
|
function getToolFlow(toolName) {
|
|
65
68
|
switch (toolName) {
|
|
@@ -533,7 +536,13 @@ function createMcpServer(apiKey, personalKey) {
|
|
|
533
536
|
if (!Array.isArray(rawAnnotations)) {
|
|
534
537
|
return { content: [{ type: "text", text: "Error: Invalid format from backend" }], isError: true };
|
|
535
538
|
}
|
|
536
|
-
|
|
539
|
+
// Point: Lease Collection | Store lockTokens in the session guard
|
|
540
|
+
rawAnnotations.forEach((ann) => {
|
|
541
|
+
if (ann._id && ann.lockToken) {
|
|
542
|
+
guard.lockTokens[ann._id] = ann.lockToken;
|
|
543
|
+
}
|
|
544
|
+
});
|
|
545
|
+
console.error(`[MCP] Received ${rawAnnotations.length} annotations. Tokens stored: ${Object.keys(guard.lockTokens).length}`);
|
|
537
546
|
// Local filtering fallback (for older backend versions or additional client-side safety)
|
|
538
547
|
if (search) {
|
|
539
548
|
const lowSearch = search.toLowerCase();
|
|
@@ -617,7 +626,11 @@ Lang: ${rawData.preferredLanguage === 'es' ? 'ES' : 'EN'}
|
|
|
617
626
|
'x-personal-key': personalKey || ''
|
|
618
627
|
},
|
|
619
628
|
body: JSON.stringify({
|
|
620
|
-
results: results.map((r) => ({
|
|
629
|
+
results: results.map((r) => ({
|
|
630
|
+
...r,
|
|
631
|
+
status: 'applied',
|
|
632
|
+
lockToken: guard.lockTokens[r.id] // Attach the session-locked token
|
|
633
|
+
}))
|
|
621
634
|
})
|
|
622
635
|
});
|
|
623
636
|
if (!response.ok)
|
|
@@ -634,11 +647,18 @@ Lang: ${rawData.preferredLanguage === 'es' ? 'ES' : 'EN'}
|
|
|
634
647
|
const response = await fetch(url, {
|
|
635
648
|
method,
|
|
636
649
|
headers: { 'Content-Type': 'application/json', 'x-api-key': apiKey, 'x-mcp-tool-name': toolName, ...(personalKey ? { 'x-personal-key': personalKey } : {}) },
|
|
637
|
-
body: args.results ? JSON.stringify({
|
|
650
|
+
body: args.results ? JSON.stringify({
|
|
651
|
+
results: args.results,
|
|
652
|
+
force: args.force,
|
|
653
|
+
backlogVersion: guard.backlogVersion
|
|
654
|
+
}) : undefined
|
|
638
655
|
});
|
|
639
656
|
if (!response.ok)
|
|
640
657
|
throw new Error(`Backend responded with ${response.status}`);
|
|
641
658
|
const data = (await response.json());
|
|
659
|
+
// Point: Version Storing
|
|
660
|
+
if (data.backlogVersion)
|
|
661
|
+
guard.backlogVersion = data.backlogVersion;
|
|
642
662
|
const langHint = data.preferredLanguage === 'es'
|
|
643
663
|
? "\n*** [INSTRUCTION: Project is in SPANISH. Provide all comments, appliedChanges, and aiAnalysis in SPANISH ONLY.] ***\n\n\n\n"
|
|
644
664
|
: (data.preferredLanguage === 'en' ? "\n*** [INSTRUCTION: Provide all comments and analysis in English.] ***\n\n\n\n" : "");
|
|
@@ -667,15 +687,17 @@ Lang: ${rawData.preferredLanguage === 'es' ? 'ES' : 'EN'}
|
|
|
667
687
|
...(personalKey ? { 'x-personal-key': personalKey } : {})
|
|
668
688
|
}
|
|
669
689
|
});
|
|
670
|
-
if (!response.ok) {
|
|
671
|
-
const errorBody = await response.text();
|
|
672
|
-
throw new Error(`Backend responded with ${response.status}: ${errorBody}`);
|
|
673
|
-
}
|
|
674
690
|
const rawData = (await response.json());
|
|
675
691
|
let rawImprovements = Array.isArray(rawData) ? rawData : (rawData?.data || rawData?.improvements || []);
|
|
676
692
|
if (!Array.isArray(rawImprovements)) {
|
|
677
693
|
return { content: [{ type: "text", text: "Error: Invalid format from backend" }], isError: true };
|
|
678
694
|
}
|
|
695
|
+
// Point: Lease Collection UI | Store lockTokens for UI tickets
|
|
696
|
+
rawImprovements.forEach((ann) => {
|
|
697
|
+
if (ann._id && ann.lockToken) {
|
|
698
|
+
guard.lockTokens[ann._id] = ann.lockToken;
|
|
699
|
+
}
|
|
700
|
+
});
|
|
679
701
|
const improvementsWithTips = rawImprovements.map((ann) => {
|
|
680
702
|
return {
|
|
681
703
|
...ann,
|