remote-codex 0.11.38 → 0.11.40

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.
@@ -11717,6 +11717,21 @@ import { pathToFileURL } from "url";
11717
11717
  import { promisify } from "util";
11718
11718
  var execFileAsync = promisify(execFile);
11719
11719
  var promptPhotoTokenPattern2 = /\[PHOTO\s+([^\]]+)\]/g;
11720
+ var activeTranscriptMatchWindowMs = 12e4;
11721
+ function normalizePromptForTurnReconciliation(value) {
11722
+ return value.replace(/\[PHOTO\s+[^\]]+\]/g, " ").replace(/\s+/g, " ").trim();
11723
+ }
11724
+ function userPromptForTurn(turn) {
11725
+ return turn.items.find((item) => item.kind === "userMessage")?.text ?? null;
11726
+ }
11727
+ function isRecentActiveTranscriptTurn(turn, activeStartedAt) {
11728
+ if (!turn.startedAt) {
11729
+ return true;
11730
+ }
11731
+ const transcriptStartedAt = Date.parse(turn.startedAt);
11732
+ const activeStartedAtMs = Date.parse(activeStartedAt);
11733
+ return !Number.isFinite(transcriptStartedAt) || !Number.isFinite(activeStartedAtMs) || Math.abs(transcriptStartedAt - activeStartedAtMs) <= activeTranscriptMatchWindowMs;
11734
+ }
11720
11735
  function mimeTypeForImagePath(filePath) {
11721
11736
  const extension = path10.extname(filePath).toLowerCase();
11722
11737
  switch (extension) {
@@ -12755,6 +12770,12 @@ var ClaudeRuntimeAdapter = class extends EventEmitter5 {
12755
12770
  return {
12756
12771
  ...summary,
12757
12772
  cwd,
12773
+ // Claude's persisted session metadata remains "idle" while a query is
12774
+ // streaming. The in-memory runtime is authoritative for that interval:
12775
+ // returning the stale persisted status makes detail polling clear the
12776
+ // active provider turn, which in turn drops live tool items from the
12777
+ // transcript until Claude writes its final history record.
12778
+ status: activeTurn ? "running" : summary.status,
12758
12779
  turns: this.reconcileActiveTranscriptTurn(providerSessionId, turns, activeTurn)
12759
12780
  };
12760
12781
  }
@@ -12987,9 +13008,11 @@ var ClaudeRuntimeAdapter = class extends EventEmitter5 {
12987
13008
  }
12988
13009
  const activeUserItem = userMessageHistoryItem(`${activeTurn.providerTurnId}:user`, prompt);
12989
13010
  const activeItems = [...activeTurn.itemOrder].map((itemId) => activeTurn.items.get(itemId)).filter((item) => Boolean(item));
12990
- const transcriptTurnIndex = turns.findLastIndex(
12991
- (turn) => turn.status === "completed" && turn.items.some((item) => item.kind === "userMessage") && !turn.items.some((item) => item.kind === "agentMessage")
12992
- );
13011
+ const normalizedPrompt = normalizePromptForTurnReconciliation(prompt);
13012
+ const transcriptTurnIndex = turns.findLastIndex((turn) => {
13013
+ const transcriptPrompt = userPromptForTurn(turn);
13014
+ return turn.status === "completed" && transcriptPrompt !== null && normalizePromptForTurnReconciliation(transcriptPrompt) === normalizedPrompt && !turn.items.some((item) => item.kind === "agentMessage") && isRecentActiveTranscriptTurn(turn, activeTurn.startedAt);
13015
+ });
12993
13016
  if (transcriptTurnIndex < 0) {
12994
13017
  return turns;
12995
13018
  }
@@ -13000,6 +13023,11 @@ var ClaudeRuntimeAdapter = class extends EventEmitter5 {
13000
13023
  aliases = /* @__PURE__ */ new Map();
13001
13024
  this.historicalTurnIdAliases.set(providerSessionId, aliases);
13002
13025
  }
13026
+ for (const [historicalTurnId, displayTurnId] of aliases) {
13027
+ if (displayTurnId === activeTurn.providerTurnId && historicalTurnId !== transcriptTurn.providerTurnId) {
13028
+ aliases.delete(historicalTurnId);
13029
+ }
13030
+ }
13003
13031
  aliases.set(transcriptTurn.providerTurnId, activeTurn.providerTurnId);
13004
13032
  }
13005
13033
  return turns.map((turn, index) => {
@@ -13022,9 +13050,16 @@ var ClaudeRuntimeAdapter = class extends EventEmitter5 {
13022
13050
  if (!aliases || aliases.size === 0) {
13023
13051
  return turns;
13024
13052
  }
13053
+ const rawTurnIds = new Set(turns.map((turn) => turn.providerTurnId));
13054
+ const usedTurnIds = /* @__PURE__ */ new Set();
13025
13055
  return turns.map((turn) => {
13026
13056
  const providerTurnId = aliases.get(turn.providerTurnId);
13027
- return providerTurnId ? { ...turn, providerTurnId } : turn;
13057
+ if (!providerTurnId || usedTurnIds.has(providerTurnId) || providerTurnId !== turn.providerTurnId && rawTurnIds.has(providerTurnId)) {
13058
+ usedTurnIds.add(turn.providerTurnId);
13059
+ return turn;
13060
+ }
13061
+ usedTurnIds.add(providerTurnId);
13062
+ return { ...turn, providerTurnId };
13028
13063
  });
13029
13064
  }
13030
13065
  async listMcpServers() {
@@ -13233,9 +13268,11 @@ var ClaudeRuntimeAdapter = class extends EventEmitter5 {
13233
13268
  const nextItem = withHistoryItemCreatedAt(item, messageCreatedAt);
13234
13269
  const existing = state.items.get(nextItem.id);
13235
13270
  addOrUpdateItem(state, nextItem);
13236
- if (nextItem.kind !== "agentMessage" && !existing) {
13271
+ if (nextItem.kind === "agentMessage") {
13272
+ this.emitItem(state, nextItem, "item.completed", { force: true });
13273
+ } else if (!existing) {
13237
13274
  this.emitItem(state, nextItem, "item.started");
13238
- } else if (nextItem.kind !== "agentMessage" && existing) {
13275
+ } else {
13239
13276
  this.emitItem(state, nextItem, "item.started", { force: true });
13240
13277
  }
13241
13278
  }
@@ -16955,7 +16992,7 @@ function deferLargeHistoryItemDetails(turn, deferredDetails) {
16955
16992
  };
16956
16993
  }
16957
16994
  function shouldPersistLiveHistoryItem(item) {
16958
- return item.kind === "commandExecution" || item.kind === "fileChange" || item.kind === "fileRead" || item.kind === "hook" || item.kind === "agentToolCall" || item.kind === "skillToolCall" || item.kind === "toolCall" || item.kind === "reasoning" || item.kind === "webSearch";
16995
+ return item.kind === "agentMessage" && !isTransientAgentHistoryItem(item) || item.kind === "commandExecution" || item.kind === "fileChange" || item.kind === "fileRead" || item.kind === "hook" || item.kind === "agentToolCall" || item.kind === "skillToolCall" || item.kind === "toolCall" || item.kind === "reasoning" || item.kind === "webSearch";
16959
16996
  }
16960
16997
  function shouldPersistFinalHistoryItem(item) {
16961
16998
  return item.kind === "agentMessage" || shouldPersistLiveHistoryItem(item);
@@ -20281,7 +20318,9 @@ var ThreadHistoryPersistenceCoordinator = class {
20281
20318
  threadId: localThreadId,
20282
20319
  turnId,
20283
20320
  itemId: item.id,
20284
- itemJson: JSON.stringify(item)
20321
+ itemJson: JSON.stringify(
20322
+ item.kind === "agentMessage" ? { ...item, sourceTurnId: turnId } : item
20323
+ )
20285
20324
  });
20286
20325
  }
20287
20326
  persistProjectedHistoryItem(localThreadId, turnId, item) {