replicas-engine 0.1.635 → 0.1.637
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/src/{chunk-464TFYYL.js → chunk-ESC6QHTZ.js} +87 -215
- package/dist/src/headless-agent.js +27 -8
- package/dist/src/index.js +367 -201
- package/package.json +2 -2
|
@@ -89,8 +89,8 @@ var REPLICAS_RUNTIME_ENV_ALIASES = {
|
|
|
89
89
|
slackChannelId: ["REPLICAS_SLACK_CHANNEL_ID", "SLACK_CHANNEL_ID"],
|
|
90
90
|
slackThreadTs: ["REPLICAS_SLACK_THREAD_TS", "SLACK_THREAD_TS"]
|
|
91
91
|
};
|
|
92
|
-
function readReplicasRuntimeEnv(
|
|
93
|
-
return
|
|
92
|
+
function readReplicasRuntimeEnv(readEnv, [namespacedKey, legacyKey]) {
|
|
93
|
+
return readEnv(namespacedKey) ?? readEnv(legacyKey);
|
|
94
94
|
}
|
|
95
95
|
function shellQuotePosix(value) {
|
|
96
96
|
return `'${value.split("'").join("'\\''")}'`;
|
|
@@ -1271,6 +1271,7 @@ var EGRESS_UDP_RATE = 500;
|
|
|
1271
1271
|
var EGRESS_UDP_BURST = 1e3;
|
|
1272
1272
|
var EGRESS_OUT_CONN_RATE = 1e3;
|
|
1273
1273
|
var EGRESS_OUT_CONN_BURST = 2e3;
|
|
1274
|
+
var EGRESS_DNS_SERVERS = ["1.1.1.1", "8.8.8.8"];
|
|
1274
1275
|
var EGRESS_SHELL_CONFIG = [
|
|
1275
1276
|
`EGRESS_PORT_RANGE_START=${EGRESS_PORT_RANGE_START}`,
|
|
1276
1277
|
`EGRESS_PORT_RANGE_END=${EGRESS_PORT_RANGE_END}`,
|
|
@@ -1279,6 +1280,7 @@ var EGRESS_SHELL_CONFIG = [
|
|
|
1279
1280
|
`EGRESS_CIPHER=${EGRESS_CIPHER}`,
|
|
1280
1281
|
`EGRESS_KEY_BYTES=${EGRESS_KEY_BYTES}`,
|
|
1281
1282
|
`EGRESS_MODE=${EGRESS_SHADOWSOCKS_MODE}`,
|
|
1283
|
+
`EGRESS_DNS_SERVERS="${EGRESS_DNS_SERVERS.join(" ")}"`,
|
|
1282
1284
|
`EGRESS_EXIT_IP_ENDPOINTS="${EGRESS_EXIT_IP_ENDPOINTS.join(" ")}"`,
|
|
1283
1285
|
`EGRESS_DIRECT_ROUTES="${EGRESS_DIRECT_ROUTES.join(" ")}"`,
|
|
1284
1286
|
`EGRESS_NEW_CONN_RATE=${EGRESS_NEW_CONN_RATE}`,
|
|
@@ -1290,7 +1292,6 @@ var EGRESS_SHELL_CONFIG = [
|
|
|
1290
1292
|
].join("\n");
|
|
1291
1293
|
var EGRESS_TUNNEL_SERVICE = "replicas-egress.service";
|
|
1292
1294
|
var EGRESS_TUNNEL_INTERFACE = "rpxtun0";
|
|
1293
|
-
var EGRESS_DNS_SERVERS = ["1.1.1.1", "8.8.8.8"];
|
|
1294
1295
|
var EGRESS_PATHS = {
|
|
1295
1296
|
/**
|
|
1296
1297
|
* Under /run, which is tmpfs. The key therefore never touches disk and cannot
|
|
@@ -5642,150 +5643,19 @@ async function putPresignedFile(urlValue, filePath, size, contentType) {
|
|
|
5642
5643
|
});
|
|
5643
5644
|
}
|
|
5644
5645
|
|
|
5645
|
-
// src/
|
|
5646
|
-
|
|
5647
|
-
|
|
5648
|
-
|
|
5649
|
-
|
|
5650
|
-
|
|
5651
|
-
|
|
5652
|
-
import { homedir } from "os";
|
|
5653
|
-
import { join } from "path";
|
|
5654
|
-
function loadRuntimeEnvFile() {
|
|
5655
|
-
let content;
|
|
5656
|
-
try {
|
|
5657
|
-
content = readFileSync(join(homedir(), ".replicas", "runtime-env.sh"), "utf-8");
|
|
5658
|
-
} catch {
|
|
5659
|
-
return;
|
|
5660
|
-
}
|
|
5661
|
-
for (const [key, value] of Object.entries(parsePosixEnvFile(content))) {
|
|
5662
|
-
process.env[key] = value;
|
|
5663
|
-
}
|
|
5664
|
-
}
|
|
5665
|
-
|
|
5666
|
-
// src/utils/type-guards.ts
|
|
5667
|
-
function isRecord4(value) {
|
|
5668
|
-
return typeof value === "object" && value !== null;
|
|
5669
|
-
}
|
|
5670
|
-
|
|
5671
|
-
// src/engine-env.ts
|
|
5672
|
-
var SANDBOX_IMAGE_VERSION_FILE = "/usr/local/lib/replicas-sandbox-image-version";
|
|
5673
|
-
function readEnv(name) {
|
|
5674
|
-
const value = process.env[name]?.trim();
|
|
5675
|
-
return value ? value : void 0;
|
|
5676
|
-
}
|
|
5677
|
-
function readSandboxImageVersion() {
|
|
5678
|
-
const environmentVersion = readEnv("REPLICAS_SANDBOX_IMAGE_VERSION");
|
|
5679
|
-
if (environmentVersion) return environmentVersion;
|
|
5680
|
-
try {
|
|
5681
|
-
return readFileSync2(SANDBOX_IMAGE_VERSION_FILE, "utf8").trim() || "development";
|
|
5682
|
-
} catch {
|
|
5683
|
-
return "development";
|
|
5684
|
-
}
|
|
5685
|
-
}
|
|
5686
|
-
function parsePort(value) {
|
|
5687
|
-
if (!value) {
|
|
5688
|
-
return 3737;
|
|
5689
|
-
}
|
|
5690
|
-
const parsed = Number(value);
|
|
5691
|
-
if (!Number.isInteger(parsed) || parsed <= 0) {
|
|
5692
|
-
throw new Error("Invalid engine environment: REPLICAS_ENGINE_PORT must be a positive integer");
|
|
5693
|
-
}
|
|
5694
|
-
return parsed;
|
|
5695
|
-
}
|
|
5696
|
-
function requireDefined(value, name) {
|
|
5697
|
-
if (value === void 0 || value === null) {
|
|
5698
|
-
throw new Error(`Invalid engine environment: ${name} is required`);
|
|
5699
|
-
}
|
|
5700
|
-
return value;
|
|
5701
|
-
}
|
|
5702
|
-
function requireValidURL(value, name) {
|
|
5703
|
-
try {
|
|
5704
|
-
new URL(value);
|
|
5705
|
-
return value;
|
|
5706
|
-
} catch {
|
|
5707
|
-
throw new Error(`Invalid engine environment: ${name} must be a valid URL`);
|
|
5708
|
-
}
|
|
5709
|
-
}
|
|
5710
|
-
function parseClaudeAuthMethod(value) {
|
|
5711
|
-
if (value === "oauth" || value === "api_key" || value === "bedrock" || value === "foundry") {
|
|
5712
|
-
return value;
|
|
5713
|
-
}
|
|
5714
|
-
return void 0;
|
|
5715
|
-
}
|
|
5716
|
-
function parseCodexAuthMethod(value) {
|
|
5717
|
-
if (value === "oauth" || value === "api_key" || value === "foundry") {
|
|
5718
|
-
return value;
|
|
5719
|
-
}
|
|
5720
|
-
return void 0;
|
|
5721
|
-
}
|
|
5722
|
-
function parseAgentCredentialSnapshots(value) {
|
|
5723
|
-
if (!value) return {};
|
|
5724
|
-
try {
|
|
5725
|
-
const parsed = JSON.parse(value);
|
|
5726
|
-
if (!isRecord4(parsed)) return {};
|
|
5727
|
-
const snapshots = {};
|
|
5728
|
-
for (const [provider, snapshot] of Object.entries(parsed)) {
|
|
5729
|
-
if (!isValidAgentProvider(provider)) continue;
|
|
5730
|
-
const parsedSnapshot = agentCredentialSnapshotSchema.safeParse(snapshot);
|
|
5731
|
-
if (parsedSnapshot.success) snapshots[provider] = parsedSnapshot.data;
|
|
5732
|
-
}
|
|
5733
|
-
return snapshots;
|
|
5734
|
-
} catch {
|
|
5735
|
-
return {};
|
|
5736
|
-
}
|
|
5737
|
-
}
|
|
5738
|
-
var IS_WARMING_MODE = process.argv.includes("--warming");
|
|
5739
|
-
function loadEngineEnv() {
|
|
5740
|
-
loadRuntimeEnvFile();
|
|
5741
|
-
const HOME_DIR = homedir2();
|
|
5742
|
-
const env = {
|
|
5743
|
-
// Defined: always available
|
|
5744
|
-
REPLICAS_ENGINE_SECRET: requireDefined(readEnv("REPLICAS_ENGINE_SECRET"), "REPLICAS_ENGINE_SECRET"),
|
|
5745
|
-
REPLICAS_ENGINE_PORT: parsePort(readEnv("REPLICAS_ENGINE_PORT")),
|
|
5746
|
-
REPLICAS_MONOLITH_URL: requireValidURL(
|
|
5747
|
-
requireDefined(readReplicasRuntimeEnv(readEnv, REPLICAS_RUNTIME_ENV_ALIASES.monolithUrl), "REPLICAS_MONOLITH_URL"),
|
|
5748
|
-
"REPLICAS_MONOLITH_URL"
|
|
5749
|
-
),
|
|
5750
|
-
HOME_DIR,
|
|
5751
|
-
WORKSPACE_ROOT: join2(HOME_DIR, "workspaces"),
|
|
5752
|
-
REPLICAS_SANDBOX_IMAGE_VERSION: readSandboxImageVersion(),
|
|
5753
|
-
// Runtime: may not be set during warming
|
|
5754
|
-
REPLICAS_WORKSPACE_ID: readReplicasRuntimeEnv(readEnv, REPLICAS_RUNTIME_ENV_ALIASES.workspaceId),
|
|
5755
|
-
REPLICAS_LINEAR_SESSION_ID: readReplicasRuntimeEnv(readEnv, REPLICAS_RUNTIME_ENV_ALIASES.linearSessionId),
|
|
5756
|
-
REPLICAS_LINEAR_ACCESS_TOKEN: readReplicasRuntimeEnv(readEnv, REPLICAS_RUNTIME_ENV_ALIASES.linearAccessToken),
|
|
5757
|
-
REPLICAS_SLACK_BOT_TOKEN: readReplicasRuntimeEnv(readEnv, REPLICAS_RUNTIME_ENV_ALIASES.slackBotToken),
|
|
5758
|
-
REPLICAS_SLACK_CHANNEL_ID: readReplicasRuntimeEnv(readEnv, REPLICAS_RUNTIME_ENV_ALIASES.slackChannelId),
|
|
5759
|
-
REPLICAS_SLACK_THREAD_TS: readReplicasRuntimeEnv(readEnv, REPLICAS_RUNTIME_ENV_ALIASES.slackThreadTs),
|
|
5760
|
-
ANTHROPIC_API_KEY: readEnv("ANTHROPIC_API_KEY"),
|
|
5761
|
-
OPENAI_API_KEY: readEnv("OPENAI_API_KEY"),
|
|
5762
|
-
CURSOR_API_KEY: readEnv("CURSOR_API_KEY"),
|
|
5763
|
-
CLAUDE_CODE_USE_BEDROCK: readEnv("CLAUDE_CODE_USE_BEDROCK"),
|
|
5764
|
-
AWS_ACCESS_KEY_ID: readEnv("AWS_ACCESS_KEY_ID"),
|
|
5765
|
-
AWS_SECRET_ACCESS_KEY: readEnv("AWS_SECRET_ACCESS_KEY"),
|
|
5766
|
-
AWS_REGION: readEnv("AWS_REGION"),
|
|
5767
|
-
ANTHROPIC_SMALL_FAST_MODEL_AWS_REGION: readEnv("ANTHROPIC_SMALL_FAST_MODEL_AWS_REGION"),
|
|
5768
|
-
REPLICAS_CLAUDE_AUTH_METHOD: parseClaudeAuthMethod(readEnv("REPLICAS_CLAUDE_AUTH_METHOD")),
|
|
5769
|
-
REPLICAS_CODEX_AUTH_METHOD: parseCodexAuthMethod(readEnv("REPLICAS_CODEX_AUTH_METHOD")),
|
|
5770
|
-
REPLICAS_AGENT_CREDENTIALS: parseAgentCredentialSnapshots(readEnv("REPLICAS_AGENT_CREDENTIALS")),
|
|
5771
|
-
REPLICAS_ENV_SYSTEM_PROMPT: readEnv("REPLICAS_ENV_SYSTEM_PROMPT"),
|
|
5772
|
-
REPLICAS_ENV_START_HOOK: readEnv("REPLICAS_ENV_START_HOOK"),
|
|
5773
|
-
REPLICAS_DISABLE_AUTO_START_HOOKS: readEnv("REPLICAS_DISABLE_AUTO_START_HOOKS")?.toLowerCase() === "true",
|
|
5774
|
-
REPLICAS_ENGINE_DEFER_INITIALIZATION: readEnv("REPLICAS_ENGINE_DEFER_INITIALIZATION")?.toLowerCase() === "true"
|
|
5775
|
-
};
|
|
5776
|
-
if (!IS_WARMING_MODE && !env.REPLICAS_WORKSPACE_ID) {
|
|
5777
|
-
console.error("REPLICAS_WORKSPACE_ID is not set \u2014 this is required in normal (non-warming) mode");
|
|
5646
|
+
// src/utils/codex-agent-env.ts
|
|
5647
|
+
function buildCodexAgentEnv(source = process.env) {
|
|
5648
|
+
const env = Object.fromEntries(
|
|
5649
|
+
Object.entries(source).filter((entry) => typeof entry[1] === "string")
|
|
5650
|
+
);
|
|
5651
|
+
if (env.REPLICAS_CODEX_AUTH_METHOD === "oauth" || env.REPLICAS_CODEX_AUTH_METHOD === "foundry") {
|
|
5652
|
+
delete env.OPENAI_API_KEY;
|
|
5778
5653
|
}
|
|
5654
|
+
delete env.GH_TOKEN;
|
|
5655
|
+
delete env.GITHUB_TOKEN;
|
|
5656
|
+
delete env.GH_CONFIG_DIR;
|
|
5779
5657
|
return env;
|
|
5780
5658
|
}
|
|
5781
|
-
var ENGINE_ENV = loadEngineEnv();
|
|
5782
|
-
function setAgentCredentialSnapshot(provider, snapshot) {
|
|
5783
|
-
ENGINE_ENV.REPLICAS_AGENT_CREDENTIALS = {
|
|
5784
|
-
...ENGINE_ENV.REPLICAS_AGENT_CREDENTIALS,
|
|
5785
|
-
[provider]: snapshot
|
|
5786
|
-
};
|
|
5787
|
-
process.env.REPLICAS_AGENT_CREDENTIALS = JSON.stringify(ENGINE_ENV.REPLICAS_AGENT_CREDENTIALS);
|
|
5788
|
-
}
|
|
5789
5659
|
|
|
5790
5660
|
// src/utils/exec.ts
|
|
5791
5661
|
import { exec, execFile } from "child_process";
|
|
@@ -5987,61 +5857,6 @@ var AspClient = class {
|
|
|
5987
5857
|
}
|
|
5988
5858
|
};
|
|
5989
5859
|
|
|
5990
|
-
// src/utils/codex-agent-env.ts
|
|
5991
|
-
function buildCodexAgentEnv(source = process.env) {
|
|
5992
|
-
const env = Object.fromEntries(
|
|
5993
|
-
Object.entries(source).filter((entry) => typeof entry[1] === "string")
|
|
5994
|
-
);
|
|
5995
|
-
if (env.REPLICAS_CODEX_AUTH_METHOD === "oauth" || env.REPLICAS_CODEX_AUTH_METHOD === "foundry") {
|
|
5996
|
-
delete env.OPENAI_API_KEY;
|
|
5997
|
-
}
|
|
5998
|
-
delete env.GH_TOKEN;
|
|
5999
|
-
delete env.GITHUB_TOKEN;
|
|
6000
|
-
delete env.GH_CONFIG_DIR;
|
|
6001
|
-
return env;
|
|
6002
|
-
}
|
|
6003
|
-
|
|
6004
|
-
// src/utils/agent-env.ts
|
|
6005
|
-
function resolveClaudeAuthMethodForMessage(env = ENGINE_ENV) {
|
|
6006
|
-
const method = env.REPLICAS_CLAUDE_AUTH_METHOD;
|
|
6007
|
-
if (method && method !== "none") {
|
|
6008
|
-
return method;
|
|
6009
|
-
}
|
|
6010
|
-
if (env.CLAUDE_CODE_USE_BEDROCK === "1") return "bedrock";
|
|
6011
|
-
if (env.ANTHROPIC_API_KEY) return "api_key";
|
|
6012
|
-
return "unknown";
|
|
6013
|
-
}
|
|
6014
|
-
function buildClaudeAgentEnv(overrides) {
|
|
6015
|
-
const env = { ...process.env };
|
|
6016
|
-
if (overrides) {
|
|
6017
|
-
Object.assign(env, overrides);
|
|
6018
|
-
}
|
|
6019
|
-
const isBedrock = isClaudeBedrockEnv(env);
|
|
6020
|
-
if (shouldStripAnthropicApiKey(isBedrock)) {
|
|
6021
|
-
env.ANTHROPIC_API_KEY = void 0;
|
|
6022
|
-
}
|
|
6023
|
-
if (isBedrock) {
|
|
6024
|
-
env.CLAUDE_CODE_USE_BEDROCK = "1";
|
|
6025
|
-
env.CLAUDE_CODE_USE_MANTLE = "1";
|
|
6026
|
-
env.ANTHROPIC_DEFAULT_OPUS_MODEL = CLAUDE_OPUS_4_8_BEDROCK_MODEL;
|
|
6027
|
-
env.ANTHROPIC_DEFAULT_SONNET_MODEL = CLAUDE_SONNET_5_BEDROCK_MODEL;
|
|
6028
|
-
env.ANTHROPIC_DEFAULT_HAIKU_MODEL = CLAUDE_HAIKU_4_5_BEDROCK_MODEL;
|
|
6029
|
-
}
|
|
6030
|
-
env.GH_TOKEN = void 0;
|
|
6031
|
-
env.GITHUB_TOKEN = void 0;
|
|
6032
|
-
env.GH_CONFIG_DIR = void 0;
|
|
6033
|
-
env.CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD = "1";
|
|
6034
|
-
env.CLAUDE_CODE_DISABLE_AUTO_MEMORY = "1";
|
|
6035
|
-
return env;
|
|
6036
|
-
}
|
|
6037
|
-
function shouldStripAnthropicApiKey(isBedrock) {
|
|
6038
|
-
const method = ENGINE_ENV.REPLICAS_CLAUDE_AUTH_METHOD;
|
|
6039
|
-
return method === "oauth" || method === "bedrock" || method === "foundry" || isBedrock;
|
|
6040
|
-
}
|
|
6041
|
-
function isClaudeBedrockEnv(env) {
|
|
6042
|
-
return ENGINE_ENV.REPLICAS_CLAUDE_AUTH_METHOD === "bedrock" || env.REPLICAS_CLAUDE_AUTH_METHOD === "bedrock" || env.CLAUDE_CODE_USE_BEDROCK === "1";
|
|
6043
|
-
}
|
|
6044
|
-
|
|
6045
5860
|
// src/managers/codex-asp/app-server-process.ts
|
|
6046
5861
|
var DEFAULT_CODEX_BINARY = "codex";
|
|
6047
5862
|
var DEFAULT_CODEX_ARGS = [
|
|
@@ -6058,7 +5873,7 @@ var DEFAULT_CODEX_ARGS = [
|
|
|
6058
5873
|
var MIN_CODEX_CLI_VERSION = "0.144.6";
|
|
6059
5874
|
var CODEX_UPGRADE_TIMEOUT_MS = 12e4;
|
|
6060
5875
|
var codexCliVersionEnsured = null;
|
|
6061
|
-
var ENGINE_PACKAGE_VERSION = "0.1.
|
|
5876
|
+
var ENGINE_PACKAGE_VERSION = "0.1.637";
|
|
6062
5877
|
var INITIALIZE_METHOD = "initialize";
|
|
6063
5878
|
var INITIALIZED_NOTIFICATION = "initialized";
|
|
6064
5879
|
var ACCOUNT_LOGIN_START_METHOD = "account/login/start";
|
|
@@ -6071,26 +5886,26 @@ var AppServerProcess = class {
|
|
|
6071
5886
|
child = null;
|
|
6072
5887
|
client = null;
|
|
6073
5888
|
shuttingDown = false;
|
|
6074
|
-
constructor(options
|
|
5889
|
+
constructor(options) {
|
|
6075
5890
|
this.binary = options.binary ?? DEFAULT_CODEX_BINARY;
|
|
6076
|
-
const baseArgs = options.args ?? (
|
|
5891
|
+
const baseArgs = options.args ?? (options.env.REPLICAS_CODEX_AUTH_METHOD === "foundry" ? [
|
|
6077
5892
|
...DEFAULT_CODEX_ARGS,
|
|
6078
5893
|
"-c",
|
|
6079
|
-
`model=${JSON.stringify(
|
|
5894
|
+
`model=${JSON.stringify(options.env.CODEX_FOUNDRY_MODEL)}`,
|
|
6080
5895
|
"-c",
|
|
6081
5896
|
'model_provider="azure"',
|
|
6082
5897
|
"-c",
|
|
6083
5898
|
'model_providers.azure.name="Azure OpenAI"',
|
|
6084
5899
|
"-c",
|
|
6085
|
-
`model_providers.azure.base_url=${JSON.stringify(
|
|
5900
|
+
`model_providers.azure.base_url=${JSON.stringify(options.env.CODEX_FOUNDRY_BASE_URL)}`,
|
|
6086
5901
|
"-c",
|
|
6087
5902
|
'model_providers.azure.env_key="AZURE_OPENAI_API_KEY"',
|
|
6088
5903
|
"-c",
|
|
6089
5904
|
'model_providers.azure.wire_api="responses"'
|
|
6090
5905
|
] : DEFAULT_CODEX_ARGS);
|
|
6091
5906
|
this.args = [...baseArgs, ...(options.configOverrides ?? []).flatMap((override) => ["-c", override])];
|
|
6092
|
-
this.env = options.env
|
|
6093
|
-
this.cwd = options.cwd
|
|
5907
|
+
this.env = options.env;
|
|
5908
|
+
this.cwd = options.cwd;
|
|
6094
5909
|
}
|
|
6095
5910
|
on(event, listener) {
|
|
6096
5911
|
this.emitter.on(event, listener);
|
|
@@ -6212,12 +6027,12 @@ var AppServerProcess = class {
|
|
|
6212
6027
|
console.warn(`[AppServerProcess] upgraded codex CLI to ${MIN_CODEX_CLI_VERSION}`);
|
|
6213
6028
|
}
|
|
6214
6029
|
async loginWithConfiguredApiKey(client) {
|
|
6215
|
-
if (
|
|
6030
|
+
if (this.env.REPLICAS_CODEX_AUTH_METHOD !== "api_key" || !this.env.OPENAI_API_KEY) {
|
|
6216
6031
|
return;
|
|
6217
6032
|
}
|
|
6218
6033
|
const params = {
|
|
6219
6034
|
type: "apiKey",
|
|
6220
|
-
apiKey:
|
|
6035
|
+
apiKey: this.env.OPENAI_API_KEY
|
|
6221
6036
|
};
|
|
6222
6037
|
await client.request(ACCOUNT_LOGIN_START_METHOD, params);
|
|
6223
6038
|
}
|
|
@@ -6236,6 +6051,43 @@ var AppServerProcess = class {
|
|
|
6236
6051
|
}
|
|
6237
6052
|
};
|
|
6238
6053
|
|
|
6054
|
+
// src/managers/codex-asp/notification-dispatch.ts
|
|
6055
|
+
var TURN_STARTED_METHOD = "turn/started";
|
|
6056
|
+
var TURN_COMPLETED_METHOD = "turn/completed";
|
|
6057
|
+
var TURN_PLAN_UPDATED_METHOD = "turn/plan/updated";
|
|
6058
|
+
var THREAD_GOAL_UPDATED_METHOD = "thread/goal/updated";
|
|
6059
|
+
var THREAD_GOAL_CLEARED_METHOD = "thread/goal/cleared";
|
|
6060
|
+
var ITEM_STARTED_METHOD = "item/started";
|
|
6061
|
+
var ITEM_COMPLETED_METHOD = "item/completed";
|
|
6062
|
+
var AGENT_MESSAGE_DELTA_METHOD = "item/agentMessage/delta";
|
|
6063
|
+
var REASONING_SUMMARY_TEXT_DELTA_METHOD = "item/reasoning/summaryTextDelta";
|
|
6064
|
+
var REASONING_TEXT_DELTA_METHOD = "item/reasoning/textDelta";
|
|
6065
|
+
var REASONING_SUMMARY_PART_ADDED_METHOD = "item/reasoning/summaryPartAdded";
|
|
6066
|
+
var COMMAND_EXECUTION_OUTPUT_DELTA_METHOD = "item/commandExecution/outputDelta";
|
|
6067
|
+
var FILE_CHANGE_OUTPUT_DELTA_METHOD = "item/fileChange/outputDelta";
|
|
6068
|
+
var ACCOUNT_RATE_LIMITS_UPDATED_METHOD = "account/rateLimits/updated";
|
|
6069
|
+
var THREAD_TOKEN_USAGE_UPDATED_METHOD = "thread/tokenUsage/updated";
|
|
6070
|
+
var THREAD_COMPACTED_METHOD = "thread/compacted";
|
|
6071
|
+
function dispatchAspNotification(notification, handlers) {
|
|
6072
|
+
const handler = handlers[notification.method];
|
|
6073
|
+
if (!handler) return;
|
|
6074
|
+
handler(notification);
|
|
6075
|
+
}
|
|
6076
|
+
function recoverCompletedTurn(turn, completedItems, agentMessageDeltas) {
|
|
6077
|
+
const items = turn.items.length > 0 ? [...turn.items] : [];
|
|
6078
|
+
const itemIds = new Set(items.map((item) => item.id));
|
|
6079
|
+
for (const item of completedItems) {
|
|
6080
|
+
if (itemIds.has(item.id)) continue;
|
|
6081
|
+
items.push(item);
|
|
6082
|
+
itemIds.add(item.id);
|
|
6083
|
+
}
|
|
6084
|
+
for (const [itemId, text] of agentMessageDeltas) {
|
|
6085
|
+
if (itemIds.has(itemId)) continue;
|
|
6086
|
+
items.push({ type: "agentMessage", id: itemId, text, phase: null, memoryCitation: null });
|
|
6087
|
+
}
|
|
6088
|
+
return items.length > 0 ? { ...turn, items, itemsView: "full" } : turn;
|
|
6089
|
+
}
|
|
6090
|
+
|
|
6239
6091
|
export {
|
|
6240
6092
|
isRecord,
|
|
6241
6093
|
TIMEOUT,
|
|
@@ -6248,6 +6100,7 @@ export {
|
|
|
6248
6100
|
VALID_THINKING_LEVELS,
|
|
6249
6101
|
codexReasoningEffortForThinkingLevel,
|
|
6250
6102
|
detectAgentQuotaLimit,
|
|
6103
|
+
agentCredentialSnapshotSchema,
|
|
6251
6104
|
isAgentChatTurnActivityRecord,
|
|
6252
6105
|
isAgentChatSkillActivityRecord,
|
|
6253
6106
|
isAgentChatMcpActivityRecord,
|
|
@@ -6276,6 +6129,9 @@ export {
|
|
|
6276
6129
|
CLAUDE_HAIKU_4_5_MODEL,
|
|
6277
6130
|
CLAUDE_FABLE_5_BEDROCK_MODEL,
|
|
6278
6131
|
CLAUDE_OPUS_5_BEDROCK_MODEL,
|
|
6132
|
+
CLAUDE_OPUS_4_8_BEDROCK_MODEL,
|
|
6133
|
+
CLAUDE_SONNET_5_BEDROCK_MODEL,
|
|
6134
|
+
CLAUDE_HAIKU_4_5_BEDROCK_MODEL,
|
|
6279
6135
|
DEFAULT_CLAUDE_MODEL,
|
|
6280
6136
|
DEFAULT_CODEX_MODEL,
|
|
6281
6137
|
DEFAULT_CURSOR_MODEL,
|
|
@@ -6300,7 +6156,10 @@ export {
|
|
|
6300
6156
|
clampTokensToWindow,
|
|
6301
6157
|
buildCodexTokenUsageContextUsagePayload,
|
|
6302
6158
|
SANDBOX_PATHS,
|
|
6159
|
+
REPLICAS_RUNTIME_ENV_ALIASES,
|
|
6160
|
+
readReplicasRuntimeEnv,
|
|
6303
6161
|
shellQuotePosix,
|
|
6162
|
+
parsePosixEnvFile,
|
|
6304
6163
|
GIT_CREDENTIAL_HELPER_FILENAME,
|
|
6305
6164
|
GITHUB_CREDENTIAL_REFRESH_PATH,
|
|
6306
6165
|
GITLAB_CREDENTIAL_REFRESH_PATH,
|
|
@@ -6381,14 +6240,27 @@ export {
|
|
|
6381
6240
|
isUnsafeMemoryOutput,
|
|
6382
6241
|
isSkillRegistryManifest,
|
|
6383
6242
|
putPresignedFile,
|
|
6384
|
-
|
|
6385
|
-
IS_WARMING_MODE,
|
|
6386
|
-
ENGINE_ENV,
|
|
6387
|
-
setAgentCredentialSnapshot,
|
|
6388
|
-
resolveClaudeAuthMethodForMessage,
|
|
6389
|
-
buildClaudeAgentEnv,
|
|
6243
|
+
buildCodexAgentEnv,
|
|
6390
6244
|
execAsync,
|
|
6391
6245
|
execFileAsync,
|
|
6392
6246
|
SUBPROCESS_MAX_BUFFER,
|
|
6393
|
-
AppServerProcess
|
|
6247
|
+
AppServerProcess,
|
|
6248
|
+
TURN_STARTED_METHOD,
|
|
6249
|
+
TURN_COMPLETED_METHOD,
|
|
6250
|
+
TURN_PLAN_UPDATED_METHOD,
|
|
6251
|
+
THREAD_GOAL_UPDATED_METHOD,
|
|
6252
|
+
THREAD_GOAL_CLEARED_METHOD,
|
|
6253
|
+
ITEM_STARTED_METHOD,
|
|
6254
|
+
ITEM_COMPLETED_METHOD,
|
|
6255
|
+
AGENT_MESSAGE_DELTA_METHOD,
|
|
6256
|
+
REASONING_SUMMARY_TEXT_DELTA_METHOD,
|
|
6257
|
+
REASONING_TEXT_DELTA_METHOD,
|
|
6258
|
+
REASONING_SUMMARY_PART_ADDED_METHOD,
|
|
6259
|
+
COMMAND_EXECUTION_OUTPUT_DELTA_METHOD,
|
|
6260
|
+
FILE_CHANGE_OUTPUT_DELTA_METHOD,
|
|
6261
|
+
ACCOUNT_RATE_LIMITS_UPDATED_METHOD,
|
|
6262
|
+
THREAD_TOKEN_USAGE_UPDATED_METHOD,
|
|
6263
|
+
THREAD_COMPACTED_METHOD,
|
|
6264
|
+
dispatchAspNotification,
|
|
6265
|
+
recoverCompletedTurn
|
|
6394
6266
|
};
|
|
@@ -2,10 +2,12 @@
|
|
|
2
2
|
import {
|
|
3
3
|
AGENT,
|
|
4
4
|
AppServerProcess,
|
|
5
|
+
buildCodexAgentEnv,
|
|
5
6
|
headlessAgentRequestSchema,
|
|
6
7
|
isUnsafeMemoryOutput,
|
|
7
|
-
putPresignedFile
|
|
8
|
-
|
|
8
|
+
putPresignedFile,
|
|
9
|
+
recoverCompletedTurn
|
|
10
|
+
} from "./chunk-ESC6QHTZ.js";
|
|
9
11
|
|
|
10
12
|
// src/headless-agent.ts
|
|
11
13
|
import { createHash } from "crypto";
|
|
@@ -120,15 +122,32 @@ async function runClaude(request) {
|
|
|
120
122
|
}
|
|
121
123
|
function runCodexTurn(client, params, timeoutMs) {
|
|
122
124
|
return new Promise((resolve, reject) => {
|
|
125
|
+
const completedItems = [];
|
|
126
|
+
const messageDeltas = /* @__PURE__ */ new Map();
|
|
123
127
|
const cleanup = () => {
|
|
124
128
|
clearTimeout(timeout);
|
|
125
129
|
client.off("notification", onNotification);
|
|
126
130
|
client.off("dispose", onDispose);
|
|
127
131
|
};
|
|
128
132
|
const onNotification = (notification) => {
|
|
133
|
+
if (notification.method === "item/completed") {
|
|
134
|
+
if (notification.params.threadId !== params.threadId || notification.params.item.type !== "agentMessage") return;
|
|
135
|
+
completedItems.push(notification.params.item);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (notification.method === "item/agentMessage/delta") {
|
|
139
|
+
if (notification.params.threadId !== params.threadId) return;
|
|
140
|
+
messageDeltas.set(
|
|
141
|
+
notification.params.itemId,
|
|
142
|
+
(messageDeltas.get(notification.params.itemId) ?? "") + notification.params.delta
|
|
143
|
+
);
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
129
146
|
if (notification.method !== "turn/completed" || notification.params.threadId !== params.threadId) return;
|
|
147
|
+
const turn = recoverCompletedTurn(notification.params.turn, completedItems, messageDeltas);
|
|
148
|
+
const message = turn.items.findLast((item) => item.type === "agentMessage")?.text ?? null;
|
|
130
149
|
cleanup();
|
|
131
|
-
resolve(
|
|
150
|
+
resolve({ turn, message });
|
|
132
151
|
};
|
|
133
152
|
const onDispose = (error) => {
|
|
134
153
|
cleanup();
|
|
@@ -149,6 +168,7 @@ function runCodexTurn(client, params, timeoutMs) {
|
|
|
149
168
|
async function runCodex(request) {
|
|
150
169
|
const appServer = new AppServerProcess({
|
|
151
170
|
cwd: request.workingDirectory,
|
|
171
|
+
env: buildCodexAgentEnv(),
|
|
152
172
|
configOverrides: ["shell_environment_policy.inherit=none", "tools.web_search=false"]
|
|
153
173
|
});
|
|
154
174
|
try {
|
|
@@ -167,7 +187,7 @@ async function runCodex(request) {
|
|
|
167
187
|
dynamicTools: [],
|
|
168
188
|
selectedCapabilityRoots: []
|
|
169
189
|
});
|
|
170
|
-
const turn = await runCodexTurn(client, {
|
|
190
|
+
const { turn, message } = await runCodexTurn(client, {
|
|
171
191
|
threadId: thread.thread.id,
|
|
172
192
|
input: [{ type: "text", text: request.prompt, text_elements: [] }],
|
|
173
193
|
...request.mode === "structured" ? { outputSchema: request.outputSchema } : {},
|
|
@@ -176,10 +196,9 @@ async function runCodex(request) {
|
|
|
176
196
|
environments: []
|
|
177
197
|
}, request.timeoutSeconds * 1e3);
|
|
178
198
|
if (turn.status === "failed") throw new Error(turn.error?.message ?? "Codex ASP turn failed");
|
|
179
|
-
|
|
180
|
-
if (
|
|
181
|
-
|
|
182
|
-
return JSON.parse(message.text);
|
|
199
|
+
if (!message) throw new Error("Codex ASP returned no final message");
|
|
200
|
+
if (request.mode === "filesystem") return message;
|
|
201
|
+
return JSON.parse(message);
|
|
183
202
|
} finally {
|
|
184
203
|
await appServer.stop();
|
|
185
204
|
}
|