@openclaw/codex 2026.10.7 → 2026.10.9

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/README.md +2 -0
  2. package/dist/.setup/{account-usage-runtime-gzHf_Qtb.mjs → account-usage-runtime-DAt_3QG0.mjs} +3 -3
  3. package/dist/.setup/{app-server-policy-V8zuN8q_.mjs → app-server-policy-CF-JwGUD.mjs} +1 -1
  4. package/dist/.setup/{apply-BaBl0hiG.mjs → apply-DmhHTC5c.mjs} +8 -8
  5. package/dist/.setup/{attempt-client-cleanup-jWVRH043.mjs → attempt-client-cleanup-DQBa7iiq.mjs} +5 -5
  6. package/dist/.setup/{attempt-workspace-context-BkA0W8Jy.mjs → attempt-workspace-context-EAeScFrg.mjs} +1 -1
  7. package/dist/.setup/{auth-binding-BFTkrP_b.mjs → auth-binding-D1TJwzWf.mjs} +1 -1
  8. package/dist/.setup/{auth-cache-key-DrieYJUQ.mjs → auth-cache-key-KogLtj0t.mjs} +3 -3
  9. package/dist/.setup/{binding-connection-C0t9TBX_.mjs → binding-connection-BIo1-hoT.mjs} +2 -2
  10. package/dist/.setup/{binding-connection.runtime-Wdm5G_bw.mjs → binding-connection.runtime-C5yDsKBQ.mjs} +1 -1
  11. package/dist/.setup/{bounded-turn-s9yVsxaM.mjs → bounded-turn-B91suzbV.mjs} +11 -11
  12. package/dist/.setup/{bounded-turn-isolation-CIQJykuM.mjs → bounded-turn-isolation-BRNgfoRl.mjs} +2 -2
  13. package/dist/.setup/{build-state-B5mKL-in.mjs → build-state-CvGKuaeP.mjs} +1 -1
  14. package/dist/.setup/{client-BM97zH3z.mjs → client-CafYfF2n.mjs} +311 -24
  15. package/dist/.setup/{command-dispatch-DsaWfzET.mjs → command-dispatch-C2tNChTq.mjs} +1 -1
  16. package/dist/.setup/{command-handlers-zgDE_J40.mjs → command-handlers-yb5vwwrx.mjs} +22 -22
  17. package/dist/.setup/{command-rpc-CAG1xrqm.mjs → command-rpc-CZmpQF4z.mjs} +11 -11
  18. package/dist/.setup/{compact-BZK-e5zD.mjs → compact-CeD2d2_k.mjs} +13 -13
  19. package/dist/.setup/{computer-use-CZhx4nNO.mjs → computer-use-C4HhkAcj.mjs} +7 -7
  20. package/dist/.setup/{config-LQemoqTL.mjs → config-d0gOFYEk.mjs} +2 -2
  21. package/dist/.setup/{config-runtime-DGB1-VbB.mjs → config-runtime-BUH-IDVE.mjs} +1 -1
  22. package/dist/.setup/{conversation-binding-qGuQR4jw.mjs → conversation-binding-HX8U8A3K.mjs} +15 -15
  23. package/dist/.setup/{conversation-binding-data-GRGSgAro.mjs → conversation-binding-data-BqzGWkPW.mjs} +1 -1
  24. package/dist/.setup/{conversation-control-BtPxevoK.mjs → conversation-control-D5qVEey9.mjs} +3 -3
  25. package/dist/.setup/{doctor-start-options-C28ek2hD.mjs → doctor-start-options-DyLrwtq-.mjs} +3 -3
  26. package/dist/.setup/{dynamic-tool-build-Dp4v52Kl.mjs → dynamic-tool-build-BPkHfpul.mjs} +3 -3
  27. package/dist/.setup/{dynamic-tools-C1Egdhrx.mjs → dynamic-tools-CCezdz5n.mjs} +8 -8
  28. package/dist/.setup/{effective-mcp-catalog-BNwgItdW.mjs → effective-mcp-catalog-SjTJ-F2i.mjs} +6 -6
  29. package/dist/.setup/{ephemeral-turn-DeppK8zz.mjs → ephemeral-turn-CgKjGBaW.mjs} +2 -2
  30. package/dist/.setup/{inference-proxy-DSnaS-uS.mjs → inference-proxy-BZgN5W8m.mjs} +3 -3
  31. package/dist/.setup/{isolated-completion-BUS9Mqfm.mjs → isolated-completion-C5ifbI0F.mjs} +5 -5
  32. package/dist/.setup/{managed-binary-DwC9wxch.mjs → managed-binary-Boj8_lWV.mjs} +1 -1
  33. package/dist/.setup/{mcp-app-session-preparation-D9F1O5si.mjs → mcp-app-session-preparation-hnw_eGnR.mjs} +8 -8
  34. package/dist/.setup/{model-catalog-BBg4thof.mjs → model-catalog-BO573-NN.mjs} +7 -7
  35. package/dist/.setup/{models-B65GHU4g.mjs → models-Dw0qUZl3.mjs} +3 -3
  36. package/dist/.setup/native-assignment-repair-BjS4uyQr.mjs +162 -0
  37. package/dist/.setup/{native-auth-CveRfTpz.mjs → native-auth-TAGxZP-r.mjs} +3 -3
  38. package/dist/.setup/{native-hook-relay-Ctyky2Qt.mjs → native-hook-relay-CwkDznGH.mjs} +4 -4
  39. package/dist/.setup/{native-mcp-app-DprMGBqj.mjs → native-mcp-app-B7N--ols.mjs} +5 -5
  40. package/dist/.setup/{native-skill-isolation-C4XYLm33.mjs → native-skill-isolation-0pEyxLRX.mjs} +3 -3
  41. package/dist/.setup/{native-subagent-monitor-CJaIve3h.mjs → native-subagent-monitor-D_tvjJxa.mjs} +161 -53
  42. package/dist/.setup/{native-subagent-pending-assignments-DmVhedNs.mjs → native-subagent-pending-assignments-BAOzwy85.mjs} +49 -11
  43. package/dist/.setup/{native-task-assignments-DYL9uxNe.mjs → native-task-assignments-Dap5NqiR.mjs} +4 -4
  44. package/dist/.setup/{node-cli-sessions-BxVYZNuY.mjs → node-cli-sessions-BQNAFnCa.mjs} +2 -2
  45. package/dist/.setup/{node-exec-server.runtime-8RehgPdQ.mjs → node-exec-server.runtime-B-4ogz9C.mjs} +2 -2
  46. package/dist/.setup/{plan-GqWF4XGA.mjs → plan-BE7gWwkn.mjs} +5 -5
  47. package/dist/.setup/{plugin-activation-BgfNFH2L.mjs → plugin-activation-Dbq2m2gh.mjs} +2 -2
  48. package/dist/.setup/{plugin-approval-roundtrip-x7UI_uqk.mjs → plugin-approval-roundtrip-ts-2EU8i.mjs} +1 -1
  49. package/dist/.setup/{plugin-inventory-OhiCoyPH.mjs → plugin-inventory-CZLnMaxf.mjs} +1 -1
  50. package/dist/.setup/{project-doc-thread-config-D_sWbxFR.mjs → project-doc-thread-config-BYFXSVGk.mjs} +3 -3
  51. package/dist/.setup/{provider-Bi9QCsg1.mjs → provider-D8R-IBhv.mjs} +4 -4
  52. package/dist/.setup/{provider-capabilities-BCZeV7xZ.mjs → provider-capabilities-C4ENlstc.mjs} +10 -3
  53. package/dist/.setup/{request-XC1RG34l.mjs → request-ufWmJNN1.mjs} +5 -5
  54. package/dist/.setup/{run-attempt-8U2CrqjW.mjs → run-attempt-CGHsrfPB.mjs} +131 -60
  55. package/dist/.setup/{runtime-artifact-CCPLKFGR.mjs → runtime-artifact-Ch7fCcgJ.mjs} +3 -3
  56. package/dist/.setup/{runtime-artifact-connection-dFoSOKy7.mjs → runtime-artifact-connection-C3ootnwd.mjs} +2 -2
  57. package/dist/.setup/{sandbox-guard-Cf9XMRrg.mjs → sandbox-guard-CwOc36_1.mjs} +1 -1
  58. package/dist/.setup/{session-binding-BDnNz-Co.mjs → session-binding-_RE7vtVN.mjs} +38 -12
  59. package/dist/.setup/{session-binding-record-C2kDBZhx.mjs → session-binding-record-O62ZRFhy.mjs} +2 -2
  60. package/dist/.setup/{session-binding-sidecars-DijNZb31.mjs → session-binding-sidecars-CAHe3enw.mjs} +1 -1
  61. package/dist/.setup/{session-catalog-adoption-Cl6fHxS5.mjs → session-catalog-adoption-DuChFASf.mjs} +5 -5
  62. package/dist/.setup/{session-catalog-archive-CUU7jEkO.mjs → session-catalog-archive-Bs5cP3zm.mjs} +5 -5
  63. package/dist/.setup/{session-catalog-events-CpEyDv0D.mjs → session-catalog-events-DnLfF9Xo.mjs} +4 -4
  64. package/dist/.setup/{session-catalog-index-DpYCf1-8.mjs → session-catalog-index-Bbph2EwS.mjs} +8 -8
  65. package/dist/.setup/{session-catalog-index-order-B30rjUEJ.mjs → session-catalog-index-order-CTSrDiE1.mjs} +1 -1
  66. package/dist/.setup/{session-catalog-limits-Daqt3JLk.mjs → session-catalog-limits-9Ay62KQ0.mjs} +1 -1
  67. package/dist/.setup/{session-catalog-list-request-SJyGz02j.mjs → session-catalog-list-request-uKKvUIoN.mjs} +3 -3
  68. package/dist/.setup/{session-catalog-native-projection-BYV0ICja.mjs → session-catalog-native-projection-CHtG8DwY.mjs} +4 -4
  69. package/dist/.setup/{session-catalog-node-adoption-D11N0CMr.mjs → session-catalog-node-adoption-BjYvYtAd.mjs} +2 -2
  70. package/dist/.setup/{session-catalog-node-continue-Ct62GeL1.mjs → session-catalog-node-continue-BEI9D3ev.mjs} +5 -5
  71. package/dist/.setup/{session-catalog-node-lookup-DQVe6vhs.mjs → session-catalog-node-lookup-CBomNvUN.mjs} +2 -2
  72. package/dist/.setup/{session-catalog-parsing-B4OyhylL.mjs → session-catalog-parsing-DmZmgRou.mjs} +1 -1
  73. package/dist/.setup/{session-catalog-projection-B0IyXrHt.mjs → session-catalog-projection-BgENBUS2.mjs} +4 -4
  74. package/dist/.setup/{session-catalog-source-CfIBVrbT.mjs → session-catalog-source-qHe5r9i_.mjs} +1 -1
  75. package/dist/.setup/{session-cli-BoJSZfGd.mjs → session-cli-CKzNw4c4.mjs} +2 -2
  76. package/dist/.setup/{session-history-import-DgwRu2eD.mjs → session-history-import-BhOzqhyI.mjs} +4 -4
  77. package/dist/.setup/{session-history.worker-DJQfek5p.mjs → session-history.worker-D2v5yRcB.mjs} +5 -3
  78. package/dist/.setup/{session-initialization-BjVtsTzi.mjs → session-initialization-Bwe0Bikj.mjs} +1 -1
  79. package/dist/.setup/{session-retirement-CKIS7jFv.mjs → session-retirement-BdHruV7q.mjs} +6 -6
  80. package/dist/.setup/{settled-turn-finalizer-CnIWbqN7.mjs → settled-turn-finalizer-Ca_Qd_9g.mjs} +5 -5
  81. package/dist/.setup/{shared-client-AdQX0Tdq.mjs → shared-client-C0gEybHs.mjs} +15 -13
  82. package/dist/.setup/{side-question-ZVehuPZn.mjs → side-question-Nn6D01tP.mjs} +17 -17
  83. package/dist/.setup/{source-BszpKEvi.mjs → source-CgYvv2h-.mjs} +4 -4
  84. package/dist/.setup/{thread-lifecycle-run-DezS4UNT.mjs → thread-lifecycle-run-BHM-L-56.mjs} +40 -19
  85. package/dist/.setup/{thread-ownership-OXzPB_RV.mjs → thread-ownership-BJpeo5Xk.mjs} +4 -4
  86. package/dist/.setup/{thread-policy-Dp4CQjdL.mjs → thread-policy-BlzkKVno.mjs} +3 -3
  87. package/dist/.setup/{thread-requests-DjyDmCo4.mjs → thread-requests-pX9_RXpU.mjs} +2 -2
  88. package/dist/.setup/{thread-resume-8YKfRoX6.mjs → thread-resume-BDd8b3E_.mjs} +4 -4
  89. package/dist/.setup/{transcript-mirror-DVEzdOs0.mjs → transcript-mirror-CPdcVWTn.mjs} +1 -1
  90. package/dist/.setup/{transport-stdio-lgeKKHyw.mjs → transport-stdio-BsXQmXll.mjs} +1 -1
  91. package/dist/.setup/{transport-websocket-CEBjEtFP.mjs → transport-websocket-B5mq2Iq2.mjs} +1 -1
  92. package/dist/.setup/{turn-router-DnfbVPvu.mjs → turn-router-8CkGlezp.mjs} +2 -2
  93. package/dist/.setup/{upstream-session-fork-BhADVCrb.mjs → upstream-session-fork-BW_UbivO.mjs} +17 -17
  94. package/dist/.setup/{usage-BoTUkAoJ.mjs → usage-fX3ctGZb.mjs} +3 -3
  95. package/dist/.setup/{usage-limit-error-EoQ7Vl2A.mjs → usage-limit-error-DycN7mED.mjs} +1 -1
  96. package/dist/.setup/{web-search-provider.runtime-Cc6vN-2C.mjs → web-search-provider.runtime-DEBVJch2.mjs} +2 -2
  97. package/dist/.setup/{workspace-write-sandbox-probe-DvfWTvuR.mjs → workspace-write-sandbox-probe-DB6Y3XLX.mjs} +2 -2
  98. package/dist/.source-module-urls/0560e3825cf513bbe9e095a85951c1215dfced0c1e581c5f32b007a3e759636e.json +1 -0
  99. package/dist/.source-module-urls/61f8912a558f2bfc87dcddd651d7f5d3cf17ba02e1e5359b050bf670840c0e0e.json +1 -0
  100. package/dist/api.js +3 -3
  101. package/dist/catalog-page.worker.js +340 -1
  102. package/dist/cli-metadata.js +1 -1
  103. package/dist/doctor-contract-api.js +14 -5
  104. package/dist/harness.js +20 -20
  105. package/dist/index.js +68 -58
  106. package/dist/media-understanding-provider.js +2 -2
  107. package/dist/migration-provider-api.js +1 -1
  108. package/dist/provider-discovery.js +1 -1
  109. package/dist/session-history-worker-runtime.js +4 -2
  110. package/dist/session-history.worker.js +1 -1
  111. package/openclaw.plugin.json +5 -0
  112. package/package.json +4 -4
  113. package/dist/.setup/client-catalog-response-DhB266B_.mjs +0 -310
