@openclaw/codex 2026.10.10-beta.3 → 2026.10.10-beta.4

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 (113) hide show
  1. package/dist/.setup/{account-usage-runtime-BOspqhfQ.mjs → account-usage-runtime-CO_i9_7B.mjs} +3 -3
  2. package/dist/.setup/{app-server-policy-Cog6mm2i.mjs → app-server-policy-CFCEWj0w.mjs} +1 -1
  3. package/dist/.setup/{apply-DVeFKzUL.mjs → apply-DvEtGGBB.mjs} +8 -8
  4. package/dist/.setup/{attempt-client-cleanup-BLp6z_DD.mjs → attempt-client-cleanup-Bj4T3tcX.mjs} +5 -5
  5. package/dist/.setup/{attempt-workspace-context-GYPLawX6.mjs → attempt-workspace-context-DxHd71bH.mjs} +1 -1
  6. package/dist/.setup/{auth-binding-830RLAJW.mjs → auth-binding-BY7Fm501.mjs} +1 -1
  7. package/dist/.setup/{auth-cache-key-aolg0chE.mjs → auth-cache-key-Do2ZQrNP.mjs} +3 -3
  8. package/dist/.setup/{binding-connection-GTgUj9pi.mjs → binding-connection-hJD5mFkM.mjs} +2 -2
  9. package/dist/.setup/{binding-connection.runtime-RcWR3vQu.mjs → binding-connection.runtime-Dap4qmsz.mjs} +1 -1
  10. package/dist/.setup/{bounded-turn-DJr0EXh7.mjs → bounded-turn-DnxnHHZP.mjs} +10 -10
  11. package/dist/.setup/{bounded-turn-isolation-D8CDrAVX.mjs → bounded-turn-isolation-Iz8EsqFg.mjs} +2 -2
  12. package/dist/.setup/{build-state-DswWyGqI.mjs → build-state-CpGXWSN4.mjs} +1 -1
  13. package/dist/.setup/{client-CPPD2q0Z.mjs → client-Bxe8bl-K.mjs} +8 -8
  14. package/dist/.setup/{client-catalog-response-FeIOBhaz.mjs → client-catalog-response-D-dEl0Ac.mjs} +1 -1
  15. package/dist/.setup/{client-initialize-CjgZcX61.mjs → client-initialize-CPNmLwhL.mjs} +1 -1
  16. package/dist/.setup/{command-dispatch-DlgDPLEv.mjs → command-dispatch-BD9-WK7I.mjs} +1 -1
  17. package/dist/.setup/{command-handlers-B7Kcgt8i.mjs → command-handlers-g046iNsp.mjs} +22 -22
  18. package/dist/.setup/{command-rpc-DomZ6_l8.mjs → command-rpc-CwpCTOrX.mjs} +11 -11
  19. package/dist/.setup/{compact-H5H5Cvbw.mjs → compact-B-qCn3BG.mjs} +13 -13
  20. package/dist/.setup/{computer-use-BFfXSTZw.mjs → computer-use-C0qJq1rh.mjs} +6 -6
  21. package/dist/.setup/{config-BfrAlTMT.mjs → config-BZYTxljj.mjs} +2 -2
  22. package/dist/.setup/{config-runtime-BZRizyuG.mjs → config-runtime-CqCrHEAU.mjs} +1 -1
  23. package/dist/.setup/{conversation-binding-DyiBKCA4.mjs → conversation-binding-CXGGbblk.mjs} +16 -16
  24. package/dist/.setup/{conversation-binding-data-khgW0n-o.mjs → conversation-binding-data-CAKQCqTL.mjs} +1 -1
  25. package/dist/.setup/{conversation-control-B2EpVZEb.mjs → conversation-control-CTZTP_rE.mjs} +3 -3
  26. package/dist/.setup/{doctor-start-options-8uIBXIzR.mjs → doctor-start-options-CpcBuzLb.mjs} +3 -3
  27. package/dist/.setup/{dynamic-tool-build-DkJpWzXt.mjs → dynamic-tool-build-BzTaCmlT.mjs} +3 -3
  28. package/dist/.setup/{dynamic-tools-UL4DHNTh.mjs → dynamic-tools-BALvjDwR.mjs} +8 -8
  29. package/dist/.setup/{effective-mcp-catalog-CvJiu5dn.mjs → effective-mcp-catalog-CQbEkKv_.mjs} +6 -6
  30. package/dist/.setup/{ephemeral-turn-C9iVxYQi.mjs → ephemeral-turn-CNm9tN72.mjs} +2 -2
  31. package/dist/.setup/{inference-context-BPwyk-Op.mjs → inference-context-DYpvCEF3.mjs} +1 -1
  32. package/dist/.setup/{inference-proxy-iJoMVyEy.mjs → inference-proxy-e1Rg8kr_.mjs} +1 -1
  33. package/dist/.setup/{installed-probe-lVC1X5ve.mjs → installed-probe-yc_w-vom.mjs} +3 -3
  34. package/dist/.setup/{isolated-completion-Bv8qIPw_.mjs → isolated-completion-B1mlyhKu.mjs} +5 -5
  35. package/dist/.setup/{managed-binary-DbKvGXKl.mjs → managed-binary-BwzkwiGo.mjs} +2 -2
  36. package/dist/.setup/{mcp-app-session-preparation-DtvMR_yX.mjs → mcp-app-session-preparation-CFbTbxia.mjs} +9 -9
  37. package/dist/.setup/{model-catalog-EWVLBn3F.mjs → model-catalog-BNSZklNP.mjs} +7 -7
  38. package/dist/.setup/{models-Bc4yyUrk.mjs → models-HgvyBseb.mjs} +3 -3
  39. package/dist/.setup/native-assignment-repair-BsWKjUjZ.mjs +162 -0
  40. package/dist/.setup/{native-auth-DpZIaY8N.mjs → native-auth-o_vw8KWa.mjs} +3 -3
  41. package/dist/.setup/{native-hook-relay-DbNYjwuC.mjs → native-hook-relay-COcu2b4l.mjs} +4 -4
  42. package/dist/.setup/{native-mcp-app-gkEJsgj2.mjs → native-mcp-app-CFyl3R2g.mjs} +5 -5
  43. package/dist/.setup/{native-skill-isolation-Cja6Nv79.mjs → native-skill-isolation-B8cWhSFy.mjs} +3 -3
  44. package/dist/.setup/{native-subagent-monitor-D1pYkirc.mjs → native-subagent-monitor-LJd5_D5F.mjs} +151 -47
  45. package/dist/.setup/{native-subagent-pending-assignments-CTinVtjo.mjs → native-subagent-pending-assignments-CX-LtYDX.mjs} +49 -11
  46. package/dist/.setup/{native-task-assignments-YJopbaVO.mjs → native-task-assignments-CMd-JiUS.mjs} +4 -4
  47. package/dist/.setup/{node-cli-sessions-BuJnBnEq.mjs → node-cli-sessions-C59CAyDh.mjs} +2 -2
  48. package/dist/.setup/{node-exec-server.runtime-CP7RC1Nd.mjs → node-exec-server.runtime-DvRSh5Oi.mjs} +2 -2
  49. package/dist/.setup/{plan-BUB3QGL7.mjs → plan-C3H9W_2P.mjs} +5 -5
  50. package/dist/.setup/{plugin-activation-CXPWe-hl.mjs → plugin-activation-Cj2k3W9n.mjs} +2 -2
  51. package/dist/.setup/{plugin-approval-roundtrip-BkiVPLuc.mjs → plugin-approval-roundtrip-DEbTgtVQ.mjs} +1 -1
  52. package/dist/.setup/{plugin-inventory-DE9wcaeH.mjs → plugin-inventory-BVP15PmN.mjs} +1 -1
  53. package/dist/.setup/{project-doc-thread-config-B0UI3f1D.mjs → project-doc-thread-config-Ds92xu17.mjs} +3 -3
  54. package/dist/.setup/{provider-Rt7awchu.mjs → provider-C1GuStnr.mjs} +4 -4
  55. package/dist/.setup/{provider-capabilities-C0laqfjE.mjs → provider-capabilities-DMfkFwZi.mjs} +1 -1
  56. package/dist/.setup/{request-DbU7VQMs.mjs → request-DTgD_jsY.mjs} +5 -5
  57. package/dist/.setup/{run-attempt-BFAgRiTd.mjs → run-attempt-DB4AY6QP.mjs} +127 -72
  58. package/dist/.setup/{runtime-artifact-CmLWeyJB.mjs → runtime-artifact-Bn_GvxjU.mjs} +3 -3
  59. package/dist/.setup/{runtime-artifact-connection-DpWlZ02e.mjs → runtime-artifact-connection-DCwh9tgV.mjs} +2 -2
  60. package/dist/.setup/{sandbox-guard-DneAfNye.mjs → sandbox-guard-CrzVgQUn.mjs} +1 -1
  61. package/dist/.setup/{session-binding-BgsWcbdY.mjs → session-binding-Dg0B6Zua.mjs} +38 -12
  62. package/dist/.setup/{session-binding-record-C_THntMe.mjs → session-binding-record-BpWF2Sus.mjs} +2 -2
  63. package/dist/.setup/{session-binding-sidecars-BNSS6WL4.mjs → session-binding-sidecars-C9uEGpDX.mjs} +1 -1
  64. package/dist/.setup/{session-cancellation-9l8N4EUL.mjs → session-cancellation-Bg94rN6N.mjs} +4 -4
  65. package/dist/.setup/{session-catalog-adoption-ppsLlVLB.mjs → session-catalog-adoption-D6pqS43M.mjs} +5 -5
  66. package/dist/.setup/{session-catalog-archive-CqLRHJ6z.mjs → session-catalog-archive-B-ZpAiiK.mjs} +5 -5
  67. package/dist/.setup/{session-catalog-events-CicBG92S.mjs → session-catalog-events-BmhPYZGw.mjs} +4 -4
  68. package/dist/.setup/{session-catalog-index-ft2e51lh.mjs → session-catalog-index-D7fccO1r.mjs} +8 -8
  69. package/dist/.setup/{session-catalog-index-order-0Zqng2u8.mjs → session-catalog-index-order-DyCNai_t.mjs} +1 -1
  70. package/dist/.setup/{session-catalog-limits-Dc6E0BZz.mjs → session-catalog-limits-CGjAZOTM.mjs} +1 -1
  71. package/dist/.setup/{session-catalog-list-request-CAjoWjaH.mjs → session-catalog-list-request-DGn9LMJY.mjs} +3 -3
  72. package/dist/.setup/{session-catalog-native-projection-CwOyRRXK.mjs → session-catalog-native-projection-HAmuA2-G.mjs} +4 -4
  73. package/dist/.setup/{session-catalog-node-adoption-e9v8mGgx.mjs → session-catalog-node-adoption-C_41f1dK.mjs} +2 -2
  74. package/dist/.setup/{session-catalog-node-continue-H7nrzcUD.mjs → session-catalog-node-continue-FuNSGUYz.mjs} +5 -5
  75. package/dist/.setup/{session-catalog-node-lookup-BrZfDkA8.mjs → session-catalog-node-lookup-BfHfknjz.mjs} +2 -2
  76. package/dist/.setup/{session-catalog-parsing-V6jyFg9g.mjs → session-catalog-parsing-ktmfo9oa.mjs} +1 -1
  77. package/dist/.setup/{session-catalog-projection-By1iGA1y.mjs → session-catalog-projection-C_w9yRCz.mjs} +4 -4
  78. package/dist/.setup/{session-catalog-source-DghHV4qB.mjs → session-catalog-source-BW46oF7X.mjs} +1 -1
  79. package/dist/.setup/{session-cli-CBGKiqdv.mjs → session-cli-COjTO3Dy.mjs} +1 -1
  80. package/dist/.setup/{session-history-import-BwPKwcNi.mjs → session-history-import-BZHN6RtG.mjs} +4 -4
  81. package/dist/.setup/{session-initialization-Dn3vveGv.mjs → session-initialization-Bztyf-sf.mjs} +1 -1
  82. package/dist/.setup/{session-retirement-D9qTLXqz.mjs → session-retirement-BHMs5nFf.mjs} +6 -6
  83. package/dist/.setup/{settled-turn-finalizer-Cn7yngMH.mjs → settled-turn-finalizer-C3OEC7ED.mjs} +5 -5
  84. package/dist/.setup/{shared-client-B8v6e5D0.mjs → shared-client-BelwlhWf.mjs} +63 -27
  85. package/dist/.setup/{side-question-DFFnd64D.mjs → side-question-Bt2vXr-h.mjs} +21 -21
  86. package/dist/.setup/{source-DTo8pzXK.mjs → source-DQN8P65G.mjs} +4 -4
  87. package/dist/.setup/{thread-lifecycle-run-DOC2IWpW.mjs → thread-lifecycle-run-aBfXzIGf.mjs} +36 -22
  88. package/dist/.setup/{thread-ownership-DJ8PPxRc.mjs → thread-ownership-DxW6b6fR.mjs} +4 -4
  89. package/dist/.setup/{thread-policy-UldER50x.mjs → thread-policy-j-BAwvSk.mjs} +3 -3
  90. package/dist/.setup/{thread-requests-BjawdIVV.mjs → thread-requests-6Dy8hyXF.mjs} +2 -2
  91. package/dist/.setup/{thread-resume-BZWI-rUL.mjs → thread-resume-CZxguYjc.mjs} +4 -4
  92. package/dist/.setup/{transcript-mirror-CEQJZlF3.mjs → transcript-mirror-5w4Hx1kt.mjs} +1 -1
  93. package/dist/.setup/{transport-stdio-Bq160Dhv.mjs → transport-stdio-BVeWgcK6.mjs} +1 -1
  94. package/dist/.setup/{transport-websocket-0YqiI_MH.mjs → transport-websocket-2Y-cL8kD.mjs} +1 -1
  95. package/dist/.setup/{turn-router-CaEj5E0i.mjs → turn-router-B62dF4CM.mjs} +1 -1
  96. package/dist/.setup/{upstream-session-fork-Dqf5_VFU.mjs → upstream-session-fork-5d_7cWPF.mjs} +17 -17
  97. package/dist/.setup/{usage-BfOJuCR7.mjs → usage-DSIlxJrx.mjs} +3 -3
  98. package/dist/.setup/{usage-limit-error-B0x1eymI.mjs → usage-limit-error-A0XP58jR.mjs} +1 -1
  99. package/dist/.setup/{web-search-provider.runtime-BwYKjmzK.mjs → web-search-provider.runtime-B-m9u2M1.mjs} +2 -2
  100. package/dist/.setup/{workspace-write-sandbox-probe-DJxOXcF3.mjs → workspace-write-sandbox-probe-D5OfU42L.mjs} +2 -2
  101. package/dist/.source-module-urls/6c41bd629a7a55e13b9ba84558fce30100391f4f229cc77b7c54b07fb0bfe9cf.json +1 -0
  102. package/dist/api.js +3 -3
  103. package/dist/catalog-page.worker.js +1 -1
  104. package/dist/cli-metadata.js +1 -1
  105. package/dist/client-version-api.js +3 -3
  106. package/dist/doctor-contract-api.js +14 -5
  107. package/dist/harness.js +21 -21
  108. package/dist/index.js +68 -58
  109. package/dist/media-understanding-provider.js +2 -2
  110. package/dist/migration-provider-api.js +1 -1
  111. package/dist/provider-discovery.js +1 -1
  112. package/openclaw.plugin.json +5 -0
  113. package/package.json +4 -4
