erosolar-cli 2.1.170 → 2.1.171
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/dist/codex/capabilities/codexCoreCapability.d.ts +6 -0
- package/dist/codex/capabilities/codexCoreCapability.d.ts.map +1 -0
- package/dist/codex/capabilities/codexCoreCapability.js +516 -0
- package/dist/codex/capabilities/codexCoreCapability.js.map +1 -0
- package/dist/codex/fs.d.ts +4 -0
- package/dist/codex/fs.d.ts.map +1 -0
- package/dist/codex/fs.js +25 -0
- package/dist/codex/fs.js.map +1 -0
- package/dist/codex/persistence/planStore.d.ts +4 -0
- package/dist/codex/persistence/planStore.d.ts.map +1 -0
- package/dist/codex/persistence/planStore.js +59 -0
- package/dist/codex/persistence/planStore.js.map +1 -0
- package/dist/codex/pluginAllowlist.d.ts +4 -0
- package/dist/codex/pluginAllowlist.d.ts.map +1 -0
- package/dist/codex/pluginAllowlist.js +14 -0
- package/dist/codex/pluginAllowlist.js.map +1 -0
- package/dist/codex/types.d.ts +21 -0
- package/dist/codex/types.d.ts.map +1 -0
- package/dist/codex/types.js +62 -0
- package/dist/codex/types.js.map +1 -0
- package/dist/headless/evalMode.d.ts.map +1 -1
- package/dist/headless/evalMode.js +6 -0
- package/dist/headless/evalMode.js.map +1 -1
- package/dist/headless/headlessApp.d.ts.map +1 -1
- package/dist/headless/headlessApp.js +6 -0
- package/dist/headless/headlessApp.js.map +1 -1
- package/dist/mcp/sseClient.d.ts +4 -1
- package/dist/mcp/sseClient.d.ts.map +1 -1
- package/dist/mcp/sseClient.js +36 -2
- package/dist/mcp/sseClient.js.map +1 -1
- package/dist/mcp/stdioClient.d.ts +4 -1
- package/dist/mcp/stdioClient.d.ts.map +1 -1
- package/dist/mcp/stdioClient.js +41 -1
- package/dist/mcp/stdioClient.js.map +1 -1
- package/dist/mcp/toolBridge.d.ts +3 -0
- package/dist/mcp/toolBridge.d.ts.map +1 -1
- package/dist/mcp/toolBridge.js +2 -2
- package/dist/mcp/toolBridge.js.map +1 -1
- package/dist/mcp/types.d.ts +18 -0
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/shell/interactiveShell.d.ts +9 -0
- package/dist/shell/interactiveShell.d.ts.map +1 -1
- package/dist/shell/interactiveShell.js +56 -0
- package/dist/shell/interactiveShell.js.map +1 -1
- package/dist/shell/shellApp.d.ts.map +1 -1
- package/dist/shell/shellApp.js +9 -7
- package/dist/shell/shellApp.js.map +1 -1
- package/dist/ui/PromptController.d.ts +3 -0
- package/dist/ui/PromptController.d.ts.map +1 -1
- package/dist/ui/PromptController.js.map +1 -1
- package/dist/ui/UnifiedUIRenderer.d.ts +3 -0
- package/dist/ui/UnifiedUIRenderer.d.ts.map +1 -1
- package/dist/ui/UnifiedUIRenderer.js +16 -0
- package/dist/ui/UnifiedUIRenderer.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { CapabilityContribution, CapabilityContext, CapabilityModule } from '../../runtime/agentHost.js';
|
|
2
|
+
export declare class CodexCoreCapabilityModule implements CapabilityModule {
|
|
3
|
+
readonly id = "capability.codex.core";
|
|
4
|
+
create(context: CapabilityContext): Promise<CapabilityContribution>;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=codexCoreCapability.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codexCoreCapability.d.ts","sourceRoot":"","sources":["../../../src/codex/capabilities/codexCoreCapability.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAmB9G,qBAAa,yBAA0B,YAAW,gBAAgB;IAChE,QAAQ,CAAC,EAAE,2BAA2B;IAEhC,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,sBAAsB,CAAC;CAiB1E"}
|
|
@@ -0,0 +1,516 @@
|
|
|
1
|
+
import { promisify } from 'node:util';
|
|
2
|
+
import { exec as execCallback, spawn } from 'node:child_process';
|
|
3
|
+
import { readFile } from 'node:fs/promises';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { resolveCodexContext } from '../types.js';
|
|
6
|
+
import { resolveWorkingPath, isPathInside } from '../fs.js';
|
|
7
|
+
import { updatePlan } from '../persistence/planStore.js';
|
|
8
|
+
import { loadMcpServers } from '../../mcp/config.js';
|
|
9
|
+
import { McpStdioClient } from '../../mcp/stdioClient.js';
|
|
10
|
+
import { McpSseClient } from '../../mcp/sseClient.js';
|
|
11
|
+
import { formatContentBlock } from '../../mcp/toolBridge.js';
|
|
12
|
+
const exec = promisify(execCallback);
|
|
13
|
+
export class CodexCoreCapabilityModule {
|
|
14
|
+
id = 'capability.codex.core';
|
|
15
|
+
async create(context) {
|
|
16
|
+
const codexContext = resolveCodexContext(context.env, context.workingDir);
|
|
17
|
+
return {
|
|
18
|
+
id: 'codex.core',
|
|
19
|
+
description: 'Codex-compatible core tools (shell_command, apply_patch, update_plan, MCP helpers, view_image).',
|
|
20
|
+
toolSuite: {
|
|
21
|
+
id: 'codex-core',
|
|
22
|
+
description: 'Codex CLI core tools',
|
|
23
|
+
tools: createCodexTools(codexContext),
|
|
24
|
+
},
|
|
25
|
+
metadata: {
|
|
26
|
+
sandboxMode: codexContext.sandboxMode,
|
|
27
|
+
networkAccess: codexContext.networkAccess,
|
|
28
|
+
approvalPolicy: codexContext.approvalPolicy,
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function createCodexTools(context) {
|
|
34
|
+
return [
|
|
35
|
+
{
|
|
36
|
+
name: 'shell_command',
|
|
37
|
+
description: 'Execute a shell command within the workspace. Respects sandbox restrictions and enforces workspace scoping.',
|
|
38
|
+
parameters: {
|
|
39
|
+
type: 'object',
|
|
40
|
+
properties: {
|
|
41
|
+
command: { type: 'string' },
|
|
42
|
+
workdir: { type: 'string', description: 'Optional working directory relative to workspace.' },
|
|
43
|
+
timeout_ms: { type: 'number', description: 'Optional timeout in milliseconds.' },
|
|
44
|
+
with_escalated_permissions: { type: 'boolean' },
|
|
45
|
+
justification: { type: 'string' },
|
|
46
|
+
},
|
|
47
|
+
required: ['command'],
|
|
48
|
+
},
|
|
49
|
+
handler: async (args) => runShellCommand(context, args),
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
name: 'apply_patch',
|
|
53
|
+
description: 'Apply a unified diff patch within the workspace (guarded).',
|
|
54
|
+
parameters: {
|
|
55
|
+
type: 'object',
|
|
56
|
+
properties: {
|
|
57
|
+
patch: { type: 'string' },
|
|
58
|
+
workdir: { type: 'string', description: 'Optional working directory relative to workspace.' },
|
|
59
|
+
},
|
|
60
|
+
required: ['patch'],
|
|
61
|
+
},
|
|
62
|
+
handler: async (args) => applyPatch(context, args),
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
name: 'update_plan',
|
|
66
|
+
description: 'Persist plan steps with Codex semantics (one in_progress at a time).',
|
|
67
|
+
parameters: {
|
|
68
|
+
type: 'object',
|
|
69
|
+
properties: {
|
|
70
|
+
explanation: { type: 'string' },
|
|
71
|
+
plan: {
|
|
72
|
+
type: 'array',
|
|
73
|
+
items: {
|
|
74
|
+
type: 'object',
|
|
75
|
+
required: ['step', 'status'],
|
|
76
|
+
properties: {
|
|
77
|
+
step: { type: 'string' },
|
|
78
|
+
status: { type: 'string', enum: ['pending', 'in_progress', 'completed'] },
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
required: ['plan'],
|
|
84
|
+
},
|
|
85
|
+
handler: async (args) => updatePlanState(context, args),
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
name: 'list_mcp_resources',
|
|
89
|
+
description: 'List resources exposed by configured MCP servers.',
|
|
90
|
+
parameters: {
|
|
91
|
+
type: 'object',
|
|
92
|
+
properties: {},
|
|
93
|
+
},
|
|
94
|
+
handler: async () => listMcpResources(context),
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
name: 'read_mcp_resource',
|
|
98
|
+
description: 'Read a resource from an MCP server and return its content.',
|
|
99
|
+
parameters: {
|
|
100
|
+
type: 'object',
|
|
101
|
+
properties: {
|
|
102
|
+
server: { type: 'string' },
|
|
103
|
+
uri: { type: 'string' },
|
|
104
|
+
},
|
|
105
|
+
required: ['server', 'uri'],
|
|
106
|
+
},
|
|
107
|
+
handler: async (args) => readMcpResource(context, args),
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
name: 'list_mcp_resource_templates',
|
|
111
|
+
description: 'List MCP resource templates from configured servers.',
|
|
112
|
+
parameters: {
|
|
113
|
+
type: 'object',
|
|
114
|
+
properties: {},
|
|
115
|
+
},
|
|
116
|
+
handler: async () => listMcpResourceTemplates(context),
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
name: 'view_image',
|
|
120
|
+
description: 'Load an image from disk and return base64 metadata for display.',
|
|
121
|
+
parameters: {
|
|
122
|
+
type: 'object',
|
|
123
|
+
properties: {
|
|
124
|
+
path: { type: 'string' },
|
|
125
|
+
},
|
|
126
|
+
required: ['path'],
|
|
127
|
+
},
|
|
128
|
+
handler: async (args) => viewImage(context, args),
|
|
129
|
+
},
|
|
130
|
+
];
|
|
131
|
+
}
|
|
132
|
+
async function runShellCommand(context, args) {
|
|
133
|
+
const command = typeof args['command'] === 'string' ? args['command'].trim() : '';
|
|
134
|
+
if (!command) {
|
|
135
|
+
return 'Error: command must be a non-empty string.';
|
|
136
|
+
}
|
|
137
|
+
const escalationRequested = args['with_escalated_permissions'] === true;
|
|
138
|
+
if (escalationRequested && (context.approvalPolicy === 'never' || context.approvalPolicy === 'untrusted')) {
|
|
139
|
+
return `Blocked: escalated permissions are disabled by approval policy (${context.approvalPolicy}).`;
|
|
140
|
+
}
|
|
141
|
+
const escalationNotice = escalationRequested && context.approvalPolicy !== 'on-failure'
|
|
142
|
+
? `Note: escalation requested but running under "${context.approvalPolicy}" policy within current sandbox.`
|
|
143
|
+
: null;
|
|
144
|
+
// Basic sandbox guardrail: prevent escape from workspace
|
|
145
|
+
const cwd = resolveSafeCwd(context, args['workdir']);
|
|
146
|
+
if (context.sandboxMode === 'read-only' && isPotentiallyMutating(command)) {
|
|
147
|
+
return 'Blocked: sandbox is read-only.';
|
|
148
|
+
}
|
|
149
|
+
// Optional: respect restricted network flag (best-effort, advisory)
|
|
150
|
+
if (context.networkAccess === 'restricted' && isNetworkCommand(command)) {
|
|
151
|
+
return 'Blocked: network access is restricted in this sandbox.';
|
|
152
|
+
}
|
|
153
|
+
try {
|
|
154
|
+
const timeout = typeof args['timeout_ms'] === 'number' ? Math.max(1, Math.floor(args['timeout_ms'])) : undefined;
|
|
155
|
+
const { stdout, stderr } = await exec(command, { cwd, timeout });
|
|
156
|
+
if (stderr && stderr.trim()) {
|
|
157
|
+
const payload = [stdout.trim(), stderr.trim()].filter(Boolean).join('\n');
|
|
158
|
+
return escalationNotice ? [escalationNotice, payload].filter(Boolean).join('\n') : payload;
|
|
159
|
+
}
|
|
160
|
+
const payload = stdout.trim();
|
|
161
|
+
return escalationNotice ? [escalationNotice, payload].filter(Boolean).join('\n') : payload;
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
const err = error;
|
|
165
|
+
const stderr = typeof err?.stderr === 'string' ? err.stderr.trim() : '';
|
|
166
|
+
const stdout = typeof err?.stdout === 'string' ? err.stdout.trim() : '';
|
|
167
|
+
const message = err?.message ? String(err.message) : 'Shell command failed.';
|
|
168
|
+
const payload = [stdout, stderr, message].filter(Boolean).join('\n');
|
|
169
|
+
return escalationNotice ? [escalationNotice, payload].filter(Boolean).join('\n') : payload;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
async function applyPatch(context, args) {
|
|
173
|
+
const patch = typeof args['patch'] === 'string' ? args['patch'] : '';
|
|
174
|
+
if (!patch.trim()) {
|
|
175
|
+
return 'Error: patch must be a non-empty string.';
|
|
176
|
+
}
|
|
177
|
+
if (context.sandboxMode === 'read-only') {
|
|
178
|
+
return 'Blocked: sandbox is read-only.';
|
|
179
|
+
}
|
|
180
|
+
const cwd = resolveSafeCwd(context, args['workdir']);
|
|
181
|
+
const violations = findPatchViolations(context.workingDir, patch);
|
|
182
|
+
if (violations.length) {
|
|
183
|
+
return `Rejected patch: paths escape workspace:\n${violations.join('\n')}`;
|
|
184
|
+
}
|
|
185
|
+
try {
|
|
186
|
+
const output = await applyPatchWithBinary(patch, cwd);
|
|
187
|
+
return output;
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
191
|
+
return `Failed to apply patch: ${message}`;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
async function applyPatchWithBinary(patch, cwd) {
|
|
195
|
+
return new Promise((resolve, reject) => {
|
|
196
|
+
const child = spawn('patch', ['-p0', '-u', '-N', '--binary'], { cwd });
|
|
197
|
+
let stdout = '';
|
|
198
|
+
let stderr = '';
|
|
199
|
+
child.stdout.on('data', (data) => {
|
|
200
|
+
stdout += data.toString();
|
|
201
|
+
});
|
|
202
|
+
child.stderr.on('data', (data) => {
|
|
203
|
+
stderr += data.toString();
|
|
204
|
+
});
|
|
205
|
+
child.on('error', (error) => {
|
|
206
|
+
reject(error);
|
|
207
|
+
});
|
|
208
|
+
child.on('close', (code) => {
|
|
209
|
+
if (code === 0) {
|
|
210
|
+
resolve([stdout.trim(), stderr.trim()].filter(Boolean).join('\n') || 'Patch applied.');
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
reject(new Error(stderr.trim() || `patch exited with code ${code}`));
|
|
214
|
+
});
|
|
215
|
+
child.stdin.write(patch);
|
|
216
|
+
child.stdin.end();
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
async function updatePlanState(context, args) {
|
|
220
|
+
const explanation = typeof args['explanation'] === 'string' ? args['explanation'] : undefined;
|
|
221
|
+
const planArg = Array.isArray(args['plan']) ? args['plan'] : [];
|
|
222
|
+
const nextPlan = planArg
|
|
223
|
+
.map((entry) => ({
|
|
224
|
+
step: typeof entry?.step === 'string' ? entry.step : '',
|
|
225
|
+
status: entry?.status,
|
|
226
|
+
}))
|
|
227
|
+
.filter((entry) => Boolean(entry.step));
|
|
228
|
+
const state = await updatePlan(context.workingDir, { plan: nextPlan, explanation });
|
|
229
|
+
return formatPlan(state);
|
|
230
|
+
}
|
|
231
|
+
async function listMcpResources(context) {
|
|
232
|
+
const servers = await loadMcpServers({ workingDir: context.workingDir, env: context.env });
|
|
233
|
+
if (!servers.length) {
|
|
234
|
+
return 'No MCP servers configured.';
|
|
235
|
+
}
|
|
236
|
+
const records = [];
|
|
237
|
+
for (const server of servers) {
|
|
238
|
+
const client = createMcpClient(server, context.workingDir);
|
|
239
|
+
try {
|
|
240
|
+
const resources = await client.listResources();
|
|
241
|
+
records.push({
|
|
242
|
+
server: server.id,
|
|
243
|
+
type: server.type,
|
|
244
|
+
description: server.description,
|
|
245
|
+
location: server.type === 'sse' ? server.url : server.command,
|
|
246
|
+
resources,
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
catch (error) {
|
|
250
|
+
records.push({
|
|
251
|
+
server: server.id,
|
|
252
|
+
type: server.type,
|
|
253
|
+
description: server.description,
|
|
254
|
+
location: server.type === 'sse' ? server.url : server.command,
|
|
255
|
+
error: formatMcpError(error),
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
finally {
|
|
259
|
+
await client.dispose();
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return JSON.stringify(records, null, 2);
|
|
263
|
+
}
|
|
264
|
+
async function readMcpResource(context, args) {
|
|
265
|
+
const serverId = typeof args['server'] === 'string' ? args['server'].trim() : '';
|
|
266
|
+
const uri = typeof args['uri'] === 'string' ? args['uri'].trim() : '';
|
|
267
|
+
if (!serverId || !uri) {
|
|
268
|
+
return 'Error: server and uri are required.';
|
|
269
|
+
}
|
|
270
|
+
const server = await findMcpServer(context, serverId);
|
|
271
|
+
if (!server) {
|
|
272
|
+
return `Server "${serverId}" is not configured.`;
|
|
273
|
+
}
|
|
274
|
+
const client = createMcpClient(server, context.workingDir);
|
|
275
|
+
try {
|
|
276
|
+
const result = await client.readResource(uri);
|
|
277
|
+
const blocks = normalizeContentBlocks(result);
|
|
278
|
+
const formatted = blocks
|
|
279
|
+
.map((block) => formatContentBlock(block))
|
|
280
|
+
.filter((line) => Boolean(line?.trim()));
|
|
281
|
+
const lines = [];
|
|
282
|
+
lines.push(`Server: ${serverId}`);
|
|
283
|
+
const label = result.resource?.name || result.resource?.uri;
|
|
284
|
+
lines.push(`Resource: ${label && label !== uri ? `${uri} (${label})` : uri}`);
|
|
285
|
+
if (result.resource?.mimeType) {
|
|
286
|
+
lines.push(`MIME: ${result.resource.mimeType}`);
|
|
287
|
+
}
|
|
288
|
+
if (result.resource?.description) {
|
|
289
|
+
lines.push(result.resource.description);
|
|
290
|
+
}
|
|
291
|
+
if (formatted.length) {
|
|
292
|
+
lines.push('', ...formatted);
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
lines.push('No content returned for this resource.');
|
|
296
|
+
}
|
|
297
|
+
return lines.join('\n');
|
|
298
|
+
}
|
|
299
|
+
catch (error) {
|
|
300
|
+
return `Failed to read ${serverId}:${uri}: ${formatMcpError(error)}`;
|
|
301
|
+
}
|
|
302
|
+
finally {
|
|
303
|
+
await client.dispose();
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
async function listMcpResourceTemplates(context) {
|
|
307
|
+
const servers = await loadMcpServers({ workingDir: context.workingDir, env: context.env });
|
|
308
|
+
if (!servers.length) {
|
|
309
|
+
return 'No MCP servers configured.';
|
|
310
|
+
}
|
|
311
|
+
const records = [];
|
|
312
|
+
for (const server of servers) {
|
|
313
|
+
const client = createMcpClient(server, context.workingDir);
|
|
314
|
+
try {
|
|
315
|
+
const templates = await client.listResourceTemplates();
|
|
316
|
+
records.push({
|
|
317
|
+
server: server.id,
|
|
318
|
+
type: server.type,
|
|
319
|
+
description: server.description,
|
|
320
|
+
location: server.type === 'sse' ? server.url : server.command,
|
|
321
|
+
templates,
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
catch (error) {
|
|
325
|
+
records.push({
|
|
326
|
+
server: server.id,
|
|
327
|
+
type: server.type,
|
|
328
|
+
description: server.description,
|
|
329
|
+
location: server.type === 'sse' ? server.url : server.command,
|
|
330
|
+
error: formatMcpError(error),
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
finally {
|
|
334
|
+
await client.dispose();
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
return JSON.stringify(records, null, 2);
|
|
338
|
+
}
|
|
339
|
+
function createMcpClient(config, workingDir) {
|
|
340
|
+
return config.type === 'sse' ? new McpSseClient(config) : new McpStdioClient(config, workingDir);
|
|
341
|
+
}
|
|
342
|
+
async function findMcpServer(context, id) {
|
|
343
|
+
const servers = await loadMcpServers({ workingDir: context.workingDir, env: context.env });
|
|
344
|
+
return servers.find((server) => server.id === id) ?? null;
|
|
345
|
+
}
|
|
346
|
+
function normalizeContentBlocks(result) {
|
|
347
|
+
if (!result) {
|
|
348
|
+
return [];
|
|
349
|
+
}
|
|
350
|
+
if (Array.isArray(result.content)) {
|
|
351
|
+
return result.content;
|
|
352
|
+
}
|
|
353
|
+
if (Array.isArray(result.contents)) {
|
|
354
|
+
return result.contents;
|
|
355
|
+
}
|
|
356
|
+
return [];
|
|
357
|
+
}
|
|
358
|
+
function formatMcpError(error) {
|
|
359
|
+
if (error instanceof Error) {
|
|
360
|
+
return error.message;
|
|
361
|
+
}
|
|
362
|
+
return String(error);
|
|
363
|
+
}
|
|
364
|
+
async function viewImage(context, args) {
|
|
365
|
+
const targetPath = typeof args['path'] === 'string' ? args['path'] : '';
|
|
366
|
+
if (!targetPath.trim()) {
|
|
367
|
+
return 'Error: path is required.';
|
|
368
|
+
}
|
|
369
|
+
const resolved = resolveWorkingPath(context.workingDir, targetPath);
|
|
370
|
+
try {
|
|
371
|
+
const data = await readFile(resolved);
|
|
372
|
+
const size = data.byteLength;
|
|
373
|
+
if (size > 1024 * 1024) {
|
|
374
|
+
return `Image too large to inline (${size} bytes). Path: ${resolved}`;
|
|
375
|
+
}
|
|
376
|
+
const base64 = data.toString('base64');
|
|
377
|
+
const ext = path.extname(resolved).replace(/^\./, '') || 'octet-stream';
|
|
378
|
+
return JSON.stringify({ path: resolved, size, encoding: 'base64', mediaType: `image/${ext}`, data: base64 }, null, 2);
|
|
379
|
+
}
|
|
380
|
+
catch (error) {
|
|
381
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
382
|
+
return `Failed to read image: ${message}`;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
function resolveSafeCwd(context, workdir) {
|
|
386
|
+
const base = context.workingDir;
|
|
387
|
+
const cwd = resolveWorkingPath(base, typeof workdir === 'string' ? workdir : undefined);
|
|
388
|
+
if (context.sandboxMode === 'read-only') {
|
|
389
|
+
return base;
|
|
390
|
+
}
|
|
391
|
+
return cwd;
|
|
392
|
+
}
|
|
393
|
+
function findPatchViolations(baseDir, patch) {
|
|
394
|
+
const violations = [];
|
|
395
|
+
const lines = patch.split('\n');
|
|
396
|
+
const paths = new Set();
|
|
397
|
+
for (const line of lines) {
|
|
398
|
+
const diffMatch = line.match(/^diff --git a\/(\S+) b\/(\S+)/);
|
|
399
|
+
if (diffMatch && diffMatch[1] && diffMatch[2]) {
|
|
400
|
+
paths.add(diffMatch[1]);
|
|
401
|
+
paths.add(diffMatch[2]);
|
|
402
|
+
continue;
|
|
403
|
+
}
|
|
404
|
+
const plusMatch = line.match(/^\+\+\+ ([^\t]+)/);
|
|
405
|
+
if (plusMatch && plusMatch[1]) {
|
|
406
|
+
paths.add(plusMatch[1]);
|
|
407
|
+
continue;
|
|
408
|
+
}
|
|
409
|
+
const minusMatch = line.match(/^\-\-\- ([^\t]+)/);
|
|
410
|
+
if (minusMatch && minusMatch[1]) {
|
|
411
|
+
paths.add(minusMatch[1]);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
for (const candidate of paths) {
|
|
415
|
+
if (candidate === '/dev/null') {
|
|
416
|
+
continue;
|
|
417
|
+
}
|
|
418
|
+
const cleaned = candidate.replace(/^[ab]\//, '');
|
|
419
|
+
const resolved = path.resolve(baseDir, cleaned);
|
|
420
|
+
if (!isPathInside(baseDir, resolved)) {
|
|
421
|
+
violations.push(`${candidate} -> ${resolved}`);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
return violations;
|
|
425
|
+
}
|
|
426
|
+
function isPotentiallyMutating(command) {
|
|
427
|
+
const normalized = command.toLowerCase();
|
|
428
|
+
if (/>|>>/.test(command)) {
|
|
429
|
+
return true;
|
|
430
|
+
}
|
|
431
|
+
if (/\bsudo\b/.test(normalized)) {
|
|
432
|
+
return true;
|
|
433
|
+
}
|
|
434
|
+
const directMutators = [
|
|
435
|
+
'rm',
|
|
436
|
+
'rmdir',
|
|
437
|
+
'mv',
|
|
438
|
+
'cp',
|
|
439
|
+
'ln',
|
|
440
|
+
'mkdir',
|
|
441
|
+
'touch',
|
|
442
|
+
'chmod',
|
|
443
|
+
'chown',
|
|
444
|
+
'truncate',
|
|
445
|
+
'dd',
|
|
446
|
+
'mkfs',
|
|
447
|
+
'mount',
|
|
448
|
+
'umount',
|
|
449
|
+
'tee',
|
|
450
|
+
'docker',
|
|
451
|
+
'kubectl',
|
|
452
|
+
'helm',
|
|
453
|
+
];
|
|
454
|
+
for (const token of directMutators) {
|
|
455
|
+
const pattern = new RegExp(`\\b${token}\\b`);
|
|
456
|
+
if (pattern.test(normalized)) {
|
|
457
|
+
return true;
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
const packageManagers = /\b(npm|yarn|pnpm|pip|pip3|brew|apt(-get)?|yum|dnf|pacman|apk|cargo|go\s+install|go\s+get|bundle|gem|composer|dotnet|nuget|conda|mamba)\b/;
|
|
461
|
+
if (packageManagers.test(normalized)) {
|
|
462
|
+
return true;
|
|
463
|
+
}
|
|
464
|
+
if (/\bsed\b[^\n]*\s-i\b/.test(normalized) || /\bperl\b[^\n]*\s-i\b/.test(normalized)) {
|
|
465
|
+
return true;
|
|
466
|
+
}
|
|
467
|
+
const gitMutations = /\bgit\s+(commit|push|pull|merge|rebase|reset|checkout|clean|apply|am|cherry-pick|fetch|clone|init|switch)\b/;
|
|
468
|
+
if (gitMutations.test(normalized)) {
|
|
469
|
+
return true;
|
|
470
|
+
}
|
|
471
|
+
return false;
|
|
472
|
+
}
|
|
473
|
+
function isNetworkCommand(command) {
|
|
474
|
+
const normalized = command.toLowerCase();
|
|
475
|
+
const checks = [
|
|
476
|
+
/\bcurl\b/i,
|
|
477
|
+
/\bwget\b/i,
|
|
478
|
+
/\bhttp(s)?:\/\//i,
|
|
479
|
+
/\bgit\s+(clone|fetch|pull)\b/i,
|
|
480
|
+
/\bssh\b(?!-keygen)/i,
|
|
481
|
+
/\bscp\b/i,
|
|
482
|
+
/\bsftp\b/i,
|
|
483
|
+
/\bftp\b/i,
|
|
484
|
+
/\brsync\b/i,
|
|
485
|
+
/\bnc\b\s+/i,
|
|
486
|
+
/\bdocker\s+(pull|run|build)\b/i,
|
|
487
|
+
];
|
|
488
|
+
if (checks.some((pattern) => pattern.test(command))) {
|
|
489
|
+
return true;
|
|
490
|
+
}
|
|
491
|
+
const packageNetwork = [
|
|
492
|
+
/\b(npm|yarn|pnpm)\s+(install|add|update|upgrade|ci|publish|link)\b/i,
|
|
493
|
+
/\b(pip|pip3)\s+(install|download)\b/i,
|
|
494
|
+
/\bcargo\b\s+(install|update)\b/i,
|
|
495
|
+
/\bgo\s+(get|install)\b/i,
|
|
496
|
+
/\bbundle\b\s+install\b/i,
|
|
497
|
+
/\bgem\b\s+(install|update)\b/i,
|
|
498
|
+
/\bcomposer\b\s+(install|update|require)\b/i,
|
|
499
|
+
/\b(brew|apt-get|apt|yum|dnf|pacman|apk)\b/i,
|
|
500
|
+
/\b(conda|mamba)\b\s+(install|update|create)\b/i,
|
|
501
|
+
];
|
|
502
|
+
if (packageNetwork.some((pattern) => pattern.test(normalized))) {
|
|
503
|
+
return true;
|
|
504
|
+
}
|
|
505
|
+
return false;
|
|
506
|
+
}
|
|
507
|
+
function formatPlan(state) {
|
|
508
|
+
const header = state.explanation ? `${state.explanation.trim()}\n\n` : '';
|
|
509
|
+
const body = state.plan.length === 0
|
|
510
|
+
? 'Plan is empty.'
|
|
511
|
+
: state.plan
|
|
512
|
+
.map((item, index) => `${index + 1}. [${item.status}] ${item.step}`)
|
|
513
|
+
.join('\n');
|
|
514
|
+
return `${header}${body}`;
|
|
515
|
+
}
|
|
516
|
+
//# sourceMappingURL=codexCoreCapability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codexCoreCapability.js","sourceRoot":"","sources":["../../../src/codex/capabilities/codexCoreCapability.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function resolveWorkingPath(baseDir: string, candidate?: string): string;
|
|
2
|
+
export declare function isPathInside(baseDir: string, target: string): boolean;
|
|
3
|
+
export declare function ensureStateDir(baseDir: string): Promise<string>;
|
|
4
|
+
//# sourceMappingURL=fs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/codex/fs.ts"],"names":[],"mappings":"AAGA,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAU9E;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAKrE;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAIrE"}
|
package/dist/codex/fs.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { mkdir } from 'node:fs/promises';
|
|
3
|
+
export function resolveWorkingPath(baseDir, candidate) {
|
|
4
|
+
const base = path.resolve(baseDir);
|
|
5
|
+
if (!candidate) {
|
|
6
|
+
return base;
|
|
7
|
+
}
|
|
8
|
+
const resolved = path.resolve(base, candidate);
|
|
9
|
+
if (!isPathInside(base, resolved)) {
|
|
10
|
+
throw new Error(`Path "${candidate}" escapes the workspace root.`);
|
|
11
|
+
}
|
|
12
|
+
return resolved;
|
|
13
|
+
}
|
|
14
|
+
export function isPathInside(baseDir, target) {
|
|
15
|
+
const root = path.resolve(baseDir);
|
|
16
|
+
const base = root.endsWith(path.sep) ? root : root + path.sep;
|
|
17
|
+
const candidate = path.resolve(target);
|
|
18
|
+
return candidate === root || candidate.startsWith(base);
|
|
19
|
+
}
|
|
20
|
+
export async function ensureStateDir(baseDir) {
|
|
21
|
+
const dir = path.join(baseDir, '.erosolar', 'codex');
|
|
22
|
+
await mkdir(dir, { recursive: true });
|
|
23
|
+
return dir;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=fs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/codex/fs.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,MAAM,UAAU,kBAAkB,CAAC,OAAe,EAAE,SAAkB;IACpE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC/C,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,SAAS,SAAS,+BAA+B,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,MAAc;IAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC;IAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,OAAO,SAAS,KAAK,IAAI,IAAI,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAe;IAClD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IACrD,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { PlanState } from '../types.js';
|
|
2
|
+
export declare function loadPlan(workingDir: string): Promise<PlanState>;
|
|
3
|
+
export declare function updatePlan(workingDir: string, next: Pick<PlanState, 'plan' | 'explanation'>): Promise<PlanState>;
|
|
4
|
+
//# sourceMappingURL=planStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planStore.d.ts","sourceRoot":"","sources":["../../../src/codex/persistence/planStore.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAY,SAAS,EAAc,MAAM,aAAa,CAAC;AAKnE,wBAAsB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAkBrE;AAED,wBAAsB,UAAU,CAC9B,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,CAAC,GAC5C,OAAO,CAAC,SAAS,CAAC,CAapB"}
|