@joeytheman/gemini-mcp-tool 1.3.0 → 2.2.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 (115) hide show
  1. package/README.md +123 -34
  2. package/dist/__tests__/ask-gemini.test.js +99 -37
  3. package/dist/__tests__/ask-gemini.test.js.map +1 -1
  4. package/dist/__tests__/live-pass.test.d.ts +2 -0
  5. package/dist/__tests__/live-pass.test.d.ts.map +1 -0
  6. package/dist/__tests__/live-pass.test.js +725 -0
  7. package/dist/__tests__/live-pass.test.js.map +1 -0
  8. package/dist/__tests__/screen-review.test.d.ts +2 -0
  9. package/dist/__tests__/screen-review.test.d.ts.map +1 -0
  10. package/dist/__tests__/screen-review.test.js +444 -0
  11. package/dist/__tests__/screen-review.test.js.map +1 -0
  12. package/dist/__tests__/server.test.js +17 -12
  13. package/dist/__tests__/server.test.js.map +1 -1
  14. package/dist/__tests__/simple-tools.test.d.ts +2 -0
  15. package/dist/__tests__/simple-tools.test.d.ts.map +1 -0
  16. package/dist/__tests__/simple-tools.test.js +25 -0
  17. package/dist/__tests__/simple-tools.test.js.map +1 -0
  18. package/dist/__tests__/tools.test.js +63 -0
  19. package/dist/__tests__/tools.test.js.map +1 -1
  20. package/dist/__tests__/utils/agyExecutor.test.d.ts +2 -0
  21. package/dist/__tests__/utils/agyExecutor.test.d.ts.map +1 -0
  22. package/dist/__tests__/utils/agyExecutor.test.js +616 -0
  23. package/dist/__tests__/utils/agyExecutor.test.js.map +1 -0
  24. package/dist/__tests__/utils/agyTranscriptRecovery.test.d.ts +2 -0
  25. package/dist/__tests__/utils/agyTranscriptRecovery.test.d.ts.map +1 -0
  26. package/dist/__tests__/utils/agyTranscriptRecovery.test.js +127 -0
  27. package/dist/__tests__/utils/agyTranscriptRecovery.test.js.map +1 -0
  28. package/dist/__tests__/utils/chunkCache.test.js +26 -2
  29. package/dist/__tests__/utils/chunkCache.test.js.map +1 -1
  30. package/dist/__tests__/utils/commandExecutor.test.js +30 -6
  31. package/dist/__tests__/utils/commandExecutor.test.js.map +1 -1
  32. package/dist/__tests__/utils/fileReferences.test.d.ts +2 -0
  33. package/dist/__tests__/utils/fileReferences.test.d.ts.map +1 -0
  34. package/dist/__tests__/utils/fileReferences.test.js +87 -0
  35. package/dist/__tests__/utils/fileReferences.test.js.map +1 -0
  36. package/dist/__tests__/utils/gitStatusGuard.test.d.ts +2 -0
  37. package/dist/__tests__/utils/gitStatusGuard.test.d.ts.map +1 -0
  38. package/dist/__tests__/utils/gitStatusGuard.test.js +106 -0
  39. package/dist/__tests__/utils/gitStatusGuard.test.js.map +1 -0
  40. package/dist/__tests__/utils/responseCache.test.js +31 -11
  41. package/dist/__tests__/utils/responseCache.test.js.map +1 -1
  42. package/dist/__tests__/utils/test-helpers.d.ts +4 -0
  43. package/dist/__tests__/utils/test-helpers.d.ts.map +1 -1
  44. package/dist/__tests__/utils/test-helpers.js +16 -0
  45. package/dist/__tests__/utils/test-helpers.js.map +1 -1
  46. package/dist/constants.d.ts +68 -26
  47. package/dist/constants.d.ts.map +1 -1
  48. package/dist/constants.js +69 -28
  49. package/dist/constants.js.map +1 -1
  50. package/dist/index.js +2 -2
  51. package/dist/index.js.map +1 -1
  52. package/dist/tools/ask-gemini.tool.d.ts +34 -0
  53. package/dist/tools/ask-gemini.tool.d.ts.map +1 -1
  54. package/dist/tools/ask-gemini.tool.js +38 -22
  55. package/dist/tools/ask-gemini.tool.js.map +1 -1
  56. package/dist/tools/brainstorm.tool.d.ts.map +1 -1
  57. package/dist/tools/brainstorm.tool.js +5 -4
  58. package/dist/tools/brainstorm.tool.js.map +1 -1
  59. package/dist/tools/index.d.ts.map +1 -1
  60. package/dist/tools/index.js +3 -1
  61. package/dist/tools/index.js.map +1 -1
  62. package/dist/tools/live-pass.tool.d.ts +183 -0
  63. package/dist/tools/live-pass.tool.d.ts.map +1 -0
  64. package/dist/tools/live-pass.tool.js +548 -0
  65. package/dist/tools/live-pass.tool.js.map +1 -0
  66. package/dist/tools/registry.d.ts +4 -2
  67. package/dist/tools/registry.d.ts.map +1 -1
  68. package/dist/tools/registry.js +12 -9
  69. package/dist/tools/registry.js.map +1 -1
  70. package/dist/tools/screen-review.tool.d.ts +121 -0
  71. package/dist/tools/screen-review.tool.d.ts.map +1 -0
  72. package/dist/tools/screen-review.tool.js +415 -0
  73. package/dist/tools/screen-review.tool.js.map +1 -0
  74. package/dist/tools/simple-tools.d.ts.map +1 -1
  75. package/dist/tools/simple-tools.js +4 -2
  76. package/dist/tools/simple-tools.js.map +1 -1
  77. package/dist/utils/agyExecutor.d.ts +68 -0
  78. package/dist/utils/agyExecutor.d.ts.map +1 -0
  79. package/dist/utils/agyExecutor.js +443 -0
  80. package/dist/utils/agyExecutor.js.map +1 -0
  81. package/dist/utils/agyReport.d.ts +19 -0
  82. package/dist/utils/agyReport.d.ts.map +1 -0
  83. package/dist/utils/agyReport.js +62 -0
  84. package/dist/utils/agyReport.js.map +1 -0
  85. package/dist/utils/agyTranscriptRecovery.d.ts +16 -0
  86. package/dist/utils/agyTranscriptRecovery.d.ts.map +1 -0
  87. package/dist/utils/agyTranscriptRecovery.js +149 -0
  88. package/dist/utils/agyTranscriptRecovery.js.map +1 -0
  89. package/dist/utils/chunkCache.d.ts.map +1 -1
  90. package/dist/utils/chunkCache.js +19 -5
  91. package/dist/utils/chunkCache.js.map +1 -1
  92. package/dist/utils/commandExecutor.d.ts.map +1 -1
  93. package/dist/utils/commandExecutor.js +15 -7
  94. package/dist/utils/commandExecutor.js.map +1 -1
  95. package/dist/utils/fileReferences.d.ts +45 -0
  96. package/dist/utils/fileReferences.d.ts.map +1 -0
  97. package/dist/utils/fileReferences.js +169 -0
  98. package/dist/utils/fileReferences.js.map +1 -0
  99. package/dist/utils/gitStatusGuard.d.ts +35 -0
  100. package/dist/utils/gitStatusGuard.d.ts.map +1 -0
  101. package/dist/utils/gitStatusGuard.js +82 -0
  102. package/dist/utils/gitStatusGuard.js.map +1 -0
  103. package/dist/utils/responseCache.d.ts +3 -3
  104. package/dist/utils/responseCache.d.ts.map +1 -1
  105. package/dist/utils/responseCache.js +11 -6
  106. package/dist/utils/responseCache.js.map +1 -1
  107. package/package.json +10 -9
  108. package/dist/__tests__/utils/geminiExecutor.test.d.ts +0 -2
  109. package/dist/__tests__/utils/geminiExecutor.test.d.ts.map +0 -1
  110. package/dist/__tests__/utils/geminiExecutor.test.js +0 -337
  111. package/dist/__tests__/utils/geminiExecutor.test.js.map +0 -1
  112. package/dist/utils/geminiExecutor.d.ts +0 -17
  113. package/dist/utils/geminiExecutor.d.ts.map +0 -1
  114. package/dist/utils/geminiExecutor.js +0 -238
  115. package/dist/utils/geminiExecutor.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"simple-tools.d.ts","sourceRoot":"","sources":["../../src/tools/simple-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAO5C,eAAO,MAAM,QAAQ,EAAE,WAiBtB,CAAC;AAIF,eAAO,MAAM,QAAQ,EAAE,WAgBtB,CAAC"}
