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.
@@ -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(readEnv2, [namespacedKey, legacyKey]) {
93
- return readEnv2(namespacedKey) ?? readEnv2(legacyKey);
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/engine-env.ts
5646
- import { readFileSync as readFileSync2 } from "fs";
5647
- import { homedir as homedir2 } from "os";
5648
- import { join as join2 } from "path";
5649
-
5650
- // src/runtime-env-loader.ts
5651
- import { readFileSync } from "fs";
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.635";
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 ?? (ENGINE_ENV.REPLICAS_CODEX_AUTH_METHOD === "foundry" ? [
5891
+ const baseArgs = options.args ?? (options.env.REPLICAS_CODEX_AUTH_METHOD === "foundry" ? [
6077
5892
  ...DEFAULT_CODEX_ARGS,
6078
5893
  "-c",
6079
- `model=${JSON.stringify(process.env.CODEX_FOUNDRY_MODEL)}`,
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(process.env.CODEX_FOUNDRY_BASE_URL)}`,
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 ?? buildCodexAgentEnv();
6093
- this.cwd = options.cwd ?? ENGINE_ENV.WORKSPACE_ROOT;
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 (ENGINE_ENV.REPLICAS_CODEX_AUTH_METHOD !== "api_key" || !ENGINE_ENV.OPENAI_API_KEY) {
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: ENGINE_ENV.OPENAI_API_KEY
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
- isRecord4 as isRecord2,
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
- } from "./chunk-464TFYYL.js";
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(notification.params.turn);
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
- const message = turn.items.findLast((item) => item.type === "agentMessage");
180
- if (!message || message.type !== "agentMessage") throw new Error("Codex ASP returned no final message");
181
- if (request.mode === "filesystem") return message.text;
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
  }