@joeytheman/gemini-mcp-tool 1.3.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 (172) hide show
  1. package/README.md +127 -35
  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__/ask-gemini.test.js +99 -37
  7. package/dist/__tests__/ask-gemini.test.js.map +1 -1
  8. package/dist/__tests__/capture-script.chromium.test.d.ts +2 -0
  9. package/dist/__tests__/capture-script.chromium.test.d.ts.map +1 -0
  10. package/dist/__tests__/capture-script.chromium.test.js +235 -0
  11. package/dist/__tests__/capture-script.chromium.test.js.map +1 -0
  12. package/dist/__tests__/layout-snippet.chromium.test.d.ts +2 -0
  13. package/dist/__tests__/layout-snippet.chromium.test.d.ts.map +1 -0
  14. package/dist/__tests__/layout-snippet.chromium.test.js +333 -0
  15. package/dist/__tests__/layout-snippet.chromium.test.js.map +1 -0
  16. package/dist/__tests__/layout-snippet.test.d.ts +2 -0
  17. package/dist/__tests__/layout-snippet.test.d.ts.map +1 -0
  18. package/dist/__tests__/layout-snippet.test.js +12 -0
  19. package/dist/__tests__/layout-snippet.test.js.map +1 -0
  20. package/dist/__tests__/live-pass.test.d.ts +2 -0
  21. package/dist/__tests__/live-pass.test.d.ts.map +1 -0
  22. package/dist/__tests__/live-pass.test.js +1249 -0
  23. package/dist/__tests__/live-pass.test.js.map +1 -0
  24. package/dist/__tests__/screen-review.test.d.ts +2 -0
  25. package/dist/__tests__/screen-review.test.d.ts.map +1 -0
  26. package/dist/__tests__/screen-review.test.js +553 -0
  27. package/dist/__tests__/screen-review.test.js.map +1 -0
  28. package/dist/__tests__/server-progress.test.d.ts +2 -0
  29. package/dist/__tests__/server-progress.test.d.ts.map +1 -0
  30. package/dist/__tests__/server-progress.test.js +63 -0
  31. package/dist/__tests__/server-progress.test.js.map +1 -0
  32. package/dist/__tests__/server.test.js +17 -19
  33. package/dist/__tests__/server.test.js.map +1 -1
  34. package/dist/__tests__/simple-tools.test.d.ts +2 -0
  35. package/dist/__tests__/simple-tools.test.d.ts.map +1 -0
  36. package/dist/__tests__/simple-tools.test.js +30 -0
  37. package/dist/__tests__/simple-tools.test.js.map +1 -0
  38. package/dist/__tests__/tools.test.js +91 -0
  39. package/dist/__tests__/tools.test.js.map +1 -1
  40. package/dist/__tests__/utils/agyExecutor.test.d.ts +2 -0
  41. package/dist/__tests__/utils/agyExecutor.test.d.ts.map +1 -0
  42. package/dist/__tests__/utils/agyExecutor.test.js +731 -0
  43. package/dist/__tests__/utils/agyExecutor.test.js.map +1 -0
  44. package/dist/__tests__/utils/agyTranscriptRecovery.test.d.ts +2 -0
  45. package/dist/__tests__/utils/agyTranscriptRecovery.test.d.ts.map +1 -0
  46. package/dist/__tests__/utils/agyTranscriptRecovery.test.js +127 -0
  47. package/dist/__tests__/utils/agyTranscriptRecovery.test.js.map +1 -0
  48. package/dist/__tests__/utils/chunkCache.test.js +26 -2
  49. package/dist/__tests__/utils/chunkCache.test.js.map +1 -1
  50. package/dist/__tests__/utils/commandExecutor.test.js +185 -7
  51. package/dist/__tests__/utils/commandExecutor.test.js.map +1 -1
  52. package/dist/__tests__/utils/fileReferences.test.d.ts +2 -0
  53. package/dist/__tests__/utils/fileReferences.test.d.ts.map +1 -0
  54. package/dist/__tests__/utils/fileReferences.test.js +87 -0
  55. package/dist/__tests__/utils/fileReferences.test.js.map +1 -0
  56. package/dist/__tests__/utils/gitStatusGuard.test.d.ts +2 -0
  57. package/dist/__tests__/utils/gitStatusGuard.test.d.ts.map +1 -0
  58. package/dist/__tests__/utils/gitStatusGuard.test.js +106 -0
  59. package/dist/__tests__/utils/gitStatusGuard.test.js.map +1 -0
  60. package/dist/__tests__/utils/progressUpdates.test.d.ts +2 -0
  61. package/dist/__tests__/utils/progressUpdates.test.d.ts.map +1 -0
  62. package/dist/__tests__/utils/progressUpdates.test.js +62 -0
  63. package/dist/__tests__/utils/progressUpdates.test.js.map +1 -0
  64. package/dist/__tests__/utils/responseCache.test.js +31 -11
  65. package/dist/__tests__/utils/responseCache.test.js.map +1 -1
  66. package/dist/__tests__/utils/test-helpers.d.ts +4 -0
  67. package/dist/__tests__/utils/test-helpers.d.ts.map +1 -1
  68. package/dist/__tests__/utils/test-helpers.js +16 -0
  69. package/dist/__tests__/utils/test-helpers.js.map +1 -1
  70. package/dist/constants.d.ts +91 -26
  71. package/dist/constants.d.ts.map +1 -1
  72. package/dist/constants.js +101 -28
  73. package/dist/constants.js.map +1 -1
  74. package/dist/index.js +20 -95
  75. package/dist/index.js.map +1 -1
  76. package/dist/layoutCheckSnippet.generated.d.ts +2 -0
  77. package/dist/layoutCheckSnippet.generated.d.ts.map +1 -0
  78. package/dist/layoutCheckSnippet.generated.js +3 -0
  79. package/dist/layoutCheckSnippet.generated.js.map +1 -0
  80. package/dist/tools/ask-gemini.tool.d.ts +34 -0
  81. package/dist/tools/ask-gemini.tool.d.ts.map +1 -1
  82. package/dist/tools/ask-gemini.tool.js +40 -23
  83. package/dist/tools/ask-gemini.tool.js.map +1 -1
  84. package/dist/tools/brainstorm.tool.d.ts.map +1 -1
  85. package/dist/tools/brainstorm.tool.js +7 -5
  86. package/dist/tools/brainstorm.tool.js.map +1 -1
  87. package/dist/tools/index.d.ts.map +1 -1
  88. package/dist/tools/index.js +3 -1
  89. package/dist/tools/index.js.map +1 -1
  90. package/dist/tools/live-pass.tool.d.ts +206 -0
  91. package/dist/tools/live-pass.tool.d.ts.map +1 -0
  92. package/dist/tools/live-pass.tool.js +670 -0
  93. package/dist/tools/live-pass.tool.js.map +1 -0
  94. package/dist/tools/registry.d.ts +6 -4
  95. package/dist/tools/registry.d.ts.map +1 -1
  96. package/dist/tools/registry.js +14 -11
  97. package/dist/tools/registry.js.map +1 -1
  98. package/dist/tools/screen-review.tool.d.ts +124 -0
  99. package/dist/tools/screen-review.tool.d.ts.map +1 -0
  100. package/dist/tools/screen-review.tool.js +449 -0
  101. package/dist/tools/screen-review.tool.js.map +1 -0
  102. package/dist/tools/simple-tools.d.ts.map +1 -1
  103. package/dist/tools/simple-tools.js +9 -3
  104. package/dist/tools/simple-tools.js.map +1 -1
  105. package/dist/utils/agyExecutor.d.ts +76 -0
  106. package/dist/utils/agyExecutor.d.ts.map +1 -0
  107. package/dist/utils/agyExecutor.js +449 -0
  108. package/dist/utils/agyExecutor.js.map +1 -0
  109. package/dist/utils/agyModelSteps.d.ts +5 -0
  110. package/dist/utils/agyModelSteps.d.ts.map +1 -0
  111. package/dist/utils/agyModelSteps.js +33 -0
  112. package/dist/utils/agyModelSteps.js.map +1 -0
  113. package/dist/utils/agyReport.d.ts +19 -0
  114. package/dist/utils/agyReport.d.ts.map +1 -0
  115. package/dist/utils/agyReport.js +62 -0
  116. package/dist/utils/agyReport.js.map +1 -0
  117. package/dist/utils/agyTranscriptRecovery.d.ts +16 -0
  118. package/dist/utils/agyTranscriptRecovery.d.ts.map +1 -0
  119. package/dist/utils/agyTranscriptRecovery.js +149 -0
  120. package/dist/utils/agyTranscriptRecovery.js.map +1 -0
  121. package/dist/utils/artifactFile.d.ts +6 -0
  122. package/dist/utils/artifactFile.d.ts.map +1 -0
  123. package/dist/utils/artifactFile.js +55 -0
  124. package/dist/utils/artifactFile.js.map +1 -0
  125. package/dist/utils/captureScript.d.ts +24 -0
  126. package/dist/utils/captureScript.d.ts.map +1 -0
  127. package/dist/utils/captureScript.js +83 -0
  128. package/dist/utils/captureScript.js.map +1 -0
  129. package/dist/utils/chunkCache.d.ts.map +1 -1
  130. package/dist/utils/chunkCache.js +19 -5
  131. package/dist/utils/chunkCache.js.map +1 -1
  132. package/dist/utils/commandExecutor.d.ts +7 -1
  133. package/dist/utils/commandExecutor.d.ts.map +1 -1
  134. package/dist/utils/commandExecutor.js +162 -22
  135. package/dist/utils/commandExecutor.js.map +1 -1
  136. package/dist/utils/fileReferences.d.ts +45 -0
  137. package/dist/utils/fileReferences.d.ts.map +1 -0
  138. package/dist/utils/fileReferences.js +169 -0
  139. package/dist/utils/fileReferences.js.map +1 -0
  140. package/dist/utils/gitCheckout.d.ts +14 -0
  141. package/dist/utils/gitCheckout.d.ts.map +1 -0
  142. package/dist/utils/gitCheckout.js +36 -0
  143. package/dist/utils/gitCheckout.js.map +1 -0
  144. package/dist/utils/gitStatusGuard.d.ts +35 -0
  145. package/dist/utils/gitStatusGuard.d.ts.map +1 -0
  146. package/dist/utils/gitStatusGuard.js +82 -0
  147. package/dist/utils/gitStatusGuard.js.map +1 -0
  148. package/dist/utils/layoutCheck.d.ts +58 -0
  149. package/dist/utils/layoutCheck.d.ts.map +1 -0
  150. package/dist/utils/layoutCheck.js +84 -0
  151. package/dist/utils/layoutCheck.js.map +1 -0
  152. package/dist/utils/logger.d.ts +0 -1
  153. package/dist/utils/logger.d.ts.map +1 -1
  154. package/dist/utils/logger.js +0 -6
  155. package/dist/utils/logger.js.map +1 -1
  156. package/dist/utils/progressUpdates.d.ts +14 -0
  157. package/dist/utils/progressUpdates.d.ts.map +1 -0
  158. package/dist/utils/progressUpdates.js +40 -0
  159. package/dist/utils/progressUpdates.js.map +1 -0
  160. package/dist/utils/responseCache.d.ts +3 -3
  161. package/dist/utils/responseCache.d.ts.map +1 -1
  162. package/dist/utils/responseCache.js +11 -6
  163. package/dist/utils/responseCache.js.map +1 -1
  164. package/package.json +19 -16
  165. package/dist/__tests__/utils/geminiExecutor.test.d.ts +0 -2
  166. package/dist/__tests__/utils/geminiExecutor.test.d.ts.map +0 -1
  167. package/dist/__tests__/utils/geminiExecutor.test.js +0 -337
  168. package/dist/__tests__/utils/geminiExecutor.test.js.map +0 -1
  169. package/dist/utils/geminiExecutor.d.ts +0 -17
  170. package/dist/utils/geminiExecutor.d.ts.map +0 -1
  171. package/dist/utils/geminiExecutor.js +0 -238
  172. package/dist/utils/geminiExecutor.js.map +0 -1