1
+ {"version":3,"file":"simple-tools.d.ts","sourceRoot":"","sources":["../../src/tools/simple-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAO5C,eAAO,MAAM,QAAQ,EAAE,WAmBtB,CAAC;AAIF,eAAO,MAAM,QAAQ,EAAE,WAgBtB,CAAC"}
@@ -18,7 +18,9 @@ export const pingTool = {
18
18
  },
19
19
  execute: async (args, onProgress) => {
20
20
  const message = args.prompt || args.message || "Pong!";
21
- return executeCommand("echo", [message], onProgress);
21
+ const text = message;
22
+ onProgress?.(text);
23
+ return text;
22
24
  }
23
25
  };
24
26
  const helpArgsSchema = z.object({});
@@ -36,7 +38,7 @@ export const helpTool = {
36
38
  openWorldHint: true,
37
39
  },
38
40
  execute: async (args, onProgress) => {
39
- return executeCommand("gemini", ["-help"], onProgress);
41
+ return executeCommand("agy", ["--help"], onProgress);
40
42
  }
41
43
  };
42
44
  //# sourceMappingURL=simple-tools.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"simple-tools.js","sourceRoot":"","sources":["../../src/tools/simple-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC;CAC5D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,QAAQ,GAAgB;IACnC,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,MAAM;IACnB,SAAS,EAAE,cAAc;IACzB,MAAM,EAAE;QACN,WAAW,EAAE,6CAA6C;KAC3D;IACD,QAAQ,EAAE,QAAQ;IAClB,WAAW,EAAE;QACX,KAAK,EAAE,MAAM;QACb,YAAY,EAAE,IAAI;QAClB,cAAc,EAAE,IAAI;KACrB;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC;QACvD,OAAO,cAAc,CAAC,MAAM,EAAE,CAAC,OAAiB,CAAC,EAAE,UAAU,CAAC,CAAC;IACjE,CAAC;CACF,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAEpC,MAAM,CAAC,MAAM,QAAQ,GAAgB;IACnC,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,0BAA0B;IACvC,SAAS,EAAE,cAAc;IACzB,MAAM,EAAE;QACN,WAAW,EAAE,0BAA0B;KACxC;IACD,QAAQ,EAAE,QAAQ;IAClB,WAAW,EAAE;QACX,KAAK,EAAE,MAAM;QACb,YAAY,EAAE,IAAI;QAClB,aAAa,EAAE,IAAI;KACpB;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE;QAClC,OAAO,cAAc,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC;IACzD,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"simple-tools.js","sourceRoot":"","sources":["../../src/tools/simple-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC;CAC5D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,QAAQ,GAAgB;IACnC,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,MAAM;IACnB,SAAS,EAAE,cAAc;IACzB,MAAM,EAAE;QACN,WAAW,EAAE,6CAA6C;KAC3D;IACD,QAAQ,EAAE,QAAQ;IAClB,WAAW,EAAE;QACX,KAAK,EAAE,MAAM;QACb,YAAY,EAAE,IAAI;QAClB,cAAc,EAAE,IAAI;KACrB;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC;QACvD,MAAM,IAAI,GAAG,OAAiB,CAAC;QAC/B,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAEpC,MAAM,CAAC,MAAM,QAAQ,GAAgB;IACnC,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,0BAA0B;IACvC,SAAS,EAAE,cAAc;IACzB,MAAM,EAAE;QACN,WAAW,EAAE,0BAA0B;KACxC;IACD,QAAQ,EAAE,QAAQ;IAClB,WAAW,EAAE;QACX,KAAK,EAAE,MAAM;QACb,YAAY,EAAE,IAAI;QAClB,aAAa,EAAE,IAAI;KACpB;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE;QAClC,OAAO,cAAc,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,CAAC;IACvD,CAAC;CACF,CAAC"}
