@joeytheman/gemini-mcp-tool 2.2.0 → 2.3.0

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 (107) hide show
  1. package/README.md +10 -7
  2. package/dist/__tests__/agyModelSteps.test.d.ts +2 -0
  3. package/dist/__tests__/agyModelSteps.test.d.ts.map +1 -0
  4. package/dist/__tests__/agyModelSteps.test.js +58 -0
  5. package/dist/__tests__/agyModelSteps.test.js.map +1 -0
  6. package/dist/__tests__/capture-script.chromium.test.d.ts +2 -0
  7. package/dist/__tests__/capture-script.chromium.test.d.ts.map +1 -0
  8. package/dist/__tests__/capture-script.chromium.test.js +235 -0
  9. package/dist/__tests__/capture-script.chromium.test.js.map +1 -0
  10. package/dist/__tests__/layout-snippet.chromium.test.d.ts +2 -0
  11. package/dist/__tests__/layout-snippet.chromium.test.d.ts.map +1 -0
  12. package/dist/__tests__/layout-snippet.chromium.test.js +333 -0
  13. package/dist/__tests__/layout-snippet.chromium.test.js.map +1 -0
  14. package/dist/__tests__/layout-snippet.test.d.ts +2 -0
  15. package/dist/__tests__/layout-snippet.test.d.ts.map +1 -0
  16. package/dist/__tests__/layout-snippet.test.js +12 -0
  17. package/dist/__tests__/layout-snippet.test.js.map +1 -0
  18. package/dist/__tests__/live-pass.test.js +531 -7
  19. package/dist/__tests__/live-pass.test.js.map +1 -1
  20. package/dist/__tests__/screen-review.test.js +111 -2
  21. package/dist/__tests__/screen-review.test.js.map +1 -1
  22. package/dist/__tests__/server-progress.test.d.ts +2 -0
  23. package/dist/__tests__/server-progress.test.d.ts.map +1 -0
  24. package/dist/__tests__/server-progress.test.js +63 -0
  25. package/dist/__tests__/server-progress.test.js.map +1 -0
  26. package/dist/__tests__/server.test.js +1 -8
  27. package/dist/__tests__/server.test.js.map +1 -1
  28. package/dist/__tests__/simple-tools.test.js +8 -3
  29. package/dist/__tests__/simple-tools.test.js.map +1 -1
  30. package/dist/__tests__/tools.test.js +29 -1
  31. package/dist/__tests__/tools.test.js.map +1 -1
  32. package/dist/__tests__/utils/agyExecutor.test.js +176 -61
  33. package/dist/__tests__/utils/agyExecutor.test.js.map +1 -1
  34. package/dist/__tests__/utils/commandExecutor.test.js +155 -1
  35. package/dist/__tests__/utils/commandExecutor.test.js.map +1 -1
  36. package/dist/__tests__/utils/progressUpdates.test.d.ts +2 -0
  37. package/dist/__tests__/utils/progressUpdates.test.d.ts.map +1 -0
  38. package/dist/__tests__/utils/progressUpdates.test.js +62 -0
  39. package/dist/__tests__/utils/progressUpdates.test.js.map +1 -0
  40. package/dist/constants.d.ts +33 -10
  41. package/dist/constants.d.ts.map +1 -1
  42. package/dist/constants.js +42 -10
  43. package/dist/constants.js.map +1 -1
  44. package/dist/index.js +19 -94
  45. package/dist/index.js.map +1 -1
  46. package/dist/layoutCheckSnippet.generated.d.ts +2 -0
  47. package/dist/layoutCheckSnippet.generated.d.ts.map +1 -0
  48. package/dist/layoutCheckSnippet.generated.js +3 -0
  49. package/dist/layoutCheckSnippet.generated.js.map +1 -0
  50. package/dist/tools/ask-gemini.tool.d.ts.map +1 -1
  51. package/dist/tools/ask-gemini.tool.js +6 -5
  52. package/dist/tools/ask-gemini.tool.js.map +1 -1
  53. package/dist/tools/brainstorm.tool.d.ts.map +1 -1
  54. package/dist/tools/brainstorm.tool.js +2 -1
  55. package/dist/tools/brainstorm.tool.js.map +1 -1
  56. package/dist/tools/live-pass.tool.d.ts +24 -1
  57. package/dist/tools/live-pass.tool.d.ts.map +1 -1
  58. package/dist/tools/live-pass.tool.js +174 -52
  59. package/dist/tools/live-pass.tool.js.map +1 -1
  60. package/dist/tools/registry.d.ts +2 -2
  61. package/dist/tools/registry.d.ts.map +1 -1
  62. package/dist/tools/registry.js +2 -2
  63. package/dist/tools/registry.js.map +1 -1
  64. package/dist/tools/screen-review.tool.d.ts +3 -0
  65. package/dist/tools/screen-review.tool.d.ts.map +1 -1
  66. package/dist/tools/screen-review.tool.js +42 -8
  67. package/dist/tools/screen-review.tool.js.map +1 -1
  68. package/dist/tools/simple-tools.d.ts.map +1 -1
  69. package/dist/tools/simple-tools.js +6 -2
  70. package/dist/tools/simple-tools.js.map +1 -1
  71. package/dist/utils/agyExecutor.d.ts +9 -1
  72. package/dist/utils/agyExecutor.d.ts.map +1 -1
  73. package/dist/utils/agyExecutor.js +54 -48
  74. package/dist/utils/agyExecutor.js.map +1 -1
  75. package/dist/utils/agyModelSteps.d.ts +5 -0
  76. package/dist/utils/agyModelSteps.d.ts.map +1 -0
  77. package/dist/utils/agyModelSteps.js +33 -0
  78. package/dist/utils/agyModelSteps.js.map +1 -0
  79. package/dist/utils/artifactFile.d.ts +6 -0
  80. package/dist/utils/artifactFile.d.ts.map +1 -0
  81. package/dist/utils/artifactFile.js +55 -0
  82. package/dist/utils/artifactFile.js.map +1 -0
  83. package/dist/utils/captureScript.d.ts +24 -0
  84. package/dist/utils/captureScript.d.ts.map +1 -0
  85. package/dist/utils/captureScript.js +83 -0
  86. package/dist/utils/captureScript.js.map +1 -0
  87. package/dist/utils/commandExecutor.d.ts +7 -1
  88. package/dist/utils/commandExecutor.d.ts.map +1 -1
  89. package/dist/utils/commandExecutor.js +154 -22
  90. package/dist/utils/commandExecutor.js.map +1 -1
  91. package/dist/utils/gitCheckout.d.ts +14 -0
  92. package/dist/utils/gitCheckout.d.ts.map +1 -0
  93. package/dist/utils/gitCheckout.js +36 -0
  94. package/dist/utils/gitCheckout.js.map +1 -0
  95. package/dist/utils/layoutCheck.d.ts +58 -0
  96. package/dist/utils/layoutCheck.d.ts.map +1 -0
  97. package/dist/utils/layoutCheck.js +84 -0
  98. package/dist/utils/layoutCheck.js.map +1 -0
  99. package/dist/utils/logger.d.ts +0 -1
  100. package/dist/utils/logger.d.ts.map +1 -1
  101. package/dist/utils/logger.js +0 -6
  102. package/dist/utils/logger.js.map +1 -1
  103. package/dist/utils/progressUpdates.d.ts +14 -0
  104. package/dist/utils/progressUpdates.d.ts.map +1 -0
  105. package/dist/utils/progressUpdates.js +40 -0
  106. package/dist/utils/progressUpdates.js.map +1 -0
  107. package/package.json +13 -11
