@jingyi0605/codingns 0.1.5 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (299) hide show
  1. package/README.md +44 -0
  2. package/bin/codingns.mjs +640 -53
  3. package/dist/public/assets/{TerminalPage-4p6EBqrR.js → TerminalPage-BkjqU9NG.js} +19 -19
  4. package/dist/public/assets/index-C6U8-9jg.css +1 -0
  5. package/dist/public/assets/index-CKSumuV2.js +109 -0
  6. package/dist/public/index.html +2 -2
  7. package/dist/server/config/env.d.ts +2 -0
  8. package/dist/server/config/env.js +8 -1
  9. package/dist/server/config/env.js.map +1 -1
  10. package/dist/server/modules/assistant-capability/assistant-capability-controller.d.ts +89 -0
  11. package/dist/server/modules/assistant-capability/assistant-capability-controller.js +138 -0
  12. package/dist/server/modules/assistant-capability/assistant-capability-controller.js.map +1 -0
  13. package/dist/server/modules/assistant-capability/assistant-capability-service.d.ts +115 -0
  14. package/dist/server/modules/assistant-capability/assistant-capability-service.js +241 -0
  15. package/dist/server/modules/assistant-capability/assistant-capability-service.js.map +1 -0
  16. package/dist/server/modules/butler/butler-control-session-service.js +69 -30
  17. package/dist/server/modules/butler/butler-control-session-service.js.map +1 -1
  18. package/dist/server/modules/butler/butler-follow-up-scheduler.d.ts +9 -0
  19. package/dist/server/modules/butler/butler-follow-up-scheduler.js +47 -11
  20. package/dist/server/modules/butler/butler-follow-up-scheduler.js.map +1 -1
  21. package/dist/server/modules/butler/butler-follow-up-service.d.ts +7 -1
  22. package/dist/server/modules/butler/butler-follow-up-service.js +10 -0
  23. package/dist/server/modules/butler/butler-follow-up-service.js.map +1 -1
  24. package/dist/server/modules/butler/butler-session-service.d.ts +2 -1
  25. package/dist/server/modules/butler/butler-session-service.js +10 -1
  26. package/dist/server/modules/butler/butler-session-service.js.map +1 -1
  27. package/dist/server/modules/butler/butler-session-summary-service.d.ts +8 -1
  28. package/dist/server/modules/butler/butler-session-summary-service.js +34 -7
  29. package/dist/server/modules/butler/butler-session-summary-service.js.map +1 -1
  30. package/dist/server/modules/butler/context-aggregator.js +44 -13
  31. package/dist/server/modules/butler/context-aggregator.js.map +1 -1
  32. package/dist/server/modules/butler/patrol-scheduler.d.ts +9 -0
  33. package/dist/server/modules/butler/patrol-scheduler.js +63 -9
  34. package/dist/server/modules/butler/patrol-scheduler.js.map +1 -1
  35. package/dist/server/modules/butler/session-summary-scheduler.d.ts +9 -0
  36. package/dist/server/modules/butler/session-summary-scheduler.js +47 -11
  37. package/dist/server/modules/butler/session-summary-scheduler.js.map +1 -1
  38. package/dist/server/modules/debug-target/debug-runtime-reconciliation-scheduler.d.ts +38 -0
  39. package/dist/server/modules/debug-target/debug-runtime-reconciliation-scheduler.js +99 -0
  40. package/dist/server/modules/debug-target/debug-runtime-reconciliation-scheduler.js.map +1 -0
  41. package/dist/server/modules/debug-target/debug-target-controller.d.ts +70 -0
  42. package/dist/server/modules/debug-target/debug-target-controller.js +113 -0
  43. package/dist/server/modules/debug-target/debug-target-controller.js.map +1 -0
  44. package/dist/server/modules/debug-target/debug-target-service.d.ts +102 -0
  45. package/dist/server/modules/debug-target/debug-target-service.js +1484 -0
  46. package/dist/server/modules/debug-target/debug-target-service.js.map +1 -0
  47. package/dist/server/modules/debug-target/framework-compatibility-matrix.d.ts +4 -0
  48. package/dist/server/modules/debug-target/framework-compatibility-matrix.js +45 -0
  49. package/dist/server/modules/debug-target/framework-compatibility-matrix.js.map +1 -0
  50. package/dist/server/modules/debug-target/launch-adapter-registry.d.ts +25 -0
  51. package/dist/server/modules/debug-target/launch-adapter-registry.js +445 -0
  52. package/dist/server/modules/debug-target/launch-adapter-registry.js.map +1 -0
  53. package/dist/server/modules/file/file-content-service.d.ts +2 -1
  54. package/dist/server/modules/file/file-content-service.js +53 -0
  55. package/dist/server/modules/file/file-content-service.js.map +1 -1
  56. package/dist/server/modules/file/file-controller.d.ts +12 -1
  57. package/dist/server/modules/file/file-controller.js +72 -1
  58. package/dist/server/modules/file/file-controller.js.map +1 -1
  59. package/dist/server/modules/file/file-preview-link-service.d.ts +22 -0
  60. package/dist/server/modules/file/file-preview-link-service.js +160 -0
  61. package/dist/server/modules/file/file-preview-link-service.js.map +1 -0
  62. package/dist/server/modules/git/commit-orchestrator.d.ts +4 -1
  63. package/dist/server/modules/git/commit-orchestrator.js +18 -1
  64. package/dist/server/modules/git/commit-orchestrator.js.map +1 -1
  65. package/dist/server/modules/git/git-auth.d.ts +25 -0
  66. package/dist/server/modules/git/git-auth.js +88 -0
  67. package/dist/server/modules/git/git-auth.js.map +1 -0
  68. package/dist/server/modules/git/git-controller.d.ts +6 -0
  69. package/dist/server/modules/git/git-controller.js +5 -1
  70. package/dist/server/modules/git/git-controller.js.map +1 -1
  71. package/dist/server/modules/git/git-read-service.d.ts +2 -1
  72. package/dist/server/modules/git/git-read-service.js +19 -2
  73. package/dist/server/modules/git/git-read-service.js.map +1 -1
  74. package/dist/server/modules/git/git-remote-credential-service.d.ts +9 -0
  75. package/dist/server/modules/git/git-remote-credential-service.js +76 -0
  76. package/dist/server/modules/git/git-remote-credential-service.js.map +1 -0
  77. package/dist/server/modules/git/git-write-service.d.ts +5 -2
  78. package/dist/server/modules/git/git-write-service.js +33 -17
  79. package/dist/server/modules/git/git-write-service.js.map +1 -1
  80. package/dist/server/modules/git/types.d.ts +3 -0
  81. package/dist/server/modules/git/workspace-repo-guard.js +3 -2
  82. package/dist/server/modules/git/workspace-repo-guard.js.map +1 -1
  83. package/dist/server/modules/provider/codex-model-options.d.ts +3 -1
  84. package/dist/server/modules/provider/codex-model-options.js +4 -1
  85. package/dist/server/modules/provider/codex-model-options.js.map +1 -1
  86. package/dist/server/modules/provider/opencode-model-options.d.ts +3 -1
  87. package/dist/server/modules/provider/opencode-model-options.js +5 -1
  88. package/dist/server/modules/provider/opencode-model-options.js.map +1 -1
  89. package/dist/server/modules/provider/provider-discovery-helper-client.d.ts +24 -0
  90. package/dist/server/modules/provider/provider-discovery-helper-client.js +14 -0
  91. package/dist/server/modules/provider/provider-discovery-helper-client.js.map +1 -1
  92. package/dist/server/modules/provider/provider-discovery-helper-process.js +54 -0
  93. package/dist/server/modules/provider/provider-discovery-helper-process.js.map +1 -1
  94. package/dist/server/modules/sessions/codex-app-server-helper-client.d.ts +2 -1
  95. package/dist/server/modules/sessions/codex-app-server-helper-client.js +103 -0
  96. package/dist/server/modules/sessions/codex-app-server-helper-client.js.map +1 -1
  97. package/dist/server/modules/sessions/codex-app-server-helper-process.js +106 -1
  98. package/dist/server/modules/sessions/codex-app-server-helper-process.js.map +1 -1
  99. package/dist/server/modules/sessions/session-controller.d.ts +26 -0
  100. package/dist/server/modules/sessions/session-controller.js +39 -1
  101. package/dist/server/modules/sessions/session-controller.js.map +1 -1
  102. package/dist/server/modules/sessions/session-history-service.d.ts +51 -5
  103. package/dist/server/modules/sessions/session-history-service.js +906 -59
  104. package/dist/server/modules/sessions/session-history-service.js.map +1 -1
  105. package/dist/server/modules/sessions/session-live-runtime-service.d.ts +5 -0
  106. package/dist/server/modules/sessions/session-live-runtime-service.js +59 -2
  107. package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
  108. package/dist/server/modules/sessions/session-provider-error-mapper.js +66 -0
  109. package/dist/server/modules/sessions/session-provider-error-mapper.js.map +1 -1
  110. package/dist/server/modules/tasks/event-loop-monitor.d.ts +21 -0
  111. package/dist/server/modules/tasks/event-loop-monitor.js +64 -0
  112. package/dist/server/modules/tasks/event-loop-monitor.js.map +1 -0
  113. package/dist/server/modules/tasks/observability-controller.d.ts +30 -0
  114. package/dist/server/modules/tasks/observability-controller.js +44 -0
  115. package/dist/server/modules/tasks/observability-controller.js.map +1 -0
  116. package/dist/server/modules/tasks/observability-service.d.ts +32 -0
  117. package/dist/server/modules/tasks/observability-service.js +104 -0
  118. package/dist/server/modules/tasks/observability-service.js.map +1 -0
  119. package/dist/server/modules/tasks/scheduler-metrics.d.ts +41 -0
  120. package/dist/server/modules/tasks/scheduler-metrics.js +92 -0
  121. package/dist/server/modules/tasks/scheduler-metrics.js.map +1 -0
  122. package/dist/server/modules/tasks/task-activity-log.d.ts +39 -0
  123. package/dist/server/modules/tasks/task-activity-log.js +43 -0
  124. package/dist/server/modules/tasks/task-activity-log.js.map +1 -0
  125. package/dist/server/modules/tasks/task-helper-client.d.ts +11 -0
  126. package/dist/server/modules/tasks/task-helper-client.js +132 -0
  127. package/dist/server/modules/tasks/task-helper-client.js.map +1 -0
  128. package/dist/server/modules/tasks/task-helper-process-handlers.d.ts +16 -0
  129. package/dist/server/modules/tasks/task-helper-process-handlers.js +14 -0
  130. package/dist/server/modules/tasks/task-helper-process-handlers.js.map +1 -0
  131. package/dist/server/modules/tasks/task-helper-process.d.ts +1 -0
  132. package/dist/server/modules/tasks/task-helper-process.js +49 -0
  133. package/dist/server/modules/tasks/task-helper-process.js.map +1 -0
  134. package/dist/server/modules/tasks/task-lane-executors.d.ts +2 -0
  135. package/dist/server/modules/tasks/task-lane-executors.js +15 -0
  136. package/dist/server/modules/tasks/task-lane-executors.js.map +1 -0
  137. package/dist/server/modules/tasks/task-manager.d.ts +15 -0
  138. package/dist/server/modules/tasks/task-manager.js +36 -0
  139. package/dist/server/modules/tasks/task-manager.js.map +1 -0
  140. package/dist/server/modules/tasks/task-metrics.d.ts +9 -0
  141. package/dist/server/modules/tasks/task-metrics.js +81 -0
  142. package/dist/server/modules/tasks/task-metrics.js.map +1 -0
  143. package/dist/server/modules/tasks/task-registry.d.ts +7 -0
  144. package/dist/server/modules/tasks/task-registry.js +21 -0
  145. package/dist/server/modules/tasks/task-registry.js.map +1 -0
  146. package/dist/server/modules/tasks/task-scheduler.d.ts +31 -0
  147. package/dist/server/modules/tasks/task-scheduler.js +473 -0
  148. package/dist/server/modules/tasks/task-scheduler.js.map +1 -0
  149. package/dist/server/modules/tasks/task-types.d.ts +106 -0
  150. package/dist/server/modules/tasks/task-types.js +23 -0
  151. package/dist/server/modules/tasks/task-types.js.map +1 -0
  152. package/dist/server/modules/terminal/command-template-service.d.ts +4 -0
  153. package/dist/server/modules/terminal/command-template-service.js +5 -3
  154. package/dist/server/modules/terminal/command-template-service.js.map +1 -1
  155. package/dist/server/modules/terminal/runtime/terminal-log-spooler.d.ts +7 -3
  156. package/dist/server/modules/terminal/runtime/terminal-log-spooler.js +95 -15
  157. package/dist/server/modules/terminal/runtime/terminal-log-spooler.js.map +1 -1
  158. package/dist/server/modules/terminal/runtime/terminal-log-writer-client.d.ts +21 -0
  159. package/dist/server/modules/terminal/runtime/terminal-log-writer-client.js +144 -0
  160. package/dist/server/modules/terminal/runtime/terminal-log-writer-client.js.map +1 -0
  161. package/dist/server/modules/terminal/runtime/terminal-log-writer-process.d.ts +1 -0
  162. package/dist/server/modules/terminal/runtime/terminal-log-writer-process.js +187 -0
  163. package/dist/server/modules/terminal/runtime/terminal-log-writer-process.js.map +1 -0
  164. package/dist/server/modules/terminal/terminal-service.d.ts +12 -0
  165. package/dist/server/modules/terminal/terminal-service.js +34 -17
  166. package/dist/server/modules/terminal/terminal-service.js.map +1 -1
  167. package/dist/server/modules/workbench/workbench-service.d.ts +23 -2
  168. package/dist/server/modules/workbench/workbench-service.js +126 -15
  169. package/dist/server/modules/workbench/workbench-service.js.map +1 -1
  170. package/dist/server/modules/workbench/workspace-panel-snapshot-service.d.ts +5 -1
  171. package/dist/server/modules/workbench/workspace-panel-snapshot-service.js +88 -19
  172. package/dist/server/modules/workbench/workspace-panel-snapshot-service.js.map +1 -1
  173. package/dist/server/modules/workspace/workspace-code-composition.d.ts +2 -0
  174. package/dist/server/modules/workspace/workspace-code-composition.js +154 -0
  175. package/dist/server/modules/workspace/workspace-code-composition.js.map +1 -0
  176. package/dist/server/modules/workspace/workspace-controller.d.ts +14 -0
  177. package/dist/server/modules/workspace/workspace-controller.js +19 -0
  178. package/dist/server/modules/workspace/workspace-controller.js.map +1 -1
  179. package/dist/server/modules/workspace/workspace-service.d.ts +21 -14
  180. package/dist/server/modules/workspace/workspace-service.js +183 -234
  181. package/dist/server/modules/workspace/workspace-service.js.map +1 -1
  182. package/dist/server/modules/worktree/worktree-cleanup-service.d.ts +35 -0
  183. package/dist/server/modules/worktree/worktree-cleanup-service.js +210 -0
  184. package/dist/server/modules/worktree/worktree-cleanup-service.js.map +1 -0
  185. package/dist/server/modules/worktree/worktree-controller.d.ts +44 -0
  186. package/dist/server/modules/worktree/worktree-controller.js +40 -0
  187. package/dist/server/modules/worktree/worktree-controller.js.map +1 -0
  188. package/dist/server/modules/worktree/worktree-manager.d.ts +34 -0
  189. package/dist/server/modules/worktree/worktree-manager.js +292 -0
  190. package/dist/server/modules/worktree/worktree-manager.js.map +1 -0
  191. package/dist/server/modules/worktree/worktree-merge-service.d.ts +52 -0
  192. package/dist/server/modules/worktree/worktree-merge-service.js +293 -0
  193. package/dist/server/modules/worktree/worktree-merge-service.js.map +1 -0
  194. package/dist/server/modules/worktree/worktree-sync-service.d.ts +23 -0
  195. package/dist/server/modules/worktree/worktree-sync-service.js +166 -0
  196. package/dist/server/modules/worktree/worktree-sync-service.js.map +1 -0
  197. package/dist/server/routes/assistant.d.ts +3 -0
  198. package/dist/server/routes/assistant.js +15 -0
  199. package/dist/server/routes/assistant.js.map +1 -0
  200. package/dist/server/routes/debug-targets.d.ts +3 -0
  201. package/dist/server/routes/debug-targets.js +15 -0
  202. package/dist/server/routes/debug-targets.js.map +1 -0
  203. package/dist/server/routes/files.js +2 -0
  204. package/dist/server/routes/files.js.map +1 -1
  205. package/dist/server/routes/git.js +1 -0
  206. package/dist/server/routes/git.js.map +1 -1
  207. package/dist/server/routes/observability.d.ts +3 -0
  208. package/dist/server/routes/observability.js +7 -0
  209. package/dist/server/routes/observability.js.map +1 -0
  210. package/dist/server/routes/sessions.js +1 -0
  211. package/dist/server/routes/sessions.js.map +1 -1
  212. package/dist/server/routes/workspaces.js +2 -0
  213. package/dist/server/routes/workspaces.js.map +1 -1
  214. package/dist/server/routes/worktrees.d.ts +3 -0
  215. package/dist/server/routes/worktrees.js +8 -0
  216. package/dist/server/routes/worktrees.js.map +1 -0
  217. package/dist/server/server/create-server.d.ts +38 -0
  218. package/dist/server/server/create-server.js +106 -11
  219. package/dist/server/server/create-server.js.map +1 -1
  220. package/dist/server/shared/utils/command-availability.d.ts +1 -0
  221. package/dist/server/shared/utils/command-availability.js +83 -0
  222. package/dist/server/shared/utils/command-availability.js.map +1 -0
  223. package/dist/server/shared/utils/secret-box.d.ts +2 -0
  224. package/dist/server/shared/utils/secret-box.js +29 -0
  225. package/dist/server/shared/utils/secret-box.js.map +1 -0
  226. package/dist/server/shared/utils/terminal-debug-log.js +5 -3
  227. package/dist/server/shared/utils/terminal-debug-log.js.map +1 -1
  228. package/dist/server/storage/repositories/ai-fallback-edit-repository.d.ts +11 -0
  229. package/dist/server/storage/repositories/ai-fallback-edit-repository.js +118 -0
  230. package/dist/server/storage/repositories/ai-fallback-edit-repository.js.map +1 -0
  231. package/dist/server/storage/repositories/debug-runtime-session-repository.d.ts +11 -0
  232. package/dist/server/storage/repositories/debug-runtime-session-repository.js +100 -0
  233. package/dist/server/storage/repositories/debug-runtime-session-repository.js.map +1 -0
  234. package/dist/server/storage/repositories/debug-service-repository.d.ts +9 -0
  235. package/dist/server/storage/repositories/debug-service-repository.js +99 -0
  236. package/dist/server/storage/repositories/debug-service-repository.js.map +1 -0
  237. package/dist/server/storage/repositories/debug-target-repository.d.ts +11 -0
  238. package/dist/server/storage/repositories/debug-target-repository.js +100 -0
  239. package/dist/server/storage/repositories/debug-target-repository.js.map +1 -0
  240. package/dist/server/storage/repositories/framework-analysis-result-repository.d.ts +9 -0
  241. package/dist/server/storage/repositories/framework-analysis-result-repository.js +98 -0
  242. package/dist/server/storage/repositories/framework-analysis-result-repository.js.map +1 -0
  243. package/dist/server/storage/repositories/git-remote-credential-repository.d.ts +9 -0
  244. package/dist/server/storage/repositories/git-remote-credential-repository.js +51 -0
  245. package/dist/server/storage/repositories/git-remote-credential-repository.js.map +1 -0
  246. package/dist/server/storage/repositories/port-lease-repository.d.ts +12 -0
  247. package/dist/server/storage/repositories/port-lease-repository.js +124 -0
  248. package/dist/server/storage/repositories/port-lease-repository.js.map +1 -0
  249. package/dist/server/storage/repositories/runtime-binding-repository.d.ts +10 -0
  250. package/dist/server/storage/repositories/runtime-binding-repository.js +89 -0
  251. package/dist/server/storage/repositories/runtime-binding-repository.js.map +1 -0
  252. package/dist/server/storage/repositories/session-fork-repository.d.ts +8 -0
  253. package/dist/server/storage/repositories/session-fork-repository.js +69 -0
  254. package/dist/server/storage/repositories/session-fork-repository.js.map +1 -0
  255. package/dist/server/storage/repositories/session-index-repository.js +40 -2
  256. package/dist/server/storage/repositories/session-index-repository.js.map +1 -1
  257. package/dist/server/storage/repositories/terminal-command-template-repository.js +77 -4
  258. package/dist/server/storage/repositories/terminal-command-template-repository.js.map +1 -1
  259. package/dist/server/storage/repositories/terminal-instance-repository.js +89 -7
  260. package/dist/server/storage/repositories/terminal-instance-repository.js.map +1 -1
  261. package/dist/server/storage/repositories/workspace-navigation-state-repository.d.ts +9 -0
  262. package/dist/server/storage/repositories/workspace-navigation-state-repository.js +49 -0
  263. package/dist/server/storage/repositories/workspace-navigation-state-repository.js.map +1 -0
  264. package/dist/server/storage/repositories/workspace-repository.d.ts +7 -1
  265. package/dist/server/storage/repositories/workspace-repository.js +32 -8
  266. package/dist/server/storage/repositories/workspace-repository.js.map +1 -1
  267. package/dist/server/storage/repositories/workspace-worktree-repository.d.ts +13 -0
  268. package/dist/server/storage/repositories/workspace-worktree-repository.js +158 -0
  269. package/dist/server/storage/repositories/workspace-worktree-repository.js.map +1 -0
  270. package/dist/server/storage/sqlite/client.js +408 -0
  271. package/dist/server/storage/sqlite/client.js.map +1 -1
  272. package/dist/server/storage/sqlite/schema.sql +268 -0
  273. package/dist/server/types/domain.d.ts +256 -1
  274. package/dist/server/ws/workbench-ws-hub.js +33 -9
  275. package/dist/server/ws/workbench-ws-hub.js.map +1 -1
  276. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.d.ts +6 -1
  277. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js +240 -7
  278. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js.map +1 -1
  279. package/node_modules/@codingns/session-sync-core/dist/providers/codex.d.ts +26 -1
  280. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js +507 -2
  281. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js.map +1 -1
  282. package/node_modules/@codingns/session-sync-core/dist/providers/gemini.js +94 -5
  283. package/node_modules/@codingns/session-sync-core/dist/providers/gemini.js.map +1 -1
  284. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.d.ts +5 -1
  285. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js +293 -3
  286. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js.map +1 -1
  287. package/node_modules/@codingns/session-sync-core/dist/providers/utils.d.ts +1 -0
  288. package/node_modules/@codingns/session-sync-core/dist/providers/utils.js +117 -17
  289. package/node_modules/@codingns/session-sync-core/dist/providers/utils.js.map +1 -1
  290. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.d.ts +10 -0
  291. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js +128 -8
  292. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js.map +1 -1
  293. package/node_modules/@codingns/session-sync-core/dist/services.d.ts +2 -1
  294. package/node_modules/@codingns/session-sync-core/dist/services.js +55 -8
  295. package/node_modules/@codingns/session-sync-core/dist/services.js.map +1 -1
  296. package/node_modules/@codingns/session-sync-core/dist/types.d.ts +33 -0
  297. package/package.json +1 -1
  298. package/dist/public/assets/index-CxeghocY.css +0 -1
  299. package/dist/public/assets/index-DXusStl0.js +0 -108