@@ -0,0 +1,82 @@
1
+ import { execFile } from 'child_process';
2
+ import { promisify } from 'util';
3
+ import { createHash } from 'crypto';
4
+ import * as fs from 'fs';
5
+ import * as path from 'path';
6
+ import { Logger } from './logger.js';
7
+ import { isWithin } from './fileReferences.js';
8
+ const execFileAsync = promisify(execFile);
9
+ /** Files larger than this are tracked by status only — hashing them is not worth the read. */
10
+ const MAX_HASH_BYTES = 8 * 1024 * 1024;
11
+ /** Upper bound on files hashed per snapshot; the report says so when it bites. */
12
+ const MAX_HASHED_FILES = 500;
13
+ /** The path part of a porcelain line: `XY path`, possibly quoted, possibly a rename. */
14
+ function porcelainPath(line, repoRoot) {
15
+ const raw = line.slice(3).split(' -> ').pop() ?? '';
16
+ const unquoted = raw.startsWith('"') && raw.endsWith('"') ? raw.slice(1, -1) : raw;
17
+ return path.resolve(repoRoot, unquoted);
18
+ }
19
+ function hashFile(file) {
20
+ try {
21
+ const stat = fs.statSync(file);
22
+ if (!stat.isFile() || stat.size > MAX_HASH_BYTES)
23
+ return null;
24
+ return createHash('sha256').update(fs.readFileSync(file)).digest('hex');
25
+ }
26
+ catch {
27
+ // Deleted, unreadable, or a directory — status alone covers it.
28
+ return null;
29
+ }
30
+ }
31
+ export async function snapshotWorkingTree(cwd) {
32
+ try {
33
+ const [{ stdout: rootOut }, { stdout: statusOut }] = await Promise.all([
34
+ execFileAsync('git', ['rev-parse', '--show-toplevel'], { cwd, encoding: 'utf-8' }),
35
+ // --untracked-files=all: without it an untracked directory collapses to a
36
+ // single `?? parent/` entry, which would hide unrelated files created
37
+ // beside a tool's own artifact directory.
38
+ execFileAsync('git', ['status', '--porcelain', '--untracked-files=all'], { cwd, encoding: 'utf-8' }),
39
+ ]);
40
+ const root = rootOut.trim();
41
+ const lines = statusOut.split('\n').map(line => line.trimEnd()).filter(Boolean);
42
+ const hashes = new Map();
43
+ let truncated = false;
44
+ for (const line of lines) {
45
+ if (hashes.size >= MAX_HASHED_FILES) {
46
+ truncated = true;
47
+ break;
48
+ }
49
+ const file = porcelainPath(line, root);
50
+ const hash = hashFile(file);
51
+ if (hash)
52
+ hashes.set(file, hash);
53
+ }
54
+ return { root, lines, hashes, truncated };
55
+ }
56
+ catch (error) {
57
+ Logger.debug(`[git-guard] no working-tree snapshot for ${cwd}: ${error}`);
58
+ return null;
59
+ }
60
+ }
61
+ export function diffWorkingTree(before, after, opts = {}) {
62
+ if (!before || !after)
63
+ return { added: [], removed: [], modified: [], truncated: false };
64
+ // A tool's own artifact directory is not an uninvited edit.
65
+ const ignore = opts.ignoreDirectory;
66
+ const isOurs = (file) => Boolean(ignore) && isWithin(ignore, file);
67
+ const beforeSet = new Set(before.lines);
68
+ const afterSet = new Set(after.lines);
69
+ const modified = [];
70
+ for (const [file, hash] of after.hashes) {
71
+ const previous = before.hashes.get(file);
72
+ if (previous && previous !== hash && !isOurs(file))
73
+ modified.push(file);
74
+ }
75
+ return {
76
+ added: after.lines.filter(line => !beforeSet.has(line) && !isOurs(porcelainPath(line, after.root))),
77
+ removed: before.lines.filter(line => !afterSet.has(line) && !isOurs(porcelainPath(line, before.root))),
78
+ modified,
79
+ truncated: before.truncated || after.truncated,
80
+ };
81
+ }
82
+ //# sourceMappingURL=gitStatusGuard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitStatusGuard.js","sourceRoot":"","sources":["../../src/utils/gitStatusGuard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import { z } from 'zod';
2
+ /** `dev-overlay` marks a frame a framework dev overlay (such as Expo's error overlay) covered; its other entries are suspect. */
3
+ export declare const LAYOUT_ENTRY_KINDS: readonly ["dev-overlay", "page-scroll-x", "text-spill", "text-clipped", "control-covered", "control-offscreen"];
4
+ export declare const layoutReportSchema: z.ZodObject<{
5
+ check: z.ZodLiteral<"layout-check/1">;
6
+ viewport: z.ZodObject<{
7
+ width: z.ZodNumber;
8
+ height: z.ZodNumber;
9
+ }, z.core.$strip>;
10
+ found: z.ZodNumber;
11
+ entries: z.ZodArray<z.ZodObject<{
12
+ text: z.ZodString;
13
+ testID: z.ZodNullable<z.ZodString>;
14
+ rect: z.ZodObject<{
15
+ x: z.ZodNumber;
16
+ y: z.ZodNumber;
17
+ width: z.ZodNumber;
18
+ height: z.ZodNumber;
19
+ }, z.core.$strip>;
20
+ kind: z.ZodEnum<{
21
+ "dev-overlay": "dev-overlay";
22
+ "page-scroll-x": "page-scroll-x";
23
+ "text-spill": "text-spill";
24
+ "text-clipped": "text-clipped";
25
+ "control-covered": "control-covered";
26
+ "control-offscreen": "control-offscreen";
27
+ }>;
28
+ }, z.core.$strip>>;
29
+ clamped: z.ZodArray<z.ZodObject<{
30
+ text: z.ZodString;
31
+ testID: z.ZodNullable<z.ZodString>;
32
+ rect: z.ZodObject<{
33
+ x: z.ZodNumber;
34
+ y: z.ZodNumber;
35
+ width: z.ZodNumber;
36
+ height: z.ZodNumber;
37
+ }, z.core.$strip>;
38
+ kind: z.ZodLiteral<"text-clamped">;
39
+ }, z.core.$strip>>;
40
+ }, z.core.$strip>;
41
+ export type LayoutReport = z.infer<typeof layoutReportSchema>;
42
+ export type LayoutEntry = LayoutReport['entries'][number] | LayoutReport['clamped'][number];
43
+ export type LayoutCheckStatus = 'OK' | 'MISSING' | 'STALE' | 'OUTSIDE' | 'MALFORMED' | 'MISMATCHED';
44
+ export interface LayoutCheck {
45
+ file: string;
46
+ status: LayoutCheckStatus;
47
+ report?: LayoutReport;
48
+ problem?: string;
49
+ }
50
+ export declare function layoutFileName(frameFileName: string): string;
51
+ /**
52
+ * Read one frame's layout file. Never throws: a file that cannot be trusted is
53
+ * reported with its status and treated by the report as "not run". A file
54
+ * measured at another width than the frame's describes a different layout.
55
+ */
56
+ export declare function readLayoutCheck(file: string, artifactDir: string, runStartMs: number, expectedWidth?: number): LayoutCheck;
57
+ export declare function formatLayoutEntry(entry: LayoutEntry): string;
58
+ //# sourceMappingURL=layoutCheck.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layoutCheck.d.ts","sourceRoot":"","sources":["../../src/utils/layoutCheck.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAmBxB,iIAAiI;AACjI,eAAO,MAAM,kBAAkB,iHAOrB,CAAC;AAEX,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAM7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,WAAW,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5F,MAAM,MAAM,iBAAiB,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,WAAW,GAAG,YAAY,CAAC;AAEpG,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,iBAAiB,CAAC;IAC1B,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAE5D;AAQD;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,aAAa,CAAC,EAAE,MAAM,GACrB,WAAW,CA8Bb;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAI5D"}
@@ -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"}
@@ -1,14 +1,14 @@
1
- import { GeminiCLIOptions } from './geminiExecutor.js';
1
+ import type { AgyCLIOptions } from './agyExecutor.js';
2
2
  /**
3
3
  * Whether LRU response caching is enabled.
4
- * Opt-in via environment variable GEMINI_CACHE_ENABLED=true.
4
+ * Opt-in via environment variable AGY_CACHE_ENABLED=true.
5
5
  * Defaults to false — users must explicitly enable caching.
6
6
  */
