@openclaw/codex 2026.10.10-beta.2 → 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-BVO-lpvn.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-tJl5mopa.mjs → apply-DvEtGGBB.mjs} +8 -8
  4. package/dist/.setup/{attempt-client-cleanup-DMJWXGxM.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-BW1YeaIk.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-BQkmyyjB.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-CjLCC0wm.mjs → build-state-CpGXWSN4.mjs} +1 -1
  13. package/dist/.setup/{client--P8jwXvA.mjs → client-Bxe8bl-K.mjs} +8 -8
  14. package/dist/.setup/{client-catalog-response-CsDxVVOZ.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-DqaVBeR3.mjs → command-dispatch-BD9-WK7I.mjs} +1 -1
  17. package/dist/.setup/{command-handlers-i6mEjvfo.mjs → command-handlers-g046iNsp.mjs} +22 -22
  18. package/dist/.setup/{command-rpc-B65jEc0r.mjs → command-rpc-CwpCTOrX.mjs} +11 -11
  19. package/dist/.setup/{compact-AO2H4RJe.mjs → compact-B-qCn3BG.mjs} +13 -13
  20. package/dist/.setup/{computer-use-YUnu0JVx.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-CfnUR-IM.mjs → conversation-binding-CXGGbblk.mjs} +38 -29
  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-DOub3CB5.mjs → dynamic-tool-build-BzTaCmlT.mjs} +3 -3
  28. package/dist/.setup/{dynamic-tools-Us5mvq_N.mjs → dynamic-tools-BALvjDwR.mjs} +8 -8
  29. package/dist/.setup/{effective-mcp-catalog-DfUUoeeM.mjs → effective-mcp-catalog-CQbEkKv_.mjs} +6 -6
  30. package/dist/.setup/{ephemeral-turn-B2z0RIeF.mjs → ephemeral-turn-CNm9tN72.mjs} +2 -2
  31. package/dist/.setup/{inference-context-HRw3PDwn.mjs → inference-context-DYpvCEF3.mjs} +1 -1
  32. package/dist/.setup/{inference-proxy-CiLbHMLf.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-CybgD6uU.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-zUgpDLWR.mjs → mcp-app-session-preparation-CFbTbxia.mjs} +9 -9
  37. package/dist/.setup/{model-catalog-CWY3wo0B.mjs → model-catalog-BNSZklNP.mjs} +7 -7
  38. package/dist/.setup/{models-CmOBxsKF.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-CocOW9YS.mjs → native-hook-relay-COcu2b4l.mjs} +4 -4
  42. package/dist/.setup/{native-mcp-app-DrQeLxXj.mjs → native-mcp-app-CFyl3R2g.mjs} +5 -5
  43. package/dist/.setup/{native-skill-isolation-DL4-PQa4.mjs → native-skill-isolation-B8cWhSFy.mjs} +3 -3
  44. package/dist/.setup/{native-subagent-monitor-C3CIIaZG.mjs → native-subagent-monitor-LJd5_D5F.mjs} +153 -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-Bqj6VQvQ.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-CGEiG7hG.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-C_1fMsyD.mjs → provider-C1GuStnr.mjs} +4 -4
  55. package/dist/.setup/{provider-capabilities-C7pYYpvh.mjs → provider-capabilities-DMfkFwZi.mjs} +1 -1
  56. package/dist/.setup/{request-C6U8q2uz.mjs → request-DTgD_jsY.mjs} +5 -5
  57. package/dist/.setup/{run-attempt-BhuXanLv.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-DCN1FcBZ.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-CEi6SuLQ.mjs → session-catalog-events-BmhPYZGw.mjs} +4 -4
  68. package/dist/.setup/{session-catalog-index-qt4UWBua.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-BqBYi6kV.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-CNyhjZze.mjs → session-catalog-projection-C_w9yRCz.mjs} +4 -4
  78. package/dist/.setup/{session-catalog-source-z_mNyQdX.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-RZStisKb.mjs → session-retirement-BHMs5nFf.mjs} +6 -6
  83. package/dist/.setup/{settled-turn-finalizer-gioXygEX.mjs → settled-turn-finalizer-C3OEC7ED.mjs} +5 -5
  84. package/dist/.setup/{shared-client-CkyTrNB8.mjs → shared-client-BelwlhWf.mjs} +84 -33
  85. package/dist/.setup/{side-question-DHPWKgO3.mjs → side-question-Bt2vXr-h.mjs} +21 -21
  86. package/dist/.setup/{source-63MLSmLJ.mjs → source-DQN8P65G.mjs} +4 -4
  87. package/dist/.setup/{thread-lifecycle-run-zCXYFW8W.mjs → thread-lifecycle-run-aBfXzIGf.mjs} +79 -38
  88. package/dist/.setup/{thread-ownership-Bmk5a2Gu.mjs → thread-ownership-DxW6b6fR.mjs} +4 -4
  89. package/dist/.setup/{thread-policy-DYtvZ5Ay.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-vBShG3-o.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-BGj67FMK.mjs → turn-router-B62dF4CM.mjs} +1 -1
  96. package/dist/.setup/{upstream-session-fork-CWKjpdtW.mjs → upstream-session-fork-5d_7cWPF.mjs} +17 -17
  97. package/dist/.setup/{usage-AhrLFxZP.mjs → usage-DSIlxJrx.mjs} +3 -3
  98. package/dist/.setup/{usage-limit-error-BdNbGJC3.mjs → usage-limit-error-A0XP58jR.mjs} +1 -1
  99. package/dist/.setup/{web-search-provider.runtime-Yk6lnJBG.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-CjLCC0wm.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, B as retainCodexAppServerLiveThread, E as claimCodexAppServerLiveThread } from "./shared-client-CkyTrNB8.mjs";