@@ -1,17 +1,17 @@
1
- import { c as codexNativeSubagentRunId, d as readNativeSubagentThreadIds, f as readThreadParentThreadId, l as normalizeIdentifier, m as assertHistoryOwnerMatchesRegistration, p as readThreadSpawnSource, t as matchesNativeAssignmentLifecycle, u as readCodexNativeSubagentRunId } from "./native-subagent-pending-assignments-CTinVtjo.mjs";
1
+ import { d as readCodexNativeSubagentRunId, f as readNativeSubagentThreadIds, h as assertHistoryOwnerMatchesRegistration, l as codexNativeSubagentRunId, m as readThreadSpawnSource, p as readThreadParentThreadId, t as matchesNativeAssignmentLifecycle, u as normalizeIdentifier } from "./native-subagent-pending-assignments-CX-LtYDX.mjs";
2
2
  import { r as isJsonObject } from "./protocol-CaPAVwe9.mjs";
3
- import { n as defineCodexBuildState } from "./build-state-DswWyGqI.mjs";
3
+ import { n as defineCodexBuildState } from "./build-state-CpGXWSN4.mjs";
4
4
  import { a as readHookOutputEntries, o as readItem, s as readNullableString } from "./event-projector-values-yf4us9Pf.mjs";
5
5
  import { n as attachCodexMirrorIdentity } from "./upstream-prompt-provenance-Ccd9MFRJ.mjs";