@@ -317,6 +317,81 @@ export class CodexAdapter {
317
317
  initialCursor: encodeCursor(options.initialPrompt ? 1 : 0)
318
318
  };
319
319
  }
320
+ async forkSession(providerSessionId, workspacePath, options) {
321
+ const transportFactory = this.options.forkTransportFactory;
322
+ if (!transportFactory) {
323
+ throw new Error("CODEX_FORK_TRANSPORT_NOT_CONFIGURED");
324
+ }
325
+ const transport = transportFactory();
326
+ try {
327
+ await transport.initialize();
328
+ if (options.sourceType === "session") {
329
+ const forked = await transport.forkThread(providerSessionId);
330
+ return await this.buildForkResultFromTransport({
331
+ providerSessionId: forked.providerSessionId,
332
+ rawStoreRef: forked.rawStoreRef,
333
+ workspacePath,
334
+ fallbackParentProviderSessionId: providerSessionId,
335
+ forkMethod: "native_session_fork",
336
+ forkSourceType: "session",
337
+ providerSourceMessageId: null
338
+ });
339
+ }
340
+ const targetMessageId = options.sourceMessageId?.trim();
341
+ if (!targetMessageId) {
342
+ throw new Error("FORK_SOURCE_MESSAGE_ID_REQUIRED");
343
+ }
344
+ if (options.strategy === "reconstruct-only") {
345
+ throw new Error("CODEX_RECONSTRUCTED_MESSAGE_FORK_NOT_SUPPORTED");
346
+ }
347
+ const resolvedStoreRef = this.resolveSessionFilePath(options.rawStoreRef, providerSessionId);
348
+ const parsedMessages = this.getParsedMessages(resolvedStoreRef, providerSessionId);
349
+ const targetMessage = parsedMessages.find((message) => message.messageId === targetMessageId);
350
+ if (!targetMessage) {
351
+ throw new Error("FORK_SOURCE_MESSAGE_NOT_FOUND");
352
+ }
353
+ const targetSnapshot = applyForkSourceMessageSnapshot(targetMessage, options.sourceMessageSnapshot);
354
+ const threadReadResult = await transport.readThread(providerSessionId);
355
+ const threadSnapshot = extractCodexThreadHistorySnapshot(threadReadResult);
356
+ if (threadSnapshot.kind === "turns") {
357
+ const rollbackPlan = buildCodexTurnRollbackPlan(threadSnapshot, parsedMessages, targetSnapshot);
358
+ const forked = await transport.forkThread(providerSessionId);
359
+ const finalized = rollbackPlan.numTurnsToRollback > 0
360
+ ? await transport.rollbackThread(forked.providerSessionId, rollbackPlan.numTurnsToRollback)
361
+ : forked;
362
+ return await this.buildForkResultFromTransport({
363
+ providerSessionId: finalized.providerSessionId,
364
+ rawStoreRef: finalized.rawStoreRef,
365
+ workspacePath,
366
+ fallbackParentProviderSessionId: providerSessionId,
367
+ forkMethod: "native_message_fork",
368
+ forkSourceType: "message",
369
+ providerSourceMessageId: null
370
+ });
371
+ }
372
+ const truncatedHistory = truncateCodexThreadHistory(threadSnapshot.value, parsedMessages, targetSnapshot);
373
+ if (truncatedHistory.length === 0) {
374
+ throw new Error("CODEX_FORK_HISTORY_EMPTY");
375
+ }
376
+ const resumed = await transport.resumeThreadFromHistory({
377
+ providerSessionId: null,
378
+ workspacePath,
379
+ history: truncatedHistory
380
+ });
381
+ return await this.buildForkResultFromTransport({
382
+ providerSessionId: resumed.providerSessionId,
383
+ rawStoreRef: resumed.rawStoreRef,
384
+ workspacePath,
385
+ fallbackParentProviderSessionId: providerSessionId,
386
+ forkMethod: "native_message_fork",
387
+ forkSourceType: "message",
388
+ providerSourceMessageId: null
389
+ });
390
+ }
391
+ finally {
392
+ transport.close();
393
+ }
394
+ }
320
395
  async sendMessage(providerSessionId, rawStoreRef, content, clientRequestId, _permissionMode) {
321
396
  const resolvedStoreRef = this.resolveSessionFilePath(rawStoreRef, providerSessionId);
322
397
  const lineNumber = readJsonLines(resolvedStoreRef).length + 1;
@@ -439,6 +514,7 @@ export class CodexAdapter {
439
514
  supportsAttachments: true,
440
515
  supportsPermissionPrompt: true,
441
516
  supportsCheckpoint: false,
517
+ supportsSessionFork: true,
442
518
  limitations: [
443
519
  "Codex 产品原生支持将指导加入队列,但当前 SDK 0.116.0 仍未向宿主暴露运行中 queue/steer 提交入口。",
444
520
  "当前实现只维护原生会话文件,不负责直接驱动 Codex CLI 进程执行。"
@@ -693,6 +769,37 @@ export class CodexAdapter {
693
769
  this.historyCache.delete(oldestKey);
694
770
  }
695
771
  }
772
+ async buildForkResultFromTransport(input) {
773
+ const resolvedStoreRef = input.rawStoreRef
774
+ ? this.resolveSessionFilePath(input.rawStoreRef, input.providerSessionId)
775
+ : this.findSessionFileByThreadId(input.providerSessionId)
776
+ ?? buildCodexActiveSessionPath(this.options.homeDir, `${input.providerSessionId}.jsonl`);
777
+ const messages = existsSync(resolvedStoreRef)
778
+ ? this.getParsedMessages(resolvedStoreRef, input.providerSessionId)
779
+ : [];
780
+ const threadMetadataIndex = this.readThreadMetadataIndex();
781
+ const threadMetadata = threadMetadataIndex.get(input.providerSessionId) ?? null;
782
+ const title = this.resolveIndexedTitle(threadMetadataIndex, input.providerSessionId)
783
+ ?? resolveCodexFallbackTitle(messages)
784
+ ?? "";
785
+ return {
786
+ session: {
787
+ provider: this.providerId,
788
+ providerSessionId: input.providerSessionId,
789
+ title,
790
+ workspacePath: input.workspacePath,
791
+ rawStoreRef: resolvedStoreRef,
792
+ isArchived: resolveCodexArchivedState(threadMetadata, resolvedStoreRef),
793
+ lastMessageAt: messages.at(-1)?.timestamp ?? nextTimestamp(),
794
+ messageCount: messages.length,
795
+ parentProviderSessionId: input.fallbackParentProviderSessionId
796
+ },
797
+ forkMethod: input.forkMethod,
798
+ forkSourceType: input.forkSourceType,
799
+ inheritedPrefixMessageCount: messages.length,
800
+ providerSourceMessageId: input.providerSourceMessageId
801
+ };
802
+ }
696
803
  touchSessionSummaryCache(filePath, entry) {
697
804
  this.sessionSummaryCache.delete(filePath);
698
805
  this.sessionSummaryCache.set(filePath, entry);
@@ -862,6 +969,7 @@ export class CodexAdapter {
862
969
  return this.parseMessagesFromEntries(filePath, records, providerSessionId);
863
970
  }
864
971
  parseMessagesFromEntries(filePath, records, providerSessionId) {
972
+ const effectiveRecords = filterRolledBackCodexRecords(records);
865
973
  const messages = [];
866
974
  const messageIndexesByKey = new Map();
867
975
  const toolNameById = new Map();
@@ -900,8 +1008,8 @@ export class CodexAdapter {
900
1008
  }
901
1009
  });
902
1010
  };
903
- records.forEach(({ lineNumber, data: record }) => {
904
- const rawRef = createRawRef(this.providerId, filePath, lineNumber);
1011
+ effectiveRecords.forEach(({ lineNumber, partIndex, data: record }) => {
1012
+ const rawRef = createRawRef(this.providerId, filePath, lineNumber, partIndex || undefined);
905
1013
  if (record.type === "event_msg") {
906
1014
  const payload = (record.payload ?? {});
907
1015
  const eventType = ensureText(payload.type);
@@ -1050,6 +1158,81 @@ export class CodexAdapter {
1050
1158
  return messages.map((entry) => entry.message);
1051
1159
  }
1052
1160
  }
1161
+ function filterRolledBackCodexRecords(records) {
1162
+ const completedTurnSegments = [];
1163
+ let activeTurnStartLineNumber = null;
1164
+ let sawRollbackEvent = false;
1165
+ for (const recordEntry of records) {
1166
+ const record = recordEntry.data;
1167
+ if (record.type !== "event_msg") {
1168
+ continue;
1169
+ }
1170
+ const payload = (record.payload ?? {});
1171
+ const eventType = ensureText(payload.type).trim();
1172
+ if (eventType === "task_started") {
1173
+ activeTurnStartLineNumber = recordEntry.lineNumber;
1174
+ continue;
1175
+ }
1176
+ if (eventType === "task_complete" || eventType === "task_failed") {
1177
+ if (activeTurnStartLineNumber !== null) {
1178
+ completedTurnSegments.push({
1179
+ startLineNumber: activeTurnStartLineNumber,
1180
+ endLineNumber: recordEntry.lineNumber,
1181
+ rolledBack: false
1182
+ });
1183
+ }
1184
+ activeTurnStartLineNumber = null;
1185
+ continue;
1186
+ }
1187
+ if (eventType !== "thread_rolled_back") {
1188
+ continue;
1189
+ }
1190
+ sawRollbackEvent = true;
1191
+ const requestedTurnCount = Math.max(0, Math.trunc(typeof payload.num_turns === "number"
1192
+ ? payload.num_turns
1193
+ : Number.parseInt(ensureText(payload.num_turns), 10)) || 0);
1194
+ if (requestedTurnCount <= 0) {
1195
+ continue;
1196
+ }
1197
+ let remainingTurnsToRollback = requestedTurnCount;
1198
+ for (let index = completedTurnSegments.length - 1; index >= 0; index -= 1) {
1199
+ const segment = completedTurnSegments[index];
1200
+ if (!segment || segment.rolledBack) {
1201
+ continue;
1202
+ }
1203
+ segment.rolledBack = true;
1204
+ remainingTurnsToRollback -= 1;
1205
+ if (remainingTurnsToRollback <= 0) {
1206
+ break;
1207
+ }
1208
+ }
1209
+ }
1210
+ if (!sawRollbackEvent) {
1211
+ return records;
1212
+ }
1213
+ const rolledBackSegments = completedTurnSegments
1214
+ .filter((segment) => segment.rolledBack)
1215
+ .sort((left, right) => left.startLineNumber - right.startLineNumber);
1216
+ if (rolledBackSegments.length === 0) {
1217
+ return records;
1218
+ }
1219
+ const filteredRecords = [];
1220
+ let segmentIndex = 0;
1221
+ for (const recordEntry of records) {
1222
+ while (segmentIndex < rolledBackSegments.length
1223
+ && recordEntry.lineNumber > rolledBackSegments[segmentIndex].endLineNumber) {
1224
+ segmentIndex += 1;
1225
+ }
1226
+ const activeSegment = segmentIndex < rolledBackSegments.length ? rolledBackSegments[segmentIndex] : null;
1227
+ if (activeSegment
1228
+ && recordEntry.lineNumber >= activeSegment.startLineNumber
1229
+ && recordEntry.lineNumber <= activeSegment.endLineNumber) {
1230
+ continue;
1231
+ }
1232
+ filteredRecords.push(recordEntry);
1233
+ }
1234
+ return filteredRecords;
1235
+ }
1053
1236
  function buildRecentHistoryPage(messages, totalMessageCount, limit) {
1054
1237
  const effectiveTotal = Math.max(totalMessageCount, messages.length);
1055
1238
  const pageMessages = messages.slice(-Math.min(limit, messages.length)).map((message, index, items) => ({
@@ -1365,4 +1548,326 @@ function normalizeCodexMessageTitle(content) {
1365
1548
  const normalized = normalizeCodexIndexedTitle(content);
1366
1549
  return normalized ? normalized.slice(0, CODEX_SESSION_TITLE_MAX_LENGTH) : null;
1367
1550
  }
1551
+ function extractCodexThreadHistory(result) {
1552
+ const snapshot = extractCodexThreadHistorySnapshot(result);
1553
+ return snapshot.value;
1554
+ }
1555
+ function extractCodexThreadHistorySnapshot(result) {
1556
+ const directHistory = pickCodexHistoryArray(result)
1557
+ ?? pickCodexHistoryArray(toRecord(result.thread))
1558
+ ?? pickCodexHistoryArray(toRecord(result.data));
1559
+ if (directHistory) {
1560
+ return {
1561
+ kind: "entries",
1562
+ value: directHistory,
1563
+ comparableEntries: directHistory.flatMap((entry, entryIndex) => {
1564
+ const signature = buildCodexThreadHistorySignature(entry);
1565
+ return signature ? [{ signature, entryIndex }] : [];
1566
+ })
1567
+ };
1568
+ }
1569
+ const turns = pickCodexTurnArray(result.turns)
1570
+ ?? pickCodexTurnArray(toRecord(result.thread)?.turns)
1571
+ ?? pickCodexTurnArray(toRecord(result.data)?.turns);
1572
+ if (!turns) {
1573
+ throw new Error("CODEX_THREAD_HISTORY_MISSING");
1574
+ }
1575
+ const comparableEntries = turns.flatMap((turn, turnIndex) => collectCodexTurnComparableEntries(turn, turnIndex));
1576
+ if (comparableEntries.length === 0) {
1577
+ throw new Error("CODEX_THREAD_HISTORY_MISSING");
1578
+ }
1579
+ return {
1580
+ kind: "turns",
1581
+ value: turns,
1582
+ comparableEntries
1583
+ };
1584
+ }
1585
+ function isSyntheticCodexSessionTitle(title) {
1586
+ const normalizedTitle = ensureText(title).trim();
1587
+ if (normalizedTitle.length === 0) {
1588
+ return false;
1589
+ }
1590
+ return (/^rollout-\d{4}-\d{2}-\d{2}t/i.test(normalizedTitle) ||
1591
+ /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(normalizedTitle));
1592
+ }
1593
+ function pickCodexHistoryArray(value) {
1594
+ const record = toRecord(value);
1595
+ if (!record) {
1596
+ return null;
1597
+ }
1598
+ for (const key of ["history", "items"]) {
1599
+ const candidate = record[key];
1600
+ if (Array.isArray(candidate)
1601
+ && candidate.some((entry) => buildCodexThreadHistorySignature(entry) !== null)) {
1602
+ return candidate;
1603
+ }
1604
+ }
1605
+ return null;
1606
+ }
1607
+ function pickCodexTurnArray(value) {
1608
+ return Array.isArray(value) ? value : null;
1609
+ }
1610
+ function collectCodexTurnComparableEntries(value, turnIndex, parentPath = []) {
1611
+ const record = toRecord(value);
1612
+ if (!record) {
1613
+ return [];
1614
+ }
1615
+ for (const key of ["history", "items"]) {
1616
+ const candidate = record[key];
1617
+ if (Array.isArray(candidate)
1618
+ && candidate.some((entry) => buildCodexThreadHistorySignature(entry) !== null)) {
1619
+ const containerPath = [...parentPath, key];
1620
+ return candidate.flatMap((entry, entryIndex) => {
1621
+ const signature = buildCodexThreadHistorySignature(entry);
1622
+ return signature
1623
+ ? [{
1624
+ signature,
1625
+ turnIndex,
1626
+ containerPath,
1627
+ entryIndex
1628
+ }]
1629
+ : [];
1630
+ });
1631
+ }
1632
+ }
1633
+ return [
1634
+ ["input", record.input],
1635
+ ["output", record.output],
1636
+ ["turn", record.turn],
1637
+ ["data", record.data],
1638
+ ["result", record.result]
1639
+ ].flatMap(([key, candidate]) => collectCodexTurnComparableEntries(candidate, turnIndex, [...parentPath, key]));
1640
+ }
1641
+ function toRecord(value) {
1642
+ return typeof value === "object" && value !== null
1643
+ ? value
1644
+ : null;
1645
+ }
1646
+ function truncateCodexThreadHistory(history, parsedMessages, targetMessage) {
1647
+ const snapshot = normalizeCodexThreadHistorySnapshot(history);
1648
+ if (snapshot.kind === "entries") {
1649
+ const targetEntry = resolveCodexThreadHistoryTargetEntry(snapshot, parsedMessages, targetMessage);
1650
+ return snapshot.value.slice(0, targetEntry.entryIndex + 1);
1651
+ }
1652
+ const targetEntry = resolveCodexThreadHistoryTargetEntry(snapshot, parsedMessages, targetMessage);
1653
+ const truncatedTurns = snapshot.value.slice(0, targetEntry.turnIndex + 1);
1654
+ const lastTurn = truncatedTurns.at(-1);
1655
+ if (!lastTurn) {
1656
+ throw new Error("CODEX_FORK_SOURCE_MESSAGE_UNMAPPABLE");
1657
+ }
1658
+ return [
1659
+ ...flattenCodexTurnHistory(truncatedTurns.slice(0, -1)),
1660
+ ...collectCodexTurnHistoryItems(truncateCodexTurnAtPath(lastTurn, targetEntry.containerPath, targetEntry.entryIndex))
1661
+ ];
1662
+ }
1663
+ function normalizeCodexThreadHistorySnapshot(history) {
1664
+ const directComparableEntries = history.flatMap((entry, entryIndex) => {
1665
+ const signature = buildCodexThreadHistorySignature(entry);
1666
+ return signature ? [{ signature, entryIndex }] : [];
1667
+ });
1668
+ if (directComparableEntries.length > 0) {
1669
+ return {
1670
+ kind: "entries",
1671
+ value: history,
1672
+ comparableEntries: directComparableEntries
1673
+ };
1674
+ }
1675
+ const turnComparableEntries = history.flatMap((turn, turnIndex) => collectCodexTurnComparableEntries(turn, turnIndex));
1676
+ if (turnComparableEntries.length > 0) {
1677
+ return {
1678
+ kind: "turns",
1679
+ value: history,
1680
+ comparableEntries: turnComparableEntries
1681
+ };
1682
+ }
1683
+ throw new Error("CODEX_THREAD_HISTORY_MISSING");
1684
+ }
1685
+ function resolveCodexThreadHistoryTargetEntry(snapshot, parsedMessages, targetMessage) {
1686
+ const targetSignature = buildCodexThreadHistorySignature(targetMessage);
1687
+ if (!targetSignature) {
1688
+ throw new Error("CODEX_FORK_SOURCE_MESSAGE_UNMAPPABLE");
1689
+ }
1690
+ const matchingEntries = snapshot.comparableEntries.filter((entry) => entry.signature === targetSignature);
1691
+ if (matchingEntries.length === 0) {
1692
+ throw new Error("CODEX_FORK_SOURCE_MESSAGE_UNMAPPABLE");
1693
+ }
1694
+ const targetOccurrence = resolveCodexMessageSignatureOccurrence(parsedMessages, targetMessage);
1695
+ return matchingEntries[Math.min(targetOccurrence, matchingEntries.length) - 1] ?? matchingEntries.at(-1);
1696
+ }
1697
+ function resolveCodexMessageSignatureOccurrence(parsedMessages, targetMessage) {
1698
+ const targetSignature = buildCodexThreadHistorySignature(targetMessage);
1699
+ if (!targetSignature) {
1700
+ return 1;
1701
+ }
1702
+ let occurrence = 0;
1703
+ for (const message of parsedMessages) {
1704
+ if (buildCodexThreadHistorySignature(message) !== targetSignature) {
1705
+ continue;
1706
+ }
1707
+ occurrence += 1;
1708
+ if (message.messageId === targetMessage.messageId) {
1709
+ return occurrence;
1710
+ }
1711
+ }
1712
+ return Math.max(1, occurrence);
1713
+ }
1714
+ function buildCodexTurnRollbackPlan(snapshot, parsedMessages, targetMessage) {
1715
+ const targetEntry = resolveCodexThreadHistoryTargetEntry(snapshot, parsedMessages, targetMessage);
1716
+ const turnEntries = snapshot.comparableEntries.filter((entry) => entry.turnIndex === targetEntry.turnIndex);
1717
+ const lastComparableEntryInTurn = turnEntries.at(-1) ?? null;
1718
+ if (!lastComparableEntryInTurn) {
1719
+ throw new Error("CODEX_FORK_SOURCE_MESSAGE_UNMAPPABLE");
1720
+ }
1721
+ if (lastComparableEntryInTurn.containerPath.join("/") !== targetEntry.containerPath.join("/")
1722
+ || lastComparableEntryInTurn.entryIndex !== targetEntry.entryIndex) {
1723
+ throw new Error("CODEX_MESSAGE_FORK_TURN_BOUNDARY_REQUIRED");
1724
+ }
1725
+ return {
1726
+ targetTurnIndex: targetEntry.turnIndex,
1727
+ numTurnsToRollback: Math.max(0, snapshot.value.length - targetEntry.turnIndex - 1)
1728
+ };
1729
+ }
1730
+ function truncateCodexTurnAtPath(turn, containerPath, entryIndex) {
1731
+ if (containerPath.length === 0) {
1732
+ return turn;
1733
+ }
1734
+ const record = toRecord(turn);
1735
+ if (!record) {
1736
+ return turn;
1737
+ }
1738
+ const [head, ...rest] = containerPath;
1739
+ const current = record[head];
1740
+ if (rest.length === 0) {
1741
+ if (!Array.isArray(current)) {
1742
+ return turn;
1743
+ }
1744
+ return {
1745
+ ...record,
1746
+ [head]: current.slice(0, entryIndex + 1)
1747
+ };
1748
+ }
1749
+ return {
1750
+ ...record,
1751
+ [head]: truncateCodexTurnAtPath(current, rest, entryIndex)
1752
+ };
1753
+ }
1754
+ function flattenCodexTurnHistory(turns) {
1755
+ return turns.flatMap((turn) => collectCodexTurnHistoryItems(turn));
1756
+ }
1757
+ function collectCodexTurnHistoryItems(value) {
1758
+ const direct = pickCodexHistoryArray(value);
1759
+ if (direct) {
1760
+ return direct;
1761
+ }
1762
+ const record = toRecord(value);
1763
+ if (!record) {
1764
+ return [];
1765
+ }
1766
+ return [
1767
+ record.input,
1768
+ record.output,
1769
+ record.turn,
1770
+ record.data,
1771
+ record.result
1772
+ ].flatMap((candidate) => collectCodexTurnHistoryItems(candidate));
1773
+ }
1774
+ function buildCodexThreadHistorySignature(value) {
1775
+ if (!value || typeof value !== "object") {
1776
+ return null;
1777
+ }
1778
+ const item = value;
1779
+ const normalizedKind = ensureText(item.kind).trim();
1780
+ const normalizedRole = ensureText(item.role).trim();
1781
+ const normalizedContent = ensureText(item.content).trim();
1782
+ if (normalizedKind && normalizedRole) {
1783
+ return `${normalizedRole}:${normalizedKind}:${normalizedContent}`;
1784
+ }
1785
+ const type = ensureText(item.type).trim();
1786
+ if (type === "userMessage") {
1787
+ const content = stringifyCodexThreadMessageContent(item.content);
1788
+ return content ? `user:text:${content}` : null;
1789
+ }
1790
+ if (type === "agentMessage") {
1791
+ const content = ensureText(item.text).trim() || stringifyCodexThreadMessageContent(item.content);
1792
+ return content ? `assistant:text:${content}` : null;
1793
+ }
1794
+ if (type === "message") {
1795
+ const role = ensureText(item.role).trim();
1796
+ const content = stringifyCodexThreadMessageContent(item.content);
1797
+ if (!role || !content) {
1798
+ return null;
1799
+ }
1800
+ return `${role}:text:${content}`;
1801
+ }
1802
+ if (type === "reasoning") {
1803
+ const content = stringifyCodexReasoningContent(item.summary ?? item.content);
1804
+ return content ? `assistant:thinking:${content}` : null;
1805
+ }
1806
+ if (type === "function_call" || type === "tool_call") {
1807
+ const name = ensureText(item.name).trim();
1808
+ const inputValue = item.arguments ?? item.input;
1809
+ const content = stringifyStructuredValue(inputValue);
1810
+ return name || content ? `assistant:tool_call:${name}:${content}` : null;
1811
+ }
1812
+ if (type === "function_call_output" || type === "tool_result") {
1813
+ const content = ensureText(item.output ?? item.content).trim();
1814
+ return content ? `tool:tool_result:${content}` : null;
1815
+ }
1816
+ if (normalizedRole && normalizedContent) {
1817
+ return `${normalizedRole}:text:${normalizedContent}`;
1818
+ }
1819
+ return null;
1820
+ }
1821
+ function applyForkSourceMessageSnapshot(targetMessage, snapshot) {
1822
+ if (!snapshot) {
1823
+ return targetMessage;
1824
+ }
1825
+ return {
1826
+ ...targetMessage,
1827
+ role: snapshot.role,
1828
+ kind: snapshot.kind,
1829
+ content: snapshot.content
1830
+ };
1831
+ }
1832
+ function stringifyCodexThreadMessageContent(content) {
1833
+ if (typeof content === "string") {
1834
+ return content.trim();
1835
+ }
1836
+ if (!Array.isArray(content)) {
1837
+ return "";
1838
+ }
1839
+ return content
1840
+ .map((part) => {
1841
+ if (!part || typeof part !== "object") {
1842
+ return "";
1843
+ }
1844
+ const record = part;
1845
+ return ensureText(record.text
1846
+ ?? record.input_text
1847
+ ?? record.output_text
1848
+ ?? (ensureText(record.type).trim() === "text" ? record.text : null)).trim();
1849
+ })
1850
+ .filter((value) => value.length > 0)
1851
+ .join("\n")
1852
+ .trim();
1853
+ }
1854
+ function stringifyCodexReasoningContent(content) {
1855
+ if (typeof content === "string") {
1856
+ return content.trim();
1857
+ }
1858
+ if (!Array.isArray(content)) {
1859
+ return "";
1860
+ }
1861
+ return content
1862
+ .map((part) => {
1863
+ if (!part || typeof part !== "object") {
1864
+ return "";
1865
+ }
1866
+ const record = part;
1867
+ return ensureText(record.text ?? record.summary_text).trim();
1868
+ })
1869
+ .filter((value) => value.length > 0)
1870
+ .join("\n")
1871
+ .trim();
1872
+ }
1368
1873
  //# sourceMappingURL=codex.js.map