@@ -0,0 +1,84 @@
1
+ import { z } from 'zod';
2
+ import * as fs from 'fs';
3
+ import { realpathOfExistingPrefix } from './fileReferences.js';
4
+ import { checkArtifactFile } from './artifactFile.js';
5
+ import { LIVE_PASS } from '../constants.js';
6
+ const rectSchema = z.object({
7
+ x: z.number(),
8
+ y: z.number(),
9
+ width: z.number(),
10
+ height: z.number(),
11
+ });
12
+ const entryFields = {
13
+ text: z.string().max(LIVE_PASS.LAYOUT_TEXT_CHARS),
14
+ testID: z.string().nullable(),
15
+ rect: rectSchema,
16
+ };
17
+ /** `dev-overlay` marks a frame a framework dev overlay (such as Expo's error overlay) covered; its other entries are suspect. */
18
+ export const LAYOUT_ENTRY_KINDS = [
19
+ 'dev-overlay',
20
+ 'page-scroll-x',
21
+ 'text-spill',
22
+ 'text-clipped',
23
+ 'control-covered',
24
+ 'control-offscreen',
25
+ ];
26
+ export const layoutReportSchema = z.object({
27
+ check: z.literal(LIVE_PASS.LAYOUT_CHECK_ID),
28
+ viewport: z.object({ width: z.number(), height: z.number() }),
29
+ found: z.number().int().nonnegative(),
30
+ entries: z.array(z.object({ kind: z.enum(LAYOUT_ENTRY_KINDS), ...entryFields })).max(LIVE_PASS.LAYOUT_MAX_ENTRIES),
31
+ clamped: z.array(z.object({ kind: z.literal('text-clamped'), ...entryFields })).max(LIVE_PASS.LAYOUT_MAX_ENTRIES),
32
+ });
33
+ export function layoutFileName(frameFileName) {
34
+ return frameFileName.replace(/\.png$/, LIVE_PASS.LAYOUT_FILE_SUFFIX);
35
+ }
36
+ const FILE_PROBLEMS = {
37
+ OUTSIDE: 'resolves outside the artifact directory',
38
+ MISSING: 'not written',
39
+ STALE: 'predates this run',
40
+ };
41
+ /**
42
+ * Read one frame's layout file. Never throws: a file that cannot be trusted is
43
+ * reported with its status and treated by the report as "not run". A file
44
+ * measured at another width than the frame's describes a different layout.
45
+ */
46
+ export function readLayoutCheck(file, artifactDir, runStartMs, expectedWidth) {
47
+ const absFile = realpathOfExistingPrefix(file);
48
+ const fileStatus = checkArtifactFile(absFile, artifactDir, runStartMs);
49
+ if (fileStatus === 'EMPTY')
50
+ return { file: absFile, status: 'MALFORMED', problem: 'empty' };
51
+ if (fileStatus !== 'OK')
52
+ return { file: absFile, status: fileStatus, problem: FILE_PROBLEMS[fileStatus] };
53
+ let parsed;
54
+ try {
55
+ parsed = JSON.parse(fs.readFileSync(absFile, 'utf-8'));
56
+ }
57
+ catch {
58
+ return { file: absFile, status: 'MALFORMED', problem: 'not valid JSON' };
59
+ }
60
+ const report = layoutReportSchema.safeParse(parsed);
61
+ if (!report.success) {
62
+ const issue = report.error.issues[0];
63
+ return {
64
+ file: absFile,
65
+ status: 'MALFORMED',
66
+ problem: `not a ${LIVE_PASS.LAYOUT_CHECK_ID} result (${issue.path.join('.') || 'root'}: ${issue.message})`,
67
+ };
68
+ }
69
+ const measuredWidth = report.data.viewport.width;
70
+ if (expectedWidth !== undefined && measuredWidth !== expectedWidth) {
71
+ return {
72
+ file: absFile,
73
+ status: 'MISMATCHED',
74
+ problem: `measured at width ${measuredWidth}, but the frame is ${expectedWidth} wide`,
75
+ };
76
+ }
77
+ return { file: absFile, status: 'OK', report: report.data };
78
+ }
79
+ export function formatLayoutEntry(entry) {
80
+ const { x, y, width, height } = entry.rect;
81
+ const testID = entry.testID ? ` testID=${entry.testID}` : '';
82
+ return `${entry.kind} "${entry.text}"${testID} at ${x},${y} ${width}x${height}`;
83
+ }
84
+ //# sourceMappingURL=layoutCheck.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layoutCheck.js","sourceRoot":"","sources":["../../src/utils/layoutCheck.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,6 @@ export declare class Logger {
7
7
  static toolInvocation(toolName: string, args: any): void;
