@openclaw/codex 2026.9.8 → 2026.10.1-beta.1

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 (151) hide show
  1. package/README.md +8 -0
  2. package/dist/.setup/{account-usage-runtime-G348lY1q.mjs → account-usage-runtime-C4GFoef_.mjs} +5 -5
  3. package/dist/.setup/app-server-policy-Bg4FZw1f.mjs +23 -0
  4. package/dist/.setup/{apply-Cqb-YoCS.mjs → apply-D02fLpgN.mjs} +48 -39
  5. package/dist/.setup/attempt-client-cleanup-yLjGwbwT.mjs +155 -0
  6. package/dist/.setup/{attempt-workspace-context-BJ5Z_olH.mjs → attempt-workspace-context-CbSzT6V2.mjs} +11 -15
  7. package/dist/.setup/{auth-binding-BLWz7stm.mjs → auth-binding-BoMwpuPN.mjs} +17 -25
  8. package/dist/.setup/{auth-cache-key-Dnps4W4_.mjs → auth-cache-key-CEd9QlIs.mjs} +244 -82
  9. package/dist/.setup/{auth-profile-B0okYl2D.mjs → auth-profile-CgHQ8Vot.mjs} +2 -1
  10. package/dist/.setup/{auth-profile-selection-DFu9e167.mjs → auth-profile-selection-hr8ocLtz.mjs} +5 -7
  11. package/dist/.setup/{binding-connection-DTtN1KrX.mjs → binding-connection-C-08ez1w.mjs} +2 -2
  12. package/dist/.setup/{binding-connection.runtime-6TpgD1M6.mjs → binding-connection.runtime-Dn2p-fdy.mjs} +3 -3
  13. package/dist/.setup/{bounded-turn-BNunZPtz.mjs → bounded-turn-DlHlNTyS.mjs} +14 -13
  14. package/dist/.setup/{bounded-turn-isolation-B8K_ylqk.mjs → bounded-turn-isolation-DklXNk3k.mjs} +4 -4
  15. package/dist/.setup/{build-state-DIQ5O_-S.mjs → build-state-CIi3Ckqu.mjs} +1 -1
  16. package/dist/.setup/{capabilities-B3WEZl4e.mjs → capabilities-kQntafj_.mjs} +1 -1
  17. package/dist/.setup/{client-qyUBJlGZ.mjs → client-CBzEVDyb.mjs} +438 -160
  18. package/dist/.setup/{client-catalog-response-DRvx_wCC.mjs → client-catalog-response-CmvIiDdj.mjs} +57 -25
  19. package/dist/.setup/command-authorization-AikPDtcc.mjs +15 -0
  20. package/dist/.setup/{command-dispatch-Btrs1D6f.mjs → command-dispatch-BE_RdMou.mjs} +3 -3
  21. package/dist/.setup/{command-formatters-R3ckE3Co.mjs → command-formatters-DV3DHhdr.mjs} +7 -5
  22. package/dist/.setup/{command-handlers-DvlCHJch.mjs → command-handlers-DNoRq5Ps.mjs} +82 -144
  23. package/dist/.setup/{command-rpc-skzRq4wD.mjs → command-rpc-B6xsq2dB.mjs} +23 -31
  24. package/dist/.setup/{compact-8ttks5U5.mjs → compact-BLSAd-ru.mjs} +117 -65
  25. package/dist/.setup/{plugin-metadata-cache-BRwtRct9.mjs → computer-use-DpolvQHw.mjs} +65 -202
  26. package/dist/.setup/{config-DKhXquav.mjs → config-0Gxk3_eq.mjs} +5 -6
  27. package/dist/.setup/{config-options-CzyWLTJt.mjs → config-options-HG_Rr3W_.mjs} +13 -23
  28. package/dist/.setup/{config-parsing-b088LyhT.mjs → config-parsing-BQq-CHTF.mjs} +41 -4
  29. package/dist/.setup/{config-runtime-C0NbLms1.mjs → config-runtime-cUYrqu_a.mjs} +2 -2
  30. package/dist/.setup/{config-security-CE-FcGw9.mjs → config-security-KAPScztc.mjs} +20 -36
  31. package/dist/.setup/{context-engine-projection-PezSESth.mjs → context-engine-projection-CsgYSQhW.mjs} +11 -14
  32. package/dist/.setup/{conversation-binding-74LaGGH-.mjs → conversation-binding-CgSSD1Qz.mjs} +36 -48
  33. package/dist/.setup/{conversation-binding-data-C746z5Pn.mjs → conversation-binding-data-DJ4ix-W5.mjs} +1 -1
  34. package/dist/.setup/{conversation-control-OrN6zuaY.mjs → conversation-control-tCg763cI.mjs} +19 -21
  35. package/dist/.setup/{cyber-failover-XV0nNRZu.mjs → cyber-failover-Bb1J6hS1.mjs} +1 -1
  36. package/dist/.setup/{cyber-failover-notice-RNpGpTyP.mjs → cyber-failover-notice-XR03ef31.mjs} +1 -1
  37. package/dist/.setup/doctor-start-options-DPW9JxIE.mjs +63 -0
  38. package/dist/.setup/dynamic-tool-build-CVrx02cH.mjs +463 -0
  39. package/dist/.setup/{dynamic-tools-Db2sY5cZ.mjs → dynamic-tools-DdsymYGQ.mjs} +238 -878
  40. package/dist/.setup/{effective-mcp-catalog-Bi6-SQ7i.mjs → effective-mcp-catalog-BysTBZCW.mjs} +83 -11
  41. package/dist/.setup/{elicitation-input-DPoK8F7w.mjs → elicitation-input-r9axtppm.mjs} +4 -2
  42. package/dist/.setup/{ephemeral-turn-DiCS1ijR.mjs → ephemeral-turn-oPKxs3ia.mjs} +2 -2
  43. package/dist/.setup/{event-projector-assistant-message-MV_1dj-3.mjs → event-projector-assistant-message-YCL2wspu.mjs} +2 -2
  44. package/dist/.setup/{event-projector-values-DJSz8BTk.mjs → event-projector-values-DTqZHizf.mjs} +2 -12
  45. package/dist/.setup/{inference-dispatch-CMZtjQyz.mjs → inference-dispatch-B5UKEUyC.mjs} +12 -21
  46. package/dist/.setup/{inference-proxy-DhcXOgUE.mjs → inference-proxy-DUO5E2QQ.mjs} +6 -5
  47. package/dist/.setup/{isolated-completion-D80IXfQF.mjs → isolated-completion-D5gbKm6k.mjs} +8 -8
  48. package/dist/.setup/{managed-binary-kiWRhNRE.mjs → managed-binary-C1VFoVPf.mjs} +31 -38
  49. package/dist/.setup/mcp-app-session-preparation-CdqsXwZX.mjs +223 -0
  50. package/dist/.setup/mcp-tool-metadata-j10HhfTC.mjs +43 -0
  51. package/dist/.setup/{model-catalog-DiC0Tkha.mjs → model-catalog-Dj_uvusa.mjs} +7 -7
  52. package/dist/.setup/{models-DfLmPV0k.mjs → models-Du_i5G_t.mjs} +10 -7
  53. package/dist/.setup/{native-auth-CuG53tu4.mjs → native-auth-Cjb9y7IZ.mjs} +5 -6
  54. package/dist/.setup/{native-execution-policy-BxZJy5mP.mjs → native-execution-policy-ClzpdG3D.mjs} +1 -12
  55. package/dist/.setup/native-mcp-app-DV7VbfzF.mjs +310 -0
  56. package/dist/.setup/{native-subagent-monitor-BwkQXf9e.mjs → native-subagent-monitor-CCEFO6qK.mjs} +235 -318
  57. package/dist/.setup/{native-subagent-pending-assignments-DwkCzLvD.mjs → native-subagent-pending-assignments-BDqhOdJp.mjs} +0 -4
  58. package/dist/.setup/{native-task-assignments-DMQ0g3hu.mjs → native-task-assignments-C6KVqiN1.mjs} +9 -8
  59. package/dist/.setup/{node-cli-sessions-HC4W6FLI.mjs → node-cli-sessions-B5oNDkUS.mjs} +11 -17
  60. package/dist/.setup/{node-exec-server.runtime-BgBfWQqo.mjs → node-exec-server.runtime-0xSEjKYt.mjs} +2 -2
  61. package/dist/.setup/{plan-DPdMk1Oy.mjs → plan-CUHSIOep.mjs} +67 -89
  62. package/dist/.setup/{plugin-activation-cNHRfaxU.mjs → plugin-activation-BcyBv8PG.mjs} +4 -4
  63. package/dist/.setup/{plugin-app-cache-key-BL9B5H0L.mjs → plugin-app-cache-key-BW8rd98k.mjs} +11 -15
  64. package/dist/.setup/plugin-approval-roundtrip-uAR-oQfr.mjs +109 -0
  65. package/dist/.setup/{plugin-inventory-Cky2XJUw.mjs → plugin-inventory-Bf0_piTw.mjs} +29 -51
  66. package/dist/.setup/{plugin-marketplace-discovery-D_dV9FXa.mjs → plugin-marketplace-discovery-SQPhSuic.mjs} +2 -16
  67. package/dist/.setup/plugin-metadata-cache-DWnB7VMj.mjs +84 -0
  68. package/dist/.setup/plugin-thread-config-deadline-CdRzGJt4.mjs +124 -0
  69. package/dist/.setup/{provider-D6F_7p1I.mjs → provider-BP8ZaZqn.mjs} +4 -4
  70. package/dist/.setup/provider-capabilities-Z5ZbBxqP.mjs +50 -0
  71. package/dist/.setup/{rate-limits-B7-X2TgG.mjs → rate-limits-CMPy24F5.mjs} +1 -5
  72. package/dist/.setup/{request-BZOfsSXW.mjs → request-BH3FvYUE.mjs} +189 -49
  73. package/dist/.setup/rpc-error-hmWM21RB.mjs +57 -0
  74. package/dist/.setup/{run-attempt-dYJhjZrp.mjs → run-attempt-CgvFoW7R.mjs} +553 -727
  75. package/dist/.setup/{run-attempt-lifecycle-C-6O3Exn.mjs → run-attempt-lifecycle-BuZgVbDA.mjs} +19 -3
  76. package/dist/.setup/{runtime-artifact-DDQ-HGXf.mjs → runtime-artifact-CUTOOnKw.mjs} +5 -6
  77. package/dist/.setup/{runtime-artifact-connection-D68qQn1m.mjs → runtime-artifact-connection-CADz3_BY.mjs} +5 -4
  78. package/dist/.setup/{sandbox-guard-DjCz2eOw.mjs → sandbox-guard-WqE8yPge.mjs} +3 -3
  79. package/dist/.setup/service-tier-normalization-Cei89SW6.mjs +15 -0
  80. package/dist/.setup/{session-binding-DGCYAfvD.mjs → session-binding-Ce7BqiPN.mjs} +92 -102
  81. package/dist/.setup/session-binding-meta-Lkm5Lpf4.mjs +15 -0
  82. package/dist/.setup/session-binding-record-BZB8RgcF.mjs +179 -0
  83. package/dist/.setup/session-binding-record-codec-z4ZpDn6E.mjs +216 -0
  84. package/dist/.setup/{session-binding-sidecars-jo6H8dFr.mjs → session-binding-sidecars-BrdV95Fg.mjs} +8 -2
  85. package/dist/.setup/{session-catalog-adoption-BU_pHWG7.mjs → session-catalog-adoption-CPIP4S_y.mjs} +34 -18
  86. package/dist/.setup/{session-catalog-archive-spHfihri.mjs → session-catalog-archive-DcgwvSbF.mjs} +24 -29
  87. package/dist/.setup/{session-catalog-events-BMCFMZw-.mjs → session-catalog-events-KIXOoSnQ.mjs} +5 -5
  88. package/dist/.setup/{session-catalog-index-DwJjnF5k.mjs → session-catalog-index-DPICGlxr.mjs} +361 -72
  89. package/dist/.setup/{session-catalog-index-order-BcQpHks3.mjs → session-catalog-index-order-nhyO0wdW.mjs} +1 -1
  90. package/dist/.setup/{session-catalog-limits-DDxOsQeC.mjs → session-catalog-limits-DEU36Qlo.mjs} +1 -1
  91. package/dist/.setup/{session-catalog-index-state-TeO7EyO-.mjs → session-catalog-list-request-tXephOB4.mjs} +180 -6
  92. package/dist/.setup/{session-catalog-native-projection-CuaFZuQE.mjs → session-catalog-native-projection-CTBd4EUm.mjs} +7 -6
  93. package/dist/.setup/{session-catalog-node-adoption-DgXvSGu0.mjs → session-catalog-node-adoption-7-WEQTB1.mjs} +12 -2
  94. package/dist/.setup/{session-catalog-node-continue-DjKXHBbi.mjs → session-catalog-node-continue-DLWBwAAO.mjs} +11 -15
  95. package/dist/.setup/{session-catalog-node-lookup-CtAXI5W5.mjs → session-catalog-node-lookup-Uufckwcm.mjs} +2 -2
  96. package/dist/.setup/{session-catalog-parsing-CPGaPYr-.mjs → session-catalog-parsing-B-qWJh2x.mjs} +70 -28
  97. package/dist/.setup/{session-catalog-projection-CGfzfP93.mjs → session-catalog-projection-CE0_Hffi.mjs} +6 -122
  98. package/dist/.setup/{session-catalog-provenance-DoAvktcj.mjs → session-catalog-provenance-CmsOE5mh.mjs} +6 -1
  99. package/dist/.setup/{session-cli-DlmBHYIe.mjs → session-cli-kH4vuGod.mjs} +1 -2
  100. package/dist/.setup/{session-history-D83lJWHG.mjs → session-history-BogBHKLk.mjs} +1 -1
  101. package/dist/.setup/{session-history-import-WhX-X33a.mjs → session-history-import-NWKPa4ZO.mjs} +4 -4
  102. package/dist/.setup/{session-history-read-Ov3StuL4.mjs → session-history-read-CNN8zwbD.mjs} +8 -19
  103. package/dist/.setup/{session-history.worker-MnPKncqP.mjs → session-history.worker-Cq_4DYgN.mjs} +3 -3
  104. package/dist/.setup/{session-initialization-6aveB9qb.mjs → session-initialization-D6dtFQkE.mjs} +2 -2
  105. package/dist/.setup/{session-permission-policy-Ci_fVX6y.mjs → session-permission-policy-BxIUJ0Zd.mjs} +8 -37
  106. package/dist/.setup/{session-retirement-LlYWBKTJ.mjs → session-retirement-aC60o6P3.mjs} +14 -15
  107. package/dist/.setup/{settled-turn-context-D4yj4rxf.mjs → settled-turn-context-BZsMjkIO.mjs} +13 -6
  108. package/dist/.setup/{settled-turn-finalizer-DW9W3gza.mjs → settled-turn-finalizer-CDxCejjC.mjs} +8 -8
  109. package/dist/.setup/{shared-client-CJCTeFpQ.mjs → shared-client-DJJ3ljH2.mjs} +291 -272
  110. package/dist/.setup/{provider-capabilities-DG5qbsUZ.mjs → shell-dynamic-tools-Do9lIAT1.mjs} +16 -55
  111. package/dist/.setup/{side-question-BLeGj7TQ.mjs → side-question-B7T0_GEC.mjs} +99 -91
  112. package/dist/.setup/{source-CJis_1EF.mjs → source-DH70LqN0.mjs} +24 -40
  113. package/dist/.setup/{thread-lifecycle-_bAbjedG.mjs → thread-lifecycle-DkcoX9q-.mjs} +262 -305
  114. package/dist/.setup/{thread-ownership-B6pPt21M.mjs → thread-ownership-0aRHD9iK.mjs} +10 -8
  115. package/dist/.setup/{thread-policy-gNPzzpVp.mjs → thread-policy-CXZV97TS.mjs} +22 -21
  116. package/dist/.setup/{thread-requests-OWGOiDaV.mjs → thread-requests-COrRJcZb.mjs} +107 -98
  117. package/dist/.setup/{thread-resume-GOry0AYh.mjs → thread-resume-rx7J68Rx.mjs} +10 -18
  118. package/dist/.setup/{transcript-history-projection-DRSifI-1.mjs → transcript-history-projection-B9a7HwUV.mjs} +11 -16
  119. package/dist/.setup/{transcript-mirror-kxmCYsuF.mjs → transcript-mirror-BfLRARNL.mjs} +64 -67
  120. package/dist/.setup/{transport-stdio-Bdegpn2V.mjs → transport-stdio-a0HDa2Mj.mjs} +27 -8
  121. package/dist/.setup/{transport-websocket-BTBE-LD9.mjs → transport-websocket-zqJ0Cmtn.mjs} +3 -8
  122. package/dist/.setup/{attempt-client-cleanup-B-S7ngS_.mjs → turn-router-CX1-EoCp.mjs} +75 -170
  123. package/dist/.setup/{upstream-session-fork-gkdRj2yH.mjs → upstream-session-fork-LYlaQnbt.mjs} +35 -46
  124. package/dist/.setup/{usage-CApUvLOV.mjs → usage-Dmx7B0W2.mjs} +4 -4
  125. package/dist/.setup/{usage-limit-error-wSMQkbpV.mjs → usage-limit-error-M8jVnITZ.mjs} +4 -4
  126. package/dist/.setup/{web-search-provider.runtime-UKgeiBUG.mjs → web-search-provider.runtime-CsVmqbFm.mjs} +4 -20
  127. package/dist/.setup/websocket-data-XlRvt8Ys.mjs +6 -0
  128. package/dist/.setup/workspace-write-sandbox-probe-DmUHLrrl.mjs +118 -0
  129. package/dist/api.js +34 -54
  130. package/dist/catalog-page.worker.js +1 -1
  131. package/dist/cli-metadata.js +1 -1
  132. package/dist/doctor-contract-api.js +15 -27
  133. package/dist/harness.js +37 -22
  134. package/dist/index.js +2880 -276
  135. package/dist/media-understanding-provider.js +2 -2
  136. package/dist/migration-provider-api.js +1 -1
  137. package/dist/native-session-binding-api.js +2 -0
  138. package/dist/provider-discovery.js +1 -1
  139. package/dist/session-history-worker-runtime.js +33 -4
  140. package/dist/session-history.worker.js +1 -1
  141. package/openclaw.plugin.json +3 -3
  142. package/package.json +6 -6
  143. package/dist/.setup/config-utils-D0CXecki.mjs +0 -57
  144. package/dist/.setup/incognito-session-DWYapfwf.mjs +0 -2
  145. package/dist/.setup/managed-thread-store-BMqgThVL.mjs +0 -100
  146. package/dist/.setup/rpc-error-BlD2vuzn.mjs +0 -31
  147. package/dist/.setup/session-binding-meta-B7aEMU7g.mjs +0 -6
  148. package/dist/.setup/session-binding-record-Oe9L-CNY.mjs +0 -375
  149. package/dist/.setup/session-catalog-BFafIiF6.mjs +0 -2599
  150. package/dist/.setup/session-catalog-list-request-CvtxrYSe.mjs +0 -170
  151. package/dist/.setup/shared-client-lifecycle-7xgtlo15.mjs +0 -153