@@ -0,0 +1,68 @@
1
+ import { type ZodType } from 'zod';
2
+ export interface AgyCLIOptions {
3
+ model?: string;
4
+ sandbox?: boolean;
5
+ changeMode?: boolean;
6
+ yolo?: boolean;
7
+ approvalMode?: string;
8
+ outputFormat?: string;
9
+ jsonSchema?: string;
10
+ effort?: string;
11
+ includeDirectories?: string | string[];
12
+ debug?: boolean;
13
+ printTimeout?: string;
14
+ promptInteractive?: string;
15
+ extensions?: string | string[];
16
+ resume?: boolean | string;
17
+ conversationId?: string;
18
+ noCache?: boolean;
19
+ cwd?: string;
20
+ }
21
+ export interface AgyUsage {
22
+ input_tokens?: number;
23
+ output_tokens?: number;
24
+ thinking_tokens?: number;
25
+ cache_read_tokens?: number;
26
+ total_tokens?: number;
27
+ }
28
+ export interface AgyDeniedAction {
29
+ action?: string;
30
+ display_name?: string;
31
+ }
32
+ /** One line of `agy --output-format json` output. */
33
+ export interface AgyJsonEnvelope {
34
+ conversation_id?: string;
35
+ status?: string;
36
+ response?: string;
37
+ error?: string;
38
+ structured_output?: unknown;
39
+ num_turns?: number;
40
+ duration_seconds?: number;
41
+ usage?: AgyUsage;
42
+ denied_actions?: AgyDeniedAction[];
43
+ }
44
+ /**
45
+ * The conversation this call asked agy to resume, if any. `resume` with a bare
46
+ * ID maps to the same `--conversation` flag as `conversationId`, so both must be
47
+ * checked against what agy actually returned.
48
+ */
49
+ export declare function requestedConversationId(opts: AgyCLIOptions): string | undefined;
50
+ export declare function parseAgyJsonEnvelope(stdout: string): AgyJsonEnvelope;
51
+ /** Human-readable "DisplayName (action)" list of the actions agy refused to run. */
52
+ export declare function deniedActionsSummary(envelope: AgyJsonEnvelope): string;
53
+ export declare function formatAgyUsageLine(envelope: AgyJsonEnvelope): string;
54
+ /**
55
+ * Render an envelope for a human reader. A resumed turn replays the PREVIOUS
56
+ * turn's structured_output, so it is only trusted when this call passed a schema.
57
+ */
58
+ export declare function renderAgyJsonEnvelope(envelope: AgyJsonEnvelope, opts?: {
59
+ hadSchema?: boolean;
60
+ }): string;
61
+ export declare function formatConversationLine(conversationId: string): string;
62
+ /** A zod schema as the JSON Schema agy's `--json-schema` accepts (no `$schema` key). */
63
+ export declare function toAgyJsonSchema(schema: ZodType): Record<string, unknown>;
64
+ export declare function executeAgyCLI(prompt: string, options: AgyCLIOptions | string, onProgress?: (newOutput: string) => void): Promise<string>;
65
+ /** Run agy in json mode and return the parsed envelope. */
66
+ export declare function executeAgyJson(prompt: string, options?: AgyCLIOptions, onProgress?: (newOutput: string) => void): Promise<AgyJsonEnvelope>;
67
+ export declare function processChangeModeOutput(rawResult: string, chunkIndex?: number, chunkCacheKey?: string, prompt?: string): Promise<string>;
68
+ //# sourceMappingURL=agyExecutor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agyExecutor.d.ts","sourceRoot":"","sources":["../../src/utils/agyExecutor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,443 @@
1
+ import { z } from 'zod';
2
+ import { executeCommand } from './commandExecutor.js';
3
+ import { Logger } from './logger.js';
4
+ import { ERROR_MESSAGES, MODELS, CLI, AGY_INTERNAL, LIVE_PASS } from '../constants.js';
5
+ import { parseChangeModeOutput, validateChangeModeEdits } from './changeModeParser.js';
6
+ import { formatChangeModeResponse, summarizeChangeModeEdits } from './changeModeTranslator.js';
7
+ import { chunkChangeModeEdits } from './changeModeChunker.js';
8
+ import { cacheChunks, getChunks } from './chunkCache.js';
9
+ import { generateCacheKey, getCachedResponse, cacheResponse, isCacheEnabled } from './responseCache.js';
10
+ import { normalizeList, resolveFileReferences, isFilesystemRoot } from './fileReferences.js';
11
+ import { recoverFromTranscript, isRecoverableEmptyOutput } from './agyTranscriptRecovery.js';
12
+ const AGY_STATUS_SUCCESS = 'SUCCESS';
13
+ const AGY_STATUS_ERROR = 'ERROR';
14
+ const PARSE_EXCERPT_CHARS = 200;
15
+ function isYoloEnabled(opts) {
16
+ return Boolean(opts.yolo) || opts.approvalMode === CLI.DEFAULTS.APPROVAL_MODE_YOLO;
17
+ }
18
+ function isJsonMode(opts) {
19
+ return opts.outputFormat === CLI.DEFAULTS.OUTPUT_FORMAT_JSON;
20
+ }
21
+ function validateAgyOptions(opts) {
22
+ const unsupported = [];
23
+ if (opts.debug)
24
+ unsupported.push('debug');
25
+ if (opts.promptInteractive)
26
+ unsupported.push('promptInteractive');
27
+ if (opts.extensions)
28
+ unsupported.push('extensions');
29
+ if (opts.approvalMode && opts.approvalMode !== CLI.DEFAULTS.APPROVAL_MODE_YOLO) {
30
+ unsupported.push(`approvalMode:${opts.approvalMode}`);
31
+ }
32
+ if (unsupported.length > 0) {
33
+ throw new Error(`${ERROR_MESSAGES.UNSUPPORTED_AGY_OPTIONS}: ${unsupported.join(', ')}. ` +
34
+ `The Antigravity CLI headless path supports model, sandbox, yolo, includeDirectories, printTimeout, ` +
35
+ `resume, conversationId, outputFormat, jsonSchema, effort, and workingDirectory.`);
36
+ }
37
+ if (opts.outputFormat &&
38
+ opts.outputFormat !== CLI.DEFAULTS.OUTPUT_FORMAT_TEXT &&
39
+ opts.outputFormat !== CLI.DEFAULTS.OUTPUT_FORMAT_JSON) {
40
+ throw new Error(`${ERROR_MESSAGES.UNSUPPORTED_OUTPUT_FORMAT} Received '${opts.outputFormat}'.`);
41
+ }
42
+ if (opts.jsonSchema && !isJsonMode(opts)) {
43
+ throw new Error(ERROR_MESSAGES.JSON_SCHEMA_REQUIRES_JSON);
44
+ }
45
+ // Passthrough only: agy rejects --effort for tiered Gemini names and that
46
+ // error is surfaced verbatim. We only guard the shape.
47
+ if (opts.effort && !CLI.DEFAULTS.EFFORT_LEVELS.includes(opts.effort)) {
48
+ throw new Error(`${ERROR_MESSAGES.INVALID_EFFORT} Received '${opts.effort}'.`);
49
+ }
50
+ if (opts.changeMode && isJsonMode(opts)) {
51
+ throw new Error(`${ERROR_MESSAGES.UNSUPPORTED_AGY_OPTIONS}: changeMode with outputFormat 'json'. ` +
52
+ `changeMode returns OLD/NEW text, not a JSON envelope.`);
53
+ }
54
+ if (opts.conversationId !== undefined && !opts.conversationId.trim()) {
55
+ throw new Error(ERROR_MESSAGES.INVALID_CONVERSATION_ID);
56
+ }
57
+ // Refuse yolo (skip-permissions) from a filesystem root, which would grant agy
58
+ // unrestricted access to the whole drive. Check the effective cwd: when
59
+ // workingDirectory is omitted, agy inherits the server's process.cwd().
60
+ if (isYoloEnabled(opts) && isFilesystemRoot(opts.cwd || process.cwd())) {
61
+ throw new Error(ERROR_MESSAGES.UNSAFE_ROOT_YOLO);
62
+ }
63
+ }
64
+ function resolveResumeArgs(resume) {
65
+ if (resume === undefined || resume === false)
66
+ return [];
67
+ const normalized = String(resume).trim();
68
+ const lower = normalized.toLowerCase();
69
+ if (lower === CLI.DEFAULTS.BOOLEAN_FALSE)
70
+ return [];
71
+ if (normalized === '') {
72
+ throw new Error(ERROR_MESSAGES.INVALID_RESUME);
73
+ }
74
+ if (resume === true ||
75
+ lower === CLI.DEFAULTS.BOOLEAN_TRUE ||
76
+ lower === CLI.DEFAULTS.RESUME_LATEST ||
77
+ lower === CLI.DEFAULTS.RESUME_CONTINUE) {
78
+ return [CLI.FLAGS.CONTINUE];
79
+ }
80
+ return [CLI.FLAGS.CONVERSATION, normalized];
81
+ }
82
+ /**
83
+ * The conversation this call asked agy to resume, if any. `resume` with a bare
84
+ * ID maps to the same `--conversation` flag as `conversationId`, so both must be
85
+ * checked against what agy actually returned.
86
+ */
87
+ export function requestedConversationId(opts) {
88
+ const explicit = opts.conversationId?.trim();
89
+ if (explicit)
90
+ return explicit;
91
+ const args = resolveResumeArgs(opts.resume);
92
+ return args[0] === CLI.FLAGS.CONVERSATION ? args[1] : undefined;
93
+ }
94
+ /** An explicit conversationId wins over `resume`. */
95
+ function resolveConversationArgs(opts) {
96
+ const explicit = opts.conversationId?.trim();
97
+ if (explicit)
98
+ return [CLI.FLAGS.CONVERSATION, explicit];
99
+ return resolveResumeArgs(opts.resume);
100
+ }
101
+ function buildAgyArgs(opts, prompt, refDirs) {
102
+ const args = [];
103
+ const model = opts.model || MODELS.DEFAULT;
104
+ args.push(CLI.FLAGS.MODEL, model);
105
+ if (opts.effort) {
106
+ args.push(CLI.FLAGS.EFFORT, opts.effort);
107
+ }
108
+ if (opts.sandbox) {
109
+ args.push(CLI.FLAGS.SANDBOX);
110
+ }
111
+ if (isYoloEnabled(opts)) {
112
+ args.push(CLI.FLAGS.YOLO);
113
+ }
114
+ // Explicit includeDirectories plus the directories resolved from @file
115
+ // references, deduped.
116
+ for (const dir of new Set([...normalizeList(opts.includeDirectories), ...refDirs])) {
117
+ args.push(CLI.FLAGS.ADD_DIR, dir);
118
+ }
119
+ if (opts.printTimeout) {
120
+ args.push(CLI.FLAGS.PRINT_TIMEOUT, opts.printTimeout);
121
+ }
122
+ if (isJsonMode(opts)) {
123
+ args.push(CLI.FLAGS.OUTPUT_FORMAT, CLI.DEFAULTS.OUTPUT_FORMAT_JSON);
124
+ // The schema is passed inline (~2 KB); agy takes it as a flag value.
125
+ if (opts.jsonSchema) {
126
+ args.push(CLI.FLAGS.JSON_SCHEMA, opts.jsonSchema);
127
+ }
128
+ }
129
+ args.push(...resolveConversationArgs(opts));
130
+ args.push(CLI.FLAGS.PRINT, prompt);
131
+ return args;
132
+ }
133
+ const CONTROL_ESCAPES = { '\n': '\\n', '\r': '\\r', '\t': '\\t' };
134
+ /** Escape raw newlines/tabs that appear INSIDE JSON string literals, which JSON.parse rejects. */
135
+ function escapeControlCharsInStrings(raw) {
136
+ let out = '';
137
+ let inString = false;
138
+ let escaped = false;
139
+ for (const ch of raw) {
140
+ if (inString && escaped) {
141
+ out += ch;
142
+ escaped = false;
143
+ continue;
144
+ }
145
+ if (inString && ch === '\\') {
146
+ out += ch;
147
+ escaped = true;
148
+ continue;
149
+ }
150
+ if (ch === '"') {
151
+ inString = !inString;
152
+ out += ch;
153
+ continue;
154
+ }
155
+ out += (inString && CONTROL_ESCAPES[ch]) ? CONTROL_ESCAPES[ch] : ch;
156
+ }
157
+ return out;
158
+ }
159
+ /**
160
+ * Parse the JSON envelope out of `agy --output-format json` stdout. agy may
161
+ * print progress lines first, so the envelope is whatever starts at the last
162
+ * line beginning with `{`.
163
+ */
164
+ /**
165
+ * An agy envelope, not merely any JSON object: `{}` must read as a parse
166
+ * failure rather than a verified, cacheable, empty success.
167
+ */
168
+ function isAgyEnvelope(value) {
169
+ if (!value || typeof value !== 'object' || Array.isArray(value))
170
+ return false;
171
+ const candidate = value;
172
+ if (candidate.status === AGY_STATUS_ERROR)
173
+ return true;
174
+ // An ERROR can arrive before agy has a conversation, so only a SUCCESS is
175
+ // required to carry the id. Either way a bare `{}` is a parse failure, not an
176
+ // empty success.
177
+ return candidate.status === AGY_STATUS_SUCCESS && typeof candidate.conversation_id === 'string';
178
+ }
179
+ function tryParseEnvelope(candidate) {
180
+ for (const text of [candidate, escapeControlCharsInStrings(candidate)]) {
181
+ try {
182
+ const parsed = JSON.parse(text);
183
+ if (isAgyEnvelope(parsed))
184
+ return parsed;
185
+ }
186
+ catch {
187
+ // Try the next form.
188
+ }
189
+ }
190
+ return null;
191
+ }
192
+ export function parseAgyJsonEnvelope(stdout) {
193
+ const lines = stdout.split('\n');
194
+ // The envelope is the last JSON object agy printed, so start from the last
195
+ // `{` line and walk backwards: when that line turns out to sit INSIDE the
196
+ // envelope's own `response` (raw newlines plus quoted JSON), the earlier real
197
+ // start line still parses. Progress lines printed before it are never reached.
198
+ for (let index = lines.length - 1; index >= 0; index--) {
199
+ if (!lines[index].trimStart().startsWith('{'))
200
+ continue;
201
+ const envelope = tryParseEnvelope(lines.slice(index).join('\n').trim());
202
+ if (envelope)
203
+ return envelope;
204
+ }
205
+ throw new Error(`${ERROR_MESSAGES.AGY_JSON_PARSE}. Output began: ${stdout.trim().slice(0, PARSE_EXCERPT_CHARS)}`);
206
+ }
207
+ /** Human-readable "DisplayName (action)" list of the actions agy refused to run. */
208
+ export function deniedActionsSummary(envelope) {
209
+ return (envelope.denied_actions ?? [])
210
+ .map(denied => `${denied.display_name || denied.action || 'unknown'} (${denied.action || 'unknown'})`)
211
+ .join(', ');
212
+ }
213
+ export function formatAgyUsageLine(envelope) {
214
+ const usage = envelope.usage ?? {};
215
+ return `Usage: ${envelope.num_turns ?? '?'} turns · ${envelope.duration_seconds ?? '?'}s · tokens in ` +
216
+ `${usage.input_tokens ?? 0} / out ${usage.output_tokens ?? 0} / thinking ${usage.thinking_tokens ?? 0} / ` +
217
+ `cache ${usage.cache_read_tokens ?? 0} / total ${usage.total_tokens ?? 0}`;
218
+ }
219
+ /**
220
+ * Render an envelope for a human reader. A resumed turn replays the PREVIOUS
221
+ * turn's structured_output, so it is only trusted when this call passed a schema.
222
+ */
223
+ export function renderAgyJsonEnvelope(envelope, opts = {}) {
224
+ if (opts.hadSchema && envelope.structured_output !== undefined && envelope.structured_output !== null) {
225
+ return JSON.stringify(envelope.structured_output, null, 2);
226
+ }
227
+ return envelope.response ?? '';
228
+ }
229
+ export function formatConversationLine(conversationId) {
230
+ return `${LIVE_PASS.CONVERSATION_LINE_PREFIX}${conversationId}]`;
231
+ }
232
+ /** A zod schema as the JSON Schema agy's `--json-schema` accepts (no `$schema` key). */
233
+ export function toAgyJsonSchema(schema) {
234
+ const { $schema, ...rest } = z.toJSONSchema(schema);
235
+ return rest;
236
+ }
237
+ /**
238
+ * Validate a json-mode run before it is cached or returned. Throws for every
239
+ * failure mode agy signals inside an exit-0 envelope.
240
+ */
241
+ function verifyJsonEnvelope(stdout, opts) {
242
+ if (stdout.trim() === AGY_INTERNAL.TIMEOUT_SENTINEL) {
243
+ throw new Error(ERROR_MESSAGES.AGY_NO_OUTPUT);
244
+ }
245
+ const envelope = parseAgyJsonEnvelope(stdout);
246
+ if (envelope.status === AGY_STATUS_ERROR) {
247
+ throw new Error(`${ERROR_MESSAGES.AGY_STATUS_ERROR}: ${envelope.error || 'no error text'}`);
248
+ }
249
+ // A stale or unknown ID only warns on stderr and silently starts a NEW
250
+ // conversation with status SUCCESS, so compare what came back.
251
+ const requested = requestedConversationId(opts);
252
+ if (requested && envelope.conversation_id !== requested) {
253
+ throw new Error(`${ERROR_MESSAGES.CONVERSATION_NOT_RESUMED} ${requested}; it returned ` +
254
+ `${envelope.conversation_id || '(none)'}. The ID is unknown to this machine or workspace.`);
255
+ }
256
+ const hasContent = Boolean(envelope.response?.trim()) ||
257
+ (envelope.structured_output !== undefined && envelope.structured_output !== null);
258
+ const denied = deniedActionsSummary(envelope);
259
+ if (!hasContent && denied) {
260
+ throw new Error(`${ERROR_MESSAGES.AGY_DENIED_ACTIONS}: ${denied}`);
261
+ }
262
+ }
263
+ export async function executeAgyCLI(prompt, options, onProgress) {
264
+ const opts = typeof options === 'string'
265
+ ? { model: options }
266
+ : options || {};
267
+ validateAgyOptions(opts);
268
+ // Cache key (computed once) is only used when caching is enabled and the call
269
+ // is repeatable: changeMode, resumed turns and opt-outs are never cached
270
+ // because their answer depends on conversation state, not just the prompt.
271
+ const cacheable = isCacheEnabled() && !opts.changeMode && !opts.resume &&
272
+ !opts.conversationId && !opts.noCache;
273
+ const cacheKey = cacheable ? generateCacheKey(prompt, opts) : undefined;
274
+ if (cacheKey) {
275
+ const cached = getCachedResponse(cacheKey);
276
+ if (cached) {
277
+ Logger.debug('Returning cached response');
278
+ return cached;
279
+ }
280
+ }
281
+ // Normalize file references and register the directories of any reference
282
+ // that resolves to a real file under a trusted root, so agy can read them (a
283
+ // bare @file outside an added dir makes agy hang). Unresolved references are
284
+ // passed through untouched.
285
+ const { prompt: resolvedPrompt, addDirs: refDirs } = resolveFileReferences(prompt, { cwd: opts.cwd, includeDirectories: opts.includeDirectories });
286
+ let processedPrompt = resolvedPrompt;
287
+ if (opts.changeMode) {
288
+ const changeModeInstructions = `
289
+ [CHANGEMODE INSTRUCTIONS]
290
+ You are generating code modifications that will be processed by an automated system. The output format is critical because it enables programmatic application of changes without human intervention.
291
+
292
+ INSTRUCTIONS:
293
+ 1. Analyze each provided file thoroughly
294
+ 2. Identify locations requiring changes based on the user request
295
+ 3. For each change, output in the exact format specified
296
+ 4. The OLD section must be EXACTLY what appears in the file (copy-paste exact match)
297
+ 5. Provide complete, directly replacing code blocks
298
+ 6. Verify line numbers are accurate
299
+
300
+ CRITICAL REQUIREMENTS:
301
+ 1. Output edits in the EXACT format specified below - no deviations
302
+ 2. The OLD string MUST be findable with Ctrl+F - it must be a unique, exact match
303
+ 3. Include enough surrounding lines to make the OLD string unique
304
+ 4. If a string appears multiple times (like </div>), include enough context lines above and below to make it unique
305
+ 5. Copy the OLD content EXACTLY as it appears - including all whitespace, indentation, line breaks
306
+ 6. Never use partial lines - always include complete lines from start to finish
307
+
308
+ OUTPUT FORMAT (follow exactly):
309
+ **FILE: [filename]:[line_number]**
310
+ \`\`\`
311
+ OLD:
312
+ [exact code to be replaced - must match file content precisely]
313
+ NEW:
314
+ [new code to insert - complete and functional]
315
+ \`\`\`
316
+
317
+ EXAMPLE 1 - Simple unique match:
318
+ **FILE: src/utils/helper.js:100**
319
+ \`\`\`
320
+ OLD:
321
+ function getMessage() {
322
+ return "Hello World";
323
+ }
324
+ NEW:
325
+ function getMessage() {
326
+ return "Hello Universe!";
327
+ }
328
+ \`\`\`
329
+
330
+ EXAMPLE 2 - Common tag needing context:
331
+ **FILE: index.html:245**
332
+ \`\`\`
333
+ OLD:
334
+ </div>
335
+ </div>
336
+ </section>
337
+ NEW:
338
+ </div>
339
+ </footer>
340
+ </section>
341
+ \`\`\`
342
+
343
+ IMPORTANT: The OLD section must be an EXACT copy from the file that can be found with Ctrl+F!
344
+
345
+ USER REQUEST:
346
+ ${processedPrompt}
347
+ `;
348
+ processedPrompt = changeModeInstructions;
349
+ }
350
+ const args = buildAgyArgs(opts, processedPrompt, refDirs);
351
+ const runStartMs = Date.now();
352
+ try {
353
+ const result = await executeCommand(CLI.COMMANDS.AGY, args, onProgress, opts.cwd);
354
+ // json mode carries its own failure signalling in the envelope, so it is
355
+ // verified here instead of going through transcript recovery.
356
+ if (isJsonMode(opts)) {
357
+ verifyJsonEnvelope(result, opts);
358
+ if (cacheKey)
359
+ cacheResponse(cacheKey, result);
360
+ return result;
361
+ }
362
+ // agy can exit 0 with empty/timeout stdout while the real answer is only in
363
+ // its transcript. Recover BEFORE caching or changeMode parsing.
364
+ let finalResult = result;
365
+ if (isRecoverableEmptyOutput(result)) {
366
+ Logger.debug('agy returned empty/timeout output; attempting transcript recovery');
367
+ const recovered = recoverFromTranscript({
368
+ cwd: opts.cwd,
369
+ conversationId: requestedConversationId(opts),
370
+ runStartMs,
371
+ });
372
+ if (recovered) {
373
+ finalResult = recovered;
374
+ }
375
+ else if (result.trim() === AGY_INTERNAL.TIMEOUT_SENTINEL) {
376
+ // The timeout sentinel is never a real answer; fail loud.
377
+ throw new Error(ERROR_MESSAGES.AGY_NO_OUTPUT);
378
+ }
379
+ else {
380
+ // Genuinely empty output (e.g. a changeMode request the model decided
381
+ // needs no edits). Preserve the legacy soft result rather than erroring.
382
+ finalResult = '';
383
+ }
384
+ }
385
+ // Never cache an empty result — it is not a useful answer and an empty
386
+ // string would crash the size-bounded LRU (size 0).
387
+ if (cacheKey && finalResult) {
388
+ cacheResponse(cacheKey, finalResult);
389
+ }
390
+ return finalResult;
391
+ }
392
+ catch (error) {
393
+ const errorMessage = error instanceof Error ? error.message : String(error);
394
+ if (errorMessage.includes('ENOENT') || errorMessage.includes('command not found')) {
395
+ throw new Error(ERROR_MESSAGES.AGY_NOT_FOUND);
396
+ }
397
+ throw error;
398
+ }
399
+ }
400
+ /** Run agy in json mode and return the parsed envelope. */
401
+ export async function executeAgyJson(prompt, options = {}, onProgress) {
402
+ const raw = await executeAgyCLI(prompt, { ...options, outputFormat: CLI.DEFAULTS.OUTPUT_FORMAT_JSON }, onProgress);
403
+ return parseAgyJsonEnvelope(raw);
404
+ }
405
+ export async function processChangeModeOutput(rawResult, chunkIndex, chunkCacheKey, prompt) {
406
+ if (chunkIndex && chunkCacheKey) {
407
+ const cachedChunks = getChunks(chunkCacheKey);
408
+ if (cachedChunks && chunkIndex > 0 && chunkIndex <= cachedChunks.length) {
409
+ Logger.debug(`Using cached chunk ${chunkIndex} of ${cachedChunks.length}`);
410
+ const chunk = cachedChunks[chunkIndex - 1];
411
+ let result = formatChangeModeResponse(chunk.edits, { current: chunkIndex, total: cachedChunks.length, cacheKey: chunkCacheKey });
412
+ if (chunkIndex === 1 && chunk.edits.length > 5) {
413
+ const allEdits = cachedChunks.flatMap(c => c.edits);
414
+ result = summarizeChangeModeEdits(allEdits) + '\n\n' + result;
415
+ }
416
+ return result;
417
+ }
418
+ Logger.debug(`Cache miss or invalid chunk index, processing new result`);
419
+ }
420
+ const edits = parseChangeModeOutput(rawResult);
421
+ if (edits.length === 0) {
422
+ return `No edits found in Gemini's response. Please ensure Gemini uses the OLD/NEW format. \n\n+ ${rawResult}`;
423
+ }
424
+ const validation = validateChangeModeEdits(edits);
425
+ if (!validation.valid) {
426
+ return `Edit validation failed:\n${validation.errors.join('\n')}`;
427
+ }
428
+ const chunks = chunkChangeModeEdits(edits);
429
+ let cacheKey;
430
+ if (chunks.length > 1 && prompt) {
431
+ cacheKey = cacheChunks(prompt, chunks);
432
+ Logger.debug(`Cached ${chunks.length} chunks with key: ${cacheKey}`);
433
+ }
434
+ const returnChunkIndex = (chunkIndex && chunkIndex > 0 && chunkIndex <= chunks.length) ? chunkIndex : 1;
435
+ const returnChunk = chunks[returnChunkIndex - 1];
436
+ let result = formatChangeModeResponse(returnChunk.edits, chunks.length > 1 ? { current: returnChunkIndex, total: chunks.length, cacheKey } : undefined);
437
+ if (returnChunkIndex === 1 && edits.length > 5) {
438
+ result = summarizeChangeModeEdits(edits, chunks.length > 1) + '\n\n' + result;
439
+ }
440
+ Logger.debug(`ChangeMode: Parsed ${edits.length} edits, ${chunks.length} chunks, returning chunk ${returnChunkIndex}`);
441
+ return result;
442
+ }
443
+ //# sourceMappingURL=agyExecutor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agyExecutor.js","sourceRoot":"","sources":["../../src/utils/agyExecutor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { type AgyJsonEnvelope } from './agyExecutor.js';
2
+ import type { WorkingTreeDiff } from './gitStatusGuard.js';
3
+ export declare function bulletList(items: string[]): string;
4
+ export declare function section(title: string, body: string): string;
5
+ /**
6
+ * The uninvited-edit warning, or '' when the working tree did not change.
7
+ * Every path that hands Gemini a shell must render this, including the ones
8
+ * that bail out early.
9
+ */
10
+ export declare function formatWorkingTreeSection(diff: WorkingTreeDiff): string;
11
+ /**
12
+ * Rethrow an agy failure with any uninvited edits appended. A run that timed
13
+ * out or exited non-zero may still have used its shell first, and that warning
14
+ * must not be lost with the error.
15
+ */
16
+ export declare function failWithWorkingTree(error: unknown, diff: WorkingTreeDiff): never;
17
+ /** Report for an envelope whose structured_output did not match the tool's result schema. */
18
+ export declare function renderUnparsableEnvelope(envelope: AgyJsonEnvelope, headline: string, issues: string[], subtitle?: string): string;
19
+ //# sourceMappingURL=agyReport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agyReport.d.ts","sourceRoot":"","sources":["../../src/utils/agyReport.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8C,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACpG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAS3D,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAElD;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAkBtE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,GAAG,KAAK,CAIhF;AAED,6FAA6F;AAC7F,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EAAE,EAChB,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAcR"}