8
8
  static toolParsedArgs(prompt: string, model?: string, sandbox?: boolean, changeMode?: boolean): void;
9
9
  static commandExecution(command: string, args: string[], startTime: number): void;
10
- private static _commandStartTimes;
11
10
  static commandComplete(startTime: number, exitCode: number | null, outputLength?: number): void;
12
11
  }
13
12
  //# sourceMappingURL=logger.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAGA,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAC,aAAa;IAI5B,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAIjD,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAIlD,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAInD,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAInD,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI;IAIxD,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,OAAO,GAAG,IAAI;IAIpG,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAQjF,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAA6E;IAE9G,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;CAUhG"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAGA,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAC,aAAa;IAI5B,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAIjD,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAIlD,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAInD,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAInD,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI;IAIxD,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,OAAO,GAAG,IAAI;IAIpG,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAIjF,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;CAOhG"}
@@ -24,19 +24,13 @@ export class Logger {
24
24
  }
25
25
  static commandExecution(command, args, startTime) {
26
26
  this.warn(`[${startTime}] Starting: ${command} ${args.map((arg) => `"${arg}"`).join(" ")}`);
27
- // Store command execution start for timing analysis
28
- this._commandStartTimes.set(startTime, { command, args, startTime });
29
27
  }
30
- // Track command start times for duration calculation
31
- static _commandStartTimes = new Map();
32
28
  static commandComplete(startTime, exitCode, outputLength) {
33
29
  const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
34
30
  this.warn(`[${elapsed}s] Process finished with exit code: ${exitCode}`);
35
31
  if (outputLength !== undefined) {
36
32
  this.warn(`Response: ${outputLength} chars`);
37
33
  }
38
- // Clean up command tracking
39
- this._commandStartTimes.delete(startTime);
40
34
  }
