humanish 0.96.0 → 0.97.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/README.md +4 -1
- package/dist/automatic-analysis-config.d.ts +15 -5
- package/dist/automatic-analysis-config.js +25 -4
- package/dist/automatic-analysis-config.js.map +1 -1
- package/dist/automatic-study-analysis.js +4 -2
- package/dist/automatic-study-analysis.js.map +1 -1
- package/dist/cua-actor-lab.d.ts +18 -286
- package/dist/cua-actor-lab.js +151 -1955
- package/dist/cua-actor-lab.js.map +1 -1
- package/dist/cua-desktop-lane.d.ts +35 -0
- package/dist/cua-desktop-lane.js +13 -0
- package/dist/cua-desktop-lane.js.map +1 -0
- package/dist/desktop-session.d.ts +41 -0
- package/dist/desktop-session.js +44 -0
- package/dist/desktop-session.js.map +1 -0
- package/dist/doctor-lab.d.ts +6 -1
- package/dist/doctor-lab.js +17 -3
- package/dist/doctor-lab.js.map +1 -1
- package/dist/e2b-cua-desktop.d.ts +3 -0
- package/dist/e2b-cua-desktop.js +675 -0
- package/dist/e2b-cua-desktop.js.map +1 -0
- package/dist/e2b-cua-provisioning.d.ts +311 -0
- package/dist/e2b-cua-provisioning.js +1213 -0
- package/dist/e2b-cua-provisioning.js.map +1 -0
- package/dist/e2b-desktop-session.d.ts +7 -0
- package/dist/e2b-desktop-session.js +29 -0
- package/dist/e2b-desktop-session.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/lab-summary.d.ts +3 -1
- package/dist/local-agent-cli.js +1 -1
- package/dist/local-agent-cli.js.map +1 -1
- package/dist/observer-app.html +2 -2
- package/dist/program.js +24 -9
- package/dist/program.js.map +1 -1
- package/dist/restricted-codex-analysis.d.ts +15 -0
- package/dist/restricted-codex-analysis.js +13 -0
- package/dist/restricted-codex-analysis.js.map +1 -0
- package/dist/restricted-codex-policy.d.ts +56 -0
- package/dist/restricted-codex-policy.js +151 -0
- package/dist/restricted-codex-policy.js.map +1 -0
- package/dist/restricted-codex-session.d.ts +19 -0
- package/dist/restricted-codex-session.js +419 -0
- package/dist/restricted-codex-session.js.map +1 -0
- package/dist/restricted-codex-transport.d.ts +58 -0
- package/dist/restricted-codex-transport.js +233 -0
- package/dist/restricted-codex-transport.js.map +1 -0
- package/dist/run.d.ts +1 -1
- package/dist/run.js +1 -1
- package/dist/run.js.map +1 -1
- package/dist/study-analysis-codex-config.d.ts +11 -0
- package/dist/study-analysis-codex-config.js +34 -0
- package/dist/study-analysis-codex-config.js.map +1 -0
- package/dist/study-analysis-engine.d.ts +6 -3
- package/dist/study-analysis-engine.js +19 -10
- package/dist/study-analysis-engine.js.map +1 -1
- package/dist/study-analysis-job.d.ts +1 -0
- package/dist/study-analysis-job.js +1 -1
- package/dist/study-analysis-job.js.map +1 -1
- package/dist/study-analysis-provider.d.ts +4 -2
- package/dist/study-analysis-provider.js +1 -1
- package/dist/study-analysis-provider.js.map +1 -1
- package/dist/study-analysis-service.d.ts +3 -0
- package/dist/study-analysis-service.js +24 -6
- package/dist/study-analysis-service.js.map +1 -1
- package/dist/study-analysis-validation.d.ts +29 -5
- package/dist/study-analysis-validation.js +23 -10
- package/dist/study-analysis-validation.js.map +1 -1
- package/dist/study-analysis.d.ts +27 -2
- package/dist/tui-app.js +102 -102
- package/docs/architecture/desktop-sessions.md +80 -0
- package/docs/architecture/restricted-codex-analysis.md +89 -0
- package/docs/contracts/run-bundle.md +7 -4
- package/docs/contracts/schemas.md +1 -1
- package/docs/contracts/study-analysis.md +44 -2
- package/docs/goals/current.md +4 -4
- package/docs/product/automatic-analysis.md +24 -3
- package/docs/ramp/README.md +11 -1
- package/docs/release/0.96.1-browser-navigation.md +22 -0
- package/docs/release/0.97.0-codex-account-analysis.md +45 -0
- package/package.json +1 -1
- package/skills/humanish/SKILL.md +19 -0
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { constants } from "node:fs";
|
|
3
|
+
import { access, chmod, lstat, mkdir, mkdtemp, open, readdir, realpath, rm, stat, symlink, unlink, writeFile } from "node:fs/promises";
|
|
4
|
+
import { homedir, tmpdir } from "node:os";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { CODEX_IMAGE, CODEX_MAX_OUTPUT_BYTES, RESTRICTED_CODEX_ANALYSIS_IDENTITY, RESTRICTED_CODEX_ANALYSIS_MODELS, admitsRestrictedCodexConfig, admitsRestrictedCodexThread, codexRecord, restrictedCodexConfig, restrictedCodexFailure, restrictedCodexRequestError, restrictedCodexUsage } from "./restricted-codex-policy.js";
|
|
7
|
+
import { RestrictedCodexDeadline, RestrictedCodexStop, RestrictedCodexTransport, closeOwnedCodexProcess, ownCodexProcess } from "./restricted-codex-transport.js";
|
|
8
|
+
function childEnvironment(source, home, scratch) {
|
|
9
|
+
const result = { HOME: home, CODEX_HOME: home, TMPDIR: scratch };
|
|
10
|
+
for (const key of ["PATH", "LANG", "USER", "LOGNAME"])
|
|
11
|
+
if (typeof source[key] === "string")
|
|
12
|
+
result[key] = source[key];
|
|
13
|
+
return result;
|
|
14
|
+
}
|
|
15
|
+
async function isNativeExecutable(file) {
|
|
16
|
+
try {
|
|
17
|
+
await access(file, constants.X_OK);
|
|
18
|
+
const handle = await open(file, "r");
|
|
19
|
+
try {
|
|
20
|
+
const buffer = Buffer.alloc(4);
|
|
21
|
+
const read = await handle.read(buffer, 0, 4, 0);
|
|
22
|
+
return read.bytesRead === 4 && buffer.equals(Buffer.from([0x7f, 0x45, 0x4c, 0x46]));
|
|
23
|
+
}
|
|
24
|
+
finally {
|
|
25
|
+
await handle.close();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** Resolve PATH without running a shell. The npm launcher is resolved to its
|
|
33
|
+
* native optional package so cleanup owns the real app-server child. */
|
|
34
|
+
async function resolveExecutable(options, env) {
|
|
35
|
+
let selected = options.executable;
|
|
36
|
+
if (selected === undefined) {
|
|
37
|
+
for (const directory of (env.PATH ?? "").split(path.delimiter).filter(entry => path.isAbsolute(entry))) {
|
|
38
|
+
const candidate = path.join(directory, "codex");
|
|
39
|
+
try {
|
|
40
|
+
await access(candidate, constants.X_OK);
|
|
41
|
+
selected = candidate;
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
catch { /* Continue PATH. */ }
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (selected === undefined || !path.isAbsolute(selected))
|
|
48
|
+
throw new RestrictedCodexStop("codex_unavailable");
|
|
49
|
+
let resolved;
|
|
50
|
+
try {
|
|
51
|
+
resolved = await realpath(selected);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
throw new RestrictedCodexStop("codex_unavailable");
|
|
55
|
+
}
|
|
56
|
+
if (await isNativeExecutable(resolved))
|
|
57
|
+
return resolved;
|
|
58
|
+
if (path.basename(resolved) === "codex.js" && path.basename(path.dirname(resolved)) === "bin") {
|
|
59
|
+
const packageRoot = path.dirname(path.dirname(resolved));
|
|
60
|
+
const triple = "x86_64-unknown-linux-musl";
|
|
61
|
+
for (const candidate of [path.join(packageRoot, "node_modules", "@openai", "codex-linux-x64", "vendor", triple, "bin", "codex"),
|
|
62
|
+
path.join(packageRoot, "vendor", triple, "bin", "codex")]) {
|
|
63
|
+
if (await isNativeExecutable(candidate))
|
|
64
|
+
return realpath(candidate);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
throw new RestrictedCodexStop("codex_unavailable");
|
|
68
|
+
}
|
|
69
|
+
async function checkVersion(file, env, cwd, spawnFn, deadline) {
|
|
70
|
+
deadline.check();
|
|
71
|
+
const owned = ownCodexProcess(spawnFn(file, ["--version"], { cwd, env, detached: false, stdio: ["pipe", "pipe", "pipe"] }));
|
|
72
|
+
let text = "", bytes = 0, exitCode = null;
|
|
73
|
+
const timer = setTimeout(() => deadline.stop("timeout"), 15_000);
|
|
74
|
+
owned.child.on("error", () => deadline.stop("codex_unavailable"));
|
|
75
|
+
owned.child.stdin.on("error", () => deadline.stop("codex_unavailable"));
|
|
76
|
+
owned.child.stdout.on("data", (chunk) => {
|
|
77
|
+
bytes += chunk.length;
|
|
78
|
+
if (bytes > 4096)
|
|
79
|
+
deadline.stop("response_too_large");
|
|
80
|
+
else
|
|
81
|
+
text += chunk.toString("utf8");
|
|
82
|
+
});
|
|
83
|
+
owned.child.stderr.on("data", (chunk) => { bytes += chunk.length; if (bytes > 4096)
|
|
84
|
+
deadline.stop("response_too_large"); });
|
|
85
|
+
owned.child.on("exit", code => { exitCode = code; });
|
|
86
|
+
try {
|
|
87
|
+
await deadline.wait(owned.closed);
|
|
88
|
+
if (exitCode !== 0)
|
|
89
|
+
throw new RestrictedCodexStop("codex_unavailable");
|
|
90
|
+
if (text.trim() !== `codex-cli ${RESTRICTED_CODEX_ANALYSIS_IDENTITY.cliVersion}`)
|
|
91
|
+
throw new RestrictedCodexStop("codex_unsupported_version");
|
|
92
|
+
}
|
|
93
|
+
finally {
|
|
94
|
+
clearTimeout(timer);
|
|
95
|
+
if (!await closeOwnedCodexProcess(owned)) {
|
|
96
|
+
retainUnclosedChild(owned.closed);
|
|
97
|
+
throw new RestrictedCodexStop("codex_cleanup_failed");
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
let activeSession = false;
|
|
102
|
+
let unclosedChild = false;
|
|
103
|
+
function retainUnclosedChild(closed) {
|
|
104
|
+
unclosedChild = true;
|
|
105
|
+
void closed.then(() => { unclosedChild = false; });
|
|
106
|
+
}
|
|
107
|
+
/** The gate covers all factories and readiness checks in this process. It does not
|
|
108
|
+
* promise to serialize unrelated Codex applications using the same host login. */
|
|
109
|
+
export async function runRestrictedCodexSession(request, options = {}, readinessOnly = false) {
|
|
110
|
+
const error = restrictedCodexRequestError(request);
|
|
111
|
+
if (error)
|
|
112
|
+
return restrictedCodexFailure(error);
|
|
113
|
+
if (activeSession || unclosedChild)
|
|
114
|
+
return restrictedCodexFailure("codex_busy");
|
|
115
|
+
activeSession = true;
|
|
116
|
+
try {
|
|
117
|
+
return await executeRestrictedCodexSession(request, options, readinessOnly);
|
|
118
|
+
}
|
|
119
|
+
finally {
|
|
120
|
+
activeSession = false;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
async function writeRecoveryMarker(work, sourceEnv, reason) {
|
|
124
|
+
const cache = sourceEnv.XDG_CACHE_HOME ?? path.join(sourceEnv.HOME ?? homedir(), ".cache");
|
|
125
|
+
if (!path.isAbsolute(cache))
|
|
126
|
+
return;
|
|
127
|
+
const markers = path.join(cache, "humanish", "codex-analysis-recovery");
|
|
128
|
+
await mkdir(markers, { recursive: true, mode: 0o700 });
|
|
129
|
+
await writeFile(path.join(markers, `${path.basename(work)}.json`), JSON.stringify({
|
|
130
|
+
schema: "humanish.codex-auth-recovery.v1", taskDirectoryName: path.basename(work),
|
|
131
|
+
homeDirectoryName: "home", authFileName: "auth.json", reason
|
|
132
|
+
}) + "\n", { mode: 0o600, flag: "wx" });
|
|
133
|
+
}
|
|
134
|
+
async function preserveUnexpectedAuth(work, sourceEnv) {
|
|
135
|
+
const home = path.join(work, "home");
|
|
136
|
+
await chmod(work, 0o700);
|
|
137
|
+
await chmod(home, 0o700);
|
|
138
|
+
const authPath = path.join(home, "auth.json"), auth = await lstat(authPath);
|
|
139
|
+
await chmod(authPath, auth.isDirectory() ? 0o700 : 0o600);
|
|
140
|
+
// Preserve only login state. Evidence, logs, databases and config are disposable.
|
|
141
|
+
for (const name of await readdir(home))
|
|
142
|
+
if (name !== "auth.json")
|
|
143
|
+
await rm(path.join(home, name), { recursive: true, force: true });
|
|
144
|
+
for (const name of await readdir(work))
|
|
145
|
+
if (name !== "home")
|
|
146
|
+
await rm(path.join(work, name), { recursive: true, force: true });
|
|
147
|
+
await writeRecoveryMarker(work, sourceEnv, "unexpected_auth_replacement");
|
|
148
|
+
}
|
|
149
|
+
function hasScopedIdentity(method, params, threadId, turnId) {
|
|
150
|
+
if (method === "turn/started" || method === "turn/completed") {
|
|
151
|
+
const id = codexRecord(params.turn).id;
|
|
152
|
+
return params.threadId === threadId && typeof id === "string" && id.length > 0 && id.length <= 200
|
|
153
|
+
&& (turnId === undefined || id === turnId);
|
|
154
|
+
}
|
|
155
|
+
if (method.startsWith("item/") || method.startsWith("rawResponse") || method === "thread/tokenUsage/updated")
|
|
156
|
+
return params.threadId === threadId && typeof params.turnId === "string" && params.turnId.length > 0
|
|
157
|
+
&& (turnId === undefined || params.turnId === turnId);
|
|
158
|
+
return (params.threadId === undefined || params.threadId === threadId) && (params.turnId === undefined || params.turnId === turnId);
|
|
159
|
+
}
|
|
160
|
+
/** Exactly one fresh thread/turn; private host auth, no participant state reuse. */
|
|
161
|
+
async function executeRestrictedCodexSession(request, options = {}, readinessOnly = false) {
|
|
162
|
+
const admissionError = restrictedCodexRequestError(request);
|
|
163
|
+
if (admissionError)
|
|
164
|
+
return restrictedCodexFailure(admissionError);
|
|
165
|
+
if ((options.platform ?? process.platform) !== "linux" || (options.arch ?? process.arch) !== "x64")
|
|
166
|
+
return restrictedCodexFailure("codex_unsupported_platform");
|
|
167
|
+
const deadline = new RestrictedCodexDeadline(request.timeoutMs, request.signal);
|
|
168
|
+
const sourceEnv = options.env ?? process.env;
|
|
169
|
+
const spawnFn = options.spawnFn ?? ((file, args, settings) => spawn(file, args, settings));
|
|
170
|
+
let work, authLink, transport;
|
|
171
|
+
let threadId, turnId, earlyTurnId;
|
|
172
|
+
let dispatched = false, completed = false, usage = null;
|
|
173
|
+
let generatedDeltaBytes = 0;
|
|
174
|
+
let outputItem;
|
|
175
|
+
let result = restrictedCodexFailure("codex_process_failed");
|
|
176
|
+
const early = [];
|
|
177
|
+
let resolveTurn;
|
|
178
|
+
const finished = new Promise(resolve => { resolveTurn = resolve; });
|
|
179
|
+
const handleTurnEvent = (method, params) => {
|
|
180
|
+
if (!hasScopedIdentity(method, params, threadId, turnId)) {
|
|
181
|
+
deadline.stop("codex_protocol_error");
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
const item = codexRecord(params.item);
|
|
185
|
+
if (method === "rawResponseItem/completed") {
|
|
186
|
+
if (!["message", "reasoning"].includes(String(item.type))) {
|
|
187
|
+
deadline.stop("codex_tool_call");
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
if (item.type === "message" && Array.isArray(item.content)
|
|
191
|
+
&& item.content.some(content => codexRecord(content).type === "refusal"))
|
|
192
|
+
deadline.stop("refusal");
|
|
193
|
+
}
|
|
194
|
+
if (method === "thread/tokenUsage/updated")
|
|
195
|
+
usage = restrictedCodexUsage(params.tokenUsage);
|
|
196
|
+
if (method === "item/started" || method === "item/completed") {
|
|
197
|
+
if (!["userMessage", "agentMessage", "reasoning"].includes(String(item.type))) {
|
|
198
|
+
deadline.stop("codex_tool_call");
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
if (item.type === "agentMessage") {
|
|
202
|
+
if (item.delivery === "async" || (Array.isArray(item.questions) && item.questions.length > 0)) {
|
|
203
|
+
deadline.stop("codex_tool_call");
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
if (method === "item/completed" && item.phase !== "commentary") {
|
|
207
|
+
if (typeof item.id !== "string" || typeof item.text !== "string" || Buffer.byteLength(item.text) > CODEX_MAX_OUTPUT_BYTES
|
|
208
|
+
|| (item.phase !== null && item.phase !== "final_answer") || (item.delivery !== null && item.delivery !== undefined)
|
|
209
|
+
|| (outputItem && (outputItem.id !== item.id || outputItem.text !== item.text))) {
|
|
210
|
+
deadline.stop("invalid_response");
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
outputItem = { id: item.id, text: item.text };
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
if (method === "turn/completed") {
|
|
218
|
+
const turn = codexRecord(params.turn);
|
|
219
|
+
if (turn.id !== turnId || completed) {
|
|
220
|
+
deadline.stop("codex_protocol_error");
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
completed = true;
|
|
224
|
+
if (turn.status === "interrupted") {
|
|
225
|
+
deadline.stop("cancelled");
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
if (turn.status !== "completed" || turn.error !== null || !outputItem) {
|
|
229
|
+
deadline.stop("invalid_response");
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
try {
|
|
233
|
+
resolveTurn({ status: "completed", output: JSON.parse(outputItem.text), usage,
|
|
234
|
+
usageComplete: usage !== null, dispatched: true, errorCode: null });
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
deadline.stop("invalid_response");
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
try {
|
|
242
|
+
deadline.check();
|
|
243
|
+
const file = await resolveExecutable(options, sourceEnv);
|
|
244
|
+
deadline.check();
|
|
245
|
+
work = await mkdtemp(path.join(options.tempRoot ?? tmpdir(), "humanish-codex-analysis-"));
|
|
246
|
+
await chmod(work, 0o700);
|
|
247
|
+
work = await realpath(work);
|
|
248
|
+
const home = path.join(work, "home"), cwd = path.join(work, "cwd"), scratch = path.join(work, "scratch");
|
|
249
|
+
for (const directory of [home, cwd, scratch])
|
|
250
|
+
await mkdir(directory, { mode: 0o700 });
|
|
251
|
+
const env = childEnvironment(sourceEnv, home, scratch);
|
|
252
|
+
await checkVersion(file, env, cwd, spawnFn, deadline);
|
|
253
|
+
const config = restrictedCodexConfig(request.model), configPath = path.join(home, "config.toml");
|
|
254
|
+
await writeFile(configPath, config.toml, { mode: 0o600, flag: "wx" });
|
|
255
|
+
const authHome = options.authHome ?? sourceEnv.CODEX_HOME ?? path.join(sourceEnv.HOME ?? homedir(), ".codex");
|
|
256
|
+
if (!path.isAbsolute(authHome))
|
|
257
|
+
throw new RestrictedCodexStop("codex_unsupported_auth");
|
|
258
|
+
let authFile;
|
|
259
|
+
try {
|
|
260
|
+
authFile = await realpath(path.join(authHome, "auth.json"));
|
|
261
|
+
if (!(await stat(authFile)).isFile())
|
|
262
|
+
throw new Error();
|
|
263
|
+
}
|
|
264
|
+
catch {
|
|
265
|
+
throw new RestrictedCodexStop("codex_login_required");
|
|
266
|
+
}
|
|
267
|
+
deadline.check();
|
|
268
|
+
authLink = path.join(home, "auth.json");
|
|
269
|
+
await symlink(authFile, authLink);
|
|
270
|
+
deadline.check();
|
|
271
|
+
const owned = ownCodexProcess(spawnFn(file, ["app-server", "--strict-config"], {
|
|
272
|
+
cwd, env, detached: false, stdio: ["pipe", "pipe", "pipe"]
|
|
273
|
+
}));
|
|
274
|
+
// Raw input notifications echo supplied image data. Bound that wire separately
|
|
275
|
+
// from the 2 MiB generated report, without dropping admitted evidence.
|
|
276
|
+
const frameLimit = Math.max(CODEX_MAX_OUTPUT_BYTES, Buffer.byteLength(JSON.stringify({ instructions: request.instructions,
|
|
277
|
+
evidence: request.evidence, images: request.images, schema: request.schema })) + 1024 * 1024);
|
|
278
|
+
transport = new RestrictedCodexTransport(owned, deadline, frameLimit);
|
|
279
|
+
transport.onNotification = (method, params) => {
|
|
280
|
+
if (!dispatched)
|
|
281
|
+
return;
|
|
282
|
+
if (!hasScopedIdentity(method, params, threadId, turnId ?? earlyTurnId)) {
|
|
283
|
+
deadline.stop("codex_protocol_error");
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
if (method === "item/agentMessage/delta") {
|
|
287
|
+
if (typeof params.delta !== "string") {
|
|
288
|
+
deadline.stop("codex_protocol_error");
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
generatedDeltaBytes += Buffer.byteLength(params.delta);
|
|
292
|
+
if (generatedDeltaBytes > CODEX_MAX_OUTPUT_BYTES) {
|
|
293
|
+
deadline.stop("response_too_large");
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
const item = codexRecord(params.item);
|
|
298
|
+
// Tool requests must fail even if the turn-start acknowledgment is lost.
|
|
299
|
+
if ((method === "rawResponseItem/completed" && !["message", "reasoning"].includes(String(item.type)))
|
|
300
|
+
|| (["item/started", "item/completed"].includes(method) && item.type === "agentMessage"
|
|
301
|
+
&& (item.delivery === "async" || (Array.isArray(item.questions) && item.questions.length > 0)))) {
|
|
302
|
+
deadline.stop("codex_tool_call");
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
if (method === "turn/started") {
|
|
306
|
+
const value = codexRecord(params.turn).id;
|
|
307
|
+
if (typeof value !== "string" || value.length === 0 || (earlyTurnId !== undefined && value !== earlyTurnId))
|
|
308
|
+
deadline.stop("codex_protocol_error");
|
|
309
|
+
else
|
|
310
|
+
earlyTurnId = value;
|
|
311
|
+
}
|
|
312
|
+
if (turnId === undefined)
|
|
313
|
+
early.push({ method, params });
|
|
314
|
+
else
|
|
315
|
+
handleTurnEvent(method, params);
|
|
316
|
+
};
|
|
317
|
+
const initialize = await transport.rpc("initialize", {
|
|
318
|
+
clientInfo: { name: "humanish_analysis", version: "1.0.0" }, capabilities: { experimentalApi: true }
|
|
319
|
+
});
|
|
320
|
+
if (typeof initialize.userAgent !== "string" || !initialize.userAgent.includes(`/0.154.0 `)
|
|
321
|
+
|| initialize.codexHome !== home || initialize.platformOs !== "linux" || initialize.platformFamily !== "unix")
|
|
322
|
+
throw new RestrictedCodexStop("codex_unsupported_version");
|
|
323
|
+
transport.notify("initialized", {});
|
|
324
|
+
const effective = await transport.rpc("config/read", { includeLayers: true, cwd });
|
|
325
|
+
if (!admitsRestrictedCodexConfig(effective, configPath, request.model))
|
|
326
|
+
throw new RestrictedCodexStop("codex_unsafe_configuration");
|
|
327
|
+
const account = await transport.rpc("account/read", { refreshToken: false });
|
|
328
|
+
if (account.account === null)
|
|
329
|
+
throw new RestrictedCodexStop("codex_login_required");
|
|
330
|
+
if (codexRecord(account.account).type !== "chatgpt" || account.requiresOpenaiAuth !== true)
|
|
331
|
+
throw new RestrictedCodexStop("codex_unsupported_auth");
|
|
332
|
+
const thread = await transport.rpc("thread/start", { cwd, ephemeral: true, experimentalRawEvents: true,
|
|
333
|
+
approvalPolicy: "never", sandbox: "read-only", model: request.model, modelProvider: "openai", allowProviderModelFallback: false,
|
|
334
|
+
environments: [], runtimeWorkspaceRoots: [], dynamicTools: [], baseInstructions: request.instructions, config: config.overrides });
|
|
335
|
+
if (!admitsRestrictedCodexThread(thread, request.model, cwd))
|
|
336
|
+
throw new RestrictedCodexStop("codex_unsafe_configuration");
|
|
337
|
+
threadId = String(codexRecord(thread.thread).id);
|
|
338
|
+
const mcp = await transport.rpc("mcpServerStatus/list", { limit: 100 });
|
|
339
|
+
if (!Array.isArray(mcp.data) || mcp.data.length !== 0 || mcp.nextCursor !== null)
|
|
340
|
+
throw new RestrictedCodexStop("codex_unsafe_configuration");
|
|
341
|
+
if (readinessOnly) {
|
|
342
|
+
result = { status: "completed", output: null, usage: null, usageComplete: false, dispatched: false, errorCode: null };
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
const input = [{ type: "text", text: request.evidence, text_elements: [] }];
|
|
346
|
+
for (const [index, image] of request.images.entries()) {
|
|
347
|
+
deadline.check();
|
|
348
|
+
const match = CODEX_IMAGE.exec(image.dataUrl);
|
|
349
|
+
const imagePath = path.join(scratch, `evidence-${index}.${match[1] === "jpeg" ? "jpg" : match[1]}`);
|
|
350
|
+
await writeFile(imagePath, Buffer.from(match[2], "base64"), { mode: 0o600, flag: "wx" });
|
|
351
|
+
input.push({ type: "text", text: JSON.stringify({ captureEvidenceId: image.evidenceId }), text_elements: [] }, { type: "localImage", path: imagePath });
|
|
352
|
+
}
|
|
353
|
+
deadline.check();
|
|
354
|
+
// Even a lost acknowledgment may have dispatched the request. Never claim zero cost.
|
|
355
|
+
dispatched = true;
|
|
356
|
+
const turn = await transport.rpc("turn/start", { threadId, cwd, approvalPolicy: "never", sandboxPolicy: { type: "readOnly" },
|
|
357
|
+
environments: [], runtimeWorkspaceRoots: [], effort: "low", model: request.model, outputSchema: request.schema, input });
|
|
358
|
+
const returnedTurnId = codexRecord(turn.turn).id;
|
|
359
|
+
if (typeof returnedTurnId !== "string" || returnedTurnId.length === 0 || returnedTurnId.length > 200
|
|
360
|
+
|| (earlyTurnId !== undefined && earlyTurnId !== returnedTurnId))
|
|
361
|
+
throw new RestrictedCodexStop("codex_protocol_error");
|
|
362
|
+
turnId = returnedTurnId;
|
|
363
|
+
for (const event of early)
|
|
364
|
+
handleTurnEvent(event.method, event.params);
|
|
365
|
+
early.length = 0;
|
|
366
|
+
result = await deadline.wait(finished);
|
|
367
|
+
deadline.check();
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
catch (error) {
|
|
371
|
+
result = restrictedCodexFailure(deadline.code ?? (error instanceof RestrictedCodexStop ? error.code : "codex_process_failed"), dispatched, usage);
|
|
372
|
+
}
|
|
373
|
+
finally {
|
|
374
|
+
// Deadline remains authoritative until acceptance; teardown has its own small grace.
|
|
375
|
+
deadline.close();
|
|
376
|
+
let cleaned = !unclosedChild;
|
|
377
|
+
if (transport) {
|
|
378
|
+
const cleanupTurn = turnId ?? earlyTurnId;
|
|
379
|
+
cleaned = await transport.close(dispatched && !completed && threadId && cleanupTurn
|
|
380
|
+
? { threadId, turnId: cleanupTurn } : undefined).catch(() => false);
|
|
381
|
+
if (!cleaned)
|
|
382
|
+
retainUnclosedChild(transport.owned.closed);
|
|
383
|
+
}
|
|
384
|
+
let authReplaced = false;
|
|
385
|
+
if (authLink && cleaned) {
|
|
386
|
+
try {
|
|
387
|
+
const info = await lstat(authLink);
|
|
388
|
+
authReplaced = !info.isSymbolicLink();
|
|
389
|
+
if (!authReplaced)
|
|
390
|
+
await unlink(authLink);
|
|
391
|
+
}
|
|
392
|
+
catch (error) {
|
|
393
|
+
if (codexRecord(error).code !== "ENOENT")
|
|
394
|
+
cleaned = false;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
// An unexpected replacement may contain rotated login state. Do not discard it
|
|
398
|
+
// or overwrite the host login. Leave this private control-plane directory for
|
|
399
|
+
// recovery and fail closed; no path or credential is included in the result.
|
|
400
|
+
if (authReplaced) {
|
|
401
|
+
cleaned = false;
|
|
402
|
+
if (work)
|
|
403
|
+
await preserveUnexpectedAuth(work, sourceEnv).catch(() => undefined);
|
|
404
|
+
}
|
|
405
|
+
if (work && cleaned && !authReplaced)
|
|
406
|
+
await rm(work, { recursive: true, force: true }).catch(() => { cleaned = false; });
|
|
407
|
+
if (work && unclosedChild)
|
|
408
|
+
await writeRecoveryMarker(work, sourceEnv, "process_cleanup_unconfirmed").catch(() => undefined);
|
|
409
|
+
if (!cleaned)
|
|
410
|
+
result = restrictedCodexFailure("codex_cleanup_failed", dispatched, usage);
|
|
411
|
+
}
|
|
412
|
+
return result;
|
|
413
|
+
}
|
|
414
|
+
export async function checkRestrictedCodexSessionReadiness(input = {}, options = {}) {
|
|
415
|
+
return runRestrictedCodexSession({ model: RESTRICTED_CODEX_ANALYSIS_MODELS[0], instructions: "Analyze only supplied study evidence.",
|
|
416
|
+
evidence: "", images: [], schema: { type: "object", additionalProperties: false, properties: {} }, maxOutputTokens: null,
|
|
417
|
+
timeoutMs: input.timeoutMs ?? 15_000, ...(input.signal === undefined ? {} : { signal: input.signal }) }, options, true);
|
|
418
|
+
}
|
|
419
|
+
//# sourceMappingURL=restricted-codex-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restricted-codex-session.js","sourceRoot":"","sources":["../src/restricted-codex-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { ChildProcessWithoutNullStreams, SpawnOptionsWithoutStdio } from "node:child_process";
|
|
2
|
+
import { type RestrictedCodexAnalysisErrorCode } from "./restricted-codex-policy.js";
|
|
3
|
+
export type RestrictedCodexSpawn = (file: string, args: string[], options: SpawnOptionsWithoutStdio & {
|
|
4
|
+
stdio: ["pipe", "pipe", "pipe"];
|
|
5
|
+
detached: false;
|
|
6
|
+
}) => ChildProcessWithoutNullStreams;
|
|
7
|
+
/** No raw provider prose, stderr, path, or cause is attached to this error. */
|
|
8
|
+
export declare class RestrictedCodexStop extends Error {
|
|
9
|
+
readonly code: RestrictedCodexAnalysisErrorCode;
|
|
10
|
+
constructor(code: RestrictedCodexAnalysisErrorCode);
|
|
11
|
+
}
|
|
12
|
+
export declare class RestrictedCodexDeadline {
|
|
13
|
+
private readonly signal?;
|
|
14
|
+
readonly expiresAt: number;
|
|
15
|
+
code: RestrictedCodexAnalysisErrorCode | null;
|
|
16
|
+
private readonly stopped;
|
|
17
|
+
private rejectStopped;
|
|
18
|
+
private readonly timer;
|
|
19
|
+
private readonly onAbort;
|
|
20
|
+
constructor(timeoutMs: number, signal?: AbortSignal | undefined);
|
|
21
|
+
stop(code: RestrictedCodexAnalysisErrorCode): void;
|
|
22
|
+
check(): void;
|
|
23
|
+
wait<T>(promise: Promise<T>): Promise<T>;
|
|
24
|
+
close(): void;
|
|
25
|
+
}
|
|
26
|
+
export interface OwnedCodexProcess {
|
|
27
|
+
child: ChildProcessWithoutNullStreams;
|
|
28
|
+
closed: Promise<void>;
|
|
29
|
+
isClosed(): boolean;
|
|
30
|
+
hasExited(): boolean;
|
|
31
|
+
}
|
|
32
|
+
export declare function ownCodexProcess(child: ChildProcessWithoutNullStreams): OwnedCodexProcess;
|
|
33
|
+
export declare function closeOwnedCodexProcess(owned: OwnedCodexProcess): Promise<boolean>;
|
|
34
|
+
export declare class RestrictedCodexTransport {
|
|
35
|
+
readonly owned: OwnedCodexProcess;
|
|
36
|
+
private readonly deadline;
|
|
37
|
+
private readonly frameLimit;
|
|
38
|
+
private readonly pending;
|
|
39
|
+
private nextId;
|
|
40
|
+
private line;
|
|
41
|
+
private readonly decoder;
|
|
42
|
+
private stdoutBytes;
|
|
43
|
+
private stderrBytes;
|
|
44
|
+
private eventCount;
|
|
45
|
+
private closing;
|
|
46
|
+
onNotification: (method: string, params: Record<string, unknown>) => void;
|
|
47
|
+
constructor(owned: OwnedCodexProcess, deadline: RestrictedCodexDeadline, frameLimit?: number);
|
|
48
|
+
private fail;
|
|
49
|
+
private message;
|
|
50
|
+
private write;
|
|
51
|
+
notify(method: string, params: Record<string, unknown>): void;
|
|
52
|
+
private request;
|
|
53
|
+
rpc(method: string, params: Record<string, unknown>): Promise<Record<string, unknown>>;
|
|
54
|
+
close(interrupt?: {
|
|
55
|
+
threadId: string;
|
|
56
|
+
turnId: string;
|
|
57
|
+
}): Promise<boolean>;
|
|
58
|
+
}
|