6
6
  import { t as readCodexMirroredSessionHistoryMessages } from "./session-history-7W0cgTXF.mjs";
7
- import { A as hasCodexAppServerLiveThread, E as claimCodexAppServerLiveThread, V as retainCodexAppServerLiveThread } from "./shared-client-B8v6e5D0.mjs";
8
- import { j as readCodexAppServerWarningMessage } from "./client-CPPD2q0Z.mjs";
9
- import { C as unknownItemStatus, _ as itemName, b as matchesCodexSnapshotTurn, f as isMutatingNativeToolItem, g as itemKind, h as isSideEffectingNativeToolItem, l as auditNativeToolName, m as isProjectedNativeToolItem, p as isNonSuccessItemStatus, u as auditNativeToolTerminalStatus, v as itemStatus, y as itemTitle } from "./turn-router-CaEj5E0i.mjs";
10
- import { s as interruptCodexTurnAndWaitBestEffort, t as CODEX_APP_SERVER_INTERRUPT_TIMEOUT_MS } from "./attempt-client-cleanup-BLp6z_DD.mjs";
7
+ import { A as hasCodexAppServerLiveThread, E as claimCodexAppServerLiveThread, V as retainCodexAppServerLiveThread } from "./shared-client-BelwlhWf.mjs";
8
+ import { j as readCodexAppServerWarningMessage } from "./client-Bxe8bl-K.mjs";
9
+ import { C as unknownItemStatus, _ as itemName, b as matchesCodexSnapshotTurn, f as isMutatingNativeToolItem, g as itemKind, h as isSideEffectingNativeToolItem, l as auditNativeToolName, m as isProjectedNativeToolItem, p as isNonSuccessItemStatus, u as auditNativeToolTerminalStatus, v as itemStatus, y as itemTitle } from "./turn-router-B62dF4CM.mjs";
10
+ import { s as interruptCodexTurnAndWaitBestEffort, t as CODEX_APP_SERVER_INTERRUPT_TIMEOUT_MS } from "./attempt-client-cleanup-Bj4T3tcX.mjs";
11
11
  import { t as projectCodexWebSearchItem } from "./web-search-item-DHVuNSqk.mjs";
12
- import { n as codexApprovalTimeoutText } from "./plugin-approval-roundtrip-BkiVPLuc.mjs";
12
+ import { n as codexApprovalTimeoutText } from "./plugin-approval-roundtrip-DEbTgtVQ.mjs";
13
13
  import { t as resolveCodexLocalRuntimeAttribution } from "./local-runtime-attribution-CZz2DJ4q.mjs";
14
- import { t as __exportAll } from "./session-binding-sidecars-BNSS6WL4.mjs";
14
+ import { t as __exportAll } from "./session-binding-sidecars-C9uEGpDX.mjs";
15
15
  import { asFiniteNumber, asNonArrayRecord, normalizeOptionalString, readStringField } from "openclaw/plugin-sdk/string-coerce-runtime";
16
16
  import { randomUUID } from "node:crypto";
17
17
  import { asDateTimestampMs } from "openclaw/plugin-sdk/number-runtime";
@@ -574,7 +574,7 @@ var CodexNativeSubagentAssignmentInventory = class {
574
574
  this.dependencies = dependencies;
575
575
  this.writes = /* @__PURE__ */ new Map();
576
576
  this.snapshots = /* @__PURE__ */ new WeakMap();
577
- this.cancelled = /* @__PURE__ */ new WeakSet();
577
+ this.acknowledged = /* @__PURE__ */ new WeakSet();
578
578
  }