41
35
  }
42
36
  //# sourceMappingURL=logger.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,MAAM;AACN,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,OAAO,MAAM;IACT,MAAM,CAAC,aAAa,CAAC,OAAe;QAC1C,OAAO,GAAG,UAAU,IAAI,OAAO,EAAE,GAAG,IAAI,CAAC;IAC3C,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,OAAe,EAAE,GAAG,IAAW;QACxC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,OAAe,EAAE,GAAG,IAAW;QACzC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,OAAe,EAAE,GAAG,IAAW;QAC1C,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,OAAe,EAAE,GAAG,IAAW;QAC1C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,QAAgB,EAAE,IAAS;QAC/C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,MAAc,EAAE,KAAc,EAAE,OAAiB,EAAE,UAAoB;QAC3F,IAAI,CAAC,IAAI,CAAC,mBAAmB,MAAM,kBAAkB,UAAU,IAAI,KAAK,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,OAAe,EAAE,IAAc,EAAE,SAAiB;QACxE,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,eAAe,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAE5F,oDAAoD;QACpD,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,qDAAqD;IAC7C,MAAM,CAAC,kBAAkB,GAAG,IAAI,GAAG,EAAkE,CAAC;IAE9G,MAAM,CAAC,eAAe,CAAC,SAAiB,EAAE,QAAuB,EAAE,YAAqB;QACtF,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,uCAAuC,QAAQ,EAAE,CAAC,CAAC;QACxE,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,aAAa,YAAY,QAAQ,CAAC,CAAC;QAC/C,CAAC;QAED,4BAA4B;QAC5B,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,MAAM;AACN,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,OAAO,MAAM;IACT,MAAM,CAAC,aAAa,CAAC,OAAe;QAC1C,OAAO,GAAG,UAAU,IAAI,OAAO,EAAE,GAAG,IAAI,CAAC;IAC3C,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,OAAe,EAAE,GAAG,IAAW;QACxC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,OAAe,EAAE,GAAG,IAAW;QACzC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,OAAe,EAAE,GAAG,IAAW;QAC1C,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,OAAe,EAAE,GAAG,IAAW;QAC1C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,QAAgB,EAAE,IAAS;QAC/C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,MAAc,EAAE,KAAc,EAAE,OAAiB,EAAE,UAAoB;QAC3F,IAAI,CAAC,IAAI,CAAC,mBAAmB,MAAM,kBAAkB,UAAU,IAAI,KAAK,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,OAAe,EAAE,IAAc,EAAE,SAAiB;QACxE,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,eAAe,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,MAAM,CAAC,eAAe,CAAC,SAAiB,EAAE,QAAuB,EAAE,YAAqB;QACtF,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,uCAAuC,QAAQ,EAAE,CAAC,CAAC;QACxE,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,aAAa,YAAY,QAAQ,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ export type ProgressToken = string | number;