@@ -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-DmVhedNs.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-BAOzwy85.mjs";
2
+ import { M as readCodexAppServerWarningMessage } from "./client-CafYfF2n.mjs";
2
3
  import { i as isJsonObject } from "./protocol-CANUwXJ3.mjs";
3
- import { n as defineCodexBuildState } from "./build-state-B5mKL-in.mjs";
4
+ import { n as defineCodexBuildState } from "./build-state-CvGKuaeP.mjs";
4
5
  import { a as readHookOutputEntries, o as readItem, s as readNullableString } from "./event-projector-values-CLvG1Hil.mjs";
5
6
  import { n as attachCodexMirrorIdentity } from "./upstream-prompt-provenance-Ccd9MFRJ.mjs";
6
7
  import { t as readCodexMirroredSessionHistoryMessages } from "./session-history-BO6i_pfk.mjs";
7
- import { J as retainCodexAppServerLiveThread, P as claimCodexAppServerLiveThread, R as hasCodexAppServerLiveThread, U as isCodexAppServerLiveThreadProtected } from "./shared-client-AdQX0Tdq.mjs";
8
- import { M as readCodexAppServerWarningMessage } from "./client-BM97zH3z.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-DnfbVPvu.mjs";
10
- import { s as interruptCodexTurnAndWaitBestEffort } from "./attempt-client-cleanup-jWVRH043.mjs";
8
+ import { J as retainCodexAppServerLiveThread, P as claimCodexAppServerLiveThread, R as hasCodexAppServerLiveThread, U as isCodexAppServerLiveThreadProtected } from "./shared-client-C0gEybHs.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-8CkGlezp.mjs";
10
+ import { s as interruptCodexTurnAndWaitBestEffort } from "./attempt-client-cleanup-DQBa7iiq.mjs";
11
11
  import { t as projectCodexWebSearchItem } from "./web-search-item-CvokaZOo.mjs";
