replicas-engine 0.1.416 → 0.1.418

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.
Files changed (2) hide show
  1. package/dist/src/index.js +78 -6
  2. package/package.json +1 -1
package/dist/src/index.js CHANGED
@@ -490,7 +490,7 @@ var WORKSPACE_SIZES = ["small", "large"];
490
490
  var INVALID_WORKSPACE_SIZE_ERROR = `Invalid size: must be one of ${WORKSPACE_SIZES.join(", ")}`;
491
491
 
492
492
  // ../shared/src/e2b.ts
493
- var E2B_TEMPLATE_NAME = "replicas-sandbox-2026-07-09-v5";
493
+ var E2B_TEMPLATE_NAME = "replicas-sandbox-2026-07-09-v7";
494
494
 
495
495
  // ../shared/src/runtime-env.ts
496
496
  function parsePosixEnvFile(content) {
@@ -2523,6 +2523,22 @@ function isCodexAuthError(error) {
2523
2523
  return lower.includes("unauthorized") || lower.includes("authentication") || lower.includes("invalid api key") || lower.includes("incorrect api key") || lower.includes("api key") && lower.includes("invalid") || lower.includes("401") || lower.includes('codexerrorinfo="unauthorized"') || lower.includes("codexerrorinfo=unauthorized") || lower.includes("failed to refresh token") || lower.includes("your session has ended");
2524
2524
  }
2525
2525
 
2526
+ // ../shared/src/version.ts
2527
+ function compareVersions(v1, v2) {
2528
+ const parts1 = v1.split(".").map(Number);
2529
+ const parts2 = v2.split(".").map(Number);
2530
+ for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {
2531
+ const num1 = parts1[i] || 0;
2532
+ const num2 = parts2[i] || 0;
2533
+ if (num1 > num2) return 1;
2534
+ if (num1 < num2) return -1;
2535
+ }
2536
+ return 0;
2537
+ }
2538
+ function isVersionBelow(version, minimum) {
2539
+ return compareVersions(version, minimum) < 0;
2540
+ }
2541
+
2526
2542
  // ../shared/src/engine/environment.ts
2527
2543
  var DESKTOP_NOVNC_PORT = 6080;
2528
2544
 
@@ -2629,6 +2645,34 @@ function applyCodexAspTranscriptDelta(current, delta) {
2629
2645
  turns
2630
2646
  };
2631
2647
  }
2648
+ function chatHistoryPageParamsFromQuery(query2) {
2649
+ const parse = (value) => {
2650
+ if (value === void 0) return void 0;
2651
+ const parsed = Number.parseInt(value, 10);
2652
+ return Number.isInteger(parsed) && parsed >= 0 ? parsed : void 0;
2653
+ };
2654
+ return {
2655
+ limit: parse(query2.limit),
2656
+ beforeEvent: parse(query2.beforeEvent),
2657
+ beforeTurn: parse(query2.beforeTurn)
2658
+ };
2659
+ }
2660
+ function paginateChatHistory(full, params) {
2661
+ if (params.limit === void 0) return full;
2662
+ const eventsEnd = Math.min(params.beforeEvent ?? full.events.length, full.events.length);
2663
+ const eventsStartIndex = Math.max(0, eventsEnd - params.limit);
2664
+ const turns = full.codexAspTranscript?.turns;
2665
+ const turnsEnd = turns ? Math.min(params.beforeTurn ?? turns.length, turns.length) : 0;
2666
+ const turnsStartIndex = Math.max(0, turnsEnd - params.limit);
2667
+ const codexAspTranscript = full.codexAspTranscript && turns && (turnsStartIndex > 0 || turnsEnd < turns.length) ? { ...full.codexAspTranscript, turns: turns.slice(turnsStartIndex, turnsEnd) } : full.codexAspTranscript;
2668
+ return {
2669
+ ...full,
2670
+ events: full.events.slice(eventsStartIndex, eventsEnd),
2671
+ eventsStartIndex,
2672
+ codexAspTranscript,
2673
+ ...full.codexAspTranscript ? { turnsStartIndex } : {}
2674
+ };
2675
+ }
2632
2676
 
2633
2677
  // ../shared/src/routes/codex.ts