2
+ export type SendProgress = (progressToken: ProgressToken, progress: number, total: number | undefined, message: string) => Promise<void> | void;
3
+ export type ProgressOutcome = 'success' | 'failure';
4
+ export interface ProgressUpdates {
5
+ recordOutput(output: string): void;
6
+ finish(outcome: ProgressOutcome): void;
7
+ }
8
+ /**
9
+ * Keep-alive progress for ONE tool call. Each call owns its timer and output
10
+ * preview, so a call that finishes never silences another call still running
11
+ * in the same server; a silenced call is aborted by the client.
12
+ */
13
+ export declare function startProgressUpdates(operationName: string, progressToken: ProgressToken | undefined, send: SendProgress): ProgressUpdates;
14
+ //# sourceMappingURL=progressUpdates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progressUpdates.d.ts","sourceRoot":"","sources":["../../src/utils/progressUpdates.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,CAAC;AAE5C,MAAM,MAAM,YAAY,GAAG,CACzB,aAAa,EAAE,aAAa,EAC5B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,OAAO,EAAE,MAAM,KACZ,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAE1B,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,SAAS,CAAC;AAEpD,MAAM,WAAW,eAAe;IAC9B,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,MAAM,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;CACxC;AAeD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,aAAa,GAAG,SAAS,EACxC,IAAI,EAAE,YAAY,GACjB,eAAe,CA6BjB"}
@@ -0,0 +1,40 @@
1
+ import { PROTOCOL } from '../constants.js';
2
+ const OUTPUT_PREVIEW_CHARS = 150;
3
+ function keepAliveMessage(operationName, index) {
4
+ const messages = [
5
+ `🧠 ${operationName} - Gemini is analyzing your request...`,
6
+ `šŸ“Š ${operationName} - Processing files and generating insights...`,
7
+ `✨ ${operationName} - Creating structured response for your review...`,
8
+ `ā±ļø ${operationName} - Large analysis in progress (this is normal for big requests)...`,
9
+ `šŸ” ${operationName} - Still working... Gemini takes time for quality results...`,
10
+ ];
11
+ return messages[index % messages.length];
12
+ }
13
+ /**
14
+ * Keep-alive progress for ONE tool call. Each call owns its timer and output
15
+ * preview, so a call that finishes never silences another call still running
16
+ * in the same server; a silenced call is aborted by the client.
17
+ */
18
+ export function startProgressUpdates(operationName, progressToken, send) {
19
+ if (!progressToken) {
20
+ return { recordOutput: () => { }, finish: () => { } };
21
+ }
22
+ let latestOutput = '';
23
+ let ticks = 0;
24
+ void send(progressToken, 0, undefined, `šŸ” Starting ${operationName}`);
25
+ const interval = setInterval(() => {
26
+ const base = keepAliveMessage(operationName, ticks);
27
+ ticks += 1;
28
+ const preview = latestOutput.slice(-OUTPUT_PREVIEW_CHARS).trim();
29
+ void send(progressToken, ticks, undefined, preview ? `${base}\nšŸ“ Output: ...${preview}` : base);
30
+ }, PROTOCOL.KEEPALIVE_INTERVAL);
31
+ return {
32
+ recordOutput: (output) => { latestOutput = output; },
33
+ finish: (outcome) => {
34
+ clearInterval(interval);
35
+ const finalProgress = ticks + 1;
36
+ void send(progressToken, finalProgress, finalProgress, outcome === 'success' ? `āœ… ${operationName} completed successfully` : `āŒ ${operationName} failed`);
37
+ },
38
+ };
39
+ }
40
+ //# sourceMappingURL=progressUpdates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progressUpdates.js","sourceRoot":"","sources":["../../src/utils/progressUpdates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAkB3C,MAAM,oBAAoB,GAAG,GAAG,CAAC;AAEjC,SAAS,gBAAgB,CAAC,aAAqB,EAAE,KAAa;IAC5D,MAAM,QAAQ,GAAG;QACf,MAAM,aAAa,wCAAwC;QAC3D,MAAM,aAAa,gDAAgD;QACnE,KAAK,aAAa,oDAAoD;QACtE,MAAM,aAAa,oEAAoE;QACvF,MAAM,aAAa,8DAA8D;KAClF,CAAC;IACF,OAAO,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,aAAqB,EACrB,aAAwC,EACxC,IAAkB;IAElB,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC;IACtD,CAAC;IAED,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,SAAS,EAAE,eAAe,aAAa,EAAE,CAAC,CAAC;IAEvE,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;QAChC,MAAM,IAAI,GAAG,gBAAgB,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QACpD,KAAK,IAAI,CAAC,CAAC;QACX,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAAC,CAAC,IAAI,EAAE,CAAC;QACjE,KAAK,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,mBAAmB,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACnG,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IAEhC,OAAO;QACL,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,GAAG,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC;QACpD,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;YAClB,aAAa,CAAC,QAAQ,CAAC,CAAC;YACxB,MAAM,aAAa,GAAG,KAAK,GAAG,CAAC,CAAC;YAChC,KAAK,IAAI,CACP,aAAa,EACb,aAAa,EACb,aAAa,EACb,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,aAAa,yBAAyB,CAAC,CAAC,CAAC,KAAK,aAAa,SAAS,CAClG,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@joeytheman/gemini-mcp-tool",
3
- "version": "2.2.0",
3
+ "version": "2.3.0",
4
4
  "description": "MCP server for asking Gemini through Antigravity CLI (agy)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -14,6 +14,8 @@
