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.
- package/dist/src/index.js +78 -6
- 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-
|
|
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
|
|
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(
|
|
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) {
|