@the-open-engine/zeroshot 6.4.0 → 6.6.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.
- package/cli/commands/providers.js +11 -5
- package/cli/index.js +79 -16
- package/cli/lib/first-run.js +14 -3
- package/docker/zeroshot-cluster/Dockerfile +11 -1
- package/lib/agent-cli-provider/acp-stdio-runner.d.ts +4 -0
- package/lib/agent-cli-provider/acp-stdio-runner.d.ts.map +1 -0
- package/lib/agent-cli-provider/acp-stdio-runner.js +259 -0
- package/lib/agent-cli-provider/acp-stdio-runner.js.map +1 -0
- package/lib/agent-cli-provider/adapters/acp.d.ts +23 -0
- package/lib/agent-cli-provider/adapters/acp.d.ts.map +1 -0
- package/lib/agent-cli-provider/adapters/acp.js +373 -0
- package/lib/agent-cli-provider/adapters/acp.js.map +1 -0
- package/lib/agent-cli-provider/adapters/claude.d.ts.map +1 -1
- package/lib/agent-cli-provider/adapters/claude.js +2 -29
- package/lib/agent-cli-provider/adapters/claude.js.map +1 -1
- package/lib/agent-cli-provider/adapters/copilot-parser.d.ts +3 -0
- package/lib/agent-cli-provider/adapters/copilot-parser.d.ts.map +1 -0
- package/lib/agent-cli-provider/adapters/copilot-parser.js +154 -0
- package/lib/agent-cli-provider/adapters/copilot-parser.js.map +1 -0
- package/lib/agent-cli-provider/adapters/copilot.d.ts +3 -0
- package/lib/agent-cli-provider/adapters/copilot.d.ts.map +1 -0
- package/lib/agent-cli-provider/adapters/copilot.js +176 -0
- package/lib/agent-cli-provider/adapters/copilot.js.map +1 -0
- package/lib/agent-cli-provider/adapters/gateway.d.ts +6 -0
- package/lib/agent-cli-provider/adapters/gateway.d.ts.map +1 -0
- package/lib/agent-cli-provider/adapters/gateway.js +161 -0
- package/lib/agent-cli-provider/adapters/gateway.js.map +1 -0
- package/lib/agent-cli-provider/adapters/gemini.d.ts.map +1 -1
- package/lib/agent-cli-provider/adapters/gemini.js +9 -2
- package/lib/agent-cli-provider/adapters/gemini.js.map +1 -1
- package/lib/agent-cli-provider/adapters/index.d.ts.map +1 -1
- package/lib/agent-cli-provider/adapters/index.js +6 -34
- package/lib/agent-cli-provider/adapters/index.js.map +1 -1
- package/lib/agent-cli-provider/adapters/opencode.d.ts.map +1 -1
- package/lib/agent-cli-provider/adapters/opencode.js +5 -1
- package/lib/agent-cli-provider/adapters/opencode.js.map +1 -1
- package/lib/agent-cli-provider/adapters/pi.d.ts +3 -0
- package/lib/agent-cli-provider/adapters/pi.d.ts.map +1 -0
- package/lib/agent-cli-provider/adapters/pi.js +331 -0
- package/lib/agent-cli-provider/adapters/pi.js.map +1 -0
- package/lib/agent-cli-provider/claude-command.d.ts +6 -0
- package/lib/agent-cli-provider/claude-command.d.ts.map +1 -0
- package/lib/agent-cli-provider/claude-command.js +43 -0
- package/lib/agent-cli-provider/claude-command.js.map +1 -0
- package/lib/agent-cli-provider/contract-actions.d.ts.map +1 -1
- package/lib/agent-cli-provider/contract-actions.js +13 -17
- package/lib/agent-cli-provider/contract-actions.js.map +1 -1
- package/lib/agent-cli-provider/contract-invoke.d.ts.map +1 -1
- package/lib/agent-cli-provider/contract-invoke.js +10 -3
- package/lib/agent-cli-provider/contract-invoke.js.map +1 -1
- package/lib/agent-cli-provider/contract-options.d.ts.map +1 -1
- package/lib/agent-cli-provider/contract-options.js +57 -2
- package/lib/agent-cli-provider/contract-options.js.map +1 -1
- package/lib/agent-cli-provider/contract-support.d.ts +1 -0
- package/lib/agent-cli-provider/contract-support.d.ts.map +1 -1
- package/lib/agent-cli-provider/contract-support.js +25 -3
- package/lib/agent-cli-provider/contract-support.js.map +1 -1
- package/lib/agent-cli-provider/errors.d.ts +1 -0
- package/lib/agent-cli-provider/errors.d.ts.map +1 -1
- package/lib/agent-cli-provider/errors.js +14 -5
- package/lib/agent-cli-provider/errors.js.map +1 -1
- package/lib/agent-cli-provider/gateway-client.d.ts +32 -0
- package/lib/agent-cli-provider/gateway-client.d.ts.map +1 -0
- package/lib/agent-cli-provider/gateway-client.js +135 -0
- package/lib/agent-cli-provider/gateway-client.js.map +1 -0
- package/lib/agent-cli-provider/gateway-runner.d.ts +9 -0
- package/lib/agent-cli-provider/gateway-runner.d.ts.map +1 -0
- package/lib/agent-cli-provider/gateway-runner.js +294 -0
- package/lib/agent-cli-provider/gateway-runner.js.map +1 -0
- package/lib/agent-cli-provider/gateway-tools.d.ts +14 -0
- package/lib/agent-cli-provider/gateway-tools.d.ts.map +1 -0
- package/lib/agent-cli-provider/gateway-tools.js +495 -0
- package/lib/agent-cli-provider/gateway-tools.js.map +1 -0
- package/lib/agent-cli-provider/index.d.ts +3 -2
- package/lib/agent-cli-provider/index.d.ts.map +1 -1
- package/lib/agent-cli-provider/index.js +14 -1
- package/lib/agent-cli-provider/index.js.map +1 -1
- package/lib/agent-cli-provider/invoke-evidence.d.ts +2 -2
- package/lib/agent-cli-provider/invoke-evidence.d.ts.map +1 -1
- package/lib/agent-cli-provider/invoke-evidence.js +17 -3
- package/lib/agent-cli-provider/invoke-evidence.js.map +1 -1
- package/lib/agent-cli-provider/provider-registry.d.ts +437 -0
- package/lib/agent-cli-provider/provider-registry.d.ts.map +1 -0
- package/lib/agent-cli-provider/provider-registry.js +411 -0
- package/lib/agent-cli-provider/provider-registry.js.map +1 -0
- package/lib/agent-cli-provider/single-agent-runtime.d.ts +7 -0
- package/lib/agent-cli-provider/single-agent-runtime.d.ts.map +1 -1
- package/lib/agent-cli-provider/single-agent-runtime.js +139 -19
- package/lib/agent-cli-provider/single-agent-runtime.js.map +1 -1
- package/lib/agent-cli-provider/types.d.ts +106 -4
- package/lib/agent-cli-provider/types.d.ts.map +1 -1
- package/lib/agent-cli-provider/types.js.map +1 -1
- package/lib/docker-config.js +24 -13
- package/lib/provider-defaults.js +15 -4
- package/lib/provider-detection.js +2 -0
- package/lib/provider-names.js +32 -12
- package/lib/repo-settings.js +15 -1
- package/lib/settings/claude-auth.js +3 -6
- package/lib/settings.js +17 -2
- package/lib/setup-apply.js +300 -0
- package/lib/setup-journal.js +109 -0
- package/lib/setup-plan.js +406 -0
- package/lib/setup-undo.js +88 -0
- package/lib/start-cluster.js +12 -1
- package/lib/stream-json-parser.js +7 -5
- package/package.json +31 -1
- package/scripts/assert-release-published.js +53 -0
- package/scripts/live-provider-smoke.js +221 -0
- package/scripts/release-preflight.js +236 -0
- package/src/agent/agent-lifecycle.js +5 -4
- package/src/agent/agent-quality-gate-schema.js +2 -2
- package/src/agent/agent-task-executor.js +41 -2
- package/src/agent-cli-provider/acp-stdio-runner.ts +314 -0
- package/src/agent-cli-provider/adapters/acp.ts +493 -0
- package/src/agent-cli-provider/adapters/claude.ts +2 -32
- package/src/agent-cli-provider/adapters/copilot-parser.ts +166 -0
- package/src/agent-cli-provider/adapters/copilot.ts +231 -0
- package/src/agent-cli-provider/adapters/gateway.ts +186 -0
- package/src/agent-cli-provider/adapters/gemini.ts +9 -2
- package/src/agent-cli-provider/adapters/index.ts +5 -36
- package/src/agent-cli-provider/adapters/opencode.ts +4 -1
- package/src/agent-cli-provider/adapters/pi.ts +410 -0
- package/src/agent-cli-provider/claude-command.ts +47 -0
- package/src/agent-cli-provider/contract-actions.ts +14 -17
- package/src/agent-cli-provider/contract-invoke.ts +12 -3
- package/src/agent-cli-provider/contract-options.ts +72 -3
- package/src/agent-cli-provider/contract-support.ts +30 -3
- package/src/agent-cli-provider/errors.ts +14 -4
- package/src/agent-cli-provider/gateway-client.ts +170 -0
- package/src/agent-cli-provider/gateway-runner.ts +353 -0
- package/src/agent-cli-provider/gateway-tools.ts +616 -0
- package/src/agent-cli-provider/index.ts +28 -0
- package/src/agent-cli-provider/invoke-evidence.ts +24 -3
- package/src/agent-cli-provider/provider-registry.ts +515 -0
- package/src/agent-cli-provider/single-agent-runtime.ts +192 -18
- package/src/agent-cli-provider/types.ts +145 -4
- package/src/config-validator.js +33 -15
- package/src/isolation-manager.js +124 -19
- package/src/orchestrator.js +23 -10
- package/src/preflight.js +83 -30
- package/src/providers/capabilities.js +15 -42
- package/src/providers/index.js +52 -72
- package/src/worktree-claude-config.js +17 -0
- package/task-lib/commands/run.js +1 -0
- package/task-lib/provider-helper-runtime.js +11 -0
- package/task-lib/runner.js +7 -0
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createGatewayChatCompletion,
|
|
3
|
+
type GatewayChatMessage,
|
|
4
|
+
type GatewayChatToolDefinition,
|
|
5
|
+
type GatewayToolCall,
|
|
6
|
+
} from './gateway-client';
|
|
7
|
+
import {
|
|
8
|
+
type GatewayToolExecutionResult,
|
|
9
|
+
executeGatewayToolCall,
|
|
10
|
+
resolveGatewayConfiguration,
|
|
11
|
+
} from './gateway-tools';
|
|
12
|
+
import { isRecord, parseJson, stringifyJson, unknownToMessage } from './json';
|
|
13
|
+
import type { GatewayBuildOptions, GatewayToolPolicy, OutputEvent, ResolvedGatewayBuildOptions } from './types';
|
|
14
|
+
|
|
15
|
+
const MAX_GATEWAY_TURNS = 12;
|
|
16
|
+
|
|
17
|
+
export interface GatewayRunnerRequest {
|
|
18
|
+
readonly context: string;
|
|
19
|
+
readonly gateway: GatewayBuildOptions;
|
|
20
|
+
readonly cwd: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const TOOL_DEFINITIONS: readonly GatewayChatToolDefinition[] = [
|
|
24
|
+
{
|
|
25
|
+
type: 'function',
|
|
26
|
+
function: {
|
|
27
|
+
name: 'read_file',
|
|
28
|
+
description: 'Read one UTF-8 file within toolPolicy.roots.',
|
|
29
|
+
parameters: {
|
|
30
|
+
type: 'object',
|
|
31
|
+
additionalProperties: false,
|
|
32
|
+
properties: {
|
|
33
|
+
path: { type: 'string' },
|
|
34
|
+
},
|
|
35
|
+
required: ['path'],
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
type: 'function',
|
|
41
|
+
function: {
|
|
42
|
+
name: 'apply_patch',
|
|
43
|
+
description:
|
|
44
|
+
'Write a full file with content, or replace search text in a UTF-8 file within toolPolicy.roots.',
|
|
45
|
+
parameters: {
|
|
46
|
+
type: 'object',
|
|
47
|
+
additionalProperties: false,
|
|
48
|
+
properties: {
|
|
49
|
+
path: { type: 'string' },
|
|
50
|
+
content: { type: 'string' },
|
|
51
|
+
search: { type: 'string' },
|
|
52
|
+
replace: { type: 'string' },
|
|
53
|
+
replaceAll: { type: 'boolean' },
|
|
54
|
+
},
|
|
55
|
+
required: ['path'],
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
type: 'function',
|
|
61
|
+
function: {
|
|
62
|
+
name: 'run_command',
|
|
63
|
+
description: 'Run an allowlisted command without a shell.',
|
|
64
|
+
parameters: {
|
|
65
|
+
type: 'object',
|
|
66
|
+
additionalProperties: false,
|
|
67
|
+
properties: {
|
|
68
|
+
command: { type: 'string' },
|
|
69
|
+
args: { type: 'array', items: { type: 'string' } },
|
|
70
|
+
cwd: { type: 'string' },
|
|
71
|
+
},
|
|
72
|
+
required: ['command'],
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
] as const;
|
|
77
|
+
|
|
78
|
+
export async function runGatewayRequest(request: GatewayRunnerRequest): Promise<readonly OutputEvent[]> {
|
|
79
|
+
const events: OutputEvent[] = [];
|
|
80
|
+
try {
|
|
81
|
+
const gateway = resolveGatewayConfiguration(request.gateway, 'gateway', request.cwd);
|
|
82
|
+
return await runGatewayLoop(request.context, gateway, request.cwd, events);
|
|
83
|
+
} catch (error) {
|
|
84
|
+
return [
|
|
85
|
+
...events,
|
|
86
|
+
{
|
|
87
|
+
type: 'result',
|
|
88
|
+
success: false,
|
|
89
|
+
error: unknownToMessage(error),
|
|
90
|
+
},
|
|
91
|
+
];
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export function gatewayRunnerRequestFromEnv(
|
|
96
|
+
env: NodeJS.ProcessEnv = process.env
|
|
97
|
+
): GatewayRunnerRequest {
|
|
98
|
+
const raw = env.ZEROSHOT_GATEWAY_REQUEST;
|
|
99
|
+
if (!raw) {
|
|
100
|
+
throw new Error('ZEROSHOT_GATEWAY_REQUEST is required.');
|
|
101
|
+
}
|
|
102
|
+
const parsed = parseJson(raw);
|
|
103
|
+
if (!isRecord(parsed)) {
|
|
104
|
+
throw new Error('ZEROSHOT_GATEWAY_REQUEST must encode a JSON object.');
|
|
105
|
+
}
|
|
106
|
+
const context = parsed.context;
|
|
107
|
+
const cwd = parsed.cwd;
|
|
108
|
+
if (typeof context !== 'string' || !context.trim()) {
|
|
109
|
+
throw new Error('ZEROSHOT_GATEWAY_REQUEST.context must be a non-empty string.');
|
|
110
|
+
}
|
|
111
|
+
if (typeof cwd !== 'string' || !cwd.trim()) {
|
|
112
|
+
throw new Error('ZEROSHOT_GATEWAY_REQUEST.cwd must be a non-empty string.');
|
|
113
|
+
}
|
|
114
|
+
const headers = gatewayHeadersFromEnv(parsed.gatewayHeaderEnv, env);
|
|
115
|
+
return {
|
|
116
|
+
context,
|
|
117
|
+
cwd,
|
|
118
|
+
gateway: {
|
|
119
|
+
...(isRecord(parsed.gateway) ? (parsed.gateway as GatewayBuildOptions) : {}),
|
|
120
|
+
...(headers === undefined ? {} : { headers }),
|
|
121
|
+
...(env.ZEROSHOT_GATEWAY_API_KEY === undefined
|
|
122
|
+
? {}
|
|
123
|
+
: { apiKey: env.ZEROSHOT_GATEWAY_API_KEY }),
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function gatewayHeadersFromEnv(
|
|
129
|
+
value: unknown,
|
|
130
|
+
env: NodeJS.ProcessEnv
|
|
131
|
+
): Readonly<Record<string, string>> | undefined {
|
|
132
|
+
if (!isRecord(value)) return undefined;
|
|
133
|
+
const headers: Record<string, string> = {};
|
|
134
|
+
for (const [name, envKey] of Object.entries(value)) {
|
|
135
|
+
if (typeof envKey !== 'string' || !envKey) {
|
|
136
|
+
throw new Error('ZEROSHOT_GATEWAY_REQUEST.gatewayHeaderEnv entries must be non-empty strings.');
|
|
137
|
+
}
|
|
138
|
+
const headerValue = env[envKey];
|
|
139
|
+
if (typeof headerValue !== 'string') {
|
|
140
|
+
throw new Error(`Gateway header env ${envKey} is required.`);
|
|
141
|
+
}
|
|
142
|
+
headers[name] = headerValue;
|
|
143
|
+
}
|
|
144
|
+
return headers;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
async function runGatewayLoop(
|
|
148
|
+
context: string,
|
|
149
|
+
gateway: ResolvedGatewayBuildOptions,
|
|
150
|
+
cwd: string,
|
|
151
|
+
events: OutputEvent[]
|
|
152
|
+
): Promise<readonly OutputEvent[]> {
|
|
153
|
+
const toolState: GatewayToolState = { lastError: null };
|
|
154
|
+
const messages: GatewayChatMessage[] = [
|
|
155
|
+
{
|
|
156
|
+
role: 'system',
|
|
157
|
+
content: buildSystemPrompt(gateway.toolPolicy),
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
role: 'user',
|
|
161
|
+
content: context,
|
|
162
|
+
},
|
|
163
|
+
];
|
|
164
|
+
|
|
165
|
+
for (let turn = 0; turn < MAX_GATEWAY_TURNS; turn += 1) {
|
|
166
|
+
const response = await createGatewayChatCompletion({
|
|
167
|
+
baseUrl: gateway.baseUrl,
|
|
168
|
+
apiKey: gateway.apiKey,
|
|
169
|
+
headers: gateway.headers,
|
|
170
|
+
model: gateway.model,
|
|
171
|
+
messages,
|
|
172
|
+
tools: TOOL_DEFINITIONS,
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
if (response.text.trim()) {
|
|
176
|
+
events.push({ type: 'text', text: response.text });
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
if (response.toolCalls.length === 0) {
|
|
180
|
+
events.push(finalGatewayResult(response.text, cwd, toolState));
|
|
181
|
+
return events;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
messages.push({
|
|
185
|
+
role: 'assistant',
|
|
186
|
+
content: response.text,
|
|
187
|
+
toolCalls: response.toolCalls,
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
const errorResult = await executeGatewayToolCalls(
|
|
191
|
+
response.toolCalls,
|
|
192
|
+
gateway.toolPolicy,
|
|
193
|
+
events,
|
|
194
|
+
messages,
|
|
195
|
+
toolState
|
|
196
|
+
);
|
|
197
|
+
if (errorResult !== null) {
|
|
198
|
+
return [...events, errorResult];
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
return [
|
|
203
|
+
...events,
|
|
204
|
+
{
|
|
205
|
+
type: 'result',
|
|
206
|
+
success: false,
|
|
207
|
+
error: `Gateway runner exceeded ${MAX_GATEWAY_TURNS} tool turns.`,
|
|
208
|
+
},
|
|
209
|
+
];
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
interface GatewayToolState {
|
|
213
|
+
lastError: string | null;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
function finalGatewayResult(text: string, cwd: string, toolState: GatewayToolState): OutputEvent {
|
|
217
|
+
if (toolState.lastError !== null) {
|
|
218
|
+
return gatewayToolFailureResult(toolState.lastError);
|
|
219
|
+
}
|
|
220
|
+
return {
|
|
221
|
+
type: 'result',
|
|
222
|
+
success: true,
|
|
223
|
+
result: {
|
|
224
|
+
text,
|
|
225
|
+
cwd,
|
|
226
|
+
},
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
async function executeGatewayToolCalls(
|
|
231
|
+
toolCalls: readonly GatewayToolCall[],
|
|
232
|
+
toolPolicy: GatewayToolPolicy,
|
|
233
|
+
events: OutputEvent[],
|
|
234
|
+
messages: GatewayChatMessage[],
|
|
235
|
+
toolState: GatewayToolState
|
|
236
|
+
): Promise<OutputEvent | null> {
|
|
237
|
+
for (const toolCall of toolCalls) {
|
|
238
|
+
events.push({
|
|
239
|
+
type: 'tool_call',
|
|
240
|
+
toolName: toolCall.name,
|
|
241
|
+
toolId: toolCall.id,
|
|
242
|
+
input: tryParseJson(toolCall.argumentsText) ?? toolCall.argumentsText,
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
const toolResult = await executeGatewayTool(toolCall.name, toolCall.argumentsText, toolPolicy);
|
|
246
|
+
|
|
247
|
+
events.push({
|
|
248
|
+
type: 'tool_result',
|
|
249
|
+
toolId: toolCall.id,
|
|
250
|
+
content: toolResult.content,
|
|
251
|
+
isError: toolResult.isError,
|
|
252
|
+
});
|
|
253
|
+
if (toolResult.isError) {
|
|
254
|
+
toolState.lastError = toolResultErrorMessage(toolResult.content);
|
|
255
|
+
return gatewayToolFailureResult(toolState.lastError);
|
|
256
|
+
}
|
|
257
|
+
messages.push({
|
|
258
|
+
role: 'tool',
|
|
259
|
+
toolCallId: toolCall.id,
|
|
260
|
+
content: stringifyJson(toolResult.content),
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
return null;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
function toolResultErrorMessage(content: unknown): string {
|
|
267
|
+
if (typeof content === 'string' && content.trim()) return content;
|
|
268
|
+
if (isRecord(content)) {
|
|
269
|
+
const message = content.message;
|
|
270
|
+
if (typeof message === 'string' && message.trim()) return message;
|
|
271
|
+
}
|
|
272
|
+
return stringifyJson(content);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
function gatewayToolFailureResult(message: string): OutputEvent {
|
|
276
|
+
return {
|
|
277
|
+
type: 'result',
|
|
278
|
+
success: false,
|
|
279
|
+
error: `Gateway runner observed a tool failure and cannot verify completion: ${message}`,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
async function executeGatewayTool(
|
|
284
|
+
toolName: string,
|
|
285
|
+
argumentsText: string,
|
|
286
|
+
toolPolicy: GatewayToolPolicy
|
|
287
|
+
): Promise<GatewayToolExecutionResult> {
|
|
288
|
+
let parsedArguments: unknown;
|
|
289
|
+
try {
|
|
290
|
+
parsedArguments = parseJson(argumentsText);
|
|
291
|
+
} catch {
|
|
292
|
+
return {
|
|
293
|
+
content: { message: `Gateway tool "${toolName}" returned malformed JSON arguments.` },
|
|
294
|
+
isError: true,
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
try {
|
|
299
|
+
return await executeGatewayToolCall(toolName, parsedArguments, toolPolicy);
|
|
300
|
+
} catch (error) {
|
|
301
|
+
return {
|
|
302
|
+
content: { message: unknownToMessage(error) },
|
|
303
|
+
isError: true,
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
function buildSystemPrompt(toolPolicy: GatewayToolPolicy): string {
|
|
309
|
+
return [
|
|
310
|
+
'You are a noninteractive coding agent.',
|
|
311
|
+
'Use tools only when needed.',
|
|
312
|
+
'Never request confirmation.',
|
|
313
|
+
`Allowed roots: ${toolPolicy.roots.join(', ')}`,
|
|
314
|
+
`Allowlisted commands: ${toolPolicy.commands.join(', ') || '(none)'}`,
|
|
315
|
+
'Return a concise final answer when the task is complete.',
|
|
316
|
+
].join(' ');
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
function tryParseJson(value: string): unknown | null {
|
|
320
|
+
try {
|
|
321
|
+
return JSON.parse(value) as unknown;
|
|
322
|
+
} catch {
|
|
323
|
+
return null;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
async function main(): Promise<void> {
|
|
328
|
+
try {
|
|
329
|
+
const request = gatewayRunnerRequestFromEnv();
|
|
330
|
+
const events = await runGatewayRequest(request);
|
|
331
|
+
writeEvents(events);
|
|
332
|
+
process.exitCode = 0;
|
|
333
|
+
} catch (error) {
|
|
334
|
+
writeEvents([
|
|
335
|
+
{
|
|
336
|
+
type: 'result',
|
|
337
|
+
success: false,
|
|
338
|
+
error: unknownToMessage(error),
|
|
339
|
+
},
|
|
340
|
+
]);
|
|
341
|
+
process.exitCode = 0;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
function writeEvents(events: readonly OutputEvent[]): void {
|
|
346
|
+
for (const event of events) {
|
|
347
|
+
process.stdout.write(`${stringifyJson(event)}\n`);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
if (require.main === module) {
|
|
352
|
+
void main();
|
|
353
|
+
}
|