14
14
  "test": "vitest run",
15
15
  "test:watch": "vitest watch",
16
16
  "test:coverage": "vitest run --coverage",
17
+ "snippet:build": "node scripts/minify-layout-snippet.mjs",
18
+ "test:chromium": "playwright-core install chromium-headless-shell && vitest run --config vitest.chromium.config.ts",
17
19
  "lint": "tsc --noEmit",
18
20
  "contribute": "tsx src/contribute.ts",
19
21
  "prepare": "npm run build",
@@ -43,7 +45,7 @@
43
45
  },
44
46
  "homepage": "https://github.com/joeytheman/gemini-mcp-tool#readme",
45
47
  "engines": {
46
- "node": ">=18.0.0"
48
+ "node": ">=20.12.0"
47
49
  },
48
50
  "files": [
49
51
  "dist/",
@@ -51,20 +53,18 @@
51
53
  "LICENSE"
52
54
  ],
53
55
  "dependencies": {
54
- "@modelcontextprotocol/sdk": "^1.25.3",
55
- "chalk": "^5.0.0",
56
- "d3-shape": "^3.2.0",
57
- "inquirer": "^13.3.0",
58
- "lru-cache": "^11.2.4",
59
- "prismjs": "^1.30.0",
60
- "zod": "^4.3.6"
56
+ "@modelcontextprotocol/sdk": "^1.32.2",
57
+ "lru-cache": "^11.5.3",
58
+ "zod": "^4.6.7"
61
59
  },
62
60
  "devDependencies": {
63
- "@types/inquirer": "^9.0.9",
64
61
  "@types/node": "^25.3.3",
65
62
  "@vitest/coverage-v8": "^4.0.18",
66
63
  "archiver": "^7.0.1",
64
+ "esbuild": "^0.25.12",
67
65
  "mermaid": "^11.12.2",
66
+ "playwright-core": "1.64.1",
67
+ "prismjs": "^1.30.0",
68
68
  "tsx": "^4.0.0",
69
69
  "typescript": "^5.0.0",
70
70
  "vitepress": "^1.6.4",
@@ -75,6 +75,8 @@
75
75
  "access": "public"
76
76
  },
77
77
  "overrides": {
78
- "esbuild": ">=0.25.0"
78
+ "vitepress": {
79
+ "esbuild": ">=0.25.0"
80
+ }
79
81
  }
80
82
  }