@@ -1,17 +1,19 @@
1
- import { S as readControlCursor, _ as normalizeLimit, c as MAX_CWD_LENGTH, d as boundedCatalogString, h as filterCatalogPageByTitle, m as codexCatalogThreadStatus, o as CatalogParamsError, p as codexCatalogThreadName } from "./session-catalog-parsing-CPGaPYr-.mjs";
2
- import { t as CODEX_CATALOG_MAX_ROWS } from "./session-catalog-limits-DDxOsQeC.mjs";
3
- import { i as retainCodexCatalogRow, n as codexCatalogRowRecency, r as compareCodexCatalogRows, t as CodexCatalogOrdering } from "./session-catalog-index-order-BcQpHks3.mjs";
4
- import { n as CodexCatalogPersistence, r as codexCatalogMetadataPage } from "./session-catalog-index-state-TeO7EyO-.mjs";
5
- import { i as CodexCatalogAvailability, r as withCodexCatalogListRequest } from "./session-catalog-list-request-CvtxrYSe.mjs";
6
- import { l as getCodexCatalogSource, p as setCodexCatalogSource, r as projectCodexCatalogNativeThread, u as hasLiveCodexCatalogSource } from "./session-catalog-native-projection-CuaFZuQE.mjs";
7
- import { i as subscribeCodexCatalogEvents } from "./session-catalog-events-BMCFMZw-.mjs";
1
+ import { S as readControlCursor, _ as normalizeLimit, c as MAX_CWD_LENGTH, d as boundedCatalogString, h as filterCatalogPageByTitle, m as codexCatalogThreadStatus, o as CatalogParamsError, p as codexCatalogThreadName } from "./session-catalog-parsing-B-qWJh2x.mjs";
2
+ import { n as detachCodexCatalogString, t as CODEX_CATALOG_MAX_ROWS } from "./session-catalog-limits-DEU36Qlo.mjs";
3
+ import { i as retainCodexCatalogRow, n as codexCatalogRowRecency, r as compareCodexCatalogRows, t as CodexCatalogOrdering } from "./session-catalog-index-order-nhyO0wdW.mjs";
4
+ import { c as codexCatalogMetadataPage, i as CodexCatalogAvailability, r as withCodexCatalogListRequest, s as CodexCatalogPersistence } from "./session-catalog-list-request-tXephOB4.mjs";
5
+ import { l as getCodexCatalogSource, p as setCodexCatalogSource, r as projectCodexCatalogNativeThread, u as hasLiveCodexCatalogSource } from "./session-catalog-native-projection-CTBd4EUm.mjs";
6
+ import { i as subscribeCodexCatalogEvents } from "./session-catalog-events-KIXOoSnQ.mjs";
8
7
  import { a as reportCodexCatalogSpawnFailure, n as findCodexAppServerSpawnError } from "./spawn-error-CL3n6MAa.mjs";