579
579
  hasWrites(state) {
580
580
  return this.writes.has(state);
@@ -612,7 +612,7 @@ var CodexNativeSubagentAssignmentInventory = class {
612
612
  }
613
613
  record(state, child) {
614
614
  const assignment = this.fact(child);
615
- if (!assignment || !state.assignmentStore || child.nativeCompletionDelivered || child.subscriptionClosed) return;
615
+ if (!assignment || !state.assignmentStore || child.nativeCompletionDelivered || child.completionDeliveryAbandoned || child.subscriptionClosed) return;
616
616
  const snapshot = JSON.stringify(assignment);
617
617
  if (this.snapshots.get(child) === snapshot) return;
618
618
  this.snapshots.set(child, snapshot);
@@ -627,12 +627,33 @@ var CodexNativeSubagentAssignmentInventory = class {
627
627
  }
628
628
  settle(state, child) {
629
629
  const assignment = this.fact(child);
630
- if (!assignment || !state.assignmentStore || !child.nativeCompletionDelivered && (!child.subscriptionClosed || child.pendingCompletion)) return;
630
+ if (!assignment || !state.assignmentStore || this.acknowledged.has(child) || !child.nativeCompletionDelivered && (!child.subscriptionClosed || child.pendingCompletion)) return;
631
631
  this.enqueue(state, async () => {
632
632
  await state.assignmentStore?.consume(assignment, () => this.dependencies.assertCurrent(state));
633
633
  });
634
634
  }
635
- settleCancelled(state, child, assertCurrent) {
635
+ abandon(state, child, assertCurrent) {
636
+ return this.enqueue(state, async () => {
637
+ const assignment = this.fact(child);
638
+ if (!assignment || !state.assignmentStore || !child.pendingCompletion) return;
639
+ if (!await state.assignmentStore.consume(assignment, () => {
640
+ this.dependencies.assertCurrent(state);
641
+ assertCurrent();
642
+ }, { status: child.pendingCompletion.status })) throw new Error("Undeliverable native assignment was not retired.");
643
+ });
644
+ }
645
+ async settleNestedCompletion(state, child, assertCurrent) {
646
+ const owner = child.historyOwner;
647
+ if (!owner || owner.parentThreadId === child.nativeParentThreadId || !await this.dependencies.isNativeChildThread(child.nativeParentThreadId)) return false;
648
+ await this.acknowledge(state, child, () => {
649
+ assertCurrent();
650
+ assertHistoryOwnerMatchesRegistration(owner, state.historyOwner, owner.parentThreadId, true);
651
+ });
652
+ child.nativeCompletionDelivered = true;
653
+ child.pendingCompletion = void 0;
654
+ return true;
655
+ }
656
+ acknowledge(state, child, assertCurrent) {
636
657
  return this.enqueue(state, async () => {
637
658
  const assertAdmission = () => {
638
659
  this.dependencies.assertCurrent(state);
@@ -640,9 +661,9 @@ var CodexNativeSubagentAssignmentInventory = class {
640
661
  };
641
662
  assertAdmission();
642
663
  const assignment = this.fact(child);
643
- if (!assignment || !state.assignmentStore || this.cancelled.has(child)) return;
644
- if (!await state.assignmentStore.consume(assignment, assertAdmission)) throw new Error("Cancelled native assignment was not acknowledged.");
645
- this.cancelled.add(child);
664
+ if (!assignment || !state.assignmentStore || this.acknowledged.has(child)) return;
665
+ if (!await state.assignmentStore.consume(assignment, assertAdmission)) throw new Error("Native assignment was not acknowledged.");
666
+ this.acknowledged.add(child);
646
667
  assertAdmission();
647
668
  });
648
669
  }
@@ -658,11 +679,14 @@ var CodexNativeSubagentAssignmentInventory = class {
658
679
  for (const assignment of assignments) {
659
680
  if (!matchesNativeAssignmentLifecycle(assignment.owner, current)) continue;
660
681
  const recovery = await this.dependencies.readHistory(assignment);
661
- await store.assertCurrentAsync();
682
+ const pending = await store.read();
662
683
  if (!this.dependencies.isCurrent(state) || !custody.isCurrent()) return;
663
684
  if (!recovery || recovery.parentThreadId !== assignment.nativeParentThreadId) continue;
664
- await this.dependencies.restore(state, assignment, recovery, custody);
665
- await this.drain(state);
685
+ const surviving = pending.find((entry) => entry.childThreadId === assignment.childThreadId && entry.nativeParentThreadId === assignment.nativeParentThreadId && matchesNativeAssignmentLifecycle(entry.owner, assignment.owner) && (entry.nativeTurnId === assignment.nativeTurnId && (entry.nativeTurnId !== void 0 || entry.runId === assignment.runId) || recovery.nativeTurnId !== void 0 && entry.nativeTurnId === recovery.nativeTurnId && (assignment.nativeTurnId === void 0 || entry.runId === assignment.runId)));
686
+ if (surviving) {
687
+ await this.dependencies.restore(state, surviving, recovery, custody);
688
+ await this.drain(state);
689
+ }
666
690
  }
667
691
  } catch (error) {
668
692
  embeddedAgentLog.warn("Native pending assignments remain for reconciliation", { error: formatErrorMessage$1(error) });
@@ -991,7 +1015,18 @@ var CodexNativeSubagentCompletionDelivery = class {
991
1015
  let deferredToForeground = false;
992
1016
  try {
993
1017
  if (childState.cancellationRequested && completion.status === "cancelled") return;
1018
+ if (await this.dependencies.settleNestedCompletion(state, childState, () => {
1019
+ if (!this.isCurrent(state, childState) || childState.completionCustody && !childState.completionCustody.isCurrent()) throw new Error("Native completion acknowledgement is no longer current.");
1020
+ })) {
1021
+ this.dependencies.unregisterChild(childState);
1022
+ return;
1023
+ }
1024
+ if (!this.isCurrent(state, childState)) return;
994
1025
  if (!this.prepareDelivery(state, childState)) return;
1026
+ if (childState.completionDeliveryAbandoned) {
1027
+ await this.abandon(state, childState);
1028
+ return;
1029
+ }
995
1030
  if (state.owners.size > 0 || !state.completionScope) {
996
1031
  deferredToForeground = state.owners.size > 0;
997
1032
  return;
@@ -1021,13 +1056,17 @@ var CodexNativeSubagentCompletionDelivery = class {
1021
1056
  this.prepareDelivery(state, childState);
1022
1057
  return;
1023
1058
  }
1024
- if (!this.claim(state, childState) || delivery.recoveryBlocked) {
1059
+ if (!this.claim(state, childState)) {
1025
1060
  this.dependencies.unregisterChild(childState);
1026
1061
  return;
1027
1062
  }
1063
+ if (delivery.recoveryBlocked) {
1064
+ await this.abandon(state, childState);
1065
+ return;
1066
+ }
1028
1067
  const recoveryPending = delivery.recoveryPending;
1029
1068
  const error = delivery.error ?? (recoveryPending ? "requester recovery owns completion" : "completion delivery did not produce a parent response");
1030
- this.scheduleRetry(childState, error, !recoveryPending);
1069
+ await this.scheduleRetry(state, childState, error, !recoveryPending);
1031
1070
  } catch (error) {
1032
1071
  if (!this.isCurrent(state, childState)) return;
1033
1072
  if (!this.claim(state, childState)) {
@@ -1035,7 +1074,7 @@ var CodexNativeSubagentCompletionDelivery = class {
1035
1074
  return;
1036
1075
  }
1037
1076
  const message = formatErrorMessage$1(error);
1038
- this.scheduleRetry(childState, message);
1077
+ await this.scheduleRetry(state, childState, message, !childState.completionDeliveryAbandoned);
1039
1078
  embeddedAgentLog.warn("Failed to deliver Codex native subagent completion", {
1040
1079
  parentThreadId: state.parentThreadId,
1041
1080
  childThreadId: completion.childThreadId,
@@ -1095,22 +1134,41 @@ var CodexNativeSubagentCompletionDelivery = class {
1095
1134
  this.dependencies.releaseClientRetentionIfIdle();
1096
1135
  return true;
1097
1136
  }
1098
- scheduleRetry(childState, error, chargeAttempt = true) {
1137
+ async abandon(state, child) {
1138
+ child.completionDeliveryAbandoned = true;
1139
+ try {
1140
+ await this.dependencies.abandon(state, child, () => {
1141
+ if (child.nativeCompletionDelivered || !this.isCurrent(state, child) || !this.claim(state, child)) throw new Error("Native completion retirement is no longer current.");
1142
+ });
1143
+ this.dependencies.unregisterChild(child);
1144
+ } catch (error) {
1145
+ if (this.isCurrent(state, child) && child.nativeCompletionDelivered) {
1146
+ this.prepareDelivery(state, child);
1147
+ return;
1148
+ }
1149
+ embeddedAgentLog.warn("Native completion retirement remains pending", {
1150
+ childThreadId: child.childThreadId,
1151
+ error: formatErrorMessage$1(error)
1152
+ });
1153
+ await this.scheduleRetry(state, child, formatErrorMessage$1(error), false);
1154
+ }
1155
+ }
1156
+ async scheduleRetry(state, childState, error, chargeAttempt = true) {
1099
1157
  if (!childState.pendingCompletion || childState.completionDeliveryTimer || this.dependencies.children.get(childState.runId) !== childState) return;
1100
1158
  if (chargeAttempt && childState.completionDeliveryAttempt >= this.maxRetries) {
1101
1159
  embeddedAgentLog.warn("Native subagent completion retries exhausted", {
1102
1160
  childThreadId: childState.childThreadId,
1103
1161
  error
1104
1162
  });
1105
- this.dependencies.unregisterChild(childState);
1163
+ await this.abandon(state, childState);
1106
1164
  return;
1107
1165
  }
1108
1166
  const delayMs = delayForAttempt(this.retryDelaysMs, chargeAttempt ? childState.completionDeliveryAttempt++ : childState.completionDeliveryAttempt);
1109
1167
  childState.completionDeliveryTimer = setTimeout(() => {
1110
1168
  childState.completionDeliveryTimer = void 0;
1111
1169
  if (this.dependencies.children.get(childState.runId) !== childState) return;
1112
- const state = this.dependencies.parents.get(childState.parentThreadId);
1113
- if (state) this.deliverPending(state, childState);
1170
+ const currentParent = this.dependencies.parents.get(childState.parentThreadId);
1171
+ if (currentParent) this.deliverPending(currentParent, childState);
1114
1172
  }, delayMs);
1115
1173
  childState.completionDeliveryTimer.unref();
1116
1174
  }
@@ -1118,7 +1176,7 @@ var CodexNativeSubagentCompletionDelivery = class {
1118
1176
  if (childState.completionCustody && !childState.completionCustody.isCurrent()) return false;
1119
1177
  const requesterSessionKey = state.requesterSessionKey?.trim();
1120
1178
  if (!requesterSessionKey) return true;
1121
- const key = `${requesterSessionKey}\0${childState.runId}`;
1179
+ const key = childState.deliveryOwnerKey ?? `${requesterSessionKey}\0${childState.nativeTurnId ? codexNativeSubagentRunId(childState.childThreadId, childState.nativeTurnId) : childState.runId}`;
1122
1180
  try {
1123
1181
  state.assignmentStore?.assertCurrent();
1124
1182
  assertHistoryOwnerMatchesRegistration(childState.historyOwner, state.historyOwner, childState.nativeParentThreadId, state.historyOwner !== void 0);
@@ -1359,6 +1417,11 @@ var CodexNativeSubagentHistoryRecovery = class {
1359
1417
  includeTurns
1360
1418
  }, { timeoutMs: THREAD_READ_TIMEOUT_MS });
1361
1419
  }
1420
+ async isNativeChildThread(threadId) {
1421
+ if (this.knownChildren.has(threadId)) return true;
1422
+ const response = await this.requestThreadRead(threadId, false);
1423
+ return response.thread.id === threadId && Boolean(readThreadParentThreadId(response.thread));
1424
+ }
1362
1425
  async read(assignment, options) {
1363
1426
  const { childThreadId } = assignment;
1364
1427
  const { recordedCompletion } = options;
@@ -2574,6 +2637,7 @@ var CodexNativeSubagentSubmissionOwner = class {
2574
2637
  if (!this.isObserving(state, custody) || !this.admitTurn(state, custody, turn, historyValidated)) return;
2575
2638
  custody.phase = "promoting";
2576
2639
  clearTimeout(custody.timer);
2640
+ custody.release();
2577
2641
  }
2578
2642
  settleChild(state, child) {
2579
2643
  for (const custody of this.pending.get(state)?.values() ?? []) {
@@ -4412,6 +4476,8 @@ var Monitor = class {
4412
4476
  parents: this.parentStates,
4413
4477
  retiredParents: this.retiredParentStates,
4414
4478
  unregisterChild: (child) => this.unregisterChild(child),
4479
+ abandon: (state, child, assertCurrent) => this.assignments.abandon(state, child, assertCurrent),
4480
+ settleNestedCompletion: (state, child, assertCurrent) => this.assignments.settleNestedCompletion(state, child, assertCurrent),
4415
4481
  releaseClientRetentionIfIdle: () => this.releaseClientRetentionIfIdle()
4416
4482
  });
4417
4483
  this.turnObservation = new CodexNativeSubagentTurnObservation({
@@ -4504,6 +4570,7 @@ var Monitor = class {
4504
4570
  state.assignmentStore?.assertCurrent();
4505
4571
  },
4506
4572
  isCurrent: (state) => this.isCurrentParent(state),
4573
+ isNativeChildThread: (threadId) => this.historyRecovery.isNativeChildThread(threadId),
4507
4574
  readHistory: (assignment) => this.historyRecovery.read({
4508
4575
  ...assignment,
4509
4576
  nativeTurnId: assignment.nativeTurnId
@@ -4514,7 +4581,7 @@ var Monitor = class {
4514
4581
  initialAssignment: !readCodexNativeSubagentRunId(assignment.runId)?.turnId
4515
4582
  }),
4516
4583
  restore: async (state, assignment, recovery, custody) => {
4517
- const existing = this.childStates.get(assignment.runId);
4584
+ const existing = this.childStates.get(assignment.runId) ?? [...this.childStates.values()].find((child) => assignment.nativeTurnId !== void 0 && child.childThreadId === assignment.childThreadId && child.nativeTurnId === assignment.nativeTurnId && child.nativeParentThreadId === assignment.nativeParentThreadId && child.historyOwner !== void 0 && matchesNativeAssignmentLifecycle(child.historyOwner, assignment.owner));
4518
4585
  if (existing) {
4519
4586
  const original = this.parentStates.get(existing.parentThreadId);
4520
4587
  if (original && original.requesterSessionKey === state.requesterSessionKey && original.historyOwner && state.historyOwner && matchesNativeAssignmentLifecycle(original.historyOwner, state.historyOwner)) original.assignmentStore = state.assignmentStore;
@@ -4642,15 +4709,33 @@ var Monitor = class {
4642
4709
  cancelledRequesters: []
4643
4710
  }));
4644
4711
  const matchesOwner = (owner) => owner.requesterAgentId === params.agentId && owner.requesterSessionKey === params.sessionKey && owner.requesterSessionId === params.sessionId && owner.requesterLifecycleRevision === params.lifecycleRevision && params.acceptsRequest(owner.requestCustody);
4645
- const preparingOwners = /* @__PURE__ */ new Map();
4646
- for (const state of this.parentStates.values()) if (state.preparing && !state.agentId && !state.historyOwner) {
4647
- const owner = [...state.pendingRegistrations ?? []].find(matchesOwner);
4648
- if (owner) preparingOwners.set(state, owner);
4712
+ const selectedOwners = /* @__PURE__ */ new Map();
4713
+ const stableOwners = /* @__PURE__ */ new Set();
4714
+ for (const state of this.parentStates.values()) {
4715
+ const owner = [...state.owners.values()].find(matchesOwner);
4716
+ if (owner) {
4717
+ selectedOwners.set(state, owner);
4718
+ stableOwners.add(owner);
4719
+ continue;
4720
+ }
4721
+ const pendingOwner = [...state.pendingRegistrations ?? []].find(matchesOwner);
4722
+ if (pendingOwner) selectedOwners.set(state, pendingOwner);
4723
+ }
4724
+ for (const child of this.childStates.values()) {
4725
+ const owner = child.modelExecution?.owner ?? child.directOwner;
4726
+ const state = this.parentStates.get(child.parentThreadId);
4727
+ if (state && owner && matchesOwner(owner) && params.acceptsRequest(child.requestCustody)) {
4728
+ selectedOwners.set(state, owner);
4729
+ stableOwners.add(owner);
4730
+ }
4649
4731
  }
4732
+ const hasSelectedOwner = (state) => {
4733
+ const owner = selectedOwners.get(state);
4734
+ return Boolean(owner && matchesOwner(owner) && (stableOwners.has(owner) || state.pendingRegistrations?.has(owner) || owner.descendantsCancelled));
4735
+ };
4650
4736
  const matches = (state) => {
4651
- if (state.agentId || state.historyOwner) return state.agentId === params.agentId && state.requesterSessionKey === params.sessionKey && state.historyOwner?.sessionId === params.sessionId && state.historyOwner?.lifecycleRevision === params.lifecycleRevision;
4652
- const owner = preparingOwners.get(state);
4653
- return Boolean(state.preparing && owner && matchesOwner(owner) && (state.pendingRegistrations?.has(owner) || owner.descendantsCancelled));
4737
+ if (state.agentId || state.historyOwner) return state.agentId === params.agentId && state.requesterSessionKey === params.sessionKey && state.historyOwner?.sessionId === params.sessionId && state.historyOwner?.lifecycleRevision === params.lifecycleRevision || hasSelectedOwner(state);
4738
+ return state.preparing === true && hasSelectedOwner(state);
4654
4739
  };
4655
4740
  if (!matches(parent)) throw new Error("Codex descendant cancellation requester generation changed");
4656
4741
  const states = [...this.parentStates.values()].filter(matches);
@@ -4676,7 +4761,15 @@ var Monitor = class {
4676
4761
  const deadline = performance.now() + CODEX_APP_SERVER_INTERRUPT_TIMEOUT_MS;
4677
4762
  const registrations = states.flatMap((state) => [...state.pendingRegistrations ?? []].filter(matchesOwner));
4678
4763
  const registrationResults = Promise.allSettled(registrations.map((owner) => waitForNativeCancellationWork(this.client, owner.registrationSettled ?? Promise.reject(/* @__PURE__ */ new Error("Codex pending registration has no settlement owner")), deadline)));
4679
- const selected = [...this.childStates.values()].filter((child) => child.historyOwner?.sessionId === params.sessionId && child.historyOwner?.lifecycleRevision === params.lifecycleRevision && states.some((state) => state.parentThreadId === child.parentThreadId) && params.acceptsRequest(child.requestCustody));
4764
+ const selectedOwnerChildren = /* @__PURE__ */ new Set();
4765
+ const matchesGeneration = (child) => {
4766
+ const owner = child.modelExecution?.owner ?? child.directOwner;
4767
+ const matched = child.historyOwner?.sessionId === params.sessionId && child.historyOwner?.lifecycleRevision === params.lifecycleRevision || Boolean(owner && matchesOwner(owner));
4768
+ if (owner && matched && matchesOwner(owner)) selectedOwnerChildren.add(child);
4769
+ return matched;
4770
+ };
4771
+ const matchesChild = (child) => matchesGeneration(child) || selectedOwnerChildren.has(child);
4772
+ const selected = [...this.childStates.values()].filter((child) => matchesGeneration(child) && states.some((state) => state.parentThreadId === child.parentThreadId) && params.acceptsRequest(child.requestCustody));
4680
4773
  const owners = new Set(states.flatMap((state) => [...state.owners.values(), ...state.pendingRegistrations ?? []]));
4681
4774
  for (const known of this.knownChildren.values()) if (states.includes(known.parent)) for (const pending of known.pendingTurns) {
4682
4775
  if (pending.admittedOwner) owners.add(pending.admittedOwner);
@@ -4700,7 +4793,7 @@ var Monitor = class {
4700
4793
  const requestCustody = child.requestCustody;
4701
4794
  const assertChild = () => {
4702
4795
  assertCurrent();
4703
- if (this.childStates.get(child.runId) !== child || this.currentChild(child.childThreadId) !== child || turnId !== void 0 && child.nativeTurnId !== turnId || child.requesterTurnRunId !== requesterTurnRunId || child.requestCustody !== requestCustody || !params.acceptsRequest(requestCustody) || child.historyOwner?.sessionId !== params.sessionId || child.historyOwner?.lifecycleRevision !== params.lifecycleRevision || child.completionCustody && !child.completionCustody.isCurrent()) throw new Error("Codex descendant assignment changed before cancellation");
4796
+ if (this.childStates.get(child.runId) !== child || this.currentChild(child.childThreadId) !== child || turnId !== void 0 && child.nativeTurnId !== turnId || child.requesterTurnRunId !== requesterTurnRunId || child.requestCustody !== requestCustody || !params.acceptsRequest(requestCustody) || !matchesChild(child) || child.completionCustody && !child.completionCustody.isCurrent()) throw new Error("Codex descendant assignment changed before cancellation");
4704
4797
  };
4705
4798
  assertChild();
4706
4799
  if (!child.terminal) {
@@ -4740,7 +4833,7 @@ var Monitor = class {
4740
4833
  assertChild();
4741
4834
  await this.submissions.settleCancelled(state, child, assertChild);
4742
4835
  assertChild();
4743
- await this.assignments.settleCancelled(state, child, assertChild);
4836
+ await this.assignments.acknowledge(state, child, assertChild);
4744
4837
  assertChild();
4745
4838
  this.unregisterChild(child);
4746
4839
  }
@@ -4750,7 +4843,7 @@ var Monitor = class {
4750
4843
  await this.submissions.drain(state);
4751
4844
  assertCurrent();
4752
4845
  }
4753
- if (child.requesterTurnRunId !== requesterTurnRunId || child.requestCustody !== requestCustody || child.historyOwner?.sessionId !== params.sessionId || child.historyOwner?.lifecycleRevision !== params.lifecycleRevision) throw new Error("Codex descendant requester changed during settlement");
4846
+ if (child.requesterTurnRunId !== requesterTurnRunId || child.requestCustody !== requestCustody || !matchesChild(child)) throw new Error("Codex descendant requester changed during settlement");
4754
4847
  return {
4755
4848
  killed: cancelled ? 1 : 0,
4756
4849
  cancelledRequesters: cancelled && requesterTurnRunId ? [{
@@ -4824,6 +4917,9 @@ var Monitor = class {
4824
4917
  });
4825
4918
  if (!capture) return;
4826
4919
  try {
4920
+ const known = this.knownChildren.get(request.threadId);
4921
+ const child = known ? this.admitFollowupChild(known) : void 0;
4922
+ if (child?.nativeTurnId === request.turnId && child.settledWithoutCompletion) this.resumeChild(child);
4827
4923
  await this.persistModelAssignment(request, capture);
4828
4924
  request.signal?.throwIfAborted();
4829
4925
  capture.assertCurrent();
@@ -5001,6 +5097,7 @@ var Monitor = class {
5001
5097
  childState.settledWithoutCompletion = false;
5002
5098
  childState.fallbackCompletion = void 0;
5003
5099
  this.releaseClientRetention ??= this.retainClient?.();
5100
+ this.retainParentThreadForChild(childState.parentThreadId);
5004
5101
  }
5005
5102
  settleResumableChild(childState) {
5006
5103
  if (childState.terminal) return;
@@ -5011,6 +5108,7 @@ var Monitor = class {
5011
5108
  releaseNativeDirectChild(childState);
5012
5109
  releaseNativeModelExecution(childState);
5013
5110
  this.recovery.clearRecoveryTimers(childState);
5111
+ this.releaseParentThreadIfChildrenSettled(childState.parentThreadId);
5014
5112
  this.releaseClientRetentionIfIdle();
5015
5113
  }
5016
5114
  handleChildTurnCompletion(notification, childState) {
@@ -5198,6 +5296,7 @@ var Monitor = class {
5198
5296
  this.recovery.markTerminalThread(childState.childThreadId, state.parentThreadId);
5199
5297
  releaseNativeDirectChild(childState);
5200
5298
  this.recovery.clearRecoveryTimers(childState);
5299
+ this.releaseParentThreadIfChildrenSettled(state.parentThreadId);
5201
5300
  this.completionDelivery.applyReceipts(state, childState.deliveryReceipts.record(childState.runId, this.knownChildren.get(childState.childThreadId)?.agentPaths ?? [childState.childThreadId], acceptedCompletion.result));
5202
5301
  await this.completionDelivery.deliverPending(state, childState);
5203
5302
  }
@@ -5263,10 +5362,7 @@ var Monitor = class {
5263
5362
  if (!childState) {
5264
5363
  this.updateChildThreadOwnership("claim", childThreadId, this.claimChildThread);
5265
5364
  this.releaseClientRetention ??= this.retainClient?.();
5266
- if (!this.parentThreadRetentions.has(parentThreadId)) {
5267
- const releaseParentThread = this.retainParentThread?.(parentThreadId);
5268
- if (releaseParentThread) this.parentThreadRetentions.set(parentThreadId, releaseParentThread);
5269
- }
5365
+ this.retainParentThreadForChild(parentThreadId);
5270
5366
  childState = {
5271
5367
  runId,
5272
5368
  requestCustody: options.directOwner?.requestCustody,
@@ -5501,6 +5597,7 @@ var Monitor = class {
5501
5597
  }
5502
5598
  if (!transitioned) claimOwner.onDirectChildAccepted?.();
5503
5599
  }
5600
+ this.observeActiveChild(child);
5504
5601
  this.admissionCustody.bindEventSink(child);
5505
5602
  return child;
5506
5603
  }
@@ -5552,11 +5649,7 @@ var Monitor = class {
5552
5649
  this.recovery.clearRecoveryTimers(childState);
5553
5650
  this.completionDelivery.release(childState);
5554
5651
  if (this.childStates.get(childState.runId) === childState) this.childStates.delete(childState.runId);
5555
- if (!this.hasChildrenForParent(childState.parentThreadId)) {
5556
- const releaseParentThread = this.parentThreadRetentions.get(childState.parentThreadId);
5557
- this.parentThreadRetentions.delete(childState.parentThreadId);
5558
- releaseParentThread?.();
5559
- }
5652
+ this.releaseParentThreadIfChildrenSettled(childState.parentThreadId);
5560
5653
  this.releaseClientRetentionIfIdle();
5561
5654
  const state = this.parentStates.get(childState.parentThreadId);
5562
5655
  if (state) {
@@ -5614,6 +5707,17 @@ var Monitor = class {
5614
5707
  for (const known of this.knownChildren.values()) if (known.parent === state && this.currentChild(known.assignment.childThreadId)) return true;
5615
5708
  return false;
5616
5709
  }
5710
+ retainParentThreadForChild(parentThreadId) {
5711
+ if (this.parentThreadRetentions.has(parentThreadId)) return;
5712
+ const releaseParentThread = this.retainParentThread?.(parentThreadId);
5713
+ if (releaseParentThread) this.parentThreadRetentions.set(parentThreadId, releaseParentThread);
5714
+ }
5715
+ releaseParentThreadIfChildrenSettled(parentThreadId) {
5716
+ for (const childState of this.childStates.values()) if (childState.parentThreadId === parentThreadId && !childState.terminal && !childState.settledWithoutCompletion) return;
5717
+ const releaseParentThread = this.parentThreadRetentions.get(parentThreadId);
5718
+ this.parentThreadRetentions.delete(parentThreadId);
5719
+ releaseParentThread?.();
5720
+ }
5617
5721
  hasChildrenForParent(parentThreadId) {
5618
5722
  for (const childState of this.childStates.values()) if (childState.parentThreadId === parentThreadId) return true;
5619
5723
  return false;
@@ -151,7 +151,7 @@ const assignmentSchema = z.object({
151
151
  const inventorySchema = z.object({
152
152
  version: z.literal(1),
153
153
  assignments: z.array(assignmentSchema)
154
- }).strict().refine(({ assignments }) => new Set(assignments.map((entry) => entry.runId)).size === assignments.length);
154
+ }).strict();
155
155
  /** Native parent rotation is not physical requester or connection adoption. */
156
156
  function matchesNativeAssignmentLifecycle(saved, current) {
157
157
  return saved.sessionId === current.sessionId && saved.lifecycleRevision === current.lifecycleRevision && saved.connectionFingerprint === current.connectionFingerprint;
@@ -159,29 +159,67 @@ function matchesNativeAssignmentLifecycle(saved, current) {
159
159
  function readNativePendingAssignments(value) {
160
160
  if (value === void 0) return;
161
161
  const parsed = inventorySchema.safeParse(value);
162
- if (!parsed.success) throw new Error("Invalid Codex native pending assignment metadata.");
162
+ if (!parsed.success || new Set(parsed.data.assignments.map((entry) => entry.runId)).size !== parsed.data.assignments.length) throw new Error("Invalid Codex native pending assignment metadata.");
163
163
  return parsed.data;
164
164
  }
165
+ function mergeNativeAssignmentMetadata(current, incoming) {
166
+ const genericRunId = codexNativeSubagentRunId(current.childThreadId);
167
+ if (current.runId !== incoming.runId && current.runId !== genericRunId && incoming.runId !== genericRunId || current.submission && incoming.submission && !isDeepStrictEqual(current.submission, incoming.submission) || current.recordedCompletion && incoming.recordedCompletion && !isDeepStrictEqual(current.recordedCompletion, incoming.recordedCompletion)) throw new Error("Conflicting Codex native pending assignment metadata.");
168
+ if (current.runId === genericRunId) current.runId = incoming.runId;
169
+ if (incoming.submission) current.submission = incoming.submission;
170
+ if (incoming.recordedCompletion) current.recordedCompletion = incoming.recordedCompletion;
171
+ }
172
+ /** Doctor and binding writes merge compatible facts for one obligation, never distinct turns. */
173
+ function normalizeNativePendingAssignments(value) {
174
+ if (value === void 0) return;
175
+ return {
176
+ version: 1,
177
+ assignments: mergeNativePendingAssignments(inventorySchema.parse(value).assignments)
178
+ };
179
+ }
180
+ function mergeNativePendingAssignments(entries) {
181
+ const assignments = [];
182
+ for (const entry of entries) {
183
+ const existing = assignments.find((saved) => saved.childThreadId === entry.childThreadId && saved.nativeTurnId === entry.nativeTurnId && (entry.nativeTurnId !== void 0 || saved.runId === entry.runId));
184
+ if (!existing) {
185
+ assignments.push(entry);
186
+ continue;
187
+ }
188
+ if (existing.nativeParentThreadId !== entry.nativeParentThreadId || !isDeepStrictEqual(existing.owner, entry.owner)) throw new Error("Conflicting Codex native pending assignment metadata.");
189
+ mergeNativeAssignmentMetadata(existing, entry);
190
+ }
191
+ if (new Set(assignments.map((entry) => entry.runId)).size !== assignments.length) throw new Error("Conflicting Codex native pending assignment metadata.");
192
+ return assignments;
193
+ }
165
194
  function mutateNativePendingAssignments(params) {
166
- const current = readNativePendingAssignments(params.current);
167
- const assignment = assignmentSchema.parse(params.assignment);
195
+ const current = normalizeNativePendingAssignments(params.current);
196
+ let assignment = assignmentSchema.parse(params.assignment);
168
197
  const owner = codexNativeSubagentHistoryOwnerSchema.parse(params.owner);
169
198
  if (!matchesNativeAssignmentLifecycle(assignment.owner, owner)) return { applied: false };
170
199
  const assignments = current?.assignments ?? [];
171
- const existing = assignments.find((entry) => entry.runId === assignment.runId);
172
- if (existing && (!isDeepStrictEqual(existing.owner, assignment.owner) || existing.nativeParentThreadId !== assignment.nativeParentThreadId || existing.childThreadId !== assignment.childThreadId) || params.consume && (!existing || existing.nativeTurnId !== assignment.nativeTurnId)) return { applied: false };
200
+ const existing = assignments.find((entry) => entry.runId === assignment.runId) ?? assignments.find((entry) => assignment.nativeTurnId !== void 0 && entry.childThreadId === assignment.childThreadId && entry.nativeTurnId === assignment.nativeTurnId);
201
+ if (params.consume && !existing) return {
202
+ applied: false,
203
+ absent: true
204
+ };
205
+ if (existing && (!isDeepStrictEqual(existing.owner, assignment.owner) || existing.nativeParentThreadId !== assignment.nativeParentThreadId || existing.childThreadId !== assignment.childThreadId) || params.consume && existing?.nativeTurnId !== assignment.nativeTurnId) return { applied: false };
173
206
  const remaining = assignments.filter((entry) => entry !== existing);
174
207
  if (!params.consume) {
175
- if (existing?.recordedCompletion && !assignment.recordedCompletion) assignment.recordedCompletion = existing.recordedCompletion;
208
+ if (existing && existing.nativeTurnId === assignment.nativeTurnId) {
209
+ mergeNativeAssignmentMetadata(existing, assignment);
210
+ assignment = existing;
211
+ } else if (existing?.recordedCompletion && !assignment.recordedCompletion) assignment.recordedCompletion = existing.recordedCompletion;
176
212
  remaining.push(assignment);
177
213
  }
214
+ const next = !params.consume && existing && existing.nativeTurnId !== assignment.nativeTurnId ? mergeNativePendingAssignments(remaining) : remaining;
178
215
  return {
179
216
  applied: true,
180
- next: remaining.length ? {
217
+ next: next.length ? {
181
218
  version: 1,
182
- assignments: remaining
183
- } : void 0
219
+ assignments: next
220
+ } : void 0,
221
+ consumed: params.consume ? existing : void 0
184
222
  };
185
223
  }
186
224
  //#endregion
187
- export { readCodexNativeSubagentHistoryOwner as _, matchesCodexNativeSubagentSubmissionOwner as a, codexNativeSubagentRunId as c, readNativeSubagentThreadIds as d, readThreadParentThreadId as f, createCodexNativeSubagentHistoryOwner as g, codexNativeSubagentHistoryConnectionFingerprint as h, adoptCodexNativeSubagentSubmissions as i, normalizeIdentifier as l, assertHistoryOwnerMatchesRegistration as m, mutateNativePendingAssignments as n, mutateCodexNativeSubagentSubmissions as o, readThreadSpawnSource as p, readNativePendingAssignments as r, readCodexNativeSubagentSubmissions as s, matchesNativeAssignmentLifecycle as t, readCodexNativeSubagentRunId as u };
225
+ export { createCodexNativeSubagentHistoryOwner as _, adoptCodexNativeSubagentSubmissions as a, readCodexNativeSubagentSubmissions as c, readCodexNativeSubagentRunId as d, readNativeSubagentThreadIds as f, codexNativeSubagentHistoryConnectionFingerprint as g, assertHistoryOwnerMatchesRegistration as h, readNativePendingAssignments as i, codexNativeSubagentRunId as l, readThreadSpawnSource as m, mutateNativePendingAssignments as n, matchesCodexNativeSubagentSubmissionOwner as o, readThreadParentThreadId as p, normalizeNativePendingAssignments as r, mutateCodexNativeSubagentSubmissions as s, matchesNativeAssignmentLifecycle as t, normalizeIdentifier as u, readCodexNativeSubagentHistoryOwner as v };
@@ -1,4 +1,4 @@
1
- import { _ as readCodexNativeSubagentHistoryOwner, h as codexNativeSubagentHistoryConnectionFingerprint, r as readNativePendingAssignments, u as readCodexNativeSubagentRunId } from "./native-subagent-pending-assignments-CTinVtjo.mjs";
1
+ import { d as readCodexNativeSubagentRunId, g as codexNativeSubagentHistoryConnectionFingerprint, i as readNativePendingAssignments, v as readCodexNativeSubagentHistoryOwner } from "./native-subagent-pending-assignments-CX-LtYDX.mjs";
2
2
  import { i as CODEX_APP_SERVER_BINDING_NAMESPACE, r as CODEX_APP_SERVER_BINDING_MAX_ENTRIES } from "./session-binding-meta-Lkm5Lpf4.mjs";
3
3
  import { isDeepStrictEqual } from "node:util";
4
4
  import { z } from "zod";
@@ -56,7 +56,7 @@ async function inspect(params) {
56
56
  if (extractErrorCode(error) === "ENOENT") return [];
57
57
  throw error;
58
58
  }
59
- const { bindingStoreKey, readStoredCodexAppServerBinding } = await import("./session-binding-record-C_THntMe.mjs").then((n) => n._);
59
+ const { bindingStoreKey, readStoredCodexAppServerBinding } = await import("./session-binding-record-BpWF2Sus.mjs").then((n) => n._);
60
60
  const { executeSqliteQuerySync, getNodeSqliteKysely, openNodeSqliteDatabase, prepareSqliteReadOnlyLocation, tableExists } = await import("openclaw/plugin-sdk/sqlite-runtime");
61
61
  const snapshot = await prepareSqliteReadOnlyLocation(source, { preserveSourceArtifacts: true });
62
62
  try {
@@ -126,7 +126,7 @@ function prepareAssignment(task, stored, params, { getSessionEntry, resolveStore
126
126
  }
127
127
  async function settleHistoricalDelivery(task, key, observedBinding, params, sessionStore) {
128
128
  const { executeSqliteQuerySync, getNodeSqliteKysely, openNodeSqliteDatabase, resolveExistingSqliteFileUri, runSqliteImmediateTransactionSync } = await import("openclaw/plugin-sdk/sqlite-runtime");
129
- const { readStoredCodexAppServerBinding } = await import("./session-binding-record-C_THntMe.mjs").then((n) => n._);
129
+ const { readStoredCodexAppServerBinding } = await import("./session-binding-record-BpWF2Sus.mjs").then((n) => n._);
130
130
  const db = openNodeSqliteDatabase(resolveExistingSqliteFileUri(databasePath(params)));
131
131
  try {
132
132
  const sql = getNodeSqliteKysely(db);
@@ -170,7 +170,7 @@ const codexNativeTaskAssignmentMigration = {
170
170
  changes: [],
171
171
  warnings
172
172
  };
173
- const { bindingStoreKey, readStoredCodexAppServerBinding } = await import("./session-binding-record-C_THntMe.mjs").then((n) => n._);
173
+ const { bindingStoreKey, readStoredCodexAppServerBinding } = await import("./session-binding-record-BpWF2Sus.mjs").then((n) => n._);
174
174
  const { getSessionEntry, resolveStorePath } = await import("openclaw/plugin-sdk/session-store-runtime");
175
175
  const sessionStore = {
176
176
  getSessionEntry,
@@ -1,4 +1,4 @@
1
- import { A as unwrapNodeInvokePayload, x as readBoundedOptionalString } from "./session-catalog-parsing-V6jyFg9g.mjs";
1
+ import { A as unwrapNodeInvokePayload, x as readBoundedOptionalString } from "./session-catalog-parsing-ktmfo9oa.mjs";
2
2
  import { r as resolveCodexAppServerUserHomeDir } from "./auth-start-options-BPIPeEX8.mjs";
3
3
  import { o as formatCodexDisplayText } from "./command-formatters-B_7-QZ1c.mjs";
4
4
  import { t as codexCatalogHomeId } from "./session-catalog-home-id-vlih0B_g.mjs";
@@ -197,7 +197,7 @@ async function resumeCodexCliSessionOnNode(params) {
197
197
  let catalogHomeId;
198
198
  if (params.sessionKey) {
199
199
  const storePath = params.storePath ?? params.runtime.agent.session.resolveStorePath(void 0, { agentId: params.agentId });
200
- const { adoptionSessionKeyRest, CODEX_NODE_SESSION_KEY_PREFIX, readNodeSessionMarker } = await import("./session-catalog-node-adoption-e9v8mGgx.mjs");
200
+ const { adoptionSessionKeyRest, CODEX_NODE_SESSION_KEY_PREFIX, readNodeSessionMarker } = await import("./session-catalog-node-adoption-C_41f1dK.mjs");
201
201
  const entry = await params.runtime.agent.session.getSessionEntryAsync({
202
202
  agentId: params.agentId,
203
203
  storePath,
@@ -1,5 +1,5 @@
1
- import { a as isManagedCodexDesktopCommand, f as resolveManagedCodexNativeCommand, u as resolveManagedCodexAppServerStartOptions } from "./managed-binary-DbKvGXKl.mjs";
2
- import { o as closeCodexAppServerTransportAndWait, t as createStdioTransport } from "./transport-stdio-Bq160Dhv.mjs";
1
+ import { a as isManagedCodexDesktopCommand, f as resolveManagedCodexNativeCommand, u as resolveManagedCodexAppServerStartOptions } from "./managed-binary-BwzkwiGo.mjs";
2
+ import { o as closeCodexAppServerTransportAndWait, t as createStdioTransport } from "./transport-stdio-BVeWgcK6.mjs";
3
3
  import { isRecord } from "openclaw/plugin-sdk/string-coerce-runtime";
4
4
  import { stripVTControlCharacters } from "node:util";
5
5
  import { killProcessTree } from "openclaw/plugin-sdk/process-runtime";
@@ -1,8 +1,8 @@
1
1
  import { t as isOnlyMigrationKind } from "./scope-DOC1Xjc8.mjs";
2
- import { u as CODEX_PLUGINS_MARKETPLACE_NAME } from "./plugin-inventory-DE9wcaeH.mjs";
3
- import "./config-BfrAlTMT.mjs";
2
+ import { u as CODEX_PLUGINS_MARKETPLACE_NAME } from "./plugin-inventory-BVP15PmN.mjs";
3
+ import "./config-BZYTxljj.mjs";
4
4
  import { t as readCodexExperimentalFeature } from "./experimental-features-uGnVDtp-.mjs";
5
- import { i as hasCodexSource, n as defaultCodexHome, o as readJsonObject, r as discoverCodexSource, s as sanitizeName, t as codexPluginMigrationSubscriptionWarning } from "./source-DTo8pzXK.mjs";
5
+ import { i as hasCodexSource, n as defaultCodexHome, o as readJsonObject, r as discoverCodexSource, s as sanitizeName, t as codexPluginMigrationSubscriptionWarning } from "./source-DQN8P65G.mjs";
6
6
  import { asBoolean, asOptionalRecord, isRecord, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
7
7
  import { createHash } from "node:crypto";
8
8
  import { runCommandBuffered } from "openclaw/plugin-sdk/process-runtime";
@@ -98,8 +98,8 @@ async function readCodexCliCredentialsAsync(options) {
98
98
  options.signal?.throwIfAborted();
99
99
  if (!options.allowKeychainPrompt) return;
100
100
  const home = await fs.realpath(options.codexHome).catch(() => path.resolve(options.codexHome));
101
- const { CodexAppServerClient } = await import("./client-CPPD2q0Z.mjs").then((n) => n.n);
102
- const { resolveManagedCodexPackageEntrypoint, resolveManagedCodexNativeCommand } = await import("./managed-binary-DbKvGXKl.mjs").then((n) => n.o);
101
+ const { CodexAppServerClient } = await import("./client-Bxe8bl-K.mjs").then((n) => n.n);
102
+ const { resolveManagedCodexPackageEntrypoint, resolveManagedCodexNativeCommand } = await import("./managed-binary-BwzkwiGo.mjs").then((n) => n.o);
103
103
  const launcher = resolveManagedCodexPackageEntrypoint(path.dirname(fileURLToPath(import.meta.url)));
104
104
  const command = launcher ? resolveManagedCodexNativeCommand(launcher) : void 0;
105
105
  if (!command) return;
@@ -1,6 +1,6 @@
1
1
  import { r as CodexAppServerRpcError } from "./rpc-error-DemqqaxE.mjs";
2
- import { i as listCodexPluginMetadata, n as findCodexMarketplacePluginSummary, o as pluginReadParams, r as isOpenAiCuratedMarketplaceName, t as createCodexAppInventoryRequest, u as CODEX_PLUGINS_MARKETPLACE_NAME } from "./plugin-inventory-DE9wcaeH.mjs";
3
- import "./config-BfrAlTMT.mjs";
2
+ import { i as listCodexPluginMetadata, n as findCodexMarketplacePluginSummary, o as pluginReadParams, r as isOpenAiCuratedMarketplaceName, t as createCodexAppInventoryRequest, u as CODEX_PLUGINS_MARKETPLACE_NAME } from "./plugin-inventory-BVP15PmN.mjs";
3
+ import "./config-BZYTxljj.mjs";
4
4
  import { coerceErrorMessage } from "openclaw/plugin-sdk/error-runtime";
5
5
  //#region extensions/codex/src/app-server/plugin-activation.ts
6
6
  /** Activates legacy curated plugins without granting install authority to other marketplaces. */
@@ -1,4 +1,4 @@
1
- import { ft as resolveCodexGatewayTimeoutWithGraceMs } from "./shared-client-B8v6e5D0.mjs";
1
+ import { pt as resolveCodexGatewayTimeoutWithGraceMs } from "./shared-client-BelwlhWf.mjs";
2
2
  import { truncateUtf16Safe } from "openclaw/plugin-sdk/text-utility-runtime";
3
3
  import { isApprovalNotFoundError, toErrorObject } from "openclaw/plugin-sdk/error-runtime";
4
4
  import { racePromiseWithAbortSignal } from "openclaw/plugin-sdk/time-runtime";
@@ -1,5 +1,5 @@
1
1
  import { c as findCodexAppById } from "./plugin-app-cache-key-DRb-niJc.mjs";
2
- import "./config-BfrAlTMT.mjs";
2
+ import "./config-BZYTxljj.mjs";
3
3
  import { embeddedAgentLog } from "openclaw/plugin-sdk/agent-harness-runtime";
4
4
  //#region extensions/codex/src/app-server/config-contracts.ts
5
5
  const CODEX_PLUGINS_MARKETPLACE_NAME = "openai-curated";