@openclaw/codex 2026.7.2-beta.4 → 2026.7.2-beta.5

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 (41) hide show
  1. package/dist/{app-server-policy-BO3jYBkv.js → app-server-policy-BmDgseo_.js} +1 -1
  2. package/dist/attempt-client-cleanup-Ia52yRWc.js +127 -0
  3. package/dist/{attempt-notifications-DdmnBMUp.js → attempt-notifications-CMR2_fmR.js} +1 -1
  4. package/dist/{bounded-turn-CaQL96kg.js → bounded-turn-FEbUXoYT.js} +36 -13
  5. package/dist/{capabilities-CLICvTxf.js → capabilities-BHRSI6Cn.js} +1 -1
  6. package/dist/cli-metadata.js +1 -1
  7. package/dist/{command-formatters-DgADqnHa.js → command-formatters-ico4ZFnk.js} +2 -2
  8. package/dist/{command-handlers-l_lVPNlB.js → command-handlers-CRmnwI2N.js} +1232 -1221
  9. package/dist/{compact-CC5KhBzX.js → compact-dEN49UH6.js} +7 -7
  10. package/dist/{computer-use-Ip1-QGa-.js → computer-use-BjGylO-E.js} +16 -6
  11. package/dist/{conversation-control-sNPsbTCP.js → conversation-control-DE7d9DOj.js} +6 -6
  12. package/dist/doctor-contract-api.js +24 -86
  13. package/dist/{dynamic-tools-CQI3UwqY.js → dynamic-tools-LIt9ojep.js} +50 -46
  14. package/dist/{event-projector-usage-D6tE7_qD.js → event-projector-usage-tvgb1NCX.js} +2 -2
  15. package/dist/harness.js +14 -13
  16. package/dist/index.js +208 -267
  17. package/dist/media-understanding-provider.js +6 -1
  18. package/dist/{models-BNeMlHgg.js → models-BA01NEez.js} +2 -2
  19. package/dist/{notification-correlation-BGLixv5_.js → notification-correlation-Bj_Ak_jI.js} +3 -3
  20. package/dist/{plugin-app-cache-key-CvzvmBRz.js → plugin-app-cache-key-DSXX-rXO.js} +5 -5
  21. package/dist/{transcript-mirror-2p7kl6e4.js → protocol-validators-Dm4eXZmt.js} +2 -550
  22. package/dist/{rate-limits-D0IJT-a6.js → rate-limits-S_PXs0ul.js} +1 -1
  23. package/dist/realtime-voice-api-BPcA1uN9.js +494 -0
  24. package/dist/realtime-voice-api.js +2 -0
  25. package/dist/{request-BTccUTD3.js → request-CXpPennK.js} +1 -1
  26. package/dist/{run-attempt--858NXDl.js → run-attempt-C5GTPJOE.js} +417 -237
  27. package/dist/{session-binding-ZSMX1omP.js → session-binding-DlVQ-Pxs.js} +952 -890
  28. package/dist/{session-catalog-DsKaezgR.js → session-catalog-CP2oCcEb.js} +32 -23
  29. package/dist/{session-cli-CYJTfRLG.js → session-cli-CqZ0Fp2a.js} +2 -2
  30. package/dist/{session-upstream-marker-D7XlI9us.js → session-upstream-marker-QE-m5QFG.js} +1 -1
  31. package/dist/{settled-turn-finalizer-DHltNgtF.js → settled-turn-finalizer-CA_2QXIE.js} +2 -2
  32. package/dist/{shared-client-wmgNFNYp.js → shared-client-BVKE40c-.js} +1863 -1707
  33. package/dist/{side-question-BfFZCsJ-.js → side-question-CO12sHxo.js} +11 -9
  34. package/dist/{thread-lifecycle-cqrOlJkq.js → thread-lifecycle-DRg_FdzC.js} +12 -132
  35. package/dist/transcript-mirror-uKA-A4tB.js +550 -0
  36. package/dist/{upstream-session-fork-vPjwkT1i.js → upstream-session-fork-_Vrz4WJr.js} +3 -3
  37. package/dist/{usage-DM_I3mPT.js → usage-UpVbdX5G.js} +3 -3
  38. package/dist/{web-search-provider.runtime-Bx6HAc_k.js → web-search-provider.runtime-CaQMYDbp.js} +3 -3
  39. package/package.json +4 -5
  40. package/npm-shrinkwrap.json +0 -202
  41. package/dist/{auth-binding-C1czuHPA.js → auth-binding-B4FfbcCg.js} +1 -1
@@ -1,4 +1,4 @@
1
- import { t as runBoundedCodexAppServerTurn } from "./bounded-turn-CaQL96kg.js";
1
+ import { t as runBoundedCodexAppServerTurn } from "./bounded-turn-FEbUXoYT.js";
2
2
  import { validateJsonSchemaValue } from "openclaw/plugin-sdk/json-schema-runtime";
3
3
  //#region extensions/codex/media-understanding-provider.ts