2634
2678
  var CODEX_AUTH_ENV_KEYS = [
@@ -8225,7 +8269,10 @@ var AspClient = class {
8225
8269
  // src/managers/codex-asp/app-server-process.ts
8226
8270
  var DEFAULT_CODEX_BINARY = "codex";
8227
8271
  var DEFAULT_CODEX_ARGS = ["app-server", "--listen", "stdio://"];
8228
- var ENGINE_PACKAGE_VERSION = "0.1.416";
8272
+ var MIN_CODEX_CLI_VERSION = "0.144.0";
8273
+ var CODEX_UPGRADE_TIMEOUT_MS = 12e4;
8274
+ var codexCliVersionEnsured = null;
8275
+ var ENGINE_PACKAGE_VERSION = "0.1.418";
8229
8276
  var INITIALIZE_METHOD = "initialize";
8230
8277
  var INITIALIZED_NOTIFICATION = "initialized";
8231
8278
  var ACCOUNT_LOGIN_START_METHOD = "account/login/start";
@@ -8252,6 +8299,7 @@ var AppServerProcess = class {
8252
8299
  return { client: this.client };
8253
8300
  }
8254
8301
  this.shuttingDown = false;
8302
+ await this.ensureMinCodexCliVersion();
8255
8303
  const child = spawn3(this.binary, this.args, {
8256
8304
  cwd: this.cwd,
8257
8305
  env: this.env,
@@ -8341,6 +8389,27 @@ var AppServerProcess = class {
8341
8389
  child.kill("SIGTERM");
8342
8390
  });
8343
8391
  }
8392
+ ensureMinCodexCliVersion() {
8393
+ codexCliVersionEnsured ??= this.runEnsureMinCodexCliVersion().catch((error) => {
8394
+ codexCliVersionEnsured = null;
8395
+ console.warn("[AppServerProcess] Failed to ensure minimum codex CLI version, continuing with installed binary:", error);
8396
+ });
8397
+ return codexCliVersionEnsured;
8398
+ }
8399
+ async runEnsureMinCodexCliVersion() {
8400
+ const { stdout } = await execFileAsync(this.binary, ["--version"], { env: this.env });
8401
+ const version = stdout.match(/(\d+\.\d+\.\d+)/)?.[1];
8402
+ if (version && !isVersionBelow(version, MIN_CODEX_CLI_VERSION)) {
8403
+ return;
8404
+ }
8405
+ console.warn(`[AppServerProcess] codex CLI ${version ?? "unknown"} is below ${MIN_CODEX_CLI_VERSION}; upgrading @openai/codex`);
8406
+ await execFileAsync(
8407
+ "npm",
8408
+ ["install", "-g", "--no-audit", "--no-fund", `@openai/codex@${MIN_CODEX_CLI_VERSION}`],
8409
+ { env: this.env, timeout: CODEX_UPGRADE_TIMEOUT_MS }
8410
+ );
8411
+ console.warn(`[AppServerProcess] upgraded codex CLI to ${MIN_CODEX_CLI_VERSION}`);
8412
+ }
8344
8413
  async loginWithConfiguredApiKey(client) {
8345
8414
  if (ENGINE_ENV.REPLICAS_CODEX_AUTH_METHOD !== "api_key" || !ENGINE_ENV.OPENAI_API_KEY) {
8346
8415
  return;
@@ -12599,7 +12668,7 @@ var ChatService = class {
12599
12668
  await rm(join21(HISTORY_DIR_BY_PROVIDER[persisted.provider], `${persisted.id}.jsonl`), { force: true });
12600
12669
  await rm(this.senderFilePath(persisted.id), { force: true });
12601
12670
  }
12602
- async getChatHistory(chatId) {
12671
+ async getChatHistory(chatId, page = {}) {
12603
12672
  const chat = this.requireChat(chatId);
12604
12673
  const [history, senders] = await Promise.all([
12605
12674
  chat.provider.getHistory(),
@@ -12612,13 +12681,13 @@ var ChatService = class {
12612
12681
  }
12613
12682
  const acceptedEvents = [...chat.acceptedUserEvents.entries()].filter(([messageId]) => messageId === chat.activeMessageId || !chat.hasActiveTurn && chat.pendingMessageIds[0] === messageId).map(([, acceptedEvent]) => acceptedEvent).filter((acceptedEvent) => !acceptedEventInCodexTranscript(acceptedEvent, history.codexAspTranscript) && !history.events.some((event) => isSameAcceptedUserEvent(event, acceptedEvent)));
12614
12683
  const events = [...history.events, ...acceptedEvents].sort((a, b) => getEventTimestampMs(a) - getEventTimestampMs(b));
12615
- return {
12684
+ return paginateChatHistory({
12616
12685
  thread_id: history.thread_id,
12617
12686
  events,
12618
12687
  codexAspTranscript: history.codexAspTranscript ?? null,
12619
12688
  goal: history.goal ?? chat.provider.getGoal?.() ?? null,
12620
12689
  senders
12621
- };
12690
+ }, page);
12622
12691
  }
12623
12692
  getProcessingCount() {
12624
12693
  let count = 0;
@@ -13795,7 +13864,10 @@ function createV1Routes(deps) {
13795
13864
  });
13796
13865
  app2.get("/chats/:chatId/history", async (c) => {
13797
13866
  try {
13798
- const history = await deps.chatService.getChatHistory(c.req.param("chatId"));
13867
+ const history = await deps.chatService.getChatHistory(
13868
+ c.req.param("chatId"),
13869
+ chatHistoryPageParamsFromQuery(c.req.query())
13870
+ );
13799
13871
  return c.json(history);
13800
13872
  } catch (error) {
13801
13873
  if (error instanceof ChatNotFoundError) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "replicas-engine",
3
- "version": "0.1.416",
3
+ "version": "0.1.418",
4
4
  "description": "Lightweight API server for Replicas workspaces",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",