9
- import { CodexCatalogProjectionCapacityError, CodexCatalogProjections, a as resolveCodexCatalogRolloutFingerprint, i as readCodexCatalogRollout, mergeCodexCatalogRolloutRow, n as indexCodexCatalogRowsByRollout, o as scanCodexCatalogRollouts, projectCodexCatalogThread, r as isCodexCatalogRolloutPathCovered, t as codexCatalogRolloutLogicalPath } from "./session-catalog-projection-CGfzfP93.mjs";
8
+ import { CodexCatalogProjectionCapacityError, CodexCatalogProjections, mergeCodexCatalogRolloutRow, n as readCodexCatalogRollout, projectCodexCatalogThread, r as resolveCodexCatalogRolloutFingerprint, t as codexCatalogRolloutLogicalPath } from "./session-catalog-projection-CE0_Hffi.mjs";
10
9
  import { isRecord } from "openclaw/plugin-sdk/string-coerce-runtime";
11
10
  import { createHash } from "node:crypto";
12
11
  import { isDeepStrictEqual } from "node:util";
13
12
  import { embeddedAgentLog } from "openclaw/plugin-sdk/agent-harness-registration";
14
- import { coerceErrorMessage, toErrorObject } from "openclaw/plugin-sdk/error-runtime";
13
+ import fs from "node:fs";
14
+ import path from "node:path";
15
+ import fs$1 from "node:fs/promises";
16
+ import { coerceErrorMessage, extractErrorCode, toErrorObject } from "openclaw/plugin-sdk/error-runtime";
15
17
  import { setImmediate as setImmediate$1 } from "node:timers/promises";