4
4
  /**
@@ -28,6 +28,7 @@ function buildCodexMediaUnderstandingProvider(options = {}) {
28
28
  prompt: req.prompt,
29
29
  maxTokens: req.maxTokens,
30
30
  timeoutMs: req.timeoutMs,
31
+ ...req.signal ? { signal: req.signal } : {},
31
32
  profile: req.profile,
32
33
  preferredProfile: req.preferredProfile,
33
34
  authStore: req.authStore,
@@ -41,6 +42,7 @@ function buildCodexMediaUnderstandingProvider(options = {}) {
41
42
  async function describeCodexImages(req, options) {
42
43
  const model = req.model.trim();
43
44
  if (!model) throw new Error("Codex image understanding requires model id.");
45
+ req.signal?.throwIfAborted();
44
46
  const { text } = await runBoundedCodexAppServerTurn({
45
47
  config: req.cfg,
46
48
  model: {
@@ -49,6 +51,7 @@ async function describeCodexImages(req, options) {
49
51
  },
50
52
  profile: req.profile,
51
53
  timeoutMs: req.timeoutMs,
54
+ signal: req.signal,
52
55
  agentDir: req.agentDir,
53
56
  authProfileStore: req.authStore,
54
57
  options,
@@ -76,6 +79,7 @@ async function extractCodexStructured(req, options) {
76
79
  if (!req.instructions.trim()) throw new Error("Codex structured extraction requires instructions.");
77
80
  if (req.input.length === 0) throw new Error("Codex structured extraction requires at least one input.");
78
81
  if (!req.input.some((entry) => entry.type === "image")) throw new Error("Codex structured extraction requires at least one image input.");
82
+ req.signal?.throwIfAborted();
79
83
  const { text } = await runBoundedCodexAppServerTurn({
80
84
  config: req.cfg,
81
85
  model: {
@@ -84,6 +88,7 @@ async function extractCodexStructured(req, options) {
84
88
  },
85
89
  profile: req.profile,
86
90
  timeoutMs: req.timeoutMs,
91
+ signal: req.signal,
87
92
  agentDir: req.agentDir,
88
93
  authProfileStore: req.authStore,
89
94
  options,
@@ -1,4 +1,4 @@
1
- import { x as readCodexModelListResponse } from "./transcript-mirror-2p7kl6e4.js";
1
+ import { c as readCodexModelListResponse } from "./protocol-validators-Dm4eXZmt.js";
2
2
  import { uniqueStrings } from "openclaw/plugin-sdk/string-coerce-runtime";
3
3
  //#region extensions/codex/src/app-server/models.ts
4
4
  /**
@@ -40,7 +40,7 @@ async function listAllCodexAppServerModels(options = {}) {
40
40
  async function withCodexAppServerModelClient(options, run) {
41
41
  const timeoutMs = options.timeoutMs ?? 2500;
42
42
  const useSharedClient = options.sharedClient !== false;
43
- const { createIsolatedCodexAppServerClient, getLeasedSharedCodexAppServerClient, releaseLeasedSharedCodexAppServerClient } = await import("./shared-client-wmgNFNYp.js").then((n) => n.f);
43
+ const { createIsolatedCodexAppServerClient, getLeasedSharedCodexAppServerClient, releaseLeasedSharedCodexAppServerClient } = await import("./shared-client-BVKE40c-.js").then((n) => n.p);
44
44
  const client = useSharedClient ? await getLeasedSharedCodexAppServerClient({
45
45
  startOptions: options.startOptions,
46
46
  timeoutMs,
@@ -1,6 +1,6 @@
1
- import { Q as isJsonObject } from "./shared-client-wmgNFNYp.js";
2
- import { D as resolveCodexSupervisionAppServerRuntimeOptions, b as readCodexPluginConfig, x as resolveCodexAppServerRuntimeOptions } from "./session-binding-ZSMX1omP.js";
3
- import { t as buildCodexAppServerConnectionFingerprint } from "./plugin-app-cache-key-CvzvmBRz.js";
1
+ import { V as isJsonObject } from "./shared-client-BVKE40c-.js";
2
+ import { T as readCodexPluginConfig, g as resolveCodexSupervisionAppServerRuntimeOptions, p as resolveCodexAppServerRuntimeOptions } from "./session-binding-DlVQ-Pxs.js";
3
+ import { t as buildCodexAppServerConnectionFingerprint } from "./plugin-app-cache-key-DSXX-rXO.js";
4
4
  //#region extensions/codex/src/app-server/binding-connection.ts
5
5
  /** Requires the native model pair after a supervised pending branch has materialized. */
