genaicode 2.1.0 → 2.4.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 (95) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/README.md +150 -35
  3. package/dist/agents/cli-agent.d.ts +28 -0
  4. package/dist/agents/cli-agent.js +57 -0
  5. package/dist/agents/cli-agent.js.map +1 -0
  6. package/dist/agents/discovery.d.ts +10 -0
  7. package/dist/agents/discovery.js +31 -0
  8. package/dist/agents/discovery.js.map +1 -0
  9. package/dist/agents/drivers/claude.d.ts +25 -0
  10. package/dist/agents/drivers/claude.js +184 -0
  11. package/dist/agents/drivers/claude.js.map +1 -0
  12. package/dist/agents/drivers/codex-live.d.ts +17 -0
  13. package/dist/agents/drivers/codex-live.js +182 -0
  14. package/dist/agents/drivers/codex-live.js.map +1 -0
  15. package/dist/agents/drivers/codex.d.ts +27 -0
  16. package/dist/agents/drivers/codex.js +176 -0
  17. package/dist/agents/drivers/codex.js.map +1 -0
  18. package/dist/agents/drivers/copilot.d.ts +27 -0
  19. package/dist/agents/drivers/copilot.js +199 -0
  20. package/dist/agents/drivers/copilot.js.map +1 -0
  21. package/dist/agents/drivers/cursor.d.ts +23 -0
  22. package/dist/agents/drivers/cursor.js +174 -0
  23. package/dist/agents/drivers/cursor.js.map +1 -0
  24. package/dist/agents/drivers/gemini.d.ts +18 -0
  25. package/dist/agents/drivers/gemini.js +118 -0
  26. package/dist/agents/drivers/gemini.js.map +1 -0
  27. package/dist/agents/drivers/json.d.ts +6 -0
  28. package/dist/agents/drivers/json.js +20 -0
  29. package/dist/agents/drivers/json.js.map +1 -0
  30. package/dist/agents/drivers/muse-live.d.ts +17 -0
  31. package/dist/agents/drivers/muse-live.js +112 -0
  32. package/dist/agents/drivers/muse-live.js.map +1 -0
  33. package/dist/agents/drivers/muse.d.ts +12 -0
  34. package/dist/agents/drivers/muse.js +87 -0
  35. package/dist/agents/drivers/muse.js.map +1 -0
  36. package/dist/agents/drivers/opencode.d.ts +17 -0
  37. package/dist/agents/drivers/opencode.js +103 -0
  38. package/dist/agents/drivers/opencode.js.map +1 -0
  39. package/dist/agents/env.d.ts +16 -0
  40. package/dist/agents/env.js +46 -0
  41. package/dist/agents/env.js.map +1 -0
  42. package/dist/agents/event-queue.d.ts +44 -0
  43. package/dist/agents/event-queue.js +123 -0
  44. package/dist/agents/event-queue.js.map +1 -0
  45. package/dist/agents/hosted.d.ts +33 -0
  46. package/dist/agents/hosted.js +129 -0
  47. package/dist/agents/hosted.js.map +1 -0
  48. package/dist/agents/live-agent.d.ts +37 -0
  49. package/dist/agents/live-agent.js +142 -0
  50. package/dist/agents/live-agent.js.map +1 -0
  51. package/dist/agents/prepare.d.ts +33 -0
  52. package/dist/agents/prepare.js +52 -0
  53. package/dist/agents/prepare.js.map +1 -0
  54. package/dist/agents/process.d.ts +39 -0
  55. package/dist/agents/process.js +140 -0
  56. package/dist/agents/process.js.map +1 -0
  57. package/dist/agents/rpc.d.ts +29 -0
  58. package/dist/agents/rpc.js +101 -0
  59. package/dist/agents/rpc.js.map +1 -0
  60. package/dist/agents/runtime.d.ts +26 -0
  61. package/dist/agents/runtime.js +97 -0
  62. package/dist/agents/runtime.js.map +1 -0
  63. package/dist/agents/types.d.ts +158 -0
  64. package/dist/agents/types.js +2 -0
  65. package/dist/agents/types.js.map +1 -0
  66. package/dist/agents/verify.d.ts +36 -0
  67. package/dist/agents/verify.js +43 -0
  68. package/dist/agents/verify.js.map +1 -0
  69. package/dist/agents.d.ts +36 -0
  70. package/dist/agents.js +19 -0
  71. package/dist/agents.js.map +1 -0
  72. package/dist/core/client.d.ts +7 -1
  73. package/dist/core/client.js +18 -3
  74. package/dist/core/client.js.map +1 -1
  75. package/dist/core/middleware.js +2 -0
  76. package/dist/core/middleware.js.map +1 -1
  77. package/dist/core/types.d.ts +51 -0
  78. package/dist/providers/anthropic-converter.js +32 -6
  79. package/dist/providers/anthropic-converter.js.map +1 -1
  80. package/dist/providers/anthropic.js +3 -1
  81. package/dist/providers/anthropic.js.map +1 -1
  82. package/dist/providers/google-converter.js +70 -3
  83. package/dist/providers/google-converter.js.map +1 -1
  84. package/dist/providers/google.d.ts +8 -0
  85. package/dist/providers/google.js +3 -0
  86. package/dist/providers/google.js.map +1 -1
  87. package/dist/providers/openai-converter.d.ts +2 -0
  88. package/dist/providers/openai-converter.js +16 -0
  89. package/dist/providers/openai-converter.js.map +1 -1
  90. package/dist/providers/openai.js +1 -0
  91. package/dist/providers/openai.js.map +1 -1
  92. package/docs/agents.md +269 -0
  93. package/docs/pivot.md +8 -1
  94. package/docs/semver.md +6 -0
  95. package/package.json +7 -2
