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.
Files changed (2) hide show
  1. package/dist/index.js +29 -7
  2. 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
- console.error(`[MCP] Received ${rawAnnotations.length} annotations from backend.`);
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) => ({ ...r, status: 'applied' }))
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({ results: args.results, force: args.force }) : undefined
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,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "viewgate-mcp",
3
- "version": "1.0.48",
3
+ "version": "1.0.49",
4
4
  "main": "dist/index.js",
5
5
  "bin": {
6
6
  "viewgate-mcp": "./dist/index.js"