16
18
  import { sanitizeTerminalText } from "openclaw/plugin-sdk/text-chunking";
17
19
  //#region extensions/codex/src/session-catalog-currency.ts
@@ -349,6 +351,318 @@ var CodexCatalogField = class {
349
351
  }
350
352
  };
351
353
  //#endregion
354
+ //#region extensions/codex/src/session-catalog-rollout-scanner.ts
355
+ const DIRECTORY_PARTS = [
356
+ /^\d{4}$/,
357
+ /^(?:0[1-9]|1[0-2])$/,
358
+ /^(?:0[1-9]|[12]\d|3[01])$/
359
+ ];
360
+ const ROLLOUT_FILE_NAME = /\.jsonl(?:\.zst)?$/;
361
+ const MAX_WATCHED_DIRECTORIES = 256;
362
+ const SCAN_BATCH_SIZE = 64;
363
+ const DARWIN_WATCH_ARM_MS = 250;
364
+ function compareRolloutCandidates(left, right) {
365
+ return left[1].mtimeMs - right[1].mtimeMs || (left[0] < right[0] ? -1 : left[0] > right[0] ? 1 : 0);
366
+ }
367
+ /** Retain only the newest fingerprints while streaming an arbitrarily large home. */
368
+ var NewestRolloutCandidates = class {
369
+ constructor() {
370
+ this.heap = [];
371
+ }
372
+ offer(candidate) {
373
+ if (this.heap.length < 2e4) {
374
+ let childIndex = this.heap.length;
375
+ this.heap.push(candidate);
376
+ while (childIndex > 0) {
377
+ const parentIndex = Math.floor((childIndex - 1) / 2);
378
+ const parent = this.heap[parentIndex];
379
+ if (!parent || compareRolloutCandidates(parent, candidate) <= 0) break;
380
+ this.heap[childIndex] = parent;
381
+ childIndex = parentIndex;
382
+ }
383
+ this.heap[childIndex] = candidate;
384
+ return;
385
+ }
386
+ const oldest = this.heap[0];
387
+ if (!oldest || compareRolloutCandidates(candidate, oldest) <= 0) return;
388
+ let parentIndex = 0;
389
+ while (true) {
390
+ let childIndex = parentIndex * 2 + 1;
391
+ let child = this.heap[childIndex];
392
+ if (!child) break;
393
+ const right = this.heap[childIndex + 1];
394
+ if (right && compareRolloutCandidates(right, child) < 0) {
395
+ child = right;
396
+ childIndex++;
397
+ }
398
+ if (compareRolloutCandidates(candidate, child) <= 0) break;
399
+ this.heap[parentIndex] = child;
400
+ parentIndex = childIndex;
401
+ }
402
+ this.heap[parentIndex] = candidate;
403
+ }
404
+ finish() {
405
+ this.heap.sort((left, right) => compareRolloutCandidates(right, left));
406
+ return new Map(this.heap);
407
+ }
408
+ };
409
+ /** Absence is meaningful only inside the layout visited by the currency scan. */
410
+ function isCodexCatalogRolloutPathCovered(sessionsRoot, rolloutPath) {
411
+ const directories = path.relative(sessionsRoot, rolloutPath).split(path.sep);
412
+ const fileName = directories.pop();
413
+ return fileName !== void 0 && ROLLOUT_FILE_NAME.test(fileName) && directories.length === DIRECTORY_PARTS.length && directories.every((part, index) => DIRECTORY_PARTS[index]?.test(part) === true);
414
+ }
415
+ async function unlessMissing(operation) {
416
+ try {
417
+ return await operation;
418
+ } catch (error) {
419
+ if (extractErrorCode(error) === "ENOENT") return;
420
+ throw error;
421
+ }
422
+ }
423
+ function sameDirectory(left, right) {
424
+ return left.dev === right.dev && left.ino === right.ino && left.ctimeMs === right.ctimeMs && left.mtimeMs === right.mtimeMs;
425
+ }
426
+ /** The resident home owns a bounded watcher cache; unwatchable leaves are scanned in full. */
427
+ var CodexCatalogRolloutScanner = class {
428
+ constructor(sessionsRoot) {
429
+ this.sessionsRoot = sessionsRoot;
430
+ this.directories = /* @__PURE__ */ new Map();
431
+ this.cachedFiles = 0;
432
+ this.closed = false;
433
+ }
434
+ scan(trackedPaths) {
435
+ const previous = this.running;
436
+ const running = (async () => {
437
+ await previous?.catch(() => void 0);
438
+ await setImmediate$1();
439
+ return this.walk(trackedPaths);
440
+ })();
441
+ this.running = running;
442
+ return running.finally(() => {
443
+ if (this.running === running) this.running = void 0;
444
+ });
445
+ }
446
+ forget(directory) {
447
+ const cached = this.directories.get(directory);
448
+ if (cached) {
449
+ this.cachedFiles -= cached.files.size;
450
+ this.directories.delete(directory);
451
+ cached.watcher.close();
452
+ }
453
+ }
454
+ watch(directory, stat) {
455
+ if (this.closed || directory.length > 4096 || this.directories.size >= MAX_WATCHED_DIRECTORIES) return;
456
+ try {
457
+ const watcher = fs.watch(directory, { persistent: false });
458
+ const cached = {
459
+ watcher,
460
+ stat,
461
+ revision: 0,
462
+ armAt: process.platform === "darwin" ? performance.now() + DARWIN_WATCH_ARM_MS : 0,
463
+ files: /* @__PURE__ */ new Map()
464
+ };
465
+ watcher.on("change", () => {
466
+ cached.revision++;
467
+ });
468
+ const withdraw = () => {
469
+ if (this.directories.get(directory) === cached) this.forget(directory);
470
+ };
471
+ watcher.on("error", withdraw);
472
+ watcher.on("close", withdraw);
473
+ this.directories.set(directory, cached);
474
+ return cached;
475
+ } catch {
476
+ return;
477
+ }
478
+ }
479
+ async walk(trackedPaths, reuseCache = true) {
480
+ if (this.closed) throw new Error("Codex catalog rollout scanner is closed");
481
+ const present = /* @__PURE__ */ new Set();
482
+ const unvisited = new Set(this.directories.keys());
483
+ const candidates = new NewestRolloutCandidates();
484
+ const reused = /* @__PURE__ */ new Map();
485
+ let cacheWithdrawn = false;
486
+ let processed = 0;
487
+ const offer = (file, fingerprint) => {
488
+ if (trackedPaths.has(codexCatalogRolloutLogicalPath(file))) present.add(codexCatalogRolloutLogicalPath(file));
489
+ candidates.offer([file, fingerprint]);
490
+ };
491
+ const scan = async (directory, depth, rootReal) => {
492
+ if (this.closed) throw new Error("Codex catalog rollout scanner is closed");
493
+ if (await unlessMissing(fs$1.realpath(directory)) !== directory) return;
494
+ const directoryPattern = DIRECTORY_PARTS[depth];
495
+ const stat = !directoryPattern ? await unlessMissing(fs$1.lstat(directory)) : void 0;
496
+ let cached = this.directories.get(directory);
497
+ if (!directoryPattern) {
498
+ if (!stat?.isDirectory() || stat.isSymbolicLink()) return;
499
+ unvisited.delete(directory);
500
+ if (cached && !sameDirectory(cached.stat, stat)) {
501
+ this.forget(directory);
502
+ cached = void 0;
503
+ }
504
+ if (reuseCache && cached && cached.scannedRevision === cached.revision) {
505
+ const revision = cached.revision;
506
+ reused.set(directory, {
507
+ cached,
508
+ revision
509
+ });
510
+ for (const [file, fingerprint] of cached.files) {
511
+ offer(file, fingerprint);
512
+ if (++processed % SCAN_BATCH_SIZE === 0) {
513
+ await setImmediate$1();
514
+ if (this.directories.get(directory) !== cached || cached.revision !== revision) {
515
+ cacheWithdrawn = true;
516
+ return;
517
+ }
518
+ }
519
+ }
520
+ return;
521
+ }
522
+ cached ??= this.watch(directory, stat);
523
+ }
524
+ if (cached) cached.scannedRevision = void 0;
525
+ const revision = cached?.revision;
526
+ const armed = cached && performance.now() >= cached.armAt;
527
+ const retained = cached ? /* @__PURE__ */ new Map() : void 0;
528
+ let cacheable = true;
529
+ const entries = await unlessMissing(fs$1.opendir(directory));
530
+ if (!entries) {
531
+ this.forget(directory);
532
+ return;
533
+ }
534
+ for await (const entry of entries) {
535
+ if (cacheWithdrawn) return;
536
+ if (this.closed) throw new Error("Codex catalog rollout scanner is closed");
537
+ if (++processed % SCAN_BATCH_SIZE === 0) await setImmediate$1();
538
+ const file = path.join(directory, entry.name);
539
+ if (directoryPattern) {
540
+ if (entry.isDirectory() && directoryPattern.test(entry.name)) await scan(file, depth + 1, rootReal);
541
+ } else if (entry.isFile() && ROLLOUT_FILE_NAME.test(entry.name)) {
542
+ const fileStat = await unlessMissing(fs$1.lstat(file));
543
+ if (!fileStat?.isFile() || fileStat.nlink !== 1) continue;
544
+ const physicalPath = path.join(this.sessionsRoot, path.relative(rootReal, file));
545
+ if (physicalPath.length > 4096) continue;
546
+ if (physicalPath !== codexCatalogRolloutLogicalPath(physicalPath)) {
547
+ const plain = await unlessMissing(fs$1.lstat(codexCatalogRolloutLogicalPath(file)));
548
+ if (plain?.isFile() && plain.nlink === 1) continue;
549
+ }
550
+ const fingerprint = {
551
+ mtimeMs: fileStat.mtimeMs,
552
+ size: fileStat.size
553
+ };
554
+ const detached = detachCodexCatalogString(physicalPath);
555
+ offer(detached, fingerprint);
556
+ if (retained && cacheable) {
557
+ retained.set(detached, fingerprint);
558
+ if (this.cachedFiles - (cached?.files.size ?? 0) + retained.size > 2e4) {
559
+ cacheable = false;
560
+ retained.clear();
561
+ }
562
+ }
563
+ }
564
+ }
565
+ if (cached && retained && stat) {
566
+ const current = await unlessMissing(fs$1.lstat(directory));
567
+ if (cacheable && !this.closed && this.directories.get(directory) === cached && current?.isDirectory() && sameDirectory(stat, current)) {
568
+ this.cachedFiles += retained.size - cached.files.size;
569
+ cached.files = retained;
570
+ cached.stat = stat;
571
+ cached.scannedRevision = armed && cached.revision === revision ? revision : void 0;
572
+ } else this.forget(directory);
573
+ }
574
+ };
575
+ const rootStat = await unlessMissing(fs$1.lstat(this.sessionsRoot));
576
+ if (rootStat?.isDirectory() && !rootStat.isSymbolicLink()) {
577
+ const rootReal = await unlessMissing(fs$1.realpath(this.sessionsRoot));
578
+ if (rootReal) await scan(rootReal, 0, rootReal);
579
+ }
580
+ if (cacheWithdrawn || [...reused].some(([directory, { cached, revision }]) => this.directories.get(directory) !== cached || cached.revision !== revision)) return this.walk(trackedPaths, false);
581
+ for (const directory of unvisited) this.forget(directory);
582
+ return {
583
+ files: candidates.finish(),
584
+ present
585
+ };
586
+ }
587
+ close() {
588
+ this.closed = true;
589
+ for (const directory of this.directories.keys()) this.forget(directory);
590
+ }
591
+ };
592
+ //#endregion
593
+ //#region extensions/codex/src/session-catalog-index-files.ts
594
+ /** Plan file reconciliation; the index retains every publication and lifetime decision. */
595
+ async function reconcileCodexCatalogFiles(root, isCurrent, owner) {
596
+ const byPath = /* @__PURE__ */ new Map();
597
+ let processed = 0;
598
+ for (const row of owner.rows.values()) {
599
+ if (row.rolloutPath) byPath.set(codexCatalogRolloutLogicalPath(row.rolloutPath), row);
600
+ if (++processed % 128 === 0) {
601
+ await setImmediate$1();
602
+ owner.assertCurrent();
603
+ }
604
+ }
605
+ const { files, present } = await owner.scanner.scan(new Set(byPath.keys()));
606
+ owner.assertCurrent();
607
+ const observed = new Map(files);
608
+ for (const [file, fingerprint] of files) {
609
+ if (++processed % 128 === 0) {
610
+ await setImmediate$1();
611
+ owner.assertCurrent();
612
+ }
613
+ const previous = byPath.get(codexCatalogRolloutLogicalPath(file));
614
+ const known = owner.observedFiles.get(file) ?? previous?.fingerprint;
615
+ if (known?.mtimeMs === fingerprint.mtimeMs && known.size === fingerprint.size) continue;
616
+ owner.requestNativeRefresh();
617
+ observed.delete(file);
618
+ if (known) observed.set(file, known);
619
+ let thread;
620
+ try {
621
+ thread = await readCodexCatalogRollout(root, file);
622
+ } catch (error) {
623
+ owner.assertCurrent();
624
+ owner.report(error);
625
+ continue;
626
+ }
627
+ owner.assertCurrent();
628
+ if (!thread) {
629
+ observed.set(file, fingerprint);
630
+ continue;
631
+ }
632
+ if (!isCurrent(thread.id)) continue;
633
+ const existing = owner.rows.get(thread.id);
634
+ if (existing?.rolloutPath && codexCatalogRolloutLogicalPath(existing.rolloutPath) !== codexCatalogRolloutLogicalPath(file)) {
635
+ observed.set(file, fingerprint);
636
+ continue;
637
+ }
638
+ if (!existing && !thread.preview) {
639
+ observed.set(file, fingerprint);
640
+ continue;
641
+ }
642
+ thread.preview ||= existing?.preview;
643
+ const projected = await projectCodexCatalogThread(thread, root);
644
+ owner.assertCurrent();
645
+ if (!isCurrent(thread.id)) continue;
646
+ observed.set(file, fingerprint);
647
+ const row = projected.rows[0];
648
+ if (!row) continue;
649
+ owner.mark(row.threadId);
650
+ owner.put(mergeCodexCatalogRolloutRow(row, existing, fingerprint));
651
+ await setImmediate$1();
652
+ }
653
+ for (const row of byPath.values()) {
654
+ if (++processed % 128 === 0) {
655
+ await setImmediate$1();
656
+ owner.assertCurrent();
657
+ }
658
+ if (row.rolloutPath && isCodexCatalogRolloutPathCovered(root, row.rolloutPath) && !present.has(codexCatalogRolloutLogicalPath(row.rolloutPath)) && owner.rows.get(row.threadId) === row) {
659
+ owner.requestNativeRefresh();
660
+ owner.remove(row.threadId);
661
+ }
662
+ }
663
+ return observed;
664
+ }
665
+ //#endregion
352
666
  //#region extensions/codex/src/session-catalog-index-names.ts