7
7
  export declare const isCacheEnabled: () => boolean;
8
8
  /**
9
9
  * Generate a cache key from prompt and options
10
10
  */
11
- export declare function generateCacheKey(prompt: string, options: GeminiCLIOptions): string;
11
+ export declare function generateCacheKey(prompt: string, options: AgyCLIOptions): string;
12
12
  /**
13
13
  * Get cached response if available
14
14
  */
@@ -1 +1 @@
1
- {"version":3,"file":"responseCache.d.ts","sourceRoot":"","sources":["../../src/utils/responseCache.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD;;;;GAIG;AACH,eAAO,MAAM,cAAc,QAAO,OACW,CAAC;AAwB9C;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAkBlF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMtE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAGtE;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAGjC;AAED;;GAEG;AACH,wBAAgB,aAAa;;;;;EAO5B"}
1
+ {"version":3,"file":"responseCache.d.ts","sourceRoot":"","sources":["../../src/utils/responseCache.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD;;;;GAIG;AACH,eAAO,MAAM,cAAc,QAAO,OACQ,CAAC;AAwB3C;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,CAuB/E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMtE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAGtE;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAGjC;AAED;;GAEG;AACH,wBAAgB,aAAa;;;;;EAO5B"}
@@ -3,21 +3,21 @@ import { createHash } from 'crypto';
3
3
  import { Logger } from './logger.js';
4
4
  /**
5
5
  * Whether LRU response caching is enabled.
6
- * Opt-in via environment variable GEMINI_CACHE_ENABLED=true.
6
+ * Opt-in via environment variable AGY_CACHE_ENABLED=true.
7
7
  * Defaults to false — users must explicitly enable caching.
8
8
  */
9
- export const isCacheEnabled = () => process.env.GEMINI_CACHE_ENABLED === 'true';
9
+ export const isCacheEnabled = () => process.env.AGY_CACHE_ENABLED === 'true';
10
10
  /**
11
- * LRU Cache for Gemini API responses
11
+ * LRU Cache for agy-backed Gemini responses
12
12
  * Caches responses to identical prompts with identical options
13
13
  *
14
14
  * Benefits:
15
15
  * - Near-instant responses for repeated queries
16
- * - Reduces API quota consumption
16
+ * - Reduces repeated CLI calls
17
17
  * - 30-minute TTL ensures fresh data
18
18
  * - 10MB max size prevents memory bloat
19
19
  *
20
- * Disabled by default. Enable via GEMINI_CACHE_ENABLED=true env var.
20
+ * Disabled by default. Enable via AGY_CACHE_ENABLED=true env var.
21
21
  */
22
22
  const responseCache = new LRUCache({
23
23
  max: 100, // Cache up to 100 recent responses
@@ -41,11 +41,16 @@ export function generateCacheKey(prompt, options) {
41
41
  yolo: options.yolo,
42
42
  approvalMode: options.approvalMode,
43
43
  outputFormat: options.outputFormat,
44
+ jsonSchema: options.jsonSchema,
45
+ effort: options.effort,
44
46
  includeDirectories: options.includeDirectories,
45
47
  debug: options.debug,
48
+ printTimeout: options.printTimeout,
46
49
  promptInteractive: options.promptInteractive,
47
50
  extensions: options.extensions,
48
- resume: options.resume
51
+ resume: options.resume,
52
+ conversationId: options.conversationId,
53
+ cwd: options.cwd
49
54
  });
50
55
  return createHash('sha256').update(cacheInput).digest('hex');
51
56
  }
@@ -1 +1 @@
1
- {"version":3,"file":"responseCache.js","sourceRoot":"","sources":["../../src/utils/responseCache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,GAAY,EAAE,CAC1C,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,MAAM,CAAC;AAE9C;;;;;;;;;;;GAWG;AACH,MAAM,aAAa,GAAG,IAAI,QAAQ,CAAiB;IACjD,GAAG,EAAE,GAAG,EAAG,mCAAmC;IAC9C,GAAG,EAAE,IAAI,GAAG,EAAE,GAAG,EAAE,EAAG,aAAa;IACnC,OAAO,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAG,sBAAsB;IAClD,eAAe,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM;IACxC,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,MAAM,CAAC,KAAK,CAAC,kBAAkB,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IAC5D,CAAC;CACF,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc,EAAE,OAAyB;IACxE,gDAAgD;IAChD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,MAAM;QACN,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;QAC9C,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC3C,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,KAAK,CAAC,cAAc,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,QAAgB;IAC9D,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACtC,MAAM,CAAC,KAAK,CAAC,oBAAoB,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,QAAQ,CAAC,MAAM,SAAS,CAAC,CAAC;AAC9F,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,aAAa,CAAC,KAAK,EAAE,CAAC;IACtB,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO;QACL,IAAI,EAAE,aAAa,CAAC,IAAI;QACxB,OAAO,EAAE,aAAa,CAAC,GAAG;QAC1B,cAAc,EAAE,aAAa,CAAC,cAAc;QAC5C,iBAAiB,EAAE,aAAa,CAAC,OAAO;KACzC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"responseCache.js","sourceRoot":"","sources":["../../src/utils/responseCache.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@joeytheman/gemini-mcp-tool",
3
- "version": "1.3.0",
4
- "description": "MCP server for Gemini CLI integration",
3
+ "version": "2.3.0",
4
+ "description": "MCP server for asking Gemini through Antigravity CLI (agy)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "bin": {
@@ -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",
@@ -26,6 +28,8 @@
26
28
  "mcp",
27
29
  "modelcontextprotocol",
28
30
  "gemini",
31
+ "antigravity",
32
+ "agy",
29
33
  "cli",
30
34
  "ai",
31
35
  "llm"
@@ -41,7 +45,7 @@
41
45
  },
42
46
  "homepage": "https://github.com/joeytheman/gemini-mcp-tool#readme",
43
47
  "engines": {
44
- "node": ">=18.0.0"
48
+ "node": ">=20.12.0"
45
49
  },
46
50
  "files": [
47
51
  "dist/",
@@ -49,31 +53,30 @@
49
53
  "LICENSE"
50
54
  ],
51
55
  "dependencies": {
52
- "@modelcontextprotocol/sdk": "^1.25.3",
53
- "chalk": "^5.0.0",
54
- "d3-shape": "^3.2.0",
55
- "inquirer": "^9.0.0",
56
- "lru-cache": "^11.2.4",
57
- "prismjs": "^1.30.0",
58
- "zod": "^3.25.76",
59
- "zod-to-json-schema": "^3.24.6"
56
+ "@modelcontextprotocol/sdk": "^1.32.2",
57
+ "lru-cache": "^11.5.3",
58
+ "zod": "^4.6.7"
60
59
  },
61
60
  "devDependencies": {
62
- "@types/inquirer": "^9.0.0",
63
- "@types/node": "^20.0.0",
64
- "@vitest/coverage-v8": "^2.1.8",
61
+ "@types/node": "^25.3.3",
62
+ "@vitest/coverage-v8": "^4.0.18",
65
63
  "archiver": "^7.0.1",
64
+ "esbuild": "^0.25.12",
66
65
  "mermaid": "^11.12.2",
66
+ "playwright-core": "1.64.1",
67
+ "prismjs": "^1.30.0",
67
68
  "tsx": "^4.0.0",
68
69
  "typescript": "^5.0.0",
69
70
  "vitepress": "^1.6.4",
70
71
  "vitepress-plugin-mermaid": "^2.0.17",
71
- "vitest": "^2.1.8"
72
+ "vitest": "^4.0.18"
72
73
  },
73
74
  "publishConfig": {
74
75
  "access": "public"
75
76
  },
76
77
  "overrides": {
77
- "esbuild": ">=0.25.0"
78
+ "vitepress": {
79
+ "esbuild": ">=0.25.0"
80
+ }
78
81
  }
79
82
  }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=geminiExecutor.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"geminiExecutor.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/utils/geminiExecutor.test.ts"],"names":[],"mappings":""}