6
6
  function requireCodexSupervisionModelSelection(binding) {
@@ -1,12 +1,12 @@
1
- import { D as resolveCodexAppServerHomeDir } from "./shared-client-wmgNFNYp.js";
2
- import { C as resolveCodexAppServerUserHomeDir } from "./session-binding-ZSMX1omP.js";
1
+ import { U as resolveCodexAppServerHomeDir } from "./shared-client-BVKE40c-.js";
2
+ import { x as resolveCodexAppServerUserHomeDir } from "./session-binding-DlVQ-Pxs.js";
3
3
  import { createRequire } from "node:module";
4
4
  import { isFutureDateTimestampMs, resolveDateTimestampMs, resolveExpiresAtMsFromDurationMs } from "openclaw/plugin-sdk/number-runtime";
5
- import { truncateUtf16Safe } from "openclaw/plugin-sdk/text-utility-runtime";
6
- import { createHash } from "node:crypto";
7
- import { isRecord } from "openclaw/plugin-sdk/string-coerce-runtime";
8
5
  import { OPENCLAW_VERSION, embeddedAgentLog } from "openclaw/plugin-sdk/agent-harness-runtime";
6
+ import { createHash } from "node:crypto";
9
7
  import { readPluginPackageVersion } from "openclaw/plugin-sdk/extension-shared";
8
+ import { isRecord } from "openclaw/plugin-sdk/string-coerce-runtime";
9
+ import { truncateUtf16Safe } from "openclaw/plugin-sdk/text-utility-runtime";
10
10
  //#region extensions/codex/src/app-server/app-inventory-cache.ts
11
11
  /**
12
12
  * Process-local cache for Codex app-server app inventories, keyed by runtime
@@ -1,9 +1,5 @@
1
- import { createHash } from "node:crypto";
2
- import { isRecord, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
3
- import { embeddedAgentLog, formatErrorMessage, projectAgentHarnessTranscriptMessageForDisplay, runAgentHarnessBeforeMessageWriteHook } from "openclaw/plugin-sdk/agent-harness-runtime";
1
+ import { isRecord } from "openclaw/plugin-sdk/string-coerce-runtime";
4
2
  import { Compile } from "typebox/compile";
5
- import { Buffer } from "node:buffer";
6
- import { publishSessionTranscriptUpdateByIdentity, withSessionTranscriptWriteLock } from "openclaw/plugin-sdk/session-transcript-runtime";
7
3
  //#region extensions/codex/src/app-server/protocol-generated/json/DynamicToolCallParams.json
8
4
  var DynamicToolCallParams_default = {
9
5
  $schema: "http://json-schema.org/draft-07/schema#",
@@ -6338,548 +6334,4 @@ function formatValidationErrors(validate, value) {
6338
6334
  }).join("; ");
6339
6335
  }
6340
6336
  //#endregion
6341
- //#region extensions/codex/src/app-server/upstream-prompt-provenance.ts
6342
- const UPSTREAM_USER_TEXT_META_KEY = "upstreamUserText";
6343
- const MIRROR_IDENTITY_META_KEY = "mirrorIdentity";
6344
- function attachCodexMirrorIdentity(message, identity) {
6345
- const record = message;
6346
- const existing = record["__openclaw"];
6347
- const baseMeta = existing && typeof existing === "object" && !Array.isArray(existing) ? existing : {};
6348
- return {
6349
- ...record,
6350
- __openclaw: {
6351
- ...baseMeta,
6352
- [MIRROR_IDENTITY_META_KEY]: identity
6353
- }
6354
- };
6355
- }
6356
- function readMirrorIdentity(message) {
6357
- const meta = message["__openclaw"];
6358
- if (!meta || typeof meta !== "object" || Array.isArray(meta)) return;
6359
- const id = meta[MIRROR_IDENTITY_META_KEY];
6360
- return typeof id === "string" && id ? id : void 0;
6361
- }
6362
- function attachUpstreamUserText(message, text) {
6363
- const record = message;
6364
- const existing = record["__openclaw"];
6365
- const baseMeta = existing && typeof existing === "object" && !Array.isArray(existing) ? existing : {};
6366
- return {
6367
- ...record,
6368
- __openclaw: {
6369
- ...baseMeta,
6370
- [UPSTREAM_USER_TEXT_META_KEY]: text
6371
- }
6372
- };
6373
- }
6374
- function readUpstreamUserText(message) {
6375
- const meta = message?.["__openclaw"];
6376
- if (!meta || typeof meta !== "object" || Array.isArray(meta)) return;
6377
- const text = meta[UPSTREAM_USER_TEXT_META_KEY];
6378
- return typeof text === "string" && text ? text : void 0;
6379
- }
6380
- //#endregion
6381
- //#region extensions/codex/src/app-server/transcript-mirror-attestation.ts
6382
- const MIRROR_ORIGIN_META_KEY = "mirrorOrigin";
6383
- const MIRROR_SOURCE_FINGERPRINT_META_KEY = "mirrorSourceFingerprint";
6384
- const CODEX_APP_SERVER_MIRROR_ORIGIN = "codex-app-server";
6385
- function attachCodexMirrorAttestation(message, sourceFingerprint) {
6386
- const record = message;
6387
- const existing = record["__openclaw"];
6388
- const baseMeta = existing && typeof existing === "object" && !Array.isArray(existing) ? existing : {};
6389
- return {
6390
- ...record,
6391
- __openclaw: {
6392
- ...baseMeta,
6393
- [MIRROR_ORIGIN_META_KEY]: CODEX_APP_SERVER_MIRROR_ORIGIN,
6394
- ...sourceFingerprint ? { [MIRROR_SOURCE_FINGERPRINT_META_KEY]: sourceFingerprint } : {}
6395
- }
6396
- };
6397
- }
6398
- function readCodexMirrorSourceFingerprint(message) {
6399
- const meta = message["__openclaw"];
6400
- if (!meta || typeof meta !== "object" || Array.isArray(meta)) return;
6401
- const value = meta[MIRROR_SOURCE_FINGERPRINT_META_KEY];
6402
- return typeof value === "string" && value ? value : void 0;
6403
- }
6404
- function serializeCodexMirrorSourceEvidence(message) {
6405
- const record = message;
6406
- return JSON.stringify({
6407
- role: message.role,
6408
- content: record.content,
6409
- ...message.role === "user" ? { upstreamUserText: readUpstreamUserText(message) } : {},
6410
- ...message.role === "toolResult" ? {
6411
- toolCallId: record.toolCallId,
6412
- toolName: record.toolName,
6413
- isError: record.isError === true
6414
- } : {}
6415
- });
6416
- }
6417
- function fingerprintCodexMirrorSourceMessage(message) {
6418
- return createHash("sha256").update(serializeCodexMirrorSourceEvidence(message)).digest("hex").slice(0, 32);
6419
- }
6420
- //#endregion
6421
- //#region extensions/codex/src/app-server/user-prompt-message.ts
6422
- function buildSenderLabel(params) {
6423
- const label = params.senderName ?? params.senderUsername ?? params.senderE164 ?? params.senderId;
6424
- if (!label) return;
6425
- return !params.senderId || label.includes(params.senderId) ? label : `${label} (${params.senderId})`;
6426
- }
6427
- function buildFromPrepared(params, preparedUserMessage) {
6428
- const senderId = normalizeOptionalString(params.senderId);
6429
- const senderName = normalizeOptionalString(params.senderName);
6430
- const senderUsername = normalizeOptionalString(params.senderUsername);
6431
- const senderE164 = normalizeOptionalString(params.senderE164);
6432
- const senderLabel = buildSenderLabel({
6433
- senderId,
6434
- senderName,
6435
- senderUsername,
6436
- senderE164
6437
- });
6438
- const sourceChannel = normalizeOptionalString(params.inputProvenance?.sourceChannel ?? params.messageChannel ?? params.messageProvider);
6439
- return {
6440
- role: "user",
6441
- timestamp: Date.now(),
6442
- ...params.inputProvenance ? { provenance: params.inputProvenance } : {},
6443
- ...sourceChannel ? { sourceChannel } : {},
6444
- ...senderId ? { senderId } : {},
6445
- ...senderName ? { senderName } : {},
6446
- ...senderUsername ? { senderUsername } : {},
6447
- ...senderE164 ? { senderE164 } : {},
6448
- ...senderLabel ? { senderLabel } : {},
6449
- ...preparedUserMessage ? preparedUserMessage : { content: params.prompt }
6450
- };
6451
- }
6452
- function buildCodexUserPromptMessage(params) {
6453
- return buildFromPrepared(params, params.userTurnTranscriptRecorder?.message);
6454
- }
6455
- function buildCodexUpstreamPromptMessage(params, identity, upstreamUserText) {
6456
- const message = attachCodexMirrorIdentity(buildCodexUserPromptMessage(params), identity);
6457
- return upstreamUserText ? attachUpstreamUserText(message, upstreamUserText) : message;
6458
- }
6459
- function promptSnapshot(params, turnId, upstreamUserText) {
6460
- return params.suppressNextUserMessagePersistence ? [] : [buildCodexUpstreamPromptMessage(params, `${turnId}:prompt`, upstreamUserText)];
6461
- }
6462
- async function buildResolvedCodexUserPromptMessage(params) {
6463
- return buildFromPrepared(params, await params.userTurnTranscriptRecorder?.resolveMessage() ?? params.userTurnTranscriptRecorder?.message);
6464
- }
6465
- //#endregion
6466
- //#region extensions/codex/src/app-server/transcript-mirror.ts
6467
- function isMirroredAgentMessage(message) {
6468
- return message.role === "user" || message.role === "assistant" || message.role === "toolResult";
6469
- }
6470
- const CODEX_HISTORY_IMPORT_MAX_MESSAGES = 200;
6471
- const CODEX_HISTORY_IMPORT_MAX_BYTES = 512 * 1024;
6472
- const CODEX_HISTORY_IMPORT_MAX_MESSAGE_BYTES = 64 * 1024;
6473
- const CODEX_HISTORY_TRUNCATION_SUFFIX = "\n\n[Message truncated during Codex history import.]";
6474
- const CODEX_HISTORY_ASSISTANT_API = "openai-chatgpt-responses";
6475
- const CODEX_HISTORY_ASSISTANT_PROVIDER = "openai";
6476
- const CODEX_HISTORY_ASSISTANT_MODEL = "native-history";
6477
- const CODEX_HISTORY_ZERO_USAGE = {
6478
- input: 0,
6479
- output: 0,
6480
- cacheRead: 0,
6481
- cacheWrite: 0,
6482
- totalTokens: 0,
6483
- cost: {
6484
- input: 0,
6485
- output: 0,
6486
- cacheRead: 0,
6487
- cacheWrite: 0,
6488
- total: 0
6489
- }
6490
- };
6491
- function isUtf8ContinuationByte(byte) {
6492
- return byte !== void 0 && (byte & 192) === 128;
6493
- }
6494
- function truncateUtf8Prefix(value, maxBytes) {
6495
- const bytes = Buffer.from(value);
6496
- if (bytes.byteLength <= maxBytes) return value;
6497
- let end = Math.max(0, maxBytes);
6498
- while (end > 0 && isUtf8ContinuationByte(bytes[end])) end -= 1;
6499
- return bytes.subarray(0, end).toString("utf8");
6500
- }
6501
- function normalizeImportedHistoryText(value) {
6502
- if (typeof value !== "string") return;
6503
- const text = value.trim();
6504
- if (!text) return;
6505
- if (Buffer.byteLength(text, "utf8") <= CODEX_HISTORY_IMPORT_MAX_MESSAGE_BYTES) return text;
6506
- const suffixBytes = Buffer.byteLength(CODEX_HISTORY_TRUNCATION_SUFFIX, "utf8");
6507
- return `${truncateUtf8Prefix(text, Math.max(0, CODEX_HISTORY_IMPORT_MAX_MESSAGE_BYTES - suffixBytes))}${CODEX_HISTORY_TRUNCATION_SUFFIX}`;
6508
- }
6509
- function projectCodexUserItemText(item) {
6510
- if (!Array.isArray(item.content)) return;
6511
- const parts = [];
6512
- for (const value of item.content) {
6513
- if (!value || typeof value !== "object" || Array.isArray(value)) continue;
6514
- const input = value;
6515
- if (input.type === "text") {
6516
- const text = normalizeImportedHistoryText(input.text);
6517
- if (text) parts.push(text);
6518
- continue;
6519
- }
6520
- if (input.type === "image" || input.type === "localImage") {
6521
- parts.push("[Image attachment]");
6522
- continue;
6523
- }
6524
- if (input.type === "skill" || input.type === "mention") {
6525
- const name = normalizeOptionalString(input.name);
6526
- if (name) parts.push(`${input.type === "skill" ? "$" : "@"}${name}`);
6527
- }
6528
- }
6529
- return normalizeImportedHistoryText(parts.join("\n"));
6530
- }
6531
- function selectTurnsThroughBoundary(thread, throughTurnId) {
6532
- if (throughTurnId === null) return [];
6533
- const turns = thread.turns ?? [];
6534
- const boundaryIndex = turns.findIndex((turn) => turn.id === throughTurnId);
6535
- if (boundaryIndex < 0) throw new Error(`Codex history boundary turn not found: ${throughTurnId}`);
6536
- const boundary = turns[boundaryIndex];
6537
- if (boundary?.status !== "completed" && boundary?.status !== "interrupted" && boundary?.status !== "failed") throw new Error(`Codex history boundary turn is not terminal: ${throughTurnId}`);
6538
- return turns.slice(0, boundaryIndex + 1);
6539
- }
6540
- function projectCodexThreadHistory(params) {
6541
- const projected = [];
6542
- const threadTimestamp = typeof params.thread.createdAt === "number" && Number.isFinite(params.thread.createdAt) ? params.thread.createdAt * 1e3 : params.importedAt;
6543
- let itemOffset = 0;
6544
- for (const turn of selectTurnsThroughBoundary(params.thread, params.throughTurnId)) for (const value of turn.items) {
6545
- const item = value;
6546
- const itemId = normalizeOptionalString(item.id);
6547
- const identity = `${turn.id}:${itemId ?? itemOffset}`;
6548
- const timestampSeconds = item.type === "agentMessage" ? turn.completedAt ?? turn.startedAt : turn.startedAt ?? turn.completedAt;
6549
- const timestamp = typeof timestampSeconds === "number" && Number.isFinite(timestampSeconds) ? timestampSeconds * 1e3 + itemOffset : threadTimestamp + itemOffset;
6550
- const text = item.type === "userMessage" ? projectCodexUserItemText(item) : item.type === "agentMessage" ? normalizeImportedHistoryText(item.text) : void 0;
6551
- const role = item.type === "userMessage" ? "user" : item.type === "agentMessage" ? "assistant" : void 0;
6552
- itemOffset += 1;
6553
- if (!text || !role) continue;
6554
- const message = role === "assistant" ? attachCodexMirrorIdentity({
6555
- role,
6556
- content: [{
6557
- type: "text",
6558
- text
6559
- }],
6560
- api: CODEX_HISTORY_ASSISTANT_API,
6561
- provider: normalizeOptionalString(params.modelProvider) ?? normalizeOptionalString(params.thread.modelProvider) ?? CODEX_HISTORY_ASSISTANT_PROVIDER,
6562
- model: CODEX_HISTORY_ASSISTANT_MODEL,
6563
- usage: CODEX_HISTORY_ZERO_USAGE,
6564
- stopReason: "stop",
6565
- timestamp
6566
- }, identity) : attachCodexMirrorIdentity({
6567
- role,
6568
- content: text,
6569
- timestamp
6570
- }, identity);
6571
- const phase = item.phase === "commentary" || item.phase === "final_answer" ? item.phase : void 0;
6572
- projected.push({
6573
- message,
6574
- responseItem: {
6575
- type: "message",
6576
- role,
6577
- content: [{
6578
- type: role === "assistant" ? "output_text" : "input_text",
6579
- text
6580
- }],
6581
- ...role === "assistant" && phase ? { phase } : {}
6582
- },
6583
- textBytes: Buffer.byteLength(text, "utf8")
6584
- });
6585
- }
6586
- return projected;
6587
- }
6588
- function selectBoundedCodexHistoryTail(projected) {
6589
- const selected = [];
6590
- let selectedBytes = 0;
6591
- for (let index = projected.length - 1; index >= 0; index -= 1) {
6592
- const candidate = projected[index];
6593
- if (!candidate) continue;
6594
- if (selected.length >= CODEX_HISTORY_IMPORT_MAX_MESSAGES || selectedBytes + candidate.textBytes > CODEX_HISTORY_IMPORT_MAX_BYTES) break;
6595
- selected.push(candidate);
6596
- selectedBytes += candidate.textBytes;
6597
- }
6598
- return selected.toReversed();
6599
- }
6600
- /** Projects one terminal Codex history prefix into transcript and Responses API items. */
6601
- function projectBoundedCodexThreadHistory(params) {
6602
- const projected = projectCodexThreadHistory({
6603
- thread: params.thread,
6604
- throughTurnId: params.throughTurnId,
6605
- importedAt: params.importedAt,
6606
- ...params.modelProvider ? { modelProvider: params.modelProvider } : {}
6607
- });
6608
- const selected = selectBoundedCodexHistoryTail(projected);
6609
- return {
6610
- importedMessages: selected.length,
6611
- omittedMessages: projected.length - selected.length,
6612
- responseItems: selected.map(({ responseItem }) => responseItem),
6613
- transcriptMessages: selected.map(({ message }) => message)
6614
- };
6615
- }
6616
- /** Imports a bounded, user-visible Codex history tail into a new OpenClaw transcript. */
6617
- async function importCodexThreadHistoryToTranscript(params) {
6618
- const projection = projectBoundedCodexThreadHistory({
6619
- thread: params.thread,
6620
- throughTurnId: params.throughTurnId,
6621
- importedAt: Date.now(),
6622
- ...params.modelProvider ? { modelProvider: params.modelProvider } : {}
6623
- });
6624
- if (projection.transcriptMessages.length > 0) await mirror({
6625
- storePath: params.storePath,
6626
- sessionId: params.sessionId,
6627
- sessionKey: params.sessionKey,
6628
- ...params.agentId ? { agentId: params.agentId } : {},
6629
- ...params.cwd ? { cwd: params.cwd } : {},
6630
- ...params.config ? { config: params.config } : {},
6631
- messages: projection.transcriptMessages,
6632
- idempotencyScope: `codex-app-server:${params.thread.id}:history`
6633
- });
6634
- return {
6635
- importedMessages: projection.importedMessages,
6636
- omittedMessages: projection.omittedMessages
6637
- };
6638
- }
6639
- async function mirrorBestEffort(params) {
6640
- try {
6641
- const messages = await resolveFinalCodexMirrorMessages({
6642
- params: params.params,
6643
- messagesSnapshot: params.result.messagesSnapshot,
6644
- turnId: params.turnId
6645
- });
6646
- const mirrorResult = await mirror({
6647
- agentId: params.agentId,
6648
- sessionKey: params.sessionKey,
6649
- sessionId: params.params.sessionId,
6650
- storePath: params.params.sessionTarget?.storePath,
6651
- cwd: params.cwd,
6652
- messages,
6653
- idempotencyScope: `codex-app-server:${params.threadId}`,
6654
- config: params.params.config
6655
- });
6656
- for (const message of mirrorResult.userMessagesPresent) try {
6657
- params.notifyUserMessagePersisted(message);
6658
- } catch (error) {
6659
- embeddedAgentLog.warn("failed to notify codex app-server user-message persistence", { error: formatErrorMessage(error) });
6660
- }
6661
- const expectedFingerprints = new Map(messages.flatMap((message) => {
6662
- if (!isMirroredAgentMessage(message)) return [];
6663
- const identity = readMirrorIdentity(message);
6664
- return identity ? [[identity, fingerprintCodexMirrorSourceMessage(message)]] : [];
6665
- }));
6666
- const mirroredMessages = mirrorResult.messagesPresent.filter((message) => {
6667
- const identity = readMirrorIdentity(message);
6668
- return identity !== void 0 && readCodexMirrorSourceFingerprint(message) === expectedFingerprints.get(identity);
6669
- });
6670
- const assistantMirrorIdentity = `${params.turnId}:assistant`;
6671
- const assistantTranscriptOwned = mirrorResult.assistantMirrorIdentitiesOwned.includes(assistantMirrorIdentity);
6672
- const assistantTranscriptIdempotencyKey = normalizeOptionalString((assistantTranscriptOwned ? mirroredMessages.find((message) => readMirrorIdentity(message) === assistantMirrorIdentity) : void 0)?.idempotencyKey);
6673
- return {
6674
- assistantTranscriptOwned,
6675
- ...assistantTranscriptIdempotencyKey ? { assistantTranscriptIdempotencyKey } : {},
6676
- mirroredMessages
6677
- };
6678
- } catch (error) {
6679
- embeddedAgentLog.warn("failed to mirror codex app-server transcript", { error });
6680
- return {
6681
- assistantTranscriptOwned: false,
6682
- mirroredMessages: []
6683
- };
6684
- }
6685
- }
6686
- async function resolveFinalCodexMirrorMessages(params) {
6687
- if (params.params.suppressNextUserMessagePersistence || !params.params.userTurnTranscriptRecorder) return params.messagesSnapshot;
6688
- const promptSnapshot = params.messagesSnapshot.find((message) => message.role === "user");
6689
- const resolvedBase = attachCodexMirrorIdentity(await buildResolvedCodexUserPromptMessage(params.params), `${params.turnId}:prompt`);
6690
- const upstreamUserText = readUpstreamUserText(promptSnapshot);
6691
- const resolvedPrompt = upstreamUserText ? attachUpstreamUserText(resolvedBase, upstreamUserText) : resolvedBase;
6692
- const firstUserIndex = params.messagesSnapshot.findIndex((message) => message.role === "user");
6693
- if (firstUserIndex === -1) return [resolvedPrompt, ...params.messagesSnapshot];
6694
- const messages = params.messagesSnapshot.slice();
6695
- messages[firstUserIndex] = resolvedPrompt;
6696
- return messages;
6697
- }
6698
- function createCodexAppServerUserMessagePersistenceNotifier(runParams) {
6699
- let notified = false;
6700
- return (message) => {
6701
- if (notified) return;
6702
- notified = true;
6703
- runParams.userTurnTranscriptRecorder?.markRuntimePersisted(message);
6704
- try {
6705
- runParams.onUserMessagePersisted?.(message);
6706
- } catch (error) {
6707
- embeddedAgentLog.warn("codex app-server user persistence notification failed", { error: formatErrorMessage(error) });
6708
- }
6709
- };
6710
- }
6711
- async function mirrorPromptAtTurnStartBestEffort(params) {
6712
- if (params.params.suppressNextUserMessagePersistence) return;
6713
- try {
6714
- const mirrorPromise = (async () => {
6715
- const userPromptMessage = projectAgentHarnessTranscriptMessageForDisplay({
6716
- hidden: params.params.trigger === "memory",
6717
- message: attachUpstreamUserText(attachCodexMirrorIdentity(await buildResolvedCodexUserPromptMessage(params.params), `${params.turnId}:prompt`), params.upstreamUserText)
6718
- });
6719
- const mirrorResult = await mirror({
6720
- agentId: params.agentId,
6721
- sessionKey: params.sessionKey,
6722
- sessionId: params.params.sessionId,
6723
- storePath: params.params.sessionTarget?.storePath,
6724
- cwd: params.cwd,
6725
- messages: [userPromptMessage],
6726
- idempotencyScope: `codex-app-server:${params.threadId}`,
6727
- config: params.params.config
6728
- });
6729
- for (const message of mirrorResult.userMessagesPresent) params.notifyUserMessagePersisted(message);
6730
- })();
6731
- params.params.userTurnTranscriptRecorder?.markRuntimePersistencePending(mirrorPromise);
6732
- await mirrorPromise;
6733
- } catch (error) {
6734
- embeddedAgentLog.warn("failed to mirror codex app-server prompt at turn start", { error });
6735
- }
6736
- }
6737
- function fingerprintMirrorMessageContent(message) {
6738
- const payload = JSON.stringify({
6739
- role: message.role,
6740
- content: message.content
6741
- });
6742
- return createHash("sha256").update(payload).digest("hex").slice(0, 16);
6743
- }
6744
- function buildMirrorDedupeIdentity(message) {
6745
- const explicit = readMirrorIdentity(message);
6746
- if (explicit) return explicit;
6747
- return `${message.role}:${fingerprintMirrorMessageContent(message)}`;
6748
- }
6749
- async function mirror(params) {
6750
- const messages = params.messages.filter(isMirroredAgentMessage);
6751
- if (messages.length === 0) return {
6752
- assistantMirrorIdentitiesOwned: [],
6753
- messagesPresent: [],
6754
- userMessagesPresent: []
6755
- };
6756
- const transcriptTarget = resolveCodexMirrorTranscriptTarget(params);
6757
- const { appendedUpdates, assistantMirrorIdentitiesOwned, messagesPresent, userMessagesPresent } = await withSessionTranscriptWriteLock({
6758
- ...transcriptTarget,
6759
- config: params.config
6760
- }, async (transcript) => {
6761
- const nextAppendedUpdates = [];
6762
- const nextAssistantMirrorIdentitiesOwned = /* @__PURE__ */ new Set();
6763
- const nextMessagesPresent = [];
6764
- const nextUserMessagesPresent = [];
6765
- const mirrorState = readTranscriptMirrorState(await transcript.readEvents());
6766
- let nextMessageSeq = mirrorState.messageCount;
6767
- for (const message of messages) {
6768
- const dedupeIdentity = buildMirrorDedupeIdentity(message);
6769
- const sourceFingerprint = fingerprintCodexMirrorSourceMessage(message);
6770
- const idempotencyKey = (message.role === "user" ? normalizeOptionalString(message.idempotencyKey) : void 0) ?? (params.idempotencyScope ? `${params.idempotencyScope}:${dedupeIdentity}` : void 0);
6771
- const transcriptMessage = {
6772
- ...attachCodexMirrorAttestation(message, sourceFingerprint),
6773
- ...idempotencyKey ? { idempotencyKey } : {}
6774
- };
6775
- if (idempotencyKey && mirrorState.idempotencyKeys.has(idempotencyKey)) {
6776
- const persistedMessage = mirrorState.messagesByIdempotencyKey.get(idempotencyKey);
6777
- if (persistedMessage) nextMessagesPresent.push(persistedMessage);
6778
- const persistedUserMessage = persistedMessage?.role === "user" ? persistedMessage : void 0;
6779
- if (persistedUserMessage) nextUserMessagesPresent.push(persistedUserMessage);
6780
- if (message.role === "assistant") nextAssistantMirrorIdentitiesOwned.add(dedupeIdentity);
6781
- continue;
6782
- }
6783
- const nextMessage = params.skipBeforeMessageWriteHooks ? transcriptMessage : runAgentHarnessBeforeMessageWriteHook({
6784
- message: transcriptMessage,
6785
- agentId: params.agentId,
6786
- sessionKey: params.sessionKey
6787
- });
6788
- if (!nextMessage) {
6789
- if (message.role === "assistant") nextAssistantMirrorIdentitiesOwned.add(dedupeIdentity);
6790
- continue;
6791
- }
6792
- let messageToAppend = idempotencyKey ? {
6793
- ...attachCodexMirrorAttestation(nextMessage, sourceFingerprint),
6794
- idempotencyKey
6795
- } : attachCodexMirrorAttestation(nextMessage, sourceFingerprint);
6796
- const mirrorIdentity = readMirrorIdentity(message);
6797
- if (mirrorIdentity) messageToAppend = attachCodexMirrorIdentity(messageToAppend, mirrorIdentity);
6798
- messageToAppend = projectAgentHarnessTranscriptMessageForDisplay({
6799
- hidden: message.display === false,
6800
- message: messageToAppend
6801
- });
6802
- const appended = await transcript.appendMessage({
6803
- message: messageToAppend,
6804
- idempotencyLookup: idempotencyKey ? "caller-checked" : "scan",
6805
- cwd: params.cwd
6806
- });
6807
- if (!appended) continue;
6808
- const { messageId, message: appendedMessage } = appended;
6809
- if (isMirroredAgentMessage(appendedMessage)) {
6810
- nextMessagesPresent.push(appendedMessage);
6811
- if (idempotencyKey) mirrorState.messagesByIdempotencyKey.set(idempotencyKey, appendedMessage);
6812
- }
6813
- if (message.role === "assistant") nextAssistantMirrorIdentitiesOwned.add(dedupeIdentity);
6814
- if (appendedMessage.role === "user") nextUserMessagesPresent.push(appendedMessage);
6815
- nextMessageSeq += 1;
6816
- nextAppendedUpdates.push({
6817
- messageId,
6818
- message: appendedMessage,
6819
- messageSeq: nextMessageSeq
6820
- });
6821
- if (idempotencyKey) mirrorState.idempotencyKeys.add(idempotencyKey);
6822
- }
6823
- return {
6824
- appendedUpdates: nextAppendedUpdates,
6825
- assistantMirrorIdentitiesOwned: [...nextAssistantMirrorIdentitiesOwned],
6826
- messagesPresent: nextMessagesPresent,
6827
- userMessagesPresent: nextUserMessagesPresent
6828
- };
6829
- });
6830
- for (const update of appendedUpdates) try {
6831
- await publishSessionTranscriptUpdateByIdentity({
6832
- ...transcriptTarget,
6833
- update: {
6834
- ...params.agentId ? { agentId: params.agentId } : {},
6835
- message: update.message,
6836
- messageId: update.messageId,
6837
- messageSeq: update.messageSeq,
6838
- sessionKey: transcriptTarget.sessionKey
6839
- }
6840
- });
6841
- } catch (error) {
6842
- embeddedAgentLog.warn("failed to publish codex app-server transcript update", { error: formatErrorMessage(error) });
6843
- }
6844
- return {
6845
- assistantMirrorIdentitiesOwned,
6846
- messagesPresent,
6847
- userMessagesPresent
6848
- };
6849
- }
6850
- const codexTranscriptMirrorRuntime = {
6851
- mirror,
6852
- mirrorBestEffort
6853
- };
6854
- function resolveCodexMirrorTranscriptTarget(params) {
6855
- const sessionKey = params.sessionKey?.trim();
6856
- const storePath = params.storePath?.trim();
6857
- if (!sessionKey || !storePath) throw new Error("Codex transcript mirror requires a runtime session identity");
6858
- return {
6859
- ...params.agentId ? { agentId: params.agentId } : {},
6860
- sessionId: params.sessionId,
6861
- sessionKey,
6862
- storePath
6863
- };
6864
- }
6865
- function readTranscriptMirrorState(events) {
6866
- const idempotencyKeys = /* @__PURE__ */ new Set();
6867
- const messagesByIdempotencyKey = /* @__PURE__ */ new Map();
6868
- let messageCount = 0;
6869
- for (const event of events) {
6870
- if (!event || typeof event !== "object" || Array.isArray(event)) continue;
6871
- const parsed = event;
6872
- if (parsed.type === "message") messageCount += 1;
6873
- if (typeof parsed.message?.idempotencyKey === "string") {
6874
- idempotencyKeys.add(parsed.message.idempotencyKey);
6875
- if (isMirroredAgentMessage(parsed.message)) messagesByIdempotencyKey.set(parsed.message.idempotencyKey, parsed.message);
6876
- }
6877
- }
6878
- return {
6879
- idempotencyKeys,
6880
- messagesByIdempotencyKey,
6881
- messageCount
6882
- };
6883
- }
6884
- //#endregion
6885
- export { readCodexTurnCompletedNotification as C, readCodexTurn as S, assertCodexThreadStartResponse as _, projectBoundedCodexThreadHistory as a, readCodexErrorNotification as b, fingerprintCodexMirrorSourceMessage as c, attachCodexMirrorIdentity as d, readMirrorIdentity as f, assertCodexThreadResumeResponse as g, assertCodexThreadForkResponse as h, mirrorPromptAtTurnStartBestEffort as i, readCodexMirrorSourceFingerprint as l, assertCodexThreadForkParams as m, createCodexAppServerUserMessagePersistenceNotifier as n, buildCodexUserPromptMessage as o, readUpstreamUserText as p, importCodexThreadHistoryToTranscript as r, promptSnapshot as s, codexTranscriptMirrorRuntime as t, serializeCodexMirrorSourceEvidence as u, assertCodexTurnStartResponse as v, readCodexModelListResponse as x, readCodexDynamicToolCallParams as y };
6337
+ export { assertCodexTurnStartResponse as a, readCodexModelListResponse as c, assertCodexThreadStartResponse as i, readCodexTurn as l, assertCodexThreadForkResponse as n, readCodexDynamicToolCallParams as o, assertCodexThreadResumeResponse as r, readCodexErrorNotification as s, assertCodexThreadForkParams as t, readCodexTurnCompletedNotification as u };
@@ -1,4 +1,4 @@
1
- import { Q as isJsonObject } from "./shared-client-wmgNFNYp.js";
1
+ import { V as isJsonObject } from "./shared-client-BVKE40c-.js";
2
2
  import { MAX_DATE_TIMESTAMP_MS, resolveExpiresAtMsFromEpochSeconds } from "openclaw/plugin-sdk/number-runtime";
3
3
  import { asFiniteNumber, parseStrictFiniteNumber } from "openclaw/plugin-sdk/string-coerce-runtime";
4
4
  import { expectDefined } from "openclaw/plugin-sdk/expect-runtime";