353
667
  function applyCodexCatalogName(row, name) {
354
668
  if (name === void 0) return row;
@@ -729,6 +1043,7 @@ var CodexCatalogIndex = class {
729
1043
  this.sourceRevision = 0;
730
1044
  this.ordering = new CodexCatalogOrdering();
731
1045
  this.observations = new CodexCatalogObservations();
1046
+ this.rolloutScanner = options.localSessionsRoot ? new CodexCatalogRolloutScanner(options.localSessionsRoot) : void 0;
732
1047
  this.currency = new CodexCatalogCurrency({
733
1048
  local: Boolean(options.localSessionsRoot),
734
1049
  reconcileFiles: () => this.reconcile(),
@@ -879,16 +1194,23 @@ var CodexCatalogIndex = class {
879
1194
  this.assertCurrent();
880
1195
  if (snapshot.cleanupIncomplete) this.persistence.invalidate(/* @__PURE__ */ new Error("Codex catalog obsolete snapshot exceeds its cleanup limit"));
881
1196
  for (const key of snapshot.obsolete) this.obsoleteStoredKeys.add(key);
882
- for (const row of snapshot.rows) if (isCurrent(row.threadId)) {
883
- const restored = row.rolloutPath ? {
884
- ...row,
885
- rolloutPath: codexCatalogRolloutLogicalPath(row.rolloutPath)
886
- } : row;
887
- const patched = this.withName(restored);
888
- if (patched !== restored) this.persistence.put(patched);
889
- const evicted = retainCodexCatalogRow(this.rows, patched);
890
- if (evicted) this.evict(evicted.threadId);
891
- this.ordering.restore(row);
1197
+ let restoredRows = 0;
1198
+ for (const row of snapshot.rows) {
1199
+ if (++restoredRows % 128 === 0) {
1200
+ await setImmediate$1();
1201
+ this.assertCurrent();
1202
+ }
1203
+ if (isCurrent(row.threadId)) {
1204
+ const restored = row.rolloutPath ? {
1205
+ ...row,
1206
+ rolloutPath: codexCatalogRolloutLogicalPath(row.rolloutPath)
1207
+ } : row;
1208
+ const patched = this.withName(restored);
1209
+ if (patched !== restored) this.persistence.put(patched);
1210
+ const evicted = retainCodexCatalogRow(this.rows, patched);
1211
+ if (evicted) this.evict(evicted.threadId);
1212
+ this.ordering.restore(row);
1213
+ }
892
1214
  }
893
1215
  this.overflow ||= snapshot.overflow || this.rows.size >= 2e4;
894
1216
  if (snapshot.complete) {
@@ -936,7 +1258,8 @@ var CodexCatalogIndex = class {
936
1258
  }
937
1259
  async hydratePages(isCurrent, useStateDbOnly, incremental) {
938
1260
  this.assertCurrent();
939
- const files = this.options.localSessionsRoot && !useStateDbOnly ? (await scanCodexCatalogRollouts(this.options.localSessionsRoot, /* @__PURE__ */ new Set())).files : /* @__PURE__ */ new Map();
1261
+ const files = this.rolloutScanner && !useStateDbOnly ? (await this.rolloutScanner.scan(/* @__PURE__ */ new Set())).files : /* @__PURE__ */ new Map();
1262
+ this.assertCurrent();
940
1263
  let observedRevision;
941
1264
  let frontier;
942
1265
  const batchOrder = this.ordering.captureBatch(this.availability.complete);
@@ -980,7 +1303,11 @@ var CodexCatalogIndex = class {
980
1303
  frontier = this.rows.get(row.threadId) ?? frontier;
981
1304
  }
982
1305
  if (incremental && (!changed && page.rows.length > 0 || sourceOrder >= 2e4)) break;
983
- if (page.nextCursor) this.availability.publish(frontier);
1306
+ if (page.nextCursor) {
1307
+ this.availability.publish(frontier);
1308
+ await setImmediate$1();
1309
+ this.assertCurrent();
1310
+ }
984
1311
  }
985
1312
  if (remaining && (!useStateDbOnly || !this.options.localSessionsRoot)) {
986
1313
  for (const [id, row] of remaining) if (isCurrent(id) && this.rows.get(id) === row) this.remove(id);
@@ -997,58 +1324,19 @@ var CodexCatalogIndex = class {
997
1324
  }
998
1325
  async reconcileFiles(isCurrent) {
999
1326
  const root = this.options.localSessionsRoot;
1000
- if (!root || !this.initialized || this.closed) return;
1001
- this.assertCurrent();
1002
- const byPath = indexCodexCatalogRowsByRollout(this.rows.values());
1003
- const { files, present } = await scanCodexCatalogRollouts(root, new Set(byPath.keys()));
1327
+ if (!root || !this.rolloutScanner || !this.initialized || this.closed) return;
1004
1328
  this.assertCurrent();
1005
- const observed = new Map(files);
1006
- for (const [file, fingerprint] of files) {
1007
- const previous = byPath.get(codexCatalogRolloutLogicalPath(file));
1008
- const known = this.observedFiles.get(file) ?? previous?.fingerprint;
1009
- if (known?.mtimeMs === fingerprint.mtimeMs && known.size === fingerprint.size) continue;
1010
- this.currency.requestNativeRefresh();
1011
- observed.delete(file);
1012
- if (known) observed.set(file, known);
1013
- let thread;
1014
- try {
1015
- thread = await readCodexCatalogRollout(root, file);
1016
- } catch (error) {
1017
- this.assertCurrent();
1018
- this.report(error);
1019
- continue;
1020
- }
1021
- this.assertCurrent();
1022
- if (!thread) {
1023
- observed.set(file, fingerprint);
1024
- continue;
1025
- }
1026
- if (!isCurrent(thread.id)) continue;
1027
- const existing = this.rows.get(thread.id);
1028
- if (existing?.rolloutPath && codexCatalogRolloutLogicalPath(existing.rolloutPath) !== codexCatalogRolloutLogicalPath(file)) {
1029
- observed.set(file, fingerprint);
1030
- continue;
1031
- }
1032
- if (!existing && !thread.preview) {
1033
- observed.set(file, fingerprint);
1034
- continue;
1035
- }
1036
- thread.preview ||= existing?.preview;
1037
- const projected = await projectCodexCatalogThread(thread, root);
1038
- this.assertCurrent();
1039
- if (!isCurrent(thread.id)) continue;
1040
- observed.set(file, fingerprint);
1041
- const row = projected.rows[0];
1042
- if (!row) continue;
1043
- this.observations.mark(row.threadId);
1044
- this.put(mergeCodexCatalogRolloutRow(row, existing, fingerprint));
1045
- await setImmediate$1();
1046
- }
1047
- for (const row of byPath.values()) if (row.rolloutPath && isCodexCatalogRolloutPathCovered(root, row.rolloutPath) && !present.has(codexCatalogRolloutLogicalPath(row.rolloutPath)) && this.rows.get(row.threadId) === row) {
1048
- this.currency.requestNativeRefresh();
1049
- this.remove(row.threadId);
1050
- }
1051
- this.observedFiles = observed;
1329
+ this.observedFiles = await reconcileCodexCatalogFiles(root, isCurrent, {
1330
+ rows: this.rows,
1331
+ observedFiles: this.observedFiles,
1332
+ scanner: this.rolloutScanner,
1333
+ assertCurrent: () => this.assertCurrent(),
1334
+ requestNativeRefresh: () => this.currency.requestNativeRefresh(),
1335
+ report: (error) => this.report(error),
1336
+ mark: (id) => this.observations.mark(id),
1337
+ put: (row) => this.put(row),
1338
+ remove: (id) => this.remove(id)
1339
+ });
1052
1340
  }
1053
1341
  upsertThread(thread) {
1054
1342
  if (this.closed) return Promise.resolve();
@@ -1151,6 +1439,7 @@ var CodexCatalogIndex = class {
1151
1439
  this.liveStatus.invalidate();
1152
1440
  this.liveSettings.invalidate();
1153
1441
  this.unsubscribe();
1442
+ this.rolloutScanner?.close();
1154
1443
  this.currency.close();
1155
1444
  return this.persistence.retire();
1156
1445
  }
@@ -1,4 +1,4 @@
1
- import { t as CODEX_CATALOG_MAX_ROWS } from "./session-catalog-limits-DDxOsQeC.mjs";
1
+ import { t as CODEX_CATALOG_MAX_ROWS } from "./session-catalog-limits-DEU36Qlo.mjs";
2
2
  //#region extensions/codex/src/session-catalog-index-order.ts
3
3
  function codexCatalogRowRecency(row) {
4
4
  return row.recencyAt ?? row.updatedAt ?? 0;
@@ -1,4 +1,4 @@
1
- import { t as __exportAll } from "./session-binding-sidecars-jo6H8dFr.mjs";
1
+ import { t as __exportAll } from "./session-binding-sidecars-BrdV95Fg.mjs";
2
2
  //#region extensions/codex/src/session-catalog-limits.ts
3
3
  var session_catalog_limits_exports = /* @__PURE__ */ __exportAll({
4
4
  CODEX_CATALOG_MAX_ROWS: () => CODEX_CATALOG_MAX_ROWS,