@@ -0,0 +1,199 @@
1
+ import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
2
+ import { tmpdir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { cliAgent } from '../cli-agent.js';
5
+ import { isHttpServer } from '../prepare.js';
6
+ import { isObject, numberField, stringField } from './json.js';
7
+ const EDIT_TOOLS = new Set(['edit', 'create', 'str_replace_editor']);
8
+ /** GitHub Copilot CLI in prompt mode (`copilot --prompt=… --output-format json`). */
9
+ export function copilot(options = {}) {
10
+ return cliAgent({
11
+ name: 'copilot',
12
+ command: options.command ?? 'copilot',
13
+ capabilities: {
14
+ effort: ['none', 'minimal', 'low', 'medium', 'high', 'xhigh', 'max'],
15
+ usage: true,
16
+ mcp: true,
17
+ },
18
+ args: (task) => copilotArgs(task, options),
19
+ prepare: (task) => prepareCopilot(task, options),
20
+ createParser: createCopilotParser,
21
+ });
22
+ }
23
+ /** Write the task's MCP servers to a private temp file, so header secrets stay out of argv. */
24
+ function prepareCopilot(task, options) {
25
+ if (!task.mcpServers?.length)
26
+ return { args: copilotArgs(task, options) };
27
+ const dir = mkdtempSync(join(tmpdir(), 'genaicode-copilot-mcp-'));
28
+ const file = join(dir, 'mcp.json');
29
+ writeFileSync(file, JSON.stringify(copilotMcpConfig(task.mcpServers)), { mode: 0o600 });
30
+ return {
31
+ args: copilotArgs(task, options, file),
32
+ cleanup: () => rmSync(dir, { recursive: true, force: true }),
33
+ };
34
+ }
35
+ /** The `--additional-mcp-config` document for a set of servers. */
36
+ export function copilotMcpConfig(servers) {
37
+ const mcpServers = {};
38
+ for (const server of servers) {
39
+ mcpServers[server.name] = isHttpServer(server)
40
+ ? { type: 'http', url: server.url, tools: ['*'], ...(server.headers ? { headers: server.headers } : {}) }
41
+ : {
42
+ type: 'local',
43
+ command: server.command,
44
+ args: [...(server.args ?? [])],
45
+ tools: ['*'],
46
+ ...(server.env ? { env: server.env } : {}),
47
+ };
48
+ }
49
+ return { mcpServers };
50
+ }
51
+ export function copilotArgs(task, options = {}, mcpConfigPath) {
52
+ const args = ['--output-format', 'json'];
53
+ if (options.allowAllTools ?? true)
54
+ args.push('--allow-all-tools');
55
+ // `--allow-tool` and `--deny-tool` take several values; the `=` form keeps each one to a single value.
56
+ const allowed = [
57
+ ...(options.allowTools ?? []),
58
+ ...(mcpConfigPath && !(options.allowAllTools ?? true) && (options.allowMcpTools ?? true)
59
+ ? (task.mcpServers ?? []).map((server) => server.name)
60
+ : []),
61
+ ];
62
+ for (const tool of allowed)
63
+ args.push(`--allow-tool=${tool}`);
64
+ for (const tool of options.denyTools ?? [])
65
+ args.push(`--deny-tool=${tool}`);
66
+ if (!options.askUser)
67
+ args.push('--no-ask-user');
68
+ if (mcpConfigPath)
69
+ args.push('--additional-mcp-config', `@${mcpConfigPath}`);
70
+ if (task.model)
71
+ args.push('--model', task.model);
72
+ if (task.effort)
73
+ args.push('--reasoning-effort', task.effort);
74
+ if (task.extraArgs)
75
+ args.push(...task.extraArgs);
76
+ // `--prompt=<text>` keeps a prompt that starts with a dash from reading as a flag.
77
+ return [...args, `--prompt=${task.prompt}`];
78
+ }
79
+ export function createCopilotParser() {
80
+ const toolCalls = new Map();
81
+ const changed = new Set();
82
+ const usage = { outputTokens: 0, reported: false };
83
+ let outcome;
84
+ let sessionSent = false;
85
+ let lastError;
86
+ const session = (sessionId, model) => {
87
+ if (!sessionId || sessionSent)
88
+ return [];
89
+ sessionSent = true;
90
+ return [{ type: 'session', sessionId, ...(model ? { model } : {}) }];
91
+ };
92
+ return {
93
+ outcome: () => outcome,
94
+ event(value) {
95
+ if (!isObject(value))
96
+ return [];
97
+ const data = isObject(value.data) ? value.data : {};
98
+ // Sub-agent traffic carries an envelope `agentId` (older CLIs: `data.parentToolCallId`);
99
+ // the parent's own events cover it.
100
+ const nested = stringField(value, 'agentId') !== undefined || stringField(data, 'parentToolCallId') !== undefined;
101
+ const events = [];
102
+ switch (value.type) {
103
+ case 'session.start':
104
+ case 'session.resume':
105
+ events.push(...session(stringField(data, 'sessionId'), stringField(data, 'selectedModel')));
106
+ break;
107
+ case 'assistant.message_delta': {
108
+ const text = stringField(data, 'deltaContent');
109
+ if (!nested && text)
110
+ events.push({ type: 'text-delta', text });
111
+ break;
112
+ }
113
+ case 'assistant.message': {
114
+ const text = stringField(data, 'content');
115
+ if (!nested && text?.trim())
116
+ events.push({ type: 'message', text });
117
+ // JSON output drops `assistant.usage`; each message still carries its output tokens.
118
+ const outputTokens = numberField(data, 'outputTokens');
119
+ if (outputTokens !== undefined) {
120
+ usage.reported = true;
121
+ usage.outputTokens += outputTokens;
122
+ }
123
+ break;
124
+ }
125
+ case 'tool.execution_start': {
126
+ const id = stringField(data, 'toolCallId');
127
+ const server = stringField(data, 'mcpServerName');
128
+ const tool = stringField(data, 'mcpToolName');
129
+ const name = server && tool ? `${server}/${tool}` : (stringField(data, 'toolName') ?? 'tool');
130
+ const path = EDIT_TOOLS.has(name) ? stringField(data.arguments, 'path') : undefined;
131
+ if (id)
132
+ toolCalls.set(id, { name, ...(path ? { path } : {}) });
133
+ if (!nested)
134
+ events.push({ type: 'tool-start', ...(id ? { id } : {}), name, input: data.arguments });
135
+ break;
136
+ }
137
+ case 'tool.execution_complete': {
138
+ const id = stringField(data, 'toolCallId');
139
+ const call = id ? toolCalls.get(id) : undefined;
140
+ const exitCode = numberField(data.shellExecution, 'exitCode');
141
+ const isError = data.success !== true || (exitCode !== undefined && exitCode !== 0);
142
+ const output = stringField(data.result, 'content') ?? stringField(data.error, 'message');
143
+ if (!nested) {
144
+ events.push({
145
+ type: 'tool-end',
146
+ ...(id ? { id } : {}),
147
+ ...(call ? { name: call.name } : {}),
148
+ isError,
149
+ ...(output !== undefined ? { output } : {}),
150
+ });
151
+ }
152
+ if (!isError && call?.path && !changed.has(call.path)) {
153
+ changed.add(call.path);
154
+ events.push({ type: 'file-change', paths: [call.path] });
155
+ }
156
+ break;
157
+ }
158
+ case 'session.error': {
159
+ const message = stringField(data, 'message');
160
+ if (message) {
161
+ lastError = message;
162
+ events.push({ type: 'error', message });
163
+ }
164
+ break;
165
+ }
166
+ case 'result': {
167
+ events.push(...session(stringField(value, 'sessionId')));
168
+ // Shell commands and patches can modify files no edit tool reported.
169
+ const modified = isObject(value.usage) && isObject(value.usage.codeChanges) ? value.usage.codeChanges : {};
170
+ const paths = Array.isArray(modified.filesModified)
171
+ ? modified.filesModified.filter((path) => typeof path === 'string' && !changed.has(path))
172
+ : [];
173
+ if (paths.length) {
174
+ paths.forEach((path) => changed.add(path));
175
+ events.push({ type: 'file-change', paths });
176
+ }
177
+ if (usage.reported)
178
+ events.push({ type: 'usage', usage: { outputTokens: usage.outputTokens } });
179
+ const exitCode = numberField(value, 'exitCode');
180
+ const blocker = stringField(value, 'blocker');
181
+ if (exitCode === 0 && value.outcome !== 'blocked') {
182
+ outcome = { ok: true };
183
+ }
184
+ else {
185
+ const error = (value.outcome === 'blocked' ? `Copilot is blocked${blocker ? `: ${blocker}` : '.'}` : undefined) ??
186
+ lastError ??
187
+ `Copilot exited with code ${exitCode ?? 'unknown'}.`;
188
+ outcome = { ok: false, error };
189
+ if (error !== lastError)
190
+ events.push({ type: 'error', message: error });
191
+ }
192
+ break;
193
+ }
194
+ }
195
+ return events;
196
+ },
197
+ };
198
+ }
199
+ //# sourceMappingURL=copilot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot.js","sourceRoot":"","sources":["../../../src/agents/drivers/copilot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { type AgentOutputParser } from '../cli-agent.js';
2
+ import type { AgentTask, CodingAgent } from '../types.js';
3
+ export interface CursorAgentOptions {
4
+ /** Executable name or path. Default `cursor-agent`. */
5
+ command?: string;
6
+ /** Pass `--force` so commands run without asking. Default true (a headless run cannot ask). */
7
+ force?: boolean;
8
+ /**
9
+ * Pass `--trust` when `force` is off. Default true: in an untrusted folder a headless run
10
+ * exits with "Workspace Trust Required". `--force` already implies it.
11
+ */
12
+ trustWorkspace?: boolean;
13
+ /** Pass `--approve-mcps` so the user's configured MCP servers run without asking. Default true. */
14
+ approveMcps?: boolean;
15
+ /** Pass `--stream-partial-output` and report assistant text as `text-delta` events. Default false. */
16
+ partialOutput?: boolean;
17
+ }
18
+ /** Cursor's agent CLI in print mode (`cursor-agent -p --output-format stream-json`). */
19
+ export declare function cursor(options?: CursorAgentOptions): CodingAgent;
20
+ export declare function cursorArgs(task: AgentTask, options?: CursorAgentOptions): string[];
21
+ export declare function createCursorParser(options?: {
22
+ partialOutput?: boolean;
23
+ }): AgentOutputParser;
@@ -0,0 +1,174 @@
1
+ import { cliAgent } from '../cli-agent.js';
2
+ import { isObject, numberField, positionalPrompt, stringField } from './json.js';
3
+ /** Cursor's agent CLI in print mode (`cursor-agent -p --output-format stream-json`). */
4
+ export function cursor(options = {}) {
5
+ return cliAgent({
6
+ name: 'cursor',
7
+ command: options.command ?? 'cursor-agent',
8
+ capabilities: { usage: true },
9
+ args: (task) => cursorArgs(task, options),
10
+ createParser: () => createCursorParser({ partialOutput: options.partialOutput }),
11
+ });
12
+ }
13
+ export function cursorArgs(task, options = {}) {
14
+ const args = ['-p', '--output-format', 'stream-json'];
15
+ if (options.force ?? true)
16
+ args.push('--force');
17
+ else if (options.trustWorkspace ?? true)
18
+ args.push('--trust');
19
+ if (options.approveMcps ?? true)
20
+ args.push('--approve-mcps');
21
+ if (options.partialOutput)
22
+ args.push('--stream-partial-output');
23
+ if (task.model)
24
+ args.push('--model', task.model);
25
+ if (task.extraArgs)
26
+ args.push(...task.extraArgs);
27
+ return [...args, ...positionalPrompt(task.prompt)];
28
+ }
29
+ export function createCursorParser(options = {}) {
30
+ let outcome;
31
+ let sessionSent = false;
32
+ let messageSent = false;
33
+ let segment = '';
34
+ // With partial output, text arrives as deltas; each run of deltas up to a tool call is one message.
35
+ const flush = (events) => {
36
+ if (segment.trim()) {
37
+ messageSent = true;
38
+ events.push({ type: 'message', text: segment });
39
+ }
40
+ segment = '';
41
+ };
42
+ return {
43
+ outcome: () => outcome,
44
+ event(value) {
45
+ if (!isObject(value))
46
+ return [];
47
+ const events = [];
48
+ const sessionId = stringField(value, 'session_id');
49
+ if (sessionId && !sessionSent) {
50
+ sessionSent = true;
51
+ const model = stringField(value, 'model');
52
+ events.push({ type: 'session', sessionId, ...(model ? { model } : {}) });
53
+ }
54
+ switch (value.type) {
55
+ case 'assistant': {
56
+ const content = isObject(value.message) ? value.message.content : undefined;
57
+ const text = Array.isArray(content)
58
+ ? content
59
+ .map((block) => (stringField(block, 'type') === 'text' ? stringField(block, 'text') : undefined))
60
+ .filter((part) => !!part)
61
+ .join('')
62
+ : '';
63
+ if (options.partialOutput) {
64
+ // Deltas carry `timestamp_ms` without `model_call_id`; the rest repeat text already streamed.
65
+ if (value.timestamp_ms === undefined || value.model_call_id !== undefined || !text)
66
+ break;
67
+ segment += text;
68
+ events.push({ type: 'text-delta', text });
69
+ }
70
+ else if (text.trim()) {
71
+ messageSent = true;
72
+ events.push({ type: 'message', text });
73
+ }
74
+ break;
75
+ }
76
+ case 'tool_call': {
77
+ flush(events);
78
+ const id = stringField(value, 'call_id');
79
+ const call = cursorToolCall(value.tool_call);
80
+ if (!call)
81
+ break;
82
+ if (value.subtype === 'started') {
83
+ events.push({ type: 'tool-start', ...(id ? { id } : {}), name: call.name, input: call.args });
84
+ }
85
+ else if (value.subtype === 'completed') {
86
+ const success = isObject(call.result) && isObject(call.result.success) ? call.result.success : undefined;
87
+ const exitCode = numberField(success, 'exitCode');
88
+ const failed = (isObject(call.result) && !success) || (exitCode !== undefined && exitCode !== 0);
89
+ const output = stringField(success, 'interleavedOutput') ??
90
+ stringField(success, 'stdout') ??
91
+ stringField(success, 'content') ??
92
+ stringField(success, 'message') ??
93
+ errorText(call.result);
94
+ events.push({
95
+ type: 'tool-end',
96
+ ...(id ? { id } : {}),
97
+ name: call.name,
98
+ isError: failed,
99
+ ...(output !== undefined ? { output } : {}),
100
+ });
101
+ const path = stringField(success, 'path') ?? stringField(call.args, 'path');
102
+ if (!failed && /write|edit|delete/i.test(call.name) && path) {
103
+ events.push({ type: 'file-change', paths: [path] });
104
+ }
105
+ }
106
+ break;
107
+ }
108
+ case 'result': {
109
+ flush(events);
110
+ const failed = value.is_error === true || (value.subtype !== undefined && value.subtype !== 'success');
111
+ // `result` joins every assistant message without separators; the messages already went out.
112
+ const text = stringField(value, 'result');
113
+ outcome = failed ? { ok: false, error: text || 'Cursor agent failed.' } : { ok: true };
114
+ if (failed)
115
+ events.push({ type: 'error', message: outcome.error });
116
+ else if (text?.trim() && !messageSent)
117
+ events.push({ type: 'message', text });
118
+ const usage = value.usage;
119
+ const inputTokens = numberField(usage, 'inputTokens');
120
+ const outputTokens = numberField(usage, 'outputTokens');
121
+ const cachedInputTokens = numberField(usage, 'cacheReadTokens');
122
+ if (inputTokens !== undefined || outputTokens !== undefined) {
123
+ events.push({
124
+ type: 'usage',
125
+ usage: {
126
+ ...(inputTokens !== undefined ? { inputTokens } : {}),
127
+ ...(outputTokens !== undefined ? { outputTokens } : {}),
128
+ ...(cachedInputTokens ? { cachedInputTokens } : {}),
129
+ ...(inputTokens !== undefined && outputTokens !== undefined
130
+ ? { totalTokens: inputTokens + outputTokens }
131
+ : {}),
132
+ },
133
+ });
134
+ }
135
+ break;
136
+ }
137
+ }
138
+ return events;
139
+ },
140
+ };
141
+ }
142
+ function errorText(result) {
143
+ if (!isObject(result))
144
+ return undefined;
145
+ const error = Object.values(result)[0];
146
+ return typeof error === 'string' ? error : (stringField(error, 'error') ?? stringField(error, 'message'));
147
+ }
148
+ /**
149
+ * `{ writeToolCall: { args, result } }` → `{ name: 'write', args, result }`. Other tools
150
+ * arrive as `{ function: { name, arguments } }`, with `arguments` a JSON string.
151
+ */
152
+ function cursorToolCall(value) {
153
+ if (!isObject(value))
154
+ return undefined;
155
+ const [key, body] = Object.entries(value)[0] ?? [];
156
+ if (!key)
157
+ return undefined;
158
+ if (key === 'function' && isObject(body)) {
159
+ return { name: stringField(body, 'name') ?? 'function', args: parseArguments(body.arguments), result: body.result };
160
+ }
161
+ const name = key.replace(/ToolCall$/, '') || key;
162
+ return isObject(body) ? { name, args: body.args, result: body.result } : { name };
163
+ }
164
+ function parseArguments(value) {
165
+ if (typeof value !== 'string')
166
+ return value;
167
+ try {
168
+ return JSON.parse(value);
169
+ }
170
+ catch {
171
+ return value;
172
+ }
173
+ }
174
+ //# sourceMappingURL=cursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../src/agents/drivers/cursor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { type AgentOutputParser } from '../cli-agent.js';
2
+ import type { AgentTask, CodingAgent } from '../types.js';
3
+ export type GeminiApprovalMode = 'default' | 'auto_edit' | 'yolo' | 'plan';
4
+ export interface GeminiAgentOptions {
5
+ /** Executable name or path. Default `gemini`. */
6
+ command?: string;
7
+ /** Default `auto_edit`: edit tools run unattended, other tools are refused headless. */
8
+ approvalMode?: GeminiApprovalMode;
9
+ /**
10
+ * Pass `--skip-trust` to trust `cwd` for this run. Default true: in an untrusted folder
11
+ * Gemini falls back to approval mode `default`, which a headless run cannot answer.
12
+ */
13
+ trustWorkspace?: boolean;
14
+ }
15
+ /** Gemini CLI in headless mode (`gemini --prompt ... --output-format stream-json`). */
16
+ export declare function gemini(options?: GeminiAgentOptions): CodingAgent;
17
+ export declare function geminiArgs(task: AgentTask, options?: GeminiAgentOptions): string[];
18
+ export declare function createGeminiParser(): AgentOutputParser;
@@ -0,0 +1,118 @@
1
+ import { cliAgent } from '../cli-agent.js';
2
+ import { isObject, numberField, stringField } from './json.js';
3
+ const EDIT_TOOLS = new Set(['replace', 'write_file', 'edit']);
4
+ /** Gemini CLI in headless mode (`gemini --prompt ... --output-format stream-json`). */
5
+ export function gemini(options = {}) {
6
+ return cliAgent({
7
+ name: 'gemini',
8
+ command: options.command ?? 'gemini',
9
+ capabilities: { usage: true },
10
+ args: (task) => geminiArgs(task, options),
11
+ createParser: createGeminiParser,
12
+ });
13
+ }
14
+ export function geminiArgs(task, options = {}) {
15
+ const args = ['--output-format', 'stream-json', '--approval-mode', options.approvalMode ?? 'auto_edit'];
16
+ if (options.trustWorkspace ?? true)
17
+ args.push('--skip-trust');
18
+ if (task.model)
19
+ args.push('--model', task.model);
20
+ if (task.extraArgs)
21
+ args.push(...task.extraArgs);
22
+ // `--prompt=<text>` keeps a prompt that starts with a dash from reading as a flag.
23
+ return [...args, `--prompt=${task.prompt}`];
24
+ }
25
+ export function createGeminiParser() {
26
+ const toolNames = new Map();
27
+ let outcome;
28
+ let text = '';
29
+ return {
30
+ outcome: () => outcome,
31
+ event(value) {
32
+ if (!isObject(value))
33
+ return [];
34
+ const events = [];
35
+ switch (value.type) {
36
+ case 'init': {
37
+ const sessionId = stringField(value, 'session_id');
38
+ const model = stringField(value, 'model');
39
+ if (sessionId)
40
+ events.push({ type: 'session', sessionId, ...(model ? { model } : {}) });
41
+ break;
42
+ }
43
+ case 'message': {
44
+ const content = stringField(value, 'content');
45
+ if (value.role !== 'assistant' || !content)
46
+ break;
47
+ if (value.delta === true) {
48
+ text += content;
49
+ events.push({ type: 'text-delta', text: content });
50
+ }
51
+ else {
52
+ text = content;
53
+ events.push({ type: 'message', text: content });
54
+ }
55
+ break;
56
+ }
57
+ case 'tool_use': {
58
+ const name = stringField(value, 'tool_name') ?? 'tool';
59
+ const id = stringField(value, 'tool_id');
60
+ if (id)
61
+ toolNames.set(id, name);
62
+ events.push({ type: 'tool-start', ...(id ? { id } : {}), name, input: value.parameters });
63
+ const path = stringField(value.parameters, 'file_path');
64
+ if (EDIT_TOOLS.has(name) && path)
65
+ events.push({ type: 'file-change', paths: [path] });
66
+ break;
67
+ }
68
+ case 'tool_result': {
69
+ const id = stringField(value, 'tool_id');
70
+ const name = id ? toolNames.get(id) : undefined;
71
+ const output = stringField(value, 'output') ?? stringField(value.error, 'message');
72
+ events.push({
73
+ type: 'tool-end',
74
+ ...(id ? { id } : {}),
75
+ ...(name ? { name } : {}),
76
+ isError: value.status === 'error',
77
+ ...(output !== undefined ? { output } : {}),
78
+ });
79
+ break;
80
+ }
81
+ case 'error': {
82
+ const message = stringField(value, 'message');
83
+ if (message)
84
+ events.push({ type: 'error', message });
85
+ break;
86
+ }
87
+ case 'result': {
88
+ const error = stringField(value.error, 'message');
89
+ outcome = value.status === 'success' ? { ok: true } : { ok: false, error: error ?? 'Gemini run failed.' };
90
+ if (error)
91
+ events.push({ type: 'error', message: error });
92
+ // Streamed deltas become one final message.
93
+ if (outcome.ok && text.trim())
94
+ events.push({ type: 'message', text: text.trim() });
95
+ const stats = value.stats;
96
+ const inputTokens = numberField(stats, 'input_tokens');
97
+ const outputTokens = numberField(stats, 'output_tokens');
98
+ const totalTokens = numberField(stats, 'total_tokens');
99
+ const cachedInputTokens = numberField(stats, 'cached');
100
+ if (inputTokens !== undefined || outputTokens !== undefined) {
101
+ events.push({
102
+ type: 'usage',
103
+ usage: {
104
+ ...(inputTokens !== undefined ? { inputTokens } : {}),
105
+ ...(outputTokens !== undefined ? { outputTokens } : {}),
106
+ ...(totalTokens !== undefined ? { totalTokens } : {}),
107
+ ...(cachedInputTokens ? { cachedInputTokens } : {}),
108
+ },
109
+ });
110
+ }
111
+ break;
112
+ }
113
+ }
114
+ return events;
115
+ },
116
+ };
117
+ }
118
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/agents/drivers/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAA6C,MAAM,iBAAiB,CAAC;AAEtF,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAgB/D,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;AAE9D,uFAAuF;AACvF,MAAM,UAAU,MAAM,CAAC,UAA8B,EAAE;IACrD,OAAO,QAAQ,CAAC;QACd,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,QAAQ;QACpC,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;QAC7B,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC;QACzC,YAAY,EAAE,kBAAkB;KACjC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAe,EAAE,UAA8B,EAAE;IAC1E,MAAM,IAAI,GAAG,CAAC,iBAAiB,EAAE,aAAa,EAAE,iBAAiB,EAAE,OAAO,CAAC,YAAY,IAAI,WAAW,CAAC,CAAC;IACxG,IAAI,OAAO,CAAC,cAAc,IAAI,IAAI;QAAE,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC9D,IAAI,IAAI,CAAC,KAAK;QAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,IAAI,IAAI,CAAC,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IACjD,mFAAmF;IACnF,OAAO,CAAC,GAAG,IAAI,EAAE,YAAY,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,IAAI,OAAiC,CAAC;IACtC,IAAI,IAAI,GAAG,EAAE,CAAC;IAEd,OAAO;QACL,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO;QACtB,KAAK,CAAC,KAAK;YACT,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;YAChC,MAAM,MAAM,GAAiB,EAAE,CAAC;YAChC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;gBACnB,KAAK,MAAM,CAAC,CAAC,CAAC;oBACZ,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;oBACnD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;oBAC1C,IAAI,SAAS;wBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;oBACxF,MAAM;gBACR,CAAC;gBACD,KAAK,SAAS,CAAC,CAAC,CAAC;oBACf,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;oBAC9C,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,OAAO;wBAAE,MAAM;oBAClD,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;wBACzB,IAAI,IAAI,OAAO,CAAC;wBAChB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;oBACrD,CAAC;yBAAM,CAAC;wBACN,IAAI,GAAG,OAAO,CAAC;wBACf,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;oBAClD,CAAC;oBACD,MAAM;gBACR,CAAC;gBACD,KAAK,UAAU,CAAC,CAAC,CAAC;oBAChB,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC;oBACvD,MAAM,EAAE,GAAG,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;oBACzC,IAAI,EAAE;wBAAE,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;oBAChC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;oBAC1F,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;oBACxD,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI;wBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACtF,MAAM;gBACR,CAAC;gBACD,KAAK,aAAa,CAAC,CAAC,CAAC;oBACnB,MAAM,EAAE,GAAG,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;oBACzC,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;oBAChD,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;oBACnF,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,UAAU;wBAChB,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBACrB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBACzB,OAAO,EAAE,KAAK,CAAC,MAAM,KAAK,OAAO;wBACjC,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBAC5C,CAAC,CAAC;oBACH,MAAM;gBACR,CAAC;gBACD,KAAK,OAAO,CAAC,CAAC,CAAC;oBACb,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;oBAC9C,IAAI,OAAO;wBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;oBACrD,MAAM;gBACR,CAAC;gBACD,KAAK,QAAQ,CAAC,CAAC,CAAC;oBACd,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;oBAClD,OAAO,GAAG,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,oBAAoB,EAAE,CAAC;oBAC1G,IAAI,KAAK;wBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;oBAC1D,4CAA4C;oBAC5C,IAAI,OAAO,CAAC,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE;wBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBACnF,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;oBAC1B,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;oBACvD,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;oBACzD,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;oBACvD,MAAM,iBAAiB,GAAG,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;oBACvD,IAAI,WAAW,KAAK,SAAS,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;wBAC5D,MAAM,CAAC,IAAI,CAAC;4BACV,IAAI,EAAE,OAAO;4BACb,KAAK,EAAE;gCACL,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gCACrD,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gCACvD,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gCACrD,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;6BACpD;yBACF,CAAC,CAAC;oBACL,CAAC;oBACD,MAAM;gBACR,CAAC;YACH,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ export type JsonObject = Record<string, unknown>;
2
+ export declare function isObject(value: unknown): value is JsonObject;
3
+ export declare function stringField(value: unknown, key: string): string | undefined;
4
+ export declare function numberField(value: unknown, key: string): number | undefined;
5
+ /** Keep the prompt positional even when it starts with a dash. */
6
+ export declare function positionalPrompt(prompt: string): string[];
@@ -0,0 +1,20 @@
1
+ export function isObject(value) {
2
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
3
+ }
4
+ export function stringField(value, key) {
5
+ if (!isObject(value))
6
+ return undefined;
7
+ const field = value[key];
8
+ return typeof field === 'string' ? field : undefined;
9
+ }
10
+ export function numberField(value, key) {
11
+ if (!isObject(value))
12
+ return undefined;
13
+ const field = value[key];
14
+ return typeof field === 'number' && Number.isFinite(field) ? field : undefined;
15
+ }
16
+ /** Keep the prompt positional even when it starts with a dash. */
17
+ export function positionalPrompt(prompt) {
18
+ return prompt.startsWith('-') ? ['--', prompt] : [prompt];
19
+ }
20
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../../src/agents/drivers/json.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAc,EAAE,GAAW;IACrD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAc,EAAE,GAAW;IACrD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACjF,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,OAAO,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { AgentEvent, CodingAgent } from '../types.js';
2
+ export interface MuseLiveOptions {
3
+ /** Executable name or path. Default `muse`. */
4
+ command?: string;
5
+ /** Pass `--trust-workspace`. Default true. */
6
+ trustWorkspace?: boolean;
7
+ /** How long to wait for the server to acknowledge each request. Default 60 s. */
8
+ requestTimeoutMs?: number;
9
+ }
10
+ /**
11
+ * Muse over its JSON-RPC server (`muse serve`). Supports `steer()`.
12
+ * Approval requests are reported as events and declined: the answer format is not
13
+ * part of this driver yet, so `capabilities.approvals` is false.
14
+ */
15
+ export declare function museLive(options?: MuseLiveOptions): CodingAgent;
16
+ /** Map one `muse serve` notification to agent events. */
17
+ export declare function museNotification(method: string, params: unknown): AgentEvent[];