12
- import { n as codexApprovalTimeoutText } from "./plugin-approval-roundtrip-x7UI_uqk.mjs";
12
+ import { n as codexApprovalTimeoutText } from "./plugin-approval-roundtrip-ts-2EU8i.mjs";
13
13
  import { t as resolveCodexLocalRuntimeAttribution } from "./local-runtime-attribution-CZz2DJ4q.mjs";
14
- import { t as __exportAll } from "./session-binding-sidecars-DijNZb31.mjs";
14
+ import { t as __exportAll } from "./session-binding-sidecars-CAHe3enw.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";
@@ -563,6 +563,7 @@ var CodexNativeSubagentAssignmentInventory = class {
563
563
  this.dependencies = dependencies;
564
564
  this.writes = /* @__PURE__ */ new Map();
565
565
  this.snapshots = /* @__PURE__ */ new WeakMap();
566
+ this.acknowledged = /* @__PURE__ */ new WeakSet();
566
567
  }
567
568
  hasWrites(state) {
568
569
  return this.writes.has(state);
@@ -600,7 +601,7 @@ var CodexNativeSubagentAssignmentInventory = class {
600
601
  }
601
602
  record(state, child) {
602
603
  const assignment = this.fact(child);
603
- if (!assignment || !state.assignmentStore || child.nativeCompletionDelivered || child.subscriptionClosed) return;
604
+ if (!assignment || !state.assignmentStore || child.nativeCompletionDelivered || child.completionDeliveryAbandoned || child.subscriptionClosed) return;
604
605
  const snapshot = JSON.stringify(assignment);
605
606
  if (this.snapshots.get(child) === snapshot) return;
606
607
  this.snapshots.set(child, snapshot);
@@ -615,11 +616,46 @@ var CodexNativeSubagentAssignmentInventory = class {
615
616
  }
616
617
  settle(state, child) {
617
618
  const assignment = this.fact(child);
618
- if (!assignment || !state.assignmentStore || !child.nativeCompletionDelivered && (!child.subscriptionClosed || child.pendingCompletion)) return;
619
+ if (!assignment || !state.assignmentStore || this.acknowledged.has(child) || !child.nativeCompletionDelivered && (!child.subscriptionClosed || child.pendingCompletion)) return;
619
620
  this.enqueue(state, async () => {
620
621
  await state.assignmentStore?.consume(assignment, () => this.dependencies.assertCurrent(state));
621
622
  });
622
623
  }
624
+ abandon(state, child, assertCurrent) {
625
+ return this.enqueue(state, async () => {
626
+ const assignment = this.fact(child);
627
+ if (!assignment || !state.assignmentStore || !child.pendingCompletion) return;
628
+ if (!await state.assignmentStore.consume(assignment, () => {
629
+ this.dependencies.assertCurrent(state);
630
+ assertCurrent();
631
+ }, { status: child.pendingCompletion.status })) throw new Error("Undeliverable native assignment was not retired.");
632
+ });
633
+ }
634
+ async settleNestedCompletion(state, child, assertCurrent) {
635
+ const owner = child.historyOwner;
636
+ if (!owner || owner.parentThreadId === child.nativeParentThreadId || !await this.dependencies.isNativeChildThread(child.nativeParentThreadId)) return false;
637
+ await this.acknowledge(state, child, () => {
638
+ assertCurrent();
639
+ assertHistoryOwnerMatchesRegistration(owner, state.historyOwner, owner.parentThreadId, true);
640
+ });
641
+ child.nativeCompletionDelivered = true;
642
+ child.pendingCompletion = void 0;
643
+ return true;
644
+ }
645
+ acknowledge(state, child, assertCurrent) {
646
+ return this.enqueue(state, async () => {
647
+ const assertAdmission = () => {
648
+ this.dependencies.assertCurrent(state);
649
+ assertCurrent();
650
+ };
651
+ assertAdmission();
652
+ const assignment = this.fact(child);
653
+ if (!assignment || !state.assignmentStore || this.acknowledged.has(child)) return;
654
+ if (!await state.assignmentStore.consume(assignment, assertAdmission)) throw new Error("Native assignment was not acknowledged.");
655
+ this.acknowledged.add(child);
656
+ assertAdmission();
657
+ });
658
+ }
623
659
  async restore(state, owner) {
624
660
  const store = state.assignmentStore;
625
661
  const current = state.historyOwner;
@@ -631,11 +667,15 @@ var CodexNativeSubagentAssignmentInventory = class {
631
667
  for (const assignment of store.read()) {
632
668
  if (!matchesNativeAssignmentLifecycle(assignment.owner, current)) continue;
633
669
  const recovery = await this.dependencies.readHistory(assignment);
670
+ const pending = store.read();
634
671
  if (!this.dependencies.isCurrent(state) || !custody.isCurrent()) return;
635
672
  store.assertCurrent();
636
673
  if (!recovery || recovery.parentThreadId !== assignment.nativeParentThreadId) continue;
637
- await this.dependencies.restore(state, assignment, recovery, custody);
638
- await this.drain(state);
674
+ 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)));
675
+ if (surviving) {
676
+ await this.dependencies.restore(state, surviving, recovery, custody);
677
+ await this.drain(state);
678
+ }
639
679
  }
640
680
  } catch (error) {
641
681
  embeddedAgentLog.warn("Native pending assignments remain for reconciliation", { error: formatErrorMessage$1(error) });
@@ -997,7 +1037,18 @@ var CodexNativeSubagentCompletionDelivery = class {
997
1037
  childState.deliveringCompletion = true;
998
1038
  let deferredToForeground = false;
999
1039
  try {
1040
+ if (await this.dependencies.settleNestedCompletion(state, childState, () => {
1041
+ if (!this.isCurrent(state, childState) || childState.completionCustody && !childState.completionCustody.isCurrent()) throw new Error("Native completion acknowledgement is no longer current.");
1042
+ })) {
1043
+ this.dependencies.unregisterChild(childState);
1044
+ return;
1045
+ }
1046
+ if (!this.isCurrent(state, childState)) return;
1000
1047
  if (!this.prepareDelivery(state, childState)) return;
1048
+ if (childState.completionDeliveryAbandoned) {
1049
+ await this.abandon(state, childState);
1050
+ return;
1051
+ }
1001
1052
  if (state.owners.size > 0 || !state.completionScope) {
1002
1053
  deferredToForeground = state.owners.size > 0;
1003
1054
  return;
@@ -1027,13 +1078,17 @@ var CodexNativeSubagentCompletionDelivery = class {
1027
1078
  this.prepareDelivery(state, childState);
1028
1079
  return;
1029
1080
  }
1030
- if (!this.claim(state, childState) || delivery.recoveryBlocked) {
1081
+ if (!this.claim(state, childState)) {
1031
1082
  this.dependencies.unregisterChild(childState);
1032
1083
  return;
1033
1084
  }
1085
+ if (delivery.recoveryBlocked) {
1086
+ await this.abandon(state, childState);
1087
+ return;
1088
+ }
1034
1089
  const recoveryPending = delivery.recoveryPending;
1035
1090
  const error = delivery.error ?? (recoveryPending ? "requester recovery owns completion" : "completion delivery did not produce a parent response");
1036
- this.scheduleRetry(childState, error, !recoveryPending);
1091
+ await this.scheduleRetry(state, childState, error, !recoveryPending);
1037
1092
  } catch (error) {
1038
1093
  if (!this.isCurrent(state, childState)) return;
1039
1094
  if (!this.claim(state, childState)) {
@@ -1041,7 +1096,7 @@ var CodexNativeSubagentCompletionDelivery = class {
1041
1096
  return;
1042
1097
  }
1043
1098
  const message = formatErrorMessage$1(error);
1044
- this.scheduleRetry(childState, message);
1099
+ await this.scheduleRetry(state, childState, message, !childState.completionDeliveryAbandoned);
1045
1100
  embeddedAgentLog.warn("Failed to deliver Codex native subagent completion", {
1046
1101
  parentThreadId: state.parentThreadId,
1047
1102
  childThreadId: completion.childThreadId,
@@ -1102,22 +1157,41 @@ var CodexNativeSubagentCompletionDelivery = class {
1102
1157
  this.dependencies.releaseClientRetentionIfIdle();
1103
1158
  return true;
1104
1159
  }
1105
- scheduleRetry(childState, error, chargeAttempt = true) {
1160
+ async abandon(state, child) {
1161
+ child.completionDeliveryAbandoned = true;
1162
+ try {
1163
+ await this.dependencies.abandon(state, child, () => {
1164
+ if (child.nativeCompletionDelivered || !this.isCurrent(state, child) || !this.claim(state, child)) throw new Error("Native completion retirement is no longer current.");
1165
+ });
1166
+ this.dependencies.unregisterChild(child);
1167
+ } catch (error) {
1168
+ if (this.isCurrent(state, child) && child.nativeCompletionDelivered) {
1169
+ this.prepareDelivery(state, child);
1170
+ return;
1171
+ }
1172
+ embeddedAgentLog.warn("Native completion retirement remains pending", {
1173
+ childThreadId: child.childThreadId,
1174
+ error: formatErrorMessage$1(error)
1175
+ });
1176
+ await this.scheduleRetry(state, child, formatErrorMessage$1(error), false);
1177
+ }
1178
+ }
1179
+ async scheduleRetry(state, childState, error, chargeAttempt = true) {
1106
1180
  if (!childState.pendingCompletion || childState.completionDeliveryTimer || this.dependencies.children.get(childState.runId) !== childState) return;
1107
1181
  if (chargeAttempt && childState.completionDeliveryAttempt >= this.maxRetries) {
1108
1182
  embeddedAgentLog.warn("Native subagent completion retries exhausted", {
1109
1183
  childThreadId: childState.childThreadId,
1110
1184
  error
1111
1185
  });
1112
- this.dependencies.unregisterChild(childState);
1186
+ await this.abandon(state, childState);
1113
1187
  return;
1114
1188
  }
1115
1189
  const delayMs = delayForAttempt(this.retryDelaysMs, chargeAttempt ? childState.completionDeliveryAttempt++ : childState.completionDeliveryAttempt);
1116
1190
  childState.completionDeliveryTimer = setTimeout(() => {
1117
1191
  childState.completionDeliveryTimer = void 0;
1118
1192
  if (this.dependencies.children.get(childState.runId) !== childState) return;
1119
- const state = this.dependencies.parents.get(childState.parentThreadId);
1120
- if (state) this.deliverPending(state, childState);
1193
+ const currentParent = this.dependencies.parents.get(childState.parentThreadId);
1194
+ if (currentParent) this.deliverPending(currentParent, childState);
1121
1195
  }, delayMs);
1122
1196
  childState.completionDeliveryTimer.unref();
1123
1197
  }
@@ -1125,7 +1199,7 @@ var CodexNativeSubagentCompletionDelivery = class {
1125
1199
  if (childState.completionCustody && !childState.completionCustody.isCurrent()) return false;
1126
1200
  const requesterSessionKey = state.requesterSessionKey?.trim();
1127
1201
  if (!requesterSessionKey) return true;
1128
- const key = `${requesterSessionKey}\0${childState.runId}`;
1202
+ const key = childState.deliveryOwnerKey ?? `${requesterSessionKey}\0${childState.nativeTurnId ? codexNativeSubagentRunId(childState.childThreadId, childState.nativeTurnId) : childState.runId}`;
1129
1203
  try {
1130
1204
  state.assignmentStore?.assertCurrent();
1131
1205
  assertHistoryOwnerMatchesRegistration(childState.historyOwner, state.historyOwner, childState.nativeParentThreadId, state.historyOwner !== void 0);
@@ -1372,6 +1446,11 @@ var CodexNativeSubagentHistoryRecovery = class {
1372
1446
  includeTurns
1373
1447
  }, { timeoutMs: THREAD_READ_TIMEOUT_MS });
1374
1448
  }
1449
+ async isNativeChildThread(threadId) {
1450
+ if (this.knownChildren.has(threadId)) return true;
1451
+ const response = await this.requestThreadRead(threadId, false);
1452
+ return response.thread.id === threadId && Boolean(readThreadParentThreadId(response.thread));
1453
+ }
1375
1454
  async read(assignment, options) {
1376
1455
  const { childThreadId } = assignment;
1377
1456
  const { recordedCompletion } = options;
@@ -1917,6 +1996,38 @@ function createCodexNativeSubagentMonitorRuntime(Monitor) {
1917
1996
  };
1918
1997
  }
1919
1998
  //#endregion
1999
+ //#region extensions/codex/src/app-server/native-subagent-monitor-state.ts
2000
+ /** Parent registrations that share the source requester's session lifecycle. */
2001
+ function selectRequesterParentStates(states, source) {
2002
+ return [...states].filter((state) => state === source || Boolean(source.requesterSessionKey && state.requesterSessionKey === source.requesterSessionKey && state.agentId === source.agentId && source.historyOwner && state.historyOwner && matchesNativeAssignmentLifecycle(source.historyOwner, state.historyOwner)));
2003
+ }
2004
+ /**
2005
+ * Rebuilds a restored child's pending and observed native turns. Pending turns that still hold
2006
+ * a model source keep their completion custody; every other superseded pending turn releases it.
2007
+ */
2008
+ function restoreKnownChildTurns(assignment, observedTurns, previous) {
2009
+ const currentIndex = observedTurns.findIndex((turn) => turn.turnId === assignment.nativeTurnId);
2010
+ const pendingTurns = observedTurns.filter((turn, index) => index > currentIndex && turn.turnId !== assignment.nativeTurnId).map((turn, index, turns) => ({
2011
+ turnId: turn.turnId,
2012
+ state: turn.state === "active" && index < turns.length - 1 ? void 0 : turn.state
2013
+ }));
2014
+ const retainedPending = previous?.pendingTurns.filter((pending) => pending.modelSource) ?? [];
2015
+ for (const retained of retainedPending) {
2016
+ const recovered = pendingTurns.find((pending) => pending.turnId === retained.turnId);
2017
+ if (recovered) {
2018
+ recovered.modelSource = retained.modelSource;
2019
+ recovered.completionCustody = retained.completionCustody;
2020
+ retained.completionCustody = void 0;
2021
+ } else pendingTurns.push(retained);
2022
+ }
2023
+ for (const pending of previous?.pendingTurns ?? []) if (!pendingTurns.includes(pending)) releaseCompletionCustody(pending);
2024
+ const turnIds = new Set([assignment.nativeTurnId, ...observedTurns.map((turn) => turn.turnId)].filter((id) => Boolean(id)));
2025
+ return {
2026
+ pendingTurns,
2027
+ observedTurns: new Map([...turnIds].map((turnId) => [turnId, pendingTurns.some((turn) => turn.turnId === turnId) ? { awaitingInteraction: true } : {}]))
2028
+ };
2029
+ }
2030
+ //#endregion
1920
2031
  //#region extensions/codex/src/app-server/native-subagent-notification-routing.ts
1921
2032
  function createCodexNativeSubagentNotificationRouter(deps) {
1922
2033
  return (notification) => {
@@ -2608,6 +2719,7 @@ var CodexNativeSubagentSubmissionOwner = class {
2608
2719
  if (!this.isObserving(state, custody) || !this.admitTurn(state, custody, turn, historyValidated)) return;
2609
2720
  custody.phase = "promoting";
2610
2721
  clearTimeout(custody.timer);
2722
+ custody.release();
2611
2723
  }
2612
2724
  settleChild(state, child) {
2613
2725
  for (const custody of this.pending.get(state)?.values() ?? []) {
@@ -4428,6 +4540,8 @@ var Monitor = class {
4428
4540
  parents: this.parentStates,
4429
4541
  retiredParents: this.retiredParentStates,
4430
4542
  unregisterChild: (child) => this.unregisterChild(child),
4543
+ abandon: (state, child, assertCurrent) => this.assignments.abandon(state, child, assertCurrent),
4544
+ settleNestedCompletion: (state, child, assertCurrent) => this.assignments.settleNestedCompletion(state, child, assertCurrent),
4431
4545
  releaseClientRetentionIfIdle: () => this.releaseClientRetentionIfIdle()
4432
4546
  });
4433
4547
  this.turnObservation = new CodexNativeSubagentTurnObservation({
@@ -4521,6 +4635,7 @@ var Monitor = class {
4521
4635
  state.assignmentStore?.assertCurrent();
4522
4636
  },
4523
4637
  isCurrent: (state) => this.isCurrentParent(state),
4638
+ isNativeChildThread: (threadId) => this.historyRecovery.isNativeChildThread(threadId),
4524
4639
  readHistory: async (assignment) => {
4525
4640
  const revision = this.recovery.retainThreadStatusRevision(assignment.childThreadId);
4526
4641
  try {
@@ -4539,7 +4654,7 @@ var Monitor = class {
4539
4654
  }
4540
4655
  },
4541
4656
  restore: async (state, assignment, recovery, custody) => {
4542
- const existing = this.childStates.get(assignment.runId);
4657
+ 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));
4543
4658
  if (existing) {
4544
4659
  const original = this.parentStates.get(existing.parentThreadId);
4545
4660
  if (original && original.requesterSessionKey === state.requesterSessionKey && original.historyOwner && state.historyOwner && matchesNativeAssignmentLifecycle(original.historyOwner, state.historyOwner)) original.assignmentStore = state.assignmentStore;
@@ -4684,6 +4799,9 @@ var Monitor = class {
4684
4799
  });
4685
4800
  if (!capture) return;
4686
4801
  try {
4802
+ const known = this.knownChildren.get(request.threadId);
4803
+ const child = known ? this.admitFollowupChild(known) : void 0;
4804
+ if (child?.nativeTurnId === request.turnId && child.settledWithoutCompletion) this.resumeChild(child);
4687
4805
  await this.persistModelAssignment(request, capture);
4688
4806
  request.signal?.throwIfAborted();
4689
4807
  capture.assertCurrent();
@@ -4745,7 +4863,7 @@ var Monitor = class {
4745
4863
  }
4746
4864
  retireParent(parentThreadIdInput) {
4747
4865
  const current = this.parentStates.get(parentThreadIdInput.trim());
4748
- const states = current ? this.requesterParents(current) : [];
4866
+ const states = current ? selectRequesterParentStates(this.parentStates.values(), current) : [];
4749
4867
  for (const state of states) this.retiredParentStates.add(state);
4750
4868
  const settlements = [];
4751
4869
  for (const state of states) {
@@ -4858,6 +4976,7 @@ var Monitor = class {
4858
4976
  childState.settledWithoutCompletion = false;
4859
4977
  childState.fallbackCompletion = void 0;
4860
4978
  this.releaseClientRetention ??= this.retainClient?.();
4979
+ this.retainParentThreadForChild(childState.parentThreadId);
4861
4980
  }
4862
4981
  settleResumableChild(childState) {
4863
4982
  if (childState.terminal) return;
@@ -4868,6 +4987,7 @@ var Monitor = class {
4868
4987
  releaseNativeDirectChild(childState);
4869
4988
  releaseNativeModelExecution(childState);
4870
4989
  this.recovery.clearRecoveryTimers(childState);
4990
+ this.releaseParentThreadIfChildrenSettled(childState.parentThreadId);
4871
4991
  this.releaseClientRetentionIfIdle();
4872
4992
  }
4873
4993
  async handleChildTurnCompletion(notification, childState) {
@@ -5040,6 +5160,7 @@ var Monitor = class {
5040
5160
  this.recovery.markTerminalRevision(childState.childThreadId);
5041
5161
  releaseNativeDirectChild(childState);
5042
5162
  this.recovery.clearRecoveryTimers(childState);
5163
+ this.releaseParentThreadIfChildrenSettled(state.parentThreadId);
5043
5164
  this.completionDelivery.applyReceipts(state, childState.deliveryReceipts.record(childState.runId, this.knownChildren.get(childState.childThreadId)?.agentPaths ?? [childState.childThreadId], acceptedCompletion.result));
5044
5165
  await this.completionDelivery.deliverPending(state, childState);
5045
5166
  }
@@ -5094,10 +5215,7 @@ var Monitor = class {
5094
5215
  if (!childState) {
5095
5216
  this.updateChildThreadOwnership("claim", childThreadId, this.claimChildThread);
5096
5217
  this.releaseClientRetention ??= this.retainClient?.();
5097
- if (!this.parentThreadRetentions.has(parentThreadId)) {
5098
- const releaseParentThread = this.retainParentThread?.(parentThreadId);
5099
- if (releaseParentThread) this.parentThreadRetentions.set(parentThreadId, releaseParentThread);
5100
- }
5218
+ this.retainParentThreadForChild(parentThreadId);
5101
5219
  childState = {
5102
5220
  runId,
5103
5221
  nativeTurnId: assignment.nativeTurnId,
@@ -5317,6 +5435,7 @@ var Monitor = class {
5317
5435
  }
5318
5436
  if (!transitioned) claimOwner.onDirectChildAccepted?.();
5319
5437
  }
5438
+ this.observeActiveChild(child);
5320
5439
  this.admissionCustody.bindEventSink(child);
5321
5440
  return child;
5322
5441
  }
@@ -5368,11 +5487,7 @@ var Monitor = class {
5368
5487
  this.recovery.clearRecoveryTimers(childState);
5369
5488
  this.completionDelivery.release(childState);
5370
5489
  if (this.childStates.get(childState.runId) === childState) this.childStates.delete(childState.runId);
5371
- if (!this.hasChildrenForParent(childState.parentThreadId)) {
5372
- const releaseParentThread = this.parentThreadRetentions.get(childState.parentThreadId);
5373
- this.parentThreadRetentions.delete(childState.parentThreadId);
5374
- releaseParentThread?.();
5375
- }
5490
+ this.releaseParentThreadIfChildrenSettled(childState.parentThreadId);
5376
5491
  this.recovery.collectThreadStatusRevision(childState.childThreadId);
5377
5492
  this.releaseClientRetentionIfIdle();
5378
5493
  const state = this.parentStates.get(childState.parentThreadId);
@@ -5406,21 +5521,28 @@ var Monitor = class {
5406
5521
  this.releaseClientRetention = void 0;
5407
5522
  release?.();
5408
5523
  }
5409
- requesterParents(source) {
5410
- return [...this.parentStates.values()].filter((state) => state === source || Boolean(source.requesterSessionKey && state.requesterSessionKey === source.requesterSessionKey && state.agentId === source.agentId && source.historyOwner && state.historyOwner && matchesNativeAssignmentLifecycle(source.historyOwner, state.historyOwner)));
5411
- }
5412
5524
  hasParentWork(state) {
5413
5525
  if (state.modelSourceReferences || state.pendingRegistrations && !this.disposed && !this.retiredParentStates.has(state) || this.assignments.hasWrites(state) || this.submissions.hasCustody(state) || state.owners.size > 0 || this.childCloses.hasPending(state) || this.hasChildrenForParent(state.parentThreadId)) return true;
5414
5526
  for (const known of this.knownChildren.values()) if (known.parent === state && this.currentChild(known.assignment.childThreadId)) return true;
5415
5527
  return false;
5416
5528
  }
5529
+ retainParentThreadForChild(parentThreadId) {
5530
+ if (this.parentThreadRetentions.has(parentThreadId)) return;
5531
+ const releaseParentThread = this.retainParentThread?.(parentThreadId);
5532
+ if (releaseParentThread) this.parentThreadRetentions.set(parentThreadId, releaseParentThread);
5533
+ }
5534
+ releaseParentThreadIfChildrenSettled(parentThreadId) {
5535
+ for (const childState of this.childStates.values()) if (childState.parentThreadId === parentThreadId && !childState.terminal && !childState.settledWithoutCompletion) return;
5536
+ const releaseParentThread = this.parentThreadRetentions.get(parentThreadId);
5537
+ this.parentThreadRetentions.delete(parentThreadId);
5538
+ releaseParentThread?.();
5539
+ }
5417
5540
  hasChildrenForParent(parentThreadId) {
5418
- for (const childState of this.childStates.values()) if (childState.parentThreadId === parentThreadId) return true;
5419
- return false;
5541
+ return [...this.childStates.values()].some((child) => child.parentThreadId === parentThreadId);
5420
5542
  }
5421
5543
  pruneParentIfUnused(source) {
5422
5544
  if (this.parentStates.get(source.parentThreadId) !== source) return;
5423
- const states = this.requesterParents(source);
5545
+ const states = selectRequesterParentStates(this.parentStates.values(), source);
5424
5546
  if (states.some((state) => this.hasParentWork(state))) return;
5425
5547
  for (const state of states) {
5426
5548
  this.submissions.retire(state);
@@ -5436,23 +5558,9 @@ var Monitor = class {
5436
5558
  }
5437
5559
  }
5438
5560
  restoreKnownChild(state, assignment, observedTurns = []) {
5439
- const currentIndex = observedTurns.findIndex((turn) => turn.turnId === assignment.nativeTurnId);
5440
- const pendingTurns = observedTurns.filter((turn, index) => index > currentIndex && turn.turnId !== assignment.nativeTurnId).map((turn, index, turns) => ({
5441
- turnId: turn.turnId,
5442
- state: turn.state === "active" && index < turns.length - 1 ? void 0 : turn.state
5443
- }));
5444
5561
  const previous = this.knownChildren.get(assignment.childThreadId);
5445
5562
  const previousRunId = previous?.assignment.runId;
5446
- const retainedPending = previous?.pendingTurns.filter((pending) => pending.modelSource) ?? [];
5447
- for (const retained of retainedPending) {
5448
- const recovered = pendingTurns.find((pending) => pending.turnId === retained.turnId);
5449
- if (recovered) {
5450
- recovered.modelSource = retained.modelSource;
5451
- recovered.completionCustody = retained.completionCustody;
5452
- retained.completionCustody = void 0;
5453
- } else pendingTurns.push(retained);
5454
- }
5455
- for (const pending of previous?.pendingTurns ?? []) if (!pendingTurns.includes(pending)) releaseCompletionCustody(pending);
5563
+ const { pendingTurns, observedTurns: observedTurnStates } = restoreKnownChildTurns(assignment, observedTurns, previous);
5456
5564
  this.knownChildren.set(assignment.childThreadId, {
5457
5565
  configurationQualification: previous?.configurationQualification,
5458
5566
  parent: state,
@@ -5463,7 +5571,7 @@ var Monitor = class {
5463
5571
  terminal: false
5464
5572
  },
5465
5573
  turnId: pendingTurns.at(-1)?.turnId ?? assignment.nativeTurnId,
5466
- observedTurns: new Map([...new Set([assignment.nativeTurnId, ...observedTurns.map((turn) => turn.turnId)].filter((id) => Boolean(id)))].map((turnId) => [turnId, pendingTurns.some((turn) => turn.turnId === turnId) ? { awaitingInteraction: true } : {}])),
5574
+ observedTurns: observedTurnStates,
5467
5575
  pendingTurns,
5468
5576
  agentPaths: this.knownChildren.get(assignment.childThreadId)?.agentPaths ?? /* @__PURE__ */ new Set([assignment.childThreadId])
5469
5577
  });
@@ -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-DmVhedNs.mjs";
1
+ import { d as readCodexNativeSubagentRunId, g as codexNativeSubagentHistoryConnectionFingerprint, i as readNativePendingAssignments, v as readCodexNativeSubagentHistoryOwner } from "./native-subagent-pending-assignments-BAOzwy85.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-C2kDBZhx.mjs").then((n) => n.h);
59
+ const { bindingStoreKey, readStoredCodexAppServerBinding } = await import("./session-binding-record-O62ZRFhy.mjs").then((n) => n.h);
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-C2kDBZhx.mjs").then((n) => n.h);
129
+ const { readStoredCodexAppServerBinding } = await import("./session-binding-record-O62ZRFhy.mjs").then((n) => n.h);
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-C2kDBZhx.mjs").then((n) => n.h);
173
+ const { bindingStoreKey, readStoredCodexAppServerBinding } = await import("./session-binding-record-O62ZRFhy.mjs").then((n) => n.h);
174
174
  const sessionStore = await import("openclaw/plugin-sdk/session-store-runtime");
175
175
  let imported = 0;
176
176
  let settled = 0;
@@ -1,4 +1,4 @@
1
- import { A as unwrapNodeInvokePayload, x as readBoundedOptionalString } from "./session-catalog-parsing-B4OyhylL.mjs";
1
+ import { A as unwrapNodeInvokePayload, x as readBoundedOptionalString } from "./session-catalog-parsing-DmZmgRou.mjs";
2
2
  import { r as resolveCodexAppServerUserHomeDir } from "./auth-start-options-BPIPeEX8.mjs";
3
3
  import { o as formatCodexDisplayText } from "./command-formatters-xW9KpoSZ.mjs";
4
4
  import { t as codexCatalogHomeId } from "./session-catalog-home-id-vlih0B_g.mjs";
@@ -196,7 +196,7 @@ async function resumeCodexCliSessionOnNode(params) {
196
196
  let catalogAgentId;
197
197
  let catalogHomeId;
198
198
  if (params.sessionKey) {
199
- const { adoptionSessionKeyRest, CODEX_NODE_SESSION_KEY_PREFIX, readNodeSessionMarker } = await import("./session-catalog-node-adoption-D11N0CMr.mjs");
199
+ const { adoptionSessionKeyRest, CODEX_NODE_SESSION_KEY_PREFIX, readNodeSessionMarker } = await import("./session-catalog-node-adoption-BjYvYtAd.mjs");
200
200
  const entry = params.runtime.agent.session.getSessionEntry({
201
201
  sessionKey: params.sessionKey,
202
202
  readConsistency: "latest"
@@ -1,5 +1,5 @@
1
- import { i as resolveManagedCodexNativeCommand, r as resolveManagedCodexAppServerStartOptions, t as isManagedCodexDesktopCommand } from "./managed-binary-DwC9wxch.mjs";
2
- import { a as closeCodexAppServerTransportAndWait, t as createStdioTransport } from "./transport-stdio-lgeKKHyw.mjs";
1
+ import { i as resolveManagedCodexNativeCommand, r as resolveManagedCodexAppServerStartOptions, t as isManagedCodexDesktopCommand } from "./managed-binary-Boj8_lWV.mjs";
2
+ import { a as closeCodexAppServerTransportAndWait, t as createStdioTransport } from "./transport-stdio-BsXQmXll.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,7 +1,7 @@
1
1
  import { t as isOnlyMigrationKind } from "./scope-DOC1Xjc8.mjs";
2
- import { u as CODEX_PLUGINS_MARKETPLACE_NAME } from "./plugin-inventory-OhiCoyPH.mjs";
3
- import "./config-LQemoqTL.mjs";
4
- import { i as hasCodexSource, n as defaultCodexHome, o as readJsonObject, r as discoverCodexSource, s as sanitizeName, t as codexPluginMigrationSubscriptionWarning } from "./source-BszpKEvi.mjs";
2
+ import { u as CODEX_PLUGINS_MARKETPLACE_NAME } from "./plugin-inventory-CZLnMaxf.mjs";
3
+ import "./config-d0gOFYEk.mjs";
4
+ import { i as hasCodexSource, n as defaultCodexHome, o as readJsonObject, r as discoverCodexSource, s as sanitizeName, t as codexPluginMigrationSubscriptionWarning } from "./source-CgYvv2h-.mjs";
5
5
  import { asBoolean, asOptionalRecord, isRecord, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
6
6
  import { createHash } from "node:crypto";
7
7
  import { runCommandBuffered } from "openclaw/plugin-sdk/process-runtime";
@@ -97,8 +97,8 @@ async function readCodexCliCredentialsAsync(options) {
97
97
  options.signal?.throwIfAborted();
98
98
  if (!options.allowKeychainPrompt) return;
99
99
  const home = await fs.realpath(options.codexHome).catch(() => path.resolve(options.codexHome));
100
- const { CodexAppServerClient } = await import("./client-BM97zH3z.mjs").then((n) => n.n);
101
- const { resolveManagedCodexPackageEntrypoint, resolveManagedCodexNativeCommand } = await import("./managed-binary-DwC9wxch.mjs").then((n) => n.n);
100
+ const { CodexAppServerClient } = await import("./client-CafYfF2n.mjs").then((n) => n.n);
101
+ const { resolveManagedCodexPackageEntrypoint, resolveManagedCodexNativeCommand } = await import("./managed-binary-Boj8_lWV.mjs").then((n) => n.n);
102
102
  const launcher = resolveManagedCodexPackageEntrypoint(path.dirname(fileURLToPath(import.meta.url)));
103
103
  const command = launcher ? resolveManagedCodexNativeCommand(launcher) : void 0;
104
104
  if (!command) return;
@@ -1,6 +1,6 @@
1
1
  import { r as CodexAppServerRpcError } from "./rpc-error-C98SHchT.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-OhiCoyPH.mjs";
3
- import "./config-LQemoqTL.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-CZLnMaxf.mjs";
3
+ import "./config-d0gOFYEk.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 { _t as resolveCodexGatewayTimeoutWithGraceMs } from "./shared-client-AdQX0Tdq.mjs";
1
+ import { _t as resolveCodexGatewayTimeoutWithGraceMs } from "./shared-client-C0gEybHs.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-Bg9DbDI6.mjs";
2
- import "./config-LQemoqTL.mjs";
2
+ import "./config-d0gOFYEk.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";