@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,87 @@
1
+ import { describe, it, expect, beforeAll, afterAll } from 'vitest';
2
+ import * as fs from 'fs';
3
+ import * as os from 'os';
4
+ import * as path from 'path';
5
+ import { resolveFileReferences, isFilesystemRoot, normalizeList, } from '../../utils/fileReferences.js';
6
+ let baseDir;
7
+ let proj;
8
+ let projReal;
9
+ let utilsDir;
10
+ beforeAll(() => {
11
+ baseDir = fs.mkdtempSync(path.join(os.tmpdir(), 'fileref-'));
12
+ proj = path.join(baseDir, 'proj');
13
+ utilsDir = path.join(proj, 'src', 'utils');
14
+ fs.mkdirSync(utilsDir, { recursive: true });
15
+ fs.writeFileSync(path.join(proj, 'README.md'), '# readme');
16
+ fs.writeFileSync(path.join(proj, 'Makefile'), 'all:\n'); // extensionless
17
+ fs.writeFileSync(path.join(proj, 'notes.md'), 'notes');
18
+ fs.writeFileSync(path.join(utilsDir, 'x.ts'), 'export const x = 1;');
19
+ fs.writeFileSync(path.join(baseDir, 'secret.txt'), 'top secret'); // outside proj
20
+ fs.symlinkSync(path.join(baseDir, 'secret.txt'), path.join(proj, 'escape.ts')); // escape
21
+ projReal = fs.realpathSync(proj);
22
+ });
23
+ afterAll(() => {
24
+ fs.rmSync(baseDir, { recursive: true, force: true });
25
+ });
26
+ describe('normalizeList', () => {
27
+ it('splits comma strings and trims, dropping empties', () => {
28
+ expect(normalizeList('a, b ,, c')).toEqual(['a', 'b', 'c']);
29
+ expect(normalizeList(['x', ' y '])).toEqual(['x', 'y']);
30
+ expect(normalizeList(undefined)).toEqual([]);
31
+ });
32
+ });
33
+ describe('isFilesystemRoot', () => {
34
+ it('is true for the filesystem root and false for a normal dir', () => {
35
+ expect(isFilesystemRoot('/')).toBe(true);
36
+ expect(isFilesystemRoot(proj)).toBe(false);
37
+ });
38
+ });
39
+ describe('resolveFileReferences', () => {
40
+ it('registers the root for a bare reference that resolves', () => {
41
+ const { prompt, addDirs } = resolveFileReferences('review @README.md', { cwd: proj });
42
+ expect(addDirs).toEqual([projReal]);
43
+ expect(prompt).toBe('review @README.md'); // @ refs are not rewritten
44
+ });
45
+ it('registers the root for a nested reference', () => {
46
+ expect(resolveFileReferences('see @src/utils/x.ts', { cwd: proj }).addDirs).toEqual([projReal]);
47
+ });
48
+ it('registers extensionless files (Makefile)', () => {
49
+ expect(resolveFileReferences('build @Makefile', { cwd: proj }).addDirs).toEqual([projReal]);
50
+ });
51
+ it('resolves references under an includeDirectories root', () => {
52
+ const { addDirs } = resolveFileReferences('@x.ts', { cwd: baseDir, includeDirectories: utilsDir });
53
+ expect(addDirs).toEqual([fs.realpathSync(utilsDir)]);
54
+ });
55
+ it('ignores emails, @media, decorators, and non-existent refs without erroring', () => {
56
+ expect(resolveFileReferences('mail joey@gmail.com', { cwd: proj }).addDirs).toEqual([]);
57
+ expect(resolveFileReferences('css @media (min-width: 0)', { cwd: proj }).addDirs).toEqual([]);
58
+ expect(resolveFileReferences('use @Injectable() here', { cwd: proj }).addDirs).toEqual([]);
59
+ expect(resolveFileReferences('open @nope.ts', { cwd: proj }).addDirs).toEqual([]);
60
+ });
61
+ it('ignores absolute, traversal, and symlink-escape references', () => {
62
+ expect(resolveFileReferences('@/etc/hosts', { cwd: proj }).addDirs).toEqual([]);
63
+ expect(resolveFileReferences('@../secret.txt', { cwd: proj }).addDirs).toEqual([]);
64
+ expect(resolveFileReferences('@escape.ts', { cwd: proj }).addDirs).toEqual([]);
65
+ });
66
+ it('rewrites a resolving file: reference to @ and registers its root', () => {
67
+ const { prompt, addDirs } = resolveFileReferences('open file:src/utils/x.ts now', { cwd: proj });
68
+ expect(prompt).toBe('open @src/utils/x.ts now');
69
+ expect(addDirs).toEqual([projReal]);
70
+ });
71
+ it('drops trailing punctuation when converting file: to @', () => {
72
+ const { prompt, addDirs } = resolveFileReferences('edit file:notes.md.', { cwd: proj });
73
+ expect(prompt).toBe('edit @notes.md'); // trailing period dropped so agy resolves cleanly
74
+ expect(addDirs).toEqual([projReal]);
75
+ });
76
+ it('leaves non-resolving file: tokens and file:// URLs untouched (no manufactured @ref)', () => {
77
+ expect(resolveFileReferences('the file:notreal here', { cwd: proj })).toEqual({
78
+ prompt: 'the file:notreal here',
79
+ addDirs: [],
80
+ });
81
+ expect(resolveFileReferences('see file:///etc/passwd', { cwd: proj })).toEqual({
82
+ prompt: 'see file:///etc/passwd',
83
+ addDirs: [],
84
+ });
85
+ });
86
+ });
87
+ //# sourceMappingURL=fileReferences.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileReferences.test.js","sourceRoot":"","sources":["../../../src/__tests__/utils/fileReferences.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=gitStatusGuard.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitStatusGuard.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/utils/gitStatusGuard.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,106 @@
1
+ import { describe, it, expect, vi, afterEach } from 'vitest';
2
+ import * as fs from 'fs';
3
+ import * as path from 'path';
4
+ import { execFileSync } from 'child_process';
5
+ vi.mock('../../utils/logger.js', () => ({
6
+ Logger: { debug: vi.fn(), warn: vi.fn(), error: vi.fn(), log: vi.fn() },
7
+ }));
8
+ import { snapshotWorkingTree, diffWorkingTree } from '../../utils/gitStatusGuard.js';
9
+ import { formatWorkingTreeSection } from '../../utils/agyReport.js';
10
+ import { makeTempDir, cleanupTempDirs } from './test-helpers.js';
11
+ const makeGitTempDir = () => makeTempDir('git-guard');
12
+ afterEach(cleanupTempDirs);
13
+ describe('snapshotWorkingTree', () => {
14
+ it('returns null outside a git repository', async () => {
15
+ expect(await snapshotWorkingTree(makeGitTempDir())).toBeNull();
16
+ });
17
+ it('returns null for a directory that does not exist', async () => {
18
+ expect(await snapshotWorkingTree(path.join(makeGitTempDir(), 'missing'))).toBeNull();
19
+ });
20
+ it('lists porcelain status lines with the repository root and content hashes', async () => {
21
+ const dir = makeGitTempDir();
22
+ execFileSync('git', ['init', '-q'], { cwd: dir });
23
+ expect(await snapshotWorkingTree(dir)).toMatchObject({ root: dir, lines: [], truncated: false });
24
+ fs.writeFileSync(path.join(dir, 'new.txt'), 'hello');
25
+ const snapshot = await snapshotWorkingTree(dir);
26
+ expect(snapshot?.lines).toEqual(['?? new.txt']);
27
+ expect(snapshot?.hashes.get(path.join(dir, 'new.txt'))).toMatch(/^[0-9a-f]{64}$/);
28
+ });
29
+ it('lists every untracked file, not the collapsed parent directory', async () => {
30
+ const dir = makeGitTempDir();
31
+ execFileSync('git', ['init', '-q'], { cwd: dir });
32
+ const sub = path.join(dir, 'apps', 'web');
33
+ fs.mkdirSync(sub, { recursive: true });
34
+ fs.writeFileSync(path.join(sub, 'new.txt'), 'hello');
35
+ const snapshot = await snapshotWorkingTree(sub);
36
+ // Repo-root-relative, and expanded: `?? apps/` would hide siblings.
37
+ expect(snapshot?.root).toBe(dir);
38
+ expect(snapshot?.lines).toEqual(['?? apps/web/new.txt']);
39
+ });
40
+ it('hashes a file that is already dirty, so a later rewrite is detectable', async () => {
41
+ const dir = makeGitTempDir();
42
+ const git = (...args) => execFileSync('git', args, { cwd: dir });
43
+ git('init', '-q');
44
+ const file = path.join(dir, 'app.tsx');
45
+ fs.writeFileSync(file, 'committed');
46
+ git('add', 'app.tsx');
47
+ git('-c', 'user.email=t@t', '-c', 'user.name=t', 'commit', '-qm', 'seed');
48
+ fs.writeFileSync(file, 'dirty before the run');
49
+ const before = await snapshotWorkingTree(dir);
50
+ fs.writeFileSync(file, 'rewritten during the run');
51
+ const after = await snapshotWorkingTree(dir);
52
+ // The status line is identical (' M app.tsx') either side; only the hash moves.
53
+ expect(before?.lines).toEqual([' M app.tsx']);
54
+ expect(after?.lines).toEqual([' M app.tsx']);
55
+ expect(diffWorkingTree(before, after).modified).toEqual([file]);
56
+ });
57
+ });
58
+ function snapshot(lines, root = '/work/tree', hashes = {}) {
59
+ return { root, lines, hashes: new Map(Object.entries(hashes)), truncated: false };
60
+ }
61
+ describe('diffWorkingTree', () => {
62
+ it('reports added and removed lines', () => {
63
+ const diff = diffWorkingTree(snapshot(['?? a.txt', ' M b.txt']), snapshot([' M b.txt', '?? c.txt']));
64
+ expect(diff.added).toEqual(['?? c.txt']);
65
+ expect(diff.removed).toEqual(['?? a.txt']);
66
+ });
67
+ it('ignores the artifact directory but not a file created beside it', () => {
68
+ const diff = diffWorkingTree(snapshot([]), snapshot([
69
+ '?? .live-pass/run1/home.png',
70
+ '?? .live-pass/uninvited.txt',
71
+ ' M src/app/index.tsx',
72
+ ]), { ignoreDirectory: '/work/tree/.live-pass/run1' });
73
+ expect(diff.added).toEqual(['?? .live-pass/uninvited.txt', ' M src/app/index.tsx']);
74
+ });
75
+ it('resolves porcelain paths against the repo root when the tool runs in a subdirectory', () => {
76
+ const diff = diffWorkingTree(snapshot([], '/repo'), snapshot(['?? apps/web/.live-pass/run1/home.png', ' M apps/web/src/index.tsx'], '/repo'), { ignoreDirectory: '/repo/apps/web/.live-pass/run1' });
77
+ expect(diff.added).toEqual([' M apps/web/src/index.tsx']);
78
+ });
79
+ it('reads the path out of a quoted or renamed porcelain line', () => {
80
+ const diff = diffWorkingTree(snapshot([]), snapshot(['R old.txt -> .live-pass/run1/new.txt', '?? "spaced name.txt"']), { ignoreDirectory: '/work/tree/.live-pass/run1' });
81
+ expect(diff.added).toEqual(['?? "spaced name.txt"']);
82
+ });
83
+ it('reports content changes to a file whose status line never moved', () => {
84
+ const diff = diffWorkingTree(snapshot([' M src/app.tsx'], '/work/tree', { '/work/tree/src/app.tsx': 'aaa' }), snapshot([' M src/app.tsx'], '/work/tree', { '/work/tree/src/app.tsx': 'bbb' }));
85
+ expect(diff.added).toEqual([]);
86
+ expect(diff.modified).toEqual(['/work/tree/src/app.tsx']);
87
+ });
88
+ it('does not report a content change inside the artifact directory', () => {
89
+ const frame = '/work/tree/.live-pass/run1/home.png';
90
+ const diff = diffWorkingTree(snapshot(['?? .live-pass/run1/home.png'], '/work/tree', { [frame]: 'aaa' }), snapshot(['?? .live-pass/run1/home.png'], '/work/tree', { [frame]: 'bbb' }), { ignoreDirectory: '/work/tree/.live-pass/run1' });
91
+ expect(diff.modified).toEqual([]);
92
+ });
93
+ it('keeps the truncation caveat even when nothing it could check changed', () => {
94
+ const capped = { ...snapshot([]), truncated: true };
95
+ const diff = diffWorkingTree(capped, capped);
96
+ expect(diff.truncated).toBe(true);
97
+ expect(formatWorkingTreeSection(diff)).toContain('may be under-reported');
98
+ expect(formatWorkingTreeSection({ added: [], removed: [], modified: [], truncated: false })).toBe('');
99
+ });
100
+ it('reports nothing when either snapshot is missing', () => {
101
+ const empty = { added: [], removed: [], modified: [], truncated: false };
102
+ expect(diffWorkingTree(null, snapshot(['?? a.txt']))).toEqual(empty);
103
+ expect(diffWorkingTree(snapshot(['?? a.txt']), null)).toEqual(empty);
104
+ });
105
+ });
106
+ //# sourceMappingURL=gitStatusGuard.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitStatusGuard.test.js","sourceRoot":"","sources":["../../../src/__tests__/utils/gitStatusGuard.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,EAAE,CAAC,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE,CAAC,CAAC;IACtC,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE;CACxE,CAAC,CAAC,CAAC;AAEJ,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrF,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEjE,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;AAEtD,SAAS,CAAC,eAAe,CAAC,CAAC;AAE3B,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,CAAC,MAAM,mBAAmB,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,CAAC,MAAM,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACxF,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;QAC7B,YAAY,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QAEjG,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAEhD,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;QAC7B,YAAY,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAC1C,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;QAErD,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAEhD,oEAAoE;QACpE,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACrF,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,CAAC,GAAG,IAAc,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAC3E,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QACvC,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACpC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACtB,GAAG,CAAC,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAC1E,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;QAE/C,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC9C,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,0BAA0B,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAE7C,gFAAgF;QAChF,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,SAAS,QAAQ,CAAC,KAAe,EAAE,IAAI,GAAG,YAAY,EAAE,SAAiC,EAAE;IACzF,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACpF,CAAC;AAED,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;QAErG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,IAAI,GAAG,eAAe,CAC1B,QAAQ,CAAC,EAAE,CAAC,EACZ,QAAQ,CAAC;YACP,6BAA6B;YAC7B,6BAA6B;YAC7B,sBAAsB;SACvB,CAAC,EACF,EAAE,eAAe,EAAE,4BAA4B,EAAE,CAClD,CAAC;QAEF,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,6BAA6B,EAAE,sBAAsB,CAAC,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qFAAqF,EAAE,GAAG,EAAE;QAC7F,MAAM,IAAI,GAAG,eAAe,CAC1B,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,EACrB,QAAQ,CAAC,CAAC,sCAAsC,EAAE,2BAA2B,CAAC,EAAE,OAAO,CAAC,EACxF,EAAE,eAAe,EAAE,gCAAgC,EAAE,CACtD,CAAC;QAEF,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,IAAI,GAAG,eAAe,CAC1B,QAAQ,CAAC,EAAE,CAAC,EACZ,QAAQ,CAAC,CAAC,uCAAuC,EAAE,sBAAsB,CAAC,CAAC,EAC3E,EAAE,eAAe,EAAE,4BAA4B,EAAE,CAClD,CAAC;QAEF,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,IAAI,GAAG,eAAe,CAC1B,QAAQ,CAAC,CAAC,gBAAgB,CAAC,EAAE,YAAY,EAAE,EAAE,wBAAwB,EAAE,KAAK,EAAE,CAAC,EAC/E,QAAQ,CAAC,CAAC,gBAAgB,CAAC,EAAE,YAAY,EAAE,EAAE,wBAAwB,EAAE,KAAK,EAAE,CAAC,CAChF,CAAC;QAEF,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,KAAK,GAAG,qCAAqC,CAAC;QACpD,MAAM,IAAI,GAAG,eAAe,CAC1B,QAAQ,CAAC,CAAC,6BAA6B,CAAC,EAAE,YAAY,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,EAC3E,QAAQ,CAAC,CAAC,6BAA6B,CAAC,EAAE,YAAY,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,EAC3E,EAAE,eAAe,EAAE,4BAA4B,EAAE,CAClD,CAAC;QAEF,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC9E,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAEpD,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAE7C,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAC1E,MAAM,CAAC,wBAAwB,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,KAAK,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QACzE,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACrE,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=progressUpdates.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progressUpdates.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/utils/progressUpdates.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,62 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import { startProgressUpdates } from '../../utils/progressUpdates.js';
3
+ import { PROTOCOL } from '../../constants.js';
4
+ describe('startProgressUpdates', () => {
5
+ const send = vi.fn();
6
+ beforeEach(() => {
7
+ send.mockReset();
8
+ vi.useFakeTimers();
9
+ });
10
+ afterEach(() => {
11
+ vi.useRealTimers();
12
+ });
13
+ function callsFor(token) {
14
+ return send.mock.calls.filter(([progressToken]) => progressToken === token);
15
+ }
16
+ it('keeps sending keep-alives for a call after another call in the same server finishes', () => {
17
+ const first = startProgressUpdates('live-pass', 'tok-first', send);
18
+ startProgressUpdates('screen-review', 'tok-second', send);
19
+ first.finish('success');
20
+ send.mockClear();
21
+ vi.advanceTimersByTime(PROTOCOL.KEEPALIVE_INTERVAL);
22
+ expect(callsFor('tok-first')).toEqual([]);
23
+ expect(callsFor('tok-second')).toEqual([
24
+ ['tok-second', 1, undefined, expect.stringContaining('screen-review')],
25
+ ]);
26
+ });
27
+ it('shows each call only its own output preview', () => {
28
+ const first = startProgressUpdates('ask-gemini', 'tok-first', send);
29
+ const second = startProgressUpdates('brainstorm', 'tok-second', send);
30
+ first.recordOutput('alpha output');
31
+ second.recordOutput('beta output');
32
+ vi.advanceTimersByTime(PROTOCOL.KEEPALIVE_INTERVAL);
33
+ const [firstTick] = callsFor('tok-first').slice(-1);
34
+ const [secondTick] = callsFor('tok-second').slice(-1);
35
+ expect(firstTick[3]).toContain('alpha output');
36
+ expect(firstTick[3]).not.toContain('beta output');
37
+ expect(secondTick[3]).toContain('beta output');
38
+ });
39
+ it('sends a final notification for a finished or failed call', () => {
40
+ startProgressUpdates('ask-gemini', 'tok-ok', send).finish('success');
41
+ startProgressUpdates('ask-gemini', 'tok-failed', send).finish('failure');
42
+ expect(callsFor('tok-ok').slice(-1)).toEqual([['tok-ok', 1, 1, '✅ ask-gemini completed successfully']]);
43
+ expect(callsFor('tok-failed').slice(-1)).toEqual([['tok-failed', 1, 1, '❌ ask-gemini failed']]);
44
+ });
45
+ it('ends above the last keep-alive on a call that outlasts 100 keep-alives', () => {
46
+ const updates = startProgressUpdates('live-pass', 'tok-long', send);
47
+ vi.advanceTimersByTime(PROTOCOL.KEEPALIVE_INTERVAL * 101);
48
+ updates.finish('success');
49
+ const calls = callsFor('tok-long');
50
+ expect(calls.map(([, progress]) => progress)).toEqual(Array.from({ length: 103 }, (_, index) => index));
51
+ expect(calls.at(-1)).toEqual(['tok-long', 102, 102, '✅ live-pass completed successfully']);
52
+ expect(vi.getTimerCount()).toBe(0);
53
+ });
54
+ it('sends nothing when the client asked for no progress', () => {
55
+ const updates = startProgressUpdates('ask-gemini', undefined, send);
56
+ updates.recordOutput('ignored');
57
+ vi.advanceTimersByTime(PROTOCOL.KEEPALIVE_INTERVAL);
58
+ updates.finish('success');
59
+ expect(send).not.toHaveBeenCalled();
60
+ });
61
+ });
62
+ //# sourceMappingURL=progressUpdates.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progressUpdates.test.js","sourceRoot":"","sources":["../../../src/__tests__/utils/progressUpdates.test.ts"],"names":[],"mappings":"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"}
@@ -15,8 +15,8 @@ describe('responseCache', () => {
15
15
  });