8
- import { j as readCodexAppServerWarningMessage } from "./client--P8jwXvA.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-BGj67FMK.mjs";
10
- import { s as interruptCodexTurnAndWaitBestEffort, t as CODEX_APP_SERVER_INTERRUPT_TIMEOUT_MS } from "./attempt-client-cleanup-DMJWXGxM.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-CGEiG7hG.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
  }
@@ -652,15 +673,20 @@ var CodexNativeSubagentAssignmentInventory = class {
652
673
  if (!store || !current || !owner.completionCustody?.isCurrent()) return;
653
674
  const custody = owner.completionCustody.retain();
654
675
  try {
676
+ await this.drain(state);
655
677
  const assignments = await store.read();
656
678
  if (!this.dependencies.isCurrent(state) || !custody.isCurrent()) return;
657
679
  for (const assignment of assignments) {
658
680
  if (!matchesNativeAssignmentLifecycle(assignment.owner, current)) continue;
659
681
  const recovery = await this.dependencies.readHistory(assignment);
660
- await store.assertCurrentAsync();
682
+ const pending = await store.read();
661
683
  if (!this.dependencies.isCurrent(state) || !custody.isCurrent()) return;
662
684
  if (!recovery || recovery.parentThreadId !== assignment.nativeParentThreadId) continue;
663
- await this.dependencies.restore(state, assignment, recovery, custody);
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
+ }
664
690
  }
665
691
  } catch (error) {
666
692
  embeddedAgentLog.warn("Native pending assignments remain for reconciliation", { error: formatErrorMessage$1(error) });
@@ -989,7 +1015,18 @@ var CodexNativeSubagentCompletionDelivery = class {
989
1015
  let deferredToForeground = false;
990
1016
  try {
991
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;
992
1025
  if (!this.prepareDelivery(state, childState)) return;
1026
+ if (childState.completionDeliveryAbandoned) {
1027
+ await this.abandon(state, childState);
1028
+ return;
1029
+ }
993
1030
  if (state.owners.size > 0 || !state.completionScope) {
994
1031
  deferredToForeground = state.owners.size > 0;
995
1032
  return;
@@ -1019,13 +1056,17 @@ var CodexNativeSubagentCompletionDelivery = class {
1019
1056
  this.prepareDelivery(state, childState);
1020
1057
  return;
1021
1058
  }
1022
- if (!this.claim(state, childState) || delivery.recoveryBlocked) {
1059
+ if (!this.claim(state, childState)) {
1023
1060
  this.dependencies.unregisterChild(childState);
1024
1061
  return;
1025
1062
  }
1063
+ if (delivery.recoveryBlocked) {
1064
+ await this.abandon(state, childState);
1065
+ return;
1066
+ }
1026
1067
  const recoveryPending = delivery.recoveryPending;
1027
1068
  const error = delivery.error ?? (recoveryPending ? "requester recovery owns completion" : "completion delivery did not produce a parent response");
1028
- this.scheduleRetry(childState, error, !recoveryPending);
1069
+ await this.scheduleRetry(state, childState, error, !recoveryPending);
1029
1070
  } catch (error) {
1030
1071
  if (!this.isCurrent(state, childState)) return;
1031
1072
  if (!this.claim(state, childState)) {
@@ -1033,7 +1074,7 @@ var CodexNativeSubagentCompletionDelivery = class {
1033
1074
  return;
1034
1075
  }
1035
1076
  const message = formatErrorMessage$1(error);
1036
- this.scheduleRetry(childState, message);
1077
+ await this.scheduleRetry(state, childState, message, !childState.completionDeliveryAbandoned);
1037
1078
  embeddedAgentLog.warn("Failed to deliver Codex native subagent completion", {
1038
1079
  parentThreadId: state.parentThreadId,
1039
1080
  childThreadId: completion.childThreadId,
@@ -1093,22 +1134,41 @@ var CodexNativeSubagentCompletionDelivery = class {
1093
1134
  this.dependencies.releaseClientRetentionIfIdle();
1094
1135
  return true;
1095
1136
  }
1096
- 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) {
1097
1157
  if (!childState.pendingCompletion || childState.completionDeliveryTimer || this.dependencies.children.get(childState.runId) !== childState) return;
1098
1158
  if (chargeAttempt && childState.completionDeliveryAttempt >= this.maxRetries) {
1099
1159
  embeddedAgentLog.warn("Native subagent completion retries exhausted", {
1100
1160
  childThreadId: childState.childThreadId,
1101
1161
  error
1102
1162
  });
1103
- this.dependencies.unregisterChild(childState);
1163
+ await this.abandon(state, childState);
1104
1164
  return;
1105
1165
  }
1106
1166
  const delayMs = delayForAttempt(this.retryDelaysMs, chargeAttempt ? childState.completionDeliveryAttempt++ : childState.completionDeliveryAttempt);
1107
1167
  childState.completionDeliveryTimer = setTimeout(() => {
1108
1168
  childState.completionDeliveryTimer = void 0;
1109
1169
  if (this.dependencies.children.get(childState.runId) !== childState) return;
1110
- const state = this.dependencies.parents.get(childState.parentThreadId);
1111
- if (state) this.deliverPending(state, childState);
1170
+ const currentParent = this.dependencies.parents.get(childState.parentThreadId);
1171
+ if (currentParent) this.deliverPending(currentParent, childState);
1112
1172
  }, delayMs);
1113
1173
  childState.completionDeliveryTimer.unref();
1114
1174
  }
@@ -1116,7 +1176,7 @@ var CodexNativeSubagentCompletionDelivery = class {
1116
1176
  if (childState.completionCustody && !childState.completionCustody.isCurrent()) return false;
1117
1177
  const requesterSessionKey = state.requesterSessionKey?.trim();
1118
1178
  if (!requesterSessionKey) return true;
1119
- const key = `${requesterSessionKey}\0${childState.runId}`;
1179
+ const key = childState.deliveryOwnerKey ?? `${requesterSessionKey}\0${childState.nativeTurnId ? codexNativeSubagentRunId(childState.childThreadId, childState.nativeTurnId) : childState.runId}`;
1120
1180
  try {
1121
1181
  state.assignmentStore?.assertCurrent();
1122
1182
  assertHistoryOwnerMatchesRegistration(childState.historyOwner, state.historyOwner, childState.nativeParentThreadId, state.historyOwner !== void 0);
@@ -1357,6 +1417,11 @@ var CodexNativeSubagentHistoryRecovery = class {
1357
1417
  includeTurns
1358
1418
  }, { timeoutMs: THREAD_READ_TIMEOUT_MS });
1359
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
+ }
1360
1425
  async read(assignment, options) {
1361
1426
  const { childThreadId } = assignment;
1362
1427
  const { recordedCompletion } = options;
@@ -2065,7 +2130,7 @@ async function registerNativeSubagentParent(input, dependencies) {
2065
2130
  dependencies.prune(registeredState);
2066
2131
  registrationSettled.resolve();
2067
2132
  }
2068
- const ready = dependencies.submissions.restore(state, owner).then(() => dependencies.assignments.restore(state, owner));
2133
+ const ready = dependencies.submissions.restore(state, owner).then(() => dependencies.submissions.drain(registeredState)).then(() => dependencies.assignments.restore(state, owner)).then(() => dependencies.assignments.drain(registeredState));
2069
2134
  let registered = true;
2070
2135
  let settlement;
2071
2136
  return {
@@ -2572,6 +2637,7 @@ var CodexNativeSubagentSubmissionOwner = class {
2572
2637
  if (!this.isObserving(state, custody) || !this.admitTurn(state, custody, turn, historyValidated)) return;
2573
2638
  custody.phase = "promoting";
2574
2639
  clearTimeout(custody.timer);
2640
+ custody.release();
2575
2641
  }
2576
2642
  settleChild(state, child) {
2577
2643
  for (const custody of this.pending.get(state)?.values() ?? []) {
@@ -4410,6 +4476,8 @@ var Monitor = class {
4410
4476
  parents: this.parentStates,
4411
4477
  retiredParents: this.retiredParentStates,
4412
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),
4413
4481
  releaseClientRetentionIfIdle: () => this.releaseClientRetentionIfIdle()
4414
4482
  });
4415
4483
  this.turnObservation = new CodexNativeSubagentTurnObservation({
@@ -4502,6 +4570,7 @@ var Monitor = class {
4502
4570
  state.assignmentStore?.assertCurrent();
4503
4571
  },
4504
4572
  isCurrent: (state) => this.isCurrentParent(state),
4573
+ isNativeChildThread: (threadId) => this.historyRecovery.isNativeChildThread(threadId),
4505
4574
  readHistory: (assignment) => this.historyRecovery.read({
4506
4575
  ...assignment,
4507
4576
  nativeTurnId: assignment.nativeTurnId
@@ -4512,7 +4581,7 @@ var Monitor = class {
4512
4581
  initialAssignment: !readCodexNativeSubagentRunId(assignment.runId)?.turnId
4513
4582
  }),
4514
4583
  restore: async (state, assignment, recovery, custody) => {
4515
- 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));
4516
4585
  if (existing) {
4517
4586
  const original = this.parentStates.get(existing.parentThreadId);
4518
4587
  if (original && original.requesterSessionKey === state.requesterSessionKey && original.historyOwner && state.historyOwner && matchesNativeAssignmentLifecycle(original.historyOwner, state.historyOwner)) original.assignmentStore = state.assignmentStore;
@@ -4640,15 +4709,33 @@ var Monitor = class {
4640
4709
  cancelledRequesters: []
4641
4710
  }));
4642
4711
  const matchesOwner = (owner) => owner.requesterAgentId === params.agentId && owner.requesterSessionKey === params.sessionKey && owner.requesterSessionId === params.sessionId && owner.requesterLifecycleRevision === params.lifecycleRevision && params.acceptsRequest(owner.requestCustody);
4643
- const preparingOwners = /* @__PURE__ */ new Map();
4644
- for (const state of this.parentStates.values()) if (state.preparing && !state.agentId && !state.historyOwner) {
4645
- const owner = [...state.pendingRegistrations ?? []].find(matchesOwner);
4646
- 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
+ }
4647
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
+ };
4648
4736
  const matches = (state) => {
4649
- if (state.agentId || state.historyOwner) return state.agentId === params.agentId && state.requesterSessionKey === params.sessionKey && state.historyOwner?.sessionId === params.sessionId && state.historyOwner?.lifecycleRevision === params.lifecycleRevision;
4650
- const owner = preparingOwners.get(state);
4651
- 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);
4652
4739
  };
4653
4740
  if (!matches(parent)) throw new Error("Codex descendant cancellation requester generation changed");
4654
4741
  const states = [...this.parentStates.values()].filter(matches);
@@ -4674,7 +4761,15 @@ var Monitor = class {
4674
4761
  const deadline = performance.now() + CODEX_APP_SERVER_INTERRUPT_TIMEOUT_MS;
4675
4762
  const registrations = states.flatMap((state) => [...state.pendingRegistrations ?? []].filter(matchesOwner));
4676
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)));
4677
- 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));
4678
4773
  const owners = new Set(states.flatMap((state) => [...state.owners.values(), ...state.pendingRegistrations ?? []]));
4679
4774
  for (const known of this.knownChildren.values()) if (states.includes(known.parent)) for (const pending of known.pendingTurns) {
4680
4775
  if (pending.admittedOwner) owners.add(pending.admittedOwner);
@@ -4698,7 +4793,7 @@ var Monitor = class {
4698
4793
  const requestCustody = child.requestCustody;
4699
4794
  const assertChild = () => {
4700
4795
  assertCurrent();
4701
- 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");
4702
4797
  };
4703
4798
  assertChild();
4704
4799
  if (!child.terminal) {
@@ -4738,7 +4833,7 @@ var Monitor = class {
4738
4833
  assertChild();
4739
4834
  await this.submissions.settleCancelled(state, child, assertChild);
4740
4835
  assertChild();
4741
- await this.assignments.settleCancelled(state, child, assertChild);
4836
+ await this.assignments.acknowledge(state, child, assertChild);
4742
4837
  assertChild();
4743
4838
  this.unregisterChild(child);
4744
4839
  }
@@ -4748,7 +4843,7 @@ var Monitor = class {
4748
4843
  await this.submissions.drain(state);
4749
4844
  assertCurrent();
4750
4845
  }
4751
- 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");
4752
4847
  return {
4753
4848
  killed: cancelled ? 1 : 0,
4754
4849
  cancelledRequesters: cancelled && requesterTurnRunId ? [{
@@ -4822,6 +4917,9 @@ var Monitor = class {
4822
4917
  });
4823
4918
  if (!capture) return;
4824
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);
4825
4923
  await this.persistModelAssignment(request, capture);
4826
4924
  request.signal?.throwIfAborted();
4827
4925
  capture.assertCurrent();
@@ -4999,6 +5097,7 @@ var Monitor = class {
4999
5097
  childState.settledWithoutCompletion = false;
5000
5098
  childState.fallbackCompletion = void 0;
5001
5099
  this.releaseClientRetention ??= this.retainClient?.();
5100
+ this.retainParentThreadForChild(childState.parentThreadId);
5002
5101
  }
5003
5102
  settleResumableChild(childState) {
5004
5103
  if (childState.terminal) return;
@@ -5009,6 +5108,7 @@ var Monitor = class {
5009
5108
  releaseNativeDirectChild(childState);
5010
5109
  releaseNativeModelExecution(childState);
5011
5110
  this.recovery.clearRecoveryTimers(childState);
5111
+ this.releaseParentThreadIfChildrenSettled(childState.parentThreadId);
5012
5112
  this.releaseClientRetentionIfIdle();
5013
5113
  }
5014
5114
  handleChildTurnCompletion(notification, childState) {
@@ -5196,6 +5296,7 @@ var Monitor = class {
5196
5296
  this.recovery.markTerminalThread(childState.childThreadId, state.parentThreadId);
5197
5297
  releaseNativeDirectChild(childState);
5198
5298
  this.recovery.clearRecoveryTimers(childState);
5299
+ this.releaseParentThreadIfChildrenSettled(state.parentThreadId);
5199
5300
  this.completionDelivery.applyReceipts(state, childState.deliveryReceipts.record(childState.runId, this.knownChildren.get(childState.childThreadId)?.agentPaths ?? [childState.childThreadId], acceptedCompletion.result));
5200
5301
  await this.completionDelivery.deliverPending(state, childState);
5201
5302
  }
@@ -5261,10 +5362,7 @@ var Monitor = class {
5261
5362
  if (!childState) {
5262
5363
  this.updateChildThreadOwnership("claim", childThreadId, this.claimChildThread);
5263
5364
  this.releaseClientRetention ??= this.retainClient?.();
5264
- if (!this.parentThreadRetentions.has(parentThreadId)) {
5265
- const releaseParentThread = this.retainParentThread?.(parentThreadId);
5266
- if (releaseParentThread) this.parentThreadRetentions.set(parentThreadId, releaseParentThread);
5267
- }
5365
+ this.retainParentThreadForChild(parentThreadId);
5268
5366
  childState = {
5269
5367
  runId,
5270
5368
  requestCustody: options.directOwner?.requestCustody,
@@ -5499,6 +5597,7 @@ var Monitor = class {
5499
5597
  }
5500
5598
  if (!transitioned) claimOwner.onDirectChildAccepted?.();
5501
5599
  }
5600
+ this.observeActiveChild(child);
5502
5601
  this.admissionCustody.bindEventSink(child);
5503
5602
  return child;
5504
5603
  }
@@ -5550,11 +5649,7 @@ var Monitor = class {
5550
5649
  this.recovery.clearRecoveryTimers(childState);
5551
5650
  this.completionDelivery.release(childState);
5552
5651
  if (this.childStates.get(childState.runId) === childState) this.childStates.delete(childState.runId);
5553
- if (!this.hasChildrenForParent(childState.parentThreadId)) {
5554
- const releaseParentThread = this.parentThreadRetentions.get(childState.parentThreadId);
5555
- this.parentThreadRetentions.delete(childState.parentThreadId);
5556
- releaseParentThread?.();
5557
- }
5652
+ this.releaseParentThreadIfChildrenSettled(childState.parentThreadId);
5558
5653
  this.releaseClientRetentionIfIdle();
5559
5654
  const state = this.parentStates.get(childState.parentThreadId);
5560
5655
  if (state) {
@@ -5612,6 +5707,17 @@ var Monitor = class {
5612
5707
  for (const known of this.knownChildren.values()) if (known.parent === state && this.currentChild(known.assignment.childThreadId)) return true;
5613
5708
  return false;
5614
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
+ }
5615
5721
  hasChildrenForParent(parentThreadId) {
5616
5722
  for (const childState of this.childStates.values()) if (childState.parentThreadId === parentThreadId) return true;
5617
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-63MLSmLJ.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--P8jwXvA.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 { ut as resolveCodexGatewayTimeoutWithGraceMs } from "./shared-client-CkyTrNB8.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";