cyrus-codex-runner 0.2.74-cypack1546.0 → 0.2.76
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/CodexEventMapper.d.ts.map +1 -1
- package/dist/CodexEventMapper.js +0 -12
- package/dist/CodexEventMapper.js.map +1 -1
- package/dist/CodexRunner.d.ts +0 -2
- package/dist/CodexRunner.d.ts.map +1 -1
- package/dist/CodexRunner.js +1 -16
- package/dist/CodexRunner.js.map +1 -1
- package/dist/backend/appServerClient.d.ts +0 -6
- package/dist/backend/appServerClient.d.ts.map +1 -1
- package/dist/backend/appServerClient.js +3 -75
- package/dist/backend/appServerClient.js.map +1 -1
- package/dist/backend/appServerEvents.d.ts.map +1 -1
- package/dist/backend/appServerEvents.js +0 -16
- package/dist/backend/appServerEvents.js.map +1 -1
- package/dist/backend/types.d.ts +0 -7
- package/dist/backend/types.d.ts.map +1 -1
- package/dist/config/CodexConfigBuilder.d.ts.map +1 -1
- package/dist/config/CodexConfigBuilder.js +6 -5
- package/dist/config/CodexConfigBuilder.js.map +1 -1
- package/dist/config/sandboxPolicy.d.ts +3 -3
- package/dist/config/sandboxPolicy.d.ts.map +1 -1
- package/dist/config/sandboxPolicy.js +14 -18
- package/dist/config/sandboxPolicy.js.map +1 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -3
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +6 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -11
- package/dist/backend/CodexLoginBroker.d.ts +0 -20
- package/dist/backend/CodexLoginBroker.d.ts.map +0 -1
- package/dist/backend/CodexLoginBroker.js +0 -252
- package/dist/backend/CodexLoginBroker.js.map +0 -1
- package/dist/backend/ContainedCodexProcess.d.ts +0 -48
- package/dist/backend/ContainedCodexProcess.d.ts.map +0 -1
- package/dist/backend/ContainedCodexProcess.js +0 -306
- package/dist/backend/ContainedCodexProcess.js.map +0 -1
|
@@ -1,306 +0,0 @@
|
|
|
1
|
-
import { spawn } from "node:child_process";
|
|
2
|
-
import { randomUUID } from "node:crypto";
|
|
3
|
-
import { AppServerClient } from "./appServerClient.js";
|
|
4
|
-
// Runs inside the isolated container. The only bridge is framed stdio; its HTTP
|
|
5
|
-
// server is in the container's network-none namespace, never a host listener.
|
|
6
|
-
const relay = String.raw `
|
|
7
|
-
const http = require('node:http'), cp = require('node:child_process'), readline = require('node:readline'), fs = require('node:fs');
|
|
8
|
-
fs.mkdirSync('/work/home/.codex', {recursive:true,mode:448});
|
|
9
|
-
const pending = new Map(); let sequence=0, child;
|
|
10
|
-
function emit(value) { process.stdout.write(JSON.stringify(value)+'\n'); }
|
|
11
|
-
const server = http.createServer(async (req,res) => {
|
|
12
|
-
if(req.method!=='POST'||req.url!=='/responses'||pending.size>=2){res.writeHead(403);res.end();return;}
|
|
13
|
-
const chunks=[];let size=0;
|
|
14
|
-
try { for await(const part of req){size+=part.length;if(size>2000000)throw Error();chunks.push(part);} }
|
|
15
|
-
catch {res.writeHead(413);res.end();return;}
|
|
16
|
-
const id='cyrus-model-'+(++sequence);
|
|
17
|
-
const timer=setTimeout(()=>{pending.delete(id);res.writeHead(504);res.end();},60000);
|
|
18
|
-
pending.set(id,{res,timer});
|
|
19
|
-
emit({id,method:'cyrus/model',params:{body:Buffer.concat(chunks).toString('utf8')}});
|
|
20
|
-
});
|
|
21
|
-
server.listen(0,'127.0.0.1',()=>{
|
|
22
|
-
const base='http://127.0.0.1:'+server.address().port;
|
|
23
|
-
const config={model_provider:'cyrus_contained',model_providers:{cyrus_contained:{name:'Cyrus scoped model broker',base_url:base,wire_api:'responses',requires_openai_auth:false,supports_websockets:false,request_max_retries:0,stream_max_retries:0}},web_search:'disabled',mcp_servers:{},analytics:{enabled:false},features:{shell_tool:false,unified_exec:false,multi_agent:false,goals:false,apps:false,plugins:false,hooks:false,remote_plugin:false,skill_search:false,skill_mcp_dependency_install:false,memories:false,external_agent_memory_import:false,browser_use:false,browser_use_external:false,computer_use:false,image_generation:false,code_mode_host:false,workspace_dependencies:false,sleep_tool:false},cli_auth_credentials_store:'ephemeral'};
|
|
24
|
-
const args=['app-server','--listen','stdio://'];
|
|
25
|
-
// TOML overrides for fixed supervisor settings only. Never merge user config.
|
|
26
|
-
for(const [k,v] of Object.entries(config)) {
|
|
27
|
-
if(k==='model_providers') {
|
|
28
|
-
for(const [field,value] of Object.entries(v.cyrus_contained))args.push('-c','model_providers.cyrus_contained.'+field+'='+JSON.stringify(value));
|
|
29
|
-
} else if(typeof v==='object') {
|
|
30
|
-
for(const [field,value] of Object.entries(v))args.push('-c',k+'.'+field+'='+JSON.stringify(value));
|
|
31
|
-
} else args.push('-c',k+'='+JSON.stringify(v));
|
|
32
|
-
}
|
|
33
|
-
child=cp.spawn('/usr/local/bin/codex',args,{cwd:'/work',env:{PATH:'/usr/local/bin:/usr/bin:/bin',HOME:'/work/home',CODEX_HOME:'/work/home/.codex'},stdio:['pipe','pipe','pipe']});
|
|
34
|
-
child.stdout.pipe(process.stdout); child.stderr.resume();
|
|
35
|
-
child.on('error',()=>process.exit(70));child.on('exit',()=>process.exit(0));
|
|
36
|
-
const input=readline.createInterface({input:process.stdin});let bytes=0;
|
|
37
|
-
input.on('line',line=>{
|
|
38
|
-
bytes+=Buffer.byteLength(line);if(line.length>8000000||bytes>64000000)process.exit(71);
|
|
39
|
-
let message;try{message=JSON.parse(line);}catch{process.exit(72);}
|
|
40
|
-
if(typeof message.id==='string'&&message.id.startsWith('cyrus-model-')) {
|
|
41
|
-
const p=pending.get(message.id);if(!p)return;pending.delete(message.id);clearTimeout(p.timer);
|
|
42
|
-
const r=message.result;
|
|
43
|
-
if(!r||typeof r.body!=='string'||r.body.length>8000000||!Number.isInteger(r.status)){p.res.writeHead(502);p.res.end();return;}
|
|
44
|
-
p.res.writeHead(r.status,{'content-type':r.contentType==='text/event-stream'?'text/event-stream':'application/json'});p.res.end(Buffer.from(r.body,'base64'));
|
|
45
|
-
} else child.stdin.write(line+'\n');
|
|
46
|
-
});
|
|
47
|
-
input.on('close',()=>process.exit(0));
|
|
48
|
-
});
|
|
49
|
-
`;
|
|
50
|
-
/** Dedicated process, empty home, no mounts/network/credentials; never uses the
|
|
51
|
-
* ordinary shared app-server pool. Container data is untrusted at the bridge. */
|
|
52
|
-
export class ContainedCodexProcess {
|
|
53
|
-
config;
|
|
54
|
-
name = `cyrus-codex-${randomUUID()}`;
|
|
55
|
-
client;
|
|
56
|
-
stopped = false;
|
|
57
|
-
started = false;
|
|
58
|
-
initialized = false;
|
|
59
|
-
closing;
|
|
60
|
-
requests = new Set();
|
|
61
|
-
constructor(config) {
|
|
62
|
-
this.config = config;
|
|
63
|
-
if (!/^sha256:[a-f0-9]{64}$/.test(config.image) ||
|
|
64
|
-
!config.dockerPath.startsWith("/") ||
|
|
65
|
-
!config.dockerHost.startsWith("unix:///"))
|
|
66
|
-
throw new Error("Contained Codex requires a local immutable image and Docker socket");
|
|
67
|
-
}
|
|
68
|
-
command(args, signal) {
|
|
69
|
-
return new Promise((resolve, reject) => {
|
|
70
|
-
const child = spawn(this.config.dockerPath, ["--host", this.config.dockerHost, ...args], {
|
|
71
|
-
env: { PATH: "/usr/bin:/bin", HOME: "/nonexistent" },
|
|
72
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
73
|
-
signal,
|
|
74
|
-
});
|
|
75
|
-
let output = "", size = 0;
|
|
76
|
-
const timer = setTimeout(() => child.kill("SIGKILL"), 15000);
|
|
77
|
-
child.stdout.on("data", (part) => {
|
|
78
|
-
size += part.length;
|
|
79
|
-
if (size > 1000000)
|
|
80
|
-
child.kill("SIGKILL");
|
|
81
|
-
else
|
|
82
|
-
output += part.toString();
|
|
83
|
-
});
|
|
84
|
-
child.stderr.resume();
|
|
85
|
-
child.on("error", () => {
|
|
86
|
-
clearTimeout(timer);
|
|
87
|
-
reject(new Error("Contained Codex Docker operation failed"));
|
|
88
|
-
});
|
|
89
|
-
child.on("close", (code) => {
|
|
90
|
-
clearTimeout(timer);
|
|
91
|
-
if (code === 0 && size <= 1000000)
|
|
92
|
-
resolve(output);
|
|
93
|
-
else
|
|
94
|
-
reject(new Error("Contained Codex Docker operation failed"));
|
|
95
|
-
});
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
async start(options) {
|
|
99
|
-
if (this.started || this.stopped)
|
|
100
|
-
throw new Error("Contained Codex process cannot be reused");
|
|
101
|
-
this.started = true;
|
|
102
|
-
const info = JSON.parse(await this.command(["image", "inspect", this.config.image], options.signal));
|
|
103
|
-
if (info.length !== 1 || Object.keys(info[0]?.Config?.Volumes ?? {}).length)
|
|
104
|
-
throw new Error("Contained image may not declare volumes");
|
|
105
|
-
if (this.stopped)
|
|
106
|
-
throw new Error("Contained process is closing");
|
|
107
|
-
const args = [
|
|
108
|
-
"--host",
|
|
109
|
-
this.config.dockerHost,
|
|
110
|
-
"run",
|
|
111
|
-
"--rm",
|
|
112
|
-
"--pull=never",
|
|
113
|
-
"--interactive",
|
|
114
|
-
"--name",
|
|
115
|
-
this.name,
|
|
116
|
-
"--network=none",
|
|
117
|
-
"--read-only",
|
|
118
|
-
"--no-healthcheck",
|
|
119
|
-
"--cap-drop=ALL",
|
|
120
|
-
"--security-opt=no-new-privileges",
|
|
121
|
-
"--pids-limit=128",
|
|
122
|
-
"--memory=768m",
|
|
123
|
-
"--cpus=1",
|
|
124
|
-
"--user=1000:1000",
|
|
125
|
-
"--workdir=/work",
|
|
126
|
-
"--tmpfs=/work:rw,nosuid,nodev,size=128m,uid=1000,gid=1000,mode=0700",
|
|
127
|
-
"--tmpfs=/tmp:rw,nosuid,nodev,size=64m,uid=1000,gid=1000,mode=0700",
|
|
128
|
-
"--entrypoint=/usr/bin/env",
|
|
129
|
-
this.config.image,
|
|
130
|
-
"-i",
|
|
131
|
-
"PATH=/usr/local/bin:/usr/bin:/bin",
|
|
132
|
-
"HOME=/work/home",
|
|
133
|
-
"/usr/local/bin/node",
|
|
134
|
-
"-e",
|
|
135
|
-
relay,
|
|
136
|
-
];
|
|
137
|
-
const client = new AppServerClient({
|
|
138
|
-
binaryPath: this.config.dockerPath,
|
|
139
|
-
args,
|
|
140
|
-
env: { PATH: "/usr/bin:/bin", HOME: "/nonexistent" },
|
|
141
|
-
logger: { warn() { }, error() { } },
|
|
142
|
-
requestTimeoutMs: 20000,
|
|
143
|
-
maxOutputBytes: 32_000_000,
|
|
144
|
-
});
|
|
145
|
-
this.client = client;
|
|
146
|
-
let modelRequests = 0;
|
|
147
|
-
client.setNotificationHandler(options.notification);
|
|
148
|
-
client.setServerRequestHandler((method, params) => {
|
|
149
|
-
if (this.stopped)
|
|
150
|
-
throw new Error("Contained process is closing");
|
|
151
|
-
const work = (async () => {
|
|
152
|
-
options.signal.throwIfAborted();
|
|
153
|
-
if (method !== "cyrus/model")
|
|
154
|
-
return options.request(method, params);
|
|
155
|
-
if (++modelRequests > 24 ||
|
|
156
|
-
!params ||
|
|
157
|
-
typeof params !== "object" ||
|
|
158
|
-
Object.keys(params).join() !== "body" ||
|
|
159
|
-
typeof params.body !== "string" ||
|
|
160
|
-
Buffer.byteLength(params.body) > 2000000)
|
|
161
|
-
throw new Error("Contained model request rejected");
|
|
162
|
-
return options.model(params, options.signal);
|
|
163
|
-
})();
|
|
164
|
-
this.requests.add(work);
|
|
165
|
-
const settled = () => this.requests.delete(work);
|
|
166
|
-
void work.then(settled, settled);
|
|
167
|
-
return work;
|
|
168
|
-
});
|
|
169
|
-
client.on("error", () => {
|
|
170
|
-
void this.close().catch(() => { });
|
|
171
|
-
});
|
|
172
|
-
const abort = () => {
|
|
173
|
-
void this.close().catch(() => { });
|
|
174
|
-
};
|
|
175
|
-
options.signal.addEventListener("abort", abort, { once: true });
|
|
176
|
-
client.on("exit", () => {
|
|
177
|
-
options.signal.removeEventListener("abort", abort);
|
|
178
|
-
options.exit?.();
|
|
179
|
-
});
|
|
180
|
-
try {
|
|
181
|
-
options.signal.throwIfAborted();
|
|
182
|
-
client.start();
|
|
183
|
-
const initialized = await client.request("initialize", {
|
|
184
|
-
clientInfo: { name: "cyrus-contained-codex", version: "1" },
|
|
185
|
-
capabilities: { experimentalApi: true },
|
|
186
|
-
});
|
|
187
|
-
if (initialized.codexHome !== "/work/home/.codex" ||
|
|
188
|
-
!initialized.userAgent.includes("/0.153.3 "))
|
|
189
|
-
throw new Error("Unsupported contained Codex protocol");
|
|
190
|
-
this.initialized = true;
|
|
191
|
-
}
|
|
192
|
-
catch {
|
|
193
|
-
await this.close();
|
|
194
|
-
throw new Error("Contained Codex initialization failed");
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
request(method, params) {
|
|
198
|
-
if (this.stopped || !this.client)
|
|
199
|
-
throw new Error("Contained Codex is unavailable");
|
|
200
|
-
return this.client.request(method, params);
|
|
201
|
-
}
|
|
202
|
-
/** Native rollout only; no auth/config/database files or host filesystem access. */
|
|
203
|
-
async snapshot(threadId) {
|
|
204
|
-
if (!/^[a-f0-9-]{36}$/.test(threadId))
|
|
205
|
-
throw new Error("Invalid native session ID");
|
|
206
|
-
const { thread } = await this.request("thread/read", { threadId, includeTurns: false });
|
|
207
|
-
if (thread.id !== threadId ||
|
|
208
|
-
typeof thread.path !== "string" ||
|
|
209
|
-
!thread.path.startsWith("/work/home/.codex/sessions/"))
|
|
210
|
-
throw new Error("Foreign native checkpoint");
|
|
211
|
-
const result = await this.request("command/exec", {
|
|
212
|
-
command: [
|
|
213
|
-
"/usr/local/bin/node",
|
|
214
|
-
"-e",
|
|
215
|
-
`const fs=require('node:fs');const p=process.argv[1];if(!fs.realpathSync(p).startsWith('/work/home/.codex/sessions/'))process.exit(1);const fd=fs.openSync(p,fs.constants.O_RDONLY|fs.constants.O_NOFOLLOW);const s=fs.fstatSync(fd);if(!s.isFile()||s.size>2000000)process.exit(2);process.stdout.write(fs.readFileSync(fd).toString('base64'));`,
|
|
216
|
-
thread.path,
|
|
217
|
-
],
|
|
218
|
-
cwd: "/work",
|
|
219
|
-
sandboxPolicy: { type: "dangerFullAccess" },
|
|
220
|
-
timeoutMs: 5000,
|
|
221
|
-
outputBytesCap: 2700000,
|
|
222
|
-
});
|
|
223
|
-
if (result.exitCode !== 0)
|
|
224
|
-
throw new Error("Native checkpoint capture failed");
|
|
225
|
-
const snapshot = { threadId, rollout: result.stdout };
|
|
226
|
-
this.validateSnapshot(snapshot);
|
|
227
|
-
return snapshot;
|
|
228
|
-
}
|
|
229
|
-
validateSnapshot(snapshot) {
|
|
230
|
-
if (!/^[a-f0-9-]{36}$/.test(snapshot.threadId) ||
|
|
231
|
-
snapshot.rollout.length > 2700000 ||
|
|
232
|
-
!/^[A-Za-z0-9+/]+={0,2}$/.test(snapshot.rollout))
|
|
233
|
-
throw new Error("Invalid native checkpoint");
|
|
234
|
-
const bytes = Buffer.from(snapshot.rollout, "base64");
|
|
235
|
-
if (bytes.length > 2000000 || bytes.toString("base64") !== snapshot.rollout)
|
|
236
|
-
throw new Error("Invalid native checkpoint encoding");
|
|
237
|
-
const first = JSON.parse(bytes.toString("utf8").split("\n")[0]);
|
|
238
|
-
if (first.type !== "session_meta" ||
|
|
239
|
-
first.payload?.id !== snapshot.threadId ||
|
|
240
|
-
first.payload?.cwd !== "/work")
|
|
241
|
-
throw new Error("Native checkpoint identity mismatch");
|
|
242
|
-
}
|
|
243
|
-
async restore(snapshot) {
|
|
244
|
-
this.validateSnapshot(snapshot);
|
|
245
|
-
const path = `/work/home/.codex/sessions/cyrus-${snapshot.threadId}.jsonl`;
|
|
246
|
-
const result = await this.request("command/exec", {
|
|
247
|
-
command: [
|
|
248
|
-
"/usr/local/bin/node",
|
|
249
|
-
"-e",
|
|
250
|
-
`const fs=require('node:fs');fs.mkdirSync('/work/home/.codex/sessions',{recursive:true,mode:448});fs.writeFileSync(process.argv[1],Buffer.from(process.argv[2],'base64'),{flag:'wx',mode:384});`,
|
|
251
|
-
path,
|
|
252
|
-
snapshot.rollout,
|
|
253
|
-
],
|
|
254
|
-
cwd: "/work",
|
|
255
|
-
sandboxPolicy: { type: "dangerFullAccess" },
|
|
256
|
-
timeoutMs: 5000,
|
|
257
|
-
});
|
|
258
|
-
if (result.exitCode !== 0)
|
|
259
|
-
throw new Error("Native checkpoint restore failed");
|
|
260
|
-
return path;
|
|
261
|
-
}
|
|
262
|
-
close() {
|
|
263
|
-
if (this.closing)
|
|
264
|
-
return this.closing;
|
|
265
|
-
this.stopped = true;
|
|
266
|
-
this.closing = (async () => {
|
|
267
|
-
const clientClosed = await Promise.allSettled([this.client?.close()]);
|
|
268
|
-
const containerClosed = await Promise.allSettled([
|
|
269
|
-
(async () => {
|
|
270
|
-
if (this.started) {
|
|
271
|
-
// --rm may already have removed it. A successful empty listing,
|
|
272
|
-
// not a swallowed removal/daemon failure, proves absence.
|
|
273
|
-
await this.command(["rm", "--force", this.name]).catch(() => { });
|
|
274
|
-
const remaining = await this.command([
|
|
275
|
-
"ps",
|
|
276
|
-
"--all",
|
|
277
|
-
"--quiet",
|
|
278
|
-
"--no-trunc",
|
|
279
|
-
"--filter",
|
|
280
|
-
`name=^/${this.name}$`,
|
|
281
|
-
]);
|
|
282
|
-
if (remaining.trim())
|
|
283
|
-
throw new Error("Contained container cleanup unconfirmed");
|
|
284
|
-
}
|
|
285
|
-
})(),
|
|
286
|
-
]);
|
|
287
|
-
let timer;
|
|
288
|
-
try {
|
|
289
|
-
await Promise.race([
|
|
290
|
-
Promise.allSettled([...this.requests]),
|
|
291
|
-
new Promise((_, reject) => {
|
|
292
|
-
timer = setTimeout(() => reject(new Error("Contained request cleanup unconfirmed")), 15000);
|
|
293
|
-
}),
|
|
294
|
-
]);
|
|
295
|
-
}
|
|
296
|
-
finally {
|
|
297
|
-
clearTimeout(timer);
|
|
298
|
-
}
|
|
299
|
-
if ((this.started && !this.initialized) ||
|
|
300
|
-
[...clientClosed, ...containerClosed].some((result) => result.status === "rejected"))
|
|
301
|
-
throw new Error("Contained process cleanup unconfirmed");
|
|
302
|
-
})();
|
|
303
|
-
return this.closing;
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
//# sourceMappingURL=ContainedCodexProcess.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ContainedCodexProcess.js","sourceRoot":"","sources":["../../src/backend/ContainedCodexProcess.ts"],"names":[],"mappings":"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"}
|