16
16
  describe('generateCacheKey', () => {
17
17
  it('should produce a deterministic SHA256 hash', () => {
18
- const key1 = generateCacheKey('test prompt', { model: 'gemini-2.5-pro' });
19
- const key2 = generateCacheKey('test prompt', { model: 'gemini-2.5-pro' });
18
+ const key1 = generateCacheKey('test prompt', { model: 'Gemini 3.8 Flash (Medium)' });
19
+ const key2 = generateCacheKey('test prompt', { model: 'Gemini 3.8 Flash (Medium)' });
20
20
  expect(key1).toBe(key2);
21
21
  // SHA256 produces 64 hex chars
22
22
  expect(key1).toMatch(/^[0-9a-f]{64}$/);
@@ -36,25 +36,45 @@ describe('responseCache', () => {
36
36
  const key2 = generateCacheKey('test', { sandbox: false });
37
37
  expect(key1).not.toBe(key2);
38
38
  });
39
+ it('should produce different keys for different json schemas', () => {
40
+ const key1 = generateCacheKey('test', { outputFormat: 'json', jsonSchema: '{"a":1}' });
41
+ const key2 = generateCacheKey('test', { outputFormat: 'json', jsonSchema: '{"a":2}' });
42
+ expect(key1).not.toBe(key2);
43
+ });
44
+ it('should produce different keys for different effort levels', () => {
45
+ const key1 = generateCacheKey('test', { effort: 'low' });
46
+ const key2 = generateCacheKey('test', { effort: 'high' });
47
+ expect(key1).not.toBe(key2);
48
+ });
49
+ it('should produce different keys for different conversation IDs', () => {
50
+ const key1 = generateCacheKey('test', { conversationId: 'conv-a' });
51
+ const key2 = generateCacheKey('test', { conversationId: 'conv-b' });
52
+ expect(key1).not.toBe(key2);
53
+ });
54
+ it('should produce different keys for different working directories', () => {
55
+ const key1 = generateCacheKey('test', { cwd: '/project-a' });
56
+ const key2 = generateCacheKey('test', { cwd: '/project-b' });
57
+ expect(key1).not.toBe(key2);
58
+ });
39
59
  });
40
60
  describe('isCacheEnabled', () => {
41
61
  it('should return true when env var is "true"', () => {
42
- const original = process.env.GEMINI_CACHE_ENABLED;
43
- process.env.GEMINI_CACHE_ENABLED = 'true';
62
+ const original = process.env.AGY_CACHE_ENABLED;
63
+ process.env.AGY_CACHE_ENABLED = 'true';
44
64
  expect(isCacheEnabled()).toBe(true);
45
- process.env.GEMINI_CACHE_ENABLED = original;
65
+ process.env.AGY_CACHE_ENABLED = original;
46
66
  });
47
67
  it('should return false when env var is not "true"', () => {
48
- const original = process.env.GEMINI_CACHE_ENABLED;
49
- delete process.env.GEMINI_CACHE_ENABLED;
68
+ const original = process.env.AGY_CACHE_ENABLED;
69
+ delete process.env.AGY_CACHE_ENABLED;
50
70
  expect(isCacheEnabled()).toBe(false);
51
- process.env.GEMINI_CACHE_ENABLED = original;
71
+ process.env.AGY_CACHE_ENABLED = original;
52
72
  });
53
73
  it('should return false when env var is "false"', () => {
54
- const original = process.env.GEMINI_CACHE_ENABLED;
55
- process.env.GEMINI_CACHE_ENABLED = 'false';
74
+ const original = process.env.AGY_CACHE_ENABLED;
75
+ process.env.AGY_CACHE_ENABLED = 'false';
56
76
  expect(isCacheEnabled()).toBe(false);
57
- process.env.GEMINI_CACHE_ENABLED = original;
77
+ process.env.AGY_CACHE_ENABLED = original;
58
78
  });
59
79
  });
60
80
  describe('cacheResponse / getCachedResponse', () => {
@@ -1 +1 @@
1
- {"version":3,"file":"responseCache.test.js","sourceRoot":"","sources":["../../../src/__tests__/utils/responseCache.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"responseCache.test.js","sourceRoot":"","sources":["../../../src/__tests__/utils/responseCache.test.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,7 @@
1
+ /** A real temp directory, realpath'd so macOS /var -> /private/var containment checks hold. */
2
+ export declare function makeTempDir(prefix: string): string;
3
+ /** Remove every directory makeTempDir handed out; call from afterEach. */
4
+ export declare function cleanupTempDirs(): void;
1
5
  /**
2
6
  * Creates a mock child process for testing command execution
3
7
  */
@@ -1 +1 @@
1
- {"version":3,"file":"test-helpers.d.ts","sourceRoot":"","sources":["../../../src/__tests__/utils/test-helpers.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAgB,iBAAiB,QAWhC;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,SAAK,QAOlF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,SAAI,EAAE,KAAK,SAAK,QAOrG;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,SAAK,QAI9E"}
1
+ {"version":3,"file":"test-helpers.d.ts","sourceRoot":"","sources":["../../../src/__tests__/utils/test-helpers.ts"],"names":[],"mappings":"AAQA,+FAA+F;AAC/F,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED,0EAA0E;AAC1E,wBAAgB,eAAe,IAAI,IAAI,CAItC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,QAWhC;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,SAAK,QAOlF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,SAAI,EAAE,KAAK,SAAK,QAOrG;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,SAAK,QAI9E"}
@@ -1,5 +1,21 @@
1
1
  import { vi } from 'vitest';
2
2
  import { EventEmitter } from 'node:events';
3
+ import * as fs from 'fs';
4
+ import * as os from 'os';
5
+ import * as path from 'path';
6
+ const tempDirs = [];
7
+ /** A real temp directory, realpath'd so macOS /var -> /private/var containment checks hold. */
8
+ export function makeTempDir(prefix) {
9
+ const dir = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), `${prefix}-`)));
10
+ tempDirs.push(dir);
11
+ return dir;
12
+ }
13
+ /** Remove every directory makeTempDir handed out; call from afterEach. */
14
+ export function cleanupTempDirs() {
15
+ while (tempDirs.length > 0) {
16
+ fs.rmSync(tempDirs.pop(), { recursive: true, force: true });
17
+ }
18
+ }
3
19
  /**
4
20
  * Creates a mock child process for testing command execution
5
21
  */
@@ -1 +1 @@
1
- {"version":3,"file":"test-helpers.js","sourceRoot":"","sources":["../../../src/__tests__/utils/test-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,WAAW,GAAG,IAAI,YAAY,EAAS,CAAC;IAC9C,WAAW,CAAC,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;IACxC,WAAW,CAAC,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;IACxC,WAAW,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QAC/C,IAAI,KAAK,KAAK,MAAM;YAAE,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC;IAC7D,CAAC,CAAC,CAAC;IACH,WAAW,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QAC/C,IAAI,KAAK,KAAK,MAAM;YAAE,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC;IAC7D,CAAC,CAAC,CAAC;IACH,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,WAAgB,EAAE,MAAc,EAAE,KAAK,GAAG,EAAE;IACjF,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/B,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;QACD,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC/B,CAAC,EAAE,KAAK,CAAC,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,WAAgB,EAAE,WAAmB,EAAE,QAAQ,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE;IACpG,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/B,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC;QAC1C,CAAC;QACD,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC,EAAE,KAAK,CAAC,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,WAAgB,EAAE,KAAY,EAAE,KAAK,GAAG,EAAE;IAC7E,UAAU,CAAC,GAAG,EAAE;QACd,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC,EAAE,KAAK,CAAC,CAAC;AACZ,CAAC"}
1
+ {"version":3,"file":"test-helpers.js","sourceRoot":"","sources":["../../../src/__tests__/utils/test-helpers.ts"],"names":[],"mappings":"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"}
@@ -1,24 +1,86 @@
1
1
  export declare const LOG_PREFIX = "[GMCPT]";
2
2
  export declare const ERROR_MESSAGES: {
3
- readonly QUOTA_EXCEEDED: "RESOURCE_EXHAUSTED";
4
- readonly QUOTA_EXCEEDED_SHORT: "⚠️ Gemini Pro daily quota exceeded. Please retry with model: 'gemini-3-flash-preview'";
3
+ readonly AGY_NOT_FOUND: "Antigravity CLI (`agy`) was not found. Install or update Antigravity CLI, run `agy install`, then verify `agy --version` works from your shell.";
5
4
  readonly TOOL_NOT_FOUND: "not found in registry";
6
5
  readonly NO_PROMPT_PROVIDED: "Please provide a prompt for analysis. Use @ syntax to include files (e.g., '@largefile.js explain what this does') or ask general questions";
6
+ readonly UNSUPPORTED_AGY_OPTIONS: "Unsupported Antigravity CLI option(s)";
7
+ readonly INVALID_RESUME: "resume must be true, latest, continue, or a non-empty conversation ID.";
8
+ readonly AGY_NO_OUTPUT: "Antigravity CLI (`agy`) returned no output (it may have timed out resolving a file reference). Ensure any @referenced files exist under the working directory or an includeDirectories entry, narrow the prompt, or increase printTimeout.";
9
+ readonly UNSAFE_ROOT_YOLO: "Refusing to run agy with yolo (`--dangerously-skip-permissions`) when workingDirectory is a filesystem root. Set workingDirectory to a specific project directory.";
10
+ readonly UNSUPPORTED_OUTPUT_FORMAT: "outputFormat must be 'text' or 'json'. Antigravity CLI has no stream-json mode.";
11
+ readonly JSON_SCHEMA_REQUIRES_JSON: "jsonSchema requires outputFormat: 'json'.";
12
+ readonly INVALID_EFFORT: "effort must be one of: low, medium, high.";
13
+ readonly AGY_JSON_PARSE: "Could not parse the Antigravity CLI JSON envelope";
14
+ readonly AGY_STATUS_ERROR: "Antigravity CLI returned status ERROR";
15
+ readonly AGY_DENIED_ACTIONS: "Antigravity CLI produced no response because it denied required actions. Retry with `yolo: true`, or allow the actions in the Antigravity `permissions.allow` settings. Denied";
16
+ readonly CHANGEMODE_DENIED_ACTIONS: "changeMode returned no OLD/NEW edits. Ask again for the change as OLD/NEW edits, without yolo. Denied";
17
+ readonly AGY_EMPTY_ANSWER: "Antigravity CLI (`agy`) finished with an empty answer.";
18
+ readonly INVALID_PRINT_TIMEOUT: "printTimeout must be a duration such as 90s, 15m, 2h30m or 2.5h, or 0 for no limit";
19
+ readonly INVALID_CONVERSATION_ID: "conversationId must be a non-empty agy conversation ID.";
20
+ readonly CONVERSATION_NOT_RESUMED: "agy did not resume conversation";
21
+ readonly AGY_HUNG: "Antigravity CLI (`agy`) ran past its time limit and was stopped";
22
+ readonly AGY_CANCELLED: "The request was cancelled, so agy was stopped.";
23
+ readonly INVALID_WORKING_DIRECTORY: "workingDirectory must be an absolute path to an existing directory that is not a filesystem root";
24
+ readonly LIVE_PASS_ARTIFACT_DIR: "artifactDir must be an absolute path strictly inside workingDirectory";
25
+ readonly LIVE_PASS_WEB_VIEWPORT: "a playwright target's viewport must be WxH, such as 390x844";
26
+ readonly LIVE_PASS_NO_BRIEF: "brief is required: describe the base URL or app id, the served-branch marker, the seed case, and any navigation hints.";
27
+ readonly UNREFERENCEABLE_PATH: "path contains whitespace, which Antigravity CLI cannot resolve as an @reference. Move or rename it so the path has no spaces";
28
+ readonly SCREEN_REVIEW_NO_IMAGES: "review mode requires at least one absolute image path";
29
+ readonly SCREEN_REVIEW_IMAGE_MISSING: "image does not exist";
30
+ readonly SCREEN_REVIEW_ROUTE_FILE: "plan mode requires routeFile: an absolute path to an existing file inside workingDirectory";
31
+ readonly SCREEN_REVIEW_BASE_REF: "baseRef does not resolve to a merge base with HEAD in workingDirectory";
32
+ };
33
+ export declare const AGY_LIMITS: {
34
+ readonly CEILING_MARGIN_MS: number;
35
+ readonly DEFAULT_CEILING_MS: number;
36
+ readonly KILL_GRACE_MS: 10000;
37
+ readonly KILL_CLOSE_WAIT_MS: 1000;
38
+ };
39
+ export declare const PRINT_TIMEOUT_CEILING_NOTE: string;
40
+ export declare const AGY_INTERNAL: {
41
+ readonly ROOT_SEGMENTS: readonly [".gemini", "antigravity-cli"];
42
+ readonly TIMEOUT_SENTINEL: "Error: timed out waiting for response";
43
+ readonly CONVERSATIONS_DIR: "conversations";
44
+ readonly CONVERSATION_STORE_EXT: ".db";
45
+ readonly MODEL_STEP_TYPE: 15;
7
46
  };
8
47
  export declare const STATUS_MESSAGES: {
9
- readonly QUOTA_SWITCHING: "🚫 Gemini Pro quota exceeded, switching to Flash model...";
10
- readonly FLASH_RETRY: "⚡ Retrying with Gemini Flash...";
11
- readonly FLASH_SUCCESS: "✅ Flash model completed successfully";
12
- readonly SANDBOX_EXECUTING: "🔒 Executing Gemini CLI command in sandbox mode...";
48
+ readonly SANDBOX_EXECUTING: "🔒 Executing Antigravity CLI command in sandbox mode...";
13
49
  readonly GEMINI_RESPONSE: "Gemini response:";
14
50
  readonly PROCESSING_START: "🔍 Starting analysis (may take 5-15 minutes for large codebases)";
15
51
  readonly PROCESSING_CONTINUE: "⏳ Still processing... Gemini is working on your request";
16
52
  readonly PROCESSING_COMPLETE: "✅ Analysis completed successfully";
17
53
  };
18
54
  export declare const MODELS: {
19
- readonly PRO: "gemini-3.1-pro-preview";
20
- readonly FLASH: "gemini-3-flash-preview";
55
+ readonly DEFAULT: "Gemini 4 Argon (High)";
56
+ readonly MEDIUM: "Gemini 3.8 Flash (Medium)";
57
+ };
58
+ export declare const MODEL_CHOICE_DESCRIPTION = "Optional Antigravity model name. Verified options: 'Gemini 4 Argon (Low)', 'Gemini 4 Argon (Medium)', 'Gemini 4 Argon (High)', 'Gemini 3.8 Flash (Low)', 'Gemini 3.8 Flash (Medium)', and 'Gemini 3.8 Flash (High)'. Availability depends on your CLI version and account; check `agy models`. Some accounts also expose 'Gemini 3.1 Pro (Low)' and 'Gemini 3.1 Pro (High)'. The tier in the name is the reasoning effort.";
59
+ export declare const LIVE_PASS: {
60
+ readonly DEFAULT_ARTIFACT_SEGMENT: ".live-pass";
61
+ readonly MANIFEST_FILE: "manifest.json";
62
+ readonly DEFAULT_PRINT_TIMEOUT: "15m";
63
+ readonly SCREEN_REVIEW_PRINT_TIMEOUT: "10m";
64
+ readonly PLAYWRIGHT_MCP_NAME: "playwright";
65
+ readonly MAESTRO_MCP_NAME: "maestro";
66
+ readonly FRESHNESS_TOLERANCE_MS: 2000;
67
+ readonly CONVERSATION_LINE_PREFIX: "[GEMINI_CONVERSATION_ID=";
68
+ readonly LAYOUT_FILE_SUFFIX: ".layout.json";
69
+ readonly CAPTURE_FILE_SUFFIX: ".capture.js";
70
+ readonly CAPTURE_SETTLE_MS: 1000;
71
+ readonly CAPTURE_MAX_HEIGHT: 4000;
72
+ readonly CAPTURE_MAX_GROWS: 4;
73
+ readonly LAYOUT_CHECK_ID: "layout-check/1";
74
+ readonly LAYOUT_MAX_ENTRIES: 50;
75
+ readonly LAYOUT_TEXT_CHARS: 80;
21
76
  };
77
+ /**
78
+ * Embedded in each web target's capture file, which runs it in the page right
79
+ * after the screenshot. Its return value is the `.layout.json` file the layout
80
+ * validator parses, so the two change together. The readable source is
81
+ * src/layout-check.snippet.js; its caps and check id must equal LIVE_PASS's.
82
+ */
83
+ export { LAYOUT_CHECK_SNIPPET } from './layoutCheckSnippet.generated.js';
22
84
  export declare const PROTOCOL: {
23
85
  readonly ROLES: {
24
86
  readonly USER: "user";
@@ -40,33 +102,32 @@ export declare const PROTOCOL: {
40
102
  };
41
103
  export declare const CLI: {
42
104
  readonly COMMANDS: {
43
- readonly GEMINI: "gemini";
105
+ readonly AGY: "agy";
44
106
  readonly ECHO: "echo";
45
107
  };
46
108
  readonly FLAGS: {
47
- readonly MODEL: "-m";
48
- readonly SANDBOX: "-s";
49
- readonly PROMPT: "-p";
50
- readonly HELP: "-help";
51
- readonly YOLO: "-y";
52
- readonly APPROVAL_MODE: "--approval-mode";
53
- readonly OUTPUT_FORMAT: "-o";
54
- readonly INCLUDE_DIRECTORIES: "--include-directories";
55
- readonly DEBUG: "-d";
56
- readonly PROMPT_INTERACTIVE: "-i";
57
- readonly EXTENSIONS: "-e";
58
- readonly RESUME: "-r";
109
+ readonly MODEL: "--model";
110
+ readonly SANDBOX: "--sandbox";
111
+ readonly PRINT: "--print";
112
+ readonly HELP: "--help";
113
+ readonly YOLO: "--dangerously-skip-permissions";
114
+ readonly ADD_DIR: "--add-dir";
115
+ readonly PRINT_TIMEOUT: "--print-timeout";
116
+ readonly CONTINUE: "--continue";
117
+ readonly CONVERSATION: "--conversation";
118
+ readonly OUTPUT_FORMAT: "--output-format";
119
+ readonly JSON_SCHEMA: "--json-schema";
120
+ readonly EFFORT: "--effort";
59
121
  };
60
122
  readonly DEFAULTS: {
61
- readonly MODEL: "default";
62
123
  readonly BOOLEAN_TRUE: "true";
63
124
  readonly BOOLEAN_FALSE: "false";
64
- readonly APPROVAL_MODE_DEFAULT: "default";
65
- readonly APPROVAL_MODE_AUTO_EDIT: "auto_edit";
66
125
  readonly APPROVAL_MODE_YOLO: "yolo";
126
+ readonly RESUME_LATEST: "latest";
127
+ readonly RESUME_CONTINUE: "continue";
67
128
  readonly OUTPUT_FORMAT_TEXT: "text";
68
129
  readonly OUTPUT_FORMAT_JSON: "json";
69
- readonly OUTPUT_FORMAT_STREAM_JSON: "stream-json";
130
+ readonly EFFORT_LEVELS: readonly ["low", "medium", "high"];
70
131
  };
71
132
  };
72
133
  export interface ToolArguments {
@@ -80,11 +141,15 @@ export interface ToolArguments {
80
141
  yolo?: boolean | string;
81
142
  approvalMode?: string;
82
143
  outputFormat?: string;
144
+ jsonSchema?: string;
145
+ effort?: string;
146
+ conversationId?: string;
83
147
  includeDirectories?: string | string[];
84
148
  debug?: boolean | string;
149
+ printTimeout?: string;
85
150
  promptInteractive?: string;
86
151
  extensions?: string | string[];
87
- resume?: string;
152
+ resume?: boolean | string;
88
153
  methodology?: string;
89
154
  domain?: string;
90
155
  constraints?: string;